1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-07-27 17:28:41 +00:00

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.
This commit is contained in:
SmallJoker 2019-08-24 19:07:38 +02:00 committed by GitHub
parent 008b80fe1c
commit 0b4f424f41
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
16 changed files with 193 additions and 160 deletions

View file

@ -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;
};