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:
Ursprung
9d972b90ac
Commit
5805150d8c
@ -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
|
||||||
|
@ -87,50 +87,58 @@ 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();
|
||||||
|
|
||||||
if (injector == null)
|
if (injector == null)
|
||||||
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.");
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren