Server: Only send node removal/addition to client if client's player is near it. Otherwise set the modified blocks unsent.
parent
b5ace9a064
commit
3269fce795
|
@ -2100,9 +2100,12 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Send the removal to all other clients
|
Send the removal to all other clients.
|
||||||
|
- If other player is close, send REMOVENODE
|
||||||
|
- Otherwise set blocks not sent
|
||||||
*/
|
*/
|
||||||
sendRemoveNode(p_under, peer_id);
|
core::list<u16> far_players;
|
||||||
|
sendRemoveNode(p_under, peer_id, &far_players, 100);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Update and send inventory
|
Update and send inventory
|
||||||
|
@ -2179,6 +2182,20 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
||||||
m_ignore_map_edit_events = true;
|
m_ignore_map_edit_events = true;
|
||||||
m_env.getMap().removeNodeAndUpdate(p_under, modified_blocks);
|
m_env.getMap().removeNodeAndUpdate(p_under, modified_blocks);
|
||||||
m_ignore_map_edit_events = false;
|
m_ignore_map_edit_events = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Set blocks not sent to far players
|
||||||
|
*/
|
||||||
|
for(core::list<u16>::Iterator
|
||||||
|
i = far_players.begin();
|
||||||
|
i != far_players.end(); i++)
|
||||||
|
{
|
||||||
|
u16 peer_id = *i;
|
||||||
|
RemoteClient *client = getClient(peer_id);
|
||||||
|
if(client==NULL)
|
||||||
|
continue;
|
||||||
|
client->SetBlocksNotSent(modified_blocks);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -2243,7 +2260,8 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
||||||
/*
|
/*
|
||||||
Send to all players
|
Send to all players
|
||||||
*/
|
*/
|
||||||
sendAddNode(p_over, n, 0);
|
core::list<u16> far_players;
|
||||||
|
sendAddNode(p_over, n, 0, &far_players, 100);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Handle inventory
|
Handle inventory
|
||||||
|
@ -2270,6 +2288,20 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
|
||||||
m_env.getMap().addNodeAndUpdate(p_over, n, modified_blocks);
|
m_env.getMap().addNodeAndUpdate(p_over, n, modified_blocks);
|
||||||
m_ignore_map_edit_events = false;
|
m_ignore_map_edit_events = false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
Set blocks not sent to far players
|
||||||
|
*/
|
||||||
|
for(core::list<u16>::Iterator
|
||||||
|
i = far_players.begin();
|
||||||
|
i != far_players.end(); i++)
|
||||||
|
{
|
||||||
|
u16 peer_id = *i;
|
||||||
|
RemoteClient *client = getClient(peer_id);
|
||||||
|
if(client==NULL)
|
||||||
|
continue;
|
||||||
|
client->SetBlocksNotSent(modified_blocks);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Calculate special events
|
Calculate special events
|
||||||
*/
|
*/
|
||||||
|
@ -3306,8 +3338,12 @@ void Server::BroadcastChatMessage(const std::wstring &message)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::sendRemoveNode(v3s16 p, u16 ignore_id)
|
void Server::sendRemoveNode(v3s16 p, u16 ignore_id,
|
||||||
|
core::list<u16> *far_players, float far_d_nodes)
|
||||||
{
|
{
|
||||||
|
float maxd = far_d_nodes*BS;
|
||||||
|
v3f p_f = intToFloat(p, BS);
|
||||||
|
|
||||||
// Create packet
|
// Create packet
|
||||||
u32 replysize = 8;
|
u32 replysize = 8;
|
||||||
SharedBuffer<u8> reply(replysize);
|
SharedBuffer<u8> reply(replysize);
|
||||||
|
@ -3329,14 +3365,34 @@ void Server::sendRemoveNode(v3s16 p, u16 ignore_id)
|
||||||
// Don't send if it's the same one
|
// Don't send if it's the same one
|
||||||
if(client->peer_id == ignore_id)
|
if(client->peer_id == ignore_id)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if(far_players)
|
||||||
|
{
|
||||||
|
// Get player
|
||||||
|
Player *player = m_env.getPlayer(client->peer_id);
|
||||||
|
if(player)
|
||||||
|
{
|
||||||
|
// If player is far away, only set modified blocks not sent
|
||||||
|
v3f player_pos = player->getPosition();
|
||||||
|
if(player_pos.getDistanceFrom(p_f) > maxd)
|
||||||
|
{
|
||||||
|
far_players->push_back(client->peer_id);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Send as reliable
|
// Send as reliable
|
||||||
m_con.Send(client->peer_id, 0, reply, true);
|
m_con.Send(client->peer_id, 0, reply, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Server::sendAddNode(v3s16 p, MapNode n, u16 ignore_id)
|
void Server::sendAddNode(v3s16 p, MapNode n, u16 ignore_id,
|
||||||
|
core::list<u16> *far_players, float far_d_nodes)
|
||||||
{
|
{
|
||||||
|
float maxd = far_d_nodes*BS;
|
||||||
|
v3f p_f = intToFloat(p, BS);
|
||||||
|
|
||||||
for(core::map<u16, RemoteClient*>::Iterator
|
for(core::map<u16, RemoteClient*>::Iterator
|
||||||
i = m_clients.getIterator();
|
i = m_clients.getIterator();
|
||||||
i.atEnd() == false; i++)
|
i.atEnd() == false; i++)
|
||||||
|
@ -3351,6 +3407,22 @@ void Server::sendAddNode(v3s16 p, MapNode n, u16 ignore_id)
|
||||||
if(client->peer_id == ignore_id)
|
if(client->peer_id == ignore_id)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if(far_players)
|
||||||
|
{
|
||||||
|
// Get player
|
||||||
|
Player *player = m_env.getPlayer(client->peer_id);
|
||||||
|
if(player)
|
||||||
|
{
|
||||||
|
// If player is far away, only set modified blocks not sent
|
||||||
|
v3f player_pos = player->getPosition();
|
||||||
|
if(player_pos.getDistanceFrom(p_f) > maxd)
|
||||||
|
{
|
||||||
|
far_players->push_back(client->peer_id);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Create packet
|
// Create packet
|
||||||
u32 replysize = 8 + MapNode::serializedLength(client->serialization_version);
|
u32 replysize = 8 + MapNode::serializedLength(client->serialization_version);
|
||||||
SharedBuffer<u8> reply(replysize);
|
SharedBuffer<u8> reply(replysize);
|
||||||
|
|
11
src/server.h
11
src/server.h
|
@ -403,8 +403,15 @@ private:
|
||||||
void SendInventory(u16 peer_id);
|
void SendInventory(u16 peer_id);
|
||||||
void SendChatMessage(u16 peer_id, const std::wstring &message);
|
void SendChatMessage(u16 peer_id, const std::wstring &message);
|
||||||
void BroadcastChatMessage(const std::wstring &message);
|
void BroadcastChatMessage(const std::wstring &message);
|
||||||
void sendRemoveNode(v3s16 p, u16 ignore_id=0);
|
/*
|
||||||
void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0);
|
Send a node removal/addition event to all clients except ignore_id.
|
||||||
|
Additionally, if far_players!=NULL, players further away than
|
||||||
|
far_d_nodes are ignored and their peer_ids are added to far_players
|
||||||
|
*/
|
||||||
|
void sendRemoveNode(v3s16 p, u16 ignore_id=0,
|
||||||
|
core::list<u16> *far_players=NULL, float far_d_nodes=100);
|
||||||
|
void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0,
|
||||||
|
core::list<u16> *far_players=NULL, float far_d_nodes=100);
|
||||||
|
|
||||||
// Environment and Connection must be locked when called
|
// Environment and Connection must be locked when called
|
||||||
void SendBlockNoLock(u16 peer_id, MapBlock *block, u8 ver);
|
void SendBlockNoLock(u16 peer_id, MapBlock *block, u8 ver);
|
||||||
|
|
Loading…
Reference in New Issue