mirror of
https://github.com/luanti-org/luanti.git
synced 2025-08-11 17:51:04 +00:00
Send only changed node metadata to clients instead of whole mapblock (#5268)
Includes newer style changes and fixes by est31 Improve the block position de-serialization Add type NodeMetadataMap
This commit is contained in:
parent
ae8d14b009
commit
3d66622772
18 changed files with 202 additions and 70 deletions
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
/*
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) &&
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue