Compare commits

...
6 Commits
Author SHA1 Message Date
Retrooper 8c15df942d Merge remote-tracking branch 'origin/master' 2020-07-06 13:13:56 +08:00
Retrooper 6ce4fbd7fc IDE files removed 2020-07-06 13:13:18 +08:00
Retrooper 3e4fc70442 1.4.1 Release
* ...getPlayerUtilities().getPlayerPing(player); deprecated, use getPing(player);

* ServerTickEvent deprecated and it's Bukkit task too, will be removed in the next VersionLookupUtils
* PacketEvents.getAPI().getSettings().setDefaultServerVersion(version); added
Settings the default version will let PacketEvents use the default version if PacketEvents fails to detect your server version.
No idea why this happens in mSpigot, but yea.
2020-07-06 13:11:39 +08:00
retrooper fc91416ab7 atlas credit removed as their file was removed 2020-07-05 21:32:36 +02:00
Retrooper 0f6ee71733 * Now possible to register/unregister multiple listeners in one method call.
PacketEvents.getAPI().getEventManager().registerListeners(LISTENER, LISTENER2);

PacketEvents.getAPI().getEventManager().unregisterListeners(LISTENER, LISTENER2);
2020-07-05 18:48:53 +08:00
Retrooper 4dafa959c1 * PacketTypeNames.java deleted
* WrappedPacketOutEntity added, UNTESTED
2020-07-05 15:05:25 +08:00
22 changed files with 202 additions and 212 deletions

No files matched your search

