Fixed incorrect detection of "custom" net handlers.

This should ensure that users on MCPC no longer recieves the 
REPORT_DETECTED_CUSTOM_SERVER_HANDLER warning just for using MCPC.
This commit is contained in:
Kristian S. Stangeland 2013-05-31 22:57:00 +02:00
parent bbe766cf23
commit 77346f8438
2 changed files with 683 additions and 666 deletions

View File

@ -11,12 +11,12 @@
</arguments> </arguments>
</buildCommand> </buildCommand>
<buildCommand> <buildCommand>
<name>net.sourceforge.metrics.builder</name> <name>org.eclipse.m2e.core.maven2Builder</name>
<arguments> <arguments>
</arguments> </arguments>
</buildCommand> </buildCommand>
<buildCommand> <buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name> <name>net.sourceforge.metrics.builder</name>
<arguments> <arguments>
</arguments> </arguments>
</buildCommand> </buildCommand>

View File

@ -358,13 +358,16 @@ public abstract class PlayerInjector implements SocketInjector {
private Field getProxyField(Object notchEntity, Field serverField) { private Field getProxyField(Object notchEntity, Field serverField) {
try { try {
Object handler = FieldUtils.readField(serverHandlerField, notchEntity, true); Object currentHandler = FieldUtils.readField(serverHandlerField, notchEntity, true);
// Is this a Minecraft hook? // This is bad
if (handler != null && !MinecraftReflection.isMinecraftObject(handler)) { if (currentHandler == null)
throw new IllegalAccessError("Unable to fetch server handler: was NUll.");
// See if this isn't a standard net handler class
if (!isStandardMinecraftNetHandler(currentHandler)) {
// This is our proxy object // This is our proxy object
if (handler instanceof Factory) if (currentHandler instanceof Factory)
return null; return null;
hasProxyType = true; hasProxyType = true;
@ -372,7 +375,7 @@ public abstract class PlayerInjector implements SocketInjector {
// No? Is it a Proxy type? // No? Is it a Proxy type?
try { try {
FuzzyReflection reflection = FuzzyReflection.fromObject(handler, true); FuzzyReflection reflection = FuzzyReflection.fromObject(currentHandler, true);
// It might be // It might be
return reflection.getFieldByType("NetServerHandler", MinecraftReflection.getNetServerHandlerClass()); return reflection.getFieldByType("NetServerHandler", MinecraftReflection.getNetServerHandlerClass());
@ -390,6 +393,20 @@ public abstract class PlayerInjector implements SocketInjector {
return null; return null;
} }
/**
* Determine if a given object is a standard Minecraft net handler.
* @param obj the object to test.
* @return TRUE if it is, FALSE otherwise.
*/
private boolean isStandardMinecraftNetHandler(Object obj) {
if (obj == null)
return false;
Class<?> clazz = obj.getClass();
return MinecraftReflection.getNetLoginHandlerClass().equals(clazz) ||
MinecraftReflection.getNetServerHandlerClass().equals(clazz);
}
/** /**
* Retrieves the current net handler for this player. * Retrieves the current net handler for this player.
* @return Current net handler. * @return Current net handler.