(svn r22915) -Fix (r22743): TTO savegames with any aircraft not in an hangar caused crashes during load

pull/155/head
yexo 13 years ago
parent b7722dbe86
commit 561d6503be

@ -31,7 +31,7 @@ void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height);
void UpdateAirplanesOnNewStation(const Station *st); void UpdateAirplanesOnNewStation(const Station *st);
void UpdateAircraftCache(Aircraft *v); void UpdateAircraftCache(Aircraft *v);
void AircraftLeaveHangar(Aircraft *v); void AircraftLeaveHangar(Aircraft *v, Direction exit_dir);
void AircraftNextAirportPos_and_Order(Aircraft *v); void AircraftNextAirportPos_and_Order(Aircraft *v);
void SetAircraftPosition(Aircraft *v, int x, int y, int z); void SetAircraftPosition(Aircraft *v, int x, int y, int z);
byte GetAircraftFlyingAltitude(const Aircraft *v); byte GetAircraftFlyingAltitude(const Aircraft *v);

@ -1251,15 +1251,17 @@ void AircraftNextAirportPos_and_Order(Aircraft *v)
/** /**
* Aircraft is about to leave the hangar. * Aircraft is about to leave the hangar.
* @param v Aircraft leaving. * @param v Aircraft leaving.
* @param exit_dir The direction the vehicle leaves the hangar.
* @note This function is called in AfterLoadGame for old savegames, so don't rely
* on any data to be valid, especially don't rely on the fact that the vehicle
* is actually on the ground inside a depot.
*/ */
void AircraftLeaveHangar(Aircraft *v) void AircraftLeaveHangar(Aircraft *v, Direction exit_dir)
{ {
const Station *st = Station::GetByTile(v->tile);
v->cur_speed = 0; v->cur_speed = 0;
v->subspeed = 0; v->subspeed = 0;
v->progress = 0; v->progress = 0;
v->direction = st->airport.GetHangarExitDirection(v->tile); v->direction = exit_dir;
v->vehstatus &= ~VS_HIDDEN; v->vehstatus &= ~VS_HIDDEN;
{ {
Vehicle *u = v->Next(); Vehicle *u = v->Next();
@ -1344,7 +1346,8 @@ static void AircraftEventHandler_InHangar(Aircraft *v, const AirportFTAClass *ap
/* airplane goto state takeoff, helicopter to helitakeoff */ /* airplane goto state takeoff, helicopter to helitakeoff */
v->state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF; v->state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF;
} }
AircraftLeaveHangar(v); const Station *st = Station::GetByTile(v->tile);
AircraftLeaveHangar(v, st->airport.GetHangarExitDirection(v->tile));
AirportMove(v, apc); AirportMove(v, apc);
} }

@ -178,7 +178,7 @@ void UpdateOldAircraft()
continue; continue;
} }
AircraftLeaveHangar(a); // make airplane visible if it was in a depot for example AircraftLeaveHangar(a, a->direction); // make airplane visible if it was in a depot for example
a->vehstatus &= ~VS_STOPPED; // make airplane moving a->vehstatus &= ~VS_STOPPED; // make airplane moving
UpdateAircraftCache(a); UpdateAircraftCache(a);
a->cur_speed = a->vcache.cached_max_speed; // so aircraft don't have zero speed while in air a->cur_speed = a->vcache.cached_max_speed; // so aircraft don't have zero speed while in air

Loading…
Cancel
Save