Automatically queue packets to send when a player connects, and change the API regarding this. Please don't use the Server methods anymore, instead use ServerInfo.
CC: @TheDgtl
This commit is contained in:
@@ -5,6 +5,7 @@ import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
@@ -339,4 +340,10 @@ public class BungeeCord extends ProxyServer
|
||||
{
|
||||
return GAME_VERSION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ServerInfo constructServerInfo(String name, InetSocketAddress address)
|
||||
{
|
||||
return new BungeeServerInfo(name, address);
|
||||
}
|
||||
}
|
||||
|
76
proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java
Normal file
76
proxy/src/main/java/net/md_5/bungee/BungeeServerInfo.java
Normal file
@@ -0,0 +1,76 @@
|
||||
package net.md_5.bungee;
|
||||
|
||||
import java.io.DataOutputStream;
|
||||
import java.net.InetSocketAddress;
|
||||
import java.net.Socket;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import lombok.Getter;
|
||||
import net.md_5.bungee.api.Callback;
|
||||
import net.md_5.bungee.api.ProxyServer;
|
||||
import net.md_5.bungee.api.ServerPing;
|
||||
import net.md_5.bungee.api.config.ServerInfo;
|
||||
import net.md_5.bungee.api.connection.Server;
|
||||
import net.md_5.bungee.packet.DefinedPacket;
|
||||
import net.md_5.bungee.packet.PacketFAPluginMessage;
|
||||
import net.md_5.bungee.packet.PacketFFKick;
|
||||
import net.md_5.bungee.packet.PacketInputStream;
|
||||
|
||||
public class BungeeServerInfo extends ServerInfo
|
||||
{
|
||||
|
||||
@Getter
|
||||
private final Queue<DefinedPacket> packetQueue = new ConcurrentLinkedQueue<>();
|
||||
|
||||
public BungeeServerInfo(String name, InetSocketAddress address)
|
||||
{
|
||||
super(name, address);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendData(String channel, byte[] data)
|
||||
{
|
||||
Server server = ProxyServer.getInstance().getServer(getName());
|
||||
if (server != null)
|
||||
{
|
||||
server.sendData(channel, data);
|
||||
} else
|
||||
{
|
||||
packetQueue.add(new PacketFAPluginMessage(channel, data));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ping(final Callback<ServerPing> callback)
|
||||
{
|
||||
new Thread()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
try
|
||||
{
|
||||
Socket socket = new Socket();
|
||||
socket.connect(getAddress());
|
||||
try (DataOutputStream out = new DataOutputStream(socket.getOutputStream()))
|
||||
{
|
||||
out.write(0xFE);
|
||||
out.write(0x01);
|
||||
}
|
||||
try (PacketInputStream in = new PacketInputStream(socket.getInputStream()))
|
||||
{
|
||||
PacketFFKick response = new PacketFFKick(in.readPacket());
|
||||
|
||||
String[] split = response.message.split("\00");
|
||||
|
||||
ServerPing ping = new ServerPing(Byte.parseByte(split[1]), split[2], split[3], Integer.parseInt(split[4]), Integer.parseInt(split[5]));
|
||||
callback.done(ping, null);
|
||||
}
|
||||
} catch (Throwable t)
|
||||
{
|
||||
callback.done(null, t);
|
||||
}
|
||||
}
|
||||
}.start();
|
||||
}
|
||||
}
|
@@ -95,6 +95,12 @@ public class ServerConnection extends GenericConnection implements Server
|
||||
|
||||
out.write(BungeeCord.getInstance().registerChannels().getPacket());
|
||||
|
||||
Queue<DefinedPacket> packetQueue = ((BungeeServerInfo) info).getPacketQueue();
|
||||
while (!packetQueue.isEmpty())
|
||||
{
|
||||
out.write(packetQueue.poll().getPacket());
|
||||
}
|
||||
|
||||
return server;
|
||||
} catch (KickException ex)
|
||||
{
|
||||
@@ -122,35 +128,7 @@ public class ServerConnection extends GenericConnection implements Server
|
||||
@Override
|
||||
public void ping(final Callback<ServerPing> callback)
|
||||
{
|
||||
new Thread()
|
||||
{
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
try
|
||||
{
|
||||
Socket socket = new Socket();
|
||||
socket.connect(getAddress());
|
||||
try (DataOutputStream out = new DataOutputStream(socket.getOutputStream()))
|
||||
{
|
||||
out.write(0xFE);
|
||||
out.write(0x01);
|
||||
}
|
||||
try (PacketInputStream in = new PacketInputStream(socket.getInputStream()))
|
||||
{
|
||||
PacketFFKick response = new PacketFFKick(in.readPacket());
|
||||
|
||||
String[] split = response.message.split("\00");
|
||||
|
||||
ServerPing ping = new ServerPing(Byte.parseByte(split[1]), split[2], split[3], Integer.parseInt(split[4]), Integer.parseInt(split[5]));
|
||||
callback.done(ping, null);
|
||||
}
|
||||
} catch (Throwable t)
|
||||
{
|
||||
callback.done(null, t);
|
||||
}
|
||||
}
|
||||
}.start();
|
||||
getInfo().ping(callback);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@@ -151,7 +151,7 @@ public class YamlConfig implements ConfigurationAdapter
|
||||
String name = entry.getKey();
|
||||
String addr = get("address", "localhost:25565", val);
|
||||
InetSocketAddress address = Util.getAddr(addr);
|
||||
ServerInfo info = new ServerInfo(name, address);
|
||||
ServerInfo info = ProxyServer.getInstance().constructServerInfo(name, address);
|
||||
ret.put(name, info);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user