From 2c05412d722903748bf928fd201b15cdad586a94 Mon Sep 17 00:00:00 2001 From: Patric Stout Date: Tue, 31 Aug 2021 14:31:37 +0200 Subject: [PATCH] Fix #9407: desync when founding a town nearby a station (#9526) "stations_near" wasn't updated when founding a town near a station. As this variable is not saved, any client joining after the town is founded has a different value for "stations_near", potentially causing desyncs. As the intention of this if() statement was to skip an expensive calculation when there are clearly no stations, better to move that check inside the function, so other places also enjoy the speedup. --- src/station_base.h | 3 +++ src/town_cmd.cpp | 10 ++++------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/station_base.h b/src/station_base.h index c63dcade17..eff191860c 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -565,6 +565,9 @@ void RebuildStationKdtree(); template void ForAllStationsAroundTiles(const TileArea &ta, Func func) { + /* There are no stations, so we will never find anything. */ + if (Station::GetNumItems() == 0) return; + /* Not using, or don't have a nearby stations list, so we need to scan. */ std::set seen_stations; diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index d53cd57835..2863b4d6f7 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -2310,12 +2310,10 @@ static void MakeTownHouse(TileIndex t, Town *town, byte counter, byte stage, Hou if (size & BUILDING_2_TILES_X) ClearMakeHouseTile(t + TileDiffXY(1, 0), town, counter, stage, ++type, random_bits); if (size & BUILDING_HAS_4_TILES) ClearMakeHouseTile(t + TileDiffXY(1, 1), town, counter, stage, ++type, random_bits); - if (!_generating_world) { - ForAllStationsAroundTiles(TileArea(t, (size & BUILDING_2_TILES_X) ? 2 : 1, (size & BUILDING_2_TILES_Y) ? 2 : 1), [town](Station *st, TileIndex tile) { - town->stations_near.insert(st); - return true; - }); - } + ForAllStationsAroundTiles(TileArea(t, (size & BUILDING_2_TILES_X) ? 2 : 1, (size & BUILDING_2_TILES_Y) ? 2 : 1), [town](Station *st, TileIndex tile) { + town->stations_near.insert(st); + return true; + }); }