aboutsummaryrefslogtreecommitdiff
path: root/src/network
diff options
context:
space:
mode:
Diffstat (limited to 'src/network')
-rw-r--r--src/network/clientopcodes.cpp2
-rw-r--r--src/network/clientpackethandler.cpp27
-rw-r--r--src/network/networkprotocol.h11
-rw-r--r--src/network/serveropcodes.cpp6
-rw-r--r--src/network/serverpackethandler.cpp4
5 files changed, 43 insertions, 7 deletions
diff --git a/src/network/clientopcodes.cpp b/src/network/clientopcodes.cpp
index 923a92d32..7f3ab50ed 100644
--- a/src/network/clientopcodes.cpp
+++ b/src/network/clientopcodes.cpp
@@ -113,7 +113,7 @@ const ToClientCommandHandler toClientCommandTable[TOCLIENT_NUM_MSG_TYPES] =
{ "TOCLIENT_UPDATE_PLAYER_LIST", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_UpdatePlayerList }, // 0x56
{ "TOCLIENT_MODCHANNEL_MSG", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_ModChannelMsg }, // 0x57
{ "TOCLIENT_MODCHANNEL_SIGNAL", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_ModChannelSignal }, // 0x58
- null_command_handler,
+ { "TOCLIENT_NODEMETA_CHANGED", TOCLIENT_STATE_CONNECTED, &Client::handleCommand_NodemetaChanged }, // 0x59
null_command_handler,
null_command_handler,
null_command_handler,
diff --git a/src/network/clientpackethandler.cpp b/src/network/clientpackethandler.cpp
index 1be7d4eeb..0dca4aff4 100644
--- a/src/network/clientpackethandler.cpp
+++ b/src/network/clientpackethandler.cpp
@@ -243,6 +243,33 @@ void Client::handleCommand_AddNode(NetworkPacket* pkt)
addNode(p, n, remove_metadata);
}
+
+void Client::handleCommand_NodemetaChanged(NetworkPacket *pkt)
+{
+ if (pkt->getSize() < 1)
+ return;
+
+ std::istringstream is(pkt->readLongString(), std::ios::binary);
+ std::stringstream sstr;
+ decompressZlib(is, sstr);
+
+ NodeMetadataList meta_updates_list(false);
+ meta_updates_list.deSerialize(sstr, m_itemdef, true);
+
+ Map &map = m_env.getMap();
+ for (NodeMetadataMap::const_iterator i = meta_updates_list.begin();
+ i != meta_updates_list.end(); ++i) {
+ v3s16 pos = i->first;
+
+ if (map.isValidPosition(pos) &&
+ map.setNodeMetadata(pos, i->second))
+ continue; // Prevent from deleting metadata
+
+ // Meta couldn't be set, unused metadata
+ delete i->second;
+ }
+}
+
void Client::handleCommand_BlockData(NetworkPacket* pkt)
{
// Ignore too small packet
diff --git a/src/network/networkprotocol.h b/src/network/networkprotocol.h
index 855afc638..12a91e647 100644
--- a/src/network/networkprotocol.h
+++ b/src/network/networkprotocol.h
@@ -190,6 +190,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
Add TOCLIENT_FORMSPEC_PREPEND
PROTOCOL VERSION 37:
Redo detached inventory sending
+ Add TOCLIENT_NODEMETA_CHANGED
*/
#define LATEST_PROTOCOL_VERSION 37
@@ -638,13 +639,19 @@ enum ToClientCommand
std::string channel name
u16 message length
std::string message
- */
+ */
+
TOCLIENT_MODCHANNEL_SIGNAL = 0x58,
/*
u8 signal id
u16 channel name length
std::string channel name
- */
+ */
+
+ TOCLIENT_NODEMETA_CHANGED = 0x59,
+ /*
+ serialized and compressed node metadata
+ */
TOCLIENT_SRP_BYTES_S_B = 0x60,
/*
diff --git a/src/network/serveropcodes.cpp b/src/network/serveropcodes.cpp
index e4e313611..013b549c6 100644
--- a/src/network/serveropcodes.cpp
+++ b/src/network/serveropcodes.cpp
@@ -200,9 +200,9 @@ const ClientCommandFactory clientCommandFactoryTable[TOCLIENT_NUM_MSG_TYPES] =
{ "TOCLIENT_CLOUD_PARAMS", 0, true }, // 0x54
{ "TOCLIENT_FADE_SOUND", 0, true }, // 0x55
{ "TOCLIENT_UPDATE_PLAYER_LIST", 0, true }, // 0x56
- { "TOCLIENT_MODCHANNEL_MSG", 0, true}, // 0x57
- { "TOCLIENT_MODCHANNEL_SIGNAL", 0, true}, // 0x58
- null_command_factory,
+ { "TOCLIENT_MODCHANNEL_MSG", 0, true }, // 0x57
+ { "TOCLIENT_MODCHANNEL_SIGNAL", 0, true }, // 0x58
+ { "TOCLIENT_NODEMETA_CHANGED", 0, true }, // 0x59
null_command_factory,
null_command_factory,
null_command_factory,
diff --git a/src/network/serverpackethandler.cpp b/src/network/serverpackethandler.cpp
index 8299ad002..329b38765 100644
--- a/src/network/serverpackethandler.cpp
+++ b/src/network/serverpackethandler.cpp
@@ -609,7 +609,9 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt)
ma->to_inv.applyCurrentPlayer(player->getName());
setInventoryModified(ma->from_inv, false);
- setInventoryModified(ma->to_inv, false);
+ if (ma->from_inv != ma->to_inv) {
+ setInventoryModified(ma->to_inv, false);
+ }
bool from_inv_is_current_player =
(ma->from_inv.type == InventoryLocation::PLAYER) &&