(svn r8182) -Backport from trunk (r8137, r8147, r8157): 0.5
authorDarkvater
Wed, 17 Jan 2007 01:23:50 +0000
branch0.5
changeset 5418 ee2e44854454
parent 5417 a66d9847aef2
child 5419 9dcb8414eebb
(svn r8182) -Backport from trunk (r8137, r8147, r8157):
- (FS#551) roadstop->num_vehicles was wrong for old savegames loaded for MP (r8137)
- v->leave_depot_instantly was not always reset correctly (r8147)
- moving cargo during auto replaces did not update the cached vehicle weight for trains properly (r8157)
*NOTE* This fixes several desync issues. Big props to Rubidium for finding, debugging
and fixing them!
openttd.c
station_cmd.c
vehicle.c
--- a/openttd.c	Wed Jan 17 01:19:09 2007 +0000
+++ b/openttd.c	Wed Jan 17 01:23:50 2007 +0000
@@ -1462,6 +1462,11 @@
 				v->u.road.slot_age = 0;
 			}
 		}
+	} else {
+		Vehicle *v;
+		FOR_ALL_VEHICLES(v) {
+			if (v->type == VEH_Road && v->u.road.slot != NULL) v->u.road.slot->num_vehicles++;
+		}
 	}
 
 	if (CheckSavegameVersion(26)) {
--- a/station_cmd.c	Wed Jan 17 01:19:09 2007 +0000
+++ b/station_cmd.c	Wed Jan 17 01:23:50 2007 +0000
@@ -3133,7 +3133,6 @@
 static void Load_ROADSTOP(void)
 {
 	int index;
-	Vehicle *v;
 
 	while ((index = SlIterateArray()) != -1) {
 		RoadStop *rs;
@@ -3144,10 +3143,6 @@
 		rs = GetRoadStop(index);
 		SlObject(rs, _roadstop_desc);
 	}
-
-	FOR_ALL_VEHICLES(v) {
-		if (v->type == VEH_Road && v->u.road.slot != NULL) v->u.road.slot->num_vehicles++;
-	}
 }
 
 const ChunkHandler _station_chunk_handlers[] = {
--- a/vehicle.c	Wed Jan 17 01:19:09 2007 +0000
+++ b/vehicle.c	Wed Jan 17 01:23:50 2007 +0000
@@ -1903,6 +1903,14 @@
 		} while (source->cargo_count > 0 && (dest = dest->next) != NULL);
 		dest = v;
 	} while ((source = source->next) != NULL);
+
+	/*
+	 * The of the train will be incorrect at this moment. This is due
+	 * to the fact that removing the old wagon updates the weight of
+	 * the complete train, which is without the weight of cargo we just
+	 * moved back into some (of the) new wagon(s).
+	 */
+	if (dest->type == VEH_Train) TrainConsistChanged(dest->first);
 }
 
 static bool VerifyAutoreplaceRefitForOrders(const Vehicle *v, const EngineID engine_type)
@@ -2140,7 +2148,7 @@
 	const Player *p = GetPlayer(v->owner);
 	byte flags = 0;
 	int32 cost, temp_cost = 0;
-	bool stopped = false;
+	bool stopped;
 
 	/* Remember the length in case we need to trim train later on
 	 * If it's not a train, the value is unused
@@ -2158,11 +2166,11 @@
 
 	assert(v->vehstatus & VS_STOPPED); // the vehicle should have been stopped in VehicleEnteredDepotThisTick() if needed
 
-	if (v->leave_depot_instantly) {
-		// we stopped the vehicle to do this, so we have to remember to start it again when we are done
-		// we need to store this info as the engine might be replaced and lose this info
-		stopped = true;
-	}
+	/* Remember the flag v->leave_depot_instantly because if we replace the vehicle, the vehicle holding this flag will be sold
+	 * If it is set, then we only stopped the vehicle to replace it (if needed) and we will need to start it again.
+	 * We also need to reset the flag since it should remain false except from when the vehicle enters a depot until autoreplace is handled in the same tick */
+	stopped = v->leave_depot_instantly;
+	v->leave_depot_instantly = false;
 
 	for (;;) {
 		cost = 0;