From 51a58f79a5cc97d878efb12b85fa6ac4d99bd56d Mon Sep 17 00:00:00 2001 From: retrooper Date: Thu, 10 Sep 2020 19:34:04 +0200 Subject: [PATCH] now thread safe event priority system, contains example code, outbound custompayload wrapper is now loaded(not guaranteed to work) --- pom.xml | 2 +- .../event/manager/EventManager.java | 63 +++++++++---------- .../packetevents/example/MainExample.java | 30 ++++++--- .../packetwrappers/WrappedPacket.java | 2 + .../WrappedPacketOutCustomPayload.java | 24 +++---- .../protocollib/ProtocolLibListener.java | 3 +- 6 files changed, 64 insertions(+), 60 deletions(-) diff --git a/pom.xml b/pom.xml index 2a9ee22639..6ccad0de7c 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.github.retrooper packetevents - 1.6.6.1 + 1.6.7 diff --git a/src/main/java/io/github/retrooper/packetevents/event/manager/EventManager.java b/src/main/java/io/github/retrooper/packetevents/event/manager/EventManager.java index a046cb1b3f..cc2c9c0adc 100644 --- a/src/main/java/io/github/retrooper/packetevents/event/manager/EventManager.java +++ b/src/main/java/io/github/retrooper/packetevents/event/manager/EventManager.java @@ -36,49 +36,40 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; public final class EventManager { - private final HashMap> registeredMethods = new HashMap>(); + private final ConcurrentHashMap> registeredMethods = new ConcurrentHashMap<>(); public void callEvent(final PacketEvent e) { for (final PacketListener listener : registeredMethods.keySet()) { - //Annotated methods - final List methods = registeredMethods.get(listener); - final List isCancellingList = new ArrayList(methods.size()); - - int highestPriorityMethodListenerIndex = 0; - for(int i = 0; i < methods.size(); i++) { - Method method = methods.get(i); - final Class parameterType = method.getParameterTypes()[0]; + ConcurrentLinkedQueue methods = registeredMethods.get(listener); + final boolean[] isCancelled = {false}; + final byte[] eventPriority = {PacketEventPriority.LOWEST}; + for (Method method : methods) { + Class parameterType = method.getParameterTypes()[0]; if (parameterType.equals(PacketEvent.class) || parameterType.isInstance(e)) { - PacketHandler annotation = methods.get(highestPriorityMethodListenerIndex).getAnnotation(PacketHandler.class); - - PacketHandler competitorAnnotation = methods.get(i).getAnnotation(PacketHandler.class); - - if(competitorAnnotation.priority() >= annotation.priority()) { - highestPriorityMethodListenerIndex = i; - } - boolean isCurEventCancelled = false; - final Runnable invokeMethod = new Runnable() { + PacketHandler annotation = method.getAnnotation(PacketHandler.class); + Runnable invokeMethod = new Runnable() { @Override public void run() { try { method.invoke(listener, e); - if(e instanceof CancellableEvent) { - isCancellingList.add(((CancellableEvent) e).isCancelled()); - } } catch (IllegalAccessException | InvocationTargetException ex) { ex.printStackTrace(); } + if (e instanceof CancellableEvent) { + CancellableEvent ce = (CancellableEvent) e; + if (annotation.priority() >= eventPriority[0]) { + eventPriority[0] = annotation.priority(); + isCancelled[0] = ce.isCancelled(); + } + } } }; - - switch (annotation.synchronization()) { case FORCE_ASYNC: Bukkit.getScheduler().runTaskAsynchronously(PacketEvents.getPlugin(), invokeMethod); @@ -92,16 +83,18 @@ public void run() { } catch (IllegalAccessException | InvocationTargetException ex) { ex.printStackTrace(); } - isCancellingList.add(((CancellableEvent)e).isCancelled()); + if (e instanceof CancellableEvent) { + CancellableEvent ce = (CancellableEvent) e; + if (annotation.priority() >= eventPriority[0]) { + eventPriority[0] = annotation.priority(); + isCancelled[0] = ce.isCancelled(); + } + } break; } - - //Last iteration - if(i + 1 == methods.size()) { - if(e instanceof CancellableEvent) { - CancellableEvent cancellable = (CancellableEvent)e; - cancellable.setCancelled(isCancellingList.get(highestPriorityMethodListenerIndex)); - } + if (e instanceof CancellableEvent) { + CancellableEvent cancellableEvent = (CancellableEvent) e; + cancellableEvent.setCancelled(isCancelled[0]); } } } @@ -109,7 +102,7 @@ public void run() { } public void registerListener(final PacketListener listener) { - final List methods = new ArrayList(); + final ConcurrentLinkedQueue methods = new ConcurrentLinkedQueue<>(); for (final Method m : listener.getClass().getDeclaredMethods()) { if (m.isAnnotationPresent(PacketHandler.class) && m.getParameterTypes().length == 1) { diff --git a/src/main/java/io/github/retrooper/packetevents/example/MainExample.java b/src/main/java/io/github/retrooper/packetevents/example/MainExample.java index b1e0a4562c..de08de5789 100644 --- a/src/main/java/io/github/retrooper/packetevents/example/MainExample.java +++ b/src/main/java/io/github/retrooper/packetevents/example/MainExample.java @@ -26,11 +26,14 @@ import io.github.retrooper.packetevents.PacketEvents; import io.github.retrooper.packetevents.annotations.PacketHandler; +import io.github.retrooper.packetevents.enums.PacketEventPriority; import io.github.retrooper.packetevents.event.PacketListener; +import io.github.retrooper.packetevents.event.impl.PacketReceiveEvent; import io.github.retrooper.packetevents.event.impl.PacketSendEvent; import io.github.retrooper.packetevents.packet.PacketType; +import io.github.retrooper.packetevents.packetwrappers.in.chat.WrappedPacketInChat; +import io.github.retrooper.packetevents.packetwrappers.in.useentity.WrappedPacketInUseEntity; import io.github.retrooper.packetevents.packetwrappers.out.custompayload.WrappedPacketOutCustomPayload; -import io.github.retrooper.packetevents.packetwrappers.out.entity.WrappedPacketOutEntity; import org.bukkit.plugin.java.JavaPlugin; public class MainExample extends JavaPlugin implements PacketListener { @@ -54,17 +57,26 @@ public void onDisable() { PacketEvents.stop(); } + @PacketHandler(priority = PacketEventPriority.MONITOR) + public void onReceive1(PacketReceiveEvent e) { + if(e.getPacketId() == PacketType.Client.USE_ENTITY) { + WrappedPacketInUseEntity ue = new WrappedPacketInUseEntity(e.getNMSPacket()); + e.cancel(); + } + } + + @PacketHandler(priority = PacketEventPriority.NORMAL) + public void onReceive2(PacketReceiveEvent e) { + if(e.getPacketId() == PacketType.Client.USE_ENTITY) { + WrappedPacketInUseEntity ue = new WrappedPacketInUseEntity(e.getNMSPacket()); + e.uncancel(); + } + } + @PacketHandler public void onSend(PacketSendEvent e) { - if (e.getPacketId() == PacketType.Server.CUSTOM_PAYLOAD) { - WrappedPacketOutCustomPayload cp = new WrappedPacketOutCustomPayload(e.getNMSPacket()); + if(e.getPacketId() == PacketType.Server.CUSTOM_PAYLOAD) { } } - //creating wrappers is much easier and cleaner now with new functions. - //all wrappers cleaned up - // walk speed returning the fly speed FIXED, - // wrappedpacketoutchat.fromStringToJSON() debug removed, - // wrappedpacketoutkickdisconnect constructor now requires a json string, - // food saturation in wrappedpacketoutupdatehealth was equal to health value by accident } \ No newline at end of file diff --git a/src/main/java/io/github/retrooper/packetevents/packetwrappers/WrappedPacket.java b/src/main/java/io/github/retrooper/packetevents/packetwrappers/WrappedPacket.java index 98d296bcab..1d7f0e2579 100644 --- a/src/main/java/io/github/retrooper/packetevents/packetwrappers/WrappedPacket.java +++ b/src/main/java/io/github/retrooper/packetevents/packetwrappers/WrappedPacket.java @@ -45,6 +45,7 @@ import io.github.retrooper.packetevents.packetwrappers.out.abilities.WrappedPacketOutAbilities; import io.github.retrooper.packetevents.packetwrappers.out.animation.WrappedPacketOutAnimation; import io.github.retrooper.packetevents.packetwrappers.out.chat.WrappedPacketOutChat; +import io.github.retrooper.packetevents.packetwrappers.out.custompayload.WrappedPacketOutCustomPayload; import io.github.retrooper.packetevents.packetwrappers.out.entity.WrappedPacketOutEntity; import io.github.retrooper.packetevents.packetwrappers.out.entityvelocity.WrappedPacketOutEntityVelocity; import io.github.retrooper.packetevents.packetwrappers.out.keepalive.WrappedPacketOutKeepAlive; @@ -112,6 +113,7 @@ public static void loadAllWrappers() { WrappedPacketOutPosition.load(); WrappedPacketOutTransaction.load(); WrappedPacketOutUpdateHealth.load(); + WrappedPacketOutCustomPayload.load(); } protected void setup() { diff --git a/src/main/java/io/github/retrooper/packetevents/packetwrappers/out/custompayload/WrappedPacketOutCustomPayload.java b/src/main/java/io/github/retrooper/packetevents/packetwrappers/out/custompayload/WrappedPacketOutCustomPayload.java index fe50150c5e..f93ff64ecb 100644 --- a/src/main/java/io/github/retrooper/packetevents/packetwrappers/out/custompayload/WrappedPacketOutCustomPayload.java +++ b/src/main/java/io/github/retrooper/packetevents/packetwrappers/out/custompayload/WrappedPacketOutCustomPayload.java @@ -29,9 +29,6 @@ import io.github.retrooper.packetevents.packetwrappers.WrappedPacket; import io.github.retrooper.packetevents.reflectionutils.Reflection; import io.github.retrooper.packetevents.utils.NMSUtils; -import io.netty.buffer.Unpooled; -import net.minecraft.server.v1_13_R2.MinecraftKey; -import net.minecraft.server.v1_16_R1.PacketDataSerializer; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -99,28 +96,26 @@ public static void load() { } } } - PacketDataSerializer ds = new PacketDataSerializer(Unpooled.copiedBuffer(new byte[10])); - } private String tag; private byte[] data; - public WrappedPacketOutCustomPayload(String tag, byte[] bytes) { + public WrappedPacketOutCustomPayload(String tag, byte[] data) { this.tag = tag; this.data = data; } - public WrappedPacketOutCustomPayload(Object packet) { - super(packet); - } - - @Override - protected void setup() { + /* public WrappedPacketOutCustomPayload(Object packet) { + super(packet); + } - } + @Override + protected void setup() { + } + */ public String getTag() { return tag; } @@ -158,7 +153,8 @@ public Object asNMSPacket() { try { Object minecraftKey = minecraftKeyConstructor.newInstance(tag); - Object dataSerializer = packetDataSerializerConstructor.newInstance(byteBufObject);; + Object dataSerializer = packetDataSerializerConstructor.newInstance(byteBufObject); + ; return constructor.newInstance(minecraftKey, dataSerializer); } catch (InstantiationException | InvocationTargetException | IllegalAccessException e) { e.printStackTrace(); diff --git a/src/main/java/io/github/retrooper/packetevents/utils/protocollib/ProtocolLibListener.java b/src/main/java/io/github/retrooper/packetevents/utils/protocollib/ProtocolLibListener.java index e6f3ec71f1..5e65129ec9 100644 --- a/src/main/java/io/github/retrooper/packetevents/utils/protocollib/ProtocolLibListener.java +++ b/src/main/java/io/github/retrooper/packetevents/utils/protocollib/ProtocolLibListener.java @@ -39,10 +39,11 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; public class ProtocolLibListener { - public static void registerProtocolLibListener(PacketListener listener, List methods) { + public static void registerProtocolLibListener(PacketListener listener, ConcurrentLinkedQueue methods) { if (ProtocolLibUtils.isAvailable()) { for (Method m : methods) { if (m.getParameterTypes()[0].equals(PacketReceiveEvent.class)) {