From 024dccb135cb520d2bc3504daeb42b3550b0e8d5 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Tue, 1 Oct 2024 21:05:08 +0300 Subject: [PATCH] fix: no blocks data conversion if no data loss detected --- res/texts/en_US.txt | 1 + res/texts/ru_RU.txt | 1 + src/content/ContentReport.cpp | 5 ++++- src/content/ContentReport.hpp | 5 +++++ src/data/StructLayout.cpp | 3 +++ src/logic/EngineController.cpp | 3 +++ 6 files changed, 17 insertions(+), 1 deletion(-) diff --git a/res/texts/en_US.txt b/res/texts/en_US.txt index 41988abf..de5d950a 100644 --- a/res/texts/en_US.txt +++ b/res/texts/en_US.txt @@ -3,6 +3,7 @@ menu.missing-content=Missing Content! world.convert-request=Content indices have changed! Convert world files? world.upgrade-request=World format is outdated! Convert world files? world.convert-with-loss=Convert world with data loss? +world.convert-block-layouts=Blocks fields have changes! Convert world files? pack.remove-confirm=Do you want to erase all pack(s) content from the world forever? error.pack-not-found=Could not to find pack error.dependency-not-found=Dependency pack is not found diff --git a/res/texts/ru_RU.txt b/res/texts/ru_RU.txt index 2ea4610f..fbae5756 100644 --- a/res/texts/ru_RU.txt +++ b/res/texts/ru_RU.txt @@ -48,6 +48,7 @@ world.Create World=Создать Мир world.convert-request=Есть изменения в индексах! Конвертировать мир? world.upgrade-request=Формат мира устарел! Конвертировать мир? world.convert-with-loss=Конвертировать мир с потерями? +world.convert-block-layouts=Есть изменения в полях блоков! Конвертировать мир? world.delete-confirm=Удалить мир безвозвратно? # Настройки diff --git a/src/content/ContentReport.cpp b/src/content/ContentReport.cpp index 257bd3b3..0442e618 100644 --- a/src/content/ContentReport.cpp +++ b/src/content/ContentReport.cpp @@ -81,6 +81,9 @@ std::shared_ptr ContentReport::create( ); } } + if (layout != *def->dataStruct) { + report->dataLayoutsUpdated = true; + } report->blocksDataLayouts[name] = std::move(layout); } @@ -89,7 +92,7 @@ std::shared_ptr ContentReport::create( if (report->isUpgradeRequired() || report->hasContentReorder() || report->hasMissingContent() || - report->hasDataLoss()) { + report->hasUpdatedLayouts()) { return report; } else { return nullptr; diff --git a/src/content/ContentReport.hpp b/src/content/ContentReport.hpp index 1c7cb274..3476b872 100644 --- a/src/content/ContentReport.hpp +++ b/src/content/ContentReport.hpp @@ -128,6 +128,8 @@ public: std::vector issues; std::vector dataLoss; + bool dataLayoutsUpdated = false; + ContentReport( const ContentIndices* indices, size_t blocks, @@ -144,6 +146,9 @@ public: inline const std::vector& getDataLoss() const { return dataLoss; } + inline bool hasUpdatedLayouts() { + return dataLayoutsUpdated; + } inline bool hasContentReorder() const { return blocks.hasContentReorder() || items.hasContentReorder(); diff --git a/src/data/StructLayout.cpp b/src/data/StructLayout.cpp index 9007213c..4f5368dd 100644 --- a/src/data/StructLayout.cpp +++ b/src/data/StructLayout.cpp @@ -273,6 +273,9 @@ size_t StructLayout::setUnicode( size_t size = util::crop_utf8(text, field.elements); auto ptr = reinterpret_cast(dst + field.offset); std::memcpy(ptr, value.data(), size); + if (size < field.elements) { + ptr[size] = '\0'; + } return size; } diff --git a/src/logic/EngineController.cpp b/src/logic/EngineController.cpp index 5bf61010..c43099cb 100644 --- a/src/logic/EngineController.cpp +++ b/src/logic/EngineController.cpp @@ -80,6 +80,9 @@ void show_convert_request( }; std::wstring message = L"world.convert-request"; + if (report->hasUpdatedLayouts()) { + message = L"world.convert-block-layouts"; + } if (report->isUpgradeRequired()) { message = L"world.upgrade-request"; } else if (report->hasDataLoss()) {