Skip to content
Permalink
Browse files

Optimize particlespawner sending by not sending to distant players

  • Loading branch information
sfan5 committed May 23, 2020
1 parent 9d6e7e4 commit 10c3002aea784b5f0075f3f3e3ec824b6ba546ba
Showing with 18 additions and 0 deletions.
  1. +18 −0 src/server.cpp
@@ -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);
}

0 comments on commit 10c3002

Please sign in to comment.
You can’t perform that action at this time.