changeset 19948:e4c42446f3e6 draft

(svn r24882) -Fix: desync when NewGRF changes the stats related to acceleration (power, weight, tractive effort, etc) during service or 32 day triggers
author rubidium <rubidium@openttd.org>
date Wed, 02 Jan 2013 22:20:07 +0000
parents 4275147c7ab5
children ed7153fa1d53
files src/economy.cpp src/vehicle.cpp
diffstat 2 files changed, 10 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/economy.cpp
+++ b/src/economy.cpp
@@ -1637,6 +1637,9 @@
 	front->load_unload_ticks = max(1, unloading_time);
 
 	if (completely_emptied) {
+		/* Make sure the vehicle is marked dirty, since we need to update the NewGRF
+		 * properties such as weight, power and TE whenever the trigger runs. */
+		assert(dirty_vehicle);
 		TriggerVehicle(front, VEHICLE_TRIGGER_EMPTY);
 	}
 
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -836,7 +836,11 @@
 		if ((v->day_counter & 0x1F) == 0 && v->HasEngineType()) {
 			uint16 callback = GetVehicleCallback(CBID_VEHICLE_32DAY_CALLBACK, 0, 0, v->engine_type, v);
 			if (callback != CALLBACK_FAILED) {
-				if (HasBit(callback, 0)) TriggerVehicle(v, VEHICLE_TRIGGER_CALLBACK_32); // Trigger vehicle trigger 10
+				if (HasBit(callback, 0)) {
+					/* After a vehicle trigger, the graphics and properties of the vehicle could change. */
+					TriggerVehicle(v, VEHICLE_TRIGGER_CALLBACK_32); // Trigger vehicle trigger 10
+					v->MarkDirty();
+				}
 				if (HasBit(callback, 1)) v->colourmap = PAL_NONE;
 
 				if (callback & ~3) ErrorUnknownCallbackResult(v->GetGRFID(), CBID_VEHICLE_32DAY_CALLBACK, callback);
@@ -1340,7 +1344,9 @@
 
 	VehicleServiceInDepot(v);
 
+	/* After a vehicle trigger, the graphics and properties of the vehicle could change. */
 	TriggerVehicle(v, VEHICLE_TRIGGER_DEPOT);
+	v->MarkDirty();
 
 	if (v->current_order.IsType(OT_GOTO_DEPOT)) {
 		SetWindowDirty(WC_VEHICLE_VIEW, v->index);