Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
66a6c2d8f9 | ||
|
|
b2654e11a3 | ||
|
|
e2cfdda9cf | ||
|
|
b5085a8959 | ||
|
|
dccf01220c | ||
|
|
12dc5b69c0 | ||
|
|
0423b5f335 | ||
|
|
a4c37da10e | ||
|
|
de49279aab | ||
|
|
f651ffddf5 | ||
|
|
ee959b68dc | ||
|
|
b1d1201083 | ||
|
|
faff8fadc8 | ||
|
|
85a0f55b20 | ||
|
|
cf2e571d80 | ||
|
|
68596469eb | ||
|
|
181eda6ae4 | ||
|
|
31ed9c0e4c | ||
|
|
2916fb7112 | ||
|
|
1ca1a960b5 |
No files matched your search
@@ -21,6 +21,8 @@ Join my discord server(to talk to me): https://discord.gg/ZWTkg4v
|
||||
|
||||
[](https://jitpack.io/#retrooper/packetevents)
|
||||
|
||||
[](https://jitci.com/gh/retrooper/packetevents)
|
||||
|
||||
To learn how to setup this API please click on the link below
|
||||
[Setup Guide](https://github.com/retrooper/packetevents/wiki/PacketEvents-Setup-Guide)
|
||||
(or just paste this into your browser: https://github.com/retrooper/packetevents/wiki/PacketEvents-Setup-Guide)
|
||||
@@ -6,14 +6,13 @@
|
||||
|
||||
<groupId>io.github.retrooper</groupId>
|
||||
<artifactId>packetevents</artifactId>
|
||||
<version>1.3.7.1</version>
|
||||
<version>1.4</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>packetevents</name>
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<build>
|
||||
<defaultGoal>clean package</defaultGoal>
|
||||
<plugins>
|
||||
@@ -60,6 +59,10 @@
|
||||
<id>viaversion-repo</id>
|
||||
<url>https://repo.viaversion.com</url>
|
||||
</repository>
|
||||
<repository>
|
||||
<id>dmulloy2-repo</id>
|
||||
<url>https://repo.dmulloy2.net/nexus/repository/public/</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
|
||||
@@ -70,12 +73,22 @@
|
||||
<version>1.7.10</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.github.spigot</groupId>
|
||||
<artifactId>1.8.8</artifactId>
|
||||
<version>1.8.8</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- ProtocolLib API-->
|
||||
<dependency>
|
||||
<groupId>com.comphenix.protocol</groupId>
|
||||
<artifactId>ProtocolLib</artifactId>
|
||||
<version>4.5.0</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<!-- ViaVersion API-->
|
||||
<dependency>
|
||||
<groupId>us.myles</groupId>
|
||||
<artifactId>viaversion</artifactId>
|
||||
@@ -83,6 +96,7 @@
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- ProtocolSupport API-->
|
||||
<dependency>
|
||||
<groupId>com.github.ProtocolSupport</groupId>
|
||||
<artifactId>ProtocolSupport</artifactId>
|
||||
|
||||
@@ -1,57 +1,50 @@
|
||||
package io.github.retrooper.packetevents;
|
||||
|
||||
import io.github.retrooper.packetevents.annotations.NotNull;
|
||||
import io.github.retrooper.packetevents.annotations.Nullable;
|
||||
import io.github.retrooper.packetevents.annotations.PacketHandler;
|
||||
import io.github.retrooper.packetevents.enums.ClientVersion;
|
||||
import io.github.retrooper.packetevents.enums.ServerVersion;
|
||||
import io.github.retrooper.packetevents.event.PacketListener;
|
||||
import io.github.retrooper.packetevents.event.impl.BukkitMoveEvent;
|
||||
import io.github.retrooper.packetevents.event.impl.PacketReceiveEvent;
|
||||
import io.github.retrooper.packetevents.event.impl.PlayerInjectEvent;
|
||||
import io.github.retrooper.packetevents.event.impl.ServerTickEvent;
|
||||
import io.github.retrooper.packetevents.event.manager.EventManager;
|
||||
import io.github.retrooper.packetevents.handler.NettyPacketHandler;
|
||||
import io.github.retrooper.packetevents.packetwrappers.Sendable;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
import io.github.retrooper.packetevents.packet.PacketType;
|
||||
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
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 {
|
||||
|
||||
private static final ServerVersion version = ServerVersion.getVersion();
|
||||
private static final EventManager eventManager = new EventManager();
|
||||
private static final HashMap<UUID, ClientVersion> clientVersionsMap = new HashMap<UUID, ClientVersion>();
|
||||
private static final PacketEventsAPI packetEventsAPI = new PacketEventsAPI();
|
||||
private static final PacketEvents instance = new PacketEvents();
|
||||
private static boolean hasRegistered;
|
||||
private static PacketEvents instance;
|
||||
private static int currentTick;
|
||||
private static BukkitTask serverTickTask;
|
||||
|
||||
public static EventManager getEventManager() {
|
||||
return eventManager;
|
||||
}
|
||||
|
||||
private static Plugin plugin;
|
||||
private static boolean hasLoaded;
|
||||
|
||||
/**
|
||||
* Starts the server tick task and initiates the TinyProtocolHandler
|
||||
* Call this before start(), this is also very heavy
|
||||
*/
|
||||
public static void load() {
|
||||
PacketTypeClasses.Client.load();
|
||||
PacketTypeClasses.Server.load();
|
||||
hasLoaded = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the server tick task and registers what is needed to be registered
|
||||
*
|
||||
* @param plugin
|
||||
*/
|
||||
public static void start(final Plugin plugin) {
|
||||
if (!hasLoaded) {
|
||||
load();
|
||||
}
|
||||
if (!hasRegistered) {
|
||||
//Register Bukkit and PacketListener
|
||||
getEventManager().registerListener(getInstance());
|
||||
getAPI().getEventManager().registerListener(getInstance());
|
||||
|
||||
Bukkit.getPluginManager().registerEvents(getInstance(), plugin);
|
||||
|
||||
@@ -59,11 +52,12 @@ public final class PacketEvents implements PacketListener, Listener {
|
||||
final Runnable tickRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
getEventManager().callEvent(new ServerTickEvent(currentTick++, PacketEvents.highlyPreciseMillis()));
|
||||
getAPI().getEventManager().callEvent(new ServerTickEvent(currentTick++, PacketEvents.getAPI().currentMillis()));
|
||||
}
|
||||
};
|
||||
serverTickTask = Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, tickRunnable, 0L, 1L);
|
||||
getAPI().setServerTickTask(Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, tickRunnable, 0L, 1L));
|
||||
hasRegistered = true;
|
||||
PacketEvents.plugin = plugin;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,141 +65,31 @@ public final class PacketEvents implements PacketListener, Listener {
|
||||
* Stop all tasks and unregisters all PacketEvents' listeners
|
||||
*/
|
||||
public static void stop() {
|
||||
if (serverTickTask != null) {
|
||||
serverTickTask.cancel();
|
||||
if (getAPI().getServerTickTask() != null) {
|
||||
getAPI().getServerTickTask().cancel();
|
||||
}
|
||||
getEventManager().unregisterAllListeners();
|
||||
getAPI().getEventManager().unregisterAllListeners();
|
||||
|
||||
PacketType.Client.packetIds.clear();
|
||||
PacketType.Server.packetIds.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the server's version
|
||||
*
|
||||
* @return version
|
||||
*/
|
||||
public static ServerVersion getServerVersion() {
|
||||
return version;
|
||||
public static PacketEventsAPI getAPI() {
|
||||
return packetEventsAPI;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the server tick task, you may cancel it if you wish.
|
||||
* To cancel it do PacketEvents.getServerTickTask().cancel();
|
||||
* <p>
|
||||
* This bukkit task runs asynchronously every tick and is started in the start(plugin) function
|
||||
*
|
||||
* @return serverTickTask
|
||||
*/
|
||||
public static BukkitTask getServerTickTask() {
|
||||
return serverTickTask;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an instance of the PacketEvents API class
|
||||
*
|
||||
* @return instance
|
||||
*/
|
||||
public static PacketEvents getInstance() {
|
||||
return instance == null ? instance = new PacketEvents() : instance;
|
||||
private static PacketEvents getInstance() {
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the server's recent TPS values
|
||||
* TPS stands for ticks per second.
|
||||
* See to learn more about TPS<a href="https://apexminecrafthosting.com/what-is-minecraft-tps/">"https://apexminecrafthosting.com/what-is-minecraft-tps/"</a>
|
||||
*
|
||||
* @return recentTPS[]
|
||||
*/
|
||||
public static double[] getRecentServerTPS() {
|
||||
double[] tpsArray = new double[0];
|
||||
try {
|
||||
tpsArray = NMSUtils.recentTPS();
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return tpsArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the server's current TPS
|
||||
* TPS stands for ticks per second.
|
||||
* See to learn more about TPS <a href="https://apexminecrafthosting.com/what-is-minecraft-tps/">"https://apexminecrafthosting.com/what-is-minecraft-tps/"</a>
|
||||
*
|
||||
* @return {@link PacketEvents#getRecentServerTPS()[0]}
|
||||
*/
|
||||
public static double getCurrentServerTPS() {
|
||||
return getRecentServerTPS()[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player's ping.
|
||||
* Learn more about ping <a href="https://en.wikipedia.org/wiki/Ping_(networking_utility)">https://en.wikipedia.org/wiki/Ping_(networking_utility)</a>
|
||||
*
|
||||
* @param player
|
||||
* @return ping
|
||||
*/
|
||||
public static int getPing(@NotNull final Player player) {
|
||||
return NMSUtils.getPlayerPing(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* When to use this(nano / 1 million) vs {@link System#currentTimeMillis()}
|
||||
* This is preciser than System.currentTimeMillis(), System.currentTimeMillis() can be up to 50ms off on some operating systems, but using this isn't cheap.
|
||||
* Java documentation recommend using nano time if you are measuring elapsed time.
|
||||
* In this function nanoTime is divided by 1 million giving us milliseconds.
|
||||
* It is also important to mention that using this method doesn't guarantee thread safety.
|
||||
*
|
||||
* @return nanoTime / 1 million
|
||||
*/
|
||||
public static long highlyPreciseMillis() {
|
||||
return System.nanoTime() / 1000000;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the player's version.
|
||||
* 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
|
||||
* @return ClientVersion
|
||||
*/
|
||||
|
||||
@Nullable
|
||||
public static ClientVersion getClientVersion(@NotNull final Player player) {
|
||||
return getClientVersion(player.getUniqueId());
|
||||
}
|
||||
|
||||
public static ClientVersion getClientVersion(@NotNull final UUID uuid) {
|
||||
return clientVersionsMap.get(uuid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Version independent player injection
|
||||
*
|
||||
* @param player
|
||||
*/
|
||||
public static void injectPlayer(final Player player) {
|
||||
NettyPacketHandler.injectPlayer(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Version independant player injection
|
||||
*
|
||||
* @param player
|
||||
*/
|
||||
public static void uninjectPlayer(final Player player) {
|
||||
NettyPacketHandler.uninjectPlayer(player);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Send a wrapped sendable packet to a player
|
||||
*
|
||||
* @param player
|
||||
* @param sendable
|
||||
*/
|
||||
public static void sendPacket(final Player player, final Sendable sendable) {
|
||||
NMSUtils.sendSendableWrapper(player, sendable);
|
||||
public static Plugin getPlugin() {
|
||||
return plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -217,7 +101,7 @@ public final class PacketEvents implements PacketListener, Listener {
|
||||
*/
|
||||
@PacketHandler
|
||||
public void onInject(final PlayerInjectEvent e) {
|
||||
clientVersionsMap.put(e.getPlayer().getUniqueId(), e.getClientVersion());
|
||||
getAPI().getPlayerUtilities().clientVersionsMap.put(e.getPlayer().getUniqueId(), e.getClientVersion());
|
||||
}
|
||||
|
||||
@PacketHandler
|
||||
@@ -226,16 +110,16 @@ public final class PacketEvents implements PacketListener, Listener {
|
||||
|
||||
@EventHandler
|
||||
public void onJoin(final PlayerJoinEvent e) {
|
||||
injectPlayer(e.getPlayer());
|
||||
getAPI().getPlayerUtilities().injectPlayer(e.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onQuit(final PlayerQuitEvent e) {
|
||||
uninjectPlayer(e.getPlayer());
|
||||
getAPI().getPlayerUtilities().uninjectPlayer(e.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onMove(final PlayerMoveEvent e) {
|
||||
PacketEvents.getEventManager().callEvent(new BukkitMoveEvent(e));
|
||||
getAPI().getEventManager().callEvent(new BukkitMoveEvent(e));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
package io.github.retrooper.packetevents;
|
||||
|
||||
import io.github.retrooper.packetevents.event.manager.EventManager;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
public final class PacketEventsAPI {
|
||||
private final EventManager eventManager = new EventManager();
|
||||
private final PlayerUtils playerUtils = new PlayerUtils();
|
||||
private final ServerUtils serverUtils = new ServerUtils();
|
||||
|
||||
private BukkitTask serverTickTask;
|
||||
|
||||
/**
|
||||
* Not thread safe
|
||||
* Preciser than #currentMillis()
|
||||
* Expensive
|
||||
* Returns crazy values when you change system time
|
||||
*
|
||||
* @return {@link System#nanoTime()} / 1000000(1 million)
|
||||
*/
|
||||
public long currentPreciseMillis() {
|
||||
return System.nanoTime() / 1000000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Thread safe
|
||||
* Less precise compared to #currentPreciseMillis()
|
||||
* Cheap
|
||||
* Doesn't break when system time is changed
|
||||
*
|
||||
* @return {@link System#currentTimeMillis()}
|
||||
*/
|
||||
public long currentMillis() {
|
||||
return System.currentTimeMillis();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all utilities to do with the player
|
||||
*
|
||||
* @return Player Utilities
|
||||
*/
|
||||
public PlayerUtils getPlayerUtilities() {
|
||||
return playerUtils;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all utilities to do with the server
|
||||
*
|
||||
* @return Server Utilities
|
||||
*/
|
||||
public ServerUtils getServerUtilities() {
|
||||
return serverUtils;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the event manager
|
||||
* Used to call events, register and unregister listeners
|
||||
*
|
||||
* @return PacketEvents' event manager
|
||||
*/
|
||||
public EventManager getEventManager() {
|
||||
return eventManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the server tick task, called **asynchronously** every tick
|
||||
*
|
||||
* @return server tick task
|
||||
*/
|
||||
public BukkitTask getServerTickTask() {
|
||||
return serverTickTask;
|
||||
}
|
||||
|
||||
/**
|
||||
* Modify the server tick task object
|
||||
*
|
||||
* @param task
|
||||
*/
|
||||
public void setServerTickTask(final BukkitTask task) {
|
||||
this.serverTickTask = task;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package io.github.retrooper.packetevents;
|
||||
|
||||
import io.github.retrooper.packetevents.enums.ClientVersion;
|
||||
import io.github.retrooper.packetevents.handler.NettyPacketHandler;
|
||||
import io.github.retrooper.packetevents.packetwrappers.Sendable;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.UUID;
|
||||
|
||||
public class PlayerUtils {
|
||||
protected final HashMap<UUID, ClientVersion> clientVersionsMap = new HashMap<UUID, ClientVersion>();
|
||||
|
||||
public int getPlayerPing(final Player player) {
|
||||
return NMSUtils.getPlayerPing(player);
|
||||
}
|
||||
|
||||
public ClientVersion getClientVersion(final UUID uuid) {
|
||||
return clientVersionsMap.get(uuid);
|
||||
}
|
||||
|
||||
public ClientVersion getClientVersion(final Player player) {
|
||||
return getClientVersion(player.getUniqueId());
|
||||
}
|
||||
|
||||
public void injectPlayer(final Player player) {
|
||||
NettyPacketHandler.injectPlayer(player);
|
||||
}
|
||||
|
||||
public void uninjectPlayer(final Player player) {
|
||||
NettyPacketHandler.uninjectPlayer(player);
|
||||
}
|
||||
|
||||
public void sendPacket(final Player player, final Sendable sendable) {
|
||||
NMSUtils.sendSendableWrapper(player, sendable);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package io.github.retrooper.packetevents;
|
||||
|
||||
import io.github.retrooper.packetevents.enums.ServerVersion;
|
||||
import io.github.retrooper.packetevents.enums.SystemOS;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public class ServerUtils {
|
||||
public ServerVersion getServerVersion() {
|
||||
return ServerVersion.getVersion();
|
||||
}
|
||||
|
||||
public double[] getRecentServerTPS() {
|
||||
double[] tpsArray = new double[0];
|
||||
try {
|
||||
tpsArray = NMSUtils.recentTPS();
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return tpsArray;
|
||||
}
|
||||
|
||||
public double getCurrentServerTPS() {
|
||||
return getRecentServerTPS()[0];
|
||||
}
|
||||
|
||||
public SystemOS getPlatform() {
|
||||
return SystemOS.getOperatingSystem();
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package io.github.retrooper.packetevents.annotations;
|
||||
|
||||
import io.github.retrooper.packetevents.annotations.data.EventSynchronization;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
@@ -8,10 +10,9 @@ import java.lang.annotation.Target;
|
||||
@Target(ElementType.METHOD)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
/**
|
||||
* Just like Bukkit's @EventHandler, but for packets.
|
||||
* Make sure your class implements the PacketListener interface, and is registered!
|
||||
* Just like Bukkit's @EventHandler, but for PacketEvents' custom event system.
|
||||
* Make sure your class implements the PacketListener interface, and is registered when annotating your method with this annotation!
|
||||
*/
|
||||
public @interface PacketHandler {
|
||||
|
||||
|
||||
EventSynchronization synchronization() default EventSynchronization.NORMAL;
|
||||
}
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
package io.github.retrooper.packetevents.annotations.data;
|
||||
|
||||
public enum EventSynchronization {
|
||||
FORCE_SYNC, FORCE_ASYNC, NORMAL
|
||||
}
|
||||
@@ -11,26 +11,29 @@ public enum ServerVersion {
|
||||
|
||||
private static final ServerVersion[] reversedValues;
|
||||
private static final String nmsVersionSuffix = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
|
||||
private static ServerVersion cachedVersion = ServerVersion.EMPTY;
|
||||
private static ServerVersion cachedVersion;
|
||||
|
||||
static {
|
||||
reversedValues = reverse(values());
|
||||
}
|
||||
|
||||
public static ServerVersion getVersion() {
|
||||
if (cachedVersion != ServerVersion.EMPTY) {
|
||||
return cachedVersion;
|
||||
}
|
||||
private static ServerVersion getVers() {
|
||||
for (final ServerVersion val : reversedValues) {
|
||||
String valName = val.name().substring(2).replace("_", ".");
|
||||
if (Bukkit.getBukkitVersion().contains(valName)) {
|
||||
cachedVersion = val;
|
||||
return val;
|
||||
}
|
||||
}
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
public static ServerVersion getVersion() {
|
||||
if (cachedVersion == null) {
|
||||
cachedVersion = getVers();
|
||||
}
|
||||
return cachedVersion;
|
||||
}
|
||||
|
||||
private static ServerVersion[] reverse(final ServerVersion[] arr) {
|
||||
ServerVersion[] array = arr.clone();
|
||||
if (array == null) {
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package io.github.retrooper.packetevents.enums;
|
||||
|
||||
public enum SystemOS {
|
||||
WINDOWS, MACOS, LINUX, OTHER;
|
||||
|
||||
private static SystemOS value;
|
||||
|
||||
private static SystemOS getOS() {
|
||||
final String os = System.getProperty("os.name");
|
||||
for (final String osName : getOperatingSystemNames()) {
|
||||
if (os.toLowerCase().contains(osName.toLowerCase())) {
|
||||
return SystemOS.valueOf(osName);
|
||||
}
|
||||
}
|
||||
return OTHER;
|
||||
}
|
||||
|
||||
public static SystemOS getOperatingSystem() {
|
||||
if (value == null) {
|
||||
value = getOS();
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public static String[] getOperatingSystemNames() {
|
||||
final String[] arr = new String[values().length - 1];
|
||||
for (int i = 0; i < values().length - 1; i++) {
|
||||
arr[i] = values()[i].name();
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
}
|
||||
@@ -22,4 +22,38 @@ public enum PlayerAction {
|
||||
public static PlayerAction get(final int i) {
|
||||
return values()[i];
|
||||
}
|
||||
|
||||
public int getIndex() {
|
||||
for (int i = 0; i < values().length; i++) {
|
||||
final PlayerAction action = values()[i];
|
||||
if (action == this) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public enum UpdatedPlayerAction {
|
||||
PRESS_SHIFT_KEY, RELEASE_SHIFT_KEY, STOP_SLEEPING, START_SPRINTING, STOP_SPRINTING, START_RIDING_JUMP, STOP_RIDING_JUMP, OPEN_INVENTORY, START_FALL_FLYING;
|
||||
|
||||
public static UpdatedPlayerAction get(final int index) {
|
||||
for (int i = 0; i < index + 1; i++) {
|
||||
final UpdatedPlayerAction action = values()[i];
|
||||
if (i == index) {
|
||||
return action;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public int getIndex() {
|
||||
for (int i = 0; i < values().length; i++) {
|
||||
final UpdatedPlayerAction action = values()[i];
|
||||
if (action == this) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,8 @@ public enum PlayerDigType {
|
||||
|
||||
SWAP_HELD_ITEMS,
|
||||
|
||||
SWAP_ITEM_WITH_OFFHAND,
|
||||
|
||||
WRONG_PACKET;
|
||||
|
||||
public static PlayerDigType get(final int i) {
|
||||
|
||||
@@ -4,13 +4,9 @@ package io.github.retrooper.packetevents.event;
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.enums.ServerVersion;
|
||||
|
||||
/**
|
||||
* Incoming and sent packets are called asynchronously,
|
||||
* recommended to avoid non thread safe bukkit operations
|
||||
*/
|
||||
public class PacketEvent {
|
||||
protected static ServerVersion version = PacketEvents.getServerVersion();
|
||||
protected long timestamp = PacketEvents.highlyPreciseMillis();
|
||||
protected static ServerVersion version = PacketEvents.getAPI().getServerUtilities().getServerVersion();
|
||||
private long timestamp = PacketEvents.getAPI().currentMillis();
|
||||
|
||||
/**
|
||||
* Timestamp of the packet
|
||||
@@ -20,4 +16,8 @@ public class PacketEvent {
|
||||
public long getTimestamp() {
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
public void setTimestamp(long timestamp) {
|
||||
this.timestamp = timestamp;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.packet.PacketType;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public final class PacketReceiveEvent extends PacketEvent {
|
||||
@@ -34,7 +35,7 @@ public final class PacketReceiveEvent extends PacketEvent {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the raw NMS packet object
|
||||
* Get the NMS packet object
|
||||
*
|
||||
* @return packet object
|
||||
*/
|
||||
@@ -42,6 +43,28 @@ public final class PacketReceiveEvent extends PacketEvent {
|
||||
return this.packet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the class of the NMS packet object
|
||||
*
|
||||
* @return packet object class
|
||||
*/
|
||||
public Class<?> getNMSPacketClass() {
|
||||
return getNMSPacket().getClass();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the ID of the packet
|
||||
*
|
||||
* @return packet id
|
||||
*/
|
||||
public int getPacketId() {
|
||||
Integer id = PacketType.Client.packetIds.get(getNMSPacketClass());
|
||||
if (id == null) {
|
||||
return -1;
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the packet has been cancelled
|
||||
*
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.packet.PacketType;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
|
||||
@@ -26,9 +27,22 @@ public final class PacketSendEvent extends PacketEvent {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the ID of the packet
|
||||
*
|
||||
* @return packet id
|
||||
*/
|
||||
public int getPacketId() {
|
||||
Integer id =
|
||||
PacketType.Server.packetIds.get(getNMSPacketClass());
|
||||
if (id == null) {
|
||||
return -1;
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the raw NMS packet object
|
||||
* Get the NMS packet object
|
||||
*
|
||||
* @return packet object
|
||||
*/
|
||||
@@ -36,6 +50,15 @@ public final class PacketSendEvent extends PacketEvent {
|
||||
return this.packet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the class of the NMS packet object
|
||||
*
|
||||
* @return packet object class
|
||||
*/
|
||||
public Class<?> getNMSPacketClass() {
|
||||
return getNMSPacket().getClass();
|
||||
}
|
||||
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ 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 io.github.retrooper.packetevents.utils.api.VersionLookupUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public final class PlayerInjectEvent extends PacketEvent {
|
||||
|
||||
@@ -9,20 +9,16 @@ public final class ServerTickEvent extends PacketEvent {
|
||||
|
||||
public ServerTickEvent(final int tick, final long timestamp) {
|
||||
this.tick = tick;
|
||||
this.timestamp = timestamp;
|
||||
this.tps = PacketEvents.getCurrentServerTPS();
|
||||
setTimestamp(timestamp);
|
||||
this.tps = PacketEvents.getAPI().getServerUtilities().getCurrentServerTPS();
|
||||
}
|
||||
|
||||
public ServerTickEvent(final int tick) {
|
||||
this.tick = tick;
|
||||
this.tps = PacketEvents.getCurrentServerTPS();
|
||||
this.tps = PacketEvents.getAPI().getServerUtilities().getCurrentServerTPS();
|
||||
}
|
||||
|
||||
|
||||
public long getTimestamp() {
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
public int getCurrentTick() {
|
||||
return tick;
|
||||
}
|
||||
|
||||
@@ -1,20 +1,34 @@
|
||||
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.annotations.data.EventSynchronization;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketListener;
|
||||
import org.bukkit.Bukkit;
|
||||
|
||||
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.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
public final class EventManager {
|
||||
|
||||
private final ExecutorService executorService;
|
||||
private final HashMap<PacketListener, List<Method>> registeredMethods = new HashMap<PacketListener, List<Method>>();
|
||||
|
||||
public EventManager(final int threadCount) {
|
||||
executorService = Executors.newFixedThreadPool(threadCount);
|
||||
}
|
||||
|
||||
public EventManager() {
|
||||
this(Runtime.getRuntime().availableProcessors());
|
||||
}
|
||||
|
||||
public void callEvent(final PacketEvent e) {
|
||||
Integer i = 0;
|
||||
for (final PacketListener listener : registeredMethods.keySet()) {
|
||||
//Annotated methods
|
||||
final List<Method> methods = registeredMethods.get(listener);
|
||||
@@ -22,10 +36,23 @@ public final class EventManager {
|
||||
final Class<?> parameterType = method.getParameterTypes()[0];
|
||||
if (parameterType.equals(PacketEvent.class)
|
||||
|| parameterType.isInstance(e)) {
|
||||
try {
|
||||
method.invoke(listener, e);
|
||||
} catch (IllegalAccessException | InvocationTargetException ex) {
|
||||
ex.printStackTrace();
|
||||
final PacketHandler annotation = method.getAnnotation(PacketHandler.class);
|
||||
final Runnable invokeMethod = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
method.invoke(listener, e);
|
||||
} catch (IllegalAccessException | InvocationTargetException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
};
|
||||
if (annotation.synchronization() == EventSynchronization.FORCE_ASYNC) {
|
||||
executorService.execute(invokeMethod);
|
||||
} else if (annotation.synchronization() == EventSynchronization.FORCE_SYNC) {
|
||||
Bukkit.getScheduler().runTask(PacketEvents.getPlugin(), invokeMethod);
|
||||
} else {
|
||||
invokeMethod.run();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,19 +3,23 @@ package io.github.retrooper.packetevents.example;
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import static io.github.retrooper.packetevents.PacketEvents.getAPI;
|
||||
|
||||
public class MainExample extends JavaPlugin {
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
PacketEvents.load();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
PacketEvents.start(this);
|
||||
|
||||
PacketEvents.getServerTickTask().cancel();
|
||||
|
||||
getAPI().getServerTickTask().cancel();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
PacketEvents.stop();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
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.PlayerInjectEvent;
|
||||
@@ -12,13 +11,21 @@ import java.util.concurrent.Future;
|
||||
|
||||
public class NettyPacketHandler {
|
||||
public static final String handlerName = "packet_handler";
|
||||
private static final ServerVersion version = PacketEvents.getServerVersion();
|
||||
private static boolean v1_7_nettyMode = false;
|
||||
|
||||
static {
|
||||
try {
|
||||
Class.forName("io.netty.channel.Channel");
|
||||
} catch (ClassNotFoundException e) {
|
||||
v1_7_nettyMode = true;
|
||||
}
|
||||
}
|
||||
|
||||
public static void injectPlayer(final Player player) {
|
||||
final PlayerInjectEvent injectEvent = new PlayerInjectEvent(player);
|
||||
PacketEvents.getEventManager().callEvent(injectEvent);
|
||||
PacketEvents.getAPI().getEventManager().callEvent(injectEvent);
|
||||
if (!injectEvent.isCancelled()) {
|
||||
if (version.isLowerThan(ServerVersion.v_1_8)) {
|
||||
if (v1_7_nettyMode) {
|
||||
NettyPacketHandler_7.injectPlayer(player);
|
||||
} else {
|
||||
NettyPacketHandler_8.injectPlayer(player);
|
||||
@@ -28,9 +35,9 @@ public class NettyPacketHandler {
|
||||
|
||||
public static Future<?> uninjectPlayer(final Player player) {
|
||||
final PlayerUninjectEvent uninjectEvent = new PlayerUninjectEvent(player);
|
||||
PacketEvents.getEventManager().callEvent(uninjectEvent);
|
||||
PacketEvents.getAPI().getEventManager().callEvent(uninjectEvent);
|
||||
if (!uninjectEvent.isCancelled()) {
|
||||
if (version.isLowerThan(ServerVersion.v_1_8)) {
|
||||
if (v1_7_nettyMode) {
|
||||
return NettyPacketHandler_7.uninjectPlayer(player);
|
||||
} else {
|
||||
return NettyPacketHandler_8.uninjectPlayer(player);
|
||||
@@ -42,7 +49,7 @@ public class NettyPacketHandler {
|
||||
public static Object write(final Player sender, final Object packet) {
|
||||
final String packetName = packet.getClass().getSimpleName();
|
||||
final PacketSendEvent packetSendEvent = new PacketSendEvent(sender, packetName, packet);
|
||||
PacketEvents.getEventManager().callEvent(packetSendEvent);
|
||||
PacketEvents.getAPI().getEventManager().callEvent(packetSendEvent);
|
||||
if (!packetSendEvent.isCancelled()) {
|
||||
return packet;
|
||||
}
|
||||
@@ -52,7 +59,7 @@ public class NettyPacketHandler {
|
||||
public static Object read(final Player receiver, final Object packet) {
|
||||
final String packetName = packet.getClass().getSimpleName();
|
||||
final PacketReceiveEvent packetReceiveEvent = new PacketReceiveEvent(receiver, packetName, packet);
|
||||
PacketEvents.getEventManager().callEvent(packetReceiveEvent);
|
||||
PacketEvents.getAPI().getEventManager().callEvent(packetReceiveEvent);
|
||||
if (!packetReceiveEvent.isCancelled()) {
|
||||
return packet;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import org.bukkit.entity.Player;
|
||||
import java.util.concurrent.Future;
|
||||
|
||||
final class NettyPacketHandler_8 {
|
||||
private static final ServerVersion version = PacketEvents.getServerVersion();
|
||||
private static final ServerVersion version = PacketEvents.getAPI().getServerUtilities().getServerVersion();
|
||||
|
||||
public static void injectPlayer(final Player player) {
|
||||
final ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() {
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
package io.github.retrooper.packetevents.mojang;
|
||||
|
||||
import com.mojang.authlib.properties.PropertyMap;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
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 && name.isEmpty()) {
|
||||
throw new IllegalArgumentException("Name and ID cannot both be blank");
|
||||
} else {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
public UUID getId() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public PropertyMap getProperties() {
|
||||
return this.properties;
|
||||
}
|
||||
|
||||
public boolean isComplete() {
|
||||
return this.id != null && !getName().isEmpty();
|
||||
}
|
||||
|
||||
|
||||
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());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
} else if (o != null && this.getClass() == o.getClass()) {
|
||||
GameProfile that = (GameProfile) o;
|
||||
if (this.id != null) {
|
||||
if (!this.id.equals(that.id)) {
|
||||
return false;
|
||||
}
|
||||
} else if (that.id != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.name != null) {
|
||||
return this.name.equals(that.name);
|
||||
} else return that.name == null;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@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 "id: " + id + ", name: " + name + ", legacy: " + legacy;
|
||||
}
|
||||
}
|
||||
@@ -1,178 +1,211 @@
|
||||
package io.github.retrooper.packetevents.packet;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.enums.ServerVersion;
|
||||
import io.github.retrooper.packetevents.reflectionutils.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public final class PacketType {
|
||||
private static final ServerVersion version = PacketEvents.getServerVersion();
|
||||
public class PacketType {
|
||||
|
||||
|
||||
public static final class Util {
|
||||
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) {
|
||||
packetPlayInPosition = Reflection.getSubClass(packetPlayInFlying, Client.POSITION);
|
||||
packetPlayInPositionLook = Reflection.getSubClass(packetPlayInFlying, Client.POSITION_LOOK);
|
||||
packetPlayInLook = Reflection.getSubClass(packetPlayInFlying, Client.LOOK);
|
||||
}
|
||||
|
||||
try {
|
||||
packetPlayInUseEntity = NMSUtils.getNMSClass(Client.USE_ENTITY);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
public static class Client {
|
||||
public static class Util {
|
||||
public static boolean isInstanceOfFlying(final int packetId) {
|
||||
return packetId == FLYING
|
||||
|| packetId == POSITION
|
||||
|| packetId == POSITION_LOOK
|
||||
|| packetId == LOOK;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
public static final Map<Class<?>, Integer> packetIds = new HashMap<Class<?>, Integer>();
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
public static final int TELEPORT_ACCEPT = 0,
|
||||
TILE_NBT_QUERY = 1, DIFFICULTY_CHANGE = 2, CHAT = 3, CLIENT_COMMAND = 4,
|
||||
SETTINGS = 5, TAB_COMPLETE = 6, TRANSACTION = 7, ENCHANT_ITEM = 8,
|
||||
WINDOW_CLICK = 9, CLOSE_WINDOW = 10, CUSTOM_PAYLOAD = 11, B_EDIT = 12,
|
||||
ENTITY_NBT_QUERY = 13, USE_ENTITY = 14, JIGSAW_GENERATE = 15, KEEP_ALIVE = 16,
|
||||
DIFFICULTY_LOCK = 17, POSITION = 18, POSITION_LOOK = 19, LOOK = 20,
|
||||
FLYING = 21, VEHICLE_MOVE = 22, BOAT_MOVE = 23, PICK_ITEM = 24,
|
||||
AUTO_RECIPE = 25, ABILITIES = 26, BLOCK_DIG = 27, ENTITY_ACTION = 28,
|
||||
STEER_VEHICLE = 29, RECIPE_DISPLAYED = 30, ITEM_NAME = 31, RESOURCE_PACK_STATUS = 32,
|
||||
ADVANCEMENTS = 33, TR_SEL = 34, BEACON = 35, HELD_ITEM_SLOT = 36,
|
||||
SET_COMMAND_BLOCK = 37, SET_COMMAND_MINECART = 38, SET_CREATIVE_SLOT = 39, SET_JIGSAW = 40,
|
||||
STRUCT = 41, UPDATE_SIGN = 42, ARM_ANIMATION = 43, SPECTATE = 44,
|
||||
USE_ITEM = 45, BLOCK_PLACE = 46;
|
||||
|
||||
/**
|
||||
* 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);
|
||||
public static void init() {
|
||||
packetIds.put(PacketTypeClasses.Client.TELEPORT_ACCEPT, TELEPORT_ACCEPT);
|
||||
packetIds.put(PacketTypeClasses.Client.TILE_NBT_QUERY, TILE_NBT_QUERY);
|
||||
packetIds.put(PacketTypeClasses.Client.DIFFICULTY_CHANGE, DIFFICULTY_CHANGE);
|
||||
packetIds.put(PacketTypeClasses.Client.CHAT, CHAT);
|
||||
packetIds.put(PacketTypeClasses.Client.CLIENT_COMMAND, CLIENT_COMMAND);
|
||||
packetIds.put(PacketTypeClasses.Client.SETTINGS, SETTINGS);
|
||||
packetIds.put(PacketTypeClasses.Client.TAB_COMPLETE, TAB_COMPLETE);
|
||||
packetIds.put(PacketTypeClasses.Client.TRANSACTION, TRANSACTION);
|
||||
packetIds.put(PacketTypeClasses.Client.ENCHANT_ITEM, ENCHANT_ITEM);
|
||||
packetIds.put(PacketTypeClasses.Client.WINDOW_CLICK, WINDOW_CLICK);
|
||||
packetIds.put(PacketTypeClasses.Client.CLOSE_WINDOW, CLOSE_WINDOW);
|
||||
packetIds.put(PacketTypeClasses.Client.CUSTOM_PAYLOAD, CUSTOM_PAYLOAD);
|
||||
packetIds.put(PacketTypeClasses.Client.B_EDIT, B_EDIT);
|
||||
packetIds.put(PacketTypeClasses.Client.ENTITY_NBT_QUERY, ENTITY_NBT_QUERY);
|
||||
packetIds.put(PacketTypeClasses.Client.USE_ENTITY, USE_ENTITY);
|
||||
packetIds.put(PacketTypeClasses.Client.JIGSAW_GENERATE, JIGSAW_GENERATE);
|
||||
packetIds.put(PacketTypeClasses.Client.KEEP_ALIVE, KEEP_ALIVE);
|
||||
packetIds.put(PacketTypeClasses.Client.DIFFICULTY_LOCK, DIFFICULTY_LOCK);
|
||||
packetIds.put(PacketTypeClasses.Client.POSITION, POSITION);
|
||||
packetIds.put(PacketTypeClasses.Client.POSITION_LOOK, POSITION_LOOK);
|
||||
packetIds.put(PacketTypeClasses.Client.LOOK, LOOK);
|
||||
packetIds.put(PacketTypeClasses.Client.FLYING, FLYING);
|
||||
packetIds.put(PacketTypeClasses.Client.VEHICLE_MOVE, VEHICLE_MOVE);
|
||||
packetIds.put(PacketTypeClasses.Client.BOAT_MOVE, BOAT_MOVE);
|
||||
packetIds.put(PacketTypeClasses.Client.PICK_ITEM, PICK_ITEM);
|
||||
packetIds.put(PacketTypeClasses.Client.AUTO_RECIPE, AUTO_RECIPE);
|
||||
packetIds.put(PacketTypeClasses.Client.ABILITIES, ABILITIES);
|
||||
packetIds.put(PacketTypeClasses.Client.BLOCK_DIG, BLOCK_DIG);
|
||||
packetIds.put(PacketTypeClasses.Client.ENTITY_ACTION, ENTITY_ACTION);
|
||||
packetIds.put(PacketTypeClasses.Client.STEER_VEHICLE, STEER_VEHICLE);
|
||||
packetIds.put(PacketTypeClasses.Client.RECIPE_DISPLAYED, RECIPE_DISPLAYED);
|
||||
packetIds.put(PacketTypeClasses.Client.ITEM_NAME, ITEM_NAME);
|
||||
packetIds.put(PacketTypeClasses.Client.RESOURCE_PACK_STATUS, RESOURCE_PACK_STATUS);
|
||||
packetIds.put(PacketTypeClasses.Client.ADVANCEMENTS, ADVANCEMENTS);
|
||||
packetIds.put(PacketTypeClasses.Client.TR_SEL, TR_SEL);
|
||||
packetIds.put(PacketTypeClasses.Client.BEACON, BEACON);
|
||||
packetIds.put(PacketTypeClasses.Client.HELD_ITEM_SLOT, HELD_ITEM_SLOT);
|
||||
packetIds.put(PacketTypeClasses.Client.SET_COMMAND_BLOCK, SET_COMMAND_BLOCK);
|
||||
packetIds.put(PacketTypeClasses.Client.SET_COMMAND_MINECART, SET_COMMAND_MINECART);
|
||||
packetIds.put(PacketTypeClasses.Client.SET_CREATIVE_SLOT, SET_CREATIVE_SLOT);
|
||||
packetIds.put(PacketTypeClasses.Client.SET_JIGSAW, SET_JIGSAW);
|
||||
packetIds.put(PacketTypeClasses.Client.STRUCT, STRUCT);
|
||||
packetIds.put(PacketTypeClasses.Client.UPDATE_SIGN, UPDATE_SIGN);
|
||||
packetIds.put(PacketTypeClasses.Client.ARM_ANIMATION, ARM_ANIMATION);
|
||||
packetIds.put(PacketTypeClasses.Client.SPECTATE, SPECTATE);
|
||||
packetIds.put(PacketTypeClasses.Client.USE_ITEM, USE_ITEM);
|
||||
packetIds.put(PacketTypeClasses.Client.BLOCK_PLACE, BLOCK_PLACE);
|
||||
}
|
||||
}
|
||||
|
||||
public static final class Client {
|
||||
private static final String c = "PacketPlayIn";
|
||||
/*
|
||||
* Only exists in 1.7.10->1.8.8 & 1.16+
|
||||
*/
|
||||
public static final String FLYING = c + "Flying";
|
||||
public static class Server {
|
||||
public static final Map<Class<?>, Integer> packetIds = new HashMap<Class<?>, Integer>();
|
||||
public static int SPAWN_ENTITY = 0, SPAWN_ENTITY_EXPERIENCE_ORB = 1, SPAWN_ENTITY_WEATHER = 2, SPAWN_ENTITY_LIVING = 3,
|
||||
SPAWN_ENTITY_PAINTING = 4, SPAWN_ENTITY_SPAWN = 5, ANIMATION = 6, STATISTIC = 7,
|
||||
BLOCK_BREAK = 8, BLOCK_BREAK_ANIMATION = 9, TILE_ENTITY_DATA = 10, BLOCK_ACTION = 11,
|
||||
BLOCK_CHANGE = 12, BOSS = 13, SERVER_DIFFICULTY = 14, CHAT = 15, MULTI_BLOCK_CHANGE = 16,
|
||||
TAB_COMPLETE = 17, COMMANDS = 18, TRANSACTION = 19, CLOSE_WINDOW = 20,
|
||||
WINDOW_ITEMS = 21, WINDOW_DATA = 22, SET_SLOT = 23, SET_COOLDOWN = 24,
|
||||
CUSTOM_PAYLOAD = 25, CUSTOM_SOUND_EFFECT = 26, KICK_DISCONNECT = 27, ENTITY_STATUS = 28,
|
||||
EXPLOSION = 29, UNLOAD_CHUNK = 30, GAME_STATE_CHANGE = 31, OPEN_WINDOW_HORSE = 32,
|
||||
KEEP_ALIVE = 33, MAP_CHUNK = 34, WORLD_EVENT = 35, WORLD_PARTICLES = 36,
|
||||
LIGHT_UPDATE = 37, LOGIN = 38, MAP = 39, OPEN_WINDOW_MERCHANT = 40,
|
||||
REL_ENTITY_MOVE = 41, REL_ENTITY_MOVE_LOOK = 42, ENTITY_LOOK = 43, ENTITY = 44,
|
||||
VEHICLE_MOVE = 45, OPEN_BOOK = 46, OPEN_WINDOW = 47, OPEN_SIGN_EDITOR = 48,
|
||||
AUTO_RECIPE = 49, ABILITIES = 50, COMBAT_EVENT = 51, PLAYER_INFO = 52,
|
||||
LOOK_AT = 53, POSITION = 54, RECIPES = 55, ENTITY_DESTROY = 56,
|
||||
REMOVE_ENTITY_EFFECT = 57, RESOURCE_PACK_SEND = 58, RESPAWN = 59, ENTITY_HEAD_ROTATION = 60,
|
||||
SELECT_ADVANCEMENT_TAB = 61, WORLD_BORDER = 62, CAMERA = 63, HELD_ITEM_SLOT = 64,
|
||||
VIEW_CENTRE = 65, VIEW_DISTANCE = 66, SCOREBOARD_DISPLAY_OBJECTIVE = 67, ENTITY_METADATA = 68,
|
||||
ATTACH_ENTITY = 69, ENTITY_VELOCITY = 70, ENTITY_EQUIPMENT = 71, EXPERIENCE = 72,
|
||||
UPDATE_HEALTH = 73, SCOREBOARD_OBJECTIVE = 74, MOUNT = 75, SCOREBOARD_TEAM = 76,
|
||||
SCOREBOARD_SCORE = 77, SPAWN_POSITION = 78, UPDATE_TIME = 79, TITLE = 80,
|
||||
ENTITY_SOUND = 81, NAMED_SOUND_EFFECT = 82, STOP_SOUND = 83, PLAYER_LIST_HEADER_FOOTER = 84,
|
||||
NBT_QUERY = 85, COLLECT = 86, ENTITY_TELEPORT = 87, ADVANCEMENTS = 88, UPDATE_ATTRIBUTES = 89,
|
||||
ENTITY_EFFECT = 90, RECIPE_UPDATE = 91, TAGS = 92, MAP_CHUNK_BULK = 93;
|
||||
|
||||
|
||||
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 void init() {
|
||||
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY, SPAWN_ENTITY);
|
||||
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY_EXPERIENCE_ORB, SPAWN_ENTITY_EXPERIENCE_ORB);
|
||||
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY_WEATHER, SPAWN_ENTITY_WEATHER);
|
||||
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY_LIVING, SPAWN_ENTITY_LIVING);
|
||||
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY_PAINTING, SPAWN_ENTITY_PAINTING);
|
||||
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY_SPAWN, SPAWN_ENTITY_SPAWN);
|
||||
packetIds.put(PacketTypeClasses.Server.ANIMATION, ANIMATION);
|
||||
packetIds.put(PacketTypeClasses.Server.STATISTIC, STATISTIC);
|
||||
packetIds.put(PacketTypeClasses.Server.BLOCK_BREAK, BLOCK_BREAK);
|
||||
packetIds.put(PacketTypeClasses.Server.BLOCK_BREAK_ANIMATION, BLOCK_BREAK_ANIMATION);
|
||||
packetIds.put(PacketTypeClasses.Server.TILE_ENTITY_DATA, TILE_ENTITY_DATA);
|
||||
packetIds.put(PacketTypeClasses.Server.BLOCK_ACTION, BLOCK_ACTION);
|
||||
packetIds.put(PacketTypeClasses.Server.BLOCK_CHANGE, BLOCK_CHANGE);
|
||||
packetIds.put(PacketTypeClasses.Server.BOSS, BOSS);
|
||||
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY, SPAWN_ENTITY);
|
||||
packetIds.put(PacketTypeClasses.Server.SERVER_DIFFICULTY, SERVER_DIFFICULTY);
|
||||
packetIds.put(PacketTypeClasses.Server.CHAT, CHAT);
|
||||
packetIds.put(PacketTypeClasses.Server.MULTI_BLOCK_CHANGE, MULTI_BLOCK_CHANGE);
|
||||
packetIds.put(PacketTypeClasses.Server.TAB_COMPLETE, TAB_COMPLETE);
|
||||
packetIds.put(PacketTypeClasses.Server.COMMANDS, COMMANDS);
|
||||
packetIds.put(PacketTypeClasses.Server.TRANSACTION, TRANSACTION);
|
||||
packetIds.put(PacketTypeClasses.Server.CLOSE_WINDOW, CLOSE_WINDOW);
|
||||
packetIds.put(PacketTypeClasses.Server.WINDOW_ITEMS, WINDOW_ITEMS);
|
||||
packetIds.put(PacketTypeClasses.Server.WINDOW_DATA, WINDOW_DATA);
|
||||
packetIds.put(PacketTypeClasses.Server.SET_SLOT, SET_SLOT);
|
||||
packetIds.put(PacketTypeClasses.Server.CUSTOM_PAYLOAD, CUSTOM_PAYLOAD);
|
||||
packetIds.put(PacketTypeClasses.Server.CUSTOM_SOUND_EFFECT, CUSTOM_SOUND_EFFECT);
|
||||
packetIds.put(PacketTypeClasses.Server.KICK_DISCONNECT, KICK_DISCONNECT);
|
||||
packetIds.put(PacketTypeClasses.Server.ENTITY_STATUS, ENTITY_STATUS);
|
||||
packetIds.put(PacketTypeClasses.Server.EXPLOSION, EXPLOSION);
|
||||
packetIds.put(PacketTypeClasses.Server.UNLOAD_CHUNK, UNLOAD_CHUNK);
|
||||
packetIds.put(PacketTypeClasses.Server.GAME_STATE_CHANGE, GAME_STATE_CHANGE);
|
||||
packetIds.put(PacketTypeClasses.Server.OPEN_WINDOW_HORSE, OPEN_WINDOW_HORSE);
|
||||
packetIds.put(PacketTypeClasses.Server.KEEP_ALIVE, KEEP_ALIVE);
|
||||
packetIds.put(PacketTypeClasses.Server.MAP_CHUNK, MAP_CHUNK);
|
||||
packetIds.put(PacketTypeClasses.Server.WORLD_EVENT, SPAWN_ENTITY);
|
||||
packetIds.put(PacketTypeClasses.Server.WORLD_PARTICLES, WORLD_PARTICLES);
|
||||
packetIds.put(PacketTypeClasses.Server.LIGHT_UPDATE, LIGHT_UPDATE);
|
||||
packetIds.put(PacketTypeClasses.Server.LOGIN, LOGIN);
|
||||
packetIds.put(PacketTypeClasses.Server.MAP, MAP);
|
||||
packetIds.put(PacketTypeClasses.Server.OPEN_WINDOW_MERCHANT, OPEN_WINDOW_MERCHANT);
|
||||
packetIds.put(PacketTypeClasses.Server.REL_ENTITY_MOVE, REL_ENTITY_MOVE);
|
||||
packetIds.put(PacketTypeClasses.Server.REL_ENTITY_MOVE_LOOK, REL_ENTITY_MOVE_LOOK);
|
||||
packetIds.put(PacketTypeClasses.Server.ENTITY_LOOK, ENTITY_LOOK);
|
||||
packetIds.put(PacketTypeClasses.Server.ENTITY, ENTITY);
|
||||
packetIds.put(PacketTypeClasses.Server.VEHICLE_MOVE, VEHICLE_MOVE);
|
||||
packetIds.put(PacketTypeClasses.Server.OPEN_BOOK, OPEN_BOOK);
|
||||
packetIds.put(PacketTypeClasses.Server.OPEN_WINDOW, OPEN_WINDOW);
|
||||
packetIds.put(PacketTypeClasses.Server.OPEN_SIGN_EDITOR, OPEN_SIGN_EDITOR);
|
||||
packetIds.put(PacketTypeClasses.Server.AUTO_RECIPE, AUTO_RECIPE);
|
||||
packetIds.put(PacketTypeClasses.Server.ABILITIES, ABILITIES);
|
||||
packetIds.put(PacketTypeClasses.Server.COMBAT_EVENT, COMBAT_EVENT);
|
||||
packetIds.put(PacketTypeClasses.Server.PLAYER_INFO, PLAYER_INFO);
|
||||
packetIds.put(PacketTypeClasses.Server.LOOK_AT, LOOK_AT);
|
||||
packetIds.put(PacketTypeClasses.Server.POSITION, POSITION);
|
||||
packetIds.put(PacketTypeClasses.Server.RECIPES, RECIPES);
|
||||
packetIds.put(PacketTypeClasses.Server.ENTITY_DESTROY, ENTITY_DESTROY);
|
||||
packetIds.put(PacketTypeClasses.Server.REMOVE_ENTITY_EFFECT, REMOVE_ENTITY_EFFECT);
|
||||
packetIds.put(PacketTypeClasses.Server.RESOURCE_PACK_SEND, RESOURCE_PACK_SEND);
|
||||
packetIds.put(PacketTypeClasses.Server.RESPAWN, RESPAWN);
|
||||
packetIds.put(PacketTypeClasses.Server.ENTITY_HEAD_ROTATION, ENTITY_HEAD_ROTATION);
|
||||
packetIds.put(PacketTypeClasses.Server.SELECT_ADVANCEMENT_TAB, SELECT_ADVANCEMENT_TAB);
|
||||
packetIds.put(PacketTypeClasses.Server.WORLD_BORDER, WORLD_BORDER);
|
||||
packetIds.put(PacketTypeClasses.Server.CAMERA, CAMERA);
|
||||
packetIds.put(PacketTypeClasses.Server.HELD_ITEM_SLOT, HELD_ITEM_SLOT);
|
||||
packetIds.put(PacketTypeClasses.Server.VIEW_CENTRE, VIEW_CENTRE);
|
||||
packetIds.put(PacketTypeClasses.Server.VIEW_DISTANCE, VIEW_DISTANCE);
|
||||
packetIds.put(PacketTypeClasses.Server.SCOREBOARD_DISPLAY_OBJECTIVE, SCOREBOARD_DISPLAY_OBJECTIVE);
|
||||
packetIds.put(PacketTypeClasses.Server.ENTITY_METADATA, ENTITY_METADATA);
|
||||
packetIds.put(PacketTypeClasses.Server.ATTACH_ENTITY, ATTACH_ENTITY);
|
||||
packetIds.put(PacketTypeClasses.Server.ENTITY_VELOCITY, ENTITY_VELOCITY);
|
||||
packetIds.put(PacketTypeClasses.Server.ENTITY_EQUIPMENT, ENTITY_EQUIPMENT);
|
||||
packetIds.put(PacketTypeClasses.Server.EXPERIENCE, EXPERIENCE);
|
||||
packetIds.put(PacketTypeClasses.Server.UPDATE_HEALTH, UPDATE_HEALTH);
|
||||
packetIds.put(PacketTypeClasses.Server.SCOREBOARD_OBJECTIVE, SCOREBOARD_OBJECTIVE);
|
||||
packetIds.put(PacketTypeClasses.Server.MOUNT, MOUNT);
|
||||
packetIds.put(PacketTypeClasses.Server.SCOREBOARD_TEAM, SCOREBOARD_TEAM);
|
||||
packetIds.put(PacketTypeClasses.Server.SCOREBOARD_SCORE, SCOREBOARD_SCORE);
|
||||
packetIds.put(PacketTypeClasses.Server.SPAWN_POSITION, SPAWN_POSITION);
|
||||
packetIds.put(PacketTypeClasses.Server.UPDATE_TIME, UPDATE_TIME);
|
||||
packetIds.put(PacketTypeClasses.Server.TITLE, TITLE);
|
||||
packetIds.put(PacketTypeClasses.Server.ENTITY_SOUND, ENTITY_SOUND);
|
||||
packetIds.put(PacketTypeClasses.Server.NAMED_SOUND_EFFECT, NAMED_SOUND_EFFECT);
|
||||
packetIds.put(PacketTypeClasses.Server.STOP_SOUND, STOP_SOUND);
|
||||
packetIds.put(PacketTypeClasses.Server.PLAYER_LIST_HEADER_FOOTER, PLAYER_LIST_HEADER_FOOTER);
|
||||
packetIds.put(PacketTypeClasses.Server.NBT_QUERY, NBT_QUERY);
|
||||
packetIds.put(PacketTypeClasses.Server.COLLECT, COLLECT);
|
||||
packetIds.put(PacketTypeClasses.Server.ENTITY_TELEPORT, ENTITY_TELEPORT);
|
||||
packetIds.put(PacketTypeClasses.Server.ADVANCEMENTS, ADVANCEMENTS);
|
||||
packetIds.put(PacketTypeClasses.Server.UPDATE_ATTRIBUTES, UPDATE_ATTRIBUTES);
|
||||
packetIds.put(PacketTypeClasses.Server.ENTITY_EFFECT, ENTITY_EFFECT);
|
||||
packetIds.put(PacketTypeClasses.Server.RECIPE_UPDATE, RECIPE_UPDATE);
|
||||
packetIds.put(PacketTypeClasses.Server.TAGS, TAGS);
|
||||
packetIds.put(PacketTypeClasses.Server.MAP_CHUNK_BULK, MAP_CHUNK_BULK);
|
||||
}
|
||||
}
|
||||
|
||||
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";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,234 @@
|
||||
package io.github.retrooper.packetevents.packet;
|
||||
|
||||
import io.github.retrooper.packetevents.annotations.Nullable;
|
||||
import io.github.retrooper.packetevents.reflectionutils.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
public class PacketTypeClasses {
|
||||
public static class Client {
|
||||
public static Class<?> POSITION, POSITION_LOOK, LOOK, CLIENT_COMMAND,
|
||||
TRANSACTION, BLOCK_DIG, ENTITY_ACTION, USE_ENTITY,
|
||||
WINDOW_CLICK, STEER_VEHICLE, CUSTOM_PAYLOAD, ARM_ANIMATION,
|
||||
BLOCK_PLACE, USE_ITEM, ABILITIES, HELD_ITEM_SLOT,
|
||||
CLOSE_WINDOW, TAB_COMPLETE, CHAT, SET_CREATIVE_SLOT,
|
||||
KEEP_ALIVE, SETTINGS, ENCHANT_ITEM, TELEPORT_ACCEPT,
|
||||
TILE_NBT_QUERY, DIFFICULTY_CHANGE, B_EDIT, ENTITY_NBT_QUERY,
|
||||
JIGSAW_GENERATE, DIFFICULTY_LOCK, VEHICLE_MOVE, BOAT_MOVE, PICK_ITEM,
|
||||
AUTO_RECIPE, RECIPE_DISPLAYED, ITEM_NAME, RESOURCE_PACK_STATUS,
|
||||
ADVANCEMENTS, TR_SEL, BEACON, SET_COMMAND_BLOCK,
|
||||
SET_COMMAND_MINECART, SET_JIGSAW, STRUCT, UPDATE_SIGN, SPECTATE;
|
||||
private static final String c = "PacketPlayIn";
|
||||
@Nullable
|
||||
public static final Class<?> FLYING = NMSUtils.getNMSClassWithoutException(c + "Flying");
|
||||
|
||||
public static void load() {
|
||||
try {
|
||||
POSITION = NMSUtils.getNMSClass(c + "Position");
|
||||
POSITION_LOOK = NMSUtils.getNMSClass(c + "PositionLook");
|
||||
LOOK = NMSUtils.getNMSClass(c + "Look");
|
||||
} catch (ClassNotFoundException e) {
|
||||
POSITION = Reflection.getSubClass(FLYING, c + "Position");
|
||||
POSITION_LOOK = Reflection.getSubClass(FLYING, c + "PositionLook");
|
||||
LOOK = Reflection.getSubClass(FLYING, c + "Look");
|
||||
}
|
||||
|
||||
try {
|
||||
SETTINGS = NMSUtils.getNMSClass(c + "Settings");
|
||||
ENCHANT_ITEM = NMSUtils.getNMSClass(c + "EnchantItem");
|
||||
|
||||
CLIENT_COMMAND = NMSUtils.getNMSClass(c + "ClientCommand");
|
||||
TRANSACTION = NMSUtils.getNMSClass(c + "Transaction");
|
||||
BLOCK_DIG = NMSUtils.getNMSClass(c + "BlockDig");
|
||||
ENTITY_ACTION = NMSUtils.getNMSClass(c + "EntityAction");
|
||||
USE_ENTITY = NMSUtils.getNMSClass(c + "UseEntity");
|
||||
WINDOW_CLICK = NMSUtils.getNMSClass(c + "WindowClick");
|
||||
STEER_VEHICLE = NMSUtils.getNMSClass(c + "SteerVehicle");
|
||||
CUSTOM_PAYLOAD = NMSUtils.getNMSClass(c + "CustomPayload");
|
||||
ARM_ANIMATION = NMSUtils.getNMSClass(c + "ArmAnimation");
|
||||
ABILITIES = NMSUtils.getNMSClass(c + "Abilities");
|
||||
HELD_ITEM_SLOT = NMSUtils.getNMSClass(c + "HeldItemSlot");
|
||||
CLOSE_WINDOW = NMSUtils.getNMSClass(c + "CloseWindow");
|
||||
TAB_COMPLETE = NMSUtils.getNMSClass(c + "TabComplete");
|
||||
CHAT = NMSUtils.getNMSClass(c + "Chat");
|
||||
SET_CREATIVE_SLOT = NMSUtils.getNMSClass(c + "SetCreativeSlot");
|
||||
KEEP_ALIVE = NMSUtils.getNMSClass(c + "KeepAlive");
|
||||
UPDATE_SIGN = NMSUtils.getNMSClassWithoutException(c + "UpdateSign");
|
||||
|
||||
TELEPORT_ACCEPT = NMSUtils.getNMSClassWithoutException(c + "TeleportAccept");
|
||||
TILE_NBT_QUERY = NMSUtils.getNMSClassWithoutException(c + "TileNBTQuery");
|
||||
DIFFICULTY_CHANGE = NMSUtils.getNMSClassWithoutException(c + "DifficultyChange");
|
||||
B_EDIT = NMSUtils.getNMSClassWithoutException(c + "BEdit");
|
||||
ENTITY_NBT_QUERY = NMSUtils.getNMSClassWithoutException(c + "EntityNBTQuery");
|
||||
JIGSAW_GENERATE = NMSUtils.getNMSClassWithoutException(c + "JigsawGenerate");
|
||||
DIFFICULTY_LOCK = NMSUtils.getNMSClassWithoutException(c + "DifficultyLock");
|
||||
VEHICLE_MOVE = NMSUtils.getNMSClassWithoutException(c + "VehicleMove");
|
||||
BOAT_MOVE = NMSUtils.getNMSClassWithoutException(c + "BoatMove");
|
||||
PICK_ITEM = NMSUtils.getNMSClassWithoutException(c + "PickItem");
|
||||
AUTO_RECIPE = NMSUtils.getNMSClassWithoutException(c + "AutoRecipe");
|
||||
RECIPE_DISPLAYED = NMSUtils.getNMSClassWithoutException(c + "RecipeDisplayed");
|
||||
ITEM_NAME = NMSUtils.getNMSClassWithoutException(c + "ItemName");
|
||||
//1.8+
|
||||
RESOURCE_PACK_STATUS = NMSUtils.getNMSClassWithoutException(c + "ResourcePackStatus");
|
||||
|
||||
ADVANCEMENTS = NMSUtils.getNMSClassWithoutException(c + "Advancements");
|
||||
TR_SEL = NMSUtils.getNMSClassWithoutException(c + "TrSel");
|
||||
BEACON = NMSUtils.getNMSClassWithoutException(c + "Beacon");
|
||||
SET_COMMAND_BLOCK = NMSUtils.getNMSClassWithoutException(c + "SetCommandBlock");
|
||||
SET_COMMAND_MINECART = NMSUtils.getNMSClassWithoutException(c + "SetCommandMinecart");
|
||||
SET_JIGSAW = NMSUtils.getNMSClassWithoutException(c + "SetJigsaw");
|
||||
STRUCT = NMSUtils.getNMSClassWithoutException(c + "Struct");
|
||||
SPECTATE = NMSUtils.getNMSClassWithoutException(c + "Spectate");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
//Block place
|
||||
try {
|
||||
BLOCK_PLACE = NMSUtils.getNMSClass(c + "BlockPlace");
|
||||
} catch (ClassNotFoundException e) {
|
||||
//They are just on a newer version
|
||||
try {
|
||||
USE_ITEM = NMSUtils.getNMSClass(c + "UseItem");
|
||||
} catch (ClassNotFoundException e2) {
|
||||
e.printStackTrace();
|
||||
e2.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PacketType.Client.init();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class Server {
|
||||
private static final String s = "PacketPlayOut";
|
||||
public static Class<?> SPAWN_ENTITY, SPAWN_ENTITY_EXPERIENCE_ORB, SPAWN_ENTITY_WEATHER, SPAWN_ENTITY_LIVING,
|
||||
SPAWN_ENTITY_PAINTING, SPAWN_ENTITY_SPAWN, ANIMATION, STATISTIC,
|
||||
BLOCK_BREAK, BLOCK_BREAK_ANIMATION, TILE_ENTITY_DATA, BLOCK_ACTION,
|
||||
BLOCK_CHANGE, BOSS, SERVER_DIFFICULTY, CHAT, MULTI_BLOCK_CHANGE,
|
||||
TAB_COMPLETE, COMMANDS, TRANSACTION, CLOSE_WINDOW,
|
||||
WINDOW_ITEMS, WINDOW_DATA, SET_SLOT, SET_COOLDOWN,
|
||||
CUSTOM_PAYLOAD, CUSTOM_SOUND_EFFECT, KICK_DISCONNECT, ENTITY_STATUS,
|
||||
EXPLOSION, UNLOAD_CHUNK, GAME_STATE_CHANGE, OPEN_WINDOW_HORSE,
|
||||
KEEP_ALIVE, MAP_CHUNK, WORLD_EVENT, WORLD_PARTICLES,
|
||||
LIGHT_UPDATE, LOGIN, MAP, OPEN_WINDOW_MERCHANT,
|
||||
REL_ENTITY_MOVE, REL_ENTITY_MOVE_LOOK, ENTITY_LOOK, ENTITY,
|
||||
VEHICLE_MOVE, OPEN_BOOK, OPEN_WINDOW, OPEN_SIGN_EDITOR,
|
||||
AUTO_RECIPE, ABILITIES, COMBAT_EVENT, PLAYER_INFO,
|
||||
LOOK_AT, POSITION, RECIPES, ENTITY_DESTROY,
|
||||
REMOVE_ENTITY_EFFECT, RESOURCE_PACK_SEND, RESPAWN, ENTITY_HEAD_ROTATION,
|
||||
SELECT_ADVANCEMENT_TAB, WORLD_BORDER, CAMERA, HELD_ITEM_SLOT,
|
||||
VIEW_CENTRE, VIEW_DISTANCE, SCOREBOARD_DISPLAY_OBJECTIVE, ENTITY_METADATA,
|
||||
ATTACH_ENTITY, ENTITY_VELOCITY, ENTITY_EQUIPMENT, EXPERIENCE,
|
||||
UPDATE_HEALTH, SCOREBOARD_OBJECTIVE, MOUNT, SCOREBOARD_TEAM,
|
||||
SCOREBOARD_SCORE, SPAWN_POSITION, UPDATE_TIME, TITLE,
|
||||
ENTITY_SOUND, NAMED_SOUND_EFFECT, STOP_SOUND, PLAYER_LIST_HEADER_FOOTER,
|
||||
NBT_QUERY, COLLECT, ENTITY_TELEPORT, ADVANCEMENTS, UPDATE_ATTRIBUTES,
|
||||
ENTITY_EFFECT, RECIPE_UPDATE, TAGS, MAP_CHUNK_BULK;
|
||||
|
||||
public static void load() {
|
||||
SPAWN_ENTITY = NMSUtils.getNMSClassWithoutException(s + "SpawnEntity");
|
||||
SPAWN_ENTITY_EXPERIENCE_ORB = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityExperienceOrb");
|
||||
SPAWN_ENTITY_WEATHER = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityWeather");
|
||||
SPAWN_ENTITY_LIVING = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityLiving");
|
||||
SPAWN_ENTITY_PAINTING = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityPainting");
|
||||
SPAWN_ENTITY_SPAWN = NMSUtils.getNMSClassWithoutException(s + "SpawnEntitySpawn");
|
||||
ANIMATION = NMSUtils.getNMSClassWithoutException(s + "Animation");
|
||||
STATISTIC = NMSUtils.getNMSClassWithoutException(s + "Statistic");
|
||||
BLOCK_BREAK = NMSUtils.getNMSClassWithoutException(s + "BlockBreak");
|
||||
BLOCK_BREAK_ANIMATION = NMSUtils.getNMSClassWithoutException(s + "BlockBreakAnimation");
|
||||
TILE_ENTITY_DATA = NMSUtils.getNMSClassWithoutException(s + "TileEntityData");
|
||||
BLOCK_ACTION = NMSUtils.getNMSClassWithoutException(s + "BlockAction");
|
||||
BLOCK_CHANGE = NMSUtils.getNMSClassWithoutException(s + "BlockChange");
|
||||
BOSS = NMSUtils.getNMSClassWithoutException(s + "Boss");
|
||||
SERVER_DIFFICULTY = NMSUtils.getNMSClassWithoutException(s + "ServerDifficulty");
|
||||
CHAT = NMSUtils.getNMSClassWithoutException(s + "Chat");
|
||||
MULTI_BLOCK_CHANGE = NMSUtils.getNMSClassWithoutException(s + "MultiBlockChange");
|
||||
TAB_COMPLETE = NMSUtils.getNMSClassWithoutException(s + "TabComplete");
|
||||
COMMANDS = NMSUtils.getNMSClassWithoutException(s + "Commands");
|
||||
TRANSACTION = NMSUtils.getNMSClassWithoutException(s + "Transaction");
|
||||
CLOSE_WINDOW = NMSUtils.getNMSClassWithoutException(s + "CloseWindow");
|
||||
WINDOW_ITEMS = NMSUtils.getNMSClassWithoutException(s + "WindowItems");
|
||||
WINDOW_DATA = NMSUtils.getNMSClassWithoutException(s + "WindowData");
|
||||
SET_SLOT = NMSUtils.getNMSClassWithoutException(s + "SetSlot");
|
||||
SET_COOLDOWN = NMSUtils.getNMSClassWithoutException(s + "SetCooldown");
|
||||
CUSTOM_PAYLOAD = NMSUtils.getNMSClassWithoutException(s + "CustomPayload");
|
||||
CUSTOM_SOUND_EFFECT = NMSUtils.getNMSClassWithoutException(s + "CustomSoundEffect");
|
||||
KICK_DISCONNECT = NMSUtils.getNMSClassWithoutException(s + "KickDisconnect");
|
||||
ENTITY_STATUS = NMSUtils.getNMSClassWithoutException(s + "EntityStatus");
|
||||
EXPLOSION = NMSUtils.getNMSClassWithoutException(s + "Explosion");
|
||||
UNLOAD_CHUNK = NMSUtils.getNMSClassWithoutException(s + "UnloadChunk");
|
||||
GAME_STATE_CHANGE = NMSUtils.getNMSClassWithoutException(s + "GameStateChange");
|
||||
OPEN_WINDOW_HORSE = NMSUtils.getNMSClassWithoutException(s + "OpenWindowHorse");
|
||||
KEEP_ALIVE = NMSUtils.getNMSClassWithoutException(s + "KeepAlive");
|
||||
MAP_CHUNK = NMSUtils.getNMSClassWithoutException(s + "MapChunk");
|
||||
WORLD_EVENT = NMSUtils.getNMSClassWithoutException(s + "WorldEvent");
|
||||
WORLD_PARTICLES = NMSUtils.getNMSClassWithoutException(s + "WorldParticles");
|
||||
LIGHT_UPDATE = NMSUtils.getNMSClassWithoutException(s + "LightUpdate");
|
||||
LOGIN = NMSUtils.getNMSClassWithoutException(s + "Login");
|
||||
MAP = NMSUtils.getNMSClassWithoutException(s + "Map");
|
||||
OPEN_WINDOW_MERCHANT = NMSUtils.getNMSClassWithoutException(s + "OpenWindowMerchant");
|
||||
ENTITY = NMSUtils.getNMSClassWithoutException(s + "Entity");
|
||||
REL_ENTITY_MOVE = Reflection.getSubClass(ENTITY, s + "RelEntityMove");
|
||||
REL_ENTITY_MOVE_LOOK = Reflection.getSubClass(ENTITY, s + "RelEntityMoveLook");
|
||||
ENTITY_LOOK = Reflection.getSubClass(ENTITY, s + "EntityLook");
|
||||
if (REL_ENTITY_MOVE == null) {
|
||||
//is not a subclass and should be accessed normally
|
||||
REL_ENTITY_MOVE = NMSUtils.getNMSClassWithoutException(s + "RelEntityMove");
|
||||
REL_ENTITY_MOVE_LOOK = NMSUtils.getNMSClassWithoutException(s + "RelEntityMoveLook");
|
||||
ENTITY_LOOK = NMSUtils.getNMSClassWithoutException(s + "RelEntityLook");
|
||||
}
|
||||
VEHICLE_MOVE = NMSUtils.getNMSClassWithoutException(s + "VehicleMove");
|
||||
OPEN_BOOK = NMSUtils.getNMSClassWithoutException(s + "OpenBook");
|
||||
OPEN_WINDOW = NMSUtils.getNMSClassWithoutException(s + "OpenWindow");
|
||||
OPEN_SIGN_EDITOR = NMSUtils.getNMSClassWithoutException(s + "OpenSignEditor");
|
||||
AUTO_RECIPE = NMSUtils.getNMSClassWithoutException(s + "AutoRecipe");
|
||||
ABILITIES = NMSUtils.getNMSClassWithoutException(s + "Abilities");
|
||||
COMBAT_EVENT = NMSUtils.getNMSClassWithoutException(s + "CombatEvent");
|
||||
PLAYER_INFO = NMSUtils.getNMSClassWithoutException(s + "PlayerInfo");
|
||||
LOOK_AT = NMSUtils.getNMSClassWithoutException(s + "LookAt");
|
||||
POSITION = NMSUtils.getNMSClassWithoutException(s + "Position");
|
||||
RECIPES = NMSUtils.getNMSClassWithoutException(s + "Recipes");
|
||||
ENTITY_DESTROY = NMSUtils.getNMSClassWithoutException(s + "EntityDestroy");
|
||||
REMOVE_ENTITY_EFFECT = NMSUtils.getNMSClassWithoutException(s + "RemoveEntityEffect");
|
||||
RESOURCE_PACK_SEND = NMSUtils.getNMSClassWithoutException(s + "ResourcePackSend");
|
||||
RESPAWN = NMSUtils.getNMSClassWithoutException(s + "Respawn");
|
||||
ENTITY_HEAD_ROTATION = NMSUtils.getNMSClassWithoutException(s + "EntityHeadRotation");
|
||||
SELECT_ADVANCEMENT_TAB = NMSUtils.getNMSClassWithoutException(s + "SelectAdvancementTab");
|
||||
WORLD_BORDER = NMSUtils.getNMSClassWithoutException(s + "WorldBorder");
|
||||
CAMERA = NMSUtils.getNMSClassWithoutException(s + "Camera");
|
||||
HELD_ITEM_SLOT = NMSUtils.getNMSClassWithoutException(s + "HeldItemSlot");
|
||||
VIEW_CENTRE = NMSUtils.getNMSClassWithoutException(s + "ViewCentre");
|
||||
VIEW_DISTANCE = NMSUtils.getNMSClassWithoutException(s + "ViewDistance");
|
||||
SCOREBOARD_DISPLAY_OBJECTIVE = NMSUtils.getNMSClassWithoutException(s + "ScoreboardDisplayObjective");
|
||||
ENTITY_METADATA = NMSUtils.getNMSClassWithoutException(s + "EntityMetadata");
|
||||
ATTACH_ENTITY = NMSUtils.getNMSClassWithoutException(s + "AttachEntity");
|
||||
ENTITY_VELOCITY = NMSUtils.getNMSClassWithoutException(s + "EntityVelocity");
|
||||
ENTITY_EQUIPMENT = NMSUtils.getNMSClassWithoutException(s + "EntityEquipment");
|
||||
EXPERIENCE = NMSUtils.getNMSClassWithoutException(s + "Experience");
|
||||
UPDATE_HEALTH = NMSUtils.getNMSClassWithoutException(s + "UpdateHealth");
|
||||
SCOREBOARD_OBJECTIVE = NMSUtils.getNMSClassWithoutException(s + "ScoreboardObjective");
|
||||
MOUNT = NMSUtils.getNMSClassWithoutException(s + "Mount");
|
||||
SCOREBOARD_TEAM = NMSUtils.getNMSClassWithoutException(s + "ScoreboardTeam");
|
||||
SCOREBOARD_SCORE = NMSUtils.getNMSClassWithoutException(s + "ScoreboardScore");
|
||||
SPAWN_POSITION = NMSUtils.getNMSClassWithoutException(s + "SpawnPosition");
|
||||
UPDATE_TIME = NMSUtils.getNMSClassWithoutException(s + "UpdateTime");
|
||||
TITLE = NMSUtils.getNMSClassWithoutException(s + "Title");
|
||||
ENTITY_SOUND = NMSUtils.getNMSClassWithoutException(s + "EntitySound");
|
||||
NAMED_SOUND_EFFECT = NMSUtils.getNMSClassWithoutException(s + "NamedSoundEffect");
|
||||
STOP_SOUND = NMSUtils.getNMSClassWithoutException(s + "StopSound");
|
||||
PLAYER_LIST_HEADER_FOOTER = NMSUtils.getNMSClassWithoutException(s + "PlayerListHeaderFooter");
|
||||
NBT_QUERY = NMSUtils.getNMSClassWithoutException(s + "NBTQuery");
|
||||
COLLECT = NMSUtils.getNMSClassWithoutException(s + "Collect");
|
||||
ENTITY_TELEPORT = NMSUtils.getNMSClassWithoutException(s + "EntityTeleport");
|
||||
ADVANCEMENTS = NMSUtils.getNMSClassWithoutException(s + "Advancements");
|
||||
UPDATE_ATTRIBUTES = NMSUtils.getNMSClassWithoutException(s + "UpdateAttributes");
|
||||
ENTITY_EFFECT = NMSUtils.getNMSClassWithoutException(s + "EntityEffect");
|
||||
RECIPE_UPDATE = NMSUtils.getNMSClassWithoutException(s + "RecipeUpdate");
|
||||
TAGS = NMSUtils.getNMSClassWithoutException(s + "Tags");
|
||||
MAP_CHUNK_BULK = NMSUtils.getNMSClassWithoutException(s + "MapChunkBulk");
|
||||
PacketType.Server.init();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,179 @@
|
||||
package io.github.retrooper.packetevents.packet;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.enums.ServerVersion;
|
||||
import io.github.retrooper.packetevents.reflectionutils.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
@Deprecated
|
||||
public final class PacketTypeNames {
|
||||
private static final ServerVersion version = PacketEvents.getAPI().getServerUtilities().getServerVersion();
|
||||
|
||||
|
||||
public static final class Util {
|
||||
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) {
|
||||
packetPlayInPosition = Reflection.getSubClass(packetPlayInFlying, Client.POSITION);
|
||||
packetPlayInPositionLook = Reflection.getSubClass(packetPlayInFlying, Client.POSITION_LOOK);
|
||||
packetPlayInLook = Reflection.getSubClass(packetPlayInFlying, Client.LOOK);
|
||||
}
|
||||
|
||||
try {
|
||||
packetPlayInUseEntity = NMSUtils.getNMSClass(Client.USE_ENTITY);
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
|
||||
public static final class Client {
|
||||
private static final String c = "PacketPlayIn";
|
||||
/*
|
||||
* Only exists in 1.7.10->1.8.8 & 1.16+
|
||||
*/
|
||||
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";
|
||||
}
|
||||
|
||||
}
|
||||
+1
-6
@@ -7,10 +7,6 @@ import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.reflectionutils.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.vector.Vector3i;
|
||||
import net.minecraft.server.v1_8_R3.PacketPlayInBlockDig;
|
||||
import org.bukkit.block.Block;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public final class WrappedPacketInBlockDig extends WrappedPacket {
|
||||
private static Class<?> blockDigClass, blockPositionClass, enumDirectionClass, digTypeClass;
|
||||
@@ -29,8 +25,7 @@ public final class WrappedPacketInBlockDig extends WrappedPacket {
|
||||
|
||||
try {
|
||||
digTypeClass = NMSUtils.getNMSClass("EnumPlayerDigType");
|
||||
}
|
||||
catch(ClassNotFoundException e) {
|
||||
} catch (ClassNotFoundException e) {
|
||||
//It is probably a subclass
|
||||
digTypeClass = Reflection.getSubClass(blockDigClass, "EnumPlayerDigType");
|
||||
}
|
||||
|
||||
+1
-7
@@ -2,16 +2,10 @@ package io.github.retrooper.packetevents.packetwrappers.in.blockplace;
|
||||
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.reflectionutils.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.BlockIteratorUtils;
|
||||
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 Block block;
|
||||
|
||||
@@ -22,7 +16,7 @@ final class WrappedPacketInBlockPlace_1_9 extends WrappedPacket {
|
||||
|
||||
@Override
|
||||
protected void setup() {
|
||||
this.block = BlockIteratorUtils.getBlockLookingAt(getPlayer(), 3);
|
||||
this.block = BlockIteratorUtils.getBlockLookingAt(getPlayer(), 3);
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
|
||||
+17
-12
@@ -12,6 +12,7 @@ public final class WrappedPacketInEntityAction extends WrappedPacket {
|
||||
private static Class<?> entityActionClass;
|
||||
@Nullable
|
||||
private static Class<?> enumPlayerActionClass;
|
||||
|
||||
static {
|
||||
try {
|
||||
entityActionClass = NMSUtils.getNMSClass("PacketPlayInEntityAction");
|
||||
@@ -22,10 +23,9 @@ public final class WrappedPacketInEntityAction extends WrappedPacket {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
enumPlayerActionClass = NMSUtils.getNMSClass("EnumPlayerAction");
|
||||
}
|
||||
} else {
|
||||
enumPlayerActionClass = NMSUtils.getNMSClass("EnumPlayerAction");
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -45,11 +45,10 @@ public final class WrappedPacketInEntityAction extends WrappedPacket {
|
||||
try {
|
||||
final int entityId = Reflection.getField(entityActionClass, int.class, 0).getInt(packet);
|
||||
final int jumpBoost;
|
||||
if(version.isLowerThan(ServerVersion.v_1_8)) {
|
||||
jumpBoost = Reflection.getField(entityActionClass, int.class, 2).getInt(packet)
|
||||
}
|
||||
else {
|
||||
jumpBoost = Reflection.getField(entityActionClass, int.class, 1).getInt(packet)
|
||||
if (version.isLowerThan(ServerVersion.v_1_8)) {
|
||||
jumpBoost = Reflection.getField(entityActionClass, int.class, 2).getInt(packet);
|
||||
} else {
|
||||
jumpBoost = Reflection.getField(entityActionClass, int.class, 1).getInt(packet);
|
||||
}
|
||||
|
||||
int animationIndex = -1;
|
||||
@@ -59,14 +58,20 @@ public final class WrappedPacketInEntityAction extends WrappedPacket {
|
||||
animationIndex = Reflection.getField(entityActionClass, int.class, 1).getInt(packet);
|
||||
} else {
|
||||
final Object enumObj = Reflection.getField(entityActionClass, enumPlayerActionClass, 0).get(packet);
|
||||
|
||||
this.action = PlayerAction.valueOf(enumObj.toString());
|
||||
final String enumValue = enumObj.toString();
|
||||
try {
|
||||
this.action = PlayerAction.valueOf(enumValue);
|
||||
} catch (IllegalArgumentException e) {
|
||||
//They aren't on a legacy version and the enum has changed
|
||||
final PlayerAction.UpdatedPlayerAction updatedPlayerAction = PlayerAction.UpdatedPlayerAction.valueOf(enumValue);
|
||||
this.action = PlayerAction.get(updatedPlayerAction.getIndex());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
this.entityId = entityId;
|
||||
this.jumpBoost = jumpBoost;
|
||||
if(animationIndex != -1) {
|
||||
if (animationIndex != -1) {
|
||||
this.action = PlayerAction.get(animationIndex);
|
||||
}
|
||||
this.entity = NMSUtils.getEntityById(this.entityId);
|
||||
|
||||
+1
@@ -139,6 +139,7 @@ public class WrappedPacketInFlying extends WrappedPacket {
|
||||
public WrappedPacketInLook(Object packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isPosition() {
|
||||
try {
|
||||
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.in.steervehicle;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.reflectionutils.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
public class WrappedPacketInSteerVehicle extends WrappedPacket {
|
||||
private static Class<?> packetClass;
|
||||
|
||||
static {
|
||||
try {
|
||||
packetClass = NMSUtils.getNMSClass("PacketPlayInSteerVehicle");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private float side, forward;
|
||||
private boolean jump, unmount;
|
||||
|
||||
public WrappedPacketInSteerVehicle(Object packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setup() {
|
||||
try {
|
||||
this.side = Reflection.getField(packetClass, float.class, 0).getFloat(packet);
|
||||
this.forward = Reflection.getField(packetClass, float.class, 1).getFloat(packet);
|
||||
|
||||
this.jump = Reflection.getField(packetClass, boolean.class, 0).getBoolean(packet);
|
||||
this.unmount = Reflection.getField(packetClass, boolean.class, 1).getBoolean(packet);
|
||||
} catch (IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
//Positive side value means left, negative means right
|
||||
public float getSideValue() {
|
||||
return side;
|
||||
}
|
||||
|
||||
//Positive forward value means forward, negative is backwards
|
||||
public float getForwardValue() {
|
||||
return forward;
|
||||
}
|
||||
|
||||
public boolean isJump() {
|
||||
return jump;
|
||||
}
|
||||
|
||||
public boolean isUnmount() {
|
||||
return unmount;
|
||||
}
|
||||
}
|
||||
+1
-2
@@ -23,8 +23,7 @@ public final class WrappedPacketOutChat extends WrappedPacket implements Sendabl
|
||||
//In 1.8.3+ the ChatSerializer class is declared in the IChatBaseComponent class, so we have to handle that
|
||||
try {
|
||||
chatSerializerClass = NMSUtils.getNMSClass("ChatSerializer");
|
||||
}
|
||||
catch(ClassNotFoundException e) {
|
||||
} catch (ClassNotFoundException e) {
|
||||
//That is fine, it is probably a subclass
|
||||
chatSerializerClass = Reflection.getSubClass(iChatBaseComponentClass, "ChatSerializer");
|
||||
}
|
||||
|
||||
@@ -21,6 +21,10 @@ public final class Reflection {
|
||||
|
||||
|
||||
//FIELDS
|
||||
private static final HashMap<FieldWithName, Field> fieldWithNameHashMap = new HashMap<FieldWithName, Field>();
|
||||
private static final HashMap<FieldWithTypeAndIndex, Field> fieldWithTypeAndIndexHashMap = new HashMap<FieldWithTypeAndIndex, Field>();
|
||||
private static final HashMap<FieldWithIndex, Field> fieldWithIndexHashMap = new HashMap<FieldWithIndex, Field>();
|
||||
private static final HashMap<MethodWithIndexAndParams, Method> methodWithIndexAndParamsHashMap = new HashMap<MethodWithIndexAndParams, Method>();
|
||||
|
||||
public static Field[] getFields(final Class<?> cls) {
|
||||
if (cachedFields.containsKey(cls)) {
|
||||
@@ -35,8 +39,6 @@ public final class Reflection {
|
||||
}
|
||||
}
|
||||
|
||||
private static final HashMap<FieldWithName, Field> fieldWithNameHashMap = new HashMap<FieldWithName, Field>();
|
||||
|
||||
public static Field getField(final Class<?> cls, final String name) {
|
||||
final FieldWithName fwn = new FieldWithName(cls, name);
|
||||
if (!fieldWithNameHashMap.containsKey(fwn)) {
|
||||
@@ -52,8 +54,6 @@ public final class Reflection {
|
||||
return null;
|
||||
}
|
||||
|
||||
private static final HashMap<FieldWithTypeAndIndex, Field> fieldWithTypeAndIndexHashMap = new HashMap<FieldWithTypeAndIndex, Field>();
|
||||
|
||||
public static Field getField(final Class<?> cls, final Class<?> dataType, final int index) {
|
||||
final FieldWithTypeAndIndex fwtai = new FieldWithTypeAndIndex(cls, dataType, index);
|
||||
if (!fieldWithTypeAndIndexHashMap.containsKey(fwtai)) {
|
||||
@@ -72,8 +72,6 @@ public final class Reflection {
|
||||
return null;
|
||||
}
|
||||
|
||||
private static final HashMap<FieldWithIndex, Field> fieldWithIndexHashMap = new HashMap<FieldWithIndex, Field>();
|
||||
|
||||
public static Field getField(final Class<?> cls, final int index) {
|
||||
final FieldWithIndex fwi = new FieldWithIndex(cls, index);
|
||||
if (!fieldWithIndexHashMap.containsKey(fwi)) {
|
||||
@@ -104,8 +102,6 @@ public final class Reflection {
|
||||
}
|
||||
}
|
||||
|
||||
private static final HashMap<MethodWithIndexAndParams, Method> methodWithIndexAndParamsHashMap = new HashMap<MethodWithIndexAndParams, Method>();
|
||||
|
||||
public static Method getMethod(final Class<?> cls, final int index, final Class<?>... params) {
|
||||
final MethodWithIndexAndParams mwiap = new MethodWithIndexAndParams(cls, index, params);
|
||||
if (!methodWithIndexAndParamsHashMap.containsKey(mwiap)) {
|
||||
|
||||
+1
@@ -4,6 +4,7 @@ public class FieldWithName {
|
||||
|
||||
private final Class<?> cls;
|
||||
private final String name;
|
||||
|
||||
public FieldWithName(Class<?> cls, String name) {
|
||||
this.cls = cls;
|
||||
this.name = name;
|
||||
|
||||
@@ -10,7 +10,7 @@ public class BlockIteratorUtils {
|
||||
final Location location = player.getEyeLocation();
|
||||
final BlockIterator blocksToAdd = new BlockIterator(location, 0.0D, distance);
|
||||
Block block = null;
|
||||
while(blocksToAdd.hasNext()) {
|
||||
while (blocksToAdd.hasNext()) {
|
||||
block = blocksToAdd.next();
|
||||
}
|
||||
return block;
|
||||
|
||||
@@ -81,6 +81,15 @@ public final class NMSUtils {
|
||||
return Class.forName(nmsDir + "." + name);
|
||||
}
|
||||
|
||||
public static Class<?> getNMSClassWithoutException(String name) {
|
||||
try {
|
||||
return getNMSClass(name);
|
||||
} catch (ClassNotFoundException e) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static Class<?> getOBCClass(String name) throws ClassNotFoundException {
|
||||
return Class.forName(obcDir + "." + name);
|
||||
}
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
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,10 @@
|
||||
package io.github.retrooper.packetevents.utils.api;
|
||||
|
||||
import com.comphenix.protocol.ProtocolLibrary;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
class ProtocolLibAPIAccessor {
|
||||
public static int getProtocolVersion(final Player player) {
|
||||
return ProtocolLibrary.getProtocolManager().getProtocolVersion(player);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package io.github.retrooper.packetevents.utils.api;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class ProtocolLibUtils {
|
||||
public static boolean isAvailable() {
|
||||
return Bukkit.getPluginManager().isPluginEnabled("ProtocolLib");
|
||||
}
|
||||
|
||||
public static int getProtocolVersion(final Player player) {
|
||||
return ProtocolLibAPIAccessor.getProtocolVersion(player);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package io.github.retrooper.packetevents.utils;
|
||||
package io.github.retrooper.packetevents.utils.api;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import protocolsupport.api.ProtocolSupportAPI;
|
||||
@@ -0,0 +1,14 @@
|
||||
package io.github.retrooper.packetevents.utils.api;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class ProtocolSupportUtils {
|
||||
public static boolean isAvailable() {
|
||||
return Bukkit.getPluginManager().isPluginEnabled("ProtocolSupport");
|
||||
}
|
||||
|
||||
public static int getProtocolVersion(final Player player) {
|
||||
return ProtocolSupportAPIAccessor.getProtocolVersion(player);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package io.github.retrooper.packetevents.utils.api;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class VersionLookupUtils {
|
||||
/**
|
||||
* If ViaVersion is present, we get the protocol version with the ViaVersion API.
|
||||
* If ProtocolSupport is present, we get the protocol version with the ProtocolSupport API.
|
||||
* If ProtocolLib is present, we get the protocol version with the ProtocolLib API.
|
||||
* Otherwise return -1
|
||||
*
|
||||
* @param player
|
||||
* @return protocol version of the player if ViaVersion or ProtocolSupport or ProtocolLib is present. Otherwise -1
|
||||
*/
|
||||
public static int getProtocolVersion(final Player player) {
|
||||
if (ViaUtils.isAvailable()) {
|
||||
return ViaUtils.getProtocolVersion(player);
|
||||
} else if (ProtocolSupportUtils.isAvailable()) {
|
||||
return ProtocolSupportUtils.getProtocolVersion(player);
|
||||
} else if (ProtocolLibUtils.isAvailable()) {
|
||||
return ProtocolLibUtils.getProtocolVersion(player);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package io.github.retrooper.packetevents.utils;
|
||||
package io.github.retrooper.packetevents.utils.api;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import us.myles.ViaVersion.api.Via;
|
||||
+3
-3
@@ -1,4 +1,4 @@
|
||||
package io.github.retrooper.packetevents.utils;
|
||||
package io.github.retrooper.packetevents.utils.api;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -9,7 +9,7 @@ public class ViaUtils {
|
||||
return ViaAPIAccessor.getProtocolVersion(player);
|
||||
}
|
||||
|
||||
public static boolean isViaAPIAvaialable() {
|
||||
return Bukkit.getPluginManager().getPlugin("ViaVersion") != null;
|
||||
public static boolean isAvailable() {
|
||||
return Bukkit.getPluginManager().isPluginEnabled("ViaVersion");
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -13,7 +13,7 @@ import java.lang.reflect.Method;
|
||||
|
||||
public final class EntityFinderUtils {
|
||||
@Nullable
|
||||
private static final ServerVersion version = PacketEvents.getServerVersion();
|
||||
private static final ServerVersion version = PacketEvents.getAPI().getServerUtilities().getServerVersion();
|
||||
private static Class<?> worldServerClass;
|
||||
private static Class<?> craftWorldClass;
|
||||
private static Class<?> entityClass;
|
||||
|
||||
Reference in new issue
Block a user