diff --git a/README.md b/README.md
index 86b6b64433..17dc2fa0af 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,10 @@
# packetevents
-A Spigot packet API with some nice utlities.
+A spigot Packet API with some nice utlities.
## About
-This packetlistener is **only** supported on Spigot servers and has been tested to work on these Spigot forks: PaperMC, Tuinity
-
-* No dependencies
-
-* Licensed under the MIT license
+This API is **only** supported on Spigot servers and has been tested to work on these Spigot forks: Paper, Tuinity, Purpur
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
@@ -16,5 +12,3 @@ Our discord server: https://discord.me/packetevents
[![](https://jitpack.io/v/retrooper/packetevents.svg)](https://jitpack.io/#retrooper/packetevents)
-[![](https://jitci.com/gh/retrooper/packetevents/svg)](https://jitci.com/gh/retrooper/packetevents)
-
diff --git a/pom.xml b/pom.xml
index 70bbb84d8f..8dd36d576e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
io.github.retrooper
packetevents
- 1.7.5
+ 1.7.6
@@ -122,21 +122,6 @@
4.5.0
provided
-
-
- us.myles
- viaversion
- 3.0.1
- provided
-
-
-
- com.github.ProtocolSupport
- ProtocolSupport
- 4fdd683
- provided
-
-
org.spigotmc
spigot-api
diff --git a/src/main/java/io/github/retrooper/packetevents/PacketEvents.java b/src/main/java/io/github/retrooper/packetevents/PacketEvents.java
index bb56fd6ab8..7c954eefc1 100644
--- a/src/main/java/io/github/retrooper/packetevents/PacketEvents.java
+++ b/src/main/java/io/github/retrooper/packetevents/PacketEvents.java
@@ -26,8 +26,8 @@
import io.github.retrooper.packetevents.bungee.BungeePluginMessageListener;
import io.github.retrooper.packetevents.event.PacketEvent;
+import io.github.retrooper.packetevents.exceptions.PacketEventsLoadFailureException;
import io.github.retrooper.packetevents.packetmanager.PacketManager;
-import io.github.retrooper.packetevents.packetmanager.netty.NettyPacketManager;
import io.github.retrooper.packetevents.packettype.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
import io.github.retrooper.packetevents.settings.PacketEventsSettings;
@@ -37,10 +37,11 @@
import io.github.retrooper.packetevents.utils.player.ClientVersion;
import io.github.retrooper.packetevents.utils.server.PEVersion;
import io.github.retrooper.packetevents.utils.server.ServerVersion;
-import io.github.retrooper.packetevents.utils.versionlookup.VersionLookupUtils;
+import io.github.retrooper.packetevents.utils.v_1_7_10.ProtocolVersionAccessor_v_1_7;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerLoginEvent;
@@ -57,12 +58,13 @@ public final class PacketEvents implements Listener {
private static final PacketEvents instance = new PacketEvents();
private static final ArrayList plugins = new ArrayList<>(1);
private static boolean loaded, initialized;
- private static final PEVersion version = new PEVersion(1, 7, 5);
+ private static final PEVersion version = new PEVersion(1, 7, 6);
private static PacketEventsSettings settings = new PacketEventsSettings();
- /** General executor service, basically for anything that the packet executor service doesn't do.
+ /**
+ * General executor service, basically for anything that the packet executor service doesn't do.
*/
- public static ExecutorService generalExecutorService = Executors.newCachedThreadPool();
+ public static ExecutorService generalExecutorService = Executors.newSingleThreadExecutor();
//Executor used for player injecting/ejecting and for packet processing/event calling
public static ExecutorService packetHandlingExecutorService = Executors.newSingleThreadExecutor();
@@ -105,7 +107,7 @@ public static void load() {
WrappedPacket.loadAllWrappers();
} catch (Exception ex) {
- throw new IllegalStateException("PacketEvents failed to successfully load...", ex);
+ throw new PacketEventsLoadFailureException();
}
loaded = true;
}
@@ -214,7 +216,7 @@ public static PEVersion getVersion() {
return version;
}
- @EventHandler
+ @EventHandler(priority = EventPriority.LOW)
public void onLogin(PlayerLoginEvent e) {
if (PacketEvents.getSettings().shouldInjectEarly()) {
assert getAPI().packetManager.tinyProtocol != null;
@@ -228,20 +230,14 @@ public void onLogin(PlayerLoginEvent e) {
}
}
- @EventHandler
+ @EventHandler(priority = EventPriority.LOW)
public void onJoin(final PlayerJoinEvent e) {
- if (!VersionLookupUtils.hasHandledLoadedDependencies()) {
- VersionLookupUtils.handleLoadedDependencies();
+ if(PacketEvents.getAPI().getServerUtils().getVersion() == ServerVersion.v_1_7_10) {
+ Object channel = NMSUtils.getChannel(e.getPlayer());
+ ClientVersion version = ClientVersion.getClientVersion(ProtocolVersionAccessor_v_1_7.getProtocolVersion(e.getPlayer()));
+ PacketEvents.getAPI().getPlayerUtils().clientVersionsMap.put(channel, version);
}
- Object channel = NMSUtils.getChannel(e.getPlayer());
//Waiting for the BungeeCord server to send their plugin message with your version,
- //So we leave bungee alone
- if (!PacketEvents.getAPI().getServerUtils().isBungeeCordEnabled()) {
- if (VersionLookupUtils.isDependencyAvailable()) {
- ClientVersion version = ClientVersion.getClientVersion(VersionLookupUtils.getProtocolVersion(e.getPlayer()));
- PacketEvents.getAPI().getPlayerUtils().clientVersionsMap.put(channel, version);
- }
- }
if (!PacketEvents.getSettings().shouldInjectEarly()) {
if (getAPI().packetManager.canInject(e.getPlayer())) {
PacketEvents.getAPI().packetManager.injectPlayer(e.getPlayer());
@@ -250,7 +246,7 @@ public void onJoin(final PlayerJoinEvent e) {
}
- @EventHandler
+ @EventHandler(priority = EventPriority.HIGHEST)
public void onQuit(final PlayerQuitEvent e) {
PacketEvents.getAPI().getPlayerUtils().clientVersionsMap.remove(e.getPlayer().getUniqueId());
}
diff --git a/src/main/java/io/github/retrooper/packetevents/bungee/BungeePluginMessageListener.java b/src/main/java/io/github/retrooper/packetevents/bungee/BungeePluginMessageListener.java
index d2ddcc9513..20fd028ba9 100644
--- a/src/main/java/io/github/retrooper/packetevents/bungee/BungeePluginMessageListener.java
+++ b/src/main/java/io/github/retrooper/packetevents/bungee/BungeePluginMessageListener.java
@@ -35,7 +35,7 @@
import java.util.UUID;
public class BungeePluginMessageListener implements PluginMessageListener {
- public static String tagName = "packetevents";
+ public static String tagName = "packetevents:channel";
@Override
public void onPluginMessageReceived(String tag, Player player, byte[] bytes) {
diff --git a/src/main/java/io/github/retrooper/packetevents/event/PacketListener.java b/src/main/java/io/github/retrooper/packetevents/event/PacketListener.java
index fb9c5a7bcc..cea782d061 100644
--- a/src/main/java/io/github/retrooper/packetevents/event/PacketListener.java
+++ b/src/main/java/io/github/retrooper/packetevents/event/PacketListener.java
@@ -28,5 +28,6 @@
* A Packet listener.
* Implement this interface in your listeners.
*/
+@Deprecated
public interface PacketListener {
}
diff --git a/src/main/java/io/github/retrooper/packetevents/utils/protocolsupport/ProtocolSupportAPIAccessor.java b/src/main/java/io/github/retrooper/packetevents/event/PacketListenerDynamic.java
similarity index 55%
rename from src/main/java/io/github/retrooper/packetevents/utils/protocolsupport/ProtocolSupportAPIAccessor.java
rename to src/main/java/io/github/retrooper/packetevents/event/PacketListenerDynamic.java
index 0f390819c3..9b469d6df2 100644
--- a/src/main/java/io/github/retrooper/packetevents/utils/protocolsupport/ProtocolSupportAPIAccessor.java
+++ b/src/main/java/io/github/retrooper/packetevents/event/PacketListenerDynamic.java
@@ -22,13 +22,44 @@
* SOFTWARE.
*/
-package io.github.retrooper.packetevents.utils.protocolsupport;
+package io.github.retrooper.packetevents.event;
-import org.bukkit.entity.Player;
-import protocolsupport.api.ProtocolSupportAPI;
+import io.github.retrooper.packetevents.event.impl.*;
-class ProtocolSupportAPIAccessor {
- public static int getProtocolVersion(final Player player) {
- return ProtocolSupportAPI.getProtocolVersion(player).getId();
+public abstract class PacketListenerDynamic {
+ private final byte priority;
+ public PacketListenerDynamic(final byte priority) {
+ this.priority = priority;
+ }
+
+ public final byte getPriority() {
+ return priority;
+ }
+
+ public void onPacketStatus(PacketStatusEvent event) {
+ }
+
+ public void onPacketLogin(PacketLoginEvent event) {
+ }
+
+ public void onPacketReceive(PacketReceiveEvent event) {
+ }
+
+ public void onPacketSend(PacketSendEvent event) {
+ }
+
+ public void onPostPacketReceive(PostPacketReceiveEvent event) {
+ }
+
+ public void onPostPacketSend(PostPacketSendEvent event) {
+ }
+
+ public void onPlayerInject(PlayerInjectEvent event) {
+ }
+
+ public void onPlayerEject(PlayerEjectEvent event) {
+ }
+
+ public void onPacketEvent(PacketEvent event) {
}
}
diff --git a/src/main/java/io/github/retrooper/packetevents/event/annotation/PacketHandler.java b/src/main/java/io/github/retrooper/packetevents/event/annotation/PacketHandler.java
index f571256fa2..13cf7cf4b8 100644
--- a/src/main/java/io/github/retrooper/packetevents/event/annotation/PacketHandler.java
+++ b/src/main/java/io/github/retrooper/packetevents/event/annotation/PacketHandler.java
@@ -26,14 +26,10 @@
import io.github.retrooper.packetevents.event.priority.PacketEventPriority;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import java.lang.annotation.*;
-@Target(ElementType.METHOD)
+@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
-
public @interface PacketHandler {
byte priority() default PacketEventPriority.NORMAL;
}
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 91532e3b18..7b6eb09351 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
@@ -24,99 +24,57 @@
package io.github.retrooper.packetevents.event.manager;
-import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.event.PacketEvent;
import io.github.retrooper.packetevents.event.PacketListener;
-import io.github.retrooper.packetevents.event.annotation.PacketHandler;
-import io.github.retrooper.packetevents.event.eventtypes.CancellableEvent;
-import io.github.retrooper.packetevents.event.impl.*;
-import io.github.retrooper.packetevents.event.priority.PacketEventPriority;
-import io.github.retrooper.packetevents.utils.protocollib.ProtocolLibAPIListener;
-import io.github.retrooper.packetevents.utils.protocollib.ProtocolLibUtils;
-
-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.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
+import io.github.retrooper.packetevents.event.PacketListenerDynamic;
public final class EventManager {
- private final Map> staticRegisteredMethods = new HashMap<>();
- public void callEvent(final PacketEvent e) {
- //STATIC LISTENERS
- for (final PacketListener listener : staticRegisteredMethods.keySet()) {
- List methods = staticRegisteredMethods.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)) {
+ private final EventManagerLegacy legacyEventManager = new EventManagerLegacy();
+ private final EventManagerDynamic dynamicEventManager = new EventManagerDynamic();
- PacketHandler annotation = method.getAnnotation(PacketHandler.class);
- try {
- method.invoke(listener, e);
- } 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();
- }
- }
- }
- }
- }
+ public void callEvent(PacketEvent event) {
+ dynamicEventManager.callEvent(event);
+ legacyEventManager.callEvent(event);
}
- public void registerListener(final PacketListener listener) {
- final List methods = new ArrayList<>();
- for (final Method m : listener.getClass().getDeclaredMethods()) {
- if (!m.isAccessible()) {
- m.setAccessible(true);
- }
- if (m.isAnnotationPresent(PacketHandler.class)
- && m.getParameterTypes().length == 1) {
- methods.add(m);
- }
- }
+ @Deprecated
+ public void registerListener(PacketListener listener) {
+ legacyEventManager.registerListener(listener);
+ }
- if (!methods.isEmpty()) {
- if (ProtocolLibUtils.isAvailable()
- && PacketEvents.getSettings().shouldUseProtocolLibIfAvailable()) {
- ProtocolLibAPIListener.registerProtocolLibListener(listener, methods);
- } else {
- staticRegisteredMethods.put(listener, methods);
- }
- }
+ @Deprecated
+ public void registerListeners(PacketListener... listeners) {
+ legacyEventManager.registerListeners(listeners);
}
- public void registerListeners(final PacketListener... listeners) {
- for (final PacketListener listener : listeners) {
- registerListener(listener);
- }
+ @Deprecated
+ public void unregisterListener(PacketListener listener) {
+ legacyEventManager.unregisterListener(listener);
}
- public void unregisterListener(final PacketListener e) {
- staticRegisteredMethods.remove(e);
+ @Deprecated
+ public void unregisterListeners(PacketListener... listeners) {
+ legacyEventManager.unregisterListeners(listeners);
}
- public void unregisterListeners(final PacketListener... listeners) {
- for (final PacketListener listener : listeners) {
- unregisterListener(listener);
- }
+ public void registerListener(PacketListenerDynamic listener) {
+ dynamicEventManager.registerListener(listener);
}
- public void unregisterAllListeners() {
- staticRegisteredMethods.clear();
+ public void registerListeners(PacketListenerDynamic... listeners) {
+ dynamicEventManager.registerListeners(listeners);
+ }
+
+ public void unregisterListener(PacketListenerDynamic listener) {
+ dynamicEventManager.unregisterListener(listener);
+ }
+
+ public void unregisterListeners(PacketListenerDynamic... listeners) {
+ dynamicEventManager.unregisterListeners(listeners);
}
- public boolean isRegistered(final PacketListener listener) {
- return staticRegisteredMethods.containsKey(listener);
+ public void unregisterAllListeners() {
+ dynamicEventManager.unregisterAllListeners();
+ legacyEventManager.unregisterAllListeners();
}
}
diff --git a/src/main/java/io/github/retrooper/packetevents/event/manager/EventManagerDynamic.java b/src/main/java/io/github/retrooper/packetevents/event/manager/EventManagerDynamic.java
new file mode 100644
index 0000000000..ca8fdb6cfa
--- /dev/null
+++ b/src/main/java/io/github/retrooper/packetevents/event/manager/EventManagerDynamic.java
@@ -0,0 +1,120 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2020 retrooper
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package io.github.retrooper.packetevents.event.manager;
+
+import io.github.retrooper.packetevents.event.PacketEvent;
+import io.github.retrooper.packetevents.event.PacketListenerDynamic;
+import io.github.retrooper.packetevents.event.eventtypes.CancellableEvent;
+import io.github.retrooper.packetevents.event.impl.*;
+import io.github.retrooper.packetevents.event.priority.PacketEventPriority;
+import io.github.retrooper.packetevents.exceptions.PacketEventsMethodInvokeException;
+import io.github.retrooper.packetevents.utils.reflection.ClassUtil;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+class EventManagerDynamic {
+ private final Map> map = new HashMap<>();
+
+ public void callEvent(PacketEvent event) {
+ boolean isCancelled = false;
+ for (byte i = PacketEventPriority.LOWEST; i <= PacketEventPriority.MONITOR; i++) {
+ if (map.get(i) != null) {
+ for (PacketListenerDynamic listener : map.get(i)) {
+ try {
+ listener.onPacketEvent(event);
+ if (event instanceof PacketStatusEvent) {
+ listener.onPacketStatus((PacketStatusEvent) event);
+ } else if (event instanceof PacketLoginEvent) {
+ listener.onPacketLogin((PacketLoginEvent) event);
+ } else if (event instanceof PacketReceiveEvent) {
+ listener.onPacketReceive((PacketReceiveEvent) event);
+ } else if (event instanceof PacketSendEvent) {
+ listener.onPacketSend((PacketSendEvent) event);
+ } else if (event instanceof PostPacketReceiveEvent) {
+ listener.onPostPacketReceive((PostPacketReceiveEvent) event);
+ } else if (event instanceof PostPacketSendEvent) {
+ listener.onPostPacketSend((PostPacketSendEvent) event);
+ } else if (event instanceof PlayerInjectEvent) {
+ listener.onPlayerInject((PlayerInjectEvent) event);
+ } else if (event instanceof PlayerEjectEvent) {
+ listener.onPlayerEject((PlayerEjectEvent) event);
+ }
+
+ } catch (Exception ex) {
+ throw new PacketEventsMethodInvokeException("PacketEvents " +
+ "failed to call an event method in the " +
+ "dynamic packet listener. Event type: "
+ + ClassUtil.getClassSimpleName(event.getClass()));
+ }
+
+ if (event instanceof CancellableEvent) {
+ CancellableEvent ce = (CancellableEvent) event;
+ isCancelled = ce.isCancelled();
+ }
+ }
+ }
+ }
+ if (event instanceof CancellableEvent) {
+ CancellableEvent ce = (CancellableEvent) event;
+ ce.setCancelled(isCancelled);
+ }
+ }
+
+ public void registerListener(PacketListenerDynamic listener) {
+ List listeners = map.get(listener.getPriority());
+ if (listeners == null) {
+ map.put(listener.getPriority(), new ArrayList<>());
+ listeners = map.get(listener.getPriority());
+ }
+ listeners.add(listener);
+ }
+
+ public void registerListeners(PacketListenerDynamic... listeners) {
+ for (PacketListenerDynamic listener : listeners) {
+ registerListener(listener);
+ }
+ }
+
+ public void unregisterListener(PacketListenerDynamic listener) {
+ List listeners = map.get(listener.getPriority());
+ if (listeners == null) {
+ return;
+ }
+ listeners.remove(listener);
+ }
+
+ public void unregisterListeners(PacketListenerDynamic... listeners) {
+ for (PacketListenerDynamic listener : listeners) {
+ unregisterListener(listener);
+ }
+ }
+
+ public void unregisterAllListeners() {
+ map.clear();
+ }
+}
diff --git a/src/main/java/io/github/retrooper/packetevents/event/manager/EventManagerLegacy.java b/src/main/java/io/github/retrooper/packetevents/event/manager/EventManagerLegacy.java
new file mode 100644
index 0000000000..57209048ce
--- /dev/null
+++ b/src/main/java/io/github/retrooper/packetevents/event/manager/EventManagerLegacy.java
@@ -0,0 +1,112 @@
+/*
+ * MIT License
+ *
+ * Copyright (c) 2020 retrooper
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package io.github.retrooper.packetevents.event.manager;
+
+import io.github.retrooper.packetevents.event.PacketEvent;
+import io.github.retrooper.packetevents.event.PacketListener;
+import io.github.retrooper.packetevents.event.annotation.PacketHandler;
+import io.github.retrooper.packetevents.event.eventtypes.CancellableEvent;
+import io.github.retrooper.packetevents.event.priority.PacketEventPriority;
+
+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.Map;
+
+class EventManagerLegacy {
+ private final Map> staticRegisteredMethods = new HashMap<>();
+ public void callEvent(final PacketEvent e) {
+ boolean isCancelled = false;
+ byte eventPriority = PacketEventPriority.LOWEST;
+ //STATIC LISTENERS
+ for (final PacketListener listener : staticRegisteredMethods.keySet()) {
+ List methods = staticRegisteredMethods.get(listener);
+
+ for (Method method : methods) {
+ Class> parameterType = method.getParameterTypes()[0];
+ if (parameterType.equals(PacketEvent.class)
+ || parameterType.isInstance(e)) {
+
+ PacketHandler annotation = method.getAnnotation(PacketHandler.class);
+ try {
+ method.invoke(listener, e);
+ } catch (IllegalAccessException | InvocationTargetException ex) {
+ ex.printStackTrace();
+ }
+ if (e instanceof CancellableEvent) {
+ CancellableEvent ce = (CancellableEvent) e;
+ if (annotation.priority() >= eventPriority) {
+ eventPriority = annotation.priority();
+ isCancelled = ce.isCancelled();
+ }
+ }
+ }
+ }
+ }
+ if(e instanceof CancellableEvent) {
+ CancellableEvent ce = (CancellableEvent)e;
+ ce.setCancelled(isCancelled);
+ }
+ }
+
+ public void registerListener(final PacketListener listener) {
+ final List methods = new ArrayList<>();
+ for (final Method m : listener.getClass().getDeclaredMethods()) {
+ if (!m.isAccessible()) {
+ m.setAccessible(true);
+ }
+ if (m.isAnnotationPresent(PacketHandler.class)
+ && m.getParameterTypes().length == 1) {
+ methods.add(m);
+ }
+ }
+
+ if (!methods.isEmpty()) {
+ staticRegisteredMethods.put(listener, methods);
+ }
+ }
+
+ public void registerListeners(final PacketListener... listeners) {
+ for (final PacketListener listener : listeners) {
+ registerListener(listener);
+ }
+ }
+
+ public void unregisterListener(final PacketListener e) {
+ staticRegisteredMethods.remove(e);
+ }
+
+ public void unregisterListeners(final PacketListener... listeners) {
+ for (final PacketListener listener : listeners) {
+ unregisterListener(listener);
+ }
+ }
+
+ public void unregisterAllListeners() {
+ staticRegisteredMethods.clear();
+ }
+}
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 2e8e4733bb..13a9cb3f59 100644
--- a/src/main/java/io/github/retrooper/packetevents/example/MainExample.java
+++ b/src/main/java/io/github/retrooper/packetevents/example/MainExample.java
@@ -25,19 +25,10 @@
package io.github.retrooper.packetevents.example;
import io.github.retrooper.packetevents.PacketEvents;
-import io.github.retrooper.packetevents.event.PacketListener;
-import io.github.retrooper.packetevents.event.annotation.PacketHandler;
-import io.github.retrooper.packetevents.event.impl.PacketReceiveEvent;
-import io.github.retrooper.packetevents.event.impl.PlayerEjectEvent;
-import io.github.retrooper.packetevents.event.impl.PlayerInjectEvent;
-import io.github.retrooper.packetevents.packettype.PacketType;
-import io.github.retrooper.packetevents.packetwrappers.in.chat.WrappedPacketInChat;
-import io.github.retrooper.packetevents.packetwrappers.out.helditemslot.WrappedPacketOutHeldItemSlot;
import io.github.retrooper.packetevents.utils.server.ServerVersion;
-import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
-public class MainExample extends JavaPlugin implements PacketListener {
+public class MainExample extends JavaPlugin {
@Override
public void onLoad() {
@@ -46,10 +37,9 @@ public void onLoad() {
@Override
public void onEnable() {
- PacketEvents.getSettings().injectAsync(true).ejectAsync(true).
- backupServerVersion(ServerVersion.v_1_7_10).useProtocolLibIfAvailable(true).
- checkForUpdates(true).injectEarly(true).packetHandlingThreadCount(1);
- PacketEvents.getAPI().getEventManager().registerListener(this);
+ PacketEvents.getSettings().injectAsync(true).ejectAsync(true)
+ .backupServerVersion(ServerVersion.v_1_7_10).checkForUpdates(true).injectEarly(true).
+ packetHandlingThreadCount(1);
PacketEvents.init(this);
}
diff --git a/src/main/java/io/github/retrooper/packetevents/utils/protocollib/ProtocolLibUtils.java b/src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsLoadFailureException.java
similarity index 77%
rename from src/main/java/io/github/retrooper/packetevents/utils/protocollib/ProtocolLibUtils.java
rename to src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsLoadFailureException.java
index deb71c9a27..c46cd51bc7 100644
--- a/src/main/java/io/github/retrooper/packetevents/utils/protocollib/ProtocolLibUtils.java
+++ b/src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsLoadFailureException.java
@@ -22,12 +22,14 @@
* SOFTWARE.
*/
-package io.github.retrooper.packetevents.utils.protocollib;
+package io.github.retrooper.packetevents.exceptions;
-import org.bukkit.Bukkit;
+public class PacketEventsLoadFailureException extends RuntimeException {
+ public PacketEventsLoadFailureException(String message) {
+ super(message);
+ }
-public class ProtocolLibUtils {
- public static boolean isAvailable() {
- return Bukkit.getPluginManager().isPluginEnabled("ProtocolLib");
+ public PacketEventsLoadFailureException() {
+ this("PacketEvents failed to successfully load...");
}
}
diff --git a/src/main/java/io/github/retrooper/packetevents/utils/protocolsupport/ProtocolSupportUtils.java b/src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsMethodAccessException.java
similarity index 64%
rename from src/main/java/io/github/retrooper/packetevents/utils/protocolsupport/ProtocolSupportUtils.java
rename to src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsMethodAccessException.java
index 7b67a9558c..82a4c9c59a 100644
--- a/src/main/java/io/github/retrooper/packetevents/utils/protocolsupport/ProtocolSupportUtils.java
+++ b/src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsMethodAccessException.java
@@ -22,17 +22,20 @@
* SOFTWARE.
*/
-package io.github.retrooper.packetevents.utils.protocolsupport;
+package io.github.retrooper.packetevents.exceptions;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
+import io.github.retrooper.packetevents.event.PacketListener;
+import io.github.retrooper.packetevents.utils.reflection.ClassUtil;
-public class ProtocolSupportUtils {
- public static boolean isAvailable() {
- return Bukkit.getPluginManager().isPluginEnabled("ProtocolSupport");
+import java.lang.reflect.Method;
+
+public class PacketEventsMethodAccessException extends RuntimeException {
+ public PacketEventsMethodAccessException(String message) {
+ super(message);
}
- public static int getProtocolVersion(final Player player) {
- return ProtocolSupportAPIAccessor.getProtocolVersion(player);
+ public PacketEventsMethodAccessException(Method method, PacketListener listener) {
+ this("PacketEvents failed to access the "
+ + method.getName() + " method in " + ClassUtil.getClassSimpleName(listener.getClass()));
}
}
diff --git a/src/main/java/io/github/retrooper/packetevents/utils/viaversion/ViaUtils.java b/src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsMethodInvokeException.java
similarity index 65%
rename from src/main/java/io/github/retrooper/packetevents/utils/viaversion/ViaUtils.java
rename to src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsMethodInvokeException.java
index cedb5690ea..bcb1906b41 100644
--- a/src/main/java/io/github/retrooper/packetevents/utils/viaversion/ViaUtils.java
+++ b/src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsMethodInvokeException.java
@@ -22,18 +22,20 @@
* SOFTWARE.
*/
-package io.github.retrooper.packetevents.utils.viaversion;
+package io.github.retrooper.packetevents.exceptions;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
+import io.github.retrooper.packetevents.event.PacketListener;
+import io.github.retrooper.packetevents.utils.reflection.ClassUtil;
+import java.lang.reflect.Method;
-public class ViaUtils {
- public static int getProtocolVersion(final Player player) {
- return ViaAPIAccessor.getProtocolVersion(player);
+public class PacketEventsMethodInvokeException extends RuntimeException {
+ public PacketEventsMethodInvokeException(String message) {
+ super(message);
}
- public static boolean isAvailable() {
- return Bukkit.getPluginManager().isPluginEnabled("ViaVersion");
+ public PacketEventsMethodInvokeException(Method method, PacketListener listener) {
+ this("PacketEvents failed to call the " + method.getName() + " method in "
+ + ClassUtil.getClassSimpleName(listener.getClass()));
}
}
diff --git a/src/main/java/io/github/retrooper/packetevents/utils/viaversion/ViaAPIAccessor.java b/src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsNMSCachedEntityNotFoundException.java
similarity index 73%
rename from src/main/java/io/github/retrooper/packetevents/utils/viaversion/ViaAPIAccessor.java
rename to src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsNMSCachedEntityNotFoundException.java
index 0e351a96fb..f6b2c5c2cc 100644
--- a/src/main/java/io/github/retrooper/packetevents/utils/viaversion/ViaAPIAccessor.java
+++ b/src/main/java/io/github/retrooper/packetevents/exceptions/PacketEventsNMSCachedEntityNotFoundException.java
@@ -22,19 +22,14 @@
* SOFTWARE.
*/
-package io.github.retrooper.packetevents.utils.viaversion;
+package io.github.retrooper.packetevents.exceptions;
-import org.bukkit.entity.Player;
-import us.myles.ViaVersion.api.Via;
-
-import java.util.UUID;
-
-class ViaAPIAccessor {
- public static int getProtocolVersion(final Player player) {
- return getProtocolVersion(player.getUniqueId());
+public class PacketEventsNMSCachedEntityNotFoundException extends RuntimeException {
+ public PacketEventsNMSCachedEntityNotFoundException(String message) {
+ super(message);
}
- public static int getProtocolVersion(final UUID uuid) {
- return Via.getAPI().getPlayerVersion(uuid);
+ public PacketEventsNMSCachedEntityNotFoundException(int entityID) {
+ this("PacketEvents failed to find an entity with ID " + entityID + " in NMS' entity cache map!");
}
}
diff --git a/src/main/java/io/github/retrooper/packetevents/packetmanager/PacketManager.java b/src/main/java/io/github/retrooper/packetevents/packetmanager/PacketManager.java
index 7d92a19f2d..ba53a99d47 100644
--- a/src/main/java/io/github/retrooper/packetevents/packetmanager/PacketManager.java
+++ b/src/main/java/io/github/retrooper/packetevents/packetmanager/PacketManager.java
@@ -30,16 +30,14 @@
import io.github.retrooper.packetevents.packetmanager.tinyprotocol.TinyProtocol;
import io.github.retrooper.packetevents.packettype.PacketType;
import io.github.retrooper.packetevents.packetwrappers.login.in.WrappedPacketLoginHandshake;
-import io.github.retrooper.packetevents.utils.nms.NMSUtils;
import io.github.retrooper.packetevents.utils.player.ClientVersion;
import io.github.retrooper.packetevents.utils.reflection.ClassUtil;
-import io.github.retrooper.packetevents.utils.versionlookup.VersionLookupUtils;
+import io.github.retrooper.packetevents.utils.server.ServerVersion;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.util.HashMap;
import java.util.UUID;
-import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicInteger;
public class PacketManager {
@@ -269,7 +267,7 @@ private void interceptRead(PacketReceiveEvent event) {
long timestamp = keepAliveMap.getOrDefault(uuid, event.getTimestamp());
long currentTime = event.getTimestamp();
long ping = currentTime - timestamp;
- long smoothedPing = ((PacketEvents.getAPI().getPlayerUtils().getSmoothedPing(event.getPlayer()) * 3) + ping) / 4;
+ long smoothedPing = (PacketEvents.getAPI().getPlayerUtils().getSmoothedPing(event.getPlayer()) * 3 + ping) / 4;
PacketEvents.getAPI().getPlayerUtils().playerPingMap.put(uuid, (short) ping);
PacketEvents.getAPI().getPlayerUtils().playerSmoothedPingMap.put(uuid, (short) smoothedPing);
}
@@ -282,13 +280,12 @@ private void interceptWrite(PacketSendEvent event) {
}
private void interceptLogin(PacketLoginEvent event) {
- if (event.getPacketId() == PacketType.Login.HANDSHAKE) {
- if (!VersionLookupUtils.isDependencyAvailable()) {
+ if (event.getPacketId() == PacketType.Login.HANDSHAKE &&
+ PacketEvents.getAPI().getServerUtils().getVersion() != ServerVersion.v_1_7_10) {
WrappedPacketLoginHandshake handshake = new WrappedPacketLoginHandshake(event.getNMSPacket());
int protocolVersion = handshake.getProtocolVersion();
ClientVersion version = ClientVersion.getClientVersion(protocolVersion);
PacketEvents.getAPI().getPlayerUtils().clientVersionsMap.put(event.getChannel(), version);
- }
}
}
diff --git a/src/main/java/io/github/retrooper/packetevents/packetmanager/tinyprotocol/TinyProtocol7.java b/src/main/java/io/github/retrooper/packetevents/packetmanager/tinyprotocol/TinyProtocol7.java
index 926c66b79f..7e7d597d3c 100644
--- a/src/main/java/io/github/retrooper/packetevents/packetmanager/tinyprotocol/TinyProtocol7.java
+++ b/src/main/java/io/github/retrooper/packetevents/packetmanager/tinyprotocol/TinyProtocol7.java
@@ -1,7 +1,6 @@
package io.github.retrooper.packetevents.packetmanager.tinyprotocol;
import io.github.retrooper.packetevents.PacketEvents;
-import io.github.retrooper.packetevents.packetmanager.netty.NettyPacketManager;
import io.github.retrooper.packetevents.packetmanager.tinyprotocol.Reflection.FieldAccessor;
import io.github.retrooper.packetevents.packetmanager.tinyprotocol.Reflection.MethodInvoker;
import net.minecraft.util.com.google.common.collect.Lists;
@@ -10,12 +9,12 @@
import net.minecraft.util.io.netty.channel.*;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
-import java.util.*;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
@@ -403,11 +402,11 @@ public void uninjectPlayerAsync(Player player) {
}
public void ejectChannelSync(Object ch) {
- uninjectChannel((Channel)ch);
+ uninjectChannel((Channel) ch);
}
public void ejectChannelAsync(Object ch) {
- uninjectChannelAsync((Channel)ch);
+ uninjectChannelAsync((Channel) ch);
}
/**
@@ -471,11 +470,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
final Channel channel = ctx.channel();
handleLoginStart(channel, msg);
- try {
- msg = onPacketInAsync(player, channel, msg);
- } catch (Exception e) {
- plugin.getLogger().log(Level.SEVERE, "Error in onPacketInAsync().", e);
- }
+ msg = onPacketInAsync(player, channel, msg);
if (msg != null) {
super.channelRead(ctx, msg);
@@ -485,12 +480,7 @@ public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
- try {
- msg = onPacketOutAsync(player, ctx.channel(), msg);
- } catch (Exception e) {
- plugin.getLogger().log(Level.SEVERE, "Error in onPacketOutAsync().", e);
- }
-
+ msg = onPacketOutAsync(player, ctx.channel(), msg);
if (msg != null) {
super.write(ctx, msg, promise);
PacketEvents.getAPI().packetManager.postWrite(player, msg);
diff --git a/src/main/java/io/github/retrooper/packetevents/packetmanager/tinyprotocol/TinyProtocol8.java b/src/main/java/io/github/retrooper/packetevents/packetmanager/tinyprotocol/TinyProtocol8.java
index ff9874e6de..3c115edeb1 100644
--- a/src/main/java/io/github/retrooper/packetevents/packetmanager/tinyprotocol/TinyProtocol8.java
+++ b/src/main/java/io/github/retrooper/packetevents/packetmanager/tinyprotocol/TinyProtocol8.java
@@ -4,7 +4,6 @@
import com.google.common.collect.MapMaker;
import com.mojang.authlib.GameProfile;
import io.github.retrooper.packetevents.PacketEvents;
-import io.github.retrooper.packetevents.packetmanager.netty.NettyPacketManager;
import io.github.retrooper.packetevents.packetmanager.tinyprotocol.Reflection.FieldAccessor;
import io.github.retrooper.packetevents.packetmanager.tinyprotocol.Reflection.MethodInvoker;
import io.netty.channel.*;
@@ -165,9 +164,9 @@ private void registerChannelHandler() {
boolean looking = true;
// We need to synchronize against this list
- if(getNetworkMarkers != null) {
- networkManagers = (List