mirror of
https://github.com/luanti-org/luanti.git
synced 2025-07-02 16:38: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:
parent
008b80fe1c
commit
0b4f424f41
16 changed files with 193 additions and 160 deletions
|
@ -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";
|
||||
|
|
|
@ -20,6 +20,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "test.h"
|
||||
#include <algorithm>
|
||||
#include "server/mods.h"
|
||||
#include "settings.h"
|
||||
#include "test_config.h"
|
||||
|
||||
class TestServerModManager : public TestBase
|
||||
|
@ -85,6 +86,10 @@ void TestServerModManager::runTests(IGameDef *gamedef)
|
|||
|
||||
void TestServerModManager::testCreation()
|
||||
{
|
||||
std::string path = std::string(TEST_WORLDDIR) + DIR_DELIM + "world.mt";
|
||||
Settings world_config;
|
||||
world_config.set("gameid", "minimal");
|
||||
UASSERTEQ(bool, world_config.updateConfigFile(path.c_str()), true);
|
||||
ServerModManager sm(TEST_WORLDDIR);
|
||||
}
|
||||
|
||||
|
|
0
src/unittest/test_world/do_not_remove.txt
Normal file
0
src/unittest/test_world/do_not_remove.txt
Normal file
|
@ -1 +0,0 @@
|
|||
gameid = minimal
|
Loading…
Add table
Add a link
Reference in a new issue