forked from Mirrorlandia_minetest/minetest
Send cumulated inventory changes only each step (#8856)
Applies to player and detached inventories
This commit is contained in:
parent
a57f951e02
commit
fae6242d4e
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user