Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
07692f87f2 | ||
|
|
7f94b254a2 | ||
|
|
ceb3581c28 | ||
|
|
c3bf5d75d3 | ||
|
|
297d261ca9 | ||
|
|
89a67e7ee4 | ||
|
|
0d6d34a93b | ||
|
|
cb89a42184 | ||
|
|
6837b1d803 | ||
|
|
8967babc37 | ||
|
|
a4f93cfe8d | ||
|
|
5dde0b56f8 | ||
|
|
43dee3dfeb | ||
|
|
937dbc5c03 | ||
|
|
78e17c2abb | ||
|
|
4653dbcaba | ||
|
|
057e1b960a | ||
|
|
5feaabad92 | ||
|
|
2c395d4313 | ||
|
|
6af68cfc7a |
No files matched your search
@@ -4,30 +4,25 @@ A lightweight spigot packetlistener & packetsender coded by retrooper.
|
||||
|
||||
## Credit:
|
||||
|
||||
PacketEvents uses a modified version of [TinyProtocol](http://github.com/dmulloy2/ProtocolLib/blob/master/TinyProtocol/src/main/java/com/comphenix/tinyprotocol/TinyProtocol.java) by DeprecatedLuke to support 1.7.10 & 1.8.
|
||||
I modified DeprecatedLuek's version of TinyProtocol and added support for 1.9+ versions.
|
||||
PacketEvents uses a modified version of [TinyProtocol](http://github.com/dmulloy2/ProtocolLib/blob/master/TinyProtocol/src/main/java/com/comphenix/tinyprotocol/TinyProtocol.java) by [@DeprecatedLuke](https://github.com/DeprecatedLuke) to support 1.7.10 & 1.8.
|
||||
I modified DeprecatedLuke's version of TinyProtocol and added support for 1.9+ versions.
|
||||
|
||||
PacketEvents also took Atlas' Packet class.(all the packet names)
|
||||
|
||||
This packetlistener is **only** supported on spigot servers and works on these spigot forks:(PaperSpigot, Tuinity)
|
||||
## About
|
||||
|
||||
This packetlistener is **only** supported on spigot servers and has been tested to work on these spigot forks: PaperSpigot, Tuinity
|
||||
|
||||
* No dependencies
|
||||
|
||||
* Licensed with the GPL2 license.
|
||||
* Licensed under the GPL2 license.
|
||||
|
||||
[](https://www.gnu.org/licenses/gpl-2.0)
|
||||
|
||||
Join my discord server(to talk to me): https://discord.gg/ZWTkg4v
|
||||
|
||||
How to use with **Gradle, Maven, sbt and leiningen**.
|
||||
|
||||
Click the link below.
|
||||
|
||||
Make sure to replace **Tag** with a proper release version or a valid commit hash(first 7 characters)
|
||||
|
||||
I recommend you to use the latest released version!
|
||||
|
||||
|
||||
[](https://jitpack.io/#retrooper/packetevents)
|
||||
|
||||
If clicking the badge doesn't work paste this link into your browser http://jitpack.io/#retrooper/packetevents
|
||||
To learn how to setup this API please click on the link below
|
||||
[Setup Guide](https://github.com/retrooper/packetevents/wiki/PacketEvents-Setup-Guide)
|
||||
(or just paste this into your browser: https://github.com/retrooper/packetevents/wiki/PacketEvents-Setup-Guide)
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
<groupId>io.github.retrooper</groupId>
|
||||
<artifactId>packetevents</artifactId>
|
||||
<version>1.2.9.2</version>
|
||||
<version>1.3.3</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>packetevents</name>
|
||||
<properties>
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package io.github.retrooper.packetevents;
|
||||
|
||||
import io.github.retrooper.packetevents.annotations.Nullable;
|
||||
import io.github.retrooper.packetevents.annotations.PacketHandler;
|
||||
import io.github.retrooper.packetevents.enums.ClientVersion;
|
||||
import io.github.retrooper.packetevents.enums.ServerVersion;
|
||||
import io.github.retrooper.packetevents.event.PacketHandler;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketListener;
|
||||
import io.github.retrooper.packetevents.event.impl.PacketLoginEvent;
|
||||
import io.github.retrooper.packetevents.event.impl.PlayerInjectEvent;
|
||||
import io.github.retrooper.packetevents.event.impl.ServerTickEvent;
|
||||
import io.github.retrooper.packetevents.event.impl.*;
|
||||
import io.github.retrooper.packetevents.event.manager.EventManager;
|
||||
import io.github.retrooper.packetevents.handler.TinyProtocolHandler;
|
||||
import io.github.retrooper.packetevents.packet.Packet;
|
||||
@@ -15,20 +15,28 @@ import io.github.retrooper.packetevents.packetwrappers.login.WrappedPacketLoginH
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerJoinEvent;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class PacketEvents implements PacketListener{
|
||||
public final class PacketEvents implements PacketListener, Listener {
|
||||
|
||||
private static boolean hasRegistered = false;
|
||||
|
||||
/*
|
||||
* Wrappers TODO:
|
||||
* Spawn entity
|
||||
*/
|
||||
|
||||
private static boolean hasRegistered;
|
||||
|
||||
private static final ServerVersion version = ServerVersion.getVersion();
|
||||
private static PacketEvents instance;
|
||||
private static EventManager eventManager = new EventManager();
|
||||
private static final EventManager eventManager = new EventManager();
|
||||
|
||||
private static int currentTick;
|
||||
|
||||
@@ -41,25 +49,35 @@ public class PacketEvents implements PacketListener{
|
||||
}
|
||||
|
||||
|
||||
public static void start(final JavaPlugin plugin, final boolean serverTickEventEnabled) {
|
||||
/**
|
||||
* Starts the server tick task and initiates the TinyProtocolHandler
|
||||
*
|
||||
* @param plugin
|
||||
*/
|
||||
public static void start(final Plugin plugin) {
|
||||
if (!hasRegistered) {
|
||||
//Register Bukkit and PacketListener
|
||||
getEventManager().registerListener(getInstance());
|
||||
hasRegistered = true;
|
||||
}
|
||||
final TinyProtocolHandler packetHandler = new TinyProtocolHandler(plugin);
|
||||
packetHandler.initTinyProtocol();
|
||||
|
||||
if (serverTickEventEnabled) {
|
||||
final Runnable runnable = new Runnable() {
|
||||
Bukkit.getPluginManager().registerEvents(getInstance(), plugin);
|
||||
//Initialize the TinyProtocolHandler
|
||||
TinyProtocolHandler.initTinyProtocol(plugin);
|
||||
|
||||
//Start the server tick task
|
||||
final Runnable tickRunnable = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
getEventManager().callEvent(new ServerTickEvent(currentTick++, PacketEvents.currentCalculatedMS()));
|
||||
}
|
||||
};
|
||||
serverTickTask = Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, runnable, 0L, 1L);
|
||||
serverTickTask = Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, tickRunnable, 0L, 1L);
|
||||
hasRegistered = true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop all tasks and unregisters all packetevent listeners
|
||||
*/
|
||||
public static void stop() {
|
||||
if (serverTickTask != null) {
|
||||
serverTickTask.cancel();
|
||||
@@ -67,20 +85,44 @@ public class PacketEvents implements PacketListener{
|
||||
getEventManager().unregisterAllListeners();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the server's version
|
||||
*
|
||||
* @return version
|
||||
*/
|
||||
public static ServerVersion getServerVersion() {
|
||||
return version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the server tick task, you may cancel it if you wish.
|
||||
* To cancel it do PacketEvents.getServerTickTask().cancel();
|
||||
* <p>
|
||||
* This bukkit task runs asynchronously every tick and is started in the start(plugin) function
|
||||
*
|
||||
* @return serverTickTask
|
||||
*/
|
||||
public static BukkitTask getServerTickTask() {
|
||||
return serverTickTask;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an instance of the PacketEvents API class
|
||||
*
|
||||
* @return instance
|
||||
*/
|
||||
public static PacketEvents getInstance() {
|
||||
return instance == null ? instance = new PacketEvents() : instance;
|
||||
}
|
||||
|
||||
public static boolean isServerTickTaskEnabled() {
|
||||
return serverTickTask != null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the server's recent TPS values
|
||||
* TPS stands for ticks per second.
|
||||
* Learn more about ticks <a href="https://apexminecrafthosting.com/what-is-minecraft-tps/">"https://apexminecrafthosting.com/what-is-minecraft-tps/"</a>
|
||||
*
|
||||
* @return recentTPS[]
|
||||
*/
|
||||
public static double[] getRecentServerTPS() {
|
||||
double[] tpsArray = new double[0];
|
||||
try {
|
||||
@@ -91,35 +133,48 @@ public class PacketEvents implements PacketListener{
|
||||
return tpsArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the server's current TPS
|
||||
* TPS stands for ticks per second.
|
||||
* Learn more about ticks <a href="https://apexminecrafthosting.com/what-is-minecraft-tps/">"https://apexminecrafthosting.com/what-is-minecraft-tps/"</a>
|
||||
*
|
||||
* @return currentTPS / recentTPS[0]
|
||||
*/
|
||||
public static double getCurrentServerTPS() {
|
||||
return getRecentServerTPS()[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player's ping.
|
||||
* Learn more about ping <a href="https://en.wikipedia.org/wiki/Ping_(networking_utility)">https://en.wikipedia.org/wiki/Ping_(networking_utility)</a>
|
||||
*
|
||||
* @param player
|
||||
* @return ping
|
||||
*/
|
||||
public static int getPing(final Player player) {
|
||||
return NMSUtils.getPlayerPing(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* This function returns nanoTime / 1 million,
|
||||
* Should I use this over System.currentTimeMillis()?
|
||||
* <p>
|
||||
* 1. System.currentTimeMillis() isn't supported on all machines
|
||||
* 2. This is way more accurate than System.currentTimeMillis()
|
||||
* 3. System.currentTimeMillis() can be up to 50ms off, depending on the operating system.
|
||||
*
|
||||
* Why use this instead of System.currentTimeMillis()?
|
||||
*
|
||||
* System.currentTimeMillis() isn't supported on all machines,
|
||||
* This function is also more accurate, although it is slower on
|
||||
* Windows machines, it is faster than System.currentTimeMillis() on other Operating Systems!
|
||||
* @return
|
||||
* @return nanoTime / 1 million
|
||||
*/
|
||||
public static long currentCalculatedMS() {
|
||||
return System.nanoTime() / 1000000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player's clients' version.
|
||||
*
|
||||
* Do not call this method in the PlayerInjectEvent or before the player is injected.
|
||||
* Get the player's version.
|
||||
* Do not call this method in the PlayerInjectEvent, it is safe to call it in the PostPlayerInjectEvent.
|
||||
* The EntityPlayer object is null at that time, resulting in the version lookup to fail.
|
||||
*
|
||||
* @param player
|
||||
* @return
|
||||
* @return ClientVersion
|
||||
*/
|
||||
@Nullable
|
||||
public static ClientVersion getClientVersion(final Player player) {
|
||||
@@ -127,6 +182,14 @@ public class PacketEvents implements PacketListener{
|
||||
return clientVersionLookup.get(channel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the players' client version
|
||||
* Do not call this method in the PlayerInjectEvent, it is safe to call it in the PostPlayerInjectEvent.
|
||||
* The EntityPlayer object is null at that time, resulting in the version lookup to fail.
|
||||
*
|
||||
* @param channel
|
||||
* @return ClientVersion
|
||||
*/
|
||||
@Nullable
|
||||
public static ClientVersion getClientVersion(final Object channel) {
|
||||
return clientVersionLookup.get(channel);
|
||||
@@ -141,19 +204,73 @@ public class PacketEvents implements PacketListener{
|
||||
}
|
||||
}
|
||||
|
||||
@PacketHandler
|
||||
public void onPacket(final PacketEvent e) {
|
||||
if(e instanceof PacketReceiveEvent) {
|
||||
// System.out.println("RECEIVED");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Do not check the client version in or before the PlayerInjectEvent,
|
||||
* it will cause ERRORSS
|
||||
* Do not check the client version in or before the PlayerInjectEvent, use the PostPlayerInjectEvent.
|
||||
* It is not recommended to do much in the PlayerInjectEvent, as some fields in the Player object are be null.
|
||||
* Use the PostPlayerInjectEvent which is only called after the PlayerJoinEvent if the player was injected.
|
||||
*
|
||||
* @param e
|
||||
*/
|
||||
@PacketHandler
|
||||
public void onInject(final PlayerInjectEvent e) {
|
||||
final String username = e.getPlayer().getName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after the PlayerJoinEvent ONLY if the player has been injected!
|
||||
*
|
||||
* @param e
|
||||
*/
|
||||
@PacketHandler
|
||||
public void onPostInject(final PostPlayerInjectEvent e) {
|
||||
//It is safe to get his client version in here.
|
||||
final ClientVersion clientVersion = PacketEvents.getClientVersion(e.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onJoin(PlayerJoinEvent e) {
|
||||
if (hasInjected(e.getPlayer())) {
|
||||
PacketEvents.getEventManager().callEvent(new PostPlayerInjectEvent(e.getPlayer()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Version independent player injection
|
||||
* @param player
|
||||
*/
|
||||
public static void injectPlayer(final Player player) {
|
||||
TinyProtocolHandler.inject(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Version independant player injection
|
||||
*
|
||||
* @param player
|
||||
*/
|
||||
public static void uninjectPlayer(final Player player) {
|
||||
TinyProtocolHandler.uninject(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether we have injected the player
|
||||
*
|
||||
* @param player
|
||||
* @return hasInjected
|
||||
*/
|
||||
public static boolean hasInjected(final Player player) {
|
||||
return TinyProtocolHandler.hasInjected(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a wrapped sendable packet to a player
|
||||
*
|
||||
* @param player
|
||||
* @param sendable
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package io.github.retrooper.packetevents.annotations;
|
||||
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
/**
|
||||
* Is for sure not null.
|
||||
*/
|
||||
@Documented
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface NotNull {
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package io.github.retrooper.packetevents.annotations;
|
||||
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
|
||||
/**
|
||||
* Could be null.
|
||||
*/
|
||||
@Documented
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
public @interface Nullable {
|
||||
|
||||
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package io.github.retrooper.packetevents.event;
|
||||
package io.github.retrooper.packetevents.annotations;
|
||||
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
@@ -64,4 +64,35 @@ public enum ClientVersion {
|
||||
}
|
||||
return INVALID;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the client's version is more up to date than the argument passed version
|
||||
*
|
||||
* @param version
|
||||
* @return
|
||||
*/
|
||||
public boolean isHigherThan(final ClientVersion version) {
|
||||
if (this == version) return false;
|
||||
return !isLowerThan(version);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns if the client's version is more outdated than the argument passed version
|
||||
* @param version
|
||||
* @return
|
||||
*/
|
||||
public boolean isLowerThan(final ClientVersion version) {
|
||||
if(version == this) return false;
|
||||
byte len = (byte) values().length;
|
||||
for (byte i = 0; i < len; i++) {
|
||||
final ClientVersion v = values()[i];
|
||||
if(v == this) {
|
||||
return true;
|
||||
}
|
||||
else if(v == version) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@ package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
|
||||
public class PacketLoginEvent extends PacketEvent {
|
||||
public final class PacketLoginEvent extends PacketEvent {
|
||||
private final Object channel;
|
||||
private final String name;
|
||||
private final Object packet;
|
||||
@@ -12,15 +12,15 @@ public class PacketLoginEvent extends PacketEvent {
|
||||
this.packet = packet;
|
||||
}
|
||||
|
||||
public final Object getNettyChannel() {
|
||||
public Object getNettyChannel() {
|
||||
return channel;
|
||||
}
|
||||
|
||||
public final String getPacketName() {
|
||||
public String getPacketName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public final Object getPacket() {
|
||||
public Object getPacket() {
|
||||
return packet;
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package io.github.retrooper.packetevents.event.impl;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PacketReceiveEvent extends PacketEvent {
|
||||
public final class PacketReceiveEvent extends PacketEvent {
|
||||
private final Player player;
|
||||
private final String name;
|
||||
private final Object packet;
|
||||
|
||||
@@ -4,7 +4,7 @@ import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
|
||||
public class PacketSendEvent extends PacketEvent {
|
||||
public final class PacketSendEvent extends PacketEvent {
|
||||
private final Player player;
|
||||
private final String name;
|
||||
private final Object packet;
|
||||
@@ -43,217 +43,5 @@ public class PacketSendEvent extends PacketEvent {
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
/**
|
||||
* Get the player's ping in the EntityPlayer's class
|
||||
* @return ping
|
||||
* @throws VersionNotFoundException
|
||||
|
||||
public int getPing() throws VersionNotFoundException {
|
||||
int ping;
|
||||
if (version == ServerVersion.v_1_8) {
|
||||
net.minecraft.server.v1_8_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
} else if (version == ServerVersion.v_1_8_3) {
|
||||
net.minecraft.server.v1_8_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
} else if (version == ServerVersion.v_1_8_8) {
|
||||
net.minecraft.server.v1_8_R3.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
} else if (version == ServerVersion.v_1_9) {
|
||||
net.minecraft.server.v1_9_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
} else if (version == ServerVersion.v_1_9_4) {
|
||||
net.minecraft.server.v1_9_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
} else if (version == ServerVersion.v_1_10_2) {
|
||||
net.minecraft.server.v1_10_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
} else if (version == ServerVersion.v_1_11_1 || version == ServerVersion.v_1_11_2) {
|
||||
net.minecraft.server.v1_11_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
} else if (version == ServerVersion.v_1_12_1 || version == ServerVersion.v_1_12_2) {
|
||||
net.minecraft.server.v1_12_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
} else if (version == ServerVersion.v_1_13) {
|
||||
net.minecraft.server.v1_13_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
}
|
||||
else if(version == ServerVersion.v_1_13_2) {
|
||||
net.minecraft.server.v1_13_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
}
|
||||
else if (version == ServerVersion.v_1_14 || version == ServerVersion.v_1_14_1) {
|
||||
net.minecraft.server.v1_14_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
} else if (version == ServerVersion.v_1_15_1) {
|
||||
net.minecraft.server.v1_15_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer)player).getHandle();
|
||||
ping = ePlayer.ping;
|
||||
} else {
|
||||
throw new VersionNotFoundException();
|
||||
}
|
||||
return ping;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the motX variable in the EntityPlayer class
|
||||
*
|
||||
* @return motX
|
||||
|
||||
public double getMotX() throws VersionNotFoundException {
|
||||
double motX;
|
||||
if (version == ServerVersion.v_1_8) {
|
||||
net.minecraft.server.v1_8_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.motX;
|
||||
} else if (version == ServerVersion.v_1_8_3) {
|
||||
net.minecraft.server.v1_8_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.motX;
|
||||
} else if (version == ServerVersion.v_1_8_8) {
|
||||
net.minecraft.server.v1_8_R3.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.motX;
|
||||
} else if (version == ServerVersion.v_1_9) {
|
||||
net.minecraft.server.v1_9_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.motX;
|
||||
} else if (version == ServerVersion.v_1_9_4) {
|
||||
net.minecraft.server.v1_9_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.motX;
|
||||
} else if (version == ServerVersion.v_1_10_2) {
|
||||
net.minecraft.server.v1_10_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.motX;
|
||||
} else if (version == ServerVersion.v_1_11_1 || version == ServerVersion.v_1_11_2) {
|
||||
net.minecraft.server.v1_11_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.motX;
|
||||
} else if (version == ServerVersion.v_1_12_1 || version == ServerVersion.v_1_12_2) {
|
||||
net.minecraft.server.v1_12_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.motX;
|
||||
} else if (version == ServerVersion.v_1_13) {
|
||||
net.minecraft.server.v1_13_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.motX;
|
||||
}
|
||||
else if(version == ServerVersion.v_1_13_2) {
|
||||
net.minecraft.server.v1_13_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.motX;
|
||||
}
|
||||
else if (version == ServerVersion.v_1_14 || version == ServerVersion.v_1_14_1) {
|
||||
net.minecraft.server.v1_14_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.getMot().getX();
|
||||
} else if (version == ServerVersion.v_1_15_1) {
|
||||
net.minecraft.server.v1_15_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer)player).getHandle();
|
||||
motX = ePlayer.getMot().getX();
|
||||
} else {
|
||||
throw new VersionNotFoundException();
|
||||
}
|
||||
return motX;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get the motY variable in the EntityPlayer class
|
||||
*
|
||||
* @return motY
|
||||
|
||||
public double getMotY() throws VersionNotFoundException {
|
||||
double motY;
|
||||
if (version == ServerVersion.v_1_8) {
|
||||
net.minecraft.server.v1_8_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.motY;
|
||||
} else if (version == ServerVersion.v_1_8_3) {
|
||||
net.minecraft.server.v1_8_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.motY;
|
||||
} else if (version == ServerVersion.v_1_8_8) {
|
||||
net.minecraft.server.v1_8_R3.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.motY;
|
||||
} else if (version == ServerVersion.v_1_9) {
|
||||
net.minecraft.server.v1_9_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.motY;
|
||||
} else if (version == ServerVersion.v_1_9_4) {
|
||||
net.minecraft.server.v1_9_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.motY;
|
||||
} else if (version == ServerVersion.v_1_10_2) {
|
||||
net.minecraft.server.v1_10_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.motY;
|
||||
} else if (version == ServerVersion.v_1_11_1 || version == ServerVersion.v_1_11_2) {
|
||||
net.minecraft.server.v1_11_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.motY;
|
||||
} else if (version == ServerVersion.v_1_12_1 || version == ServerVersion.v_1_12_2) {
|
||||
net.minecraft.server.v1_12_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.motY;
|
||||
} else if (version == ServerVersion.v_1_13) {
|
||||
net.minecraft.server.v1_13_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.motY;
|
||||
}
|
||||
else if(version == ServerVersion.v_1_13_2) {
|
||||
net.minecraft.server.v1_13_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.motY;
|
||||
}
|
||||
else if (version == ServerVersion.v_1_14 || version == ServerVersion.v_1_14_1) {
|
||||
net.minecraft.server.v1_14_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.getMot().getY();
|
||||
} else if (version == ServerVersion.v_1_15_1) {
|
||||
net.minecraft.server.v1_15_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer)player).getHandle();
|
||||
motY = ePlayer.getMot().getY();
|
||||
} else {
|
||||
throw new VersionNotFoundException();
|
||||
}
|
||||
return motY;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the motZ variable in the EntityPlayer class
|
||||
*
|
||||
* @return motZ
|
||||
|
||||
public double getMotZ() throws VersionNotFoundException {
|
||||
double motZ;
|
||||
if (version == ServerVersion.v_1_8) {
|
||||
net.minecraft.server.v1_8_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.motZ;
|
||||
} else if (version == ServerVersion.v_1_8_3) {
|
||||
net.minecraft.server.v1_8_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.motZ;
|
||||
} else if (version == ServerVersion.v_1_8_8) {
|
||||
net.minecraft.server.v1_8_R3.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.motZ;
|
||||
} else if (version == ServerVersion.v_1_9) {
|
||||
net.minecraft.server.v1_9_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.motZ;
|
||||
} else if (version == ServerVersion.v_1_9_4) {
|
||||
net.minecraft.server.v1_9_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.motZ;
|
||||
} else if (version == ServerVersion.v_1_10_2) {
|
||||
net.minecraft.server.v1_10_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.motZ;
|
||||
} else if (version == ServerVersion.v_1_11_1 || version == ServerVersion.v_1_11_2) {
|
||||
net.minecraft.server.v1_11_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.motZ;
|
||||
} else if (version == ServerVersion.v_1_12_1 || version == ServerVersion.v_1_12_2) {
|
||||
net.minecraft.server.v1_12_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.motZ;
|
||||
} else if (version == ServerVersion.v_1_13) {
|
||||
net.minecraft.server.v1_13_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.motZ;
|
||||
}
|
||||
else if(version == ServerVersion.v_1_13_2) {
|
||||
net.minecraft.server.v1_13_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.motZ;
|
||||
}
|
||||
else if (version == ServerVersion.v_1_14 || version == ServerVersion.v_1_14_1) {
|
||||
net.minecraft.server.v1_14_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.getMot().getZ();
|
||||
} else if (version == ServerVersion.v_1_15_1) {
|
||||
net.minecraft.server.v1_15_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer)player).getHandle();
|
||||
motZ = ePlayer.getMot().getZ();
|
||||
} else {
|
||||
throw new VersionNotFoundException();
|
||||
}
|
||||
return motZ;
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -3,14 +3,26 @@ package io.github.retrooper.packetevents.event.impl;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PlayerInjectEvent extends PacketEvent {
|
||||
public final class PlayerInjectEvent extends PacketEvent {
|
||||
private final Player player;
|
||||
private boolean cancelled;
|
||||
public PlayerInjectEvent(final Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
public void setCancelled(boolean cancelled) {
|
||||
this.cancelled = cancelled;
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
setCancelled(true);
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package io.github.retrooper.packetevents.event.impl;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PlayerUninjectEvent extends PacketEvent {
|
||||
public final class PlayerUninjectEvent extends PacketEvent {
|
||||
private final Player player;
|
||||
|
||||
public PlayerUninjectEvent(final Player player) {
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public final class PostPlayerInjectEvent extends PacketEvent {
|
||||
private final Player player;
|
||||
|
||||
public PostPlayerInjectEvent(final Player player) {
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
package io.github.retrooper.packetevents.event.impl;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
|
||||
//unfinished
|
||||
public class ServerReloadEvent extends PacketEvent {
|
||||
private boolean cancelled;
|
||||
|
||||
public void setCancelled(final boolean val) {
|
||||
this.cancelled = val;
|
||||
}
|
||||
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,7 +3,7 @@ package io.github.retrooper.packetevents.event.impl;
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
|
||||
public class ServerTickEvent extends PacketEvent {
|
||||
public final class ServerTickEvent extends PacketEvent {
|
||||
private final int tick;
|
||||
private final double tps;
|
||||
public ServerTickEvent(final int tick, final long timestamp) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package io.github.retrooper.packetevents.event.manager;
|
||||
|
||||
import io.github.retrooper.packetevents.annotations.PacketHandler;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketHandler;
|
||||
import io.github.retrooper.packetevents.event.PacketListener;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
@@ -10,7 +10,7 @@ import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
public class EventManager {
|
||||
public final class EventManager {
|
||||
|
||||
private HashMap<PacketListener, List<Method>> registeredMethods = new HashMap<PacketListener, List<Method>>();
|
||||
|
||||
@@ -19,8 +19,9 @@ public class EventManager {
|
||||
//Annotated methods
|
||||
final List<Method> methods = registeredMethods.get(listener);
|
||||
for (final Method method : methods) {
|
||||
if (method.getParameterTypes()[0].equals(PacketEvent.class)
|
||||
|| method.getParameterTypes()[0].getSimpleName().equals(e.getClass().getSimpleName())) {
|
||||
final Class<?> parameterType = method.getParameterTypes()[0];
|
||||
if (parameterType.equals(PacketEvent.class)
|
||||
|| parameterType.isInstance(e)) {
|
||||
try {
|
||||
method.invoke(listener, e);
|
||||
} catch (IllegalAccessException | InvocationTargetException ex) {
|
||||
@@ -33,13 +34,19 @@ public class EventManager {
|
||||
|
||||
|
||||
public void registerListener(final PacketListener e) {
|
||||
if (registeredMethods.containsKey(e)) {
|
||||
return;
|
||||
}
|
||||
final List<Method> methods = new ArrayList<Method>();
|
||||
for (final Method m : e.getClass().getMethods()) {
|
||||
if (m.isAnnotationPresent(PacketHandler.class)) {
|
||||
if (m.isAnnotationPresent(PacketHandler.class)
|
||||
&& m.getParameterTypes().length == 1) {
|
||||
methods.add(m);
|
||||
}
|
||||
}
|
||||
registeredMethods.put(e, methods);
|
||||
if (!methods.isEmpty()) {
|
||||
registeredMethods.put(e, methods);
|
||||
}
|
||||
}
|
||||
|
||||
public void unregisterListener(final PacketListener e) {
|
||||
|
||||
@@ -1,59 +0,0 @@
|
||||
package io.github.retrooper.packetevents.example;
|
||||
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* Example packetevent
|
||||
* Make sure to initiate the super timestamp variable,
|
||||
* if you want to use the getTimestamp() function
|
||||
*/
|
||||
public class CustomMoveEvent extends PacketEvent {
|
||||
private final Player player;
|
||||
private Location to, from;
|
||||
private boolean cancelled;
|
||||
|
||||
public CustomMoveEvent(final Player player, final Location to, final Location from) {
|
||||
this.player = player;
|
||||
this.to = to;
|
||||
this.from = from;
|
||||
this.cancelled = false;
|
||||
//Timestamp is initialized automatically, so you don't need to initiate it, but you may modify it if you like
|
||||
//this.timestamp = PacketEvents.currentTimeMS();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getTimestamp() {
|
||||
return super.getTimestamp();
|
||||
}
|
||||
|
||||
public void setCancelled(boolean cancelled) {
|
||||
this.cancelled = cancelled;
|
||||
}
|
||||
|
||||
public boolean isCancelled() {
|
||||
return this.cancelled;
|
||||
}
|
||||
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
public Location getTo() {
|
||||
return to;
|
||||
}
|
||||
|
||||
public Location getFrom() {
|
||||
return from;
|
||||
}
|
||||
|
||||
public void setTo(final Location loc) {
|
||||
this.to = loc;
|
||||
}
|
||||
|
||||
public void setFrom(final Location loc) {
|
||||
this.from = from;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,39 +1,17 @@
|
||||
package io.github.retrooper.packetevents.example;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.enums.ServerVersion;
|
||||
import io.github.retrooper.packetevents.packet.Packet;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
public class MainExample extends JavaPlugin {
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
|
||||
//Should the ServerTickEvent ever get called?
|
||||
final boolean serverTickEventEnabled = true;
|
||||
|
||||
/**
|
||||
* Starts the servertickevent repeating task (if enabled)
|
||||
* and registers onJoin and onQuit events to inject and uninject players.
|
||||
* The first argument is an instance to your Main Class,
|
||||
* The second argument is a boolean whether the servertickevent should ever get called
|
||||
*/
|
||||
PacketEvents.start(this, serverTickEventEnabled);
|
||||
|
||||
|
||||
/**
|
||||
* Register TestExample's PacketListener
|
||||
*/
|
||||
PacketEvents.getEventManager().registerListener(new RegisteredListener());
|
||||
PacketEvents.start(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
/**
|
||||
* Stops server tick event task if enabled and unregister all listeners
|
||||
*/
|
||||
PacketEvents.stop();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,176 +0,0 @@
|
||||
package io.github.retrooper.packetevents.example;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.enums.*;
|
||||
import io.github.retrooper.packetevents.event.PacketEvent;
|
||||
import io.github.retrooper.packetevents.event.PacketHandler;
|
||||
import io.github.retrooper.packetevents.event.PacketListener;
|
||||
import io.github.retrooper.packetevents.event.impl.*;
|
||||
import io.github.retrooper.packetevents.packet.Packet;
|
||||
import io.github.retrooper.packetevents.packetwrappers.in.abilities.WrappedPacketInAbilities;
|
||||
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.entityaction.WrappedPacketInEntityAction;
|
||||
import io.github.retrooper.packetevents.packetwrappers.in.flying.WrappedPacketInFlying;
|
||||
import io.github.retrooper.packetevents.packetwrappers.in.keepalive.WrappedPacketInKeepAlive;
|
||||
import io.github.retrooper.packetevents.packetwrappers.in.useentity.WrappedPacketInUseEntity;
|
||||
import io.github.retrooper.packetevents.packetwrappers.login.WrappedPacketLoginHandshake;
|
||||
import io.github.retrooper.packetevents.packetwrappers.out.chat.WrappedPacketOutChat;
|
||||
import io.github.retrooper.packetevents.packetwrappers.out.entityvelocity.WrappedPacketOutEntityVelocity;
|
||||
import io.github.retrooper.packetevents.utils.vector.Vector3i;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
/**
|
||||
* Implementing PacketListener to listen to packets and packetevents' custom events,
|
||||
*/
|
||||
public class RegisteredListener implements PacketListener {
|
||||
/**
|
||||
* Listen to PacketReceiveEvent
|
||||
*
|
||||
* @param e PacketReceiveEvent
|
||||
*/
|
||||
@PacketHandler
|
||||
public void onPacketReceive(PacketReceiveEvent e) {
|
||||
final Player p = e.getPlayer();
|
||||
final long timestamp = e.getTimestamp();
|
||||
|
||||
//The block place name field is not set at compilation time, so we cannot use it in the switch statement
|
||||
//On 1.7->1.8.8 servers it is "PacketPlayInBlockPlace" and on 1.9 servers it is "PacketPlayInUseItem"
|
||||
if(e.getPacketName().equals(Packet.Client.BLOCK_PLACE)) {
|
||||
final WrappedPacketInBlockPlace blockPlace = new WrappedPacketInBlockPlace(e.getPlayer(), e.getPacket());
|
||||
final Vector3i blockPosition = blockPlace.getBlockPosition();
|
||||
final ItemStack stack = blockPlace.getItemStack();
|
||||
e.getPlayer().sendMessage("pos: " + blockPosition.toString() + ", type: " + stack.getType());
|
||||
}
|
||||
switch (e.getPacketName()) {
|
||||
case Packet.Client.USE_ENTITY:
|
||||
final WrappedPacketInUseEntity useEntity = new WrappedPacketInUseEntity(e.getPacket());
|
||||
final Entity entity = useEntity.getEntity();
|
||||
final double distanceSquared = entity.getLocation().distanceSquared(p.getLocation());
|
||||
final EntityUseAction useAction = useEntity.getAction();
|
||||
break;
|
||||
case Packet.Client.ABILITIES:
|
||||
final WrappedPacketInAbilities abilities = new WrappedPacketInAbilities(e.getPacket());
|
||||
final boolean isVulnerable = abilities.isVulnerable();
|
||||
final boolean isFlying = abilities.isFlying();
|
||||
final boolean canFly = abilities.canFly();
|
||||
final boolean canInstantlyBuild = abilities.canInstantlyBuild();
|
||||
final float flySpeed = abilities.getFlySpeed();
|
||||
final float walkSpeed = abilities.getWalkSpeed();
|
||||
e.getPlayer().sendMessage("walkspeed: " + walkSpeed + ", flyspeed: " + flySpeed + ", canFly: " + canFly);
|
||||
break;
|
||||
case Packet.Client.BLOCK_DIG:
|
||||
//Custom PlayerDigType enum
|
||||
final WrappedPacketInBlockDig blockDig = new WrappedPacketInBlockDig(e.getPacket());
|
||||
final PlayerDigType type = blockDig.getDigType();
|
||||
final Direction direction = blockDig.getDirection();
|
||||
break;
|
||||
case Packet.Client.FLYING:
|
||||
final WrappedPacketInFlying flying = new WrappedPacketInFlying(e.getPacket());
|
||||
final float pitch = flying.getPitch();
|
||||
final float yaw = flying.getYaw();
|
||||
break;
|
||||
case Packet.Client.POSITION:
|
||||
final WrappedPacketInFlying.WrappedPacketInPosition position =
|
||||
new WrappedPacketInFlying.WrappedPacketInPosition(e.getPacket());
|
||||
final boolean isPos = position.isPosition(); //true
|
||||
p.sendMessage("gaaang pos");
|
||||
break;
|
||||
case Packet.Client.POSITION_LOOK:
|
||||
final WrappedPacketInFlying.WrappedPacketInPosition_Look position_look =
|
||||
new WrappedPacketInFlying.WrappedPacketInPosition_Look(e.getPacket());
|
||||
final boolean isLook = position_look.isLook(); //true
|
||||
break;
|
||||
case Packet.Client.CHAT:
|
||||
final WrappedPacketInChat chat = new WrappedPacketInChat(e.getPacket());
|
||||
final String message = chat.getMessage();
|
||||
break;
|
||||
case Packet.Client.KEEP_ALIVE:
|
||||
final WrappedPacketInKeepAlive keepAlive = new WrappedPacketInKeepAlive(e.getPacket());
|
||||
final long responseID = keepAlive.getId();
|
||||
break;
|
||||
case Packet.Client.ENTITY_ACTION:
|
||||
final WrappedPacketInEntityAction entityAction = new WrappedPacketInEntityAction(e.getPacket());
|
||||
final PlayerAction action = entityAction.getAction();
|
||||
final int jumpBoost = entityAction.getJumpBoost();
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* I recommend you use the player inject event
|
||||
* to register your players instead of any other bukkit event,
|
||||
* to avoid any issues.
|
||||
*
|
||||
* DO NOT CHECK YOUR CLIENT VERSIONS HERE,
|
||||
* USE PLAYER JOIN EVENT TO CHECK A CLIENT'S VERSION!
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@PacketHandler
|
||||
public void onInject(PlayerInjectEvent event) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* I recommend you use the player uninject event,
|
||||
* to unregister your players
|
||||
* <p>
|
||||
* You can also call this event to "whitelist" a player,
|
||||
* our API won't even notice the player exists, so you won't
|
||||
* be able to listen to any packets from the player
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
@PacketHandler
|
||||
public void onUninject(PlayerUninjectEvent event) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Another way to listen to packets
|
||||
*
|
||||
* @param e PacketEvent
|
||||
*/
|
||||
@PacketHandler
|
||||
public void onPacket(PacketEvent e) {
|
||||
if (e instanceof PacketSendEvent) {
|
||||
final PacketSendEvent p = (PacketSendEvent) e;
|
||||
final Player targetPlayer = p.getPlayer();
|
||||
final Object rawNMSPacket = p.getPacket();
|
||||
final long timestamp = p.getTimestamp();
|
||||
if (p.getPacketName().equals(Packet.Server.ENTITY_VELOCITY)) {
|
||||
final WrappedPacketOutEntityVelocity vel = new WrappedPacketOutEntityVelocity(p.getPacket());
|
||||
final double velocityX = vel.getVelocityX();
|
||||
final double velocityY = vel.getVelocityY();
|
||||
final double velocityZ = vel.getVelocityZ();
|
||||
} else if (p.getPacketName().equals(Packet.Server.CHAT)) {
|
||||
final WrappedPacketOutChat chat = new WrappedPacketOutChat(p.getPacket());
|
||||
}
|
||||
} else if (e instanceof CustomMoveEvent) {
|
||||
final CustomMoveEvent event = (CustomMoveEvent) e;
|
||||
final Player player = event.getPlayer();
|
||||
final Location to = event.getTo();
|
||||
final Location from = event.getFrom();
|
||||
} else if (e instanceof ServerTickEvent) {
|
||||
final ServerTickEvent event = (ServerTickEvent) e;
|
||||
final int currentTick = event.getCurrentTick();
|
||||
final double tps = PacketEvents.getCurrentServerTPS();
|
||||
}
|
||||
else if(e instanceof PacketLoginEvent) {
|
||||
final PacketLoginEvent event = (PacketLoginEvent)e;
|
||||
if(event.getPacketName().equals(Packet.Login.HANDSHAKE)) {
|
||||
final WrappedPacketLoginHandshake handshake = new WrappedPacketLoginHandshake(event.getPacket());
|
||||
final int protocolVersion = handshake.getProtocolVersion();
|
||||
final String hostname = handshake.getHostname();
|
||||
final int port = handshake.getPort();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,22 +9,60 @@ import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public class TinyProtocolHandler {
|
||||
public final class TinyProtocolHandler {
|
||||
private static final ServerVersion version = PacketEvents.getServerVersion();
|
||||
private final Plugin plugin;
|
||||
|
||||
public TinyProtocolHandler(final Plugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
public void initTinyProtocol() {
|
||||
if(version.isLowerThan(ServerVersion.v_1_8)) {
|
||||
new TinyProtocolHandler_1_7(getPlugin()).initTinyProtocol();
|
||||
}
|
||||
else {
|
||||
new TinyProtocolHandler_1_8(getPlugin()).initTinyProtocol();
|
||||
private static Object tinyProtocol;
|
||||
|
||||
public static void initTinyProtocol(final Plugin plugin) {
|
||||
if (version.isLowerThan(ServerVersion.v_1_8)) {
|
||||
TinyProtocolHandler_1_7 tiny = new TinyProtocolHandler_1_7(plugin);
|
||||
tiny.initTinyProtocol();
|
||||
tinyProtocol = tiny;
|
||||
} else {
|
||||
TinyProtocolHandler_1_8 tiny = new TinyProtocolHandler_1_8(plugin);
|
||||
tiny.initTinyProtocol();
|
||||
tinyProtocol = tiny;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean hasInjected(final Player player) {
|
||||
if (version.isLowerThan(ServerVersion.v_1_8)) {
|
||||
TinyProtocolHandler_1_7 tiny = (TinyProtocolHandler_1_7) tinyProtocol;
|
||||
assert tiny.tinyProtocol != null;
|
||||
return tiny.tinyProtocol.hasInjected(player);
|
||||
} else {
|
||||
TinyProtocolHandler_1_8 tiny = (TinyProtocolHandler_1_8) tinyProtocol;
|
||||
assert tiny.tinyProtocol != null;
|
||||
return tiny.tinyProtocol.hasInjected(player);
|
||||
}
|
||||
}
|
||||
|
||||
public static void inject(final Player player) {
|
||||
if (version.isLowerThan(ServerVersion.v_1_8)) {
|
||||
TinyProtocolHandler_1_7 tiny = (TinyProtocolHandler_1_7) tinyProtocol;
|
||||
assert tiny.tinyProtocol != null;
|
||||
tiny.tinyProtocol.injectPlayer(player);
|
||||
} else {
|
||||
TinyProtocolHandler_1_8 tiny = (TinyProtocolHandler_1_8) tinyProtocol;
|
||||
assert tiny.tinyProtocol != null;
|
||||
tiny.tinyProtocol.injectPlayer(player);
|
||||
}
|
||||
}
|
||||
|
||||
public static void uninject(final Player player) {
|
||||
if (version.isLowerThan(ServerVersion.v_1_8)) {
|
||||
TinyProtocolHandler_1_7 tiny = (TinyProtocolHandler_1_7) tinyProtocol;
|
||||
assert tiny.tinyProtocol != null;
|
||||
tiny.tinyProtocol.uninjectPlayer(player);
|
||||
} else {
|
||||
TinyProtocolHandler_1_8 tiny = (TinyProtocolHandler_1_8) tinyProtocol;
|
||||
assert tiny.tinyProtocol != null;
|
||||
tiny.tinyProtocol.uninjectPlayer(player);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static Object getPlayerChannel(final Player player) {
|
||||
final Object entityPlayer = NMSUtils.getEntityPlayer(player);
|
||||
final Object playerConnection = playerConnectionAccessor.get(entityPlayer);
|
||||
@@ -32,9 +70,6 @@ public class TinyProtocolHandler {
|
||||
return nettyChannelAccessor.get(networkManager);
|
||||
}
|
||||
|
||||
public final Plugin getPlugin() {
|
||||
return plugin;
|
||||
}
|
||||
|
||||
private static Class<?> networkManagerClass;
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package io.github.retrooper.packetevents.handler;
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.annotations.Nullable;
|
||||
import io.github.retrooper.packetevents.event.impl.PacketLoginEvent;
|
||||
import io.github.retrooper.packetevents.event.impl.PacketReceiveEvent;
|
||||
import io.github.retrooper.packetevents.event.impl.PacketSendEvent;
|
||||
@@ -10,15 +11,18 @@ import net.minecraft.util.io.netty.channel.Channel;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public class TinyProtocolHandler_1_7 {
|
||||
public final class TinyProtocolHandler_1_7 {
|
||||
private final Plugin plugin;
|
||||
|
||||
public TinyProtocolHandler_1_7(final Plugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public TinyProtocol7 tinyProtocol;
|
||||
|
||||
public void initTinyProtocol() {
|
||||
new TinyProtocol7(getPlugin()) {
|
||||
tinyProtocol = new TinyProtocol7(getPlugin()) {
|
||||
@Override
|
||||
public Object onPacketOutAsync(Player receiver, Channel channel, Object packet) {
|
||||
final String packetName = packet.getClass().getSimpleName();
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package io.github.retrooper.packetevents.handler;
|
||||
|
||||
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.event.impl.PacketLoginEvent;
|
||||
import io.github.retrooper.packetevents.event.impl.PacketReceiveEvent;
|
||||
@@ -11,7 +12,7 @@ import io.netty.channel.Channel;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
|
||||
public class TinyProtocolHandler_1_8 {
|
||||
public final class TinyProtocolHandler_1_8 {
|
||||
private static final ServerVersion version = PacketEvents.getServerVersion();
|
||||
private final Plugin plugin;
|
||||
|
||||
@@ -20,15 +21,13 @@ public class TinyProtocolHandler_1_8 {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Login wrappers TODO
|
||||
* PacketLoginInStart
|
||||
* PacketLoginInEncryptionBegin
|
||||
*/
|
||||
|
||||
@Nullable
|
||||
public TinyProtocol8 tinyProtocol;
|
||||
|
||||
|
||||
public void initTinyProtocol() {
|
||||
new TinyProtocol8(getPlugin()) {
|
||||
tinyProtocol = new TinyProtocol8(getPlugin()) {
|
||||
@Override
|
||||
public Object onPacketOutAsync(Player receiver, Channel channel, Object packet) {
|
||||
final String packetName = packet.getClass().getSimpleName();
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
package io.github.retrooper.packetevents.mojang;
|
||||
|
||||
import com.mojang.authlib.properties.PropertyMap;
|
||||
import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.StringUtils;
|
||||
import org.bukkit.craftbukkit.libs.org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public class GameProfile {
|
||||
private final UUID id;
|
||||
private final String name;
|
||||
private final PropertyMap properties = new PropertyMap();
|
||||
private boolean legacy;
|
||||
|
||||
public GameProfile(UUID id, String name) {
|
||||
if (id == null && StringUtils.isBlank(name)) {
|
||||
throw new IllegalArgumentException("Name and ID cannot both be blank");
|
||||
} else {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
|
||||
public UUID getId() {
|
||||
return this.id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return this.name;
|
||||
}
|
||||
|
||||
public PropertyMap getProperties() {
|
||||
return this.properties;
|
||||
}
|
||||
|
||||
public boolean isComplete() {
|
||||
return this.id != null && StringUtils.isNotBlank(this.getName());
|
||||
}
|
||||
|
||||
public boolean equalsMojangGameProfile(com.mojang.authlib.GameProfile profile) {
|
||||
if (profile != null) {
|
||||
if (profile.getId() != null && getId() != null && profile.getId() == getId()
|
||||
&& profile.getName() != null && getName() != null && profile.getName().equals(getName())) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
} else if (o != null && this.getClass() == o.getClass()) {
|
||||
GameProfile that = (GameProfile) o;
|
||||
if (this.id != null) {
|
||||
if (!this.id.equals(that.id)) {
|
||||
return false;
|
||||
}
|
||||
} else if (that.id != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.name != null) {
|
||||
if (this.name.equals(that.name)) {
|
||||
return true;
|
||||
}
|
||||
} else if (that.name == null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
int result = this.id != null ? this.id.hashCode() : 0;
|
||||
result = 31 * result + (this.name != null ? this.name.hashCode() : 0);
|
||||
return result;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return (new ToStringBuilder(this)).append("id", this.id).append("name", this.name).append("properties", this.properties).append("legacy", this.legacy).toString();
|
||||
}
|
||||
|
||||
public boolean isLegacy() {
|
||||
return this.legacy;
|
||||
}
|
||||
}
|
||||
@@ -1,16 +1,17 @@
|
||||
package io.github.retrooper.packetevents.packet;
|
||||
|
||||
|
||||
import io.github.retrooper.packetevents.PacketEvents;
|
||||
import io.github.retrooper.packetevents.enums.ServerVersion;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
public abstract class Packet {
|
||||
|
||||
public static class Client {
|
||||
private static final String c = "PacketPlayIn";
|
||||
|
||||
@Deprecated
|
||||
public static final String FLYING = c + "Flying";
|
||||
|
||||
|
||||
public static final String POSITION = c + "Position";
|
||||
|
||||
public static final String POSITION_LOOK = c + "PositionLook";
|
||||
@@ -29,7 +30,8 @@ public abstract class Packet {
|
||||
/**
|
||||
* 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 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";
|
||||
@@ -38,6 +40,7 @@ public abstract class Packet {
|
||||
public static final String SET_CREATIVE_SLOT = c + "SetCreativeSlot";
|
||||
|
||||
public static final String KEEP_ALIVE = c + "KeepAlive";
|
||||
|
||||
}
|
||||
|
||||
public static class Server {
|
||||
@@ -74,10 +77,38 @@ public abstract class Packet {
|
||||
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";
|
||||
|
||||
public static final String[] LOGIN_PACKETS = new String[] {"PacketHandshakingInSetProtocol","PacketLoginInStart", "PacketLoginInEncryptionBegin"};
|
||||
public static final String[] LOGIN_PACKETS = new String[]{"PacketHandshakingInSetProtocol", "PacketLoginInStart", "PacketLoginInEncryptionBegin"};
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this NMS packet an instanceof the "PacketPlayInFlying" packet in the 1.8 protocol?
|
||||
* 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!
|
||||
*/
|
||||
public static boolean isInstanceOfFlyingPacket(Object nmsPacket) {
|
||||
//1.7->1.8.8
|
||||
if (packetPlayInFlying != null) {
|
||||
return packetPlayInFlying.isInstance(nmsPacket);
|
||||
} else {
|
||||
//1.9->1.15.2
|
||||
return packetPlayInPosition.isInstance(nmsPacket)
|
||||
|| packetPlayInPositionLook.isInstance(nmsPacket)
|
||||
|| packetPlayInLook.isInstance(nmsPacket);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Use isInstanceOfFlyingPacket(nmsPacketObject) instead of this, as the flying packet is the only packet that has subclasses (in 1.8 atleast).
|
||||
* Will be removed in newer versions of PacketEvents!
|
||||
* @param fatherPacket
|
||||
* @param childPacket
|
||||
* @return isInstanceOf
|
||||
*/
|
||||
@Deprecated
|
||||
public static boolean isInstanceOf(String fatherPacket, String childPacket) {
|
||||
if (fatherPacket.equals(Client.FLYING) && childPacket.equals(Client.POSITION) || childPacket.equals(Client.POSITION_LOOK) || childPacket.equals(Client.LOOK)) {
|
||||
return true;
|
||||
@@ -85,5 +116,21 @@ public abstract class Packet {
|
||||
return fatherPacket.equals(childPacket);
|
||||
}
|
||||
|
||||
private static Class<?> packetPlayInFlying, packetPlayInPosition, packetPlayInPositionLook, packetPlayInLook;
|
||||
|
||||
static {
|
||||
try {
|
||||
packetPlayInFlying = NMSUtils.getNMSClass(Client.FLYING);
|
||||
} catch (ClassNotFoundException e) {
|
||||
//That is fine, they are on 1.9+ so we just initiate the rest of the variables
|
||||
try {
|
||||
packetPlayInPosition = NMSUtils.getNMSClass(Client.POSITION);
|
||||
packetPlayInPositionLook = NMSUtils.getNMSClass(Client.POSITION_LOOK);
|
||||
packetPlayInLook = NMSUtils.getNMSClass(Client.LOOK);
|
||||
} catch (ClassNotFoundException e2) {
|
||||
e2.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+1
-1
@@ -5,7 +5,7 @@ import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class WrappedPacketInAbilities extends WrappedPacket {
|
||||
public final class WrappedPacketInAbilities extends WrappedPacket {
|
||||
private boolean isVulnerable;
|
||||
private boolean isFlying;
|
||||
private boolean allowFly;
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ import io.github.retrooper.packetevents.utils.vector.Vector3i;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class WrappedPacketInBlockDig extends WrappedPacket {
|
||||
public final class WrappedPacketInBlockDig extends WrappedPacket {
|
||||
private Vector3i blockPosition;
|
||||
private Direction direction;
|
||||
private PlayerDigType digType;
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
|
||||
public class WrappedPacketInBlockPlace extends WrappedPacket {
|
||||
public final class WrappedPacketInBlockPlace extends WrappedPacket {
|
||||
private Vector3i blockPosition;
|
||||
private ItemStack itemStack;
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import net.minecraft.server.v1_7_R4.PacketPlayInBlockPlace;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
class WrappedPacketInBlockPlace_1_7_10 extends WrappedPacket {
|
||||
final class WrappedPacketInBlockPlace_1_7_10 extends WrappedPacket {
|
||||
private Vector3i blockPosition;
|
||||
private ItemStack itemStack;
|
||||
private int blockFace;
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.vector.Vector3i;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
class WrappedPacketInBlockPlace_1_8 extends WrappedPacket {
|
||||
final class WrappedPacketInBlockPlace_1_8 extends WrappedPacket {
|
||||
private Vector3i blockPosition;
|
||||
private ItemStack itemStack;
|
||||
WrappedPacketInBlockPlace_1_8(final Object packet) {
|
||||
|
||||
+5
-2
@@ -3,10 +3,13 @@ package io.github.retrooper.packetevents.packetwrappers.in.blockplace;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
class WrappedPacketInBlockPlace_1_9 extends WrappedPacket {
|
||||
import java.util.HashSet;
|
||||
|
||||
final class WrappedPacketInBlockPlace_1_9 extends WrappedPacket {
|
||||
private Block block;
|
||||
|
||||
public WrappedPacketInBlockPlace_1_9(final Player player, final Object packet) {
|
||||
@@ -15,7 +18,7 @@ class WrappedPacketInBlockPlace_1_9 extends WrappedPacket {
|
||||
|
||||
@Override
|
||||
protected void setup() {
|
||||
this.block = player.getTargetBlock(null, 3);
|
||||
this.block = getPlayer().getTargetBlock((HashSet<Material>)null, 3);
|
||||
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class WrappedPacketInChat extends WrappedPacket {
|
||||
public final class WrappedPacketInChat extends WrappedPacket {
|
||||
private String message;
|
||||
|
||||
public WrappedPacketInChat(Object packet) {
|
||||
|
||||
+2
-2
@@ -1,15 +1,15 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.in.entityaction;
|
||||
|
||||
import io.github.retrooper.packetevents.annotations.Nullable;
|
||||
import io.github.retrooper.packetevents.enums.PlayerAction;
|
||||
import io.github.retrooper.packetevents.enums.ServerVersion;
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
import org.bukkit.entity.Entity;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class WrappedPacketInEntityAction extends WrappedPacket {
|
||||
public final class WrappedPacketInEntityAction extends WrappedPacket {
|
||||
private Entity entity;
|
||||
private int entityId;
|
||||
private PlayerAction action;
|
||||
|
||||
+6
-7
@@ -8,7 +8,6 @@ import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class WrappedPacketInFlying extends WrappedPacket {
|
||||
|
||||
private double x;
|
||||
private double y;
|
||||
private double z;
|
||||
@@ -73,27 +72,27 @@ public class WrappedPacketInFlying extends WrappedPacket {
|
||||
}
|
||||
}
|
||||
|
||||
public double getX() {
|
||||
public final double getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public double getY() {
|
||||
public final double getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
public double getZ() {
|
||||
public final double getZ() {
|
||||
return z;
|
||||
}
|
||||
|
||||
public float getYaw() {
|
||||
public final float getYaw() {
|
||||
return yaw;
|
||||
}
|
||||
|
||||
public float getPitch() {
|
||||
public final float getPitch() {
|
||||
return pitch;
|
||||
}
|
||||
|
||||
public boolean isOnGround() {
|
||||
public final boolean isOnGround() {
|
||||
return onGround;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class WrappedPacketInKeepAlive extends WrappedPacket {
|
||||
public final class WrappedPacketInKeepAlive extends WrappedPacket {
|
||||
public WrappedPacketInKeepAlive(final Object packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
+1
-1
@@ -7,7 +7,7 @@ import org.bukkit.entity.Entity;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
public class WrappedPacketInUseEntity extends WrappedPacket {
|
||||
public final class WrappedPacketInUseEntity extends WrappedPacket {
|
||||
private int entityId;
|
||||
private Entity entity;
|
||||
private EntityUseAction action;
|
||||
|
||||
+1
-1
@@ -6,7 +6,7 @@ import io.github.retrooper.packetevents.tinyprotocol.Reflection.FieldAccessor;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
|
||||
public class WrappedPacketLoginHandshake extends WrappedPacket {
|
||||
public final class WrappedPacketLoginHandshake extends WrappedPacket {
|
||||
private int protocolVersion, port;
|
||||
private String hostname;
|
||||
|
||||
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.login;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.tinyprotocol.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
public final class WrappedPacketLoginInEncryptionBegin extends WrappedPacket {
|
||||
private byte[] publicKey, verifyToken;
|
||||
public WrappedPacketLoginInEncryptionBegin(final Object packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setup() {
|
||||
this.publicKey = fields[0].get(packet);
|
||||
this.verifyToken = fields[1].get(packet);
|
||||
}
|
||||
|
||||
public byte[] getPublicKey() {
|
||||
return publicKey;
|
||||
}
|
||||
|
||||
public byte[] getVerifyToken() {
|
||||
return verifyToken;
|
||||
}
|
||||
|
||||
private static Class<?> packetClass;
|
||||
|
||||
private static final Reflection.FieldAccessor<byte[]>[] fields = new Reflection.FieldAccessor[2];
|
||||
|
||||
static {
|
||||
try {
|
||||
packetClass = NMSUtils.getNMSClass("PacketLoginInEncryptionBegin");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
fields[0] = Reflection.getField(packetClass, byte[].class, 0);
|
||||
fields[1] = Reflection.getField(packetClass, byte[].class, 1);
|
||||
}
|
||||
}
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.login;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.tinyprotocol.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
import java.security.PublicKey;
|
||||
|
||||
|
||||
public final class WrappedPacketLoginOutEncryptionBegin extends WrappedPacket {
|
||||
private String encodedString;
|
||||
private PublicKey encodedKey;
|
||||
private byte[] byteArray;
|
||||
|
||||
public WrappedPacketLoginOutEncryptionBegin(final Object packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setup() {
|
||||
//string - a (encodedstring)
|
||||
//public key - b (encoded)
|
||||
//byte array - c(byte array)
|
||||
this.encodedString = fields[0].get(packet).toString();
|
||||
this.encodedKey = (PublicKey) fields[1].get(packet);
|
||||
this.byteArray = (byte[]) fields[2].get(packet);
|
||||
}
|
||||
|
||||
public String getEncodedString() {
|
||||
return encodedString;
|
||||
}
|
||||
|
||||
public PublicKey getEncodedKey() {
|
||||
return encodedKey;
|
||||
}
|
||||
|
||||
public byte[] getByteArray() {
|
||||
return byteArray;
|
||||
}
|
||||
|
||||
private static Class<?> packetClass;
|
||||
|
||||
private static final Reflection.FieldAccessor<?>[] fields = new Reflection.FieldAccessor[3];
|
||||
|
||||
static {
|
||||
try {
|
||||
packetClass = NMSUtils.getNMSClass("PacketLoginOutEncryptionBegin");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
fields[0] = Reflection.getField(packetClass, String.class, 0);
|
||||
fields[1] = Reflection.getField(packetClass, PublicKey.class, 1);
|
||||
fields[2] = Reflection.getField(packetClass, byte[].class, 2);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.login;
|
||||
|
||||
import io.github.retrooper.packetevents.mojang.GameProfile;
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.tinyprotocol.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
public final class WrappedPacketLoginStart extends WrappedPacket {
|
||||
private GameProfile gameProfile;
|
||||
public WrappedPacketLoginStart(final Object packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setup() {
|
||||
com.mojang.authlib.GameProfile gp = gameProfileAccessor.get(packet);
|
||||
this.gameProfile = new GameProfile(gp.getId(), gp.getName());
|
||||
}
|
||||
|
||||
public GameProfile getGameProfile() {
|
||||
return gameProfile;
|
||||
}
|
||||
|
||||
private static Class<?> packetClass;
|
||||
|
||||
private static final Reflection.FieldAccessor<com.mojang.authlib.GameProfile> gameProfileAccessor;
|
||||
|
||||
static {
|
||||
try {
|
||||
packetClass = NMSUtils.getNMSClass("PacketLoginInStart");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
gameProfileAccessor = Reflection.getField(packetClass, com.mojang.authlib.GameProfile.class, 0);
|
||||
}
|
||||
}
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.login;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.tinyprotocol.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
public final class WrappedPacketLoginStatusPing extends WrappedPacket {
|
||||
private long number;
|
||||
public WrappedPacketLoginStatusPing(final Object packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setup() {
|
||||
this.number = numberAccessor.get(packet);
|
||||
}
|
||||
|
||||
public long getNumber() {
|
||||
return number;
|
||||
}
|
||||
|
||||
private static Class<?> packetClass;
|
||||
|
||||
private static final Reflection.FieldAccessor<Long> numberAccessor;
|
||||
|
||||
static {
|
||||
try {
|
||||
packetClass = NMSUtils.getNMSClass("PacketStatusInPing");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
numberAccessor = Reflection.getField(packetClass, long.class, 0);
|
||||
}
|
||||
|
||||
}
|
||||
+4
-4
@@ -10,7 +10,7 @@ import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public class WrappedPacketOutAnimation extends WrappedPacket implements Sendable {
|
||||
public final class WrappedPacketOutAnimation extends WrappedPacket implements Sendable {
|
||||
private Entity entity;
|
||||
private int entityID;
|
||||
private EntityAnimationType type;
|
||||
@@ -40,15 +40,15 @@ public class WrappedPacketOutAnimation extends WrappedPacket implements Sendable
|
||||
|
||||
}
|
||||
|
||||
public final Entity getEntity() {
|
||||
public Entity getEntity() {
|
||||
return this.entity;
|
||||
}
|
||||
|
||||
public final int getEntityId() {
|
||||
public int getEntityId() {
|
||||
return this.entityID;
|
||||
}
|
||||
|
||||
public final EntityAnimationType getAnimationType() {
|
||||
public EntityAnimationType getAnimationType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
|
||||
+20
-9
@@ -10,7 +10,7 @@ import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class WrappedPacketOutChat extends WrappedPacket implements Sendable {
|
||||
public final class WrappedPacketOutChat extends WrappedPacket implements Sendable {
|
||||
private String message;
|
||||
|
||||
public WrappedPacketOutChat(final Object packet) {
|
||||
@@ -39,15 +39,8 @@ public class WrappedPacketOutChat extends WrappedPacket implements Sendable {
|
||||
|
||||
@Override
|
||||
public Object asNMSPacket() {
|
||||
Object iChatBaseComponentObj = null;
|
||||
try {
|
||||
iChatBaseComponentObj = serialize.invoke(null, this.message);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
try {
|
||||
return chatClassConstructor.newInstance(iChatBaseComponentObj);
|
||||
return chatClassConstructor.newInstance(toIChatBaseComponent(this.message));
|
||||
} catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
@@ -55,6 +48,24 @@ public class WrappedPacketOutChat extends WrappedPacket implements Sendable {
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String toStringFromIChatBaseComponent(Object obj) {
|
||||
try {
|
||||
return getStringOfIChatBase.invoke(obj).toString();
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static Object toIChatBaseComponent(String msg) {
|
||||
try {
|
||||
return serialize.invoke(null, msg);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
return this.message;
|
||||
}
|
||||
|
||||
+6
-6
@@ -10,7 +10,7 @@ import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public class WrappedPacketOutEntityVelocity extends WrappedPacket implements Sendable {
|
||||
public final class WrappedPacketOutEntityVelocity extends WrappedPacket implements Sendable {
|
||||
private Entity entity;
|
||||
private int entityId;
|
||||
private double velocityX, velocityY, velocityZ;
|
||||
@@ -49,23 +49,23 @@ public class WrappedPacketOutEntityVelocity extends WrappedPacket implements Sen
|
||||
}
|
||||
}
|
||||
|
||||
public final int getEntityId() {
|
||||
public int getEntityId() {
|
||||
return entityId;
|
||||
}
|
||||
|
||||
public final Entity getEntity() {
|
||||
public Entity getEntity() {
|
||||
return entity;
|
||||
}
|
||||
|
||||
public final double getVelocityX() {
|
||||
public double getVelocityX() {
|
||||
return velocityX;
|
||||
}
|
||||
|
||||
public final double getVelocityY() {
|
||||
public double getVelocityY() {
|
||||
return velocityY;
|
||||
}
|
||||
|
||||
public final double getVelocityZ() {
|
||||
public double getVelocityZ() {
|
||||
return velocityZ;
|
||||
}
|
||||
|
||||
|
||||
+64
@@ -0,0 +1,64 @@
|
||||
package io.github.retrooper.packetevents.packetwrappers.out.kickdisconnect;
|
||||
|
||||
import io.github.retrooper.packetevents.packetwrappers.Sendable;
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.out.chat.WrappedPacketOutChat;
|
||||
import io.github.retrooper.packetevents.tinyprotocol.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.NMSUtils;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
public final class WrappedPacketOutKickDisconnect extends WrappedPacket implements Sendable {
|
||||
private String kickMessage;
|
||||
|
||||
public WrappedPacketOutKickDisconnect(final Object packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public WrappedPacketOutKickDisconnect(final String kickMessage) {
|
||||
super(null);
|
||||
this.kickMessage = kickMessage;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void setup() {
|
||||
this.kickMessage = WrappedPacketOutChat.toStringFromIChatBaseComponent(iChatBaseComponentAccessor.get(packet));
|
||||
}
|
||||
|
||||
public String getKickMessage() {
|
||||
return kickMessage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object asNMSPacket() {
|
||||
try {
|
||||
return kickDisconnectConstructor.newInstance(WrappedPacketOutChat.toIChatBaseComponent("{\"text\": \"" + kickMessage + "\"}"));
|
||||
} catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static Class<?> packetClass, iChatBaseComponentClass;
|
||||
|
||||
private static Constructor<?> kickDisconnectConstructor;
|
||||
|
||||
private static final Reflection.FieldAccessor<?> iChatBaseComponentAccessor;
|
||||
|
||||
static {
|
||||
try {
|
||||
packetClass = NMSUtils.getNMSClass("PacketPlayOutKickDisconnect");
|
||||
iChatBaseComponentClass = NMSUtils.getNMSClass("IChatBaseComponent");
|
||||
} catch (ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
try {
|
||||
kickDisconnectConstructor = packetClass.getConstructor(iChatBaseComponentClass);
|
||||
} catch (NoSuchMethodException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
iChatBaseComponentAccessor = Reflection.getField(packetClass, iChatBaseComponentClass, 0);
|
||||
}
|
||||
}
|
||||
@@ -294,7 +294,7 @@ public abstract class TinyProtocol7 {
|
||||
* @return The packet to recieve instead, or NULL to cancel.
|
||||
*/
|
||||
public Object onPacketInAsync(Player sender, Channel channel, Object packet) {
|
||||
return packet;
|
||||
return packet;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -346,6 +346,10 @@ public abstract class TinyProtocol7 {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Changed from "tiny-" to "packetevents"
|
||||
* @return handlerName
|
||||
*/
|
||||
protected String getHandlerName() {
|
||||
return "packetevents-" + plugin.getName() + "-" + ID.incrementAndGet();
|
||||
}
|
||||
@@ -358,9 +362,11 @@ public abstract class TinyProtocol7 {
|
||||
* @param player - the player to inject.
|
||||
*/
|
||||
public void injectPlayer(Player player) {
|
||||
injectChannelInternal(getChannel(player)).player = player;
|
||||
PacketEvents.getEventManager().callEvent(new PlayerInjectEvent(player));
|
||||
|
||||
final PlayerInjectEvent playerInjectEvent = new PlayerInjectEvent(player);
|
||||
PacketEvents.getEventManager().callEvent(playerInjectEvent);
|
||||
if (!playerInjectEvent.isCancelled()) {
|
||||
injectChannelInternal(getChannel(player)).player = player;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -208,13 +208,22 @@ public abstract class TinyProtocol8 {
|
||||
plugin.getServer().getPluginManager().registerEvents(listener, plugin);
|
||||
}
|
||||
|
||||
/**
|
||||
* Function modified by Retrooper
|
||||
*
|
||||
* @throws NoSuchFieldException
|
||||
* @throws IllegalAccessException
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private void registerChannelHandler() throws NoSuchFieldException, IllegalAccessException {
|
||||
Object mcServer = getMinecraftServer.get(Bukkit.getServer());
|
||||
Object serverConnection = getServerConnection.get(mcServer);
|
||||
boolean looking = true;
|
||||
|
||||
// We need to synchronize against this list
|
||||
/*
|
||||
* I am doing this so we can support 1.8->1.15.2, the previous method TinyProtocol used wasn't supported on some versions
|
||||
* like 1.15.2
|
||||
*/
|
||||
final Field networkManagersField = serverConnection.getClass().getDeclaredField(TinyProtocolHandler_1_8.getNetworkManagersFieldName());
|
||||
networkManagersField.setAccessible(true);
|
||||
networkManagers = (List<Object>) networkManagersField.get(serverConnection);
|
||||
@@ -223,7 +232,6 @@ public abstract class TinyProtocol8 {
|
||||
// Find the correct list, or implicitly throw an exception
|
||||
for (int i = 0; looking; i++) {
|
||||
List<Object> list = Reflection.getField(serverConnection.getClass(), List.class, i).get(serverConnection);
|
||||
|
||||
for (Object item : list) {
|
||||
if (!(item instanceof ChannelFuture))
|
||||
break;
|
||||
@@ -256,7 +264,6 @@ public abstract class TinyProtocol8 {
|
||||
// That's fine
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -344,6 +351,11 @@ public abstract class TinyProtocol8 {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Changed from "tiny-" to "packetevents"
|
||||
*
|
||||
* @return handlerName
|
||||
*/
|
||||
protected String getHandlerName() {
|
||||
return "packetevents-" + plugin.getName() + "-" + ID.incrementAndGet();
|
||||
}
|
||||
@@ -356,8 +368,11 @@ public abstract class TinyProtocol8 {
|
||||
* @param player - the player to inject.
|
||||
*/
|
||||
public void injectPlayer(Player player) {
|
||||
injectChannelInternal(getChannel(player)).player = player;
|
||||
PacketEvents.getEventManager().callEvent(new PlayerInjectEvent(player));
|
||||
final PlayerInjectEvent playerInjectEvent = new PlayerInjectEvent(player);
|
||||
PacketEvents.getEventManager().callEvent(playerInjectEvent);
|
||||
if (!playerInjectEvent.isCancelled()) {
|
||||
injectChannelInternal(getChannel(player)).player = player;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package io.github.retrooper.packetevents.utils;
|
||||
|
||||
import io.github.retrooper.packetevents.annotations.Nullable;
|
||||
import io.github.retrooper.packetevents.enums.ServerVersion;
|
||||
import io.github.retrooper.packetevents.packetwrappers.Sendable;
|
||||
import io.github.retrooper.packetevents.utils.nms_entityfinder.EntityFinderUtils;
|
||||
@@ -8,12 +9,11 @@ import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class NMSUtils {
|
||||
public final class NMSUtils {
|
||||
private static final ServerVersion version = ServerVersion.getVersion();
|
||||
|
||||
|
||||
|
||||
+6
-2
@@ -1,20 +1,21 @@
|
||||
package io.github.retrooper.packetevents.utils.nms_entityfinder;
|
||||
|
||||
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.utils.NMSUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Entity;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
public class EntityFinderUtils {
|
||||
public final class EntityFinderUtils {
|
||||
@Nullable
|
||||
private static ServerVersion version = PacketEvents.getServerVersion();
|
||||
|
||||
|
||||
public static Entity getEntityById(final int id) {
|
||||
for (final World world : Bukkit.getWorlds()) {
|
||||
final Entity entity = getEntityByIdWithWorld(world, id);
|
||||
@@ -27,6 +28,9 @@ public class EntityFinderUtils {
|
||||
|
||||
@Nullable
|
||||
public static Entity getEntityByIdWithWorld(final World world, final int id) {
|
||||
if(world == null) {
|
||||
return null;
|
||||
}
|
||||
Object craftWorld = craftWorldClass.cast(world);
|
||||
|
||||
Object worldServer = null;
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package io.github.retrooper.packetevents.utils.vector;
|
||||
|
||||
public final class Vector3d {
|
||||
public double x, y, z;
|
||||
|
||||
public Vector3d(final double x, final double y, final double z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "X: " + x + ", Y: " + y + ", Z: " + z;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package io.github.retrooper.packetevents.utils.vector;
|
||||
|
||||
public final class Vector3f {
|
||||
public float x, y, z;
|
||||
|
||||
public Vector3f(final float x, final float y, final float z) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
this.z = z;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "X: " + x + ", Y: " + y + ", Z: " + z;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
package io.github.retrooper.packetevents.utils.vector;
|
||||
|
||||
public class Vector3i {
|
||||
public final class Vector3i {
|
||||
public int x, y, z;
|
||||
|
||||
public Vector3i(final int x, final int y, final int z) {
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
name: packetevents
|
||||
version: 1.2.8
|
||||
main: io.github.retrooper.packetevents.example.MainExample
|
||||
author: retrooper
|
||||
Reference in new issue
Block a user