From 0b4f424f414380b7a46270e1389e8aa0524d8fba Mon Sep 17 00:00:00 2001 From: SmallJoker Date: Sat, 24 Aug 2019 19:07:38 +0200 Subject: 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. --- src/unittest/test_inventory.cpp | 89 +++++++++++++++++------------------------ 1 file changed, 36 insertions(+), 53 deletions(-) (limited to 'src/unittest/test_inventory.cpp') diff --git a/src/unittest/test_inventory.cpp b/src/unittest/test_inventory.cpp index 1a783afae..5f71636c4 100644 --- a/src/unittest/test_inventory.cpp +++ b/src/unittest/test_inventory.cpp @@ -33,8 +33,9 @@ public: void testSerializeDeserialize(IItemDefManager *idef); - static const char *serialized_inventory; - static const char *serialized_inventory_2; + static const char *serialized_inventory_in; + static const char *serialized_inventory_out; + static const char *serialized_inventory_inc; }; static TestInventory g_test_instance; @@ -49,7 +50,7 @@ void TestInventory::runTests(IGameDef *gamedef) void TestInventory::testSerializeDeserialize(IItemDefManager *idef) { Inventory inv(idef); - std::istringstream is(serialized_inventory, std::ios::binary); + std::istringstream is(serialized_inventory_in, std::ios::binary); inv.deSerialize(is); UASSERT(inv.getList("0")); @@ -62,82 +63,64 @@ void TestInventory::testSerializeDeserialize(IItemDefManager *idef) inv.getList("main")->setWidth(5); std::ostringstream inv_os(std::ios::binary); - inv.serialize(inv_os); - UASSERTEQ(std::string, inv_os.str(), serialized_inventory_2); + inv.serialize(inv_os, false); + UASSERTEQ(std::string, inv_os.str(), serialized_inventory_out); + + inv.setModified(false); + inv_os.str(""); + inv_os.clear(); + inv.serialize(inv_os, true); + UASSERTEQ(std::string, inv_os.str(), serialized_inventory_inc); + + ItemStack leftover = inv.getList("main")->takeItem(7, 99 - 12); + ItemStack wanted = ItemStack("default:dirt", 99 - 12, 0, idef); + UASSERT(leftover == wanted); + leftover = inv.getList("main")->getItem(7); + wanted.count = 12; + UASSERT(leftover == wanted); } -const char *TestInventory::serialized_inventory = - "List 0 32\n" +const char *TestInventory::serialized_inventory_in = + "List 0 10\n" "Width 3\n" "Empty\n" "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" "Item default:cobble 61\n" "Empty\n" "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" "Item default:dirt 71\n" "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" "Item default:dirt 99\n" "Item default:cobble 38\n" "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" + "EndInventoryList\n" + "List abc 1\n" + "Item default:stick 3\n" + "Width 0\n" "EndInventoryList\n" "EndInventory\n"; -const char *TestInventory::serialized_inventory_2 = - "List main 32\n" +const char *TestInventory::serialized_inventory_out = + "List main 10\n" "Width 5\n" "Empty\n" "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" "Item default:cobble 61\n" "Empty\n" "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" "Item default:dirt 71\n" "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" "Item default:dirt 99\n" "Item default:cobble 38\n" "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" - "Empty\n" "EndInventoryList\n" + "List abc 1\n" + "Width 0\n" + "Item default:stick 3\n" + "EndInventoryList\n" + "EndInventory\n"; + +const char *TestInventory::serialized_inventory_inc = + "KeepList main\n" + "KeepList abc\n" "EndInventory\n"; -- cgit v1.2.3