From 0c44115bb35206a32b7c48157493c279d2cb5533 Mon Sep 17 00:00:00 2001 From: CodeHz Date: Fri, 26 Jun 2020 03:06:43 +0800 Subject: [PATCH] [MinecraftHeader] Fix crash in leveldata --- Base/compat.cpp | 2 +- MinecraftHeaders/Level/LevelData.h | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/Base/compat.cpp b/Base/compat.cpp index b712255b..fb7aa4a3 100644 --- a/Base/compat.cpp +++ b/Base/compat.cpp @@ -77,7 +77,7 @@ ActorUniqueID Level::getNewUniqueID() const { // RaidBossComponent::_sendBossEvent PacketSender &Level::getPacketSender() const { return *direct_access(this, 2096); } -LevelDataWrapper &Level::GetLevelDataWrapper() { return direct_access(this, 536); } +LevelDataWrapper &Level::GetLevelDataWrapper() { return direct_access(this, 544); } template <> Minecraft *LocateService() { return *GetServerSymbol("?mGame@ServerCommand@@1PEAVMinecraft@@EA"); diff --git a/MinecraftHeaders/Level/LevelData.h b/MinecraftHeaders/Level/LevelData.h index 7700752a..1c5d0941 100644 --- a/MinecraftHeaders/Level/LevelData.h +++ b/MinecraftHeaders/Level/LevelData.h @@ -24,10 +24,9 @@ #include "../dll.h" -class LevelDataValue : public std::variant< - int, bool, float, std::string, GeneratorType, GameType, BlockPos, unsigned int, - std::unique_ptr> { -public: +struct LevelDataValue : public std::variant< + int, bool, float, std::string, GeneratorType, GameType, BlockPos, unsigned int, + std::unique_ptr> { using variant::variant; }; @@ -106,7 +105,15 @@ class LevelData { template T const *_extractValue(StringKey const &) const; public: - template inline T const *extractValue(StringKey const &key) const { return _extractValue(key); } + inline LevelDataValue const *getValue(StringKey const &key) const { + if (auto kv = mKV.find(key); kv != mKV.end()) return &kv->second; + if (auto kv = mAltKV.find(key); kv != mAltKV.end()) return &kv->second; + return nullptr; + } + template inline T const *extractValue(StringKey const &key) const { + auto val = getValue(key); + return std::get_if(val); + } template inline void setValue(StringKey const &key, T value) { mKV[key] = LevelDataValue(value); } inline BlockPos getSpawnPos() const {