From 25d41ed51c2f0583a7e9ca0a43ae7a67d8feb2a7 Mon Sep 17 00:00:00 2001 From: "Kristian S. Stangeland" Date: Wed, 5 Dec 2012 03:32:13 +0100 Subject: [PATCH] Ensure that fake cancellation packets can be created. --- .../injector/player/InjectedArrayList.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/player/InjectedArrayList.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/player/InjectedArrayList.java index 2f8ee829..b2fc3855 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/player/InjectedArrayList.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/player/InjectedArrayList.java @@ -26,6 +26,7 @@ import com.comphenix.protocol.injector.ListenerInvoker; import com.comphenix.protocol.injector.player.NetworkFieldInjector.FakePacket; import net.minecraft.server.Packet; +import net.sf.cglib.proxy.Callback; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; @@ -46,10 +47,13 @@ class InjectedArrayList extends ArrayList { private transient Set ignoredPackets; private transient ClassLoader classLoader; + private transient InvertedIntegerCallback callback; + public InjectedArrayList(ClassLoader classLoader, PlayerInjector injector, Set ignoredPackets) { this.classLoader = classLoader; this.injector = injector; this.ignoredPackets = ignoredPackets; + this.callback = new InvertedIntegerCallback(); } @Override @@ -96,6 +100,8 @@ class InjectedArrayList extends ArrayList { int packetID = invoker.getPacketID(source); Class type = invoker.getPacketClassFromID(packetID, true); + System.out.println(type.getName()); + // We want to subtract the byte amount that were added to the running // total of outstanding packets. Otherwise, cancelling too many packets // might cause a "disconnect.overflow" error. @@ -122,15 +128,20 @@ class InjectedArrayList extends ArrayList { ex.setCallbackType(InvertedIntegerCallback.class); Class proxyClass = ex.createClass(); - - // Temporarily associate the fake packet class - invoker.registerPacketClass(proxyClass, packetID); - - Packet fake = (Packet) Enhancer.create(proxyClass, new InvertedIntegerCallback()); + Enhancer.registerCallbacks(proxyClass, new Callback[] { callback }); - // Remove this association - invoker.unregisterPacketClass(proxyClass); - return fake; + try { + // Temporarily associate the fake packet class + invoker.registerPacketClass(proxyClass, packetID); + return (Packet) proxyClass.newInstance(); + + } catch (Exception e) { + // Don't pollute the throws tree + throw new RuntimeException("Cannot create fake class.", e); + } finally { + // Remove this association + invoker.unregisterPacketClass(proxyClass); + } } /**