From 2028472253aa37a2321d08639d87fa6a84bf833a Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Tue, 21 Mar 2023 19:18:10 +0000 Subject: [PATCH] Saveload: Skip VENC/TNNC chunks entirely on non network server saves --- src/saveload/extended_ver_sl.cpp | 8 ++++++-- src/saveload/town_sl.cpp | 17 ++++++++++++++++- src/saveload/vehicle_sl.cpp | 17 ++++++++++++++++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/saveload/extended_ver_sl.cpp b/src/saveload/extended_ver_sl.cpp index 947e52f23d..142b9ac423 100644 --- a/src/saveload/extended_ver_sl.cpp +++ b/src/saveload/extended_ver_sl.cpp @@ -151,7 +151,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_ORDER_FLAGS_EXTRA, XSCF_NULL, 1, 1, "order_flags_extra", nullptr, nullptr, nullptr }, { XSLFI_ONE_WAY_DT_ROAD_STOP, XSCF_NULL, 1, 1, "one_way_dt_road_stop", nullptr, nullptr, nullptr }, { XSLFI_ONE_WAY_ROAD_STATE, XSCF_NULL, 1, 1, "one_way_road_state", nullptr, nullptr, nullptr }, - { XSLFI_VENC_CHUNK, XSCF_IGNORABLE_ALL, 1, 1, "venc_chunk", nullptr, nullptr, "VENC" }, + { XSLFI_VENC_CHUNK, XSCF_IGNORABLE_ALL, 0, 1, "venc_chunk", nullptr, nullptr, "VENC" }, { XSLFI_ANIMATED_TILE_EXTRA, XSCF_NULL, 1, 1, "animated_tile_extra", nullptr, nullptr, nullptr }, { XSLFI_NEWGRF_INFO_EXTRA, XSCF_NULL, 1, 1, "newgrf_info_extra", nullptr, nullptr, nullptr }, { XSLFI_INDUSTRY_CARGO_ADJ, XSCF_IGNORABLE_UNKNOWN, 1, 1, "industry_cargo_adj", nullptr, nullptr, nullptr }, @@ -183,7 +183,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = { { XSLFI_LINKGRAPH_SPARSE_EDGES, XSCF_NULL, 1, 1, "linkgraph_sparse_edges", nullptr, nullptr, nullptr }, { XSLFI_AUX_TILE_LOOP, XSCF_NULL, 1, 1, "aux_tile_loop", nullptr, nullptr, nullptr }, { XSLFI_NEWGRF_ENTITY_EXTRA, XSCF_NULL, 1, 1, "newgrf_entity_extra", nullptr, nullptr, nullptr }, - { XSLFI_TNNC_CHUNK, XSCF_IGNORABLE_ALL, 1, 1, "tnnc_chunk", nullptr, nullptr, "TNNC" }, + { XSLFI_TNNC_CHUNK, XSCF_IGNORABLE_ALL, 0, 1, "tnnc_chunk", nullptr, nullptr, "TNNC" }, { XSLFI_MULTI_CARGO_SHIPS, XSCF_NULL, 1, 1, "multi_cargo_ships", nullptr, nullptr, nullptr }, { XSLFI_SCRIPT_INT64, XSCF_NULL, 1, 1, "script_int64", nullptr, nullptr, nullptr }, { XSLFI_U64_TICK_COUNTER, XSCF_NULL, 1, 1, "u64_tick_counter", nullptr, nullptr, nullptr }, @@ -281,6 +281,10 @@ void SlXvSetCurrentState() if (IsScenarioSave()) { _sl_xv_feature_versions[XSLFI_WHOLE_MAP_CHUNK] = 0; } + if (IsNetworkServerSave()) { + _sl_xv_feature_versions[XSLFI_VENC_CHUNK] = 1; + _sl_xv_feature_versions[XSLFI_TNNC_CHUNK] = 1; + } } /** diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp index 2aeb7e8c3c..a06b4a1e40 100644 --- a/src/saveload/town_sl.cpp +++ b/src/saveload/town_sl.cpp @@ -377,6 +377,8 @@ void SlResetTNNC() void Save_TNNC() { + assert(_sl_xv_feature_versions[XSLFI_TNNC_CHUNK] != 0); + if (!IsNetworkServerSave() || !IsGetTownZonesCallbackHandlerPresent()) { SlSetLength(0); return; @@ -414,11 +416,24 @@ void Load_TNNC() } } +static ChunkSaveLoadSpecialOpResult Special_TNNC(uint32 chunk_id, ChunkSaveLoadSpecialOp op) +{ + switch (op) { + case CSLSO_SHOULD_SAVE_CHUNK: + if (_sl_xv_feature_versions[XSLFI_TNNC_CHUNK] == 0) return CSLSOR_DONT_SAVE_CHUNK; + break; + + default: + break; + } + return CSLSOR_NONE; +} + /** Chunk handler for towns. */ static const ChunkHandler town_chunk_handlers[] = { { 'HIDS', Save_HIDS, Load_HIDS, nullptr, nullptr, CH_ARRAY }, { 'CITY', Save_TOWN, Load_TOWN, Ptrs_TOWN, nullptr, CH_ARRAY }, - { 'TNNC', Save_TNNC, Load_TNNC, nullptr, nullptr, CH_RIFF }, + { 'TNNC', Save_TNNC, Load_TNNC, nullptr, nullptr, CH_RIFF, Special_TNNC }, }; extern const ChunkHandlerTable _town_chunk_handlers(town_chunk_handlers); diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 7144bf6215..0942e79980 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -1193,6 +1193,8 @@ static std::vector _aircraft_vencs; void Save_VENC() { + assert(_sl_xv_feature_versions[XSLFI_VENC_CHUNK] != 0); + if (!IsNetworkServerSave()) { SlSetLength(0); return; @@ -1415,6 +1417,19 @@ void SlProcessVENC() } } +static ChunkSaveLoadSpecialOpResult Special_VENC(uint32 chunk_id, ChunkSaveLoadSpecialOp op) +{ + switch (op) { + case CSLSO_SHOULD_SAVE_CHUNK: + if (_sl_xv_feature_versions[XSLFI_VENC_CHUNK] == 0) return CSLSOR_DONT_SAVE_CHUNK; + break; + + default: + break; + } + return CSLSOR_NONE; +} + const SaveLoadTable GetVehicleLookAheadDescription() { static const SaveLoad _vehicle_look_ahead_desc[] = { @@ -1507,7 +1522,7 @@ static const ChunkHandler veh_chunk_handlers[] = { { 'VEHS', Save_VEHS, Load_VEHS, Ptrs_VEHS, nullptr, CH_SPARSE_ARRAY }, { 'VEOX', Save_VEOX, Load_VEOX, nullptr, nullptr, CH_SPARSE_ARRAY }, { 'VESR', Save_VESR, Load_VESR, nullptr, nullptr, CH_SPARSE_ARRAY }, - { 'VENC', Save_VENC, Load_VENC, nullptr, nullptr, CH_RIFF }, + { 'VENC', Save_VENC, Load_VENC, nullptr, nullptr, CH_RIFF, Special_VENC }, { 'VLKA', Save_VLKA, Load_VLKA, nullptr, nullptr, CH_SPARSE_ARRAY }, };