1
0
Fork 0

Codechange: Use FindVehiclesWithOrder when removing a road stop.

Searching shared orderlists is faster than searching the vehicle pool to find matching vehicles.
pull/12144/head
Peter Nelson 2024-02-20 21:03:25 +00:00
parent c637d376d0
commit 939652f732
No known key found for this signature in database
GPG Key ID: 8EF8F0A467DF75ED
2 changed files with 13 additions and 7 deletions

View File

@ -10,6 +10,7 @@
#include "stdafx.h"
#include "aircraft.h"
#include "bridge_map.h"
#include "vehiclelist_func.h"
#include "viewport_func.h"
#include "viewport_kdtree.h"
#include "command_func.h"
@ -2176,13 +2177,18 @@ static CommandCost RemoveRoadStop(TileIndex tile, DoCommandFlag flags, int repla
delete cur_stop;
/* Make sure no vehicle is going to the old roadstop */
for (RoadVehicle *v : RoadVehicle::Iterate()) {
if (v->First() == v && v->current_order.IsType(OT_GOTO_STATION) &&
v->dest_tile == tile) {
v->SetDestTile(v->GetOrderStationLocation(st->index));
/* Make sure no vehicle is going to the old roadstop. Narrow the search to any road vehicles with an order to
* this station, then look for any currently heading to the tile. */
StationID station_id = st->index;
FindVehiclesWithOrder(
[](const Vehicle *v) { return v->type == VEH_ROAD; },
[station_id](const Order *order) { return order->IsType(OT_GOTO_STATION) && order->GetDestination() == station_id; },
[station_id, tile](Vehicle *v) {
if (v->dest_tile == tile) {
v->SetDestTile(v->GetOrderStationLocation(station_id));
}
}
);
st->rect.AfterRemoveTile(st, tile);

View File

@ -26,7 +26,7 @@ void FindVehiclesWithOrder(VehiclePredicate veh_pred, OrderPredicate ord_pred, V
for (const OrderList *orderlist : OrderList::Iterate()) {
/* We assume all vehicles sharing an order list match the condition. */
const Vehicle *v = orderlist->GetFirstSharedVehicle();
Vehicle *v = orderlist->GetFirstSharedVehicle();
if (!veh_pred(v)) continue;
/* Vehicle is a candidate, search for a matching order. */