Send cumulated inventory changes only each step (#8856)

Applies to player and detached inventories
This commit is contained in:
SmallJoker 2019-08-25 10:55:27 +02:00
parent a57f951e02
commit fae6242d4e
5 changed files with 35 additions and 27 deletions

@ -524,9 +524,9 @@ void IMoveAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
} }
} }
mgr->setInventoryModified(from_inv, false); mgr->setInventoryModified(from_inv);
if (inv_from != inv_to) if (inv_from != inv_to)
mgr->setInventoryModified(to_inv, false); mgr->setInventoryModified(to_inv);
} }
void IMoveAction::clientApply(InventoryManager *mgr, IGameDef *gamedef) void IMoveAction::clientApply(InventoryManager *mgr, IGameDef *gamedef)
@ -671,7 +671,7 @@ void IDropAction::apply(InventoryManager *mgr, ServerActiveObject *player, IGame
if (item2.count != actually_dropped_count) if (item2.count != actually_dropped_count)
errorstream<<"Could not take dropped count of items"<<std::endl; errorstream<<"Could not take dropped count of items"<<std::endl;
mgr->setInventoryModified(from_inv, false); mgr->setInventoryModified(from_inv);
} }
} }

@ -313,7 +313,7 @@ void Server::handleCommand_Init2(NetworkPacket* pkt)
sendMediaAnnouncement(pkt->getPeerId(), lang); sendMediaAnnouncement(pkt->getPeerId(), lang);
// Send detached inventories // Send detached inventories
sendDetachedInventories(pkt->getPeerId()); sendDetachedInventories(pkt->getPeerId(), false);
// Send time of day // Send time of day
u16 time = m_env->getTimeOfDay(); u16 time = m_env->getTimeOfDay();
@ -608,10 +608,9 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt)
ma->from_inv.applyCurrentPlayer(player->getName()); ma->from_inv.applyCurrentPlayer(player->getName());
ma->to_inv.applyCurrentPlayer(player->getName()); ma->to_inv.applyCurrentPlayer(player->getName());
setInventoryModified(ma->from_inv, false); setInventoryModified(ma->from_inv);
if (ma->from_inv != ma->to_inv) { if (ma->from_inv != ma->to_inv)
setInventoryModified(ma->to_inv, false); setInventoryModified(ma->to_inv);
}
bool from_inv_is_current_player = bool from_inv_is_current_player =
(ma->from_inv.type == InventoryLocation::PLAYER) && (ma->from_inv.type == InventoryLocation::PLAYER) &&
@ -676,7 +675,7 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt)
da->from_inv.applyCurrentPlayer(player->getName()); da->from_inv.applyCurrentPlayer(player->getName());
setInventoryModified(da->from_inv, false); setInventoryModified(da->from_inv);
/* /*
Disable dropping items out of craftpreview Disable dropping items out of craftpreview
@ -712,7 +711,7 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt)
ca->craft_inv.applyCurrentPlayer(player->getName()); ca->craft_inv.applyCurrentPlayer(player->getName());
setInventoryModified(ca->craft_inv, false); setInventoryModified(ca->craft_inv);
//bool craft_inv_is_current_player = //bool craft_inv_is_current_player =
// (ca->craft_inv.type == InventoryLocation::PLAYER) && // (ca->craft_inv.type == InventoryLocation::PLAYER) &&
@ -731,8 +730,6 @@ void Server::handleCommand_InventoryAction(NetworkPacket* pkt)
a->apply(this, playersao, this); a->apply(this, playersao, this);
// Eat the action // Eat the action
delete a; delete a;
SendInventory(playersao, true);
} }
void Server::handleCommand_ChatMessage(NetworkPacket* pkt) void Server::handleCommand_ChatMessage(NetworkPacket* pkt)

@ -1234,7 +1234,7 @@ Inventory* Server::getInventory(const InventoryLocation &loc)
return NULL; return NULL;
} }
void Server::setInventoryModified(const InventoryLocation &loc, bool playerSend) void Server::setInventoryModified(const InventoryLocation &loc)
{ {
switch(loc.type){ switch(loc.type){
case InventoryLocation::UNDEFINED: case InventoryLocation::UNDEFINED:
@ -1248,15 +1248,7 @@ void Server::setInventoryModified(const InventoryLocation &loc, bool playerSend)
return; return;
player->setModified(true); player->setModified(true);
// Updates are sent in ServerEnvironment::step()
if (!playerSend)
return;
PlayerSAO *playersao = player->getPlayerSAO();
if(!playersao)
return;
SendInventory(playersao, true);
} }
break; break;
case InventoryLocation::NODEMETA: case InventoryLocation::NODEMETA:
@ -1269,7 +1261,7 @@ void Server::setInventoryModified(const InventoryLocation &loc, bool playerSend)
break; break;
case InventoryLocation::DETACHED: case InventoryLocation::DETACHED:
{ {
sendDetachedInventory(loc.name,PEER_ID_INEXISTENT); // Updates are sent in ServerEnvironment::step()
} }
break; break;
default: default:
@ -2617,11 +2609,16 @@ void Server::sendDetachedInventory(const std::string &name, session_t peer_id)
Send(&pkt); Send(&pkt);
} }
void Server::sendDetachedInventories(session_t peer_id) void Server::sendDetachedInventories(session_t peer_id, bool incremental)
{ {
for (const auto &detached_inventory : m_detached_inventories) { for (const auto &detached_inventory : m_detached_inventories) {
const std::string &name = detached_inventory.first; const std::string &name = detached_inventory.first;
//Inventory *inv = i->second; if (incremental) {
Inventory *inv = detached_inventory.second;
if (!inv || !inv->checkModified())
continue;
}
sendDetachedInventory(name, peer_id); sendDetachedInventory(name, peer_id);
} }
} }

@ -195,7 +195,7 @@ public:
Shall be called with the environment and the connection locked. Shall be called with the environment and the connection locked.
*/ */
Inventory* getInventory(const InventoryLocation &loc); Inventory* getInventory(const InventoryLocation &loc);
void setInventoryModified(const InventoryLocation &loc, bool playerSend = true); void setInventoryModified(const InventoryLocation &loc);
// Connection must be locked when called // Connection must be locked when called
std::wstring getStatusString(); std::wstring getStatusString();
@ -337,6 +337,8 @@ public:
void SendMovePlayer(session_t peer_id); void SendMovePlayer(session_t peer_id);
void SendPlayerSpeed(session_t peer_id, const v3f &added_vel); void SendPlayerSpeed(session_t peer_id, const v3f &added_vel);
void sendDetachedInventories(session_t peer_id, bool incremental);
virtual bool registerModStorage(ModMetadata *storage); virtual bool registerModStorage(ModMetadata *storage);
virtual void unregisterModStorage(const std::string &name); virtual void unregisterModStorage(const std::string &name);
@ -443,7 +445,6 @@ private:
const std::vector<std::string> &tosend); const std::vector<std::string> &tosend);
void sendDetachedInventory(const std::string &name, session_t peer_id); void sendDetachedInventory(const std::string &name, session_t peer_id);
void sendDetachedInventories(session_t peer_id);
// Adds a ParticleSpawner on peer with peer_id (PEER_ID_INEXISTENT == all) // Adds a ParticleSpawner on peer with peer_id (PEER_ID_INEXISTENT == all)
void SendAddParticleSpawner(session_t peer_id, u16 protocol_version, void SendAddParticleSpawner(session_t peer_id, u16 protocol_version,

@ -1454,6 +1454,19 @@ void ServerEnvironment::step(float dtime)
++i; ++i;
} }
} }
// Send outdated player inventories
for (RemotePlayer *player : m_players) {
if (player->getPeerId() == PEER_ID_INEXISTENT)
continue;
PlayerSAO *sao = player->getPlayerSAO();
if (sao && player->inventory.checkModified())
m_server->SendInventory(sao, true);
}
// Send outdated detached inventories
m_server->sendDetachedInventories(PEER_ID_INEXISTENT, true);
} }
u32 ServerEnvironment::addParticleSpawner(float exptime) u32 ServerEnvironment::addParticleSpawner(float exptime)