Compare commits

...
19 Commits
Author SHA1 Message Date
retrooper 8eb4015cab 1.6 release commit 2020-08-27 19:10:53 +02:00
retrooper 3ec44f72da 1.6 stable RELEASE 2020-08-27 19:02:37 +02:00
retrooper 3797c45d98 1.6 pre 6
Stable version, please use this and wait for 1.6 official release, more features coming ;)

* Useless enums deleted: Gamemode.java, Hand.java
* Enums that belong to wrappers have been refactored to be a "subclass" of that wrapper: EntityAnimationType.java, EntityUseAction.java, PlayerAction.java, PlayerDigType.java
* Null pointer fixed in WrappedPacketInCustomPayload for 1.7.10
* Null pointer fixed in WrappedPacketInBlockPlace for 1.7.10
* Bug fixed in WrappedPacketInClientCommand for 1.7.10
* Bug fix in WrappedPacketInWindowClick.getWindowClickType() sometimes throwing a ArrayIndexOutOfBoundsException
* WrappedPacketInEntityAction.PlayerAction missing enum constants for 1.7.10/1.8.x fixed, this enum should now be cross version safe, the RIDING_JUMP doesn't exist on newer versions, so accessing this enum should return START_RIDING_JUMP instead.
This system for the enum should make 1.7/1.8 compatible with newer versions.
2020-08-26 14:38:39 +02:00
retrooper 94b7523774 wrapped packet version initialized 2020-08-25 22:05:20 +02:00
retrooper 6f0de9f01c serverversion is public now 2020-08-25 22:04:06 +02:00
retrooper 16cc63447f not tryna mess stuff up 2020-08-25 21:15:02 +02:00
retrooper bb6661b4eb 1.6 pre v5
added RIDING_JUMP enum constant, for now a simple fix, for some reason 1.8 tries accessing this
2020-08-25 21:05:29 +02:00
retrooper 63a5005257 1.6 pre release v4
RIDING_JUMP enum constant added to support 1.8.x
2020-08-25 20:55:33 +02:00
retrooper 8b4fdd4773 1.6 pre 3
* WrappedPacketInAbilities bug fixed for 1.16.x ONLY
2020-08-25 18:49:36 +02:00
retrooper 333bea795f 1.6 pre 2(still 2)
* pom.xml version of packetevents updated to 1.6
2020-08-25 18:19:53 +02:00
retrooper 3ee972a4ff 1.6 pre 2, WrappedPacketInFlying & WrappedPacketInWindowClick.java bugs fixed 2020-08-25 18:01:37 +02:00
retrooper 94a1f67975 1.6 pre, with debugs, might not work!
* All wrappers optimized, much faster with lots of caching
* All wrappers have a function for loading, now wrappers load stuff when you call PacketEvents#load()
* WrappedPacketOutKeepAlive is now sendable to players
* WrappedPacketOutPosition wrapper created
* WrappedPacketInWindowClick wrapper created
2020-08-25 17:30:19 +02:00
retrooper e00b55842d * WrappedPacketOutPosition created (UNFINISHED, onGround BOOLEAN not done and flags missing) 2020-08-25 13:33:53 +02:00
retrooper ba1a4afa79 1.5.9 packetevents release 2020-08-24 15:47:15 +02:00
retrooper d2925592fc 1.5.9 bug fixes, about to release 2020-08-24 15:35:24 +02:00
retrooper d97c1a03ee 1.5.9 pre release 2020-08-24 14:33:24 +02:00
retrooper a1d48d3b20 Release 1.5.8.2
* Code cleanup
* PacketReceiveEvent#getNMSPacketClass() deprecated
* PacketReceiveEvent#getPacketName() deprecated
* PacketSendEvent#getNMSPacketClass() deprecated
* PacketSendEvent#getPacketName() deprecated
* PlayerUninjectEvent#PlayerUninjectEvent(Player player, boolean sync) deprecated, use PlayerUninjectEvent#PlayerUninjectEvent(Player player)
* WrappedPacketInBlockDig null pointers fixed for 1.7.10, just Direction field will be Direction.NULL, I will fix later
* Clientbound wrappers cleaned up
2020-08-19 16:46:21 +02:00
retrooper 4ce0463465 Release 1.5.8.2
* WrappedPacketInBlockDig fixed for 1.7.10.
Only the Direction field is set to Direction.NULL.
I cannot get it to work, this is a quick solution for now.
2020-08-19 16:07:57 +02:00
retrooper 6725caad36 Release 1.5.8.1, pom fix attempt, Jitpack release failed so this should fix it 2020-08-17 19:56:06 +02:00
90 changed files with 1360 additions and 961 deletions

No files matched your search

