Compare commits

..
14 Commits
Author SHA1 Message Date
purplexdev 0d6d34a93b Merge remote-tracking branch 'origin/master' 2020-06-14 13:33:07 +02:00
purplexdev cb89a42184 * plugin.yml removed so Bukkit doesn't detect PacketEvents as a plugin 2020-06-14 13:32:52 +02:00
GladUrBad 6837b1d803 Update README.md
fixed typo
2020-06-13 18:52:45 -05:00
purplexdev 8967babc37 Merge remote-tracking branch 'origin/master' 2020-06-13 18:54:57 +02:00
purplexdev a4f93cfe8d Stable 1.3.0 Release!
Changelog:

* Code cleanup
* PostPlayerInjectEvent not called bug fixed
* PacketEvents.injectPlayer(player)
* PacketEvents.uninjectPlayer(player)
* PacketEvents.hasInjected(player)
* TinyProtocolHandler now accessed statically, we no longer store an instance
2020-06-13 18:54:41 +02:00
retrooper 5dde0b56f8 deprecated github account added 2020-06-13 15:50:59 +02:00
purplexdev 43dee3dfeb Merge remote-tracking branch 'origin/master' 2020-06-13 15:27:40 +02:00
purplexdev 937dbc5c03 1.3.0 Beta!
* PostPlayerInjectEvent added (use this to register your players safely as the PlayerInjectEvent's player object might have some null values)
* PlayerInjectEvent is now cancellable
* Player joining while server is still loading plugins bug should fix afaik, please test it, I am unsure if it is 100% fixed
* ServerReloadEvent.java has been removed
* PacketEvents.start() function only takes in one argument and that is your main plugin's instance.
(If you don't want the server tick task, you may cancel it like this: PacketEvents.getServerTickTask().cancel();)
* Imports optimized
* Random debug messages removed
* More documentation added to the PacketEvents class!
2020-06-13 15:27:28 +02:00
retrooper 78e17c2abb about updated 2020-06-13 15:00:43 +02:00
retrooper 4653dbcaba some info changed and setup guide added 2020-06-13 14:59:50 +02:00
retrooper 057e1b960a added tabs 2020-06-13 08:27:42 +02:00
retrooper 5feaabad92 added tabs 2020-06-13 08:27:37 +02:00
purplexdev 2c395d4313 Merge remote-tracking branch 'origin/master' 2020-06-10 17:56:51 +02:00
purplexdev 6af68cfc7a player.getTargetBlock(null, 3) -> player.getTargetBlock((HashSet<Material>) null, 3) as on some versions of java it doesn't work I believe 2020-06-10 17:56:28 +02:00
19 changed files with 324 additions and 351 deletions

No files matched your search

+9 -14
View File
@@ -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://img.shields.io/badge/License-GPLv2-blue.svg)](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/v/retrooper/packetevents.svg)](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)
+1 -1
View File
@@ -6,7 +6,7 @@
<groupId>io.github.retrooper</groupId>
<artifactId>packetevents</artifactId>
<version>1.2.9.2</version>
<version>1.3.0</version>
<packaging>jar</packaging>
<name>packetevents</name>
<properties>
@@ -6,6 +6,7 @@ import io.github.retrooper.packetevents.event.PacketHandler;
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.PostPlayerInjectEvent;
import io.github.retrooper.packetevents.event.impl.ServerTickEvent;
import io.github.retrooper.packetevents.event.manager.EventManager;
import io.github.retrooper.packetevents.handler.TinyProtocolHandler;
@@ -15,16 +16,29 @@ 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.event.player.PlayerLoginEvent;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitTask;
import javax.annotation.Nullable;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.UUID;
public class PacketEvents implements PacketListener{
public class PacketEvents implements PacketListener, Listener {
private static boolean hasRegistered = false;
/*
* Login wrappers TODO
* PacketLoginInStart
* PacketLoginInEncryptionBegin
*/
private static boolean hasRegistered;
private static final ServerVersion version = ServerVersion.getVersion();
private static PacketEvents instance;
@@ -41,25 +55,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();
Bukkit.getPluginManager().registerEvents(getInstance(), plugin);
if (serverTickEventEnabled) {
final Runnable runnable = new Runnable() {
//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 +91,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 +139,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 +188,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);
@@ -142,18 +211,78 @@ public class PacketEvents implements PacketListener{
}
/**
* 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 onLogin(final PlayerLoginEvent e) {
final Plugin[] plugins = Bukkit.getPluginManager().getPlugins();
boolean canJoin = true;
for (final Plugin pl : plugins) {
if (!pl.isEnabled()) {
canJoin = false;
break;
}
}
if (!canJoin) {
e.setResult(PlayerLoginEvent.Result.KICK_OTHER);
e.setKickMessage("Please wait for the server to finish loading all plugins");
}
}
@EventHandler
public void onJoin(PlayerJoinEvent e) {
if (hasInjected(e.getPlayer())) {
PacketEvents.getEventManager().callEvent(new PostPlayerInjectEvent(e.getPlayer()));
}
}
/**
* Version independant 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
*/
@@ -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;
}
}
@@ -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;
}
}
@@ -1,24 +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;
PacketEvents.start(this);
/**
* 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);
//If you do not need the server tick event you can just cancel its task like this
//PacketEvents.getServerTickTask().cancel();
/**
@@ -30,7 +23,7 @@ public class MainExample extends JavaPlugin {
@Override
public void onDisable() {
/**
* Stops server tick event task if enabled and unregister all listeners
* Stops server tick event task if enabled and unregisters packetlisteners
*/
PacketEvents.stop();
@@ -1,7 +1,10 @@
package io.github.retrooper.packetevents.example;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.enums.*;
import io.github.retrooper.packetevents.enums.Direction;
import io.github.retrooper.packetevents.enums.EntityUseAction;
import io.github.retrooper.packetevents.enums.PlayerAction;
import io.github.retrooper.packetevents.enums.PlayerDigType;
import io.github.retrooper.packetevents.event.PacketEvent;
import io.github.retrooper.packetevents.event.PacketHandler;
import io.github.retrooper.packetevents.event.PacketListener;
@@ -25,7 +28,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
/**
* Implementing PacketListener to listen to packets and packetevents' custom events,
* Implementing PacketListener to listen to packetevents' custom events,
*/
public class RegisteredListener implements PacketListener {
/**
@@ -39,12 +42,12 @@ public class RegisteredListener implements PacketListener {
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"
//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());
// e.getPlayer().sendMessage("pos: " + blockPosition.toString() + ", type: " + stack.getType());
}
switch (e.getPacketName()) {
case Packet.Client.USE_ENTITY:
@@ -61,7 +64,7 @@ public class RegisteredListener implements PacketListener {
final boolean canInstantlyBuild = abilities.canInstantlyBuild();
final float flySpeed = abilities.getFlySpeed();
final float walkSpeed = abilities.getWalkSpeed();
e.getPlayer().sendMessage("walkspeed: " + walkSpeed + ", flyspeed: " + flySpeed + ", canFly: " + canFly);
// e.getPlayer().sendMessage("walkspeed: " + walkSpeed + ", flyspeed: " + flySpeed + ", canFly: " + canFly);
break;
case Packet.Client.BLOCK_DIG:
//Custom PlayerDigType enum
@@ -78,7 +81,6 @@ public class RegisteredListener implements PacketListener {
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 =
@@ -103,29 +105,25 @@ public class RegisteredListener implements PacketListener {
}
/**
* 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
*
* In this event you can safely register your players, unlike the PlayerInjectEvent.
* In the PlayerInjectEvent some fields in the player object might be null.
* So use this event!
* @param event
*/
@PacketHandler
public void onPostInject(PostPlayerInjectEvent event) {
}
/**
* You can use this event to unregister your players,
* This event is called when a player is uninjected
* @param event
*/
@PacketHandler
@@ -11,20 +11,58 @@ import org.bukkit.plugin.Plugin;
public 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;
@@ -10,6 +10,8 @@ import net.minecraft.util.io.netty.channel.Channel;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import javax.annotation.Nullable;
public class TinyProtocolHandler_1_7 {
private final Plugin plugin;
@@ -17,8 +19,11 @@ public class TinyProtocolHandler_1_7 {
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();
@@ -11,6 +11,8 @@ import io.netty.channel.Channel;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import javax.annotation.Nullable;
public class TinyProtocolHandler_1_8 {
private static final ServerVersion version = PacketEvents.getServerVersion();
private final Plugin plugin;
@@ -20,15 +22,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();
@@ -1,7 +1,6 @@
package io.github.retrooper.packetevents.packet;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.enums.ServerVersion;
public abstract class Packet {
@@ -3,9 +3,12 @@ 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;
import java.util.HashSet;
class WrappedPacketInBlockPlace_1_9 extends WrappedPacket {
private Block block;
@@ -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);
}
@@ -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;
}
}
/**
-4
View File
@@ -1,4 +0,0 @@
name: packetevents
version: 1.2.8
main: io.github.retrooper.packetevents.example.MainExample
author: retrooper