diff options
author | Elias Fleckenstein <eliasfleckenstein@web.de> | 2021-03-01 14:48:18 +0100 |
---|---|---|
committer | Elias Fleckenstein <eliasfleckenstein@web.de> | 2021-03-01 14:48:18 +0100 |
commit | 9a308ab53024ba520acf555703aa1c6a6a83bd9b (patch) | |
tree | a7a126dbd5085b5053adb780457b35c1ad240e8a | |
parent | f3e51dca155ce1d1062a339cf925f41d7c751df8 (diff) | |
download | minetest-9a308ab53024ba520acf555703aa1c6a6a83bd9b.tar.xz |
Send only relevant ItemStack meta fields to Client
-rw-r--r-- | src/inventory.cpp | 16 | ||||
-rw-r--r-- | src/inventory.h | 8 | ||||
-rw-r--r-- | src/itemstackmetadata.cpp | 4 | ||||
-rw-r--r-- | src/itemstackmetadata.h | 2 | ||||
-rw-r--r-- | src/mapblock.cpp | 4 | ||||
-rw-r--r-- | src/mapblock.h | 2 | ||||
-rw-r--r-- | src/nodemetadata.cpp | 8 | ||||
-rw-r--r-- | src/nodemetadata.h | 4 | ||||
-rw-r--r-- | src/server.cpp | 8 |
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(); |