From 521e4911c8e13ae0a3fdd3488d2d819128d3c303 Mon Sep 17 00:00:00 2001 From: OEOTYAN Date: Sat, 20 Jan 2024 14:11:05 +0800 Subject: [PATCH] refactor: compress dim nbt data --- .../api/dimension/CustomDimensionManager.cpp | 20 ++++++++++++++++--- .../core/dimension/CustomDimensionConfig.cpp | 13 ++++++------ src/ll/core/dimension/CustomDimensionConfig.h | 2 +- .../MyFlatWorldGenerator.hpp | 11 +++++----- .../random/XoroshiroPositionalRandomFactory.h | 6 +++--- src/mc/world/level/Level.h | 1 - .../world/level/levelgen/feature/IFeature.h | 5 +++++ 7 files changed, 37 insertions(+), 21 deletions(-) diff --git a/src/ll/api/dimension/CustomDimensionManager.cpp b/src/ll/api/dimension/CustomDimensionManager.cpp index 9f3ea30cfc..c465b07b2c 100644 --- a/src/ll/api/dimension/CustomDimensionManager.cpp +++ b/src/ll/api/dimension/CustomDimensionManager.cpp @@ -120,12 +120,16 @@ struct CustomDimensionManager::Impl { CustomDimensionManager::CustomDimensionManager() : impl(std::make_unique()) { std::lock_guard lock{impl->mMapMutex}; + CustomDimensionConfig::setDimensionConfigPath(); CustomDimensionConfig::loadConfigFile(); if (!CustomDimensionConfig::dimConfig.dimensionList.empty()) { for (auto& [name, info] : CustomDimensionConfig::dimConfig.dimensionList) { impl->customDimensionMap.emplace( name, - Impl::DimensionInfo{info.dimId, *CompoundTag::fromBinaryNbt(base64_utils::decode(info.base64Nbt))} + Impl::DimensionInfo{ + info.dimId, + *CompoundTag::fromBinaryNbt(string_utils::decompress(base64_utils::decode(info.base64Nbt))) + } ); } impl->mNewDimensionId += static_cast(impl->customDimensionMap.size()); @@ -150,12 +154,19 @@ DimensionType CustomDimensionManager::addDimension( bool newDim{}; if (impl->customDimensionMap.contains(dimName)) { info = impl->customDimensionMap.at(dimName); - loggerMoreDimMag.debug("The dimension already registry. use old id, name: {}, id: {}", dimName, info.id.id); + loggerMoreDimMag.debug( + "The dimension already registry. use old id, name: {}, id: {}, \ndata: {}", + dimName, + info.id.id, + info.nbt.toSnbt() + ); } else { // Assign new id info.id = impl->mNewDimensionId++; info.nbt = data(); newDim = true; + loggerMoreDimMag + .debug("registry new dimension, name: {}, id: {}, \ndata: {}", dimName, info.id.id, info.nbt.toSnbt()); }; // registry create dimension function @@ -191,7 +202,10 @@ DimensionType CustomDimensionManager::addDimension( impl->customDimensionMap.emplace(dimName, info); CustomDimensionConfig::dimConfig.dimensionList.emplace( dimName, - CustomDimensionConfig::Config::Info{info.id, base64_utils::encode(info.nbt.toBinaryNbt())} + CustomDimensionConfig::Config::Info{ + info.id, + base64_utils::encode(string_utils::compress(info.nbt.toBinaryNbt())) + } ); CustomDimensionConfig::saveConfigFile(); } diff --git a/src/ll/core/dimension/CustomDimensionConfig.cpp b/src/ll/core/dimension/CustomDimensionConfig.cpp index 25ef24497f..a823245c65 100644 --- a/src/ll/core/dimension/CustomDimensionConfig.cpp +++ b/src/ll/core/dimension/CustomDimensionConfig.cpp @@ -11,20 +11,19 @@ namespace ll::dimension::CustomDimensionConfig { -static ll::Logger logger("CustomDimensionConfig"); -static std::string dimensionConfigPath{R"(worlds\Bedrock level\dimension_config.json)"}; -Config dimConfig{}; +static ll::Logger logger("CustomDimensionConfig"); +static std::filesystem::path dimensionConfigPath{u8"./worlds"}; +Config dimConfig{}; void setDimensionConfigPath() { if (!ll::service::getLevel()) { - return; + throw std::runtime_error("Level nullptr"); } - auto levelName = ll::service::getLevel()->getLevelData().getLevelName(); - dimensionConfigPath.replace(dimensionConfigPath.find("Bedrock level"), 13, levelName); + dimensionConfigPath /= string_utils::str2u8str(ll::service::getLevel()->getLevelName()); + dimensionConfigPath /= u8"dimension_config.json"; } bool loadConfigFile() { - setDimensionConfigPath(); // set real world path if (!ll::config::loadConfig(dimConfig, dimensionConfigPath, [](auto&, auto&) -> bool { return false; })) { if (ll::config::saveConfig(dimConfig, dimensionConfigPath)) { logger.warn("Config file rewrite success!"); diff --git a/src/ll/core/dimension/CustomDimensionConfig.h b/src/ll/core/dimension/CustomDimensionConfig.h index 8e8c9bd5b0..46512767c3 100644 --- a/src/ll/core/dimension/CustomDimensionConfig.h +++ b/src/ll/core/dimension/CustomDimensionConfig.h @@ -12,7 +12,7 @@ struct Config { int dimId{}; std::string base64Nbt; }; - int version = 2; + int version = 3; std::unordered_map dimensionList{}; }; extern Config dimConfig; diff --git a/src/ll/test/customWorldGenerator/MyFlatWorldGenerator.hpp b/src/ll/test/customWorldGenerator/MyFlatWorldGenerator.hpp index a440ea7e3e..378f600a18 100644 --- a/src/ll/test/customWorldGenerator/MyFlatWorldGenerator.hpp +++ b/src/ll/test/customWorldGenerator/MyFlatWorldGenerator.hpp @@ -1,4 +1,7 @@ #pragma once + +#include "ll/api/utils/RandomUtils.h" + #include "mc/common/wrapper/FeatureRefTraits.h" #include "mc/common/wrapper/WeakRefT.h" #include "mc/deps/core/debug/log/ContentLog.h" @@ -70,19 +73,15 @@ class MyFlatWorldGenerator : public FlatWorldGenerator { // r->place(blockSource, {14, -60, 14}, random); - srand(time(0)); - - XoroshiroPositionalRandomFactory wxoroshiroPositionalRandomFactory(rand(), rand()); LakeFeature wlakeFeature( BlockTypeRegistry::getDefaultBlockState(VanillaBlockTypeIds::Water, 1), - wxoroshiroPositionalRandomFactory + XoroshiroPositionalRandomFactory{ll::random_utils::rand(), ll::random_utils::rand()} ); wlakeFeature.place(blockSource, {14, 0, 14}, random); - XoroshiroPositionalRandomFactory lxoroshiroPositionalRandomFactory(rand(), rand()); LakeFeature llakeFeature( BlockTypeRegistry::getDefaultBlockState(VanillaBlockTypeIds::Lava, 1), - lxoroshiroPositionalRandomFactory + XoroshiroPositionalRandomFactory{ll::random_utils::rand(), ll::random_utils::rand()} ); llakeFeature.place(blockSource, {-14, 0, -14}, random); diff --git a/src/mc/util/random/XoroshiroPositionalRandomFactory.h b/src/mc/util/random/XoroshiroPositionalRandomFactory.h index e7e1923ec7..596f64876c 100644 --- a/src/mc/util/random/XoroshiroPositionalRandomFactory.h +++ b/src/mc/util/random/XoroshiroPositionalRandomFactory.h @@ -13,11 +13,11 @@ namespace Crypto::Hash { class md5; } class XoroshiroPositionalRandomFactory : public ::IPositionalRandomFactory { public: - uint64_t mSeedLo; // this+0x8 - uint64_t mSeedHi; // this+0x10 + uint64 mSeedLo; // this+0x8 + uint64 mSeedHi; // this+0x10 public: - XoroshiroPositionalRandomFactory(uint64_t seedLo, uint64_t seedHi) : mSeedLo(seedLo), mSeedHi(seedHi) {} + XoroshiroPositionalRandomFactory(uint64 seedLo, uint64 seedHi) : mSeedLo(seedLo), mSeedHi(seedHi) {} public: // NOLINTBEGIN diff --git a/src/mc/world/level/Level.h b/src/mc/world/level/Level.h index 570eded6e1..915f9024da 100644 --- a/src/mc/world/level/Level.h +++ b/src/mc/world/level/Level.h @@ -52,7 +52,6 @@ class ServerLevel; class Level : public ILevel, public BlockSourceListener, public IWorldRegistriesProvider { public: [[nodiscard]] std::string const& getLevelName() const { return getLevelData().getLevelName(); } - [[nodiscard]] std::string getLevelPath() const { return "./worlds/" + getLevelName(); } [[nodiscard]] ServerLevel& asServer() { return *reinterpret_cast(this); } diff --git a/src/mc/world/level/levelgen/feature/IFeature.h b/src/mc/world/level/levelgen/feature/IFeature.h index a08cc7c047..8bba80292f 100644 --- a/src/mc/world/level/levelgen/feature/IFeature.h +++ b/src/mc/world/level/levelgen/feature/IFeature.h @@ -2,6 +2,11 @@ #include "mc/_HeaderOutputPredefine.h" +class IBlockWorldGenAPI; +class BlockPos; +class Random; +class RenderParams; + class IFeature { public: // prevent constructor by default