Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
787df36fe0 | ||
|
|
a59ea40e12 | ||
|
|
fdb3a23acc | ||
|
|
60d24ac3c1 | ||
|
|
7634540bd7 | ||
|
|
0a475e4242 | ||
|
|
ff3b66b22e |
No files matched your search
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>io.github.retrooper</groupId>
|
||||
<artifactId>packetevents</artifactId>
|
||||
<version>1.6.5</version>
|
||||
<version>1.6.6</version>
|
||||
|
||||
<!-- You can build the project with this: "mvn clean compile assembly:single" -->
|
||||
<build>
|
||||
|
||||
@@ -54,7 +54,7 @@ public final class PacketEvents implements Listener {
|
||||
private static final PacketEvents instance = new PacketEvents();
|
||||
private static final PacketEventsSettings settings = new PacketEventsSettings();
|
||||
private static final ArrayList<Plugin> plugins = new ArrayList<Plugin>(1);
|
||||
private static boolean hasLoaded, hasStarted;
|
||||
private static boolean hasLoaded, isStarted;
|
||||
|
||||
/**
|
||||
* This loads the PacketEvents API.
|
||||
@@ -103,7 +103,7 @@ public final class PacketEvents implements Listener {
|
||||
* Loads PacketEvents if you haven't already.
|
||||
*
|
||||
* Registering:
|
||||
* Registers this class as a Bukkit listener to inject/uninject players.
|
||||
* Registers this class as a Bukkit listener to inject/eject players.
|
||||
*
|
||||
* @param pl JavaPlugin instance
|
||||
*/
|
||||
@@ -111,7 +111,7 @@ public final class PacketEvents implements Listener {
|
||||
if (!hasLoaded) {
|
||||
load();
|
||||
}
|
||||
if (!hasStarted) {
|
||||
if (!isStarted) {
|
||||
plugins.add(pl);
|
||||
//Register Bukkit listener
|
||||
Bukkit.getPluginManager().registerEvents(instance, plugins.get(0));
|
||||
@@ -119,7 +119,7 @@ public final class PacketEvents implements Listener {
|
||||
for (final Player p : Bukkit.getOnlinePlayers()) {
|
||||
getAPI().getPlayerUtils().injectPlayer(p);
|
||||
}
|
||||
hasStarted = true;
|
||||
isStarted = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -137,11 +137,13 @@ public final class PacketEvents implements Listener {
|
||||
*
|
||||
*/
|
||||
public static void stop() {
|
||||
if (hasStarted) {
|
||||
if (isStarted) {
|
||||
for (final Player p : Bukkit.getOnlinePlayers()) {
|
||||
getAPI().getPlayerUtils().ejectPlayer(p);
|
||||
}
|
||||
getAPI().getEventManager().unregisterAllListeners();
|
||||
|
||||
isStarted = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,8 +151,13 @@ public final class PacketEvents implements Listener {
|
||||
return hasLoaded;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static boolean hasStarted() {
|
||||
return hasStarted;
|
||||
return isStarted;
|
||||
}
|
||||
|
||||
public static boolean isInitialized() {
|
||||
return isStarted;
|
||||
}
|
||||
|
||||
public static PacketEventsAPI getAPI() {
|
||||
@@ -174,7 +181,7 @@ public final class PacketEvents implements Listener {
|
||||
return settings;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||
@EventHandler
|
||||
public void onJoin(final PlayerJoinEvent e) {
|
||||
if(!VersionLookupUtils.hasLoaded()) {
|
||||
VersionLookupUtils.load();
|
||||
@@ -184,13 +191,13 @@ public final class PacketEvents implements Listener {
|
||||
PacketEvents.getAPI().getPlayerUtils().injectPlayer(e.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||
@EventHandler
|
||||
public void onQuit(final PlayerQuitEvent e) {
|
||||
PacketEvents.getAPI().getPlayerUtils().ejectPlayer(e.getPlayer());
|
||||
PacketEvents.getAPI().getPlayerUtils().clientVersionsMap.remove(e.getPlayer().getUniqueId());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
@EventHandler
|
||||
public void onMove(final PlayerMoveEvent e) {
|
||||
BukkitMoveEvent moveEvent = new BukkitMoveEvent(e);
|
||||
PacketEvents.getAPI().getEventManager().callEvent(moveEvent);
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
package io.github.retrooper.packetevents.annotations;
|
||||
|
||||
import io.github.retrooper.packetevents.enums.EventSynchronization;
|
||||
import io.github.retrooper.packetevents.enums.PacketEventPriority;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
@@ -36,5 +37,8 @@ import java.lang.annotation.Target;
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
|
||||
public @interface PacketHandler {
|
||||
@Deprecated
|
||||
EventSynchronization synchronization() default EventSynchronization.NORMAL;
|
||||
|
||||
byte priority() default PacketEventPriority.NORMAL;
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
/*
|
||||
* 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.enums;
|
||||
|
||||
public interface PacketEventPriority {
|
||||
byte LOWEST = 0;
|
||||
byte LOW = 1;
|
||||
byte NORMAL = 2;
|
||||
byte HIGH = 3;
|
||||
byte HIGHEST = 4;
|
||||
byte MONITOR = 5;
|
||||
}
|
||||
@@ -26,8 +26,11 @@ package io.github.retrooper.packetevents.event.manager;
|
||||
|
||||
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.CancellableEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketListener;
|
||||
import io.github.retrooper.packetevents.utils.protocollib.ProtocolLibListener;
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
@@ -43,22 +46,38 @@ public final class EventManager {
|
||||
for (final PacketListener listener : registeredMethods.keySet()) {
|
||||
//Annotated methods
|
||||
final List<Method> methods = registeredMethods.get(listener);
|
||||
for (final Method method : methods) {
|
||||
final List<Boolean> isCancellingList = new ArrayList<Boolean>(methods.size());
|
||||
|
||||
int highestPriorityMethodListenerIndex = 0;
|
||||
for(int i = 0; i < methods.size(); i++) {
|
||||
Method method = methods.get(i);
|
||||
final Class<?> parameterType = method.getParameterTypes()[0];
|
||||
if (parameterType.equals(PacketEvent.class)
|
||||
|| parameterType.isInstance(e)) {
|
||||
final PacketHandler annotation = method.getAnnotation(PacketHandler.class);
|
||||
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() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
method.invoke(listener, e);
|
||||
if(e instanceof CancellableEvent) {
|
||||
isCancellingList.add(((CancellableEvent) e).isCancelled());
|
||||
}
|
||||
} catch (IllegalAccessException | InvocationTargetException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
switch (annotation.synchronization()) {
|
||||
case FORCE_ASYNC:
|
||||
Bukkit.getScheduler().runTaskAsynchronously(PacketEvents.getPlugin(), invokeMethod);
|
||||
@@ -72,23 +91,41 @@ public final class EventManager {
|
||||
} catch (IllegalAccessException | InvocationTargetException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
isCancellingList.add(((CancellableEvent)e).isCancelled());
|
||||
break;
|
||||
}
|
||||
|
||||
//Last iteration
|
||||
if(i + 1 == methods.size()) {
|
||||
if(e instanceof CancellableEvent) {
|
||||
CancellableEvent cancellable = (CancellableEvent)e;
|
||||
cancellable.setCancelled(isCancellingList.get(highestPriorityMethodListenerIndex));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void registerListener(final PacketListener e) {
|
||||
final List<Method> methods = new ArrayList<Method>();
|
||||
for (final Method m : e.getClass().getDeclaredMethods()) {
|
||||
public void registerListener(final PacketListener listener) {
|
||||
if (ProtocolLibListener.isProtocolLibPresent() == ProtocolLibListener.ProtocolLibPresent.UNKNOWN) {
|
||||
ProtocolLibListener.load();
|
||||
}
|
||||
|
||||
final List<Method> methods = new ArrayList<Method>();
|
||||
for (final Method m : listener.getClass().getDeclaredMethods()) {
|
||||
if (m.isAnnotationPresent(PacketHandler.class)
|
||||
&& m.getParameterTypes().length == 1) {
|
||||
methods.add(m);
|
||||
}
|
||||
}
|
||||
|
||||
if (!methods.isEmpty()) {
|
||||
registeredMethods.put(e, methods);
|
||||
if (ProtocolLibListener.isProtocolLibPresent() == ProtocolLibListener.ProtocolLibPresent.PRESENT) {
|
||||
ProtocolLibListener.registerProtocolLibListener(listener, methods);
|
||||
} else {
|
||||
registeredMethods.put(listener, methods);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,11 +25,7 @@
|
||||
package io.github.retrooper.packetevents.example;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.annotations.PacketHandler;
|
||||
import io.github.retrooper.packetevents.event.PacketListener;
|
||||
import io.github.retrooper.packetevents.event.impl.PacketReceiveEvent;
|
||||
import io.github.retrooper.packetevents.packet.PacketType;
|
||||
import io.github.retrooper.packetevents.packetwrappers.in.useentity.WrappedPacketInUseEntity;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
public class MainExample extends JavaPlugin implements PacketListener {
|
||||
@@ -45,7 +41,7 @@ public class MainExample extends JavaPlugin implements PacketListener {
|
||||
PacketEvents.getSettings().setIdentifier("official_api");
|
||||
|
||||
PacketEvents.init(this);
|
||||
// PacketEvents.getAPI().getEventManager().registerListener(this);
|
||||
//PacketEvents.getAPI().getEventManager().registerListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.utils.versionlookup;
|
||||
package io.github.retrooper.packetevents.utils.protocollib;
|
||||
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import org.bukkit.entity.Player;
|
||||
+146
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* 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.utils.protocollib;
|
||||
|
||||
import com.comphenix.protocol.PacketType;
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import com.comphenix.protocol.events.ListenerPriority;
|
||||
import com.comphenix.protocol.events.PacketAdapter;
|
||||
import com.comphenix.protocol.events.PacketEvent;
|
||||
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 java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.List;
|
||||
|
||||
public class ProtocolLibListener {
|
||||
public enum ProtocolLibPresent {
|
||||
UNKNOWN, NOT_PRESENT, PRESENT
|
||||
}
|
||||
|
||||
private static ProtocolLibPresent plibPresent = ProtocolLibPresent.UNKNOWN;
|
||||
|
||||
|
||||
public static void load() {
|
||||
if (ProtocolLibUtils.isAvailable()) {
|
||||
plibPresent = ProtocolLibPresent.PRESENT;
|
||||
}
|
||||
}
|
||||
|
||||
public static ProtocolLibPresent isProtocolLibPresent() {
|
||||
return plibPresent;
|
||||
}
|
||||
|
||||
public static void registerProtocolLibListener(PacketListener listener, List<Method> methods) {
|
||||
if (plibPresent == ProtocolLibPresent.PRESENT) {
|
||||
for (Method m : methods) {
|
||||
if (m.getParameterTypes()[0].equals(PacketReceiveEvent.class)) {
|
||||
PacketHandler annot = m.getAnnotation(PacketHandler.class);
|
||||
ListenerPriority priority;
|
||||
switch (annot.priority()) {
|
||||
case PacketEventPriority.LOWEST:
|
||||
priority = ListenerPriority.LOWEST;
|
||||
break;
|
||||
case PacketEventPriority.LOW:
|
||||
priority = ListenerPriority.LOW;
|
||||
break;
|
||||
case PacketEventPriority.HIGH:
|
||||
priority = ListenerPriority.HIGH;
|
||||
break;
|
||||
case PacketEventPriority.HIGHEST:
|
||||
priority = ListenerPriority.HIGHEST;
|
||||
break;
|
||||
case PacketEventPriority.MONITOR:
|
||||
priority = ListenerPriority.MONITOR;
|
||||
break;
|
||||
default:
|
||||
priority = ListenerPriority.NORMAL;
|
||||
break;
|
||||
}
|
||||
ProtocolLibrary.getProtocolManager().
|
||||
addPacketListener(new PacketAdapter(PacketEvents.getPlugins().get(0),
|
||||
priority, PacketType.Play.Client.getInstance().values()) {
|
||||
@Override
|
||||
public void onPacketReceiving(PacketEvent event) {
|
||||
event.setReadOnly(false);
|
||||
PacketReceiveEvent receiveEvent = new PacketReceiveEvent(event.getPlayer(), event.getPacket().getHandle());
|
||||
try {
|
||||
m.invoke(listener, receiveEvent);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
event.setCancelled(receiveEvent.isCancelled());
|
||||
}
|
||||
});
|
||||
} else if (m.getParameterTypes()[0].equals(PacketSendEvent.class)) {
|
||||
PacketHandler annot = m.getAnnotation(PacketHandler.class);
|
||||
ListenerPriority priority;
|
||||
switch (annot.priority()) {
|
||||
case PacketEventPriority.LOWEST:
|
||||
priority = ListenerPriority.LOWEST;
|
||||
break;
|
||||
case PacketEventPriority.LOW:
|
||||
priority = ListenerPriority.LOW;
|
||||
break;
|
||||
case PacketEventPriority.HIGH:
|
||||
priority = ListenerPriority.HIGH;
|
||||
break;
|
||||
case PacketEventPriority.HIGHEST:
|
||||
priority = ListenerPriority.HIGHEST;
|
||||
break;
|
||||
case PacketEventPriority.MONITOR:
|
||||
priority = ListenerPriority.MONITOR;
|
||||
break;
|
||||
default:
|
||||
priority = ListenerPriority.NORMAL;
|
||||
break;
|
||||
}
|
||||
ProtocolLibrary.getProtocolManager().
|
||||
addPacketListener(new PacketAdapter(PacketEvents.getPlugins().get(0),
|
||||
priority, PacketType.Play.Server.getInstance().values()) {
|
||||
@Override
|
||||
public void onPacketSending(PacketEvent event) {
|
||||
event.setReadOnly(false);
|
||||
PacketSendEvent sendEvent = new PacketSendEvent(event.getPlayer(), event.getPacket().getHandle());
|
||||
try {
|
||||
m.invoke(listener, sendEvent);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
event.setCancelled(sendEvent.isCancelled());
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+1
-1
@@ -22,7 +22,7 @@
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.utils.versionlookup;
|
||||
package io.github.retrooper.packetevents.utils.protocollib;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
+1
-1
@@ -22,7 +22,7 @@
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.utils.versionlookup;
|
||||
package io.github.retrooper.packetevents.utils.protocolsupport;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import protocolsupport.api.ProtocolSupportAPI;
|
||||
+1
-1
@@ -22,7 +22,7 @@
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.utils.versionlookup;
|
||||
package io.github.retrooper.packetevents.utils.protocolsupport;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
+3
@@ -26,6 +26,9 @@ package io.github.retrooper.packetevents.utils.versionlookup;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.enums.ServerVersion;
|
||||
import io.github.retrooper.packetevents.utils.protocollib.ProtocolLibUtils;
|
||||
import io.github.retrooper.packetevents.utils.protocolsupport.ProtocolSupportUtils;
|
||||
import io.github.retrooper.packetevents.utils.viaversion.ViaUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class VersionLookupUtils {
|
||||
|
||||
+1
-1
@@ -22,7 +22,7 @@
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.utils.versionlookup;
|
||||
package io.github.retrooper.packetevents.utils.viaversion;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import us.myles.ViaVersion.api.Via;
|
||||
+1
-1
@@ -22,7 +22,7 @@
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
package io.github.retrooper.packetevents.utils.versionlookup;
|
||||
package io.github.retrooper.packetevents.utils.viaversion;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
Reference in new issue
Block a user