summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2011-11-12 18:06:34 +0000
committerrubidium <rubidium@openttd.org>2011-11-12 18:06:34 +0000
commitfb63543e2a9659d186f20c0558394b17b1615830 (patch)
tree71ef0580f22c269e82995ab864400a0e68579b57
parent7fd1e1df81c3ed45e176f1bbf46d873b6cff316e (diff)
downloadopenttd-fb63543e2a9659d186f20c0558394b17b1615830.tar.xz
(svn r23199) -Fix [FS#4822]: oil rigs that "expired" did not get removed from the station list
-rw-r--r--src/order_backup.cpp3
-rw-r--r--src/order_base.h2
-rw-r--r--src/order_cmd.cpp21
-rw-r--r--src/station.cpp8
4 files changed, 31 insertions, 3 deletions
diff --git a/src/order_backup.cpp b/src/order_backup.cpp
index b2e7b068c..9cccb941f 100644
--- 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 @@ void OrderBackup::DoRestore(Vehicle *v)
} 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();
diff --git a/src/order_base.h b/src/order_base.h
index 87d79d8a0..e2279da81 100644
--- a/src/order_base.h
+++ b/src/order_base.h
@@ -51,7 +51,7 @@ public:
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);
diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp
index 11a968a8f..ad84b582c 100644
--- a/src/order_cmd.cpp
+++ b/src/order_cmd.cpp
@@ -41,6 +41,19 @@ INSTANTIATE_POOL_METHODS(Order)
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 @@ void OrderList::InsertOrderAt(Order *new_order, int index)
++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);
+ }
+
}
diff --git a/src/station.cpp b/src/station.cpp
index a0b72e7c6..a3df6fe74 100644
--- a/src/station.cpp
+++ b/src/station.cpp
@@ -99,8 +99,12 @@ Station::~Station()
/* 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);