From 130d9cb650e117a9899251fc8d227524b58679b6 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 9 Feb 2024 18:21:51 +0000 Subject: [PATCH] Fix crash when road vehicle changed length in drive-through road stop Due to refit and incorrectly implemented NewGRF --- src/roadstop_base.h | 8 ++++++++ src/roadveh_cmd.cpp | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/roadstop_base.h b/src/roadstop_base.h index df9d6172e5..1474cd115c 100644 --- a/src/roadstop_base.h +++ b/src/roadstop_base.h @@ -60,6 +60,14 @@ struct RoadStop : RoadStopPool::PoolItem<&_roadstop_pool> { return this->occupied; } + /** + * Adjust the occupation of this road stop, only to handle vehicles unexpectedly changing length + */ + inline void AdjustOccupation(int adjustment) + { + this->occupied += adjustment; + } + void Leave(const RoadVehicle *rv); void Enter(const RoadVehicle *rv); void CheckIntegrity(const RoadStop *rs) const; diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index d33e5bcdf1..c77a38aa2c 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -222,6 +222,7 @@ void RoadVehUpdateCache(RoadVehicle *v, bool same_length) v->InvalidateNewGRFCacheOfChain(); + const uint16_t old_total_length = v->gcache.cached_total_length; v->gcache.cached_total_length = 0; Vehicle *last_vis_effect = v; @@ -257,6 +258,13 @@ void RoadVehUpdateCache(RoadVehicle *v, bool same_length) uint max_speed = GetVehicleProperty(v, PROP_ROADVEH_SPEED, 0); v->vcache.cached_max_speed = (max_speed != 0) ? max_speed * 4 : RoadVehInfo(v->engine_type)->max_speed; + + if (same_length && old_total_length != v->gcache.cached_total_length) { + if (IsInsideMM(v->state, RVSB_IN_DT_ROAD_STOP, RVSB_IN_DT_ROAD_STOP_END)) { + RoadStop *rs = RoadStop::GetByTile(v->tile, GetRoadStopType(v->tile)); + rs->GetEntry(v)->AdjustOccupation((int)v->gcache.cached_total_length - (int)old_total_length); + } + } } /**