changeset 18363:ca42abca1267 draft

(svn r23199) -Fix [FS#4822]: oil rigs that "expired" did not get removed from the station list
author rubidium <rubidium@openttd.org>
date Sat, 12 Nov 2011 18:06:34 +0000
parents d7607ed4eef6
children 44e727d12094
files src/order_backup.cpp src/order_base.h src/order_cmd.cpp src/station.cpp
diffstat 4 files changed, 31 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/order_backup.cpp
+++ b/src/order_backup.cpp
@@ -16,6 +16,7 @@
 #include "network/network_func.h"
 #include "order_backup.h"
 #include "vehicle_base.h"
+#include "window_func.h"
 
 OrderBackupPool _order_backup_pool("BackupOrder");
 INSTANTIATE_POOL_METHODS(OrderBackup)
@@ -84,6 +85,8 @@
 	} else if (this->orders != NULL && OrderList::CanAllocateItem()) {
 		v->orders.list = new OrderList(this->orders, v);
 		this->orders = NULL;
+		/* Make sure buoys/oil rigs are updated in the station list. */
+		InvalidateWindowClassesData(WC_STATION_LIST, 0);
 	}
 
 	uint num_orders = v->GetNumOrders();
--- a/src/order_base.h
+++ b/src/order_base.h
@@ -51,7 +51,7 @@
 	uint16 travel_time;  ///< How long in ticks the journey to this destination should take.
 
 	Order() : refit_cargo(CT_NO_REFIT) {}
-	~Order() {}
+	~Order();
 
 	Order(uint32 packed);
 
--- a/src/order_cmd.cpp
+++ b/src/order_cmd.cpp
@@ -41,6 +41,19 @@
 OrderListPool _orderlist_pool("OrderList");
 INSTANTIATE_POOL_METHODS(OrderList)
 
+/** Clean everything up. */
+Order::~Order()
+{
+	if (CleaningPool()) return;
+
+	/* We can visit oil rigs and buoys that are not our own. They will be shown in
+	 * the list of stations. So, we need to invalidate that window if needed. */
+	if (this->IsType(OT_GOTO_STATION) || this->IsType(OT_GOTO_WAYPOINT)) {
+		BaseStation *bs = BaseStation::GetIfValid(this->GetDestination());
+		if (bs != NULL && bs->owner == OWNER_NONE) InvalidateWindowClassesData(WC_STATION_LIST, 0);
+	}
+}
+
 /**
  * 'Free' the order
  * @note ONLY use on "current_order" vehicle orders!
@@ -367,6 +380,14 @@
 	++this->num_orders;
 	if (!new_order->IsType(OT_IMPLICIT)) ++this->num_manual_orders;
 	this->timetable_duration += new_order->wait_time + new_order->travel_time;
+
+	/* We can visit oil rigs and buoys that are not our own. They will be shown in
+	 * the list of stations. So, we need to invalidate that window if needed. */
+	if (new_order->IsType(OT_GOTO_STATION) || new_order->IsType(OT_GOTO_WAYPOINT)) {
+		BaseStation *bs = BaseStation::Get(new_order->GetDestination());
+		if (bs->owner == OWNER_NONE) InvalidateWindowClassesData(WC_STATION_LIST, 0);
+	}
+
 }
 
 
--- a/src/station.cpp
+++ b/src/station.cpp
@@ -99,8 +99,12 @@
 	/* Clear the persistent storage. */
 	delete this->airport.psa;
 
-
-	InvalidateWindowData(WC_STATION_LIST, this->owner, 0);
+	if (this->owner == OWNER_NONE) {
+		/* Invalidate all in case of oil rigs. */
+		InvalidateWindowClassesData(WC_STATION_LIST, 0);
+	} else {
+		InvalidateWindowData(WC_STATION_LIST, this->owner, 0);
+	}
 
 	DeleteWindowById(WC_STATION_VIEW, index);