aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2021-03-01 14:48:18 +0100
committerElias Fleckenstein <eliasfleckenstein@web.de>2021-03-01 14:48:18 +0100
commit9a308ab53024ba520acf555703aa1c6a6a83bd9b (patch)
treea7a126dbd5085b5053adb780457b35c1ad240e8a
parentf3e51dca155ce1d1062a339cf925f41d7c751df8 (diff)
downloadminetest-9a308ab53024ba520acf555703aa1c6a6a83bd9b.tar.xz
Send only relevant ItemStack meta fields to Client
-rw-r--r--src/inventory.cpp16
-rw-r--r--src/inventory.h8
-rw-r--r--src/itemstackmetadata.cpp4
-rw-r--r--src/itemstackmetadata.h2
-rw-r--r--src/mapblock.cpp4
-rw-r--r--src/mapblock.h2
-rw-r--r--src/nodemetadata.cpp8
-rw-r--r--src/nodemetadata.h4
-rw-r--r--src/server.cpp8
9 files changed, 29 insertions, 27 deletions
diff --git a/src/inventory.cpp b/src/inventory.cpp
index 1ef9b13cd..147fbd30e 100644
--- a/src/inventory.cpp
+++ b/src/inventory.cpp
@@ -56,7 +56,7 @@ ItemStack::ItemStack(const std::string &name_, u16 count_,
count = 1;
}
-void ItemStack::serialize(std::ostream &os, bool serialize_meta) const
+void ItemStack::serialize(std::ostream &os, bool serialize_meta, bool disk) const
{
if (empty())
return;
@@ -78,7 +78,7 @@ void ItemStack::serialize(std::ostream &os, bool serialize_meta) const
if (parts >= 4) {
os << " ";
if (serialize_meta)
- metadata.serialize(os);
+ metadata.serialize(os, disk);
else
os << "<metadata size=" << metadata.size() << ">";
}
@@ -243,10 +243,10 @@ void ItemStack::deSerialize(const std::string &str, IItemDefManager *itemdef)
deSerialize(is, itemdef);
}
-std::string ItemStack::getItemString(bool include_meta) const
+std::string ItemStack::getItemString(bool include_meta, bool disk) const
{
std::ostringstream os(std::ios::binary);
- serialize(os, include_meta);
+ serialize(os, include_meta, disk);
return os.str();
}
@@ -425,7 +425,7 @@ void InventoryList::setName(const std::string &name)
setModified();
}
-void InventoryList::serialize(std::ostream &os, bool incremental) const
+void InventoryList::serialize(std::ostream &os, bool incremental, bool disk) const
{
//os.imbue(std::locale("C"));
@@ -436,7 +436,7 @@ void InventoryList::serialize(std::ostream &os, bool incremental) const
os<<"Empty";
} else {
os<<"Item ";
- item.serialize(os);
+ item.serialize(os, true, disk);
}
// TODO: Implement this:
// if (!incremental || item.checkModified())
@@ -847,13 +847,13 @@ bool Inventory::operator == (const Inventory &other) const
return true;
}
-void Inventory::serialize(std::ostream &os, bool incremental) const
+void Inventory::serialize(std::ostream &os, bool incremental, bool disk) const
{
//std::cout << "Serialize " << (int)incremental << ", n=" << m_lists.size() << std::endl;
for (const InventoryList *list : m_lists) {
if (!incremental || list->checkModified()) {
os << "List " << list->getName() << " " << list->getSize() << "\n";
- list->serialize(os, incremental);
+ list->serialize(os, incremental, disk);
} else {
os << "KeepList " << list->getName() << "\n";
}
diff --git a/src/inventory.h b/src/inventory.h
index f36bc57cf..e6a7bf880 100644
--- a/src/inventory.h
+++ b/src/inventory.h
@@ -40,13 +40,13 @@ struct ItemStack
~ItemStack() = default;
// Serialization
- void serialize(std::ostream &os, bool serialize_meta = true) const;
+ void serialize(std::ostream &os, bool serialize_meta = true, bool disk = true) const;
// Deserialization. Pass itemdef unless you don't want aliases resolved.
void deSerialize(std::istream &is, IItemDefManager *itemdef = NULL);
void deSerialize(const std::string &s, IItemDefManager *itemdef = NULL);
// Returns the string used for inventory
- std::string getItemString(bool include_meta = true) const;
+ std::string getItemString(bool include_meta = true, bool disk = true) const;
// Returns the tooltip
std::string getDescription(IItemDefManager *itemdef) const;
std::string getShortDescription(IItemDefManager *itemdef) const;
@@ -195,7 +195,7 @@ public:
void setSize(u32 newsize);
void setWidth(u32 newWidth);
void setName(const std::string &name);
- void serialize(std::ostream &os, bool incremental) const;
+ void serialize(std::ostream &os, bool incremental, bool disk = true) const;
void deSerialize(std::istream &is);
InventoryList(const InventoryList &other);
@@ -295,7 +295,7 @@ public:
}
// Never ever serialize to disk using "incremental"!
- void serialize(std::ostream &os, bool incremental = false) const;
+ void serialize(std::ostream &os, bool incremental = false, bool disk = true) const;
void deSerialize(std::istream &is);
InventoryList * addList(const std::string &name, u32 size);
diff --git a/src/itemstackmetadata.cpp b/src/itemstackmetadata.cpp
index 7a26fbb0e..336b8a41c 100644
--- a/src/itemstackmetadata.cpp
+++ b/src/itemstackmetadata.cpp
@@ -58,11 +58,13 @@ bool ItemStackMetadata::setString(const std::string &name, const std::string &va
return result;
}
-void ItemStackMetadata::serialize(std::ostream &os) const
+void ItemStackMetadata::serialize(std::ostream &os, bool disk) const
{
std::ostringstream os2;
os2 << DESERIALIZE_START;
for (const auto &stringvar : m_stringvars) {
+ if (! disk && stringvar.first != TOOLCAP_KEY && stringvar.first != "name" && stringvar.first != "description" && stringvar.first != "color")
+ continue;
if (!stringvar.first.empty() || !stringvar.second.empty())
os2 << stringvar.first << DESERIALIZE_KV_DELIM
<< stringvar.second << DESERIALIZE_PAIR_DELIM;
diff --git a/src/itemstackmetadata.h b/src/itemstackmetadata.h
index a7f134955..7d81bf6dd 100644
--- a/src/itemstackmetadata.h
+++ b/src/itemstackmetadata.h
@@ -34,7 +34,7 @@ public:
void clear() override;
bool setString(const std::string &name, const std::string &var) override;
- void serialize(std::ostream &os) const;
+ void serialize(std::ostream &os, bool disk = true) const;
void deSerialize(std::istream &is);
const ToolCapabilities &getToolCapabilities(
diff --git a/src/mapblock.cpp b/src/mapblock.cpp
index 0ca71e643..03633cf8e 100644
--- a/src/mapblock.cpp
+++ b/src/mapblock.cpp
@@ -355,7 +355,7 @@ static void correctBlockNodeIds(const NameIdMapping *nimap, MapNode *nodes,
}
}
-void MapBlock::serialize(std::ostream &os, u8 version, bool disk, int compression_level)
+void MapBlock::serialize(std::ostream &os, u8 version, bool disk, int compression_level, bool disk_inv)
{
if(!ser_ver_supported(version))
throw VersionMismatchException("ERROR: MapBlock format not supported");
@@ -411,7 +411,7 @@ void MapBlock::serialize(std::ostream &os, u8 version, bool disk, int compressio
Node metadata
*/
std::ostringstream oss(std::ios_base::binary);
- m_node_metadata.serialize(oss, version, disk);
+ m_node_metadata.serialize(oss, version, disk, false, disk_inv);
compressZlib(oss.str(), os, compression_level);
/*
diff --git a/src/mapblock.h b/src/mapblock.h
index 7b82301e9..1548afc30 100644
--- a/src/mapblock.h
+++ b/src/mapblock.h
@@ -473,7 +473,7 @@ public:
// These don't write or read version by itself
// Set disk to true for on-disk format, false for over-the-network format
// Precondition: version >= SER_FMT_VER_LOWEST_WRITE
- void serialize(std::ostream &os, u8 version, bool disk, int compression_level);
+ void serialize(std::ostream &os, u8 version, bool disk, int compression_level, bool disk_inv = true);
// If disk == true: In addition to doing other things, will add
// unknown blocks from id-name mapping to wndef
void deSerialize(std::istream &is, u8 version, bool disk);
diff --git a/src/nodemetadata.cpp b/src/nodemetadata.cpp
index 6447c8785..b4ece067f 100644
--- a/src/nodemetadata.cpp
+++ b/src/nodemetadata.cpp
@@ -40,7 +40,7 @@ NodeMetadata::~NodeMetadata()
delete m_inventory;
}
-void NodeMetadata::serialize(std::ostream &os, u8 version, bool disk) const
+void NodeMetadata::serialize(std::ostream &os, u8 version, bool disk, bool disk_inv) const
{
int num_vars = disk ? m_stringvars.size() : countNonPrivate();
writeU32(os, num_vars);
@@ -55,7 +55,7 @@ void NodeMetadata::serialize(std::ostream &os, u8 version, bool disk) const
writeU8(os, (priv) ? 1 : 0);
}
- m_inventory->serialize(os);
+ m_inventory->serialize(os, false, disk || disk_inv);
}
void NodeMetadata::deSerialize(std::istream &is, u8 version)
@@ -113,7 +113,7 @@ int NodeMetadata::countNonPrivate() const
*/
void NodeMetadataList::serialize(std::ostream &os, u8 blockver, bool disk,
- bool absolute_pos) const
+ bool absolute_pos, bool disk_inv) const
{
/*
Version 0 is a placeholder for "nothing to see here; go away."
@@ -146,7 +146,7 @@ void NodeMetadataList::serialize(std::ostream &os, u8 blockver, bool disk,
u16 p16 = (p.Z * MAP_BLOCKSIZE + p.Y) * MAP_BLOCKSIZE + p.X;
writeU16(os, p16);
}
- data->serialize(os, version, disk);
+ data->serialize(os, version, disk, disk_inv);
}
}
diff --git a/src/nodemetadata.h b/src/nodemetadata.h
index c028caf88..63b722c67 100644
--- a/src/nodemetadata.h
+++ b/src/nodemetadata.h
@@ -40,7 +40,7 @@ public:
NodeMetadata(IItemDefManager *item_def_mgr);
~NodeMetadata();
- void serialize(std::ostream &os, u8 version, bool disk=true) const;
+ void serialize(std::ostream &os, u8 version, bool disk = true, bool disk_inv = true) const;
void deSerialize(std::istream &is, u8 version);
void clear();
@@ -82,7 +82,7 @@ public:
~NodeMetadataList();
void serialize(std::ostream &os, u8 blockver, bool disk = true,
- bool absolute_pos = false) const;
+ bool absolute_pos = false, bool disk_inv = true) const;
void deSerialize(std::istream &is, IItemDefManager *item_def_mgr,
bool absolute_pos = false);
diff --git a/src/server.cpp b/src/server.cpp
index 81cdd1f8d..8f0bfb4e9 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1471,7 +1471,7 @@ void Server::SendInventory(PlayerSAO *sao, bool incremental)
NetworkPacket pkt(TOCLIENT_INVENTORY, 0, sao->getPeerID());
std::ostringstream os(std::ios::binary);
- sao->getInventory()->serialize(os, incremental);
+ sao->getInventory()->serialize(os, incremental, false);
sao->getInventory()->setModified(false);
player->setModified(true);
@@ -2313,7 +2313,7 @@ void Server::sendMetadataChanged(const std::list<v3s16> &meta_updates, float far
// Send the meta changes
std::ostringstream os(std::ios::binary);
- meta_updates_list.serialize(os, client->net_proto_version, false, true);
+ meta_updates_list.serialize(os, client->net_proto_version, false, true, false);
std::ostringstream oss(std::ios::binary);
compressZlib(os.str(), oss);
@@ -2335,7 +2335,7 @@ void Server::SendBlockNoLock(session_t peer_id, MapBlock *block, u8 ver,
*/
thread_local const int net_compression_level = rangelim(g_settings->getS16("map_compression_level_net"), -1, 9);
std::ostringstream os(std::ios_base::binary);
- block->serialize(os, ver, false, net_compression_level);
+ block->serialize(os, ver, false, net_compression_level, false);
block->serializeNetworkSpecific(os);
std::string s = os.str();
@@ -2692,7 +2692,7 @@ void Server::sendDetachedInventory(Inventory *inventory, const std::string &name
// Serialization & NetworkPacket isn't a love story
std::ostringstream os(std::ios_base::binary);
- inventory->serialize(os);
+ inventory->serialize(os, false, false);
inventory->setModified(false);
const std::string &os_str = os.str();