]> git.lizzy.rs Git - dragonfireclient.git/commitdiff
Get rid of node metadata when it becomes empty
authorsfan5 <sfan5@live.de>
Thu, 26 May 2022 13:45:34 +0000 (15:45 +0200)
committersfan5 <sfan5@live.de>
Sun, 29 May 2022 12:00:19 +0000 (14:00 +0200)
fixes #8943

games/devtest/mods/unittests/misc.lua
src/script/lua_api/l_nodemeta.cpp
src/script/lua_api/l_nodemeta.h

index ba980866a12976281320346b7ec599015dbd629b..4b53004b1d47567d677471d04c7438ca889e0c79 100644 (file)
@@ -48,3 +48,23 @@ local function test_v3s16_metatable(player, pos)
        assert(vector.check(found_pos))
 end
 unittests.register("test_v3s16_metatable", test_v3s16_metatable, {map=true})
+
+local function test_clear_meta(_, pos)
+       local ref = core.get_meta(pos)
+
+       for way = 1, 3 do
+               ref:set_string("foo", "bar")
+               assert(ref:contains("foo"))
+
+               if way == 1 then
+                       ref:from_table({})
+               elseif way == 2 then
+                       ref:from_table(nil)
+               else
+                       ref:set_string("foo", "")
+               end
+
+               assert(#core.find_nodes_with_meta(pos, pos) == 0, "clearing failed " .. way)
+       end
+end
+unittests.register("test_clear_meta", test_clear_meta, {map=true})
index 1d052685e4fbc5dbae4ef632933448d5cd0bf117..514a1b78b18bfe8ae59ed00a214abcdb5d7373ad 100644 (file)
@@ -40,7 +40,7 @@ NodeMetaRef* NodeMetaRef::checkobject(lua_State *L, int narg)
 Metadata* NodeMetaRef::getmeta(bool auto_create)
 {
        if (m_is_local)
-               return m_meta;
+               return m_local_meta;
 
        NodeMetadata *meta = m_env->getMap().getNodeMetadata(m_p);
        if (meta == NULL && auto_create) {
@@ -62,9 +62,12 @@ void NodeMetaRef::clearMeta()
 void NodeMetaRef::reportMetadataChange(const std::string *name)
 {
        SANITY_CHECK(!m_is_local);
-       // NOTE: This same code is in rollback_interface.cpp
        // Inform other things that the metadata has changed
-       NodeMetadata *meta = dynamic_cast<NodeMetadata*>(m_meta);
+       NodeMetadata *meta = dynamic_cast<NodeMetadata*>(getmeta(false));
+
+       // If the metadata is now empty, get rid of it
+       if (meta && meta->empty())
+               clearMeta();
 
        MapEditEvent event;
        event.type = MEET_BLOCK_NODE_METADATA_CHANGED;
@@ -174,8 +177,8 @@ NodeMetaRef::NodeMetaRef(v3s16 p, ServerEnvironment *env):
 }
 
 NodeMetaRef::NodeMetaRef(Metadata *meta):
-       m_meta(meta),
-       m_is_local(true)
+       m_is_local(true),
+       m_local_meta(meta)
 {
 }
 
index fdc1766ed2073063fbf48ef8bf3f280186b30543..265ece3d056c47e405a6410a29198d12a6110a67 100644 (file)
@@ -33,10 +33,12 @@ class NodeMetadata;
 
 class NodeMetaRef : public MetaDataRef {
 private:
+       bool m_is_local = false;
+       // Set for server metadata
        v3s16 m_p;
        ServerEnvironment *m_env = nullptr;
-       Metadata *m_meta = nullptr;
-       bool m_is_local = false;
+       // Set for client metadata
+       Metadata *m_local_meta = nullptr;
 
        static const char className[];
        static const luaL_Reg methodsServer[];