1
0
Fork 0
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:
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

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

View file

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

View file

@ -1 +0,0 @@
gameid = minimal