-5
View File
@@ -2,11 +2,6 @@
A lightweight spigot packetlistener & packetsender coded by retrooper.
## Credit
PacketEvents forked [Atlas](https://github.com/funkemunky/Atlas)' [Packet](https://github.com/funkemunky/Atlas/blob/master/AtlasParent/Atlas/src/main/java/cc/funkemunky/api/tinyprotocol/api/Packet.java) class.
[Find our forked version](https://github.com/retrooper/packetevents/blob/master/src/main/java/io/github/retrooper/packetevents/packet/PacketType.java)
## About
This packetlistener is **only** supported on spigot servers and has been tested to work on these spigot forks: PaperSpigot, Tuinity
+1 -1
View File
@@ -6,7 +6,7 @@
<groupId>io.github.retrooper</groupId>
<artifactId>packetevents</artifactId>
<version>1.4</version>
<version>1.4.1</version>
<packaging>jar</packaging>
<name>packetevents</name>
<properties>
@@ -101,7 +101,7 @@ public final class PacketEvents implements PacketListener, Listener {
*/
@PacketHandler
public void onInject(final PlayerInjectEvent e) {
getAPI().getPlayerUtilities().clientVersionsMap.put(e.getPlayer().getUniqueId(), e.getClientVersion());
getAPI().getPlayerUtilities().setClientVersion(e.getPlayer(), e.getClientVersion());
}
@PacketHandler
@@ -115,6 +115,7 @@ public final class PacketEvents implements PacketListener, Listener {
@EventHandler
public void onQuit(final PlayerQuitEvent e) {
getAPI().getPlayerUtilities().clearClientVersion(e.getPlayer());
getAPI().getPlayerUtilities().uninjectPlayer(e.getPlayer());
}
@@ -1,12 +1,16 @@
package io.github.retrooper.packetevents;
import io.github.retrooper.packetevents.event.manager.EventManager;
import io.github.retrooper.packetevents.settings.Settings;
import io.github.retrooper.packetevents.utils.api.PlayerUtils;
import io.github.retrooper.packetevents.utils.api.ServerUtils;
import org.bukkit.scheduler.BukkitTask;
public final class PacketEventsAPI {
private final EventManager eventManager = new EventManager();
private final PlayerUtils playerUtils = new PlayerUtils();
private final ServerUtils serverUtils = new ServerUtils();
private final Settings settings = new Settings();
private BukkitTask serverTickTask;
@@ -67,6 +71,7 @@ public final class PacketEventsAPI {
*
* @return server tick task
*/
@Deprecated
public BukkitTask getServerTickTask() {
return serverTickTask;
}
@@ -76,9 +81,14 @@ public final class PacketEventsAPI {
*
* @param task
*/
@Deprecated
public void setServerTickTask(final BukkitTask task) {
this.serverTickTask = task;
}
public Settings getSettings() {
return settings;
}
}
@@ -1,5 +1,6 @@
package io.github.retrooper.packetevents.enums;
import io.github.retrooper.packetevents.PacketEvents;
import org.bukkit.Bukkit;
/**
@@ -24,6 +25,9 @@ public enum ServerVersion {
return val;
}
}
if (PacketEvents.getAPI().getSettings().getDefaultServerVersion() != null) {
return PacketEvents.getAPI().getSettings().getDefaultServerVersion();
}
return ERROR;
}
@@ -34,6 +38,7 @@ public enum ServerVersion {
return cachedVersion;
}
private static ServerVersion[] reverse(final ServerVersion[] arr) {
ServerVersion[] array = arr.clone();
if (array == null) {
@@ -57,7 +62,7 @@ public enum ServerVersion {
}
public static String getNMSDirectory() {
return "net.minecraft.server." + nmsVersionSuffix;
return "net.minecraft.server." + getNmsSuffix();
}
public static String getOBCDirectory() {
@@ -2,7 +2,7 @@ package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.enums.ClientVersion;
import io.github.retrooper.packetevents.event.PacketEvent;
import io.github.retrooper.packetevents.utils.api.VersionLookupUtils;
import io.github.retrooper.packetevents.utils.versionlookup.VersionLookupUtils;
import org.bukkit.entity.Player;
public final class PlayerInjectEvent extends PacketEvent {
@@ -3,6 +3,7 @@ package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.event.PacketEvent;
@Deprecated
public final class ServerTickEvent extends PacketEvent {
private final int tick;
private final double tps;
@@ -72,10 +72,22 @@ public final class EventManager {
}
}
public void registerListeners(final PacketListener... listeners) {
for (final PacketListener listener : listeners) {
registerListener(listener);
}
}
public void unregisterListener(final PacketListener e) {
registeredMethods.remove(e);
}
public void unregisterListeners(final PacketListener... listeners) {
for (final PacketListener listener : listeners) {
unregisterListener(listener);
}
}
public void unregisterAllListeners() {
registeredMethods.clear();
}
@@ -3,8 +3,6 @@ package io.github.retrooper.packetevents.example;
import io.github.retrooper.packetevents.PacketEvents;
import org.bukkit.plugin.java.JavaPlugin;
import static io.github.retrooper.packetevents.PacketEvents.getAPI;
public class MainExample extends JavaPlugin {
@Override
@@ -15,7 +13,8 @@ public class MainExample extends JavaPlugin {
@Override
public void onEnable() {
PacketEvents.start(this);
getAPI().getServerTickTask().cancel();
//If packeteventa cannot detect your server version, it will use the recommended version
// getAPI().getSettings().setDefaultServerVersion(ServerVersion.v_1_7_10);
}
@Override
@@ -1,179 +0,0 @@
package io.github.retrooper.packetevents.packet;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
@Deprecated
public final class PacketTypeNames {
private static final ServerVersion version = PacketEvents.getAPI().getServerUtilities().getServerVersion();
public static final class Util {
private static Class<?> packetPlayInFlying, packetPlayInPosition, packetPlayInPositionLook, packetPlayInLook, packetPlayInUseEntity;
static {
try {
//Only exists in 1.7->1.8.8 & 1.16 protocol
packetPlayInFlying = NMSUtils.getNMSClass(Client.FLYING);
} catch (ClassNotFoundException e) {
//That is fine, they are on 1.9->1.15.2
}
try {
packetPlayInPosition = NMSUtils.getNMSClass(Client.POSITION);
packetPlayInPositionLook = NMSUtils.getNMSClass(Client.POSITION_LOOK);
packetPlayInLook = NMSUtils.getNMSClass(Client.LOOK);
} catch (ClassNotFoundException e) {
packetPlayInPosition = Reflection.getSubClass(packetPlayInFlying, Client.POSITION);
packetPlayInPositionLook = Reflection.getSubClass(packetPlayInFlying, Client.POSITION_LOOK);
packetPlayInLook = Reflection.getSubClass(packetPlayInFlying, Client.LOOK);
}
try {
packetPlayInUseEntity = NMSUtils.getNMSClass(Client.USE_ENTITY);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
* Is this NMS packet an instance of the "PacketPlayInFlying" packet?
* Supports 1.9->1.15.2 too!
*
* @param nmsPacket
* @return If the nms packet provided is an instanceof the "PacketPlayInFlying" packet in the 1.8 protocol & 1.16 protocol!
*/
public static boolean isInstanceOfFlyingPacket(final Object nmsPacket) {
//1.7->1.8.8
if (packetPlayInFlying != null) {
return packetPlayInFlying.isInstance(nmsPacket);
} else {
//1.9->1.15.2
return isInstanceOfPositionOrPositionLook(nmsPacket) || isInstanceOfPositionLookPacket(nmsPacket);
}
}
/**
* Is this NMS packet an instance of the "PacketPlayInPosition" packet?
*
* @param nmsPacket
* @return nmsPacket instanceof PacketPlayInPosition
*/
public static boolean isInstanceOfPositionPacket(final Object nmsPacket) {
return packetPlayInPosition.isInstance(nmsPacket);
}
/**
* Is this NMS packet an instance of the "PacketPlayInPositionLook" packet?
*
* @param nmsPacket
* @return nmsPacket instanceof PacketPlayInPositionLook
*/
public static boolean isInstanceOfPositionLookPacket(final Object nmsPacket) {
return packetPlayInPositionLook.isInstance(nmsPacket);
}
/**
* Is this NMS Packet an instanceof the "PacketPlayInPosition" or "PacketPlayInPositionLook"
*
* @param nmsPacket
* @return nmsPacket instanceof PacketPlayInPosition || nmsPacket instanceof PacketPlayInPositionLook
*/
public static boolean isInstanceOfPositionOrPositionLook(final Object nmsPacket) {
return isInstanceOfPositionPacket(nmsPacket) || isInstanceOfPositionLookPacket(nmsPacket);
}
/**
* Is this NMS Packet an instance of the "PacketPlayInLook" packet?
*
* @param nmsPacket
* @return nmsPacket instanceof PacketPlayInLook
*/
public static boolean isInstanceOfLook(final Object nmsPacket) {
return packetPlayInLook.isInstance(nmsPacket);
}
public static boolean isInstanceOfUseEntity(final Object nmsPacket) {
return packetPlayInUseEntity.isInstance(nmsPacket);
}
}
public static final class Client {
private static final String c = "PacketPlayIn";
/*
* Only exists in 1.7.10->1.8.8 & 1.16+
*/
public static final String FLYING = c + "Flying";
public static final String POSITION = c + "Position";
public static final String POSITION_LOOK = c + "PositionLook";
public static final String LOOK = c + "Look";
public static final String CLIENT_COMMAND = c + "ClientCommand";
public static final String TRANSACTION = c + "Transaction";
public static final String BLOCK_DIG = c + "BlockDig";
public static final String ENTITY_ACTION = c + "EntityAction";
public static final String USE_ENTITY = c + "UseEntity";
public static final String WINDOW_CLICK = c + "WindowClick";
public static final String STEER_VEHICLE = c + "SteerVehicle";
public static final String CUSTOM_PAYLOAD = c + "CustomPayload";
public static final String ARM_ANIMATION = c + "ArmAnimation";
/**
* The packet name of the block place depending on your server version, "PacketPlayInBlockPlace" or "PacketPlayInUseItem"
*/
public static final String BLOCK_PLACE = c + ((ServerVersion.getVersion().isHigherThan(ServerVersion.v_1_8_8)) ? "UseItem" : "BlockPlace");
public static final String ABILITIES = c + "Abilities";
public static final String HELD_ITEM_SLOT = c + "HeldItemSlot";
public static final String CLOSE_WINDOW = c + "CloseWindow";
public static final String TAB_COMPLETE = c + "TabComplete";
public static final String CHAT = c + "Chat";
public static final String SET_CREATIVE_SLOT = c + "SetCreativeSlot";
public static final String KEEP_ALIVE = c + "KeepAlive";
}
public static final class Server {
private static final String s = "PacketPlayOut";
public static final String ANIMATION = s + "Animation";
public static final String KEEP_ALIVE = s + "KeepAlive";
public static final String CHAT = s + "Chat";
public static final String POSITION = s + "Position";
public static final String TRANSACTION = s + "Transaction";
public static final String NAMED_ENTITY_SPAWN = s + "NamedEntitySpawn";
public static final String SPAWN_ENTITY_LIVING = s + "SpawnEntityLiving";
public static final String SPAWN_ENTITY = s + "SpawnEntity";
public static final String CUSTOM_PAYLOAD = s + "CustomPayload";
public static final String ABILITIES = s + "Abilities";
public static final String ENTITY_METADATA = s + "EntityMetadata";
public static final String ENTITY_VELOCITY = s + "EntityVelocity";
public static final String ENTITY_DESTROY = s + "EntityDestroy";
public static final String ENTITY_HEAD_ROTATION = s + "EntityHeadRotation";
public static final String BLOCK_CHANGE = s + "BlockChange";
public static final String CLOSE_WINDOW = s + "CloseWindow";
public static final String HELD_ITEM_SLOT = s + "HeldItemSlot";
public static final String TAB_COMPLETE = s + "TabComplete";
public static final String RESPAWN = s + "Respawn";
public static final String WORLD_PARTICLES = s + "WorldParticles";
public static final String COMMANDS = s + "Commands";
public static final String OPEN_WINDOW = s + "OpenWindow";
public static final String LOGIN = s + "Login";
public static final String SERVER_DIFFICULTY = s + "ServerDifficulty";
}
public static final class Login {
public static final String HANDSHAKE = "PacketHandshakingInSetProtocol";
public static final String PING = "PacketStatusInPing";
public static final String START = "PacketStatusInStart";
public static final String SUCCESS = "PacketLoginOutSuccess";
public static final String ENCRYPTION_BEGIN_IN = "PacketLoginInEncryptionBegin";
public static final String ENCRYPTION_BEGIN_OUT = "PacketLoginOutEncryptionBegin";
}
}
@@ -0,0 +1,90 @@
package io.github.retrooper.packetevents.packetwrappers.out.entity;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
public class WrappedPacketOutEntity extends WrappedPacket {
private int entityId;
private double deltaX, deltaY, deltaZ;
private byte yaw, pitch;
private boolean onGround;
public WrappedPacketOutEntity(Object packet) {
super(packet);
}
@Override
protected void setup() {
try {
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);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public byte getPitch() {
return pitch;
}
public byte getYaw() {
return yaw;
}
public double getDeltaZ() {
return deltaZ;
}
public double getDeltaY() {
return deltaY;
}
public double getDeltaX() {
return deltaX;
}
public int getEntityId() {
return entityId;
}
public boolean isOnGround() {
return onGround;
}
private static Class<?> packetClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutEntity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,25 @@
package io.github.retrooper.packetevents.settings;
import io.github.retrooper.packetevents.enums.ServerVersion;
public class Settings {
private ServerVersion defaultServerVersion;
/**
* If PacketEvents fails to detect your server version, it will use the recommended version
*
* @return Recommended version
*/
public ServerVersion getDefaultServerVersion() {
return defaultServerVersion;
}
/**
* Set the recommended version
*
* @param version
*/
public void setDefaultServerVersion(final ServerVersion version) {
defaultServerVersion = version;
}
}
@@ -1,5 +1,6 @@
package io.github.retrooper.packetevents.utils;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.annotations.Nullable;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
@@ -15,18 +16,24 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public final class NMSUtils {
private static final ServerVersion version = ServerVersion.getVersion();
public static final String nettyPrefix = version.isLowerThan(ServerVersion.v_1_8) ? "net.minecraft.util.io.netty" : "io.netty";
private static final ServerVersion version = PacketEvents.getAPI().getServerUtilities().getServerVersion();
public static String nettyPrefix;
private static final String nmsDir = ServerVersion.getNMSDirectory();
private static final String obcDir = ServerVersion.getOBCDirectory();
public static Class<?> minecraftServerClass, craftWorldsClass,
packetClass, entityPlayerClass, playerConnectionClass,
craftPlayerClass, serverConnectionClass, craftEntityClass,
craftItemStack, nmsItemStackClass, networkManagerClass, nettyChannelClass;
private static Method getServerMethod, getCraftWorldHandleMethod, getServerConnection, getCraftPlayerHandle, getCraftEntityHandle, sendPacketMethod, asBukkitCopy;
private static Field recentTPSField, entityPlayerPingField, playerConnectionField;
private static Method getCraftWorldHandleMethod, getServerConnection, getCraftPlayerHandle, getCraftEntityHandle, sendPacketMethod, asBukkitCopy;
private static Field entityPlayerPingField, playerConnectionField;
static {
try {
nettyPrefix = "io.netty";
Class.forName("io.netty.channel.Channel");
} catch (ClassNotFoundException e) {
nettyPrefix = "net.minecraft.util.io.netty";
}
try {
nettyChannelClass = getNettyClass("channel.Channel");
minecraftServerClass = getNMSClass("MinecraftServer");
@@ -46,7 +53,6 @@ public final class NMSUtils {
//METHODS
try {
getServerMethod = minecraftServerClass.getMethod("getServer");
getCraftWorldHandleMethod = craftWorldsClass.getMethod("getHandle");
getCraftPlayerHandle = craftPlayerClass.getMethod("getHandle");
getCraftEntityHandle = craftEntityClass.getMethod("getHandle");
@@ -59,7 +65,6 @@ public final class NMSUtils {
try {
recentTPSField = minecraftServerClass.getField("recentTps");
entityPlayerPingField = entityPlayerClass.getField("ping");
playerConnectionField = entityPlayerClass.getField("playerConnection");
} catch (NoSuchFieldException e) {
@@ -68,13 +73,12 @@ public final class NMSUtils {
}
public static Object getMinecraftServerInstance() throws InvocationTargetException, IllegalAccessException {
return getServerMethod.invoke(null);
return Reflection.getMethod(minecraftServerClass, "getServer", 0).invoke(null);
}
public static double[] recentTPS() throws IllegalAccessException, InvocationTargetException {
final Object minecraftServerObj = getMinecraftServerInstance();
double[] recentTPS = (double[]) recentTPSField.get(minecraftServerObj);
return recentTPS;
return (double[]) Reflection.getField(minecraftServerClass, double[].class, 0).get(minecraftServerObj);
}
public static Class<?> getNMSClass(String name) throws ClassNotFoundException {
@@ -1,4 +1,4 @@
package io.github.retrooper.packetevents;
package io.github.retrooper.packetevents.utils.api;
import io.github.retrooper.packetevents.enums.ClientVersion;
import io.github.retrooper.packetevents.handler.NettyPacketHandler;
@@ -9,10 +9,21 @@ import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.UUID;
public class PlayerUtils {
protected final HashMap<UUID, ClientVersion> clientVersionsMap = new HashMap<UUID, ClientVersion>();
public final class PlayerUtils {
private final HashMap<UUID, ClientVersion> clientVersionsMap = new HashMap<UUID, ClientVersion>();
/**
* Use {@link #getPing(Player)}
*
* @param player
* @return
*/
@Deprecated
public int getPlayerPing(final Player player) {
return getPing(player);
}
public int getPing(final Player player) {
return NMSUtils.getPlayerPing(player);
}
@@ -24,6 +35,22 @@ public class PlayerUtils {
return getClientVersion(player.getUniqueId());
}
public void setClientVersion(final UUID uuid, final ClientVersion version) {
clientVersionsMap.put(uuid, version);
}
public void setClientVersion(final Player player, final ClientVersion version) {
setClientVersion(player.getUniqueId(), version);
}
public void clearClientVersion(final UUID uuid) {
clientVersionsMap.remove(uuid);
}
public void clearClientVersion(final Player player) {
clearClientVersion(player.getUniqueId());
}
public void injectPlayer(final Player player) {
NettyPacketHandler.injectPlayer(player);
}
@@ -1,4 +1,4 @@
package io.github.retrooper.packetevents;
package io.github.retrooper.packetevents.utils.api;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.enums.SystemOS;
@@ -6,7 +6,7 @@ import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.InvocationTargetException;
public class ServerUtils {
public final class ServerUtils {
public ServerVersion getServerVersion() {
return ServerVersion.getVersion();
}
@@ -1,4 +1,4 @@
package io.github.retrooper.packetevents.utils.api;
package io.github.retrooper.packetevents.utils.versionlookup;
import com.comphenix.protocol.ProtocolLibrary;
import org.bukkit.entity.Player;
@@ -1,4 +1,4 @@
package io.github.retrooper.packetevents.utils.api;
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -1,4 +1,4 @@
package io.github.retrooper.packetevents.utils.api;
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.entity.Player;
import protocolsupport.api.ProtocolSupportAPI;
@@ -1,4 +1,4 @@
package io.github.retrooper.packetevents.utils.api;
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -1,4 +1,4 @@
package io.github.retrooper.packetevents.utils.api;
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.entity.Player;
@@ -1,4 +1,4 @@
package io.github.retrooper.packetevents.utils.api;
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.entity.Player;
import us.myles.ViaVersion.api.Via;
@@ -1,4 +1,4 @@
package io.github.retrooper.packetevents.utils.api;
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;