From 5805150d8ca2a60e1703c80dc6aa581475bb2722 Mon Sep 17 00:00:00 2001 From: "Kristian S. Stangeland" Date: Tue, 17 Dec 2013 11:53:26 +0100 Subject: [PATCH] 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. --- .../injector/netty/ChannelInjector.java | 5 +- .../server/TemporaryPlayerFactory.java | 60 +++++++++++-------- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelInjector.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelInjector.java index fb0ead13..7322029a 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelInjector.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelInjector.java @@ -73,6 +73,7 @@ class ChannelInjector extends ByteToMessageDecoder { // The player, or temporary player private Player player; + private Player updated; // The player connection private Object playerConnection; @@ -189,7 +190,7 @@ class ChannelInjector extends ByteToMessageDecoder { // We can only retrieve cached injectors if (injector != null) { // Update instance - injector.player = player; + injector.updated = player; return injector; } throw new IllegalArgumentException("Cannot inject temporary Bukkit player."); @@ -707,7 +708,7 @@ class ChannelInjector extends ByteToMessageDecoder { @Override public Player getUpdatedPlayer() { - return injector.player; + return injector.updated; } @Override diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/server/TemporaryPlayerFactory.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/server/TemporaryPlayerFactory.java index 83aa6f6b..6e6f0929 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/server/TemporaryPlayerFactory.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/server/TemporaryPlayerFactory.java @@ -87,50 +87,58 @@ public class TemporaryPlayerFactory { Callback implementation = new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { - String methodName = method.getName(); SocketInjector injector = ((InjectorContainer) obj).getInjector(); if (injector == null) throw new IllegalStateException("Unable to find injector."); - + // Use the socket to get the address - if (methodName.equalsIgnoreCase("isOnline")) - return injector.getSocket() != null && injector.getSocket().isConnected(); - if (methodName.equalsIgnoreCase("getName")) - return "UNKNOWN[" + injector.getSocket().getRemoteSocketAddress() + "]"; - if (methodName.equalsIgnoreCase("getPlayer")) + else if (methodName.equals("getPlayer")) return injector.getUpdatedPlayer(); - if (methodName.equalsIgnoreCase("getAddress")) + else if (methodName.equals("getAddress")) return injector.getAddress(); - if (methodName.equalsIgnoreCase("getServer")) + else if (methodName.equals("getServer")) return server; - try { - // Handle send message methods - if (methodName.equalsIgnoreCase("chat") || methodName.equalsIgnoreCase("sendMessage")) { - Object argument = args[0]; - - // Dynamic overloading - if (argument instanceof String) { - return sendMessage(injector, (String) argument); - } else if (argument instanceof String[]) { - for (String message : (String[]) argument) { - sendMessage(injector, message); - } - return null; + // Handle send message methods + if (methodName.equals("chat") || methodName.equals("sendMessage")) { + try { + Object argument = args[0]; + + // Dynamic overloading + if (argument instanceof String) { + return sendMessage(injector, (String) argument); + } else if (argument instanceof String[]) { + for (String message : (String[]) argument) { + sendMessage(injector, message); } + return null; + } + } catch (InvocationTargetException e) { + throw e.getCause(); } - } catch (InvocationTargetException e) { - throw e.getCause(); } // Also, handle kicking - if (methodName.equalsIgnoreCase("kickPlayer")) { + if (methodName.equals("kickPlayer")) { injector.disconnect((String) args[0]); 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 throw new UnsupportedOperationException( "The method " + method.getName() + " is not supported for temporary players.");