forked from Mirrorlandia_minetest/minetest
Optimize particlespawner sending by not sending to distant players
This commit is contained in:
parent
9d6e7e48d6
commit
10c3002aea
@ -1549,12 +1549,30 @@ void Server::SendSpawnParticle(session_t peer_id, u16 protocol_version,
|
|||||||
void Server::SendAddParticleSpawner(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)
|
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) {
|
if (peer_id == PEER_ID_INEXISTENT) {
|
||||||
std::vector<session_t> clients = m_clients.getClientIDs();
|
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) {
|
for (const session_t client_id : clients) {
|
||||||
RemotePlayer *player = m_env->getPlayer(client_id);
|
RemotePlayer *player = m_env->getPlayer(client_id);
|
||||||
if (!player)
|
if (!player)
|
||||||
continue;
|
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,
|
SendAddParticleSpawner(client_id, player->protocol_version,
|
||||||
p, attached_id, id);
|
p, attached_id, id);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user