Add getServerInfo(name) and rework plugin channel system for stupud Bukkit limitations.

This commit is contained in:
md_5 2013-01-24 14:13:27 +11:00
parent 8f32374cda
commit 8797a29761
3 changed files with 52 additions and 30 deletions

View File

@ -87,6 +87,14 @@ public abstract class ProxyServer
*/
public abstract Map<String, ServerInfo> getServers();
/**
* Gets the server info of a server.
*
* @param name the name of the configured server
* @return the server info belonging to the specified server
*/
public abstract ServerInfo getServerInfo(String name);
/**
* Get the {@link PluginManager} associated with loading plugins and
* dispatching events. It is recommended that implementations use the

View File

@ -105,9 +105,7 @@ public class BungeeCord extends ProxyServer
getPluginManager().registerCommand(new CommandAlert());
getPluginManager().registerCommand(new CommandBungee());
registerChannel("BungeeCord::Disconnect");
registerChannel("BungeeCord::Connect");
registerChannel("BungeeCord::Forward");
registerChannel("BungeeCord");
}
public static BungeeCord getInstance()
@ -291,6 +289,12 @@ public class BungeeCord extends ProxyServer
return config.getServers();
}
@Override
public ServerInfo getServerInfo(String name)
{
return getServers().get(name);
}
@Override
@Synchronized("pluginChannels")
public void registerChannel(String channel)

View File

@ -282,6 +282,13 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
case 0xFA:
// Call the onPluginMessage event
PacketFAPluginMessage message = new PacketFAPluginMessage(packet);
// Might matter in the future
if (message.tag.equals("BungeeCord"))
{
continue;
}
PluginMessageEvent event = new PluginMessageEvent(UserConnection.this, server, message.tag, message.data);
ProxyServer.getInstance().getPluginManager().callEvent(event);
@ -371,39 +378,42 @@ public class UserConnection extends GenericConnection implements ProxiedPlayer
continue;
}
switch (message.tag)
if (message.tag.equals("BungeeCord"))
{
case "BungeeCord::Disconnect":
break outer;
case "BungeeCord::Forward":
String target = in.readUTF();
String channel = in.readUTF();
short len = in.readShort();
byte[] data = new byte[len];
in.readFully(data);
switch (in.readUTF())
{
case "Disconnect":
break outer;
case "Forward":
String target = in.readUTF();
String channel = in.readUTF();
short len = in.readShort();
byte[] data = new byte[len];
in.readFully(data);
if (target.equals("ALL"))
{
for (String s : BungeeCord.getInstance().getServers().keySet())
if (target.equals("ALL"))
{
Server server = BungeeCord.getInstance().getServer(s);
for (String s : BungeeCord.getInstance().getServers().keySet())
{
Server server = BungeeCord.getInstance().getServer(s);
server.sendData(channel, data);
}
} else
{
Server server = BungeeCord.getInstance().getServer(target);
server.sendData(channel, data);
}
} else
{
Server server = BungeeCord.getInstance().getServer(target);
server.sendData(channel, data);
}
break;
case "BungeeCord::Connect":
ServerInfo server = BungeeCord.getInstance().config.getServers().get(in.readUTF());
if (server != null)
{
connect(server);
break outer;
}
break;
break;
case "Connect":
ServerInfo server = BungeeCord.getInstance().config.getServers().get(in.readUTF());
if (server != null)
{
connect(server);
break outer;
}
break;
}
}
}