From 3778ed74667c22d6a11ad82f1ed4cb60a9a51799 Mon Sep 17 00:00:00 2001 From: sfan5 Date: Mon, 7 Oct 2024 21:08:47 +0200 Subject: [PATCH] Keep PlayerMetaRef via name not pointer --- src/script/lua_api/l_object.cpp | 2 +- src/script/lua_api/l_playermeta.cpp | 14 ++++++++++---- src/script/lua_api/l_playermeta.h | 17 ++++++++++++----- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/script/lua_api/l_object.cpp b/src/script/lua_api/l_object.cpp index 7a199e458c..cd9be5428a 100644 --- a/src/script/lua_api/l_object.cpp +++ b/src/script/lua_api/l_object.cpp @@ -1521,7 +1521,7 @@ int ObjectRef::l_get_meta(lua_State *L) if (playersao == nullptr) return 0; - PlayerMetaRef::create(L, &playersao->getMeta()); + PlayerMetaRef::create(L, &getServer(L)->getEnv(), playersao->getPlayer()->getName()); return 1; } diff --git a/src/script/lua_api/l_playermeta.cpp b/src/script/lua_api/l_playermeta.cpp index e937c145c7..a3377c5241 100644 --- a/src/script/lua_api/l_playermeta.cpp +++ b/src/script/lua_api/l_playermeta.cpp @@ -21,6 +21,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_playermeta.h" #include "lua_api/l_internal.h" #include "common/c_content.h" +#include "serverenvironment.h" +#include "remoteplayer.h" +#include "server/player_sao.h" /* PlayerMetaRef @@ -28,12 +31,15 @@ with this program; if not, write to the Free Software Foundation, Inc., IMetadata *PlayerMetaRef::getmeta(bool auto_create) { - return metadata; + auto *player = m_env->getPlayer(m_name); + auto *sao = player ? player->getPlayerSAO() : nullptr; + return sao ? &sao->getMeta() : nullptr; } void PlayerMetaRef::clearMeta() { - metadata->clear(); + if (auto *meta = getmeta(true)) + meta->clear(); } void PlayerMetaRef::reportMetadataChange(const std::string *name) @@ -43,9 +49,9 @@ void PlayerMetaRef::reportMetadataChange(const std::string *name) // Creates an PlayerMetaRef and leaves it on top of stack // Not callable from Lua; all references are created on the C side. -void PlayerMetaRef::create(lua_State *L, IMetadata *metadata) +void PlayerMetaRef::create(lua_State *L, ServerEnvironment *env, std::string_view name) { - PlayerMetaRef *o = new PlayerMetaRef(metadata); + PlayerMetaRef *o = new PlayerMetaRef(env, name); *(void **)(lua_newuserdata(L, sizeof(void *))) = o; luaL_getmetatable(L, className); lua_setmetatable(L, -2); diff --git a/src/script/lua_api/l_playermeta.h b/src/script/lua_api/l_playermeta.h index f07bdcd094..3f39c37557 100644 --- a/src/script/lua_api/l_playermeta.h +++ b/src/script/lua_api/l_playermeta.h @@ -24,12 +24,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "lua_api/l_metadata.h" #include "irrlichttypes_bloated.h" #include "inventory.h" -#include "metadata.h" + +class ServerEnvironment; class PlayerMetaRef : public MetaDataRef { private: - IMetadata *metadata = nullptr; + ServerEnvironment *m_env; + std::string m_name; static const luaL_Reg methods[]; @@ -40,12 +42,17 @@ private: virtual void reportMetadataChange(const std::string *name = nullptr); public: - PlayerMetaRef(IMetadata *metadata) : metadata(metadata) {} + PlayerMetaRef(ServerEnvironment *env, std::string_view name) : + m_env(env), m_name(name) + { + assert(m_env); + assert(!m_name.empty()); + } ~PlayerMetaRef() = default; - // Creates an ItemStackMetaRef and leaves it on top of stack + // Creates an PlayerMetaRef and leaves it on top of stack // Not callable from Lua; all references are created on the C side. - static void create(lua_State *L, IMetadata *metadata); + static void create(lua_State *L, ServerEnvironment *env, std::string_view name); static void Register(lua_State *L);