From 9121ff056939342752e0250ac0dc754667323552 Mon Sep 17 00:00:00 2001 From: SamuXarick <43006711+SamuXarick@users.noreply.github.com> Date: Fri, 15 Mar 2024 14:15:15 +0000 Subject: [PATCH] Fix #12301: Update ship current order destination tile when relocating buoys Moving buoys caused current_order to be detected as unchanged, making pathfinders to compute a path to an outdated v->dest_tile. Properly update v->dest_tile before reaching pathfinders. --- src/order_cmd.cpp | 20 +++++++++++++++++--- src/waypoint_cmd.cpp | 11 +++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index ccedb8e31d082..a02afc8d1bb57 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -2197,9 +2197,23 @@ bool ProcessOrders(Vehicle *v) } /* If it is unchanged, keep it. */ - if (order->Equals(v->current_order) && (v->type == VEH_AIRCRAFT || v->dest_tile != 0) && - (v->type != VEH_SHIP || !order->IsType(OT_GOTO_STATION) || Station::Get(order->GetDestination())->ship_station.tile != INVALID_TILE)) { - return false; + if (order->Equals(v->current_order) && (v->type == VEH_AIRCRAFT || v->dest_tile != 0)) { + if (v->type != VEH_SHIP) { + return false; + } else { + switch (order->GetType()) { + case OT_GOTO_STATION: + if (Station::Get(order->GetDestination())->ship_station.tile != INVALID_TILE) return false; + break; + + case OT_GOTO_WAYPOINT: + if (Waypoint::Get(order->GetDestination())->xy == v->dest_tile) return false; + break; + + default: + return false; + } + } } /* Otherwise set it, and determine the destination tile. */ diff --git a/src/waypoint_cmd.cpp b/src/waypoint_cmd.cpp index 52e0ca725ce42..3a9fbc9da6e99 100644 --- a/src/waypoint_cmd.cpp +++ b/src/waypoint_cmd.cpp @@ -22,6 +22,7 @@ #include "window_func.h" #include "timer/timer_game_calendar.h" #include "vehicle_func.h" +#include "ship.h" #include "string_func.h" #include "company_func.h" #include "newgrf_station.h" @@ -327,8 +328,14 @@ CommandCost CmdBuildBuoy(DoCommandFlag flags, TileIndex tile) if (wp == nullptr) { wp = new Waypoint(tile); } else { - /* Move existing (recently deleted) buoy to the new location */ - wp->xy = tile; + if (wp->xy != tile) { + /* Move existing (recently deleted) buoy to the new location. */ + wp->xy = tile; + for (Ship *v : Ship::Iterate()) { + if (!v->current_order.IsType(OT_GOTO_WAYPOINT) || v->current_order.GetDestination() != wp->index) continue; + v->SetDestTile(wp->xy); + } + } InvalidateWindowData(WC_WAYPOINT_VIEW, wp->index); } wp->rect.BeforeAddTile(tile, StationRect::ADD_TRY);