changeset 18617:31037ca54d3d draft

(svn r23464) -Fix [FS#4876]: clear the backed up orders of a removed station as well, otherwise one could create orders to a station that was never in the original backupped orders. For example a road vehicle trying to go to a buoy.
author rubidium <rubidium@openttd.org>
date Fri, 09 Dec 2011 20:48:13 +0000
parents 2c4be09c3f9b
children 690f883cee0e
files src/order_backup.cpp src/order_backup.h src/order_cmd.cpp
diffstat 3 files changed, 27 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/order_backup.cpp
+++ b/src/order_backup.cpp
@@ -17,6 +17,7 @@
 #include "order_backup.h"
 #include "vehicle_base.h"
 #include "window_func.h"
+#include "station_map.h"
 
 OrderBackupPool _order_backup_pool("BackupOrder");
 INSTANTIATE_POOL_METHODS(OrderBackup)
@@ -257,3 +258,25 @@
 		}
 	}
 }
+
+/**
+ * Removes an order from all vehicles. Triggers when, say, a station is removed.
+ * @param type The type of the order (OT_GOTO_[STATION|DEPOT|WAYPOINT]).
+ * @param destination The destination. Can be a StationID, DepotID or WaypointID.
+ */
+/* static */ void OrderBackup::RemoveOrder(OrderType type, DestinationID destination)
+{
+	OrderBackup *ob;
+	FOR_ALL_ORDER_BACKUPS(ob) {
+		for (Order *order = ob->orders; order != NULL; order = order->next) {
+			OrderType ot = order->GetType();
+			if (ot == OT_GOTO_DEPOT && (order->GetDepotActionType() & ODATFB_NEAREST_DEPOT) != 0) continue;
+			if (ot == OT_IMPLICIT || (IsHangarTile(ob->tile) && ot == OT_GOTO_DEPOT)) ot = OT_GOTO_STATION;
+			if (ot == type && order->GetDestination() == destination) {
+				/* Remove the order backup! If a station/depot gets removed, we can't/shouldn't restore those broken orders. */
+				delete ob;
+				break;
+			}
+		}
+	}
+}
--- a/src/order_backup.h
+++ b/src/order_backup.h
@@ -67,6 +67,7 @@
 
 	static void ClearGroup(GroupID group);
 	static void ClearVehicle(const Vehicle *v);
+	static void RemoveOrder(OrderType type, DestinationID destination);
 };
 
 /**
--- a/src/order_cmd.cpp
+++ b/src/order_cmd.cpp
@@ -27,6 +27,7 @@
 #include "station_base.h"
 #include "waypoint_base.h"
 #include "company_base.h"
+#include "order_backup.h"
 
 #include "table/strings.h"
 
@@ -1705,6 +1706,8 @@
 			}
 		}
 	}
+
+	OrderBackup::RemoveOrder(type, destination);
 }
 
 /**