From fb63543e2a9659d186f20c0558394b17b1615830 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 12 Nov 2011 18:06:34 +0000 Subject: (svn r23199) -Fix [FS#4822]: oil rigs that "expired" did not get removed from the station list --- src/order_backup.cpp | 3 +++ src/order_base.h | 2 +- src/order_cmd.cpp | 21 +++++++++++++++++++++ src/station.cpp | 8 ++++++-- 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); -- cgit v1.2.3-70-g09d2