From 7460e73252b5f0c64541312b684f54de0bde5726 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Mon, 12 Feb 2024 22:41:35 +0000 Subject: [PATCH] SaveLoad: Fix crash when joining network server which used GRF custom town zones --- src/sl/town_sl.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/sl/town_sl.cpp b/src/sl/town_sl.cpp index da66957340..a4ad9fb4b7 100644 --- a/src/sl/town_sl.cpp +++ b/src/sl/town_sl.cpp @@ -391,7 +391,7 @@ void Save_TNNC() if (IsGetTownZonesCallbackHandlerPresent()) { flags |= 1; - length += lengthof(TownCache::squared_town_zone_radius) * 4; + length += Town::GetNumItems() * lengthof(TownCache::squared_town_zone_radius) * 4; } SlSetLength(length); @@ -402,7 +402,7 @@ void Save_TNNC() for (const Town *t : Town::Iterate()) { SlWriteUint32(t->index); SlWriteUint16(t->noise_reached); - if (flags & 2) { + if (flags & 1) { for (uint i = 0; i < lengthof(TownCache::squared_town_zone_radius); i++) { SlWriteUint32(t->cache.squared_town_zone_radius[i]); } @@ -426,7 +426,8 @@ void Load_TNNC() _town_zone_radii_no_update = (flags & 1); for (uint32_t idx = 0; idx < count; idx++) { - Town *t = Town::Get(SlReadUint32()); + Town *t = Town::GetIfValid(SlReadUint32()); + if (t == nullptr) SlErrorCorrupt("TNNC: invalid town ID"); t->noise_reached = SlReadUint16(); if (flags & 1) { for (uint i = 0; i < lengthof(TownCache::squared_town_zone_radius); i++) {