mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Iterate group vehicle lists for RemoveOrderFromAllVehicles
Additionally make the function receive one parameter more with the owner of the destination, to help it perform faster.pull/10548/head
parent
17c6259f5c
commit
444a90dda8
|
@ -2163,5 +2163,5 @@ void UpdateAirplanesOnNewStation(const Station *st)
|
|||
}
|
||||
|
||||
/* Heliports don't have a hangar. Invalidate all go to hangar orders from all aircraft. */
|
||||
if (!st->airport.HasHangar()) RemoveOrderFromAllVehicles(OT_GOTO_DEPOT, st->index, true);
|
||||
if (!st->airport.HasHangar()) RemoveOrderFromAllVehicles(OT_GOTO_DEPOT, st->index, st->owner, true);
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ Depot::~Depot()
|
|||
OrderBackup::Reset(this->xy, false);
|
||||
|
||||
/* Clear the depot from all order-lists */
|
||||
RemoveOrderFromAllVehicles(OT_GOTO_DEPOT, this->index);
|
||||
RemoveOrderFromAllVehicles(OT_GOTO_DEPOT, this->index, GetTileOwner(this->xy));
|
||||
|
||||
/* Delete the depot-window */
|
||||
CloseWindowById(WC_VEHICLE_DEPOT, this->xy);
|
||||
|
|
|
@ -1735,18 +1735,25 @@ void CheckOrders(const Vehicle *v)
|
|||
* 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.
|
||||
* @param owner The owner of the destination object.
|
||||
* @param hangar Only used for airports in the destination.
|
||||
* When false, remove airport and hangar orders.
|
||||
* When true, remove either airport or hangar order.
|
||||
*/
|
||||
void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination, bool hangar)
|
||||
void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination, Owner owner, bool hangar)
|
||||
{
|
||||
/* Aircraft have StationIDs for depot orders and never use DepotIDs
|
||||
* This fact is handled specially below
|
||||
*/
|
||||
|
||||
/* Go through all vehicles */
|
||||
for (Vehicle *v : Vehicle::Iterate()) {
|
||||
for (const Company *c : Company::Iterate()) {
|
||||
/* Only iterate over all companies in the case of neutral owners */
|
||||
if (owner != c->index && owner != OWNER_NONE) continue;
|
||||
for (VehicleType vtype = VEH_BEGIN; vtype < VEH_COMPANY_END; vtype++) {
|
||||
const VehicleList &vehicle_list = c->group_all[vtype].vehicle_list;
|
||||
for (const Vehicle *u : vehicle_list) {
|
||||
Vehicle *v = Vehicle::Get(u->index);
|
||||
if ((v->type == VEH_AIRCRAFT && v->current_order.IsType(OT_GOTO_DEPOT) && !hangar ? OT_GOTO_STATION : v->current_order.GetType()) == type &&
|
||||
(!hangar || v->type == VEH_AIRCRAFT) && v->current_order.GetDestination() == destination) {
|
||||
v->current_order.MakeDummy();
|
||||
|
@ -1795,6 +1802,8 @@ restart:
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OrderBackup::RemoveOrder(type, destination, hangar);
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include "company_type.h"
|
||||
|
||||
/* Functions */
|
||||
void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination, bool hangar = false);
|
||||
void RemoveOrderFromAllVehicles(OrderType type, DestinationID destination, Owner owner, bool hangar = false);
|
||||
void InvalidateVehicleOrder(const Vehicle *v, int data);
|
||||
void CheckOrders(const Vehicle*);
|
||||
void DeleteVehicleOrders(Vehicle *v, bool keep_orderlist = false, bool reset_order_indices = true);
|
||||
|
|
|
@ -143,7 +143,7 @@ Station::~Station()
|
|||
CloseWindowById(WC_STATION_VIEW, index);
|
||||
|
||||
/* Now delete all orders that go to the station */
|
||||
RemoveOrderFromAllVehicles(OT_GOTO_STATION, this->index);
|
||||
RemoveOrderFromAllVehicles(OT_GOTO_STATION, this->index, this->owner);
|
||||
|
||||
/* Remove all news items */
|
||||
DeleteStationNews(this->index);
|
||||
|
|
|
@ -52,6 +52,6 @@ Waypoint::~Waypoint()
|
|||
{
|
||||
if (CleaningPool()) return;
|
||||
CloseWindowById(WC_WAYPOINT_VIEW, this->index);
|
||||
RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index);
|
||||
RemoveOrderFromAllVehicles(OT_GOTO_WAYPOINT, this->index, this->owner);
|
||||
if (this->sign.kdtree_valid) _viewport_sign_kdtree.Remove(ViewportSignKdtreeItem::MakeWaypoint(this->index));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue