Compare commits

...
11 Commits
Author SHA1 Message Date
purplexdev f52a05b477 1.3.6.2
* NettyPacketHandler.handlerName value set from "PacketListener" to "packet_handler" fixing all issues!
2020-06-25 22:54:30 +02:00
purplexdev 8936204849 1.3.6.1 2020-06-25 22:38:32 +02:00
purplexdev 50efff2819 Updated to 1.3.6
* Forgot to uninject on quit
2020-06-25 22:09:16 +02:00
purplexdev af325f9a62 Forgot to uninject onquit! 2020-06-25 22:08:41 +02:00
purplexdev fe29188e3f 1.3.5.2 Release, Bug fixed with position class & position look class and look class loading too late making them null! 2020-06-25 17:40:36 +02:00
purplexdev b753a98971 Issue with netty, receive and send event were mixed 2020-06-25 17:37:05 +02:00
purplexdev c73d88a7e2 Merge remote-tracking branch 'origin/master' 2020-06-25 15:13:32 +02:00
purplexdev bd872bc271 1.3.5.1
* Marked ProtocolSupport & ViaVersion as "provided" so they are not compiled into your plugin!
2020-06-25 15:13:03 +02:00
retrooper c0c03a0629 updated readme credit to release 1.3.5 2020-06-25 13:35:53 +02:00
purplexdev 18f3f135c8 Merge remote-tracking branch 'origin/master' 2020-06-25 13:16:04 +02:00
purplexdev 0304d0ac5a 1.3.5 Release STABLE!
* TinyProtocol removed
* API Size way smaller
* PlayerUninjectEvent is now called
* Version lookup methods re-added, but version lookup is only possible with ProtocolSupport or ViaVersion plugin avaialable on the server.
If you try looking up version and none of the listed plugins could be found, you will result with ClientVersion.ACCESS_FAILURE

* WrappedPacketOutAbilities sendable wrapper added
* PostPlayerInjectEvent has been deprecated, please use PlayerInjectEvent
* PlayerUninjectEvent now cancellable
* PlayerInjectEvent or PlayerUninjectEvent cancelling, will cancel the action.
* pom.xml version updated to 1.3.5
* Packet class has been deprecated, please use PacketType instead!
* Packet.isInstanceOfFlyingPacket(nmsPacket) -> PacketType.Util.isInstanceOfFlyingPacket(nmsPacket), and more instanceof functions are added in the PacketType.Util class too!
* PacketReceiveEvent#getPacket() is deprecated, please use PacketReceiveEvent#getNMSPacket()
* PacketSendEvent#getPacket() is deprecated, please use PacketSendEvent#getNMSPacket()
* PacketEvents.setShouldKickOnRestart(boolean) removed
2020-06-25 13:15:34 +02:00
25 changed files with 401 additions and 214 deletions

No files matched your search

+5 -2
View File
@@ -4,10 +4,13 @@ A lightweight spigot packetlistener & packetsender coded by retrooper.
## Credit
PacketEvents took TinyProtocol's [Reflection](https://github.com/dmulloy2/ProtocolLib/blob/master/TinyProtocol/src/main/java/com/comphenix/tinyprotocol/Reflection.java) util class.
PacketEvents uses [TinyProtocol](https://github.com/dmulloy2/ProtocolLib/blob/master/TinyProtocol)'s [Reflection](https://github.com/dmulloy2/ProtocolLib/blob/master/TinyProtocol/src/main/java/com/comphenix/tinyprotocol/Reflection.java) util class.
PacketEvents also took some parts of Atlas' [Packet](https://github.com/funkemunky/Atlas/blob/master/AtlasParent/Atlas/src/main/java/cc/funkemunky/api/tinyprotocol/api/Packet.java) class.
[Find it here in our source](https://github.com/retrooper/packetevents/blob/master/src/main/java/io/github/retrooper/packetevents/reflectionutils/Reflection.java)
PacketEvents forked [Atlas](https://github.com/funkemunky/Atlas)' [Packet](https://github.com/funkemunky/Atlas/blob/master/AtlasParent/Atlas/src/main/java/cc/funkemunky/api/tinyprotocol/api/Packet.java) class.
[Find our forked version](https://github.com/retrooper/packetevents/blob/master/src/main/java/io/github/retrooper/packetevents/packet/PacketType.java)
## About
This packetlistener is **only** supported on spigot servers and has been tested to work on these spigot forks: PaperSpigot, Tuinity
+12 -103
View File
@@ -6,7 +6,7 @@
<groupId>io.github.retrooper</groupId>
<artifactId>packetevents</artifactId>
<version>1.3.4.1</version>
<version>1.3.6.2</version>
<packaging>jar</packaging>
<name>packetevents</name>
<properties>
@@ -56,70 +56,20 @@
<id>funkemunky-releases</id>
<url>https://nexus.funkemunky.cc/content/repositories/releases/</url>
</repository>
<repository>
<id>viaversion-repo</id>
<url>https://repo.viaversion.com</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.14.1</artifactId>
<version>1.14.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.15.1</artifactId>
<version>1.15.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.14.3</artifactId>
<version>1.14.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.14.2</artifactId>
<version>1.14.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.15</artifactId>
<version>1.15</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.15.2</artifactId>
<version>1.15.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.13.2</artifactId>
<version>1.13.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.7.10</artifactId>
<version>1.7.10</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.8</artifactId>
<version>1.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.8.3</artifactId>
<version>1.8.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.8.8</artifactId>
@@ -127,57 +77,16 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.9</artifactId>
<version>1.9</version>
<groupId>us.myles</groupId>
<artifactId>viaversion</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.9.4</artifactId>
<version>1.9.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.10.2</artifactId>
<version>1.10.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.11.1</artifactId>
<version>1.11.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.11.2</artifactId>
<version>1.11.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.12.1</artifactId>
<version>1.12.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.12.2</artifactId>
<version>1.12.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.13</artifactId>
<version>1.13</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.14</artifactId>
<version>1.14</version>
<groupId>com.github.ProtocolSupport</groupId>
<artifactId>ProtocolSupport</artifactId>
<version>4fdd683</version>
<scope>provided</scope>
</dependency>
</dependencies>
@@ -9,7 +9,6 @@ import io.github.retrooper.packetevents.event.PacketListener;
import io.github.retrooper.packetevents.event.impl.*;
import io.github.retrooper.packetevents.event.manager.EventManager;
import io.github.retrooper.packetevents.handler.NettyPacketHandler;
import io.github.retrooper.packetevents.packet.Packet;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.utils.NMSUtils;
import org.bukkit.Bukkit;
@@ -18,11 +17,13 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitTask;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.UUID;
public final class PacketEvents implements PacketListener, Listener {
@@ -32,7 +33,8 @@ public final class PacketEvents implements PacketListener, Listener {
private static PacketEvents instance;
private static int currentTick;
private static BukkitTask serverTickTask;
private static boolean kickOnRestart;
private static final HashMap<UUID, ClientVersion> clientVersionsMap = new HashMap<UUID, ClientVersion>();
public static EventManager getEventManager() {
return eventManager;
@@ -55,7 +57,7 @@ public final class PacketEvents implements PacketListener, Listener {
final Runnable tickRunnable = new Runnable() {
@Override
public void run() {
getEventManager().callEvent(new ServerTickEvent(currentTick++, highlyPreciseMillis()));
getEventManager().callEvent(new ServerTickEvent(currentTick++, PacketEvents.highlyPreciseMillis()));
}
};
serverTickTask = Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, tickRunnable, 0L, 1L);
@@ -71,13 +73,6 @@ public final class PacketEvents implements PacketListener, Listener {
serverTickTask.cancel();
}
getEventManager().unregisterAllListeners();
if (shouldKickOnStop()) {
for (final Player p : Bukkit.getOnlinePlayers()) {
if (p != null) {
p.kickPlayer("Please wait till the server finishes reloading/restarting.");
}
}
}
}
/**
@@ -163,8 +158,9 @@ public final class PacketEvents implements PacketListener, Listener {
return System.nanoTime() / 1000000;
}
/**
* This is deprecated, use {@link #highlyPreciseMillis()} as they do the same thing, this is basically just a method rename.
* This is deprecated, use {@link #highlyPreciseMillis()} as they do the same thing, I just renamed the method.
*/
@Deprecated
public static long currentCalculatedMS() {
@@ -177,22 +173,17 @@ public final class PacketEvents implements PacketListener, Listener {
* Do not call this method in the PlayerInjectEvent, it is safe to call it in the PostPlayerInjectEvent.
* The EntityPlayer object is null at that time, resulting in the version lookup to fail.
*
* / / @param player
* @param player
* @return ClientVersion
*/
@Nullable
public static ClientVersion getClientVersion(@NotNull final Player player) {
final Object channel = TinyProtocolHandler.getPlayerChannel(player);
return clientVersionLookup.get(channel);
}
*/
public static boolean shouldKickOnStop() {
return kickOnRestart;
return getClientVersion(player.getUniqueId());
}
public static void setShouldKickOnRestart(final boolean val) {
kickOnRestart = val;
public static ClientVersion getClientVersion(@NotNull final UUID uuid) {
return clientVersionsMap.get(uuid);
}
/**
@@ -213,15 +204,6 @@ public final class PacketEvents implements PacketListener, Listener {
NettyPacketHandler.uninjectPlayer(player);
}
/**
* Returns whether we have injected the player
*
* @param player
* @return hasInjected
*/
public static boolean hasInjected(final Player player) {
return NettyPacketHandler.hasInjected(player);
}
/**
* Send a wrapped sendable packet to a player
@@ -242,11 +224,15 @@ public final class PacketEvents implements PacketListener, Listener {
*/
@PacketHandler
public void onInject(final PlayerInjectEvent e) {
final String username = e.getPlayer().getName();
clientVersionsMap.put(e.getPlayer().getUniqueId(), e.getClientVersion());
}
@PacketHandler
public void onReceive(final PacketReceiveEvent e) {
}
/**
* Called after the PlayerJoinEvent ONLY if the player has been injected!
* Deprecated, please do not use this anymore
*
* @param e
*/
@@ -257,16 +243,12 @@ public final class PacketEvents implements PacketListener, Listener {
@EventHandler
public void onJoin(final PlayerJoinEvent e) {
if (!hasInjected(e.getPlayer())) {
injectPlayer(e.getPlayer());
}
PlayerInjectEvent injectEvent = new PlayerInjectEvent(e.getPlayer());
PacketEvents.getEventManager().callEvent(injectEvent);
if(!injectEvent.isCancelled()) {
injectPlayer(e.getPlayer());
PacketEvents.getEventManager().callEvent(new PostPlayerInjectEvent(e.getPlayer()));
}
}
@EventHandler
public void onQuit(final PlayerQuitEvent e) {
uninjectPlayer(e.getPlayer());
}
@EventHandler
@@ -2,11 +2,13 @@ package io.github.retrooper.packetevents.enums;
public enum ClientVersion {
LESS_THAN_V_1_7_10, v_1_7_10, v_1_8, v_1_9, v_1_9_1, v_1_9_2, v_1_9_3, v_1_10, v_1_11, v_1_11_1, v_1_12, v_1_12_1, v_1_12_2,
v_1_13, v_1_13_1, v_1_13_2, v_1_14, v_1_14_1, v_1_14_2, v_1_14_3, v_1_14_4, v_1_15, v_1_15_1, v_1_15_2, HIGHER_THAN_V_1_15_2, INVALID;
v_1_13, v_1_13_1, v_1_13_2, v_1_14, v_1_14_1, v_1_14_2, v_1_14_3, v_1_14_4, v_1_15, v_1_15_1, v_1_15_2, HIGHER_THAN_V_1_15_2, INVALID, ACCESS_FAILURE;
public static ClientVersion fromProtocolVersion(final int protocolVersion) {
int remainder = -1;
switch (protocolVersion) {
case -1:
return ACCESS_FAILURE;
case 1:
case 2:
case 3:
@@ -5,7 +5,7 @@ import org.bukkit.Bukkit;
public enum ServerVersion {
v_1_7_10, v_1_8, v_1_8_3, v_1_8_8, v_1_9, v_1_9_4, v_1_10, v_1_11, v_1_12, v_1_13, v_1_13_2, v_1_14, v_1_15,
v_1_7_10, v_1_8, v_1_8_3, v_1_8_8, v_1_9, v_1_9_4, v_1_10, v_1_11, v_1_12, v_1_13, v_1_13_2, v_1_14, v_1_15, v_1_16,
ERROR;
@@ -34,14 +34,19 @@ public final class PacketReceiveEvent extends PacketEvent {
}
/**
* Get the raw packet object
* This is deprecated, please us {@link #getNMSPacket()}
*
* @return packet
*/
@Deprecated
public Object getPacket() {
return this.packet;
}
public Object getNMSPacket() {
return this.packet;
}
/**
* Returns if the packet has been cancelled
*
@@ -26,12 +26,22 @@ public final class PacketSendEvent extends PacketEvent {
return this.name;
}
/**
* This is deprecated, please us {@link #getNMSPacket()}
*
* @return packet
*/
@Deprecated
public Object getPacket() {
return this.packet;
}
/**
* Get the raw packet object
*
* @return nmsPacket
* @return packet
*/
public Object getPacket() {
public Object getNMSPacket() {
return this.packet;
}
@@ -1,14 +1,18 @@
package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.enums.ClientVersion;
import io.github.retrooper.packetevents.event.PacketEvent;
import io.github.retrooper.packetevents.utils.VersionLookupUtils;
import org.bukkit.entity.Player;
public final class PlayerInjectEvent extends PacketEvent {
private final Player player;
private boolean cancelled;
private final ClientVersion clientVersion;
public PlayerInjectEvent(final Player player) {
this.player = player;
this.clientVersion = ClientVersion.fromProtocolVersion(VersionLookupUtils.getProtocolVersion(player));
}
public boolean isCancelled() {
@@ -23,6 +27,10 @@ public final class PlayerInjectEvent extends PacketEvent {
setCancelled(true);
}
public ClientVersion getClientVersion() {
return clientVersion;
}
public Player getPlayer() {
return player;
}
@@ -5,11 +5,24 @@ import org.bukkit.entity.Player;
public final class PlayerUninjectEvent extends PacketEvent {
private final Player player;
private boolean cancelled;
public PlayerUninjectEvent(final Player player) {
this.player = player;
}
public void setCancelled(final boolean val) {
this.cancelled = val;
}
public void cancel() {
setCancelled(true);
}
public boolean isCancelled() {
return this.cancelled;
}
public Player getPlayer() {
return player;
}
@@ -4,7 +4,7 @@ import io.github.retrooper.packetevents.event.PacketEvent;
import org.bukkit.entity.Player;
/**
* It is now safe to use PlayerInjectEvent
* Please use {@link PlayerInjectEvent}
*/
@Deprecated
public final class PostPlayerInjectEvent extends PacketEvent {
@@ -3,22 +3,17 @@ package io.github.retrooper.packetevents.example;
import io.github.retrooper.packetevents.PacketEvents;
import org.bukkit.plugin.java.JavaPlugin;
public class MainExample extends JavaPlugin {
public class MainExample extends JavaPlugin {
@Override
public void onEnable() {
PacketEvents.start(this);
PacketEvents.getServerTickTask().cancel();
//To fix bugs it is recommend to set this to TRUE
PacketEvents.setShouldKickOnRestart(true);
}
@Override
public void onDisable() {
PacketEvents.stop(); //it kicks when you call the stop() function
PacketEvents.stop();
}
}
}
@@ -2,34 +2,32 @@ package io.github.retrooper.packetevents.handler;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.event.impl.PacketReceiveEvent;
import io.github.retrooper.packetevents.event.impl.PacketSendEvent;
import io.github.retrooper.packetevents.event.impl.*;
import org.bukkit.entity.Player;
import java.util.HashSet;
import java.util.UUID;
import java.util.concurrent.Future;
public class NettyPacketHandler {
public static final String handlerName = "PacketEventsListener";
public static final String handlerName = "packet_handler";
private static final ServerVersion version = PacketEvents.getServerVersion();
public static final HashSet<UUID> injectedList = new HashSet<UUID>();
public static void injectPlayer(final Player player) {
if (!hasInjected(player)) {
final PlayerInjectEvent injectEvent = new PlayerInjectEvent(player);
PacketEvents.getEventManager().callEvent(injectEvent);
if (!injectEvent.isCancelled()) {
if (version.isLowerThan(ServerVersion.v_1_8)) {
NettyPacketHandler_7.injectPlayer(player);
} else {
NettyPacketHandler_8.injectPlayer(player);
}
injectedList.add(player.getUniqueId());
PacketEvents.getEventManager().callEvent(new PostPlayerInjectEvent(player));
}
}
public static Future<?> uninjectPlayer(final Player player) {
if (hasInjected(player)) {
injectedList.remove(player.getUniqueId());
final PlayerUninjectEvent uninjectEvent = new PlayerUninjectEvent(player);
PacketEvents.getEventManager().callEvent(uninjectEvent);
if (!uninjectEvent.isCancelled()) {
if (version.isLowerThan(ServerVersion.v_1_8)) {
return NettyPacketHandler_7.uninjectPlayer(player);
} else {
@@ -39,10 +37,6 @@ public class NettyPacketHandler {
return null;
}
public static boolean hasInjected(final Player player) {
return injectedList.contains(player.getUniqueId());
}
public static Object read(final Player receiver, final Object packet) {
final String packetName = packet.getClass().getSimpleName();
final PacketSendEvent packetSendEvent = new PacketSendEvent(receiver, packetName, packet);
@@ -1,5 +1,7 @@
package io.github.retrooper.packetevents.handler;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.utils.NMSUtils;
import io.netty.channel.*;
import org.bukkit.entity.Player;
@@ -7,6 +9,7 @@ import org.bukkit.entity.Player;
import java.util.concurrent.Future;
final class NettyPacketHandler_8 {
private static final ServerVersion version = PacketEvents.getServerVersion();
public static void injectPlayer(final Player player) {
final ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() {
@Override
@@ -1,19 +1,17 @@
package io.github.retrooper.packetevents.mojang;
import com.mojang.authlib.properties.PropertyMap;
import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.StringUtils;
import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.builder.ToStringBuilder;
import java.util.UUID;
public class GameProfile {
public final class GameProfile {
private final UUID id;
private final String name;
private final PropertyMap properties = new PropertyMap();
private boolean legacy;
public GameProfile(UUID id, String name) {
if (id == null && StringUtils.isBlank(name)) {
if (id == null && name.isEmpty()) {
throw new IllegalArgumentException("Name and ID cannot both be blank");
} else {
this.id = id;
@@ -34,10 +32,15 @@ public class GameProfile {
}
public boolean isComplete() {
return this.id != null && StringUtils.isNotBlank(this.getName());
return this.id != null && !getName().isEmpty();
}
public boolean equalsMojangGameProfile(com.mojang.authlib.GameProfile profile) {
public boolean isLegacy() {
return this.legacy;
}
public boolean equals(com.mojang.authlib.GameProfile profile) {
if (profile != null) {
return profile.getId() != null && getId() != null && profile.getId() == getId()
&& profile.getName() != null && getName() != null && profile.getName().equals(getName());
@@ -45,6 +48,7 @@ public class GameProfile {
return false;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
@@ -66,17 +70,15 @@ public class GameProfile {
}
}
@Override
public int hashCode() {
int result = this.id != null ? this.id.hashCode() : 0;
result = 31 * result + (this.name != null ? this.name.hashCode() : 0);
return result;
}
@Override
public String toString() {
return (new ToStringBuilder(this)).append("id", this.id).append("name", this.name).append("properties", this.properties).append("legacy", this.legacy).toString();
}
public boolean isLegacy() {
return this.legacy;
return "id: " + id + ", name: " + name + ", legacy: " + legacy;
}
}
@@ -3,7 +3,8 @@ package io.github.retrooper.packetevents.packet;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.utils.NMSUtils;
public abstract class Packet {
@Deprecated
public final class Packet {
private static Class<?> packetPlayInFlying, packetPlayInPosition, packetPlayInPositionLook, packetPlayInLook;
@@ -11,14 +12,14 @@ public abstract class Packet {
try {
packetPlayInFlying = NMSUtils.getNMSClass(Client.FLYING);
} catch (ClassNotFoundException e) {
//That is fine, they are on 1.9+ so we just initiate the rest of the variables
try {
packetPlayInPosition = NMSUtils.getNMSClass(Client.POSITION);
packetPlayInPositionLook = NMSUtils.getNMSClass(Client.POSITION_LOOK);
packetPlayInLook = NMSUtils.getNMSClass(Client.LOOK);
} catch (ClassNotFoundException e2) {
e2.printStackTrace();
}
//That is fine, they are on 1.9+
}
try {
packetPlayInPosition = NMSUtils.getNMSClass(Client.POSITION);
packetPlayInPositionLook = NMSUtils.getNMSClass(Client.POSITION_LOOK);
packetPlayInLook = NMSUtils.getNMSClass(Client.LOOK);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
@@ -42,21 +43,19 @@ public abstract class Packet {
}
/**
* Use isInstanceOfFlyingPacket(nmsPacketObject) instead of this, as the flying packet is the only packet that has subclasses (in 1.8 atleast).
* Will be removed in newer versions of PacketEvents!
*
* @param fatherPacket
* @param childPacket
* @return isInstanceOf
* Is this NMS Packet an instanceof the "PacketPlayInPosition" or "PacketPlayInPositionLook"
* @param nmsPacket
* @return
*/
@Deprecated
public static boolean isInstanceOf(String fatherPacket, String childPacket) {
if (fatherPacket.equals(Client.FLYING) && childPacket.equals(Client.POSITION) || childPacket.equals(Client.POSITION_LOOK) || childPacket.equals(Client.LOOK)) {
return true;
}
return fatherPacket.equals(childPacket);
public static boolean isInstanceOfPositionOrPositionLook(final Object nmsPacket) {
return packetPlayInPosition.isInstance(nmsPacket) || packetPlayInPositionLook.isInstance(nmsPacket);
}
public static boolean isInstanceOfLook(final Object nmsPacket) {
return packetPlayInLook.isInstance(nmsPacket);
}
public static class Client {
private static final String c = "PacketPlayIn";
@@ -0,0 +1,183 @@
package io.github.retrooper.packetevents.packet;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.utils.NMSUtils;
public final class PacketType {
private static final ServerVersion version = PacketEvents.getServerVersion();
public static final class Util {
/**
* Is this NMS packet an instance of the "PacketPlayInFlying" packet?
* Supports 1.9->1.15.2 too!
*
* @param nmsPacket
* @return If the nms packet provided is an instanceof the "PacketPlayInFlying" packet in the 1.8 protocol & 1.16 protocol!
*/
public static boolean isInstanceOfFlyingPacket(final Object nmsPacket) {
//1.7->1.8.8
if (packetPlayInFlying != null) {
return packetPlayInFlying.isInstance(nmsPacket);
} else {
//1.9->1.15.2
return isInstanceOfPositionOrPositionLook(nmsPacket) || isInstanceOfPositionLookPacket(nmsPacket);
}
}
/**
* Is this NMS packet an instance of the "PacketPlayInPosition" packet?
*
* @param nmsPacket
* @return nmsPacket instanceof PacketPlayInPosition
*/
public static boolean isInstanceOfPositionPacket(final Object nmsPacket) {
return packetPlayInPosition.isInstance(nmsPacket);
}
/**
* Is this NMS packet an instance of the "PacketPlayInPositionLook" packet?
*
* @param nmsPacket
* @return nmsPacket instanceof PacketPlayInPositionLook
*/
public static boolean isInstanceOfPositionLookPacket(final Object nmsPacket) {
return packetPlayInPositionLook.isInstance(nmsPacket);
}
/**
* Is this NMS Packet an instanceof the "PacketPlayInPosition" or "PacketPlayInPositionLook"
*
* @param nmsPacket
* @return nmsPacket instanceof PacketPlayInPosition || nmsPacket instanceof PacketPlayInPositionLook
*/
public static boolean isInstanceOfPositionOrPositionLook(final Object nmsPacket) {
return isInstanceOfPositionPacket(nmsPacket) || isInstanceOfPositionLookPacket(nmsPacket);
}
/**
* Is this NMS Packet an instance of the "PacketPlayInLook" packet?
*
* @param nmsPacket
* @return nmsPacket instanceof PacketPlayInLook
*/
public static boolean isInstanceOfLook(final Object nmsPacket) {
return packetPlayInLook.isInstance(nmsPacket);
}
public static boolean isInstanceOfUseEntity(final Object nmsPacket) {
return packetPlayInUseEntity.isInstance(nmsPacket);
}
private static Class<?> packetPlayInFlying, packetPlayInPosition, packetPlayInPositionLook, packetPlayInLook, packetPlayInUseEntity;
static {
try {
//Only exists in 1.7->1.8.8 & 1.16 protocol
packetPlayInFlying = NMSUtils.getNMSClass(Client.FLYING);
} catch (ClassNotFoundException e) {
//That is fine, they are on 1.9->1.15.2
}
try {
packetPlayInPosition = NMSUtils.getNMSClass(Client.POSITION);
packetPlayInPositionLook = NMSUtils.getNMSClass(Client.POSITION_LOOK);
packetPlayInLook = NMSUtils.getNMSClass(Client.LOOK);
} catch (ClassNotFoundException e) {
for (final Class<?> cls : packetPlayInFlying.getDeclaredClasses()) {
if (cls.getSimpleName().equals(Client.POSITION)) {
packetPlayInPosition = cls;
} else if (cls.getSimpleName().equals(Client.POSITION_LOOK)) {
packetPlayInPositionLook = cls;
} else if (cls.getSimpleName().equals(Client.LOOK)) {
packetPlayInLook = cls;
}
}
}
try {
packetPlayInUseEntity = NMSUtils.getNMSClass(Client.USE_ENTITY);
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
}
public static final class Client {
private static final String c = "PacketPlayIn";
@Deprecated
public static final String FLYING = c + "Flying";
public static final String POSITION = c + "Position";
public static final String POSITION_LOOK = c + "PositionLook";
public static final String LOOK = c + "Look";
public static final String CLIENT_COMMAND = c + "ClientCommand";
public static final String TRANSACTION = c + "Transaction";
public static final String BLOCK_DIG = c + "BlockDig";
public static final String ENTITY_ACTION = c + "EntityAction";
public static final String USE_ENTITY = c + "UseEntity";
public static final String WINDOW_CLICK = c + "WindowClick";
public static final String STEER_VEHICLE = c + "SteerVehicle";
public static final String CUSTOM_PAYLOAD = c + "CustomPayload";
public static final String ARM_ANIMATION = c + "ArmAnimation";
/**
* The packet name of the block place depending on your server version, "PacketPlayInBlockPlace" or "PacketPlayInUseItem"
*/
public static final String BLOCK_PLACE = c + ((ServerVersion.getVersion().isHigherThan(ServerVersion.v_1_8_8)) ? "UseItem" : "BlockPlace");
public static final String ABILITIES = c + "Abilities";
public static final String HELD_ITEM_SLOT = c + "HeldItemSlot";
public static final String CLOSE_WINDOW = c + "CloseWindow";
public static final String TAB_COMPLETE = c + "TabComplete";
public static final String CHAT = c + "Chat";
public static final String SET_CREATIVE_SLOT = c + "SetCreativeSlot";
public static final String KEEP_ALIVE = c + "KeepAlive";
}
public static final class Server {
private static final String s = "PacketPlayOut";
public static final String ANIMATION = s + "Animation";
public static final String KEEP_ALIVE = s + "KeepAlive";
public static final String CHAT = s + "Chat";
public static final String POSITION = s + "Position";
public static final String TRANSACTION = s + "Transaction";
public static final String NAMED_ENTITY_SPAWN = s + "NamedEntitySpawn";
public static final String SPAWN_ENTITY_LIVING = s + "SpawnEntityLiving";
public static final String SPAWN_ENTITY = s + "SpawnEntity";
public static final String CUSTOM_PAYLOAD = s + "CustomPayload";
public static final String ABILITIES = s + "Abilities";
public static final String ENTITY_METADATA = s + "EntityMetadata";
public static final String ENTITY_VELOCITY = s + "EntityVelocity";
public static final String ENTITY_DESTROY = s + "EntityDestroy";
public static final String ENTITY_HEAD_ROTATION = s + "EntityHeadRotation";
public static final String BLOCK_CHANGE = s + "BlockChange";
public static final String CLOSE_WINDOW = s + "CloseWindow";
public static final String HELD_ITEM_SLOT = s + "HeldItemSlot";
public static final String TAB_COMPLETE = s + "TabComplete";
public static final String RESPAWN = s + "Respawn";
public static final String WORLD_PARTICLES = s + "WorldParticles";
public static final String COMMANDS = s + "Commands";
public static final String OPEN_WINDOW = s + "OpenWindow";
public static final String LOGIN = s + "Login";
public static final String SERVER_DIFFICULTY = s + "ServerDifficulty";
}
public static final class Login {
public static final String HANDSHAKE = "PacketHandshakingInSetProtocol";
public static final String PING = "PacketStatusInPing";
public static final String START = "PacketStatusInStart";
public static final String SUCCESS = "PacketLoginOutSuccess";
public static final String ENCRYPTION_BEGIN_IN = "PacketLoginInEncryptionBegin";
public static final String ENCRYPTION_BEGIN_OUT = "PacketLoginOutEncryptionBegin";
}
}
@@ -7,27 +7,36 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashSet;
final class WrappedPacketInBlockPlace_1_9 extends WrappedPacket {
private static Class<?> blockPlaceClass_1_9;
private Block block;
private static Method getTargetBlockMethod;
public WrappedPacketInBlockPlace_1_9(final Player player, final Object packet) {
super(player, packet);
}
protected static void initStatic() {
try {
blockPlaceClass_1_9 = NMSUtils.getNMSClass("PacketPlayInUseItem");
} catch (ClassNotFoundException e) {
getTargetBlockMethod = Player.class.getMethod("getTargetBlock", HashSet.class, int.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
@Override
protected void setup() {
this.block = getPlayer().getTargetBlock((HashSet<Material>) null, 3);
try {
this.block = (Block) getTargetBlockMethod.invoke(getPlayer(), null, 3);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
@@ -8,8 +8,7 @@ import org.bukkit.entity.Entity;
import java.lang.reflect.Field;
public final class WrappedPacketInUseEntity extends WrappedPacket {
private static Class<?> useEntityClass;
private static Class<?> entityClass;
private static Class<?> useEntityClass, entityClass;
private static final Field[] fields = new Field[2];
static {
@@ -6,7 +6,7 @@ import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public final class PlayerAbilitiesUtils {
final class PlayerAbilitiesUtils {
public static Class<?> playerAbilitiesClass;
@@ -4,6 +4,7 @@ import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -0,0 +1,10 @@
package io.github.retrooper.packetevents.utils;
import org.bukkit.entity.Player;
import protocolsupport.api.ProtocolSupportAPI;
class ProtocolSupportAPIAccessor {
public static int getProtocolVersion(final Player player) {
return ProtocolSupportAPI.getProtocolVersion(player).getId();
}
}
@@ -0,0 +1,15 @@
package io.github.retrooper.packetevents.utils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import protocolsupport.api.ProtocolSupportAPI;
public class ProtocolSupportUtils {
public static boolean isProtocolSupportAvailable() {
return Bukkit.getPluginManager().getPlugin("ProtocolSupport") != null;
}
public static int getProtocolVersion(final Player player) {
return ProtocolSupportAPI.getProtocolVersion(player).getId();
}
}
@@ -0,0 +1,14 @@
package io.github.retrooper.packetevents.utils;
import org.bukkit.entity.Player;
public class VersionLookupUtils {
public static int getProtocolVersion(final Player player) {
if (ViaUtils.isViaAPIAvaialable()) {
return ViaUtils.getProtocolVersion(player);
} else if (ProtocolSupportUtils.isProtocolSupportAvailable()) {
return ProtocolSupportUtils.getProtocolVersion(player);
}
return -1;
}
}
@@ -0,0 +1,16 @@
package io.github.retrooper.packetevents.utils;
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 static int getProtocolVersion(final UUID uuid) {
return Via.getAPI().getPlayerVersion(uuid);
}
}
@@ -0,0 +1,15 @@
package io.github.retrooper.packetevents.utils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class ViaUtils {
public static int getProtocolVersion(final Player player) {
return ViaAPIAccessor.getProtocolVersion(player);
}
public static boolean isViaAPIAvaialable() {
return Bukkit.getPluginManager().getPlugin("ViaVersion") != null;
}
}