From 0da467c37425b98dc96c3507fec90073d49e9241 Mon Sep 17 00:00:00 2001 From: Lars Date: Fri, 30 May 2025 17:20:34 -0700 Subject: [PATCH] address review --- src/mapblock.cpp | 2 +- src/mapblock.h | 4 ++-- src/unittest/test_mapblock.cpp | 29 ++++++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/src/mapblock.cpp b/src/mapblock.cpp index fd16b6397..5f3c5c850 100644 --- a/src/mapblock.cpp +++ b/src/mapblock.cpp @@ -429,7 +429,7 @@ void MapBlock::serialize(std::ostream &os_compressed, u8 version, bool disk, int const u8 params_width = 2; if(disk) { - const int size = m_is_mono_block ? 1 : nodecount; + const size_t size = m_is_mono_block ? 1 : nodecount; MapNode *tmp_nodes = new MapNode[size]; memcpy(tmp_nodes, data, size * sizeof(MapNode)); getBlockNodeIdMapping(&nimap, tmp_nodes, m_gamedef->ndef(), size); diff --git a/src/mapblock.h b/src/mapblock.h index c5b156b50..8effc6ce9 100644 --- a/src/mapblock.h +++ b/src/mapblock.h @@ -21,9 +21,7 @@ class NodeMetadataList; class IGameDef; class MapBlockMesh; class VoxelManipulator; -#if BUILD_UNITTESTS class TestMapBlock; -#endif #define BLOCK_TIMESTAMP_UNDEFINED 0xffffffff @@ -442,7 +440,9 @@ private: */ void deSerialize_pre22(std::istream &is, u8 version, bool disk); + // check if all nodes are identical, if so store them as a single node void tryConvertToMonoblock(); + // if only a single node is stored, expand storage back to the full array void deconvertMonoblock(); void reallocate(u32 c, MapNode n); diff --git a/src/unittest/test_mapblock.cpp b/src/unittest/test_mapblock.cpp index d94497335..4ca66c19c 100644 --- a/src/unittest/test_mapblock.cpp +++ b/src/unittest/test_mapblock.cpp @@ -121,7 +121,6 @@ void TestMapBlock::testMonoblock(IGameDef *gamedef) UASSERT(vmm.getNode({5,5,5}).param0 == 42); block.setNode(5,5,5,MapNode(23)); - t = block.data; block.copyFrom(vmm); UASSERT(block.m_is_mono_block); @@ -130,6 +129,34 @@ void TestMapBlock::testMonoblock(IGameDef *gamedef) vmm.setNode({5,5,5}, MapNode(23)); block.copyFrom(vmm); UASSERT(!block.m_is_mono_block); + + vmm.setNode({5,5,5}, MapNode(42,1,0)); + block.copyFrom(vmm); + UASSERT(!block.m_is_mono_block); + + vmm.setNode({5,5,5}, MapNode(42,0,1)); + block.copyFrom(vmm); + UASSERT(!block.m_is_mono_block); + + vmm.setNode({5,5,5}, MapNode(42)); + block.copyFrom(vmm); + UASSERT(block.m_is_mono_block); + + block.setNode(5,5,5,MapNode(23)); + block.tryConvertToMonoblock(); + UASSERT(!block.m_is_mono_block); + + block.setNode(5,5,5,MapNode(42, 1, 0)); + block.tryConvertToMonoblock(); + UASSERT(!block.m_is_mono_block); + + block.setNode(5,5,5,MapNode(42, 0, 1)); + block.tryConvertToMonoblock(); + UASSERT(!block.m_is_mono_block); + + block.setNode(5,5,5,MapNode(42)); + block.tryConvertToMonoblock(); + UASSERT(block.m_is_mono_block); } void TestMapBlock::testSaveLoad(IGameDef *gamedef, const u8 version)