From 315dd62bd98437342403f93d32f87dc017c3a2e0 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 27 Mar 2024 19:25:03 +0000 Subject: [PATCH] Fix Vehicle::CopyVehicleConfigAndStatistics not releasing unit number See: https://github.com/OpenTTD/OpenTTD/issues/12388 --- src/train_cmd.cpp | 3 +-- src/vehicle.cpp | 11 +++++++++++ src/vehicle_base.h | 3 +++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 5d2a3e8417..5915e96305 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2225,8 +2225,7 @@ CommandCost CmdMoveRailVehicle(TileIndex tile, DoCommandFlag flags, uint32_t p1, } /* Remove stuff not valid anymore for non-front engines. */ DeleteVehicleOrders(src); - Company::Get(src->owner)->freeunits[src->type].ReleaseID(src->unitnumber); - src->unitnumber = 0; + src->ReleaseUnitNumber(); if (!_settings_game.vehicle.non_leading_engines_keep_name) { src->name.clear(); } diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 22d23d5019..d5a80ea368 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -3710,6 +3710,17 @@ void Vehicle::ResetRefitCaps() for (Vehicle *v = this; v != nullptr; v = v->Next()) v->refit_cap = v->cargo_cap; } +/** + * Release the vehicle's unit number. + */ +void Vehicle::ReleaseUnitNumber() +{ + if (this->unitnumber != 0) { + Company::Get(this->owner)->freeunits[this->type].ReleaseID(this->unitnumber); + this->unitnumber = 0; + } +} + static bool ShouldVehicleContinueWaiting(Vehicle *v) { if (v->GetNumOrders() < 1) return false; diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 89a4a00bf5..951e658b60 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -907,6 +907,8 @@ public: void ResetRefitCaps(); + void ReleaseUnitNumber(); + /** * Copy certain configurations and statistics of a vehicle after successful autoreplace/renew * The function shall copy everything that cannot be copied by a command (like orders / group etc), @@ -917,6 +919,7 @@ public: { this->CopyConsistPropertiesFrom(src); + this->ReleaseUnitNumber(); this->unitnumber = src->unitnumber; this->current_order = src->current_order;