From 3d66622772e66154b7624957a27f9be54c4c7c28 Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Tue, 4 Dec 2018 20:37:48 +0100 Subject: Send only changed node metadata to clients instead of whole mapblock (#5268) Includes newer style changes and fixes by est31 Improve the block position de-serialization Add type NodeMetadataMap --- src/script/lua_api/l_itemstackmeta.cpp | 2 +- src/script/lua_api/l_itemstackmeta.h | 2 +- src/script/lua_api/l_metadata.cpp | 6 +++--- src/script/lua_api/l_metadata.h | 2 +- src/script/lua_api/l_nodemeta.cpp | 14 +++++--------- src/script/lua_api/l_nodemeta.h | 2 +- 6 files changed, 12 insertions(+), 16 deletions(-) (limited to 'src/script/lua_api') diff --git a/src/script/lua_api/l_itemstackmeta.cpp b/src/script/lua_api/l_itemstackmeta.cpp index 07ab86499..d1ba1bda4 100644 --- a/src/script/lua_api/l_itemstackmeta.cpp +++ b/src/script/lua_api/l_itemstackmeta.cpp @@ -46,7 +46,7 @@ void ItemStackMetaRef::clearMeta() istack->metadata.clear(); } -void ItemStackMetaRef::reportMetadataChange() +void ItemStackMetaRef::reportMetadataChange(const std::string *name) { // TODO } diff --git a/src/script/lua_api/l_itemstackmeta.h b/src/script/lua_api/l_itemstackmeta.h index 2f4c37fd9..c3198be4f 100644 --- a/src/script/lua_api/l_itemstackmeta.h +++ b/src/script/lua_api/l_itemstackmeta.h @@ -40,7 +40,7 @@ private: virtual void clearMeta(); - virtual void reportMetadataChange(); + virtual void reportMetadataChange(const std::string *name = nullptr); void setToolCapabilities(const ToolCapabilities &caps) { diff --git a/src/script/lua_api/l_metadata.cpp b/src/script/lua_api/l_metadata.cpp index 4f64cc8a6..21002e6a7 100644 --- a/src/script/lua_api/l_metadata.cpp +++ b/src/script/lua_api/l_metadata.cpp @@ -122,7 +122,7 @@ int MetaDataRef::l_set_string(lua_State *L) return 0; meta->setString(name, str); - ref->reportMetadataChange(); + ref->reportMetadataChange(&name); return 0; } @@ -160,7 +160,7 @@ int MetaDataRef::l_set_int(lua_State *L) return 0; meta->setString(name, str); - ref->reportMetadataChange(); + ref->reportMetadataChange(&name); return 0; } @@ -198,7 +198,7 @@ int MetaDataRef::l_set_float(lua_State *L) return 0; meta->setString(name, str); - ref->reportMetadataChange(); + ref->reportMetadataChange(&name); return 0; } diff --git a/src/script/lua_api/l_metadata.h b/src/script/lua_api/l_metadata.h index cee38ed45..e655eb684 100644 --- a/src/script/lua_api/l_metadata.h +++ b/src/script/lua_api/l_metadata.h @@ -37,7 +37,7 @@ public: protected: static MetaDataRef *checkobject(lua_State *L, int narg); - virtual void reportMetadataChange() {} + virtual void reportMetadataChange(const std::string *name = nullptr) {} virtual Metadata *getmeta(bool auto_create) = 0; virtual void clearMeta() = 0; diff --git a/src/script/lua_api/l_nodemeta.cpp b/src/script/lua_api/l_nodemeta.cpp index 33b158ae0..22fc61782 100644 --- a/src/script/lua_api/l_nodemeta.cpp +++ b/src/script/lua_api/l_nodemeta.cpp @@ -58,21 +58,17 @@ void NodeMetaRef::clearMeta() m_env->getMap().removeNodeMetadata(m_p); } -void NodeMetaRef::reportMetadataChange() +void NodeMetaRef::reportMetadataChange(const std::string *name) { // NOTE: This same code is in rollback_interface.cpp // Inform other things that the metadata has changed - v3s16 blockpos = getNodeBlockPos(m_p); + NodeMetadata *meta = dynamic_cast(m_meta); + MapEditEvent event; event.type = MEET_BLOCK_NODE_METADATA_CHANGED; - event.p = blockpos; + event.p = m_p; + event.is_private_change = name && meta && meta->isPrivate(*name); m_env->getMap().dispatchEvent(&event); - // Set the block to be saved - MapBlock *block = m_env->getMap().getBlockNoCreateNoEx(blockpos); - if (block) { - block->raiseModified(MOD_STATE_WRITE_NEEDED, - MOD_REASON_REPORT_META_CHANGE); - } } // Exported functions diff --git a/src/script/lua_api/l_nodemeta.h b/src/script/lua_api/l_nodemeta.h index b0b4a9623..fdc1766ed 100644 --- a/src/script/lua_api/l_nodemeta.h +++ b/src/script/lua_api/l_nodemeta.h @@ -60,7 +60,7 @@ private: virtual Metadata* getmeta(bool auto_create); virtual void clearMeta(); - virtual void reportMetadataChange(); + virtual void reportMetadataChange(const std::string *name = nullptr); virtual void handleToTable(lua_State *L, Metadata *_meta); virtual bool handleFromTable(lua_State *L, int table, Metadata *_meta); -- cgit v1.2.3