Codechange: Use FindVehiclesWithOrder when removing a road stop. (#12144)

This commit is contained in:
Peter Nelson 2024-03-28 22:22:37 +00:00 committed by GitHub
parent 907cb4fc53
commit 8746be8bf2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
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"
@ -2174,13 +2175,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. */