mirror of
https://github.com/SpigotMC/BungeeCord.git
synced 2024-09-09 20:58:04 +02:00
Add onPluginMessage event
Allow plugins to register global message channels Added a packetQueue to the ServerConnection class Created a packet tag "KillCon" to kill an upstream connection (Required for Stargate-Bungee)
This commit is contained in:
parent
0d8716df93
commit
3c358c9c19
@ -8,7 +8,9 @@ import java.net.Socket;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Queue;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
@ -23,6 +25,7 @@ import net.md_5.bungee.command.CommandSender;
|
|||||||
import net.md_5.bungee.command.CommandServer;
|
import net.md_5.bungee.command.CommandServer;
|
||||||
import net.md_5.bungee.command.ConsoleCommandSender;
|
import net.md_5.bungee.command.ConsoleCommandSender;
|
||||||
import net.md_5.bungee.packet.DefinedPacket;
|
import net.md_5.bungee.packet.DefinedPacket;
|
||||||
|
import net.md_5.bungee.packet.PacketFAPluginMessage;
|
||||||
import net.md_5.bungee.plugin.JavaPluginManager;
|
import net.md_5.bungee.plugin.JavaPluginManager;
|
||||||
import net.md_5.bungee.tablist.GlobalPingTabList;
|
import net.md_5.bungee.tablist.GlobalPingTabList;
|
||||||
import net.md_5.bungee.tablist.GlobalTabList;
|
import net.md_5.bungee.tablist.GlobalTabList;
|
||||||
@ -82,6 +85,10 @@ public class BungeeCord
|
|||||||
* Tab list handler
|
* Tab list handler
|
||||||
*/
|
*/
|
||||||
public TabListHandler tabListHandler;
|
public TabListHandler tabListHandler;
|
||||||
|
/**
|
||||||
|
* Registered Global Plugin Channels
|
||||||
|
*/
|
||||||
|
public Queue<String> globalPluginChannels = new ConcurrentLinkedQueue<>();
|
||||||
/**
|
/**
|
||||||
* Plugin manager.
|
* Plugin manager.
|
||||||
*/
|
*/
|
||||||
@ -184,6 +191,9 @@ public class BungeeCord
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add RubberBand to the global plugin channel list
|
||||||
|
globalPluginChannels.add("RubberBand");
|
||||||
|
|
||||||
InetSocketAddress addr = Util.getAddr(config.bindHost);
|
InetSocketAddress addr = Util.getAddr(config.bindHost);
|
||||||
listener = new ListenThread(addr);
|
listener = new ListenThread(addr);
|
||||||
listener.start();
|
listener.start();
|
||||||
@ -262,4 +272,15 @@ public class BungeeCord
|
|||||||
con.packetQueue.add(packet);
|
con.packetQueue.add(packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a plugin channel for all users
|
||||||
|
*
|
||||||
|
* @param channel name
|
||||||
|
*/
|
||||||
|
public void registerPluginChannel(String channel)
|
||||||
|
{
|
||||||
|
globalPluginChannels.add(channel);
|
||||||
|
broadcast(new PacketFAPluginMessage("REGISTER", channel.getBytes()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,10 @@ import java.io.OutputStream;
|
|||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.security.PublicKey;
|
import java.security.PublicKey;
|
||||||
|
import java.util.Queue;
|
||||||
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
import javax.crypto.SecretKey;
|
import javax.crypto.SecretKey;
|
||||||
|
import net.md_5.bungee.packet.DefinedPacket;
|
||||||
import net.md_5.bungee.packet.Packet1Login;
|
import net.md_5.bungee.packet.Packet1Login;
|
||||||
import net.md_5.bungee.packet.Packet2Handshake;
|
import net.md_5.bungee.packet.Packet2Handshake;
|
||||||
import net.md_5.bungee.packet.PacketCDClientStatus;
|
import net.md_5.bungee.packet.PacketCDClientStatus;
|
||||||
@ -24,6 +27,7 @@ public class ServerConnection extends GenericConnection
|
|||||||
|
|
||||||
public final String name;
|
public final String name;
|
||||||
public final Packet1Login loginPacket;
|
public final Packet1Login loginPacket;
|
||||||
|
public Queue<DefinedPacket> packetQueue = new ConcurrentLinkedQueue<>();
|
||||||
|
|
||||||
public ServerConnection(String name, Socket socket, PacketInputStream in, OutputStream out, Packet1Login loginPacket)
|
public ServerConnection(String name, Socket socket, PacketInputStream in, OutputStream out, Packet1Login loginPacket)
|
||||||
{
|
{
|
||||||
@ -73,7 +77,13 @@ public class ServerConnection extends GenericConnection
|
|||||||
throw new KickException("[Kicked] " + new PacketFFKick(loginResponse).message);
|
throw new KickException("[Kicked] " + new PacketFFKick(loginResponse).message);
|
||||||
}
|
}
|
||||||
Packet1Login login = new Packet1Login(loginResponse);
|
Packet1Login login = new Packet1Login(loginResponse);
|
||||||
out.write(new PacketFAPluginMessage("REGISTER", "RubberBand".getBytes()).getPacket());
|
|
||||||
|
// Register all global plugin message channels
|
||||||
|
// TODO: Allow player-specific plugin message channels for full mod support
|
||||||
|
for (String channel : BungeeCord.instance.globalPluginChannels)
|
||||||
|
{
|
||||||
|
out.write(new PacketFAPluginMessage("REGISTER", channel.getBytes()).getPacket());
|
||||||
|
}
|
||||||
|
|
||||||
return new ServerConnection(name, socket, in, out, login);
|
return new ServerConnection(name, socket, in, out, login);
|
||||||
} catch (KickException ex)
|
} catch (KickException ex)
|
||||||
|
@ -20,6 +20,8 @@ import net.md_5.bungee.packet.PacketC9PlayerListItem;
|
|||||||
import net.md_5.bungee.packet.PacketFAPluginMessage;
|
import net.md_5.bungee.packet.PacketFAPluginMessage;
|
||||||
import net.md_5.bungee.packet.PacketInputStream;
|
import net.md_5.bungee.packet.PacketInputStream;
|
||||||
import net.md_5.bungee.plugin.ServerConnectEvent;
|
import net.md_5.bungee.plugin.ServerConnectEvent;
|
||||||
|
import net.md_5.bungee.plugin.PluginMessageEvent;
|
||||||
|
import net.md_5.bungee.plugin.PluginMessageEvent.Destination;
|
||||||
|
|
||||||
public class UserConnection extends GenericConnection implements CommandSender
|
public class UserConnection extends GenericConnection implements CommandSender
|
||||||
{
|
{
|
||||||
@ -38,6 +40,7 @@ public class UserConnection extends GenericConnection implements CommandSender
|
|||||||
private int trackingPingId;
|
private int trackingPingId;
|
||||||
private long pingTime;
|
private long pingTime;
|
||||||
private int ping;
|
private int ping;
|
||||||
|
public UserConnection instance = this;
|
||||||
|
|
||||||
public UserConnection(Socket socket, PacketInputStream in, OutputStream out, Packet2Handshake handshake, List<byte[]> loginPackets)
|
public UserConnection(Socket socket, PacketInputStream in, OutputStream out, Packet2Handshake handshake, List<byte[]> loginPackets)
|
||||||
{
|
{
|
||||||
@ -165,6 +168,11 @@ public class UserConnection extends GenericConnection implements CommandSender
|
|||||||
packetQueue.add(new Packet3Chat(message));
|
packetQueue.add(new Packet3Chat(message));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void sendPluginMessage(String tag, byte[] data)
|
||||||
|
{
|
||||||
|
server.packetQueue.add(new PacketFAPluginMessage(tag, data));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getName()
|
public String getName()
|
||||||
{
|
{
|
||||||
@ -190,7 +198,20 @@ public class UserConnection extends GenericConnection implements CommandSender
|
|||||||
boolean sendPacket = true;
|
boolean sendPacket = true;
|
||||||
|
|
||||||
int id = Util.getId(packet);
|
int id = Util.getId(packet);
|
||||||
if (id == 0x03)
|
if (id == 0xFA)
|
||||||
|
{
|
||||||
|
// Call the onPluginMessage event
|
||||||
|
PacketFAPluginMessage message = new PacketFAPluginMessage(packet);
|
||||||
|
PluginMessageEvent event = new PluginMessageEvent(Destination.SERVER, instance);
|
||||||
|
event.setTag(message.tag);
|
||||||
|
event.setData(new String(message.data));
|
||||||
|
BungeeCord.instance.pluginManager.onPluginMessage(event);
|
||||||
|
|
||||||
|
if (event.isCancelled())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} else if (id == 0x03)
|
||||||
{
|
{
|
||||||
Packet3Chat chat = new Packet3Chat(packet);
|
Packet3Chat chat = new Packet3Chat(packet);
|
||||||
String message = chat.message;
|
String message = chat.message;
|
||||||
@ -206,6 +227,15 @@ public class UserConnection extends GenericConnection implements CommandSender
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
while (!server.packetQueue.isEmpty())
|
||||||
|
{
|
||||||
|
DefinedPacket p = server.packetQueue.poll();
|
||||||
|
if (p != null)
|
||||||
|
{
|
||||||
|
server.out.write(p.getPacket());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
EntityMap.rewrite(packet, clientEntityId, serverEntityId);
|
EntityMap.rewrite(packet, clientEntityId, serverEntityId);
|
||||||
if (sendPacket && !server.socket.isClosed())
|
if (sendPacket && !server.socket.isClosed())
|
||||||
{
|
{
|
||||||
@ -242,7 +272,27 @@ public class UserConnection extends GenericConnection implements CommandSender
|
|||||||
int id = Util.getId(packet);
|
int id = Util.getId(packet);
|
||||||
if (id == 0xFA)
|
if (id == 0xFA)
|
||||||
{
|
{
|
||||||
|
// Call the onPluginMessage event
|
||||||
PacketFAPluginMessage message = new PacketFAPluginMessage(packet);
|
PacketFAPluginMessage message = new PacketFAPluginMessage(packet);
|
||||||
|
PluginMessageEvent event = new PluginMessageEvent(Destination.CLIENT, instance);
|
||||||
|
event.setTag(message.tag);
|
||||||
|
event.setData(new String(message.data));
|
||||||
|
BungeeCord.instance.pluginManager.onPluginMessage(event);
|
||||||
|
|
||||||
|
if (event.isCancelled())
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
message.tag = event.getTag();
|
||||||
|
message.data = event.getData().getBytes();
|
||||||
|
|
||||||
|
// Allow a message for killing the connection outright
|
||||||
|
if (message.tag.equals("KillCon"))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (message.tag.equals("RubberBand"))
|
if (message.tag.equals("RubberBand"))
|
||||||
{
|
{
|
||||||
String server = new String(message.data);
|
String server = new String(message.data);
|
||||||
|
@ -51,6 +51,13 @@ public abstract class JavaPlugin
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Called when a plugin message is sent to the client or server
|
||||||
|
*/
|
||||||
|
public void onPluginMessage(PluginMessageEvent event)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a command for use with the proxy.
|
* Register a command for use with the proxy.
|
||||||
*/
|
*/
|
||||||
|
@ -106,4 +106,13 @@ public class JavaPluginManager extends JavaPlugin
|
|||||||
p.onServerConnect(event);
|
p.onServerConnect(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onPluginMessage(PluginMessageEvent event)
|
||||||
|
{
|
||||||
|
for (JavaPlugin p : plugins)
|
||||||
|
{
|
||||||
|
p.onPluginMessage(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user