mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/LCE-Revelations.git
synced 2026-06-01 03:58:10 +00:00
perf: skip split-screen system-mate checks on dedicated server
The EntityTracker and TrackedEntity classes have O(players^2 * entities) loops that check IsSameSystem() for split-screen couch co-op visibility expansion. On the dedicated server, all players are remote so IsSameSystem() always returns false, making these loops pure overhead. Skip them entirely when g_Win64DedicatedServer is true. The original split-screen logic is preserved for game client LAN hosting.
This commit is contained in:
@@ -21,6 +21,10 @@
|
||||
#include "..\Minecraft.World\net.minecraft.world.level.chunk.h"
|
||||
#include "PlayerConnection.h"
|
||||
|
||||
#ifdef _WINDOWS64
|
||||
extern bool g_Win64DedicatedServer;
|
||||
#endif
|
||||
|
||||
EntityTracker::EntityTracker(ServerLevel *level)
|
||||
{
|
||||
this->level = level;
|
||||
@@ -139,32 +143,40 @@ void EntityTracker::tick()
|
||||
// 4J Stu - If one player on a system is updated, then make sure they all are as they all have their
|
||||
// range extended to include entities visible by any other player on the system
|
||||
// Fix for #11194 - Gameplay: Host player and their split-screen avatars can become invisible and invulnerable to client.
|
||||
MinecraftServer *server = MinecraftServer::getInstance();
|
||||
for( unsigned int i = 0; i < server->getPlayers()->players.size(); i++ )
|
||||
// NOTE: On dedicated servers, IsSameSystem() always returns false for remote
|
||||
// players (no split-screen), so this loop does nothing. Skip it entirely to
|
||||
// avoid the O(players * movedPlayers) overhead.
|
||||
#ifdef _WINDOWS64
|
||||
if (!g_Win64DedicatedServer)
|
||||
#endif
|
||||
{
|
||||
shared_ptr<ServerPlayer> ep = server->getPlayers()->players[i];
|
||||
if( ep->dimension != level->dimension->id ) continue;
|
||||
|
||||
if( ep->connection == nullptr ) continue;
|
||||
INetworkPlayer *thisPlayer = ep->connection->getNetworkPlayer();
|
||||
if( thisPlayer == nullptr ) continue;
|
||||
|
||||
bool addPlayer = false;
|
||||
for (unsigned int j = 0; j < movedPlayers.size(); j++)
|
||||
MinecraftServer *server = MinecraftServer::getInstance();
|
||||
for( unsigned int i = 0; i < server->getPlayers()->players.size(); i++ )
|
||||
{
|
||||
shared_ptr<ServerPlayer> sp = movedPlayers[j];
|
||||
shared_ptr<ServerPlayer> ep = server->getPlayers()->players[i];
|
||||
if( ep->dimension != level->dimension->id ) continue;
|
||||
|
||||
if( sp == ep ) break;
|
||||
if( ep->connection == nullptr ) continue;
|
||||
INetworkPlayer *thisPlayer = ep->connection->getNetworkPlayer();
|
||||
if( thisPlayer == nullptr ) continue;
|
||||
|
||||
if(sp->connection == nullptr) continue;
|
||||
INetworkPlayer *otherPlayer = sp->connection->getNetworkPlayer();
|
||||
if( otherPlayer != nullptr && thisPlayer->IsSameSystem(otherPlayer) )
|
||||
bool addPlayer = false;
|
||||
for (unsigned int j = 0; j < movedPlayers.size(); j++)
|
||||
{
|
||||
addPlayer = true;
|
||||
break;
|
||||
shared_ptr<ServerPlayer> sp = movedPlayers[j];
|
||||
|
||||
if( sp == ep ) break;
|
||||
|
||||
if(sp->connection == nullptr) continue;
|
||||
INetworkPlayer *otherPlayer = sp->connection->getNetworkPlayer();
|
||||
if( otherPlayer != nullptr && thisPlayer->IsSameSystem(otherPlayer) )
|
||||
{
|
||||
addPlayer = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if( addPlayer ) movedPlayers.push_back( ep );
|
||||
if( addPlayer ) movedPlayers.push_back( ep );
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < movedPlayers.size(); i++)
|
||||
|
||||
Reference in New Issue
Block a user