diff options
author | SmallJoker <SmallJoker@users.noreply.github.com> | 2019-08-24 19:07:38 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-24 19:07:38 +0200 |
commit | 0b4f424f414380b7a46270e1389e8aa0524d8fba (patch) | |
tree | 5731cbe72bb3178d697b3cda43b838f26ba34f7d /src/inventory.h | |
parent | 008b80fe1ca9d46610b8971e2ac92fb56da8e69f (diff) | |
download | minetest-0b4f424f414380b7a46270e1389e8aa0524d8fba.tar.gz minetest-0b4f424f414380b7a46270e1389e8aa0524d8fba.tar.bz2 minetest-0b4f424f414380b7a46270e1389e8aa0524d8fba.zip |
Inventory: Send dirty lists where appropriate (#8742)
This change reduces the amount of sent data towards clients. Inventory lists that are already known to the player are skipped, saving quite some data over time.
Raises protocol version to 38 to ensure correct backwards-compatible code.
Diffstat (limited to 'src/inventory.h')
-rw-r--r-- | src/inventory.h | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/src/inventory.h b/src/inventory.h index 3f299993a..b7a93553d 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -194,7 +194,7 @@ public: void setSize(u32 newsize); void setWidth(u32 newWidth); void setName(const std::string &name); - void serialize(std::ostream &os) const; + void serialize(std::ostream &os, bool incremental) const; void deSerialize(std::istream &is); InventoryList(const InventoryList &other); @@ -265,12 +265,16 @@ public: // also with optional rollback recording void moveItemSomewhere(u32 i, InventoryList *dest, u32 count); + inline bool checkModified() const { return m_dirty; } + inline void setModified(bool dirty = true) { m_dirty = dirty; } + private: std::vector<ItemStack> m_items; std::string m_name; u32 m_size; u32 m_width = 0; IItemDefManager *m_itemdef; + bool m_dirty = true; }; class Inventory @@ -279,7 +283,6 @@ public: ~Inventory(); void clear(); - void clearContents(); Inventory(IItemDefManager *itemdef); Inventory(const Inventory &other); @@ -290,7 +293,8 @@ public: return !(*this == other); } - void serialize(std::ostream &os) const; + // Never ever serialize to disk using "incremental"! + void serialize(std::ostream &os, bool incremental = false) const; void deSerialize(std::istream &is); InventoryList * addList(const std::string &name, u32 size); @@ -301,28 +305,35 @@ public: // A shorthand for adding items. Returns leftover item (possibly empty). ItemStack addItem(const std::string &listname, const ItemStack &newitem) { - m_dirty = true; InventoryList *list = getList(listname); if(list == NULL) return newitem; return list->addItem(newitem); } - bool checkModified() const + inline bool checkModified() const { - return m_dirty; + if (m_dirty) + return true; + + for (const auto &list : m_lists) + if (list->checkModified()) + return true; + + return false; } - void setModified(const bool x) + inline void setModified(bool dirty) { - m_dirty = x; + m_dirty = dirty; + for (const auto &list : m_lists) + list->setModified(dirty); } - private: // -1 if not found const s32 getListIndex(const std::string &name) const; std::vector<InventoryList*> m_lists; IItemDefManager *m_itemdef; - bool m_dirty = false; + bool m_dirty = true; }; |