Skip to content

Commit

Permalink
Fix #12301: Update ship current order destination tile when relocatin…
Browse files Browse the repository at this point in the history
…g 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.
  • Loading branch information
SamuXarick committed Mar 17, 2024
1 parent ab94c8b commit 9121ff0
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 5 deletions.
20 changes: 17 additions & 3 deletions src/order_cmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand Down
11 changes: 9 additions & 2 deletions src/waypoint_cmd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 9121ff0

Please sign in to comment.