mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
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
This commit is contained in:
parent
ae8d14b009
commit
3d66622772
18 changed files with 202 additions and 70 deletions
|
@ -46,7 +46,7 @@ void ItemStackMetaRef::clearMeta()
|
|||
istack->metadata.clear();
|
||||
}
|
||||
|
||||
void ItemStackMetaRef::reportMetadataChange()
|
||||
void ItemStackMetaRef::reportMetadataChange(const std::string *name)
|
||||
{
|
||||
// TODO
|
||||
}
|
||||
|
|
|
@ -40,7 +40,7 @@ private:
|
|||
|
||||
virtual void clearMeta();
|
||||
|
||||
virtual void reportMetadataChange();
|
||||
virtual void reportMetadataChange(const std::string *name = nullptr);
|
||||
|
||||
void setToolCapabilities(const ToolCapabilities &caps)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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<NodeMetadata*>(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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue