Skip to content

Commit

Permalink
Optimize particlespawner sending by not sending to distant players
Browse files Browse the repository at this point in the history
  • Loading branch information
sfan5 committed May 23, 2020
1 parent 9d6e7e4 commit 10c3002
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions src/server.cpp
Expand Up @@ -1549,12 +1549,30 @@ void Server::SendSpawnParticle(session_t peer_id, u16 protocol_version,
void Server::SendAddParticleSpawner(session_t peer_id, u16 protocol_version,
const ParticleSpawnerParameters &p, u16 attached_id, u32 id)
{
static thread_local const float radius =
g_settings->getS16("max_block_send_distance") * MAP_BLOCKSIZE * BS;

if (peer_id == PEER_ID_INEXISTENT) {
std::vector<session_t> clients = m_clients.getClientIDs();
const v3f pos = (p.minpos + p.maxpos) / 2.0f * BS;
const float radius_sq = radius * radius;
/* Don't send short-lived spawners to distant players.
* This could be replaced with proper tracking at some point. */
const bool distance_check = !attached_id && p.time <= 1.0f;

for (const session_t client_id : clients) {
RemotePlayer *player = m_env->getPlayer(client_id);
if (!player)
continue;

if (distance_check) {
PlayerSAO *sao = player->getPlayerSAO();
if (!sao)
continue;
if (sao->getBasePosition().getDistanceFromSQ(pos) > radius_sq)
continue;
}

SendAddParticleSpawner(client_id, player->protocol_version,
p, attached_id, id);
}
Expand Down

0 comments on commit 10c3002

Please sign in to comment.