Archiviert
13
0

Call the updated player instance in the temporary player.

This allows us to provide additional information to our PacketEvent 
(mostly OfflinePlayer information), without sacrificing sendMessage() 
or getAddress(), which doesn't work in CraftPlayer during login.
Dieser Commit ist enthalten in:
Kristian S. Stangeland 2013-12-17 11:53:26 +01:00
Ursprung 9d972b90ac
Commit 5805150d8c
2 geänderte Dateien mit 37 neuen und 28 gelöschten Zeilen

Datei anzeigen

@ -73,6 +73,7 @@ class ChannelInjector extends ByteToMessageDecoder {
// The player, or temporary player // The player, or temporary player
private Player player; private Player player;
private Player updated;
// The player connection // The player connection
private Object playerConnection; private Object playerConnection;
@ -189,7 +190,7 @@ class ChannelInjector extends ByteToMessageDecoder {
// We can only retrieve cached injectors // We can only retrieve cached injectors
if (injector != null) { if (injector != null) {
// Update instance // Update instance
injector.player = player; injector.updated = player;
return injector; return injector;
} }
throw new IllegalArgumentException("Cannot inject temporary Bukkit player."); throw new IllegalArgumentException("Cannot inject temporary Bukkit player.");
@ -707,7 +708,7 @@ class ChannelInjector extends ByteToMessageDecoder {
@Override @Override
public Player getUpdatedPlayer() { public Player getUpdatedPlayer() {
return injector.player; return injector.updated;
} }
@Override @Override

Datei anzeigen

@ -87,7 +87,6 @@ public class TemporaryPlayerFactory {
Callback implementation = new MethodInterceptor() { Callback implementation = new MethodInterceptor() {
@Override @Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
String methodName = method.getName(); String methodName = method.getName();
SocketInjector injector = ((InjectorContainer) obj).getInjector(); SocketInjector injector = ((InjectorContainer) obj).getInjector();
@ -95,42 +94,51 @@ public class TemporaryPlayerFactory {
throw new IllegalStateException("Unable to find injector."); throw new IllegalStateException("Unable to find injector.");
// Use the socket to get the address // Use the socket to get the address
if (methodName.equalsIgnoreCase("isOnline")) else if (methodName.equals("getPlayer"))
return injector.getSocket() != null && injector.getSocket().isConnected();
if (methodName.equalsIgnoreCase("getName"))
return "UNKNOWN[" + injector.getSocket().getRemoteSocketAddress() + "]";
if (methodName.equalsIgnoreCase("getPlayer"))
return injector.getUpdatedPlayer(); return injector.getUpdatedPlayer();
if (methodName.equalsIgnoreCase("getAddress")) else if (methodName.equals("getAddress"))
return injector.getAddress(); return injector.getAddress();
if (methodName.equalsIgnoreCase("getServer")) else if (methodName.equals("getServer"))
return server; return server;
try { // Handle send message methods
// Handle send message methods if (methodName.equals("chat") || methodName.equals("sendMessage")) {
if (methodName.equalsIgnoreCase("chat") || methodName.equalsIgnoreCase("sendMessage")) { try {
Object argument = args[0]; Object argument = args[0];
// Dynamic overloading // Dynamic overloading
if (argument instanceof String) { if (argument instanceof String) {
return sendMessage(injector, (String) argument); return sendMessage(injector, (String) argument);
} else if (argument instanceof String[]) { } else if (argument instanceof String[]) {
for (String message : (String[]) argument) { for (String message : (String[]) argument) {
sendMessage(injector, message); sendMessage(injector, message);
}
return null;
} }
return null;
}
} catch (InvocationTargetException e) {
throw e.getCause();
} }
} catch (InvocationTargetException e) {
throw e.getCause();
} }
// Also, handle kicking // Also, handle kicking
if (methodName.equalsIgnoreCase("kickPlayer")) { if (methodName.equals("kickPlayer")) {
injector.disconnect((String) args[0]); injector.disconnect((String) args[0]);
return null; return null;
} }
// The fallback instance
Player updated = injector.getUpdatedPlayer();
if (updated != obj && updated != null) {
return proxy.invoke(updated, args);
}
// Methods that are supported in the fallback instance
if (methodName.equals("isOnline"))
return injector.getSocket() != null && injector.getSocket().isConnected();
else if (methodName.equals("getName"))
return "UNKNOWN[" + injector.getSocket().getRemoteSocketAddress() + "]";
// Ignore all other methods // Ignore all other methods
throw new UnsupportedOperationException( throw new UnsupportedOperationException(
"The method " + method.getName() + " is not supported for temporary players."); "The method " + method.getName() + " is not supported for temporary players.");