Optimize online count and broadcast methods
This commit is contained in:
parent
80c22027de
commit
775ffdc998
@ -254,4 +254,20 @@ public abstract class ProxyServer
|
||||
* @return the server's {@link AsyncHttpClient} instance
|
||||
*/
|
||||
public abstract AsyncHttpClient getHttpClient();
|
||||
|
||||
/**
|
||||
* Get the current number of connected users. The default implementation is
|
||||
* more efficient than {@link #getPlayers()} as it does not take a lock or
|
||||
* make a copy.
|
||||
*
|
||||
* @return the current number of connected players
|
||||
*/
|
||||
public abstract int getOnlineCount();
|
||||
|
||||
/**
|
||||
* Send the specified message to the console and all connected players.
|
||||
*
|
||||
* @param message the message to broadcast
|
||||
*/
|
||||
public abstract void broadcast(String message);
|
||||
}
|
||||
|
@ -54,6 +54,7 @@ import net.md_5.bungee.command.*;
|
||||
import net.md_5.bungee.config.YamlConfig;
|
||||
import net.md_5.bungee.netty.PipelineUtils;
|
||||
import net.md_5.bungee.packet.DefinedPacket;
|
||||
import net.md_5.bungee.packet.Packet3Chat;
|
||||
import net.md_5.bungee.packet.PacketFAPluginMessage;
|
||||
import net.md_5.bungee.scheduler.BungeeThreadPool;
|
||||
import net.md_5.bungee.util.CaseInsensitiveMap;
|
||||
@ -365,10 +366,23 @@ public class BungeeCord extends ProxyServer
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked") // TODO: Abstract more
|
||||
@SuppressWarnings("unchecked")
|
||||
public Collection<ProxiedPlayer> getPlayers()
|
||||
{
|
||||
return (Collection) connections.values();
|
||||
connectionLock.readLock().lock();
|
||||
try
|
||||
{
|
||||
return (Collection) new HashSet<>( connections.values() );
|
||||
} finally
|
||||
{
|
||||
connectionLock.readLock().unlock();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOnlineCount()
|
||||
{
|
||||
return connections.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -453,6 +467,13 @@ public class BungeeCord extends ProxyServer
|
||||
return ConsoleCommandSender.getInstance();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void broadcast(String message)
|
||||
{
|
||||
getConsole().sendMessage( message );
|
||||
broadcast( new Packet3Chat( message ) );
|
||||
}
|
||||
|
||||
public void addConnection(UserConnection con)
|
||||
{
|
||||
connectionLock.writeLock().lock();
|
||||
|
@ -76,7 +76,7 @@ public class Metrics extends Thread
|
||||
data.append( encode( "guid" ) ).append( '=' ).append( encode( BungeeCord.getInstance().config.getUuid() ) );
|
||||
encodeDataPair( data, "version", ProxyServer.getInstance().getVersion() );
|
||||
encodeDataPair( data, "server", "0" );
|
||||
encodeDataPair( data, "players", Integer.toString( ProxyServer.getInstance().getPlayers().size() ) );
|
||||
encodeDataPair( data, "players", Integer.toString( ProxyServer.getInstance().getOnlineCount() ) );
|
||||
encodeDataPair( data, "revision", String.valueOf( REVISION ) );
|
||||
|
||||
// If we're pinging, append it
|
||||
|
@ -39,10 +39,8 @@ public class CommandAlert extends Command
|
||||
}
|
||||
|
||||
String message = builder.substring( 0, builder.length() - 1 );
|
||||
for ( ProxiedPlayer player : ProxyServer.getInstance().getPlayers() )
|
||||
{
|
||||
player.sendMessage( message );
|
||||
}
|
||||
|
||||
ProxyServer.getInstance().broadcast( message );
|
||||
ProxyServer.getInstance().getConsole().sendMessage( message );
|
||||
}
|
||||
}
|
||||
|
@ -58,6 +58,6 @@ public class CommandList extends Command
|
||||
sender.sendMessage( message.toString() );
|
||||
}
|
||||
|
||||
sender.sendMessage( ProxyServer.getInstance().getTranslation( "total_players" ) + ProxyServer.getInstance().getPlayers().size() );
|
||||
sender.sendMessage( ProxyServer.getInstance().getTranslation( "total_players" ) + ProxyServer.getInstance().getOnlineCount() );
|
||||
}
|
||||
}
|
||||
|
@ -268,7 +268,7 @@ public class DownstreamBridge extends PacketHandler
|
||||
out.writeUTF( "PlayerCount" );
|
||||
if ( target.equals( "ALL" ) )
|
||||
{
|
||||
out.writeInt( bungee.getPlayers().size() );
|
||||
out.writeInt( bungee.getOnlineCount() );
|
||||
} else
|
||||
{
|
||||
ServerInfo server = bungee.getServerInfo( target );
|
||||
|
@ -96,7 +96,7 @@ public class InitialHandler extends PacketHandler implements PendingConnection
|
||||
public void handle(PacketFEPing ping) throws Exception
|
||||
{
|
||||
ServerPing response = new ServerPing( bungee.getProtocolVersion(), bungee.getGameVersion(),
|
||||
listener.getMotd(), bungee.getPlayers().size(), listener.getMaxPlayers() );
|
||||
listener.getMotd(), bungee.getOnlineCount(), listener.getMaxPlayers() );
|
||||
|
||||
response = bungee.getPluginManager().callEvent( new ProxyPingEvent( this, response ) ).getResponse();
|
||||
|
||||
@ -130,7 +130,7 @@ public class InitialHandler extends PacketHandler implements PendingConnection
|
||||
}
|
||||
|
||||
int limit = BungeeCord.getInstance().config.getPlayerLimit();
|
||||
if ( limit > 0 && bungee.getPlayers().size() > limit )
|
||||
if ( limit > 0 && bungee.getOnlineCount() > limit )
|
||||
{
|
||||
disconnect( bungee.getTranslation( "proxy_full" ) );
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user