+23 -2
View File
@@ -6,7 +6,29 @@
<groupId>io.github.retrooper</groupId>
<artifactId>packetevents</artifactId>
<version>1.5.8</version>
<version>1.6</version>
<!-- You can build the project with this: "mvn clean compile assembly:single" -->
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<packaging>jar</packaging>
<name>packetevents</name>
@@ -40,7 +62,6 @@
<dependencies>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.8.8</artifactId>
@@ -1,17 +1,19 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents;
import io.github.retrooper.packetevents.annotations.PacketHandler;
import io.github.retrooper.packetevents.api.PacketEventsAPI;
import io.github.retrooper.packetevents.enums.ClientVersion;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.event.PacketEvent;
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.packet.PacketType;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.in.settings.WrappedPacketInSettings;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.settings.PacketEventsSettings;
import io.github.retrooper.packetevents.utils.onlineplayers.OnlinePlayerUtilities;
import io.github.retrooper.packetevents.utils.nms_entityfinder.EntityFinderUtils;
import io.github.retrooper.packetevents.utils.versionlookup.VersionLookupUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -22,14 +24,12 @@ import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.Plugin;
import java.util.HashMap;
public final class PacketEvents implements PacketListener, Listener {
private static Plugin plugin;
private static final PacketEventsAPI packetEventsAPI = new PacketEventsAPI();
private static final PacketEvents instance = new PacketEvents();
private static boolean hasLoaded, hasStarted;
private static final PacketEventsSettings settings = new PacketEventsSettings();
private static Plugin plugin;
private static boolean hasLoaded, hasStarted;
/**
* Call this before start()
@@ -42,6 +42,11 @@ public final class PacketEvents implements PacketListener, Listener {
PacketTypeClasses.Client.load();
PacketTypeClasses.Server.load();
ServerVersion version= ServerVersion.getVersion();
WrappedPacket.version = version;
PacketEvent.version = version;
EntityFinderUtils.version = version;
WrappedPacket.loadAllWrappers();
ClientVersion.prepareLookUp();
hasLoaded = true;
}
@@ -60,7 +65,7 @@ public final class PacketEvents implements PacketListener, Listener {
Bukkit.getPluginManager().registerEvents(instance, plugin);
for (final Player p : OnlinePlayerUtilities.getOnlinePlayers()) {
for (final Player p : Bukkit.getOnlinePlayers()) {
getAPI().getPlayerUtils().injectPlayer(p);
}
hasStarted = true;
@@ -72,9 +77,8 @@ public final class PacketEvents implements PacketListener, Listener {
*/
public static void stop() {
if (hasStarted) {
for (final Player p : OnlinePlayerUtilities.getOnlinePlayers()) {
getAPI().getPlayerUtils().uninjectPlayerNow(p);
for (final Player p : Bukkit.getOnlinePlayers()) {
getAPI().getPlayerUtils().uninjectPlayer(p);
}
getAPI().getEventManager().unregisterAllListeners();
@@ -116,7 +120,7 @@ public final class PacketEvents implements PacketListener, Listener {
@EventHandler
public void onQuit(final PlayerQuitEvent e) {
getAPI().getPlayerUtils().clearClientVersion(e.getPlayer());
getAPI().getPlayerUtils().uninjectPlayerNow(e.getPlayer());
getAPI().getPlayerUtils().uninjectPlayer(e.getPlayer());
}
@EventHandler
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.annotations;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.annotations;
@@ -1,6 +1,9 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.annotations;
import io.github.retrooper.packetevents.annotations.data.EventSynchronization;
import io.github.retrooper.packetevents.enums.EventSynchronization;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
@@ -1,5 +0,0 @@
package io.github.retrooper.packetevents.annotations.data;
public enum EventSynchronization {
FORCE_SYNC, FORCE_ASYNC, NORMAL
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.api;
import io.github.retrooper.packetevents.event.manager.EventManager;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.enums;
import io.github.retrooper.packetevents.PacketEvents;
@@ -11,6 +14,7 @@ public enum ClientVersion {
v_1_15, v_1_15_1, v_1_15_2, v_1_16, v_1_16_PRE_1, v_1_16_PRE_2, v_1_16_PRE_3, v_1_16_PRE_4, v_1_16_PRE_5, v_1_16_PRE_6, v_1_16_PRE_7, v_1_16_PRE_8, v_1_16_RC_1, v_1_16_1, v_1_16_2, HIGHER_THAN_V_1_16_2, INVALID, ACCESS_FAILURE;
private static final Map<Integer, ClientVersion> VERSION_LOOKUP = new HashMap<Integer, ClientVersion>();
public static void prepareLookUp() {
VERSION_LOOKUP.put(-1, ACCESS_FAILURE);
VERSION_LOOKUP.put(1, LESS_THAN_V_1_7_10);
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.enums;
public enum Direction {
@@ -0,0 +1,8 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.enums;
public enum EventSynchronization {
NORMAL, FORCE_SYNC, FORCE_ASYNC
}
@@ -1,10 +1,11 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.enums;
import io.github.retrooper.packetevents.PacketEvents;
import org.bukkit.Bukkit;
import java.util.HashMap;
/**
* @author retrooper
*/
@@ -12,9 +13,10 @@ public enum ServerVersion {
v_1_7_10, v_1_8, v_1_8_3, v_1_8_8, v_1_9, v_1_9_4, v_1_10, v_1_11, v_1_12, v_1_13, v_1_13_2, v_1_14, v_1_15, v_1_16, v_1_16_1, v_1_16_2,
ERROR, EMPTY;
public static ServerVersion[] reversedValues;
private static final String nmsVersionSuffix = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
public static ServerVersion[] reversedValues;
private static ServerVersion cachedVersion;
private static ServerVersion getVers() {
for (final ServerVersion val : reversedValues) {
String valName = val.name().substring(2).replace("_", ".");
@@ -133,10 +135,10 @@ public enum ServerVersion {
if (this.equals(ServerVersion.v_1_16)) {
return 735;
}
if(this.equals(ServerVersion.v_1_16_1)) {
if (this.equals(ServerVersion.v_1_16_1)) {
return 736;
}
if(this.equals(ServerVersion.v_1_16_2)) {
if (this.equals(ServerVersion.v_1_16_2)) {
return 737;
}
return -1;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.enums;
public enum SystemOS {
@@ -1,19 +0,0 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum EntityAnimationType {
SWING_MAIN_ARM, DAMAGE, LEAVE_BED, SWING_OFFHAND, CRITICAL_EFFECT, MAGIC_CRITICAL_EFFECT;
public static final EntityAnimationType get(final int i) {
return values()[i];
}
public final int getIndex() {
for (int i = 0; i < values().length; i++) {
final EntityAnimationType curType = values()[0];
if (curType == this) {
return i;
}
}
return -1;
}
}
@@ -1,9 +0,0 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum EntityUseAction {
INTERACT, INTERACT_AT, ATTACK, INVALID;
public static EntityUseAction get(final int i) {
return values()[i];
}
}
@@ -1,25 +0,0 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum Gamemode {
NOT_SET(-1, ""),
SURVIVAL(0, "survival"),
CREATIVE(1, "creative"),
ADVENTURE(2, "adventure"),
SPECTATOR(3, "spectator");
int f;
String g;
Gamemode(int var3, String var4) {
this.f = var3;
this.g = var4;
}
public int getId() {
return this.f;
}
public String b() {
return this.g;
}
}
@@ -1,6 +0,0 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum Hand {
MAIN_HAND,
OFF_HAND
}
@@ -1,59 +0,0 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum PlayerAction {
START_SNEAKING,
STOP_SNEAKING,
STOP_SLEEPING,
START_SPRINTING,
STOP_SPRINTING,
START_RIDING_JUMP,
STOP_RIDING_JUMP,
OPEN_INVENTORY,
START_FALL_FLYING;
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;
}
}
}
@@ -1,26 +0,0 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum PlayerDigType {
START_DESTROY_BLOCK,
ABORT_DESTROY_BLOCK,
STOP_DESTROY_BLOCK,
DROP_ALL_ITEMS,
DROP_ITEM,
RELEASE_USE_ITEM,
SWAP_HELD_ITEMS,
SWAP_ITEM_WITH_OFFHAND,
WRONG_PACKET;
public static PlayerDigType get(final int i) {
return values()[i];
}
}
@@ -1,8 +0,0 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum PlayerInfoAction {
ADD_PLAYER, UPDATE_GAME_MODE, UPDATE_LATENCY, UPDATE_DISPLAY_NAME, REMOVE_PLAYER;
PlayerInfoAction() {
}
}
@@ -1,10 +1,13 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.event;
import io.github.retrooper.packetevents.enums.ServerVersion;
public class PacketEvent {
protected static ServerVersion version = ServerVersion.getVersion();
public abstract class PacketEvent {
public static ServerVersion version;
private long timestamp = System.currentTimeMillis();
/**
@@ -19,4 +22,6 @@ public class PacketEvent {
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
public abstract boolean isAsyncByDefault();
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.event;
public interface PacketListener {
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.event.PacketEvent;
@@ -34,15 +37,20 @@ public final class BukkitMoveEvent extends PacketEvent {
return to;
}
public void setCancelled(final boolean val) {
this.cancelled = val;
}
public boolean isCancelled() {
return cancelled;
}
public void setCancelled(final boolean val) {
this.cancelled = val;
}
public void cancel() {
setCancelled(true);
}
@Override
public boolean isAsyncByDefault() {
return false;
}
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.event.PacketEvent;
@@ -24,8 +27,10 @@ public final class PacketReceiveEvent extends PacketEvent {
}
/**
* Get the packet's name (NMS packet class simple name)
* Get the packet's name (NMS packet class simple name).
* Deprecated, it is recommended not to use this for performance reasons.
*/
@Deprecated
public String getPacketName() {
return this.packet.getClass().getSimpleName();
}
@@ -41,11 +46,13 @@ public final class PacketReceiveEvent extends PacketEvent {
/**
* Get the class of the NMS packet object
* Deprecated, as it is useless, rather use getNMSPacket().getClass()
*
* @return packet object class
*/
@Deprecated
public Class<?> getNMSPacketClass() {
return getNMSPacket().getClass();
return packet.getClass();
}
/**
@@ -54,11 +61,7 @@ public final class PacketReceiveEvent extends PacketEvent {
* @return packet id
*/
public byte getPacketId() {
Byte id = PacketType.Client.packetIds.get(getNMSPacketClass());
if (id == null) {
return -1;
}
return id;
return PacketType.Client.packetIds.getOrDefault(packet.getClass(), (byte) -1);
}
/**
@@ -78,4 +81,9 @@ public final class PacketReceiveEvent extends PacketEvent {
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
@Override
public boolean isAsyncByDefault() {
return true;
}
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.event.PacketEvent;
@@ -23,7 +26,9 @@ public final class PacketSendEvent extends PacketEvent {
/**
* Get the packet's name (NMS packet class simple name)
* Deprecated, it is recommended not to use this for performance reasons.
*/
@Deprecated
public String getPacketName() {
return this.packet.getClass().getSimpleName();
}
@@ -34,12 +39,7 @@ public final class PacketSendEvent extends PacketEvent {
* @return packet id
*/
public byte getPacketId() {
Byte id =
PacketType.Server.packetIds.get(getNMSPacketClass());
if (id == null) {
return -1;
}
return id;
return PacketType.Server.packetIds.getOrDefault(packet.getClass(), (byte) -1);
}
/**
@@ -52,12 +52,14 @@ public final class PacketSendEvent extends PacketEvent {
}
/**
* Get the class of the NMS packet object
* Get the class of the NMS packet object.
* Deprecated because it is useless, rather use getNMSPacket().getClass().
*
* @return packet object class
*/
@Deprecated
public Class<?> getNMSPacketClass() {
return getNMSPacket().getClass();
return packet.getClass();
}
public boolean isCancelled() {
@@ -67,5 +69,10 @@ public final class PacketSendEvent extends PacketEvent {
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
@Override
public boolean isAsyncByDefault() {
return true;
}
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.event.PacketEvent;
@@ -26,4 +29,9 @@ public final class PlayerInjectEvent extends PacketEvent {
public Player getPlayer() {
return player;
}
@Override
public boolean isAsyncByDefault() {
return false;
}
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.event.PacketEvent;
@@ -5,14 +8,20 @@ import org.bukkit.entity.Player;
public final class PlayerUninjectEvent extends PacketEvent {
private final Player player;
private boolean cancelled;
private final boolean sync;
private boolean cancelled;
public PlayerUninjectEvent(final Player player, final boolean sync) {
@Deprecated
public PlayerUninjectEvent(final Player player, @Deprecated final boolean sync) {
this.player = player;
this.sync = sync;
}
public PlayerUninjectEvent(final Player player) {
this.player = player;
this.sync = true;
}
public void cancel() {
setCancelled(true);
}
@@ -31,7 +40,9 @@ public final class PlayerUninjectEvent extends PacketEvent {
* By default all uninjections are called aynchronously in this build.
*
* @return If the uninjection was done async or sync
* @deprecated because it is unneeded
*/
@Deprecated
public boolean isSync() {
return sync;
}
@@ -39,4 +50,9 @@ public final class PlayerUninjectEvent extends PacketEvent {
public Player getPlayer() {
return player;
}
@Override
public boolean isAsyncByDefault() {
return false;
}
}
@@ -1,8 +1,10 @@
/**
* Copyright (c) 2020 retrooper
*/
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;
@@ -12,21 +14,10 @@ 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) {
for (final PacketListener listener : registeredMethods.keySet()) {
//Annotated methods
@@ -46,12 +37,21 @@ public final class EventManager {
}
}
};
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();
switch (annotation.synchronization()) {
case FORCE_ASYNC:
Bukkit.getScheduler().runTaskAsynchronously(PacketEvents.getPlugin(), invokeMethod);
break;
case FORCE_SYNC:
Bukkit.getScheduler().runTask(PacketEvents.getPlugin(), invokeMethod);
break;
default:
try {
method.invoke(listener, e);
} catch (IllegalAccessException | InvocationTargetException ex) {
ex.printStackTrace();
}
break;
}
}
}
@@ -1,14 +1,11 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.example;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.annotations.PacketHandler;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.event.PacketListener;
import io.github.retrooper.packetevents.event.impl.PacketReceiveEvent;
import io.github.retrooper.packetevents.packet.PacketType;
import io.github.retrooper.packetevents.packetwrappers.in.armanimation.WrappedPacketInArmAnimation;
import io.github.retrooper.packetevents.packetwrappers.in.custompayload.WrappedPacketInCustomPayload;
import io.github.retrooper.packetevents.packetwrappers.in.helditemslot.WrappedPacketInHeldItemSlot;
import io.github.retrooper.packetevents.packetwrappers.in.settings.WrappedPacketInSettings;
import org.bukkit.plugin.java.JavaPlugin;
public class MainExample extends JavaPlugin implements PacketListener {
@@ -20,15 +17,12 @@ public class MainExample extends JavaPlugin implements PacketListener {
@Override
public void onEnable() {
//Make sure you set a unique identifier, if another present plugin has the same identifier, you could run into issues
PacketEvents.getSettings().setIdentifier("official_api");
PacketEvents.getSettings().setIdentifier("packetevents_api");
PacketEvents.getSettings().setDefaultServerVersion(ServerVersion.v_1_7_10);
PacketEvents.start(this);
//If packetevents cannot detect your server version, it will use the default you specify version
// getAPI().getSettings().setDefaultServerVersion(ServerVersion.v_1_7_10);
PacketEvents.getAPI().getEventManager().registerListeners(this);
//PacketEvents.getAPI().getEventManager().registerListener(this);
}
@Override
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.handler;
import io.github.retrooper.packetevents.PacketEvents;
@@ -32,35 +35,19 @@ public class NettyPacketHandler {
}
}
public static Future<?> uninjectPlayer(final Player player) {
public static void uninjectPlayer(final Player player) {
try {
final PlayerUninjectEvent uninjectEvent = new PlayerUninjectEvent(player, false);
final PlayerUninjectEvent uninjectEvent = new PlayerUninjectEvent(player);
PacketEvents.getAPI().getEventManager().callEvent(uninjectEvent);
if (!uninjectEvent.isCancelled()) {
if (v1_7_nettyMode) {
return NettyPacketHandler_7.uninjectPlayer(player);
NettyPacketHandler_7.uninjectPlayer(player);
} else {
return NettyPacketHandler_8.uninjectPlayer(player);
NettyPacketHandler_8.uninjectPlayer(player);
}
}
} catch (Exception ignored) {
}
return null;
}
public static void uninjectPlayerNow(final Player player) {
try {
final PlayerUninjectEvent uninjectEvent = new PlayerUninjectEvent(player, true);
PacketEvents.getAPI().getEventManager().callEvent(uninjectEvent);
if (!uninjectEvent.isCancelled()) {
if (v1_7_nettyMode) {
NettyPacketHandler_7.uninjectPlayerNow(player);
} else {
NettyPacketHandler_8.uninjectPlayerNow(player);
}
}
} catch (Exception ignored) {
} catch (Exception ex) {
//Failed, but that is alright
}
}
@@ -1,12 +1,11 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.handler;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.utils.NMSUtils;
import net.minecraft.util.io.netty.channel.Channel;
import net.minecraft.util.io.netty.channel.ChannelDuplexHandler;
import net.minecraft.util.io.netty.channel.ChannelHandlerContext;
import net.minecraft.util.io.netty.channel.ChannelPipeline;
import net.minecraft.util.io.netty.channel.ChannelPromise;
import net.minecraft.util.io.netty.channel.*;
import org.bukkit.entity.Player;
import java.util.concurrent.Future;
@@ -37,15 +36,9 @@ final class NettyPacketHandler_7 {
pipeline.addBefore("packet_handler", PacketEvents.getHandlerName(player.getName()), channelDuplexHandler);
}
public static Future<?> uninjectPlayer(final Player player) {
final Channel channel = (Channel) NMSUtils.getChannel(player);
return channel.eventLoop().submit(() -> {
channel.pipeline().remove(PacketEvents.getHandlerName(player.getName()));
});
}
public static void uninjectPlayerNow(final Player player) {
public static void uninjectPlayer(final Player player) {
final Channel channel = (Channel) NMSUtils.getChannel(player);
channel.pipeline().remove(PacketEvents.getHandlerName(player.getName()));
}
}
@@ -1,12 +1,11 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.handler;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.utils.NMSUtils;
import io.netty.channel.Channel;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.ChannelPromise;
import io.netty.channel.*;
import org.bukkit.entity.Player;
import java.util.concurrent.Future;
@@ -37,14 +36,7 @@ final class NettyPacketHandler_8 {
pipeline.addBefore("packet_handler", PacketEvents.getHandlerName(player.getName()), channelDuplexHandler);
}
public static Future<?> uninjectPlayer(final Player player) {
final Channel channel = (Channel) NMSUtils.getChannel(player);
return channel.eventLoop().submit(() -> {
channel.pipeline().remove(PacketEvents.getHandlerName(player.getName()));
});
}
public static void uninjectPlayerNow(final Player player) {
public static void uninjectPlayer(final Player player) {
final Channel channel = (Channel) NMSUtils.getChannel(player);
channel.pipeline().remove(PacketEvents.getHandlerName(player.getName()));
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packet;
import java.util.HashMap;
@@ -5,19 +8,8 @@ import java.util.Map;
public class PacketType {
public static class Client {
public static class Util {
public static boolean isInstanceOfFlying(final byte packetId) {
return packetId == FLYING
|| packetId == POSITION
|| packetId == POSITION_LOOK
|| packetId == LOOK;
}
}
public static final Map<Class<?>, Byte> packetIds = new HashMap<Class<?>, Byte>();
public static final byte 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,
@@ -81,6 +73,15 @@ public class PacketType {
packetIds.put(PacketTypeClasses.Client.USE_ITEM, USE_ITEM);
packetIds.put(PacketTypeClasses.Client.BLOCK_PLACE, BLOCK_PLACE);
}
public static class Util {
public static boolean isInstanceOfFlying(final byte packetId) {
return packetId == FLYING
|| packetId == POSITION
|| packetId == POSITION_LOOK
|| packetId == LOOK;
}
}
}
public static class Server {
@@ -205,6 +206,13 @@ public class PacketType {
packetIds.put(PacketTypeClasses.Server.TAGS, TAGS);
packetIds.put(PacketTypeClasses.Server.MAP_CHUNK_BULK, MAP_CHUNK_BULK);
}
public static class Util {
public static boolean isInstanceOfEntity(final byte packetId) {
return packetId == ENTITY || packetId == REL_ENTITY_MOVE ||
packetId == REL_ENTITY_MOVE_LOOK || packetId == ENTITY_LOOK;
}
}
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packet;
import io.github.retrooper.packetevents.annotations.Nullable;
@@ -6,6 +9,10 @@ import io.github.retrooper.packetevents.utils.NMSUtils;
public class PacketTypeClasses {
public static class Client {
private static final String c = "PacketPlayIn";
@Nullable
public static Class<?> FLYING;
public static Class<?> POSITION, POSITION_LOOK, LOOK, CLIENT_COMMAND,
TRANSACTION, BLOCK_DIG, ENTITY_ACTION, USE_ENTITY,
WINDOW_CLICK, STEER_VEHICLE, CUSTOM_PAYLOAD, ARM_ANIMATION,
@@ -17,11 +24,9 @@ public class PacketTypeClasses {
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() {
FLYING = NMSUtils.getNMSClassWithoutException(c + "Flying");
try {
POSITION = NMSUtils.getNMSClass(c + "Position");
POSITION_LOOK = NMSUtils.getNMSClass(c + "PositionLook");
@@ -94,10 +99,8 @@ public class PacketTypeClasses {
}
}
PacketType.Client.init();
}
}
public static class Server {
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers;
public interface Sendable {
@@ -1,13 +1,47 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.api;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packetwrappers.in.abilities.WrappedPacketInAbilities;
import io.github.retrooper.packetevents.packetwrappers.in.armanimation.WrappedPacketInArmAnimation;
import io.github.retrooper.packetevents.packetwrappers.in.blockdig.WrappedPacketInBlockDig;
import io.github.retrooper.packetevents.packetwrappers.in.blockplace.WrappedPacketInBlockPlace;
import io.github.retrooper.packetevents.packetwrappers.in.chat.WrappedPacketInChat;
import io.github.retrooper.packetevents.packetwrappers.in.clientcommand.WrappedPacketInClientCommand;
import io.github.retrooper.packetevents.packetwrappers.in.custompayload.WrappedPacketInCustomPayload;
import io.github.retrooper.packetevents.packetwrappers.in.entityaction.WrappedPacketInEntityAction;
import io.github.retrooper.packetevents.packetwrappers.in.flying.WrappedPacketInFlying;
import io.github.retrooper.packetevents.packetwrappers.in.helditemslot.WrappedPacketInHeldItemSlot;
import io.github.retrooper.packetevents.packetwrappers.in.keepalive.WrappedPacketInKeepAlive;
import io.github.retrooper.packetevents.packetwrappers.in.settings.WrappedPacketInSettings;
import io.github.retrooper.packetevents.packetwrappers.in.steervehicle.WrappedPacketInSteerVehicle;
import io.github.retrooper.packetevents.packetwrappers.in.transaction.WrappedPacketInTransaction;
import io.github.retrooper.packetevents.packetwrappers.in.useentity.WrappedPacketInUseEntity;
import io.github.retrooper.packetevents.packetwrappers.in.windowclick.WrappedPacketInWindowClick;
import io.github.retrooper.packetevents.packetwrappers.out.abilities.WrappedPacketOutAbilities;
import io.github.retrooper.packetevents.packetwrappers.out.animation.WrappedPacketOutAnimation;
import io.github.retrooper.packetevents.packetwrappers.out.chat.WrappedPacketOutChat;
import io.github.retrooper.packetevents.packetwrappers.out.entity.WrappedPacketOutEntity;
import io.github.retrooper.packetevents.packetwrappers.out.entityvelocity.WrappedPacketOutEntityVelocity;
import io.github.retrooper.packetevents.packetwrappers.out.keepalive.WrappedPacketOutKeepAlive;
import io.github.retrooper.packetevents.packetwrappers.out.kickdisconnect.WrappedPacketOutKickDisconnect;
import io.github.retrooper.packetevents.packetwrappers.out.position.WrappedPacketOutPosition;
import io.github.retrooper.packetevents.packetwrappers.out.transaction.WrappedPacketOutTransaction;
import io.github.retrooper.packetevents.packetwrappers.out.updatehealth.WrappedPacketOutUpdateHealth;
import org.bukkit.entity.Player;
public class WrappedPacket {
protected static ServerVersion version = ServerVersion.getVersion();
public static ServerVersion version = null;
protected final Player player;
protected Object packet;
public WrappedPacket() {
this.player = null;
this.packet = null;
}
public WrappedPacket(final Object packet) {
this.player = null;
if (packet == null) return;
@@ -30,6 +64,37 @@ public class WrappedPacket {
}
}
public static void loadAllWrappers() {
//SERVER BOUND
WrappedPacketInAbilities.load();
WrappedPacketInArmAnimation.load();
WrappedPacketInBlockDig.load();
WrappedPacketInBlockPlace.load();
WrappedPacketInChat.load();
WrappedPacketInClientCommand.load();
WrappedPacketInCustomPayload.load();
WrappedPacketInEntityAction.load();
WrappedPacketInFlying.load();
WrappedPacketInHeldItemSlot.load();
WrappedPacketInKeepAlive.load();
WrappedPacketInSettings.load();
WrappedPacketInSteerVehicle.load();
WrappedPacketInTransaction.load();
WrappedPacketInUseEntity.load();
WrappedPacketInWindowClick.load();
//CLIENTBOUND
WrappedPacketOutAbilities.load();
WrappedPacketOutAnimation.load();
WrappedPacketOutChat.load();
WrappedPacketOutEntity.load();
WrappedPacketOutEntityVelocity.load();
WrappedPacketOutKeepAlive.load();
WrappedPacketOutKickDisconnect.load();
WrappedPacketOutPosition.load();
WrappedPacketOutTransaction.load();
WrappedPacketOutUpdateHealth.load();
}
protected void setup() {
@@ -1,47 +1,55 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.abilities;
import io.github.retrooper.packetevents.annotations.Nullable;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
public final class WrappedPacketInAbilities extends WrappedPacket {
private static Class<?> abilitiesClass;
static {
try {
abilitiesClass = NMSUtils.getNMSClass("PacketPlayInAbilities");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static boolean isMoreThanOneBoolPresent;
private boolean isVulnerable;
private boolean isFlying;
private boolean allowFly;
private boolean instantBuild;
private float flySpeed;
private float walkSpeed;
public WrappedPacketInAbilities(Object packet) {
super(packet);
}
public static void load() {
abilitiesClass = PacketTypeClasses.Client.ABILITIES;
isMoreThanOneBoolPresent = Reflection.getField(abilitiesClass, boolean.class, 1) != null;
}
@Override
protected void setup() {
try {
this.isVulnerable = Reflection.getField(abilitiesClass, boolean.class, 0).getBoolean(packet);
this.isFlying = Reflection.getField(abilitiesClass, boolean.class, 1).getBoolean(packet);
this.allowFly = Reflection.getField(abilitiesClass, boolean.class, 2).getBoolean(packet);
this.instantBuild = Reflection.getField(abilitiesClass, boolean.class, 3).getBoolean(packet);
this.flySpeed = Reflection.getField(abilitiesClass, float.class, 0).getFloat(packet);
this.walkSpeed = Reflection.getField(abilitiesClass, float.class, 1).getFloat(packet);
if (isMoreThanOneBoolPresent) {
this.isVulnerable = Reflection.getField(abilitiesClass, boolean.class, 0).getBoolean(packet);
this.isFlying = Reflection.getField(abilitiesClass, boolean.class, 1).getBoolean(packet);
this.allowFly = Reflection.getField(abilitiesClass, boolean.class, 2).getBoolean(packet);
this.instantBuild = Reflection.getField(abilitiesClass, boolean.class, 3).getBoolean(packet);
this.flySpeed = Reflection.getField(abilitiesClass, float.class, 0).getFloat(packet);
this.walkSpeed = Reflection.getField(abilitiesClass, float.class, 1).getFloat(packet);
} else {
this.isFlying = Reflection.getField(abilitiesClass, boolean.class, 0).getBoolean(packet);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public boolean isVulnerable() {
/**
* This will return null if the server version is not available in 1.16.x and above
*/
@Deprecated
@Nullable
public Boolean isVulnerable() {
return isVulnerable;
}
@@ -49,19 +57,39 @@ public final class WrappedPacketInAbilities extends WrappedPacket {
return isFlying;
}
public boolean isFlightAllowed() {
/**
* This will return null if the server version is not available in 1.16.x and above
*/
@Deprecated
@Nullable
public Boolean isFlightAllowed() {
return allowFly;
}
public boolean canInstantlyBuild() {
/**
* This will return null if the server version is not available in 1.16.x and above
*/
@Deprecated
@Nullable
public Boolean canInstantlyBuild() {
return instantBuild;
}
public float getFlySpeed() {
/**
* This will return null if the server version is not available in 1.16.x and above
*/
@Deprecated
@Nullable
public Float getFlySpeed() {
return flySpeed;
}
public float getWalkSpeed() {
/**
* This will return null if the server version is not available in 1.16.x and above
*/
@Deprecated
@Nullable
public Float getWalkSpeed() {
return walkSpeed;
}
}
@@ -1,36 +1,26 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.armanimation;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
//TODO: Test on 1.9, 1.11, 1.13, 1.14
@Deprecated
public final class WrappedPacketInArmAnimation extends WrappedPacket {
private static Class<?> packetClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayInArmAnimation");
} catch (Exception e) {
e.printStackTrace();
}
}
private long timeStamp;
public WrappedPacketInArmAnimation(Object packet) {
super(packet);
}
@Override
public void setup() {
//Lazy way, do you really need to get the timestamp in the actual class? Edit by Retrooper: Yes lol
//TODO: Get EnumHand value sent in 1.9+, however not really necessary
timeStamp = System.currentTimeMillis();
public static void load() {
packetClass = PacketTypeClasses.Client.ARM_ANIMATION;
}
public long getTimestamp() {
return timeStamp;
@Override
public void setup() {
}
}
@@ -1,8 +1,11 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.blockdig;
import io.github.retrooper.packetevents.enums.Direction;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.enums.minecraft.PlayerDigType;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
@@ -10,11 +13,17 @@ import io.github.retrooper.packetevents.utils.vector.Vector3i;
public final class WrappedPacketInBlockDig extends WrappedPacket {
private static Class<?> blockDigClass, blockPositionClass, enumDirectionClass, digTypeClass;
private static boolean isVersionLowerThan_v_1_8;
private Vector3i blockPosition;
private Direction direction;
private PlayerDigType digType;
public WrappedPacketInBlockDig(Object packet) {
super(packet);
}
static {
public static void load() {
blockDigClass = PacketTypeClasses.Client.BLOCK_DIG;
try {
blockDigClass = NMSUtils.getNMSClass("PacketPlayInBlockDig");
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
blockPositionClass = NMSUtils.getNMSClass("BlockPosition");
enumDirectionClass = NMSUtils.getNMSClass("EnumDirection");
@@ -22,33 +31,31 @@ public final class WrappedPacketInBlockDig extends WrappedPacket {
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
isVersionLowerThan_v_1_8 = version.isLowerThan(ServerVersion.v_1_8);
try {
digTypeClass = NMSUtils.getNMSClass("EnumPlayerDigType");
} catch (ClassNotFoundException e) {
//It is probably a subclass
digTypeClass = Reflection.getSubClass(blockDigClass, "EnumPlayerDigType");
if (version != ServerVersion.v_1_7_10) {
try {
digTypeClass = NMSUtils.getNMSClass("EnumPlayerDigType");
} catch (ClassNotFoundException e) {
//It is probably a subclass
digTypeClass = Reflection.getSubClass(blockDigClass, "EnumPlayerDigType");
}
}
}
private Vector3i blockPosition;
private Direction direction;
private PlayerDigType digType;
public WrappedPacketInBlockDig(Object packet) {
super(packet);
}
@Override
protected void setup() {
Direction enumDirection = null;
PlayerDigType enumDigType = null;
int x = 0, y = 0, z = 0;
//1.7.10
try {
if (version.isLowerThan(ServerVersion.v_1_8)) {
setupCoordinates(blockDigClass, packet);
enumDirection = Direction.get(Reflection.getField(digTypeClass, int.class, 3).getInt(packet));
enumDigType = PlayerDigType.get(Reflection.getField(digTypeClass, int.class, 4).getInt(packet));
if (isVersionLowerThan_v_1_8) {
enumDigType = PlayerDigType.values()[(Reflection.getField(blockDigClass, int.class, 4).getInt(packet))];
x = Reflection.getField(blockDigClass, int.class, 0).getInt(packet);
y = Reflection.getField(blockDigClass, int.class, 1).getInt(packet);
z = Reflection.getField(blockDigClass, int.class, 2).getInt(packet);
enumDirection = null;
} else {
//1.8+
final Object blockPosObj = Reflection.getField(blockDigClass, blockPositionClass, 0).get(packet);
@@ -56,7 +63,9 @@ public final class WrappedPacketInBlockDig extends WrappedPacket {
final Object digTypeObj = Reflection.getField(blockDigClass, digTypeClass, 0).get(packet);
Class<?> blockPosSuper = blockPositionClass;
setupCoordinates(blockPosSuper, blockPosObj);
x = Reflection.getField(blockPosSuper, int.class, 0).getInt(blockPosObj);
y = Reflection.getField(blockPosSuper, int.class, 1).getInt(blockPosObj);
z = Reflection.getField(blockPosSuper, int.class, 2).getInt(blockPosObj);
enumDirection = Direction.valueOf(((Enum) enumDirectionObj).name());
enumDigType = PlayerDigType.valueOf(((Enum) digTypeObj).name());
@@ -64,16 +73,13 @@ public final class WrappedPacketInBlockDig extends WrappedPacket {
} catch (IllegalAccessException e) {
e.printStackTrace();
}
this.direction = enumDirection;
this.digType = enumDigType;
}
private void setupCoordinates(final Class<?> cls, final Object object) throws IllegalAccessException {
final int x = Reflection.getField(cls, int.class, 0).getInt(object);
final int y = Reflection.getField(cls, int.class, 1).getInt(object);
final int z = Reflection.getField(cls, int.class, 2).getInt(object);
this.blockPosition = new Vector3i(x, y, z);
if (enumDirection == null) {
this.direction = Direction.NULL;
} else {
this.direction = enumDirection;
}
this.digType = enumDigType;
}
public Vector3i getBlockPosition() {
@@ -88,5 +94,26 @@ public final class WrappedPacketInBlockDig extends WrappedPacket {
return digType;
}
public enum PlayerDigType {
START_DESTROY_BLOCK,
ABORT_DESTROY_BLOCK,
STOP_DESTROY_BLOCK,
DROP_ALL_ITEMS,
DROP_ITEM,
RELEASE_USE_ITEM,
SWAP_HELD_ITEMS,
SWAP_ITEM_WITH_OFFHAND,
WRONG_PACKET
}
}
@@ -1,5 +1,9 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.blockplace;
import io.github.retrooper.packetevents.annotations.Nullable;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.utils.vector.Vector3i;
@@ -9,38 +13,40 @@ import org.bukkit.inventory.ItemStack;
public final class WrappedPacketInBlockPlace extends WrappedPacket {
static {
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
WrappedPacketInBlockPlace_1_8.initStatic();
}
}
private static boolean isHigherThan_v_1_8_8, isHigherThan_v_1_7_10;
private Vector3i blockPosition;
private ItemStack itemStack;
public WrappedPacketInBlockPlace(final Player player, final Object packet) {
super(player, packet);
}
public static void load() {
isHigherThan_v_1_8_8 = version.isHigherThan(ServerVersion.v_1_8_8);
isHigherThan_v_1_7_10 = version.isHigherThan(ServerVersion.v_1_7_10);
if (isHigherThan_v_1_7_10) {
WrappedPacketInBlockPlace_1_8.load();
}
}
@Override
protected void setup() {
//1.7.10
Vector3i position = null;
ItemStack itemStack = null;
try {
if (version.isHigherThan(ServerVersion.v_1_8_8)) {
if (isHigherThan_v_1_8_8) {
final WrappedPacketInBlockPlace_1_9 blockPlace_1_9 = new WrappedPacketInBlockPlace_1_9(getPlayer(), packet);
final Block block = blockPlace_1_9.getBlock();
position = new Vector3i(block.getX(), block.getY(), block.getZ());
itemStack = new ItemStack(block.getType());
} else if (version.isHigherThan(ServerVersion.v_1_7_10)) {
} else if (isHigherThan_v_1_7_10) {
final WrappedPacketInBlockPlace_1_8 blockPlace_1_8 = new WrappedPacketInBlockPlace_1_8(packet);
position = blockPlace_1_8.getBlockPosition();
itemStack = blockPlace_1_8.getItemStack();
} else {
final WrappedPacketInBlockPlace_1_7_10 blockPlace_1_7_10 = new WrappedPacketInBlockPlace_1_7_10(getPlayer(), packet);
position = blockPlace_1_7_10.getBlockPosition();
this.itemStack = blockPlace_1_7_10.getItemStack();
itemStack = blockPlace_1_7_10.getItemStack();
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
@@ -57,6 +63,7 @@ public final class WrappedPacketInBlockPlace extends WrappedPacket {
return blockPosition;
}
@Nullable
public ItemStack getItemStack() {
return itemStack;
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.blockplace;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
@@ -1,5 +1,9 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.blockplace;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
@@ -9,7 +13,7 @@ import org.bukkit.inventory.ItemStack;
import java.lang.reflect.InvocationTargetException;
final class WrappedPacketInBlockPlace_1_8 extends WrappedPacket {
private static Class<?> blockPlaceClass, blockPositionClass;
private static Class<?> blockPlaceClass, blockPositionClass, blockPositionSuperClass;
private Vector3i blockPosition;
private ItemStack itemStack;
@@ -17,28 +21,25 @@ final class WrappedPacketInBlockPlace_1_8 extends WrappedPacket {
super(packet);
}
protected static void initStatic() {
protected static void load() {
blockPlaceClass = PacketTypeClasses.Client.BLOCK_PLACE;
try {
blockPlaceClass = NMSUtils.getNMSClass("PacketPlayInBlockPlace");
blockPositionClass = NMSUtils.getNMSClass("BlockPosition");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
blockPositionSuperClass = blockPositionClass.getSuperclass();
}
@Override
protected void setup() {
try {
Object nmsBlockPos = Reflection.getField(blockPlaceClass, blockPositionClass, 1).get(packet);
this.blockPosition = new Vector3i(0, 0, 0);
this.blockPosition.x = (int) Reflection.getMethod(blockPositionSuperClass, "getX", 0).invoke(nmsBlockPos);
this.blockPosition.y = (int) Reflection.getMethod(blockPositionSuperClass, "getY", 0).invoke(nmsBlockPos);
this.blockPosition.z = (int) Reflection.getMethod(blockPositionSuperClass, "getZ", 0).invoke(nmsBlockPos);
final int[] coords = new int[3];
for (int i = 0; i < 3; i++) {
final String s = "get" + (i == 0 ? "X" : i == 1 ? "Y" : "Z");
coords[i] = (int) Reflection.getMethod(blockPositionClass.getSuperclass(), s, 0).invoke(nmsBlockPos);
}
this.blockPosition = new Vector3i(coords[0], coords[1], coords[2]);
this.itemStack = NMSUtils.toBukkitItemStack(Reflection.getField(blockPlaceClass, NMSUtils.nmsItemStackClass, 0).get(packet));
} catch (IllegalAccessException | InvocationTargetException e) {
@@ -46,10 +47,23 @@ final class WrappedPacketInBlockPlace_1_8 extends WrappedPacket {
}
}
@Deprecated
public Vector3i getBlockPosition() {
return blockPosition;
}
public int getBlockPositionX() {
return blockPosition.x;
}
public int getBlockPositionY() {
return blockPosition.y;
}
public int getBlockPositionZ() {
return blockPosition.z;
}
public ItemStack getItemStack() {
return itemStack;
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.blockplace;
@@ -1,26 +1,23 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.chat;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
public final class WrappedPacketInChat extends WrappedPacket {
private static Class<?> chatPacketClass;
static {
try {
chatPacketClass = NMSUtils.getNMSClass("PacketPlayInChat");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private String message;
public WrappedPacketInChat(Object packet) {
super(packet);
}
public static void load() {
chatPacketClass = PacketTypeClasses.Client.CHAT;
}
@Override
protected void setup() {
@@ -1,8 +1,11 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.clientcommand;
import io.github.retrooper.packetevents.annotations.Nullable;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.enums.minecraft.PlayerAction;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
@@ -13,12 +16,21 @@ public final class WrappedPacketInClientCommand extends WrappedPacket {
@Nullable
private static Class<?> enumClientCommandClass;
static {
private static boolean isLowerThan_v_1_8;
private ClientCommand clientCommand;
public WrappedPacketInClientCommand(Object packet) {
super(packet);
}
public static void load() {
packetClass = PacketTypeClasses.Client.CLIENT_COMMAND;
isLowerThan_v_1_8 = version.isLowerThan(ServerVersion.v_1_8);
try {
packetClass = NMSUtils.getNMSClass("PacketPlayInClientCommand");
if(version.isHigherThan(ServerVersion.v_1_7_10)) {
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
enumClientCommandClass = Reflection.getSubClass(packetClass, "EnumClientCommand");
}else {
} else {
enumClientCommandClass = NMSUtils.getNMSClass("EnumClientCommand");
}
} catch (Exception e) {
@@ -26,21 +38,11 @@ public final class WrappedPacketInClientCommand extends WrappedPacket {
}
}
private ClientCommand clientCommand;
public WrappedPacketInClientCommand(Object packet) {
super(packet);
}
@Override
public void setup() {
try {
if(version.isLowerThan(ServerVersion.v_1_8)) {
clientCommand = ClientCommand.get(Reflection.getField(enumClientCommandClass, int.class, 1).getInt(packet));
} else {
final Object enumObj = Reflection.getField(packetClass, enumClientCommandClass, 0).get(packet);
this.clientCommand = ClientCommand.valueOf(enumObj.toString());
}
Object enumObj = Reflection.getField(packetClass, enumClientCommandClass, 0).get(packet);
this.clientCommand = ClientCommand.valueOf(enumObj.toString());
} catch (Exception e) {
e.printStackTrace();
}
@@ -50,17 +52,10 @@ public final class WrappedPacketInClientCommand extends WrappedPacket {
return clientCommand;
}
public static enum ClientCommand {
public enum ClientCommand {
PERFORM_RESPAWN,
REQUEST_STATS,
OPEN_INVENTORY_ACHIEVEMENT;
private ClientCommand() {
}
public static ClientCommand get(final int i) {
return values()[i];
}
OPEN_INVENTORY_ACHIEVEMENT
}
}
@@ -1,61 +1,76 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.custompayload;
import io.github.retrooper.packetevents.annotations.Nullable;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Field;
public final class WrappedPacketInCustomPayload extends WrappedPacket {
private static Class<?> packetClass, nmsMinecraftKey, nmsPacketDataSerializer;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayInCustomPayload");
nmsPacketDataSerializer = NMSUtils.getNMSClass("PacketDataSerializer");
} catch (Exception e) {
e.printStackTrace();
}
try{
//Only on 1.13+
nmsMinecraftKey = NMSUtils.getNMSClass("MinecraftKey");
} catch (Exception e) {
//Its okay, this means they are on versions 1.7.10 ~ 1.12.2
}
}
private static boolean strPresentInIndex0;
private String data;
private Object minecraftKey, dataSerializer;
public WrappedPacketInCustomPayload(Object packet) {
super(packet);
}
public static void load() {
packetClass = PacketTypeClasses.Client.CUSTOM_PAYLOAD;
strPresentInIndex0 = Reflection.getField(packetClass, String.class, 0) != null;
try {
nmsPacketDataSerializer = NMSUtils.getNMSClass("PacketDataSerializer");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//Only on 1.13+
nmsMinecraftKey = NMSUtils.getNMSClass("MinecraftKey");
} catch (ClassNotFoundException e) {
//Its okay, this means they are on versions 1.7.10 ~ 1.12.2
}
}
@Override
public void setup() {
if(Reflection.getField(packetClass, String.class, 0) == null) {
if (!strPresentInIndex0) {
try {
this.minecraftKey = Reflection.getField(packetClass, nmsMinecraftKey, 0).get(packet);
this.dataSerializer = Reflection.getField(packetClass, nmsPacketDataSerializer, 0).get(packet);
} catch (Exception e) {
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else {
Field dataSerializerField = Reflection.getField(packetClass, nmsPacketDataSerializer, 0);
try {
this.data = (String)Reflection.getField(packetClass, String.class, 0).get(packet);
this.dataSerializer = Reflection.getField(packetClass, nmsPacketDataSerializer, 0).get(packet);
} catch (Exception e) {
//intentionally empty, allegedly 1.7.10 produces a NPE?
this.data = (String) Reflection.getField(packetClass, String.class, 0).get(packet);
if (dataSerializerField != null) {
this.dataSerializer = dataSerializerField.get(packet);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
public String getData() {
return data;
}
public Object getMinecraftKey() {
return minecraftKey;
}
@Nullable
public Object getDataSerializer() {
return dataSerializer;
}
@@ -1,44 +1,54 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.entityaction;
import io.github.retrooper.packetevents.annotations.Nullable;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.enums.minecraft.PlayerAction;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import org.bukkit.entity.Entity;
import java.util.HashMap;
public final class WrappedPacketInEntityAction extends WrappedPacket {
private static final HashMap<String, PlayerAction> cachedPlayerActionNames = new HashMap<String, PlayerAction>();
private static Class<?> entityActionClass;
@Nullable
private static Class<?> enumPlayerActionClass;
static {
try {
entityActionClass = NMSUtils.getNMSClass("PacketPlayInEntityAction");
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
enumPlayerActionClass = Reflection.getSubClass(entityActionClass, "EnumPlayerAction");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static boolean isLowerThan_v_1_8;
private Entity entity;
private int entityId;
private PlayerAction action;
private int jumpBoost;
public WrappedPacketInEntityAction(final Object packet) {
super(packet);
}
public static void load() {
entityActionClass = PacketTypeClasses.Client.ENTITY_ACTION;
isLowerThan_v_1_8 = version.isLowerThan(ServerVersion.v_1_8);
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
enumPlayerActionClass = Reflection.getSubClass(entityActionClass, "EnumPlayerAction");
}
//All the already existing values
for (PlayerAction val : PlayerAction.values()) {
cachedPlayerActionNames.put(val.name(), val);
}
cachedPlayerActionNames.put("PRESS_SHIFT_KEY", PlayerAction.START_SNEAKING);
cachedPlayerActionNames.put("RELEASE_SHIFT_KEY", PlayerAction.STOP_SNEAKING);
cachedPlayerActionNames.put("RIDING_JUMP", PlayerAction.START_RIDING_JUMP);
}
@Override
protected void setup() {
try {
final int entityId = Reflection.getField(entityActionClass, int.class, 0).getInt(packet);
final int jumpBoost;
if (version.isLowerThan(ServerVersion.v_1_8)) {
if (isLowerThan_v_1_8) {
jumpBoost = Reflection.getField(entityActionClass, int.class, 2).getInt(packet);
} else {
jumpBoost = Reflection.getField(entityActionClass, int.class, 1).getInt(packet);
@@ -47,34 +57,27 @@ public final class WrappedPacketInEntityAction extends WrappedPacket {
int animationIndex = -1;
//1.7.10
if (version.isLowerThan(ServerVersion.v_1_8)) {
if (isLowerThan_v_1_8) {
animationIndex = Reflection.getField(entityActionClass, int.class, 1).getInt(packet); // TODO: += if packetdataserializer.version < 16
} else {
final Object enumObj = Reflection.getField(entityActionClass, enumPlayerActionClass, 0).get(packet);
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());
}
final String enumName = enumObj.toString();
}
this.entityId = entityId;
this.jumpBoost = jumpBoost;
if (animationIndex != -1) {
this.action = PlayerAction.get(animationIndex);
this.action = PlayerAction.values()[animationIndex];
}
this.entity = NMSUtils.getEntityById(this.entityId);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public Entity getEntity() {
return entity;
return NMSUtils.getEntityById(this.entityId);
}
public int getEntityId() {
@@ -88,4 +91,17 @@ public final class WrappedPacketInEntityAction extends WrappedPacket {
public int getJumpBoost() {
return jumpBoost;
}
public enum PlayerAction {
START_SNEAKING,
STOP_SNEAKING,
STOP_SLEEPING,
START_SPRINTING,
STOP_SPRINTING,
START_RIDING_JUMP,
STOP_RIDING_JUMP,
OPEN_INVENTORY,
START_FALL_FLYING
}
}
@@ -1,35 +1,31 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.flying;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
public class WrappedPacketInFlying extends WrappedPacket {
private static Class<?> flyingClass;
static {
try {
flyingClass = NMSUtils.getNMSClass("PacketPlayInFlying");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private double x;
private double y;
private double z;
private float yaw;
private float pitch;
private boolean onGround;
private boolean isPosition;
private boolean isLook;
protected double x;
protected double y;
protected double z;
protected float yaw;
protected float pitch;
protected boolean onGround;
protected boolean isPosition;
protected boolean isLook;
public WrappedPacketInFlying(Object packet) {
super(packet);
}
public static void load() {
flyingClass = PacketTypeClasses.Client.FLYING;
}
@Override
protected void setup() {
try {
@@ -74,63 +70,63 @@ public class WrappedPacketInFlying extends WrappedPacket {
return onGround;
}
public boolean isPosition() {
public final boolean isPosition() {
return isPosition;
}
public boolean isLook() {
public final boolean isLook() {
return isLook;
}
public static class WrappedPacketInPosition extends WrappedPacketInFlying {
public WrappedPacketInPosition(Object packet) {
super(packet);
}
@Override
public boolean isPosition() {
protected void setup() {
try {
return Reflection.getField(flyingClass, boolean.class, 1).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return true;
}
this.x = Reflection.getField(flyingClass, double.class, 0).getDouble(packet);
this.y = Reflection.getField(flyingClass, double.class, 1).getDouble(packet);
this.z = Reflection.getField(flyingClass, double.class, 2).getDouble(packet);
@Override
public boolean isLook() {
try {
return Reflection.getField(flyingClass, boolean.class, 2).getBoolean(packet);
this.yaw = Reflection.getField(flyingClass, float.class, 0).getFloat(packet);
this.pitch = Reflection.getField(flyingClass, float.class, 1).getFloat(packet);
this.onGround = Reflection.getField(flyingClass, boolean.class, 0).getBoolean(packet);
this.isPosition = Reflection.getField(flyingClass, boolean.class, 1).getBoolean(packet);
this.isLook = Reflection.getField(flyingClass, boolean.class, 2).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return false;
}
}
public static class WrappedPacketInPosition_Look extends WrappedPacketInFlying {
public WrappedPacketInPosition_Look(Object packet) {
super(packet);
}
@Override
public boolean isPosition() {
protected void setup() {
try {
return Reflection.getField(flyingClass, boolean.class, 1).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return true;
}
this.x = Reflection.getField(flyingClass, double.class, 0).getDouble(packet);
this.y = Reflection.getField(flyingClass, double.class, 1).getDouble(packet);
this.z = Reflection.getField(flyingClass, double.class, 2).getDouble(packet);
@Override
public boolean isLook() {
try {
return Reflection.getField(flyingClass, boolean.class, 2).getBoolean(packet);
this.yaw = Reflection.getField(flyingClass, float.class, 0).getFloat(packet);
this.pitch = Reflection.getField(flyingClass, float.class, 1).getFloat(packet);
this.onGround = Reflection.getField(flyingClass, boolean.class, 0).getBoolean(packet);
this.isPosition = Reflection.getField(flyingClass, boolean.class, 1).getBoolean(packet);
this.isLook = Reflection.getField(flyingClass, boolean.class, 2).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return true;
}
}
@@ -141,23 +137,22 @@ public class WrappedPacketInFlying extends WrappedPacket {
}
@Override
public boolean isPosition() {
protected void setup() {
try {
return Reflection.getField(flyingClass, boolean.class, 1).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return false;
}
this.x = Reflection.getField(flyingClass, double.class, 0).getDouble(packet);
this.y = Reflection.getField(flyingClass, double.class, 1).getDouble(packet);
this.z = Reflection.getField(flyingClass, double.class, 2).getDouble(packet);
@Override
public boolean isLook() {
try {
return Reflection.getField(flyingClass, boolean.class, 2).getBoolean(packet);
this.yaw = Reflection.getField(flyingClass, float.class, 0).getFloat(packet);
this.pitch = Reflection.getField(flyingClass, float.class, 1).getFloat(packet);
this.onGround = Reflection.getField(flyingClass, boolean.class, 0).getBoolean(packet);
this.isPosition = Reflection.getField(flyingClass, boolean.class, 1).getBoolean(packet);
this.isLook = Reflection.getField(flyingClass, boolean.class, 2).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return true;
}
}
@@ -1,26 +1,24 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.helditemslot;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
public final class WrappedPacketInHeldItemSlot extends WrappedPacket {
private static Class<?> packetClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayInHeldItemSlot");
} catch (Exception e) {
e.printStackTrace();
}
}
private int itemInHandIndex;
public WrappedPacketInHeldItemSlot(Object packet) {
super(packet);
}
public static void load() {
packetClass = PacketTypeClasses.Client.HELD_ITEM_SLOT;
}
@Override
public void setup() {
try {
@@ -1,29 +1,29 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.keepalive;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
public final class WrappedPacketInKeepAlive extends WrappedPacket {
private static Class<?> packetClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayInKeepAlive");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private static boolean integerPresentInIndex0;
private long id;
public WrappedPacketInKeepAlive(final Object packet) {
super(packet);
}
public static void load() {
packetClass = PacketTypeClasses.Client.KEEP_ALIVE;
integerPresentInIndex0 = Reflection.getField(packetClass, int.class, 0) != null;
}
@Override
protected void setup() {
if (Reflection.getField(packetClass, int.class, 0) == null) {
if (!integerPresentInIndex0) {
try {
this.id = Reflection.getField(packetClass, long.class, 0).getLong(packet);
} catch (IllegalAccessException e) {
@@ -1,7 +1,11 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.settings;
import io.github.retrooper.packetevents.annotations.Nullable;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
@@ -11,12 +15,21 @@ import java.util.HashMap;
public class WrappedPacketInSettings extends WrappedPacket {
private static Class<?> packetClass;
private static Class<?> chatVisibilityEnumClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayInSettings");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
private static boolean isLowerThan_v_1_8;
private String locale;
private byte viewDistance;
private ChatVisibility chatVisibility;
private boolean chatColors;
private HashMap<DisplayedSkinPart, Boolean> displayedSkinParts;
public WrappedPacketInSettings(final Object packet) {
super(packet);
}
public static void load() {
packetClass = PacketTypeClasses.Client.SETTINGS;
isLowerThan_v_1_8 = version.isLowerThan(ServerVersion.v_1_8);
try {
chatVisibilityEnumClass = NMSUtils.getNMSClass("EnumChatVisibility");
@@ -27,23 +40,8 @@ public class WrappedPacketInSettings extends WrappedPacket {
}
}
public enum ChatVisibility {
ENABLED, COMMANDS_ONLY, HIDDEN
}
public enum DisplayedSkinPart {
CAPE, JACKET, LEFT_SLEEVE, RIGHT_SLEEVE, LEFT_PANTS, RIGHT_PANTS, HAT
}
private String locale;
private byte viewDistance;
private ChatVisibility chatVisibility;
private boolean chatColors;
private HashMap<DisplayedSkinPart, Boolean> displayedSkinParts;
public WrappedPacketInSettings(final Object packet) {
super(packet);
public static Class<?> getChatVisibilityEnumClass() {
return chatVisibilityEnumClass;
}
@Override
@@ -57,13 +55,11 @@ public class WrappedPacketInSettings extends WrappedPacket {
//CHAT VISIBILITY
Object chatVisibilityEnumObject = Reflection.getField(packetClass, chatVisibilityEnumClass, 0).get(packet);
String enumValueAsString = chatVisibilityEnumObject.toString();
if(enumValueAsString.equals("FULL")) {
if (enumValueAsString.equals("FULL")) {
chatVisibility = ChatVisibility.ENABLED;
}
else if(enumValueAsString.equals("SYSTEM")) {
} else if (enumValueAsString.equals("SYSTEM")) {
chatVisibility = ChatVisibility.COMMANDS_ONLY;
}
else {
} else {
chatVisibility = ChatVisibility.HIDDEN;
}
@@ -73,12 +69,11 @@ public class WrappedPacketInSettings extends WrappedPacket {
//DISPLAYED SKIN PARTS
this.displayedSkinParts = new HashMap<DisplayedSkinPart, Boolean>();
if(version.isLowerThan(ServerVersion.v_1_8)) {
if (isLowerThan_v_1_8) {
//in 1.7.10 only the cape display skin part is sent
boolean capeEnabled = Reflection.getField(packetClass, boolean.class, 1).getBoolean(packet);
displayedSkinParts.put(DisplayedSkinPart.CAPE, capeEnabled);
}
else {
} else {
//in 1.8, all the skin parts are sent
int skinPartFlags = Reflection.getField(packetClass, int.class, 1).getInt(packet);
displayedSkinParts.put(DisplayedSkinPart.CAPE, (skinPartFlags & 0x01) != 0);
@@ -96,10 +91,6 @@ public class WrappedPacketInSettings extends WrappedPacket {
}
public static Class<?> getChatVisibilityEnumClass() {
return chatVisibilityEnumClass;
}
public String getLocale() {
return locale;
}
@@ -129,14 +120,23 @@ public class WrappedPacketInSettings extends WrappedPacket {
/**
* On 1.7.10, some skin parts will default to 'false' as 1.7.10
* only sends the 'cape' skin part.
*
* @param part
* @return
*/
public boolean isDisplaySkinPartEnabled(DisplayedSkinPart part) {
//1.7.10, we will default the other skin parts to return false.
if(!displayedSkinParts.containsKey(part)) {
return false;
if (!displayedSkinParts.containsKey(part)) {
return false;
}
return displayedSkinParts.get(part);
}
public enum ChatVisibility {
ENABLED, COMMANDS_ONLY, HIDDEN
}
public enum DisplayedSkinPart {
CAPE, JACKET, LEFT_SLEEVE, RIGHT_SLEEVE, LEFT_PANTS, RIGHT_PANTS, HAT
}
}
@@ -1,27 +1,24 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.steervehicle;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
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);
}
public static void load() {
packetClass = PacketTypeClasses.Client.STEER_VEHICLE;
}
@Override
protected void setup() {
try {
@@ -1,28 +1,25 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.transaction;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
public final class WrappedPacketInTransaction extends WrappedPacket {
private static Class<?> packetClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayInTransaction");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private int windowId;
private short actionNumber;
private boolean accepted;
public WrappedPacketInTransaction(final Object packet) {
super(packet);
}
public static void load() {
packetClass = PacketTypeClasses.Client.TRANSACTION;
}
@Override
protected void setup() {
try {
@@ -1,49 +1,38 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.useentity;
import io.github.retrooper.packetevents.enums.minecraft.EntityUseAction;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import org.bukkit.entity.Entity;
public final class WrappedPacketInUseEntity extends WrappedPacket {
private static Class<?> useEntityClass, entityClass, enumEntityUseActionClass;
private static Class<?> useEntityClass;
private static Class<?> enumEntityUseActionClass;
private int entityId;
private EntityUseAction action;
public WrappedPacketInUseEntity(final Object packet) {
super(packet);
}
static {
try {
useEntityClass = NMSUtils.getNMSClass("PacketPlayInUseEntity");
entityClass = NMSUtils.getNMSClass("Entity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
public static void load() {
useEntityClass = PacketTypeClasses.Client.USE_ENTITY;
try {
enumEntityUseActionClass = NMSUtils.getNMSClass("EnumEntityUseAction");
} catch (ClassNotFoundException e) {
//That is fine, it is probably a subclass
for (final Class<?> sub : useEntityClass.getDeclaredClasses()) {
if (sub.getSimpleName().equals("EnumEntityUseAction")) {
enumEntityUseActionClass = sub;
break;
}
}
enumEntityUseActionClass = Reflection.getSubClass(useEntityClass, "EnumEntityUseAction");
}
}
private int entityId;
private Entity entity;
private EntityUseAction action;
public WrappedPacketInUseEntity(final Object packet) {
super(packet);
}
@Override
protected void setup() {
try {
this.entityId = Reflection.getField(useEntityClass, int.class, 0).getInt(packet);
this.entity = NMSUtils.getEntityById(this.entityId);
final Object useActionEnum = Reflection.getField(useEntityClass, enumEntityUseActionClass, 0).get(packet);
this.action = EntityUseAction.valueOf(useActionEnum.toString());
} catch (IllegalAccessException e) {
@@ -52,7 +41,7 @@ public final class WrappedPacketInUseEntity extends WrappedPacket {
}
public Entity getEntity() {
return entity;
return NMSUtils.getEntityById(this.entityId);
}
public int getEntityId() {
@@ -62,4 +51,8 @@ public final class WrappedPacketInUseEntity extends WrappedPacket {
public EntityUseAction getAction() {
return action;
}
public enum EntityUseAction {
INTERACT, INTERACT_AT, ATTACK, INVALID
}
}
@@ -0,0 +1,188 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.in.windowclick;
import io.github.retrooper.packetevents.annotations.Nullable;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import org.bukkit.inventory.ItemStack;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
public class WrappedPacketInWindowClick extends WrappedPacket {
private static final HashMap<String, Integer> invClickTypeMapCache = new HashMap<String, Integer>();
private static final HashMap<Integer, ArrayList<WindowClickType>> windowClickTypeCache = new HashMap<Integer, ArrayList<WindowClickType>>();
private static Class<?> packetClass, invClickTypeClass;
private static boolean isClickModePrimitive = false;
private int id;
private int slot;
private int button;
private short actionNumber;
private int mode;
private ItemStack clickedItem;
public WrappedPacketInWindowClick(Object packet) {
super(packet);
}
public static void load() {
packetClass = PacketTypeClasses.Client.WINDOW_CLICK;
invClickTypeClass = NMSUtils.getNMSClassWithoutException("InventoryClickType");
invClickTypeMapCache.put("PICKUP", 0);
invClickTypeMapCache.put("QUICK_MOVE", 1);
invClickTypeMapCache.put("SWAP", 2);
invClickTypeMapCache.put("CLONE", 3);
invClickTypeMapCache.put("THROW", 4);
invClickTypeMapCache.put("QUICK_CRAFT", 5);
invClickTypeMapCache.put("PICKUP_ALL", 6);
//MODE 0
windowClickTypeCache.put(0, getArrayListOfWindowClickTypes(WindowClickType.LEFT_MOUSE_CLICK,
WindowClickType.RIGHT_MOUSE_CLICK));
//MODE 1
windowClickTypeCache.put(1, getArrayListOfWindowClickTypes(WindowClickType.SHIFT_LEFT_MOUSE_CLICK,
WindowClickType.SHIFT_RIGHT_MOUSE_CLICK));
//MODE 2
windowClickTypeCache.put(2, getArrayListOfWindowClickTypes(
WindowClickType.KEY_NUMBER1,
WindowClickType.KEY_NUMBER2,
WindowClickType.KEY_NUMBER3,
WindowClickType.KEY_NUMBER4,
WindowClickType.KEY_NUMBER5,
WindowClickType.KEY_NUMBER6,
WindowClickType.KEY_NUMBER7,
WindowClickType.KEY_NUMBER8,
WindowClickType.KEY_NUMBER9));
//MODE 3
windowClickTypeCache.put(3, getArrayListOfWindowClickTypes(WindowClickType.UNKNOWN, WindowClickType.UNKNOWN, WindowClickType.CREATIVE_MIDDLE_CLICK));
//MODE 4
windowClickTypeCache.put(4, getArrayListOfWindowClickTypes(WindowClickType.KEY_DROP,
WindowClickType.KEY_DROP_STACK));
//MODE 5
windowClickTypeCache.put(5, getArrayListOfWindowClickTypes(
WindowClickType.STARTING_LEFT_MOUSE_DRAG,
WindowClickType.ADD_SLOT_LEFT_MOUSE_DRAG,
WindowClickType.ENDING_LEFT_MOUSE_DRAG,
WindowClickType.UNKNOWN,
WindowClickType.STARTING_RIGHT_MOUSE_DRAG,
WindowClickType.ADD_SLOT_RIGHT_MOUSE_DRAG,
WindowClickType.CREATIVE_STARTING_MIDDLE_MOUSE_DRAG,
WindowClickType.ADD_SLOT_MIDDLE_MOUSE_DRAG,
WindowClickType.ENDING_MIDDLE_MOUSE_DRAG));
windowClickTypeCache.put(6, getArrayListOfWindowClickTypes(WindowClickType.DOUBLE_CLICK));
isClickModePrimitive = Reflection.getField(packetClass, int.class, 3) != null;
}
private static ArrayList<WindowClickType> getArrayListOfWindowClickTypes(WindowClickType... types) {
ArrayList<WindowClickType> arrayList = new ArrayList<WindowClickType>(types.length);
arrayList.addAll(Arrays.asList(types));
return arrayList;
}
@Override
protected void setup() {
try {
this.id = Reflection.getField(packetClass, int.class, 0).getInt(packet);
this.slot = Reflection.getField(packetClass, int.class, 1).getInt(packet);
this.button = Reflection.getField(packetClass, int.class, 2).getInt(packet);
this.actionNumber = Reflection.getField(packetClass, short.class, 0).getShort(packet);
Object nmsItemStack = Reflection.getField(packetClass, NMSUtils.nmsItemStackClass, 0).get(packet);
this.clickedItem = NMSUtils.toBukkitItemStack(nmsItemStack);
Object clickMode = Reflection.getField(packetClass, 5).get(packet);
if (isClickModePrimitive) {
mode = (int) clickMode;
} else {
mode = invClickTypeMapCache.get(clickMode.toString());
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public int getWindowID() {
return id;
}
public int getWindowSlot() {
return slot;
}
public int getWindowButton() {
return button;
}
public short getActionNumber() {
return actionNumber;
}
@Nullable
public WindowClickType getWindowClickType() {
if (windowClickTypeCache.get(mode) == null) {
return WindowClickType.UNKNOWN;
}
if (button + 1 > windowClickTypeCache.size()) {
return WindowClickType.UNKNOWN;
}
if (mode == 4) {
if (slot == -999) {
if (button == 0) {
return WindowClickType.LEFT_CLICK_OUTSIDE_WINDOW_HOLDING_NOTHING;
} else if (button == 1) {
return WindowClickType.RIGHT_CLICK_OUTSIDE_WINDOW_HOLDING_NOTHING;
}
}
}
return windowClickTypeCache.get(mode).get(button);
}
public int getMode() {
return mode;
}
public ItemStack getClickedItem() {
return clickedItem;
}
public enum WindowClickType {
LEFT_MOUSE_CLICK, RIGHT_MOUSE_CLICK,
SHIFT_LEFT_MOUSE_CLICK, SHIFT_RIGHT_MOUSE_CLICK,
CREATIVE_MIDDLE_CLICK, CREATIVE_STARTING_MIDDLE_MOUSE_DRAG,
KEY_NUMBER1, KEY_NUMBER2, KEY_NUMBER3, KEY_NUMBER4,
KEY_NUMBER5, KEY_NUMBER6, KEY_NUMBER7, KEY_NUMBER8,
KEY_NUMBER9, KEY_DROP, KEY_DROP_STACK,
LEFT_CLICK_OUTSIDE_WINDOW_HOLDING_NOTHING,
RIGHT_CLICK_OUTSIDE_WINDOW_HOLDING_NOTHING,
STARTING_LEFT_MOUSE_DRAG,
STARTING_RIGHT_MOUSE_DRAG,
ADD_SLOT_LEFT_MOUSE_DRAG,
ADD_SLOT_RIGHT_MOUSE_DRAG,
ADD_SLOT_MIDDLE_MOUSE_DRAG,
ENDING_LEFT_MOUSE_DRAG,
ENDING_RIGHT_MOUSE_DRAG,
ENDING_MIDDLE_MOUSE_DRAG,
DOUBLE_CLICK,
UNKNOWN
}
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.out.abilities;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
@@ -1,9 +1,12 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.out.abilities;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -11,31 +14,15 @@ import java.lang.reflect.InvocationTargetException;
public final class WrappedPacketOutAbilities extends WrappedPacket implements Sendable {
private static Class<?> packetClass;
private static Constructor<?> packetConstructor;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutAbilities");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
packetConstructor = packetClass.getConstructor(PlayerAbilitiesUtils.playerAbilitiesClass);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
private boolean vulnerable, flying, allowFlight, instantBuild;
private float flySpeed, walkSpeed;
public WrappedPacketOutAbilities(final Object packet) {
super(packet);
}
public WrappedPacketOutAbilities(final boolean isVulnerable, final boolean isFlying, final boolean allowFlight, final boolean canBuildInstantly,
final float flySpeed, final float walkSpeed) {
super(null);
super();
this.vulnerable = isVulnerable;
this.flying = isFlying;
this.allowFlight = allowFlight;
@@ -44,6 +31,16 @@ public final class WrappedPacketOutAbilities extends WrappedPacket implements Se
this.walkSpeed = walkSpeed;
}
public static void load() {
packetClass = PacketTypeClasses.Server.ABILITIES;
try {
packetConstructor = packetClass.getConstructor(PlayerAbilitiesUtils.playerAbilitiesClass);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
@Override
protected void setup() {
try {
@@ -1,6 +1,9 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.out.animation;
import io.github.retrooper.packetevents.enums.minecraft.EntityAnimationType;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
@@ -9,14 +12,31 @@ import org.bukkit.entity.Entity;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
public final class WrappedPacketOutAnimation extends WrappedPacket implements Sendable {
private static Class<?> animationClass, nmsEntityClass;
private static Constructor<?> animationConstructor;
static {
private static final HashMap<Integer, EntityAnimationType> cachedAnimationIDS = new HashMap<Integer, EntityAnimationType>();
private static final HashMap<EntityAnimationType, Integer> cachedAnimations = new HashMap<EntityAnimationType, Integer>();
private Entity entity;
private int entityID;
private EntityAnimationType type;
public WrappedPacketOutAnimation(final Object packet) {
super(packet);
}
public WrappedPacketOutAnimation(final Entity target, final EntityAnimationType type) {
super();
this.entityID = target.getEntityId();
this.entity = target;
this.type = type;
}
public static void load() {
animationClass = PacketTypeClasses.Server.ANIMATION;
try {
animationClass = NMSUtils.getNMSClass("PacketPlayOutAnimation");
nmsEntityClass = NMSUtils.getNMSClass("Entity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
@@ -27,21 +47,19 @@ public final class WrappedPacketOutAnimation extends WrappedPacket implements Se
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
cachedAnimationIDS.put(0, EntityAnimationType.SWING_MAIN_ARM);
cachedAnimationIDS.put(1, EntityAnimationType.TAKE_DAMAGE);
cachedAnimationIDS.put(2, EntityAnimationType.LEAVE_BED);
cachedAnimationIDS.put(3, EntityAnimationType.SWING_OFFHAND);
cachedAnimationIDS.put(4, EntityAnimationType.CRITICAL_EFFECT);
cachedAnimationIDS.put(5, EntityAnimationType.MAGIC_CRITICAL_EFFECT);
private Entity entity;
private int entityID;
private EntityAnimationType type;
public WrappedPacketOutAnimation(final Object packet) {
super(packet);
}
public WrappedPacketOutAnimation(final Entity target, final EntityAnimationType type) {
super(null);
this.entityID = target.getEntityId();
this.entity = target;
this.type = type;
cachedAnimations.put(EntityAnimationType.SWING_MAIN_ARM, 0);
cachedAnimations.put(EntityAnimationType.TAKE_DAMAGE, 1);
cachedAnimations.put(EntityAnimationType.LEAVE_BED, 2);
cachedAnimations.put(EntityAnimationType.SWING_OFFHAND, 3);
cachedAnimations.put(EntityAnimationType.CRITICAL_EFFECT, 4);
cachedAnimations.put(EntityAnimationType.MAGIC_CRITICAL_EFFECT, 5);
}
@Override
@@ -50,8 +68,8 @@ public final class WrappedPacketOutAnimation extends WrappedPacket implements Se
//a - ID
//b - TYPE
this.entityID = Reflection.getField(animationClass, int.class, 0).getInt(packet);
this.entity = NMSUtils.getEntityById(this.entityID);
this.type = EntityAnimationType.get(Reflection.getField(animationClass, int.class, 1).getInt(packet));
int animationID = Reflection.getField(animationClass, int.class, 1).getInt(packet);
this.type = cachedAnimationIDS.get(animationID);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
@@ -59,7 +77,7 @@ public final class WrappedPacketOutAnimation extends WrappedPacket implements Se
}
public Entity getEntity() {
return this.entity;
return NMSUtils.getEntityById(this.entityID);
}
public int getEntityId() {
@@ -73,7 +91,7 @@ public final class WrappedPacketOutAnimation extends WrappedPacket implements Se
@Override
public Object asNMSPacket() {
final Object nmsEntity = NMSUtils.getNMSEntity(this.entity);
final int index = type.getIndex();
final int index = cachedAnimations.get(type);
try {
return animationConstructor.newInstance(nmsEntity, index);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
@@ -81,4 +99,8 @@ public final class WrappedPacketOutAnimation extends WrappedPacket implements Se
}
return null;
}
public enum EntityAnimationType {
SWING_MAIN_ARM, TAKE_DAMAGE, LEAVE_BED, SWING_OFFHAND, CRITICAL_EFFECT, MAGIC_CRITICAL_EFFECT
}
}
@@ -1,5 +1,9 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.out.chat;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
@@ -10,11 +14,21 @@ import java.lang.reflect.InvocationTargetException;
public final class WrappedPacketOutChat extends WrappedPacket implements Sendable {
private static Constructor<?> chatClassConstructor;
private static Class<?> chatClass, iChatBaseComponentClass, chatSerializerClass;
private static Class<?> packetClass, iChatBaseComponentClass, chatSerializerClass;
private String message;
static {
public WrappedPacketOutChat(final Object packet) {
super(packet);
}
public WrappedPacketOutChat(final String message) {
super();
this.message = "{\"text\": \"" + message + "\"}";
}
public static void load() {
try {
chatClass = NMSUtils.getNMSClass("PacketPlayOutChat");
packetClass = PacketTypeClasses.Server.CHAT;
iChatBaseComponentClass = NMSUtils.getNMSClass("IChatBaseComponent");
} catch (ClassNotFoundException e) {
e.printStackTrace();
@@ -29,7 +43,7 @@ public final class WrappedPacketOutChat extends WrappedPacket implements Sendabl
}
try {
chatClassConstructor = chatClass.getConstructor(iChatBaseComponentClass);
chatClassConstructor = packetClass.getConstructor(iChatBaseComponentClass);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
@@ -37,17 +51,6 @@ public final class WrappedPacketOutChat extends WrappedPacket implements Sendabl
}
private String message;
public WrappedPacketOutChat(final Object packet) {
super(packet);
}
public WrappedPacketOutChat(final String message) {
super(null);
this.message = "{\"text\": \"" + message + "\"}";
}
public static String toStringFromIChatBaseComponent(Object obj) {
try {
return Reflection.getMethod(iChatBaseComponentClass, String.class, 0).invoke(obj).toString();
@@ -70,7 +73,7 @@ public final class WrappedPacketOutChat extends WrappedPacket implements Sendabl
@Override
protected void setup() {
try {
final Object iChatBaseObj = Reflection.getField(chatClass, iChatBaseComponentClass, 0).get(packet);
final Object iChatBaseObj = Reflection.getField(packetClass, iChatBaseComponentClass, 0).get(packet);
final Object contentString = Reflection.getMethod(iChatBaseComponentClass, String.class, 0).invoke(iChatBaseObj);
@@ -1,55 +1,87 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.out.entity;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import org.bukkit.entity.Entity;
import java.lang.reflect.Field;
public class WrappedPacketOutEntity extends WrappedPacket {
private int entityId;
private static Class<?> packetClass;
//Byte = 1.7.10->1.8.8, Int = 1.9->1.15.x, Short = 1.16.x
private static byte mode = 0; //byte = 0, int = 1, short = 2
private static double dXYZDivisor = 0.0;
private int entityID;
private double deltaX, deltaY, deltaZ;
private byte yaw, pitch;
private boolean onGround;
public WrappedPacketOutEntity(Object packet) {
super(packet);
}
public static void load() {
packetClass = PacketTypeClasses.Server.ENTITY;
Field dxField = Reflection.getField(packetClass, 1);
assert dxField != null;
if (dxField.equals(Reflection.getField(packetClass, byte.class, 0))) {
mode = 0;
} else if (dxField.equals(Reflection.getField(packetClass, int.class, 1))) {
mode = 1;
} else if (dxField.equals(Reflection.getField(packetClass, short.class, 0))) {
mode = 2;
}
if (mode == 0) {
dXYZDivisor = 32.0;
} else {
dXYZDivisor = 4096.0;
}
}
@Override
protected void setup() {
try {
this.entityId = Reflection.getField(packetClass, int.class, 0).getInt(packet);
this.entityID = Reflection.getField(packetClass, int.class, 0).getInt(packet);
this.onGround = Reflection.getField(packetClass, boolean.class, 0).getBoolean(packet);
if (version.isLowerThan(ServerVersion.v_1_9)) {
byte dX = Reflection.getField(packetClass, byte.class, 0).getByte(packet);
byte dY = Reflection.getField(packetClass, byte.class, 1).getByte(packet);
byte dZ = Reflection.getField(packetClass, byte.class, 2).getByte(packet);
this.deltaX = dX / 32.0;
this.deltaY = dY / 32.0;
this.deltaZ = dZ / 32.0;
this.yaw = Reflection.getField(packetClass, byte.class, 3).getByte(packet);
this.pitch = Reflection.getField(packetClass, byte.class, 4).getByte(packet);
} else {
short dX = Reflection.getField(packetClass, short.class, 0).getShort(packet);
short dY = Reflection.getField(packetClass, short.class, 1).getShort(packet);
short dZ = Reflection.getField(packetClass, short.class, 2).getShort(packet);
this.deltaX = dX / 4096.0;
this.deltaY = dY / 4096.0;
this.deltaZ = dZ / 4096.0;
this.yaw = Reflection.getField(packetClass, byte.class, 0).getByte(packet);
this.pitch = Reflection.getField(packetClass, byte.class, 1).getByte(packet);
int dX = 1, dY = 1, dZ = 1;
switch (mode) {
case 0:
dX = Reflection.getField(packetClass, byte.class, 0).getByte(packet);
dY = Reflection.getField(packetClass, byte.class, 1).getByte(packet);
dZ = Reflection.getField(packetClass, byte.class, 2).getByte(packet);
this.yaw = Reflection.getField(packetClass, byte.class, 3).getByte(packet);
this.pitch = Reflection.getField(packetClass, byte.class, 4).getByte(packet);
break;
case 1:
dX = Reflection.getField(packetClass, int.class, 1).getInt(packet);
dY = Reflection.getField(packetClass, int.class, 2).getInt(packet);
dZ = Reflection.getField(packetClass, int.class, 3).getInt(packet);
this.yaw = Reflection.getField(packetClass, byte.class, 0).getByte(packet);
this.pitch = Reflection.getField(packetClass, byte.class, 1).getByte(packet);
break;
case 2:
dX = Reflection.getField(packetClass, short.class, 0).getShort(packet);
dY = Reflection.getField(packetClass, short.class, 1).getShort(packet);
dZ = Reflection.getField(packetClass, short.class, 2).getShort(packet);
this.yaw = Reflection.getField(packetClass, byte.class, 0).getByte(packet);
this.pitch = Reflection.getField(packetClass, byte.class, 1).getByte(packet);
break;
}
this.deltaX = dX / dXYZDivisor;
this.deltaY = dY / dXYZDivisor;
this.deltaZ = dZ / dXYZDivisor;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public byte getPitch() {
return pitch;
}
@@ -70,21 +102,15 @@ public class WrappedPacketOutEntity extends WrappedPacket {
return deltaX;
}
public Entity getEntity() {
return NMSUtils.getEntityById(entityID);
}
public int getEntityId() {
return entityId;
return entityID;
}
public boolean isOnGround() {
return onGround;
}
private static Class<?> packetClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutEntity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
@@ -1,6 +1,10 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.out.entityvelocity;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
@@ -13,21 +17,36 @@ import java.lang.reflect.InvocationTargetException;
public final class WrappedPacketOutEntityVelocity extends WrappedPacket implements Sendable {
private static Constructor<?> velocityConstructor, vec3dConstructor;
private static Class<?> velocityClass, vec3dClass;
private static boolean isVec3dPresent;
private int entityId;
private double velocityX, velocityY, velocityZ;
private Entity entity;
public WrappedPacketOutEntityVelocity(final Object packet) {
super(packet);
}
public WrappedPacketOutEntityVelocity(final Entity entity, final double velocityX, final double velocityY, final double velocityZ) {
super();
this.entityId = entity.getEntityId();
this.entity = entity;
this.velocityX = velocityX;
this.velocityY = velocityY;
this.velocityZ = velocityZ;
}
/**
* Velocity Constructor parameter types:
* 1.7.10->1.13.2 use int, double, double, double style,
* 1.14+ use int, Vec3D style
*/
static {
try {
velocityClass = NMSUtils.getNMSClass("PacketPlayOutEntityVelocity");
if (version.isHigherThan(ServerVersion.v_1_13_2)) {
public static void load() {
velocityClass = PacketTypeClasses.Server.ENTITY_VELOCITY;
if (version.isHigherThan(ServerVersion.v_1_13_2)) {
try {
vec3dClass = NMSUtils.getNMSClass("Vec3D");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
@@ -36,6 +55,7 @@ public final class WrappedPacketOutEntityVelocity extends WrappedPacket implemen
//That is fine, just a newer version
try {
velocityConstructor = velocityClass.getConstructor(int.class, vec3dClass);
isVec3dPresent = true;
//vec3d constructor
vec3dConstructor = vec3dClass.getConstructor(double.class, double.class, double.class);
} catch (NoSuchMethodException e2) {
@@ -45,36 +65,17 @@ public final class WrappedPacketOutEntityVelocity extends WrappedPacket implemen
}
}
private Entity entity;
private int entityId;
private double velocityX, velocityY, velocityZ;
public WrappedPacketOutEntityVelocity(final Object packet) {
super(packet);
}
public WrappedPacketOutEntityVelocity(final Entity entity, final double velocityX, final double velocityY, final double velocityZ) {
super(null);
this.entityId = entity.getEntityId();
this.entity = entity;
this.velocityX = velocityX;
this.velocityY = velocityY;
this.velocityZ = velocityZ;
}
@Override
protected void setup() {
try {
int i = 0;
final int entityId = Reflection.getField(velocityClass, int.class, 0).getInt(packet);
//ENTITY ID
this.entityId = Reflection.getField(velocityClass, int.class, 0).getInt(packet);
final int x = Reflection.getField(velocityClass, int.class, 1).getInt(packet);
final int y = Reflection.getField(velocityClass, int.class, 2).getInt(packet);
final int z = Reflection.getField(velocityClass, int.class, 3).getInt(packet);
this.entityId = entityId;
this.entity = NMSUtils.getEntityById(this.entityId);
int x = Reflection.getField(velocityClass, int.class, 1).getInt(packet);
int y = Reflection.getField(velocityClass, int.class, 2).getInt(packet);
int z = Reflection.getField(velocityClass, int.class, 3).getInt(packet);
//VELOCITY XYZ
this.velocityX = x / 8000.0D;
this.velocityY = y / 8000.0D;
this.velocityZ = z / 8000.0D;
@@ -88,7 +89,11 @@ public final class WrappedPacketOutEntityVelocity extends WrappedPacket implemen
}
public Entity getEntity() {
return entity;
if (entity == null) {
return NMSUtils.getEntityById(this.entityId);
} else {
return entity;
}
}
public double getVelocityX() {
@@ -105,7 +110,7 @@ public final class WrappedPacketOutEntityVelocity extends WrappedPacket implemen
@Override
public Object asNMSPacket() {
if (version.isLowerThan(ServerVersion.v_1_14)) {
if (!isVec3dPresent) {
try {
return velocityConstructor.newInstance(entityId, velocityX, velocityY, velocityZ);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
@@ -1,30 +1,52 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.out.keepalive;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import net.minecraft.server.v1_8_R3.PacketPlayOutKeepAlive;
public class WrappedPacketOutKeepAlive extends WrappedPacket {
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class WrappedPacketOutKeepAlive extends WrappedPacket implements Sendable {
private static Class<?> packetClass;
private static Constructor<?> keepAliveConstructor;
private static boolean integerMode;
private long id;
public WrappedPacketOutKeepAlive(Object packet) {
super(packet);
}
/**
* Optionally Cast this long to an integer if you are using 1.7.10->1.12.2!
* In 1.13.2->1.16.1 a long is sent
*
* @return response is
*/
public long getId() {
return id;
public WrappedPacketOutKeepAlive(long id) {
super();
}
public static void load() {
packetClass = PacketTypeClasses.Server.KEEP_ALIVE;
integerMode = Reflection.getField(packetClass, int.class, 0) != null;
if (integerMode) {
try {
keepAliveConstructor = packetClass.getConstructor(int.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
} else {
try {
keepAliveConstructor = packetClass.getConstructor(long.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
@Override
protected void setup() {
if (Reflection.getField(packetClass, int.class, 0) == null) {
if (!integerMode) {
try {
this.id = Reflection.getField(packetClass, long.class, 0).getLong(packet);
} catch (IllegalAccessException e) {
@@ -39,14 +61,31 @@ public class WrappedPacketOutKeepAlive extends WrappedPacket {
}
}
private static Class<?> packetClass;
/**
* You can cast this long to an integer if you are using 1.7.10->1.12.2!
* In 1.13.2->1.16.2 a long is sent
*
* @return Keep Alive ID
*/
public long getId() {
return id;
}
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutKeepAlive");
} catch (ClassNotFoundException e) {
e.printStackTrace();
@Override
public Object asNMSPacket() {
if (integerMode) {
try {
return keepAliveConstructor.newInstance((int) id);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
} else {
try {
return keepAliveConstructor.newInstance(id);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
PacketPlayOutKeepAlive p;
return null;
}
}
@@ -1,5 +1,9 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.out.kickdisconnect;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.packetwrappers.out.chat.WrappedPacketOutChat;
@@ -12,10 +16,20 @@ import java.lang.reflect.InvocationTargetException;
public final class WrappedPacketOutKickDisconnect extends WrappedPacket implements Sendable {
private static Class<?> packetClass, iChatBaseComponentClass;
private static Constructor<?> kickDisconnectConstructor;
private String kickMessage;
static {
public WrappedPacketOutKickDisconnect(final Object packet) {
super(packet);
}
public WrappedPacketOutKickDisconnect(final String kickMessage) {
super();
this.kickMessage = kickMessage;
}
public static void load() {
packetClass = PacketTypeClasses.Server.KICK_DISCONNECT;
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutKickDisconnect");
iChatBaseComponentClass = NMSUtils.getNMSClass("IChatBaseComponent");
} catch (ClassNotFoundException e) {
e.printStackTrace();
@@ -28,17 +42,6 @@ public final class WrappedPacketOutKickDisconnect extends WrappedPacket implemen
}
}
private String kickMessage;
public WrappedPacketOutKickDisconnect(final Object packet) {
super(packet);
}
public WrappedPacketOutKickDisconnect(final String kickMessage) {
super(null);
this.kickMessage = kickMessage;
}
@Override
protected void setup() {
try {
@@ -1,44 +0,0 @@
package io.github.retrooper.packetevents.packetwrappers.out.playerinfo;
import io.github.retrooper.packetevents.enums.minecraft.Gamemode;
import io.github.retrooper.packetevents.enums.minecraft.PlayerInfoAction;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo;
public class WrappedPacketOutPlayerInfo extends WrappedPacket {
private PlayerInfoAction action;
public WrappedPacketOutPlayerInfo(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketPlayOutPlayerInfo.PlayerInfoData dl;
}
private static Class<?> packetClass, enumPlayerInfoActionClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutPlayerInfo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
enumPlayerInfoActionClass = NMSUtils.getNMSClass("EnumPLayerInfoAction");
} catch (ClassNotFoundException e) {
enumPlayerInfoActionClass = Reflection.getSubClass(packetClass, "EnumPlayerInfoAction");
}
}
public class PlayerDataInfo {
public PlayerDataInfo(Object gameProfile, int var, Gamemode gamemode, String s) {
}
}
}
@@ -0,0 +1,60 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.out.position;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
public final class WrappedPacketOutPosition extends WrappedPacket {
private static Class<?> packetClass;
private double x;
private double y;
private double z;
private float yaw;
private float pitch;
public WrappedPacketOutPosition(Object packet) {
super(packet);
}
public static void load() {
packetClass = PacketTypeClasses.Server.POSITION;
}
@Override
protected void setup() {
//TODO boolean onGround and flags
try {
this.x = Reflection.getField(packetClass, double.class, 0).getDouble(packet);
this.y = Reflection.getField(packetClass, double.class, 1).getDouble(packet);
this.z = Reflection.getField(packetClass, double.class, 2).getDouble(packet);
this.yaw = Reflection.getField(packetClass, float.class, 0).getFloat(packet);
this.pitch = Reflection.getField(packetClass, float.class, 1).getFloat(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public double getX() {
return x;
}
public double getY() {
return y;
}
public double getZ() {
return z;
}
public float getYaw() {
return yaw;
}
public float getPitch() {
return pitch;
}
}
@@ -1,9 +1,12 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.out.transaction;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -11,13 +14,22 @@ import java.lang.reflect.InvocationTargetException;
public class WrappedPacketOutTransaction extends WrappedPacket implements Sendable {
private static Class<?> packetClass;
private static Constructor<?> packetConstructor;
private int windowId;
private short actionNumber;
private boolean accepted;
public WrappedPacketOutTransaction(final Object packet) {
super(packet);
}
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutTransaction");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
public WrappedPacketOutTransaction(final int windowId, final short actionNumber, final boolean accepted) {
super();
this.windowId = windowId;
this.actionNumber = actionNumber;
this.accepted = accepted;
}
public static void load() {
packetClass = PacketTypeClasses.Server.TRANSACTION;
try {
packetConstructor = packetClass.getConstructor(int.class, short.class, boolean.class);
@@ -26,21 +38,6 @@ public class WrappedPacketOutTransaction extends WrappedPacket implements Sendab
}
}
private int windowId;
private short actionNumber;
private boolean accepted;
public WrappedPacketOutTransaction(final Object packet) {
super(packet);
}
public WrappedPacketOutTransaction(final int windowId, final short actionNumber, final boolean accepted) {
super(null);
this.windowId = windowId;
this.actionNumber = actionNumber;
this.accepted = accepted;
}
@Override
protected void setup() {
try {
@@ -1,9 +1,12 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.packetwrappers.out.updatehealth;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@@ -11,24 +14,8 @@ import java.lang.reflect.InvocationTargetException;
public final class WrappedPacketOutUpdateHealth extends WrappedPacket implements Sendable {
private static Class<?> packetClass;
private static Constructor<?> packetConstructor;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutUpdateHealth");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
packetConstructor = packetClass.getConstructor(float.class, int.class, float.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
private float health, foodSaturation;
private int food;
public WrappedPacketOutUpdateHealth(final Object packet) {
super(packet);
}
@@ -41,12 +28,22 @@ public final class WrappedPacketOutUpdateHealth extends WrappedPacket implements
* @param foodSaturation
*/
public WrappedPacketOutUpdateHealth(final float health, final int food, final float foodSaturation) {
super(null);
super();
this.health = health;
this.food = food;
this.foodSaturation = foodSaturation;
}
public static void load() {
packetClass = PacketTypeClasses.Server.UPDATE_HEALTH;
try {
packetConstructor = packetClass.getConstructor(float.class, int.class, float.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
@Override
protected void setup() {
try {
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.reflectionutils;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.reflectionutils.fielddata;
import java.util.Objects;
@@ -18,7 +21,7 @@ public class FieldWithIndex {
public int getIndex() {
return index;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -27,10 +30,10 @@ public class FieldWithIndex {
return index == that.index &&
Objects.equals(cls, that.cls);
}
@Override
public int hashCode() {
return Objects.hash(cls, index);
}
public int hashCode() {
return Objects.hash(cls, index);
}
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.reflectionutils.fielddata;
import java.util.Objects;
@@ -19,7 +22,7 @@ public class FieldWithName {
public String getName() {
return name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -28,10 +31,10 @@ public class FieldWithName {
return name.equals(that.name) &&
Objects.equals(cls, that.cls);
}
@Override
public int hashCode() {
return Objects.hash(cls, name);
}
public int hashCode() {
return Objects.hash(cls, name);
}
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.reflectionutils.fielddata;
import java.util.Objects;
@@ -23,7 +26,7 @@ public class FieldWithTypeAndIndex {
public int getIndex() {
return index;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -33,10 +36,10 @@ public class FieldWithTypeAndIndex {
Objects.equals(cls, that.cls) &&
Objects.equals(type, that.type);
}
@Override
public int hashCode() {
return Objects.hash(cls, type, index);
}
public int hashCode() {
return Objects.hash(cls, type, index);
}
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.reflectionutils.methoddata;
import java.util.Objects;
@@ -24,7 +27,7 @@ public class MethodWithIndexAndParams {
public Class<?>[] getParams() {
return params;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -34,10 +37,10 @@ public class MethodWithIndexAndParams {
Objects.equals(cls, that.cls) &&
Objects.equals(params, that.params);
}
@Override
public int hashCode() {
return Objects.hash(cls, params, index);
}
public int hashCode() {
return Objects.hash(cls, params, index);
}
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.settings;
import io.github.retrooper.packetevents.enums.ServerVersion;
@@ -17,7 +20,7 @@ public class PacketEventsSettings {
}
/**
* Set the recommended version
* Set the default version
*
* @param version
*/
@@ -46,7 +49,6 @@ public class PacketEventsSettings {
/**
* If PacketEvents fails to detect a client's version
* Should it assume that the client is using the same version that the server is?
* <p>
* Returns ACCESS_FAILURE if false
*
* @param autoResolveClientProtocolVersion
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils;
import org.bukkit.Location;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils;
import io.github.retrooper.packetevents.annotations.Nullable;
@@ -16,9 +19,9 @@ import java.lang.reflect.Method;
public final class NMSUtils {
private static final ServerVersion version = ServerVersion.getVersion();
public static String nettyPrefix;
private static final String nmsDir = ServerVersion.getNMSDirectory();
private static final String obcDir = ServerVersion.getOBCDirectory();
public static String nettyPrefix;
public static Class<?> minecraftServerClass, craftWorldsClass,
packetClass, entityPlayerClass, playerConnectionClass,
craftPlayerClass, serverConnectionClass, craftEntityClass,
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.api;
import io.github.retrooper.packetevents.enums.ClientVersion;
@@ -48,10 +51,6 @@ public final class PlayerUtils {
NettyPacketHandler.uninjectPlayer(player);
}
public void uninjectPlayerNow(final Player player) {
NettyPacketHandler.uninjectPlayerNow(player);
}
public void sendPacket(final Player player, final Sendable sendable) {
NMSUtils.sendSendableWrapper(player, sendable);
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.api;
import io.github.retrooper.packetevents.enums.ServerVersion;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.nms_entityfinder;
import io.github.retrooper.packetevents.annotations.Nullable;
@@ -12,7 +15,7 @@ import java.lang.reflect.Method;
public final class EntityFinderUtils {
@Nullable
private static final ServerVersion version = ServerVersion.getVersion();
public static ServerVersion version;
private static Class<?> worldServerClass;
private static Class<?> craftWorldClass;
private static Class<?> entityClass;
@@ -20,7 +23,10 @@ public final class EntityFinderUtils {
private static Method craftWorldGetHandle;
private static Method getBukkitEntity;
static {
private static boolean isServerVersion_v_1_8_x;
public static void load() {
isServerVersion_v_1_8_x = version.isHigherThan(ServerVersion.v_1_7_10) && version.isLowerThan(ServerVersion.v_1_9);
try {
worldServerClass = NMSUtils.getNMSClass("WorldServer");
craftWorldClass = NMSUtils.getOBCClass("CraftWorld");
@@ -30,7 +36,7 @@ public final class EntityFinderUtils {
}
try {
getEntityByIdMethod = worldServerClass.getMethod(getEntityByNameMethodName(), int.class);
getEntityByIdMethod = worldServerClass.getMethod(getEntityByIDMethodName(), int.class);
craftWorldGetHandle = craftWorldClass.getMethod("getHandle");
getBukkitEntity = entityClass.getMethod("getBukkitEntity");
} catch (NoSuchMethodException e) {
@@ -79,8 +85,13 @@ public final class EntityFinderUtils {
return null;
}
public static String getEntityByNameMethodName() {
if (version.isHigherThan(ServerVersion.v_1_7_10) && version.isLowerThan(ServerVersion.v_1_9)) {
/**
* This is the name of the method that returns the NMS entity when you pass in its ID.
* On 1.8->1.8.8 the name is called 'a', on 1.7.10 & 1.9+ the name is called 'getEntity'.
* @return entity by ID method name
*/
public static String getEntityByIDMethodName() {
if (isServerVersion_v_1_8_x) {
return "a";
}
return "getEntity";
@@ -1,16 +0,0 @@
package io.github.retrooper.packetevents.utils.onlineplayers;
import io.github.retrooper.packetevents.enums.ServerVersion;
import org.bukkit.entity.Player;
public class OnlinePlayerUtilities {
private static final ServerVersion version = ServerVersion.getVersion();
public static Player[] getOnlinePlayers() {
if (version.isLowerThan(ServerVersion.v_1_9)) {
return OnlinePlayerUtils_8.getOnlinePlayers();
} else {
return OnlinePlayerUtils_9.getOnlinePlayers();
}
}
}
@@ -1,12 +0,0 @@
package io.github.retrooper.packetevents.utils.onlineplayers;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class OnlinePlayerUtils_8 {
public static Player[] getOnlinePlayers() {
return Bukkit.getServer().getOnlinePlayers().toArray(new Player[0]);
}
}
@@ -1,10 +0,0 @@
package io.github.retrooper.packetevents.utils.onlineplayers;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class OnlinePlayerUtils_9 {
public static Player[] getOnlinePlayers() {
return Bukkit.getOnlinePlayers().toArray(new Player[0]);
}
}
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.vector;
public final class Vector3d {
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.vector;
public final class Vector3f {
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.vector;
public final class Vector3i {
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.versionlookup;
import com.comphenix.protocol.ProtocolLibrary;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.Bukkit;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.entity.Player;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.Bukkit;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.entity.Player;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.entity.Player;
@@ -1,3 +1,6 @@
/**
* Copyright (c) 2020 retrooper
*/
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.Bukkit;