Compare commits

...
148 Commits
Author SHA1 Message Date
Retrooper 636e246c70 attempt to fix error 2020-07-20 16:09:18 +08:00
Retrooper 0d5c7b5250 uninject exception error handled 2020-07-20 15:39:39 +08:00
Retrooper 1b5f066eb0 small error fix, this build will be 1.5.4.1 release 2020-07-20 14:33:18 +08:00
Retrooper ffe224c4bf 1.5.4.1 release
* PlayerUninjectEvent#isSync now documented
* Shutdown bugs fixed(unending shutdown)
* Code cleanup & Imports optimized
2020-07-20 14:20:45 +08:00
Retrooper 792fe16124 1.5.4 release, shutdown bug fix attempt 2020-07-19 19:23:31 +08:00
terrarier2111 3c92108c44 Replaced loop 2020-07-16 13:43:29 +02:00
retrooper 3b71327245 Merge pull request #17 from rbuh/patch-2
Someone forgot something -_-
2020-07-16 08:34:31 +02:00
rbuh 6d70978285 Someone forgot something -_-
ur welcome bud!
2020-07-15 21:20:10 -04:00
terrarier2111 953ad680ee Update ClientVersion.java 2020-07-15 17:42:23 +02:00
terrarier2111 765f2fad92 Prepared lookup 2020-07-15 17:23:16 +02:00
terrarier2111 bede734af7 Update ClientVersion.java 2020-07-15 17:22:10 +02:00
retrooper 31853376d6 Merge pull request #14 from terrarier2111/patch-7
Added missing return
2020-07-15 17:14:19 +02:00
terrarier2111 3a100ce325 Added missing return 2020-07-15 16:54:05 +02:00
retrooper bbb2ef0668 Merge pull request #13 from terrarier2111/patch-6
Fixed stupid bug
2020-07-15 16:33:25 +02:00
terrarier2111 9f697673c0 Fixed stupid bug 2020-07-15 16:28:14 +02:00
retrooper b1deb8629b Merge pull request #12 from terrarier2111/patch-5
Finally added AutoResolveClientProtocolVersion
2020-07-15 16:24:41 +02:00
terrarier2111 70d0400c67 Finally added AutoResolveClientProtocolVersion 2020-07-15 16:19:54 +02:00
retrooper b0c08ce813 Merge pull request #11 from terrarier2111/patch-4
Added autoResolveClientProtocolVersion setting
2020-07-15 16:14:50 +02:00
retrooper 3af91fcac9 Merge pull request #10 from terrarier2111/patch-3
Added Server Protocol Version Mapping
2020-07-15 16:13:40 +02:00
terrarier2111 d1c2fe4169 Update Settings.java 2020-07-15 16:11:34 +02:00
terrarier2111 1900d37c94 Added Server Protocol Version Mapping 2020-07-15 15:37:35 +02:00
retrooper 5d17a2a613 Merge pull request #8 from rbuh/patch-1
Bro wheres 1.7 my guy
2020-07-15 15:21:16 +02:00
rbuh 4a93603614 Bro wheres 1.7 my guy
how u forget the most import part!?!?!?!
2020-07-15 08:33:34 -04:00
retrooper 9a1a59f15f Merge pull request #7 from terrarier2111/patch-1
Update ClientVersion.java
2020-07-15 14:22:54 +02:00
terrarier2111 0c350a3f27 Update ClientVersion.java
Changed to correct protocolversion
2020-07-15 13:17:16 +02:00
Retrooper c3d75f1e8d 1.5.3 Stable release!!!! 2020-07-12 05:08:47 +08:00
Retrooper b847e53221 1.5.2 pre release 2020-07-12 02:46:52 +08:00
Retrooper c9570b0ad7 1.5.1 pre release 2020-07-11 18:52:07 +08:00
Retrooper ee5caaa81c Started on player infondo not use 2020-07-08 20:21:42 +08:00
Retrooper a81976b5a5 1.5 pre release, does spam some errors 2020-07-07 18:02:49 +08:00
retrooper fd32638787 Merge pull request #5 from GoDead/patch-1
Changed from int to byte
2020-07-06 20:36:06 +02:00
GoDead 816cd945f8 Changed from int to byte 2020-07-06 20:05:21 +02:00
retrooper 07f1f5f426 officially updated to GPL3 license 2020-07-06 19:56:21 +02:00
retrooper 8ac124a19e Merge pull request #4 from retrooper/add-license-1
GPL3 license file added
2020-07-06 19:55:30 +02:00
retrooper e90116291f GPL3 license file added 2020-07-06 19:55:02 +02:00
retrooper 2dbb3f08cb deleted license file, gpl3 applies 2020-07-06 19:53:26 +02:00
retrooper 71c333af5d about to update license to gpl3 2020-07-06 19:52:56 +02:00
Retrooper 925eca89d4 version is 1.4.2 not 1.4.20 2020-07-06 13:29:11 +08:00
Retrooper a712245ebe Updated veraion in pom.xml to 1.4.2 2020-07-06 13:26:48 +08:00
Retrooper 8c15df942d Merge remote-tracking branch 'origin/master' 2020-07-06 13:13:56 +08:00
Retrooper 6ce4fbd7fc IDE files removed 2020-07-06 13:13:18 +08:00
Retrooper 3e4fc70442 1.4.1 Release
* ...getPlayerUtilities().getPlayerPing(player); deprecated, use getPing(player);

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

PacketEvents.getAPI().getEventManager().unregisterListeners(LISTENER, LISTENER2);
2020-07-05 18:48:53 +08:00
Retrooper 4dafa959c1 * PacketTypeNames.java deleted
* WrappedPacketOutEntity added, UNTESTED
2020-07-05 15:05:25 +08:00
Retrooper 66a6c2d8f9 PacketEvents 1.4 Release
* Optimization Update, all packet comparisons now done with integer IDs.
2020-07-04 19:01:32 +08:00
OPtimal b2654e11a3 All is working,
1.3.9 releasing soon ane about to post on spigotmc
2020-07-03 19:05:14 +03:00
OPtimal e2cfdda9cf typo when initiating LOOK field in PacketTypeClasses 2020-07-03 17:31:11 +03:00
OPtimal b5085a8959 tr sel packet clasa nor found on < 1.16 fixed 2020-07-03 17:25:32 +03:00
OPtimal dccf01220c FLYING SUBCLASSES NOT FOUND FIX 2020-07-03 17:18:17 +03:00
OPtimal 12dc5b69c0 PacketType.Client.init() is only called after all PacketTypeClasses.Client.* have been initialized 2020-07-03 16:41:23 +03:00
OPtimal 0423b5f335 * Code optimized
* Serverbound Packet comparisons are now done with integer ids
UNTESTED, do not use this yet
2020-07-03 16:17:46 +03:00
retrooper a4c37da10e Merge pull request #3 from LIWKK/patch-1
1.16 enum missing fix
2020-07-01 21:35:16 +02:00
Johannes de49279aab 1.16 enum missing fix 2020-07-01 22:18:59 +03:00
retrooper f651ffddf5 BLOCK_PLACE class has been initialized 2020-06-29 15:48:41 +02:00
purplexdev ee959b68dc * 1.3.8 Release, all stable! PacketTypeClasses also added, client side only for now though 2020-06-29 14:29:01 +02:00
purplexdev b1d1201083 * EventSynchronization added
@PacketHandler(synchronization = EventSynchronization.x)

EventSynchronization.FORCE_ASYNC, EventSynchronization.FORCE_SYNC, EventSynchronization.NORMAL

* WrappedPacketInSteerVehicle ADDED
* SystemOS added, to check the server's os
2020-06-29 14:07:23 +02:00
purplexdev faff8fadc8 Confirmed to work with ProtocolLib 2020-06-28 21:57:32 +02:00
purplexdev 85a0f55b20 ProtocolLib support attempt, still testing, main example contains debugs 2020-06-28 21:54:24 +02:00
purplexdev cf2e571d80 Attempt on fixing bugs with entity-action wrapper in newer versions 2020-06-28 21:34:08 +02:00
purplexdev 68596469eb Merge remote-tracking branch 'origin/master' 2020-06-28 21:33:30 +02:00
purplexdev 181eda6ae4 Attempt on fixing bugs with entity-action wrapper in newer versions 2020-06-28 21:33:10 +02:00
retrooper 31ed9c0e4c added jitci badge 2020-06-27 08:14:31 +02:00
purplexdev 2916fb7112 Version updated to 1.3.7.2 2020-06-27 08:10:58 +02:00
purplexdev 1ca1a960b5 1.3.7.1 release! 2020-06-27 08:05:10 +02:00
retrooper 6c6a1c9465 1.3.7.1 as packetwrapper entityaction bugs fixed
Thr entity-action wrapper should work now, it has only been tested on 1.8.8, should work on 1.8+ for sure but not tested 1.7.10 but should work too :)
2020-06-26 23:28:03 +02:00
retrooper 0be7a21bab second attempt on fixing entity action wrapper 2020-06-26 22:48:03 +02:00
retrooper ca51988694 attempt on bug fix 2020-06-26 22:33:21 +02:00
retrooper 9184d54cb7 credits updated to fit for 1.3.7 2020-06-26 15:59:49 +02:00
purplexdev ca43582e4f 1.3.7 Release
* Most clientbound wrappers tested, it is assumed the rest will work
* 1.16.1 Support
* All bugs from 1.3.6.2 fixed
* pom.xml updated version
* Wrote custom Reflection utils, much cleaner code now and auto caching
2020-06-26 15:56:49 +02:00
purplexdev a1552990bf * Custom Reflection utilities written
* A lot of bugs fixed
 - WrappedPacketInFlying's subclasses, the isPosition and isLook method were false sometimes
 - WrappedPacketInBlockPlace fixed
 - Many optimizations

 * All serverbound wrappers are STABLE, the Clientbound wrappers haven't been tested
 * Massive code cleanup
2020-06-26 15:46:43 +02:00
purplexdev 99c9f50dfb * Minecraft enums moved from package enums-> enums/minecraft
* ServerVersion.getVersion() is now cached, and will store the version of the last time you checked as this method is pretty expensive!
2020-06-26 10:41:47 +02:00
purplexdev 565e14ecf3 * All deprecations removed
- PacketReceiveEvent.getPacket() removed
  - PacketSendEvent.getPacket() removed
  - Packet class removed
  - WrappedPacketInAbilities.canFly() removed
  - PostPlayerInjectEvent removed with all its usages
2020-06-26 08:47:17 +02:00
purplexdev 521a8e0777 Merge remote-tracking branch 'origin/master' 2020-06-26 08:40:21 +02:00
purplexdev 0141db4a64 * ClientVersion added 1.16 & 1.16.1 client support 2020-06-26 08:40:00 +02:00
retrooper 9ed9db88b7 bug fix, 1.3.6.3 release 🤦‍♂️ 2020-06-25 23:24:00 +02:00
purplexdev f52a05b477 1.3.6.2
* NettyPacketHandler.handlerName value set from "PacketListener" to "packet_handler" fixing all issues!
2020-06-25 22:54:30 +02:00
purplexdev 8936204849 1.3.6.1 2020-06-25 22:38:32 +02:00
purplexdev 50efff2819 Updated to 1.3.6
* Forgot to uninject on quit
2020-06-25 22:09:16 +02:00
purplexdev af325f9a62 Forgot to uninject onquit! 2020-06-25 22:08:41 +02:00
purplexdev fe29188e3f 1.3.5.2 Release, Bug fixed with position class & position look class and look class loading too late making them null! 2020-06-25 17:40:36 +02:00
purplexdev b753a98971 Issue with netty, receive and send event were mixed 2020-06-25 17:37:05 +02:00
purplexdev c73d88a7e2 Merge remote-tracking branch 'origin/master' 2020-06-25 15:13:32 +02:00
purplexdev bd872bc271 1.3.5.1
* Marked ProtocolSupport & ViaVersion as "provided" so they are not compiled into your plugin!
2020-06-25 15:13:03 +02:00
retrooper c0c03a0629 updated readme credit to release 1.3.5 2020-06-25 13:35:53 +02:00
purplexdev 18f3f135c8 Merge remote-tracking branch 'origin/master' 2020-06-25 13:16:04 +02:00
purplexdev 0304d0ac5a 1.3.5 Release STABLE!
* TinyProtocol removed
* API Size way smaller
* PlayerUninjectEvent is now called
* Version lookup methods re-added, but version lookup is only possible with ProtocolSupport or ViaVersion plugin avaialable on the server.
If you try looking up version and none of the listed plugins could be found, you will result with ClientVersion.ACCESS_FAILURE

* WrappedPacketOutAbilities sendable wrapper added
* PostPlayerInjectEvent has been deprecated, please use PlayerInjectEvent
* PlayerUninjectEvent now cancellable
* PlayerInjectEvent or PlayerUninjectEvent cancelling, will cancel the action.
* pom.xml version updated to 1.3.5
* Packet class has been deprecated, please use PacketType instead!
* Packet.isInstanceOfFlyingPacket(nmsPacket) -> PacketType.Util.isInstanceOfFlyingPacket(nmsPacket), and more instanceof functions are added in the PacketType.Util class too!
* PacketReceiveEvent#getPacket() is deprecated, please use PacketReceiveEvent#getNMSPacket()
* PacketSendEvent#getPacket() is deprecated, please use PacketSendEvent#getNMSPacket()
* PacketEvents.setShouldKickOnRestart(boolean) removed
2020-06-25 13:15:34 +02:00
retrooper 643fa1ad18 updated credits to fit latest commit 2020-06-22 22:43:50 +02:00
retrooper 5c65874749 remove plugin.yml 2020-06-22 22:36:27 +02:00
purplexdev 5a4db46427 1.3.4.1 UNTESTED!
Completely removed TinyProtocol, please test it, I will be able to fix any bugs tomorrow!
2020-06-22 22:31:14 +02:00
purplexdev 305d376128 1.3.4 RELEASE, This is probably one of my most important releases, this is the last release using TinyProtocol!
Changelog:
* Clientbound Abilities wrapper added and is sendable to clients

* Clientbound Health update wrapper added and is also sendable to clients

Info:
TinyProtocol helped us listen to some login and handshake packets!
But it also came with a lot of bugs and problems to deal with, even today there are still some bugs and many people using this API have complained about it.

I will now stop using TinyProtocol.

WHAT WILL THIS MEAN?

There will be lots of pro's and con's.

Pros:
* No more issues with reloading
* Smaller file size

Cons:
* Version lookup will now only be possible with dependencies like ViaVersion.
* Soft depend on via version as mentioned above. Soft depend meaning that if you want to lookup versions, ViaVersion api is required to be provided.

* All login wrappers and the login event will be removed!

It is very important that PacketEvents is stable and people shouldn't be constantly running into issues!
I am releasing this version with TinyProtocol for the users that will miss and still want TinyProtocol.
2020-06-22 21:07:34 +02:00
purplexdev 4308936c1a * Bukkit move event added
* In and Out going transaction packet wrapper added (request of Hades developer)
2020-06-22 19:27:12 +02:00
purplexdev 87b0ac9295 * Updated the default value of PacketEvent#timestamp to the non deprecated method PacketEvents#highlyPreciseMillis() 2020-06-21 17:18:32 +02:00
purplexdev 3dee3b2a0e Bug fixes!
* Blockplace_1_9 wrapper error fixed
* Blockplace 1_7 wrapper is now being used
* PacketEvents#currentCalculatedMS() now deprecated, please use PacketEvents#highlyPreciseMillis() or System#currentTimeMillis() depending on what you need, please read the documentation of PacketEvents#highlyPreciseMillis().
2020-06-21 16:48:41 +02:00
purplexdev c2f0e30511 Updated pom.xml version to 1.3.3.1 2020-06-18 16:19:12 +02:00
purplexdev a824a70cc6 Lots of code cleaned up, appended some code to the MainExample.java, added an option to kick all online players when the PacketEvents.stop() function is called( JavaPlugin#onDisable() ) 2020-06-18 15:44:53 +02:00
purplexdev 07692f87f2 1.3.3 Release STABLE
* EventManager small optimization
* Imports optimized
* Own GameProfile class added
* New wrappers, this version is going to go on spigotmc!
2020-06-17 17:29:51 +02:00
purplexdev 7f94b254a2 LoginInEncryptionBegin & LoginOutEncryptionBegin wrapper added,
LoginStart & LoginStatusPing wrapper added,
Bug fixed with PostPlayerInjectEvent not being called,
Custom GameProfile class coded,
Main example class readded
2020-06-17 13:15:35 +02:00
purplexdev ceb3581c28 PostPlayerInjectEvent not called bug fix! 2020-06-17 11:04:16 +02:00
purplexdev c3bf5d75d3 1.3.2 Release Stable!
* Code cleanup

* Custom NotNull and Nullable annotations added

* Example packages removed, please see https://github.com/retrooper/packetevents-example
2020-06-16 15:38:54 +02:00
purplexdev 297d261ca9 1.3.1.3 Beta
* ClientVersion added isHigherThan(ClientVersion version) and isLowerThan(ClientVersion version) methods for simple client version comparison.

* Packet.isInstanceOf(fatherPacketName, childPacketName) has now been deprecated, will be removed in the next version!

It has been replaced by Packet.isFlyingPacket(nmsPacketObject), as the flying packet is the only packet that has subclasses.
The flying packet is also used a lot, so I made an efficient way to check if the nms packet object is an instanceof of it!
If you are on a 1.9+ server, it will just check if the packet is an instance of "PacketPlayInPosition" or "PacketPlayInPositionLook" or "PacketPlayInLook".
2020-06-16 14:21:05 +02:00
purplexdev 89a67e7ee4 1.3.1.2 Stable!
* All wrapper classes are now FINAL classes as they are not meant to be extended.

* New wrapper class -> WrappedPacketOutKickDisconnect.
You can send this packet to any player if you want to kick them, or even read the message from such a packet.
2020-06-16 13:43:39 +02:00
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
retrooper 66f2c371ec updated info 2020-06-10 12:12:12 +02:00
purplexdev c5bcf50d66 Merge remote-tracking branch 'origin/master' 2020-06-10 11:58:55 +02:00
purplexdev 86625694fc 1.2.9.2 stable
* BlockPlace wrapper fixed for 1.8->1.8.8

* Imports optimized

* Server-bound Packet BLOCK_PLACE is no longer initialized at compilation time, its name changes depending on your server version

(On 1.7->1.8 servers it is equal to "PacketPlayInBlockPlace", 1.9+ servers it is equal to "PacketPlayInUseItem"), you can use the WrappedPacketInBlockPlace no matter what version you are running on, PacketEvents takes care of this!

* toBukkitItemStack function added in NMSUtils.java, you can easily convert an NMS itemstack to a bukkit itemstack

* Unneeded BlockFinder class removed, we use player.getTargetBlock(null, range); instead
2020-06-10 11:56:53 +02:00
retrooper dcaae8a15a spigot forks data 2020-06-09 22:07:20 +02:00
retrooper 1996399cde update to readme 2020-06-09 22:03:39 +02:00
retrooper 62d3fdd276 update to readme 2020-06-09 22:03:34 +02:00
purplexdev 7740cf6eae Bug fix, Login packets are no longer calling the client receive function! 2020-06-09 18:40:38 +02:00
purplexdev 5bbaa5d7c2 1.2.9 Fixed bug with the BlockDig event!
You may now use it, and the block place too on legacy versions!
2020-06-08 07:33:13 +02:00
purplexdev 70cb1ad0fb 1.2.9 Beta commit!
* ClientVersion checking added: PacketEvents.getClientVersion(player);

* PacketEvents.currentTimeMS() method renamed to -> PacketEvents.currentCalculatedMS();

* WrappedPacketLoginHandshake wrapper added, you can check protocol version, hostname, and port.

* A few bug fixes and a few classes renamed to avoid import confusing.

* Apparently the block dig wrapper is broken, will be fixed in the next commit!
* Avoid using the block dig wrapper.

* Unused vector classes removed to reduce file size

* Server reload event is not finished yet, but working on it and changed some stuff

* PacketEvents.java now listens to events and stores the protocol version, so you can lookup.

* NMSUtils.getCraftPlayer() function added and some stuff simplified

* I am now using TinyProtocol's Reflection util, it really speeds up wrapper making process and all reflection access so in future versions I might slowly rewrite some wrappers with it

* ClientVersion checking added: PacketEvents.getClientVersion(player);

* PacketEvents.currentTimeMS() method renamed to -> PacketEvents.currentCalculatedMS();

* WrappedPacketLoginHandshake wrapper added, you can check protocol version, hostname, and port.

* A few bug fixes and a few classes renamed to avoid import confusing.

* Apparently the block dig wrapper is broken, will be fixed in the next commit!
* Avoid using the block dig wrapper.

* Unused vector classes removed to reduce file size

* Server reload event is not finished yet, but working on it and changed some stuff

* PacketEvents.java now listens to events and stores the protocol version, so you can lookup.

* NMSUtils.getCraftPlayer() function added and some stuff simplified

* I am now using TinyProtocol's Reflection util, it really speeds up wrapper making process and all reflection access so in future versions I might slowly rewrite some wrappers with it

* This commit has only been tested on a 1.15.2 spigot server, I cannot guarantee it will work for the rest of the versions yet, but it should!

PLEASE DO NOT USE THE RELEASED VERSION 1.2.8! IT DOESN'T WORK AT ALL!
2020-06-07 22:43:47 +02:00
purplexdev fcfc404120 * ClientVersion checking added: PacketEvents.getClientVersion(player);
* PacketEvents.currentTimeMS() method renamed to -> PacketEvents.currentCalculatedMS();

* WrappedPacketLoginHandshake wrapper added, you can check protocol version, hostname, and port.

* A few bug fixes and a few classes renamed to avoid import confusing.

* Apparently the block dig wrapper is broken, will be fixed in the next commit!
* Avoid using the block dig wrapper.

* Unused vector classes removed to reduce file size

* Server reload event is not finished yet, but working on it and changed some stuff

* PacketEvents.java now listens to events and stores the protocol version, so you can lookup.

* NMSUtils.getCraftPlayer() function added and some stuff simplified

* I am now using TinyProtocol's Reflection util, it really speeds up wrapper making process and all reflection access so in future versions I might slowly rewrite some wrappers with it

* ClientVersion checking added: PacketEvents.getClientVersion(player);

* PacketEvents.currentTimeMS() method renamed to -> PacketEvents.currentCalculatedMS();

* WrappedPacketLoginHandshake wrapper added, you can check protocol version, hostname, and port.

* A few bug fixes and a few classes renamed to avoid import confusing.

* Apparently the block dig wrapper is broken, will be fixed in the next commit!
* Avoid using the block dig wrapper.

* Unused vector classes removed to reduce file size

* Server reload event is not finished yet, but working on it and changed some stuff

* PacketEvents.java now listens to events and stores the protocol version, so you can lookup.

* NMSUtils.getCraftPlayer() function added and some stuff simplified

* I am now using TinyProtocol's Reflection util, it really speeds up wrapper making process and all reflection access so in future versions I might slowly rewrite some wrappers with it

* This commit has only been tested on a 1.15.2 spigot server, I cannot guarantee it will work for the rest of the versions yet, but it should!

PLEASE DO NOT USE THE RELEASED VERSION 1.2.8! IT DOESN'T WORK AT ALL!
2020-06-07 22:42:54 +02:00
purplexdev 2f855874a6 Some bug fixes.
Now should work fine on 1.15 spigot forks. (Like tuinity & paperspigot)

Sorry, didn't notice this small bug for a long time.

Handshaking packets are also a thing now so yay!
2020-06-07 20:39:07 +02:00
purplexdev 26d5542864 Some bug fixes.
Now should work fine on 1.15 spigot forks. (Like tuinity & paperspigot)

Sorry, didn't notice this small bug for a long time.

Handshaking packets are also a thing now so yay!
2020-06-07 20:37:12 +02:00
purplexdev ee5e0ef3a7 Random nms import removed,
Handshake packetwrapper added, now possible to check protocol versions,
Random missing classes added(sorry idk why github fails to add these)
2020-06-07 20:04:13 +02:00
purplexdev 51e5cf5c55 Random nms import removed 2020-06-07 19:46:55 +02:00
purplexdev 3c09b8c3a7 * Bug fixes & better organization
Chat packetwrapper now working(sendable),
Working on login wrappers.
2020-06-07 19:45:11 +02:00
purplexdev 6e25876230 Random "success" debugs removed when fixing the last error! 2020-06-07 12:42:15 +02:00
purplexdev c5a3e57974 Merge remote-tracking branch 'origin/master' 2020-06-07 12:31:30 +02:00
purplexdev 508fb5f1e2 Bug fix with initiating Entity Velocity wrapper, accidentally imported and stored an instance of the Vec3D class!
Everything should work fine now!
2020-06-07 12:31:16 +02:00
retrooper e9b6f5ab0f some small changes 2020-06-07 07:55:46 +02:00
purplexdev efb79cc7d2 Merge remote-tracking branch 'origin/master' 2020-06-06 22:14:43 +02:00
purplexdev 901084f1f6 Bug fixes, not sure if stable, for some reason last push didn't go through 2020-06-06 22:14:23 +02:00
retrooper acb4ca7619 release version updated from 1.2.7 to 1.2.8 2020-06-06 16:42:24 +02:00
purplexdev 691684c828 Merge remote-tracking branch 'origin/master' 2020-06-06 16:17:54 +02:00
purplexdev 06482124ce 1.2.8 Release!
1.14 & 1.15 bug fixes!(entity velocity error and api not starting up fixed)

Now fully works on 1.7.10->1.15.2

Stable build!
2020-06-06 16:17:40 +02:00
retrooper d61fda966f updated readme and corrected, also added attribution to tinyprotocol
We changed the License to GPL2, as we are using a modified version of TinyProtcol(which uses GPL2), sublicensing is not allowed with GPL2
2020-06-06 15:23:08 +02:00
purplexdev 63df6cdf80 Merge remote-tracking branch 'origin/master' 2020-06-06 14:55:52 +02:00
purplexdev 3365fb569f * Using a modified version of TinyProtocol
* Multiple bug fixes

* New client-bound sendable wrappers -> EntityVelocity, Animation(containing stuff like ARM swing), Chat.

All the current client bound wrappers can be sent to clients, currently the Chat wrapper cannot be used for listening to packets, will be fixed in the next commit!

sendPacket(Player, Sendable packet) function added in PacketEvents.
2020-06-06 14:55:35 +02:00
retrooper f9c48e488e data updated 2020-06-06 12:46:18 +02:00
retrooper 0c81e0fd54 gpl 2 license because of new update coming 2020-06-06 12:36:14 +02:00
retrooper 0cddca1847 gpl 2 license 2020-06-06 12:35:49 +02:00
retrooper 23574cd075 license updated to gpl 2 2020-06-06 12:32:46 +02:00
purplexdev cc7897752d * EntityVelocity wrapper added
Please only use the velocity wrapper for listening to packets with this build.
I have not tested it for listening to packets though..

What I have tested is sending velocity packets with it doesn't work, hopefully next push we can fix this!
2020-06-05 22:22:18 +02:00
105 changed files with 3757 additions and 2118 deletions

No files matched your search

+11 -12
View File
@@ -1,24 +1,23 @@
# packetevents by retrooper
An asynchronous spigot packetListener coded by retrooper.
A lightweight spigot packetlistener & packetsender coded by retrooper.
## 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 GPL3 license.
* Licensed under the GPL3 license.
[![](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.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.
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/#explored/packetevents
[![](https://jitci.com/gh/retrooper/packetevents/svg)](https://jitci.com/gh/retrooper/packetevents)
To learn how to setup this API please click on the link below
[Setup Guide](https://github.com/retrooper/packetevents/wiki/PacketEvents-Setup-Guide)
(or just paste this into your browser: https://github.com/retrooper/packetevents/wiki/PacketEvents-Setup-Guide)
+44
View File
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="minecraft" name="Minecraft">
<configuration>
<autoDetectTypes>
<platformType>SPIGOT</platformType>
</autoDetectTypes>
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.github.spigot:1.7.10:1.7.10" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.github.spigot:1.8.8:1.8.8" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.comphenix.protocol:ProtocolLib:4.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: cglib:cglib-nodep:3.2.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.comphenix.executors:BukkitExecutors:1.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: us.myles:viaversion:3.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: us.myles:viaversion-common:3.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.18" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: us.myles:viaversion-bukkit:3.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: us.myles:viaversion-bukkit-legacy:3.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: us.myles:viaversion-bungee:3.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: us.myles:viaversion-fabric:3.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: us.myles:viaversion-sponge:3.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: us.myles:viaversion-sponge-legacy:3.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: us.myles:viaversion-velocity:3.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.md-5:bungeecord-chat:1.15-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:guava:21.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.ProtocolSupport:ProtocolSupport:4fdd683" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.commons:commons-lang3:3.8.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: it.unimi.dsi:fastutil:8.2.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.gson:gson:2.8.5" level="project" />
</component>
</module>
+57 -124
View File
@@ -6,43 +6,37 @@
<groupId>io.github.retrooper</groupId>
<artifactId>packetevents</artifactId>
<version>1.2.7</version>
<version>1.5.4.1</version>
<packaging>jar</packaging>
<name>packetevents</name>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- You can build the project with this: "mvn clean compile assembly:single" -->
<build>
<defaultGoal>clean package</defaultGoal>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>spigot-repo</id>
@@ -56,129 +50,68 @@
<id>funkemunky-releases</id>
<url>https://nexus.funkemunky.cc/content/repositories/releases/</url>
</repository>
<repository>
<id>viaversion-repo</id>
<url>https://repo.viaversion.com</url>
</repository>
<repository>
<id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/nexus/repository/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.14.1</artifactId>
<version>1.14.1</version>
<groupId>org.github.spigot</groupId>
<artifactId>1.8.8</artifactId>
<version>1.8.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.7.10</artifactId>
<version>1.7.10</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.comphenix.protocol</groupId>
<artifactId>ProtocolLib</artifactId>
<version>4.5.0</version>
<scope>provided</scope>
</dependency>
<!-- ViaVersion API-->
<dependency>
<groupId>us.myles</groupId>
<artifactId>viaversion</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!-- ProtocolSupport API-->
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.15.1</artifactId>
<version>1.15.1</version>
<groupId>com.github.ProtocolSupport</groupId>
<artifactId>ProtocolSupport</artifactId>
<version>4fdd683</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.14.3</artifactId>
<version>1.14.3</version>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.8.8-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.14.2</artifactId>
<version>1.14.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.15</artifactId>
<version>1.15</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.15.2</artifactId>
<version>1.15.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.13.2</artifactId>
<version>1.13.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.7.10</artifactId>
<version>1.7.10</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.8</artifactId>
<version>1.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.8.3</artifactId>
<version>1.8.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.8.8</artifactId>
<version>1.8.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.9</artifactId>
<version>1.9</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.9.4</artifactId>
<version>1.9.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.10.2</artifactId>
<version>1.10.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.11.1</artifactId>
<version>1.11.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.11.2</artifactId>
<version>1.11.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.12.1</artifactId>
<version>1.12.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.12.2</artifactId>
<version>1.12.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.13</artifactId>
<version>1.13</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.14</artifactId>
<version>1.14</version>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.8.8-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
@@ -1,116 +1,118 @@
package io.github.retrooper.packetevents;
import io.github.retrooper.packetevents.event.impl.ServerTickEvent;
import io.github.retrooper.packetevents.event.manager.EventManager;
import io.github.retrooper.packetevents.injector.PacketInjector;
import io.github.retrooper.packetevents.utils.NMSUtils;
import io.github.retrooper.packetevents.utils.TPSUtils;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.api.PacketEventsAPI;
import io.github.retrooper.packetevents.enums.ClientVersion;
import io.github.retrooper.packetevents.event.PacketListener;
import io.github.retrooper.packetevents.event.impl.BukkitMoveEvent;
import io.github.retrooper.packetevents.packet.PacketType;
import io.github.retrooper.packetevents.packet.PacketTypeClasses;
import io.github.retrooper.packetevents.settings.Settings;
import io.github.retrooper.packetevents.utils.onlineplayers.OnlinePlayerUtilities;
import io.github.retrooper.packetevents.utils.versionlookup.VersionLookupUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.*;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;
import javax.annotation.Nullable;
import java.util.concurrent.*;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.Plugin;
public class PacketEvents implements Listener {
private static final ServerVersion version = ServerVersion.getVersion();
private static PacketEvents instance;
private static final PacketInjector packetInjector = new PacketInjector();
public static ExecutorService executor = Executors.newCachedThreadPool();
private static final EventManager eventManager = new EventManager();
public final class PacketEvents implements PacketListener, Listener {
private static Plugin plugin;
private static final PacketEventsAPI packetEventsAPI = new PacketEventsAPI();
private static final PacketEvents instance = new PacketEvents();
private static boolean hasLoaded, hasStarted;
private static final Settings settings = new Settings();
private static int currentTick;
private static BukkitTask serverTickTask;
public static JavaPlugin plugin;
public static EventManager getEventManager() {
return eventManager;
/**
* Call this before start()
*/
public static void load() {
PacketTypeClasses.Client.load();
PacketTypeClasses.Server.load();
ClientVersion.prepareLookUp();
hasLoaded = true;
}
public static void setup(final JavaPlugin plugin, final boolean serverTickEventEnabled) {
PacketEvents.plugin = plugin;
Bukkit.getPluginManager().registerEvents(getInstance(), plugin);
/**
* Loads PacketEvents if you haven't already, Sets everything up, injects all players
*/
public static void start(final Plugin pl) {
if (!hasLoaded) {
load();
}
if (!hasStarted) {
plugin = pl;
//Register Bukkit and PacketListener
getAPI().getEventManager().registerListener(instance);
if (serverTickEventEnabled) {
final Runnable runnable = new Runnable() {
@Override
public void run() {
PacketEvents.getEventManager().callEvent(new ServerTickEvent(currentTick++, PacketEvents.currentTimeMS()));
}
};
serverTickTask = Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, runnable, 0L, 1L);
Bukkit.getPluginManager().registerEvents(instance, plugin);
for (final Player p : OnlinePlayerUtilities.getOnlinePlayers()) {
getAPI().getPlayerUtils().injectPlayer(p);
}
hasStarted = true;
}
}
public static void cleanup() {
if (serverTickTask != null) {
serverTickTask.cancel();
/**
* Stop all tasks and unregisters all PacketEvents' listeners
*/
public static void stop() {
if (hasStarted) {
for (final Player p : OnlinePlayerUtilities.getOnlinePlayers()) {
getAPI().getPlayerUtils().uninjectPlayerNow(p);
}
getAPI().getEventManager().unregisterAllListeners();
PacketType.Client.packetIds.clear();
PacketType.Server.packetIds.clear();
}
getEventManager().unregisterAllListeners();
}
public static boolean hasLoaded() {
return hasLoaded;
}
public static boolean hasStarted() {
return hasStarted;
}
public static PacketEventsAPI getAPI() {
return packetEventsAPI;
}
public static Plugin getPlugin() {
return plugin;
}
public static String getHandlerName(final String name) {
return "pe-" + getSettings().getIdentifier() + "-" + name;
}
public static Settings getSettings() {
return settings;
}
@EventHandler
public void onJoin(PlayerJoinEvent e) {
if (executor == null) {
executor = Executors.newCachedThreadPool();
packetInjector.injectPlayer(e.getPlayer());
System.out.println("Failed to inject " + e.getPlayer().getName() + " asynchronously!");
}
final Runnable runnable = new Runnable() {
@Override
public void run() {
packetInjector.injectPlayer(e.getPlayer());
}
};
Future<?> future = executor.submit(runnable);
public void onJoin(final PlayerJoinEvent e) {
getAPI().getPlayerUtils().injectPlayer(e.getPlayer());
getAPI().getPlayerUtils().setClientVersion(e.getPlayer(), ClientVersion.fromProtocolVersion(VersionLookupUtils.getProtocolVersion(e.getPlayer())));
}
@EventHandler
public void onQuit(PlayerQuitEvent e) {
packetInjector.uninjectPlayer(e.getPlayer());
public void onQuit(final PlayerQuitEvent e) {
getAPI().getPlayerUtils().clearClientVersion(e.getPlayer());
getAPI().getPlayerUtils().uninjectPlayerNow(e.getPlayer());
}
public static ServerVersion getServerVersion() {
return version;
}
public static PacketEvents getInstance() {
return instance == null ? instance = new PacketEvents() : instance;
}
public static boolean isServerTickTaskEnabled() {
return serverTickTask != null;
}
@Nullable
public static double[] getRecentServerTPS() {
final double[] tpsArray = TPSUtils.getRecentTPS();
final int size = tpsArray.length;
for (int i = 0; i < size; i++) {
if (tpsArray[i] > 20.0) {
tpsArray[i] = 20.0;
}
}
return tpsArray;
}
public static double getCurrentServerTPS() {
return getRecentServerTPS()[0];
}
public static int getPing(final Player player) {
return NMSUtils.getPlayerPing(player);
}
public static long currentTimeMS() {
return System.nanoTime() / 1000000;
@EventHandler
public void onMove(final PlayerMoveEvent e) {
BukkitMoveEvent moveEvent = new BukkitMoveEvent(e);
getAPI().getEventManager().callEvent(moveEvent);
e.setCancelled(moveEvent.isCancelled());
}
}
@@ -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;
/**
* 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 {
}
@@ -0,0 +1,18 @@
package io.github.retrooper.packetevents.annotations;
import io.github.retrooper.packetevents.annotations.data.EventSynchronization;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
/**
* Just like Bukkit's @EventHandler, but for PacketEvents' custom event system.
* Make sure your class implements the PacketListener interface, and is registered when annotating your method with this annotation!
*/
public @interface PacketHandler {
EventSynchronization synchronization() default EventSynchronization.NORMAL;
}
@@ -0,0 +1,5 @@
package io.github.retrooper.packetevents.annotations.data;
public enum EventSynchronization {
FORCE_SYNC, FORCE_ASYNC, NORMAL
}
@@ -0,0 +1,85 @@
package io.github.retrooper.packetevents.api;
import io.github.retrooper.packetevents.event.manager.EventManager;
import io.github.retrooper.packetevents.utils.api.PlayerUtils;
import io.github.retrooper.packetevents.utils.api.ServerUtils;
public final class PacketEventsAPI {
private final EventManager eventManager = new EventManager();
private final PlayerUtils playerUtils = new PlayerUtils();
private final ServerUtils serverUtils = new ServerUtils();
/**
* Not thread safe
* Preciser than #currentMillis()
* Expensive
* Returns crazy values when you change system time
*
* @return {@link System#nanoTime()} / 1000000(1 million)
*/
public long currentPreciseMillis() {
return System.nanoTime() / 1000000;
}
/**
* Thread safe
* Less precise compared to #currentPreciseMillis()
* Cheap
* Doesn't break when system time is changed
*
* @return {@link System#currentTimeMillis()}
*/
public long currentMillis() {
return System.currentTimeMillis();
}
/**
* Get all utilities to do with the player
*
* @return Player Utilities
*/
public PlayerUtils getPlayerUtils() {
return playerUtils;
}
/**
* Use {@link #getPlayerUtils()}
*
* @return
*/
@Deprecated
public PlayerUtils getPlayerUtilities() {
return playerUtils;
}
/**
* Get all utilities to do with the server
*
* @return Server Utilities
*/
public ServerUtils getServerUtils() {
return serverUtils;
}
/**
* Please use {@link #getServerUtils()}
*
* @return
*/
@Deprecated
public ServerUtils getServerUtilities() {
return serverUtils;
}
/**
* Get the event manager
* Used to call events, register and unregister listeners
*
* @return PacketEvents' event manager
*/
public EventManager getEventManager() {
return eventManager;
}
}
@@ -0,0 +1,105 @@
package io.github.retrooper.packetevents.enums;
import io.github.retrooper.packetevents.PacketEvents;
import java.util.HashMap;
import java.util.Map;
public enum ClientVersion {
LESS_THAN_V_1_7_10, v_1_7_10, v_1_8, v_1_9, v_1_9_1, v_1_9_2, v_1_9_3, v_1_10, v_1_11, v_1_11_1, v_1_12, v_1_12_1, v_1_12_2,
v_1_13, v_1_13_1, v_1_13_2, v_1_14, v_1_14_1, v_1_14_2, v_1_14_3, v_1_14_4, v_1_15_PRE_1, v_1_15_PRE_2, v_1_15_PRE_3, v_1_15_PRE_4, v_1_15_PRE_5, v_1_15_PRE_6, v_1_15_PRE_7,
v_1_15, v_1_15_1, v_1_15_2, v_1_16, v_1_16_PRE_1, v_1_16_PRE_2, v_1_16_PRE_3, v_1_16_PRE_4, v_1_16_PRE_5, v_1_16_PRE_6, v_1_16_PRE_7, v_1_16_PRE_8, v_1_16_RC_1, v_1_16_1, HIGHER_THAN_V_1_16_1, INVALID, ACCESS_FAILURE;
private static final Map<Integer, ClientVersion> VERSION_LOOKUP = new HashMap<>();
public static void prepareLookUp() {
VERSION_LOOKUP.put(-1, ACCESS_FAILURE);
VERSION_LOOKUP.put(1, LESS_THAN_V_1_7_10);
VERSION_LOOKUP.put(2, LESS_THAN_V_1_7_10);
VERSION_LOOKUP.put(3, LESS_THAN_V_1_7_10);
VERSION_LOOKUP.put(4, LESS_THAN_V_1_7_10);
VERSION_LOOKUP.put(5, v_1_7_10);
VERSION_LOOKUP.put(47, v_1_8);
VERSION_LOOKUP.put(107, v_1_9);
VERSION_LOOKUP.put(108, v_1_9_1);
VERSION_LOOKUP.put(109, v_1_9_2);
VERSION_LOOKUP.put(110, v_1_9_3);
VERSION_LOOKUP.put(210, v_1_10);
VERSION_LOOKUP.put(315, v_1_11);
VERSION_LOOKUP.put(316, v_1_11_1);
VERSION_LOOKUP.put(335, v_1_12);
VERSION_LOOKUP.put(338, v_1_12_1);
VERSION_LOOKUP.put(340, v_1_12_2);
VERSION_LOOKUP.put(393, v_1_13);
VERSION_LOOKUP.put(401, v_1_13_1);
VERSION_LOOKUP.put(404, v_1_13_2);
VERSION_LOOKUP.put(477, v_1_14);
VERSION_LOOKUP.put(480, v_1_14_1);
VERSION_LOOKUP.put(485, v_1_14_2);
VERSION_LOOKUP.put(490, v_1_14_3);
VERSION_LOOKUP.put(498, v_1_14_4);
VERSION_LOOKUP.put(565, v_1_15_PRE_1);
VERSION_LOOKUP.put(566, v_1_15_PRE_2);
VERSION_LOOKUP.put(567, v_1_15_PRE_3);
VERSION_LOOKUP.put(569, v_1_15_PRE_4);
VERSION_LOOKUP.put(570, v_1_15_PRE_5);
VERSION_LOOKUP.put(571, v_1_15_PRE_6);
VERSION_LOOKUP.put(572, v_1_15_PRE_7);
VERSION_LOOKUP.put(573, v_1_15);
VERSION_LOOKUP.put(575, v_1_15_1);
VERSION_LOOKUP.put(578, v_1_15_2);
VERSION_LOOKUP.put(721, v_1_16_PRE_1);
VERSION_LOOKUP.put(722, v_1_16_PRE_2);
VERSION_LOOKUP.put(725, v_1_16_PRE_3);
VERSION_LOOKUP.put(727, v_1_16_PRE_4);
VERSION_LOOKUP.put(729, v_1_16_PRE_5);
VERSION_LOOKUP.put(730, v_1_16_PRE_6);
VERSION_LOOKUP.put(732, v_1_16_PRE_7);
VERSION_LOOKUP.put(733, v_1_16_PRE_8);
VERSION_LOOKUP.put(734, v_1_16_RC_1);
VERSION_LOOKUP.put(735, v_1_16);
VERSION_LOOKUP.put(736, v_1_16_1);
}
public static ClientVersion fromProtocolVersion(int protocolVersion) {
if (protocolVersion == -1 && PacketEvents.getSettings().doAutoResolveClientProtocolVersion()) {
protocolVersion = ServerVersion.getVersion().toProtocolVersion();
}
final ClientVersion lookedUp = VERSION_LOOKUP.get(protocolVersion);
if (lookedUp != null) {
return lookedUp;
}
return protocolVersion > 736 ? HIGHER_THAN_V_1_16_1 : 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;
final int len = 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;
}
}
@@ -1,9 +1,7 @@
package io.github.retrooper.packetevents.enums;
public enum Direction {
DOWN, UP, NORTH, SOUTH, WEST, EAST
,NORTH_EAST,
DOWN, UP, NORTH, SOUTH, WEST, EAST, NORTH_EAST,
NORTH_WEST, SOUTH_EAST,
SOUTH_WEST, WEST_NORTH_WEST,
NORTH_NORTH_WEST, NORTH_NORTH_EAST,
@@ -11,7 +9,7 @@ public enum Direction {
SOUTH_SOUTH_EAST, SOUTH_SOUTH_WEST,
WEST_SOUTH_WEST, SELF, NULL;
public static Direction get(final byte i) {
public static Direction get(final int i) {
return values()[i];
}
}
@@ -1,6 +0,0 @@
package io.github.retrooper.packetevents.enums;
public enum Hand {
MAIN_HAND,
OFF_HAND;
}
@@ -1,25 +0,0 @@
package io.github.retrooper.packetevents.enums;
public enum PlayerAction {
START_SNEAKING,
STOP_SNEAKING,
STOP_SLEEPING,
START_SPRINTING,
STOP_SPRINTING,
START_RIDING_JUMP,
STOP_RIDING_JUMP,
OPEN_INVENTORY,
START_FALL_FLYING;
public static PlayerAction get(final byte i) {
return values()[i];
}
}
@@ -1,34 +1,67 @@
package io.github.retrooper.packetevents.enums;
import org.apache.commons.lang.ArrayUtils;
import io.github.retrooper.packetevents.PacketEvents;
import org.bukkit.Bukkit;
/**
* @author retrooper
*/
public enum ServerVersion {
v_1_7_10, v_1_8, v_1_8_3, v_1_8_8, v_1_9, v_1_9_4, v_1_10, v_1_11, v_1_12, v_1_13, v_1_13_2, v_1_14, v_1_15,
ERROR;
v_1_7_10, v_1_8, v_1_8_3, v_1_8_8, v_1_9, v_1_9_4, v_1_10, v_1_11, v_1_12, v_1_13, v_1_13_2, v_1_14, v_1_15, v_1_16_1,
ERROR, EMPTY;
private static final ServerVersion[] reversedValues;
private static final String nmsVersionSuffix = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
private static ServerVersion cachedVersion;
public static ServerVersion getVersion() {
ServerVersion[] vals = values();
ArrayUtils.reverse(vals);
for (ServerVersion val : vals) {
static {
reversedValues = reverse(values());
}
private static ServerVersion getVers() {
for (final ServerVersion val : reversedValues) {
String valName = val.name().substring(2).replace("_", ".");
if (Bukkit.getBukkitVersion().contains(valName)) {
return val;
} else if (PacketEvents.getSettings().getDefaultServerVersion() != null) {
return PacketEvents.getSettings().getDefaultServerVersion();
}
}
return ERROR;
}
private static final String nmsVersionSuffix = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
public static ServerVersion getVersion() {
if (cachedVersion == null) {
cachedVersion = getVers();
}
return cachedVersion;
}
private static ServerVersion[] reverse(final ServerVersion[] arr) {
ServerVersion[] array = arr.clone();
if (array == null) {
return null;
}
int i = 0;
int j = array.length - 1;
ServerVersion tmp;
while (j > i) {
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
j--;
i++;
}
return array;
}
public static String getNmsSuffix() {
return nmsVersionSuffix;
}
public static String getNMSDirectory() {
return "net.minecraft.server." + nmsVersionSuffix;
return "net.minecraft.server." + getNmsSuffix();
}
public static String getOBCDirectory() {
@@ -53,19 +86,60 @@ public enum ServerVersion {
* @return
*/
public boolean isLowerThan(final ServerVersion version) {
if(version == this) return false;
byte len = (byte) values().length;
if (version == this) return false;
final int len = values().length;
for (byte i = 0; i < len; i++) {
final ServerVersion v = values()[i];
if(v == this) {
if (v == this) {
return true;
}
else if(v == version) {
} else if (v == version) {
return false;
}
}
return false;
}
}
public int toProtocolVersion() {
if (this.equals(ServerVersion.v_1_7_10)) {
return 5;
}
if (this.name().startsWith("v_1_8")) {
return 47;
}
if (this.equals(ServerVersion.v_1_9)) {
return 107;
}
if (this.equals(ServerVersion.v_1_9_4)) {
return 110;
}
if (this.equals(ServerVersion.v_1_10)) {
return 210;
}
if (this.equals(ServerVersion.v_1_11)) {
return 315;
}
if (this.equals(ServerVersion.v_1_11)) {
return 315;
}
if (this.equals(ServerVersion.v_1_12)) {
return 335;
}
if (this.equals(ServerVersion.v_1_13)) {
return 393;
}
if (this.equals(ServerVersion.v_1_13_2)) {
return 404;
}
if (this.equals(ServerVersion.v_1_14)) {
return 477;
}
if (this.equals(ServerVersion.v_1_15)) {
return 573;
}
if (this.equals(ServerVersion.v_1_16_1)) {
return 735;
}
return -1;
}
}
@@ -0,0 +1,32 @@
package io.github.retrooper.packetevents.enums;
public enum SystemOS {
WINDOWS, MACOS, LINUX, OTHER;
private static SystemOS value;
private static SystemOS getOS() {
final String os = System.getProperty("os.name");
for (final String osName : getOperatingSystemNames()) {
if (os.toLowerCase().contains(osName.toLowerCase())) {
return SystemOS.valueOf(osName);
}
}
return OTHER;
}
public static SystemOS getOperatingSystem() {
if (value == null) {
value = getOS();
}
return value;
}
public static String[] getOperatingSystemNames() {
final String[] arr = new String[values().length - 1];
for (int i = 0; i < values().length - 1; i++) {
arr[i] = values()[i].name();
}
return arr;
}
}
@@ -0,0 +1,19 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum EntityAnimationType {
SWING_MAIN_ARM, DAMAGE, LEAVE_BED, SWING_OFFHAND, CRITICAL_EFFECT, MAGIC_CRITICAL_EFFECT;
public static final EntityAnimationType get(final int i) {
return values()[i];
}
public final int getIndex() {
for (int i = 0; i < values().length; i++) {
final EntityAnimationType curType = values()[0];
if (curType == this) {
return i;
}
}
return -1;
}
}
@@ -1,9 +1,9 @@
package io.github.retrooper.packetevents.enums;
package io.github.retrooper.packetevents.enums.minecraft;
public enum EntityUseAction {
INTERACT, INTERACT_AT, ATTACK, INVALID;
public static EntityUseAction get(final byte i) {
public static EntityUseAction get(final int i) {
return values()[i];
}
}
@@ -0,0 +1,25 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum Gamemode {
NOT_SET(-1, ""),
SURVIVAL(0, "survival"),
CREATIVE(1, "creative"),
ADVENTURE(2, "adventure"),
SPECTATOR(3, "spectator");
int f;
String g;
Gamemode(int var3, String var4) {
this.f = var3;
this.g = var4;
}
public int getId() {
return this.f;
}
public String b() {
return this.g;
}
}
@@ -0,0 +1,6 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum Hand {
MAIN_HAND,
OFF_HAND
}
@@ -0,0 +1,59 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum PlayerAction {
START_SNEAKING,
STOP_SNEAKING,
STOP_SLEEPING,
START_SPRINTING,
STOP_SPRINTING,
START_RIDING_JUMP,
STOP_RIDING_JUMP,
OPEN_INVENTORY,
START_FALL_FLYING;
public static PlayerAction get(final int i) {
return values()[i];
}
public int getIndex() {
for (int i = 0; i < values().length; i++) {
final PlayerAction action = values()[i];
if (action == this) {
return i;
}
}
return -1;
}
public enum UpdatedPlayerAction {
PRESS_SHIFT_KEY, RELEASE_SHIFT_KEY, STOP_SLEEPING, START_SPRINTING, STOP_SPRINTING, START_RIDING_JUMP, STOP_RIDING_JUMP, OPEN_INVENTORY, START_FALL_FLYING;
public static UpdatedPlayerAction get(final int index) {
for (int i = 0; i < index + 1; i++) {
final UpdatedPlayerAction action = values()[i];
if (i == index) {
return action;
}
}
return null;
}
public int getIndex() {
for (int i = 0; i < values().length; i++) {
final UpdatedPlayerAction action = values()[i];
if (action == this) {
return i;
}
}
return -1;
}
}
}
@@ -1,4 +1,4 @@
package io.github.retrooper.packetevents.enums;
package io.github.retrooper.packetevents.enums.minecraft;
public enum PlayerDigType {
@@ -16,9 +16,11 @@ public enum PlayerDigType {
SWAP_HELD_ITEMS,
SWAP_ITEM_WITH_OFFHAND,
WRONG_PACKET;
public static PlayerDigType get(final byte i) {
public static PlayerDigType get(final int i) {
return values()[i];
}
}
@@ -0,0 +1,8 @@
package io.github.retrooper.packetevents.enums.minecraft;
public enum PlayerInfoAction {
ADD_PLAYER, UPDATE_GAME_MODE, UPDATE_LATENCY, UPDATE_DISPLAY_NAME, REMOVE_PLAYER;
PlayerInfoAction() {
}
}
@@ -1,22 +1,22 @@
package io.github.retrooper.packetevents.event;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.enums.ServerVersion;
/**
* Incoming and sent packets are called asynchronously,
* recommended to avoid non thread safe bukkit operations
*/
public class PacketEvent {
protected long timestamp = PacketEvents.currentTimeMS();
protected static ServerVersion version = PacketEvents.getServerVersion();
protected static ServerVersion version = ServerVersion.getVersion();
private long timestamp = System.currentTimeMillis();
/**
* Timestamp of the packet
*
* @return
*/
public long getTimestamp() {
return timestamp;
}
public void setTimestamp(long timestamp) {
this.timestamp = timestamp;
}
}
@@ -1,17 +0,0 @@
package io.github.retrooper.packetevents.event;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
/**
* Just like Bukkit's @EventHandler, but for packets.
* Make sure your class implements the PacketListener interface, and is registered!
*/
public @interface PacketHandler {
}
@@ -1,4 +1,4 @@
package io.github.retrooper.packetevents.event;
public interface PacketListener {
public interface PacketListener {
}
@@ -0,0 +1,48 @@
package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.event.PacketEvent;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerMoveEvent;
public final class BukkitMoveEvent extends PacketEvent {
private final Player player;
private final Location to, from;
private boolean cancelled;
public BukkitMoveEvent(final Player player, final Location to, final Location from) {
this.player = player;
this.to = to;
this.from = from;
}
public BukkitMoveEvent(final PlayerMoveEvent e) {
this.player = e.getPlayer();
this.to = e.getTo();
this.from = e.getFrom();
}
public Player getPlayer() {
return player;
}
public Location getFrom() {
return from;
}
public Location getTo() {
return to;
}
public void setCancelled(final boolean val) {
this.cancelled = val;
}
public boolean isCancelled() {
return cancelled;
}
public void cancel() {
setCancelled(true);
}
}
@@ -1,28 +0,0 @@
package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.event.PacketEvent;
import org.bukkit.entity.Player;
//unfinished
public class PacketLoginEvent extends PacketEvent {
private final Player player;
private final String name;
private final Object packet;
public PacketLoginEvent(final Player player, final String packetName, final Object packet) {
this.player = player;
this.name = packetName;
this.packet = packet;
}
public Player getPlayer() {
return player;
}
public String getPacketName() {
return name;
}
public Object getPacket() {
return packet;
}
}
@@ -1,9 +1,10 @@
package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.event.PacketEvent;
import io.github.retrooper.packetevents.packet.PacketType;
import org.bukkit.entity.Player;
public class PacketReceiveEvent extends PacketEvent {
public final class PacketReceiveEvent extends PacketEvent {
private final Player player;
private final String name;
private final Object packet;
@@ -34,21 +35,34 @@ public class PacketReceiveEvent extends PacketEvent {
}
/**
* Get the raw packet object
* Get the NMS packet object
*
* @return packet
* @return packet object
*/
public Object getPacket() {
public Object getNMSPacket() {
return this.packet;
}
/**
* Cancel the packet
* Get the class of the NMS packet object
*
* @param cancelled
* @return packet object class
*/
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
public Class<?> getNMSPacketClass() {
return getNMSPacket().getClass();
}
/**
* Get the ID of the packet
*
* @return packet id
*/
public byte getPacketId() {
Byte id = PacketType.Client.packetIds.get(getNMSPacketClass());
if (id == null) {
return -1;
}
return id;
}
/**
@@ -59,4 +73,13 @@ public class PacketReceiveEvent extends PacketEvent {
public boolean isCancelled() {
return cancelled;
}
/**
* Cancel the packet
*
* @param cancelled
*/
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
}
@@ -1,9 +1,11 @@
package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.event.PacketEvent;
import io.github.retrooper.packetevents.packet.PacketType;
import org.bukkit.entity.Player;
public class PacketSendEvent extends PacketEvent {
public final class PacketSendEvent extends PacketEvent {
private final Player player;
private final String name;
private final Object packet;
@@ -26,233 +28,43 @@ public class PacketSendEvent extends PacketEvent {
}
/**
* Get the raw packet object
* Get the ID of the packet
*
* @return nmsPacket
* @return packet id
*/
public Object getPacket() {
public byte getPacketId() {
Byte id =
PacketType.Server.packetIds.get(getNMSPacketClass());
if (id == null) {
return -1;
}
return id;
}
/**
* Get the NMS packet object
*
* @return packet object
*/
public Object getNMSPacket() {
return this.packet;
}
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
/**
* Get the class of the NMS packet object
*
* @return packet object class
*/
public Class<?> getNMSPacketClass() {
return getNMSPacket().getClass();
}
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;
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
/**
* 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,27 @@ 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,11 +3,36 @@ 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;
private boolean cancelled;
private final boolean sync;
public PlayerUninjectEvent(final Player player) {
public PlayerUninjectEvent(final Player player, final boolean sync) {
this.player = player;
this.sync = sync;
}
public void cancel() {
setCancelled(true);
}
public boolean isCancelled() {
return this.cancelled;
}
public void setCancelled(final boolean val) {
this.cancelled = val;
}
/**
* Whether the uninjection was called synchronously or asynchronously.
* The event is still called synchronously.
* By default all uninjections are called aynchronously in this build.
* @return If the uninjection was done async or sync
*/
public boolean isSync() {
return sync;
}
public Player getPlayer() {
@@ -1,21 +0,0 @@
package io.github.retrooper.packetevents.event.impl;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.event.PacketEvent;
//unfinished
public class ServerReloadEvent extends PacketEvent {
private final long currentTime;
public ServerReloadEvent(final long currentTime){
this.currentTime = currentTime;
}
public ServerReloadEvent() {
this.currentTime = PacketEvents.currentTimeMS();
}
public final long getCurrentTime() {
return currentTime;
}
}
@@ -1,32 +0,0 @@
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 {
private final int tick;
private final double tps;
public ServerTickEvent(final int tick, final long timestamp) {
this.tick = tick;
this.timestamp = timestamp;
this.tps = PacketEvents.getCurrentServerTPS();
}
public ServerTickEvent(final int tick) {
this.tick = tick;
this.tps = PacketEvents.getCurrentServerTPS();
}
public long getTimestamp() {
return timestamp;
}
public int getCurrentTick() {
return tick;
}
public double getCurrentServerTPS() {
return tps;
}
}
@@ -1,57 +1,97 @@
package io.github.retrooper.packetevents.event.manager;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.annotations.PacketHandler;
import io.github.retrooper.packetevents.annotations.data.EventSynchronization;
import io.github.retrooper.packetevents.event.PacketEvent;
import io.github.retrooper.packetevents.event.PacketListener;
import io.github.retrooper.packetevents.event.PacketHandler;
import org.bukkit.Bukkit;
import java.lang.reflect.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class EventManager {
public final class EventManager {
private final ExecutorService executorService;
private final HashMap<PacketListener, List<Method>> registeredMethods = new HashMap<PacketListener, List<Method>>();
private static HashMap<PacketListener, List<Method>> registeredMethods = new HashMap<PacketListener, List<Method>>();
public EventManager(final int threadCount) {
executorService = Executors.newFixedThreadPool(threadCount);
}
public static void callEvent(final PacketEvent e) {
public EventManager() {
this(Runtime.getRuntime().availableProcessors());
}
public void callEvent(final PacketEvent e) {
for (final PacketListener listener : registeredMethods.keySet()) {
//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())) {
try {
method.invoke(listener, e);
} catch (IllegalAccessException | InvocationTargetException ex) {
ex.printStackTrace();
final Class<?> parameterType = method.getParameterTypes()[0];
if (parameterType.equals(PacketEvent.class)
|| parameterType.isInstance(e)) {
final PacketHandler annotation = method.getAnnotation(PacketHandler.class);
final Runnable invokeMethod = new Runnable() {
@Override
public void run() {
try {
method.invoke(listener, e);
} catch (IllegalAccessException | InvocationTargetException ex) {
ex.printStackTrace();
}
}
};
if (annotation.synchronization() == EventSynchronization.FORCE_ASYNC) {
executorService.execute(invokeMethod);
} else if (annotation.synchronization() == EventSynchronization.FORCE_SYNC) {
Bukkit.getScheduler().runTask(PacketEvents.getPlugin(), invokeMethod);
} else {
invokeMethod.run();
}
}
}
}
}
public static void registerListener(final PacketListener e) {
public void registerListener(final PacketListener e) {
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 static void unregisterListener(final PacketListener e) {
public void registerListeners(final PacketListener... listeners) {
for (final PacketListener listener : listeners) {
registerListener(listener);
}
}
public void unregisterListener(final PacketListener e) {
registeredMethods.remove(e);
}
public static void unregisterAllListeners() {
public void unregisterListeners(final PacketListener... listeners) {
for (final PacketListener listener : listeners) {
unregisterListener(listener);
}
}
public void unregisterAllListeners() {
registeredMethods.clear();
}
/*@Override
public void sendPacket(Player player, WrappedPacket packet) {
}*/
public boolean isRegistered(final PacketListener listener) {
return registeredMethods.containsKey(listener);
}
}
@@ -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,37 +1,32 @@
package io.github.retrooper.packetevents.example;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.event.PacketListener;
import org.bukkit.plugin.java.JavaPlugin;
public class MainExample extends JavaPlugin {
public class MainExample extends JavaPlugin implements PacketListener {
@Override
public void onLoad() {
PacketEvents.load();
}
@Override
public void onEnable() {
//Make sure you set a unique identifier, if another present plugin has the same identifier, you could run into issues
PacketEvents.getSettings().setIdentifier("official_api");
//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.setup(this, serverTickEventEnabled);
PacketEvents.start(this);
//If packetevents cannot detect your server version, it will use the default you specify version
// getAPI().getSettings().setDefaultServerVersion(ServerVersion.v_1_7_10);
/**
* Register TestExample's PacketListener
*/
PacketEvents.getEventManager().registerListener(new RegisteredListener());
PacketEvents.getAPI().getEventManager().registerListeners(this);
}
@Override
public void onDisable() {
/**
* Stops server tick event task if enabled and unregister all listeners
*/
PacketEvents.cleanup();
PacketEvents.stop();
}
}
}
@@ -1,184 +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.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.packet.Packet;
import io.github.retrooper.packetevents.utils.vector.Vector3i;
import io.github.retrooper.packetevents.event.impl.*;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.ItemStack;
/**
* Implementing PacketListener to listen to packets and packetevents' custom events,
* Implementing org.bukkit.event.Listener to listen to bukkit's events
*/
public class RegisteredListener implements PacketListener, Listener {
/**
* Listen to PacketReceiveEvent
*
* @param e PacketReceiveEvent
*/
@PacketHandler
public void onPacketReceive(PacketReceiveEvent e) {
final Player p = e.getPlayer();
final long timestamp = e.getTimestamp();
//ONLY CLIENT PACKETS ALLOWED HERE!
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
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();
//e.getPlayer().sendMessage(message);
break;
case Packet.Client.BLOCK_PLACE:
final WrappedPacketInBlockPlace blockPlace = new WrappedPacketInBlockPlace(e.getPlayer(), e.getPacket());
final Vector3i blockPosition = blockPlace.getBlockPosition();
final Hand h = blockPlace.getHand();
final ItemStack stack = blockPlace.getItemStack();
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;
//System.out.println("YOU SAID: " + message);
}
}
/**
* Example of a custom event
* @param e
*/
@PacketHandler
public void onCustomMove(CustomMoveEvent e) {
double distance = e.getTo().distanceSquared(e.getFrom());
}
/**
* I recommend you use the player inject event
* to register your players instead of any other bukkit event,
* to avoid any issues.
* @param event
*/
@PacketHandler
public void onInject(PlayerInjectEvent event) {
}
/**
* I recommend you use the player uninject event,
* to unregister your players
*
* 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 e
*/
@PacketHandler
public void onUninject(PlayerUninjectEvent e) {
}
/**
* Another way to listen to packets
*
* @param e PacketEvent
*/
@PacketHandler
public void onPacket(final 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();
} 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();
// System.out.println(PacketEvents.getCurrentServerTPS() + " is tps");
}
}
/**
* Call the CustomMoveEvent event
*
* @param e PlayerMoveEvent
*/
@EventHandler
public void onMove(PlayerMoveEvent e) {
final CustomMoveEvent customMoveEvent = new CustomMoveEvent(e.getPlayer(), e.getTo(), e.getFrom());
e.setCancelled(customMoveEvent.isCancelled());
PacketEvents.getEventManager().callEvent(customMoveEvent);
if (e.getTo() != customMoveEvent.getTo()) {
e.setTo(customMoveEvent.getTo());
}
if (e.getFrom() != customMoveEvent.getFrom()) {
e.setFrom(customMoveEvent.getFrom());
}
}
}
@@ -0,0 +1,92 @@
package io.github.retrooper.packetevents.handler;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.event.impl.PacketReceiveEvent;
import io.github.retrooper.packetevents.event.impl.PacketSendEvent;
import io.github.retrooper.packetevents.event.impl.PlayerInjectEvent;
import io.github.retrooper.packetevents.event.impl.PlayerUninjectEvent;
import org.bukkit.entity.Player;
import java.util.NoSuchElementException;
import java.util.concurrent.Future;
public class NettyPacketHandler {
private static boolean v1_7_nettyMode = false;
static {
try {
Class.forName("io.netty.channel.Channel");
} catch (ClassNotFoundException e) {
v1_7_nettyMode = true;
}
}
public static void injectPlayer(final Player player) {
final PlayerInjectEvent injectEvent = new PlayerInjectEvent(player);
PacketEvents.getAPI().getEventManager().callEvent(injectEvent);
if (!injectEvent.isCancelled()) {
if (v1_7_nettyMode) {
NettyPacketHandler_7.injectPlayer(player);
} else {
NettyPacketHandler_8.injectPlayer(player);
}
}
}
public static Future<?> uninjectPlayer(final Player player) {
try {
final PlayerUninjectEvent uninjectEvent = new PlayerUninjectEvent(player, false);
PacketEvents.getAPI().getEventManager().callEvent(uninjectEvent);
if (!uninjectEvent.isCancelled()) {
if (v1_7_nettyMode) {
return NettyPacketHandler_7.uninjectPlayer(player);
} else {
return NettyPacketHandler_8.uninjectPlayer(player);
}
}
} catch(Exception e) {
}
return null;
}
public static void uninjectPlayerNow(final Player player) {
try {
final PlayerUninjectEvent uninjectEvent = new PlayerUninjectEvent(player, true);
PacketEvents.getAPI().getEventManager().callEvent(uninjectEvent);
if (!uninjectEvent.isCancelled()) {
if (v1_7_nettyMode) {
NettyPacketHandler_7.uninjectPlayerNow(player);
} else {
NettyPacketHandler_8.uninjectPlayerNow(player);
}
}
}
catch(Exception e)
{
}
}
public static Object write(final Player sender, final Object packet) {
final String packetName = packet.getClass().getSimpleName();
final PacketSendEvent packetSendEvent = new PacketSendEvent(sender, packetName, packet);
PacketEvents.getAPI().getEventManager().callEvent(packetSendEvent);
if (!packetSendEvent.isCancelled()) {
return packet;
}
return null;
}
public static Object read(final Player receiver, final Object packet) {
final String packetName = packet.getClass().getSimpleName();
final PacketReceiveEvent packetReceiveEvent = new PacketReceiveEvent(receiver, packetName, packet);
PacketEvents.getAPI().getEventManager().callEvent(packetReceiveEvent);
if (!packetReceiveEvent.isCancelled()) {
return packet;
}
return null;
}
}
@@ -0,0 +1,50 @@
package io.github.retrooper.packetevents.handler;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.utils.NMSUtils;
import net.minecraft.util.io.netty.channel.*;
import org.bukkit.entity.Player;
import java.util.concurrent.Future;
final class NettyPacketHandler_7 {
public static void injectPlayer(final Player player) {
final ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
Object packet = NettyPacketHandler.read(player, msg);
if (packet == null) {
return;
}
super.channelRead(ctx, msg);
}
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
Object packet = NettyPacketHandler.write(player, msg);
if (packet == null) {
return;
}
super.write(ctx, msg, promise);
}
};
final ChannelPipeline pipeline = ((Channel) NMSUtils.getChannel(player)).pipeline();
pipeline.addBefore("packet_handler", PacketEvents.getHandlerName(player.getName()), channelDuplexHandler);
}
public static Future<?> uninjectPlayer(final Player player) {
final Channel channel = (Channel) NMSUtils.getChannel(player);
return channel.eventLoop().submit(new Runnable() {
@Override
public void run() {
channel.pipeline().remove(PacketEvents.getHandlerName(player.getName()));
}
});
}
public static void uninjectPlayerNow(final Player player) {
final Channel channel = (Channel) NMSUtils.getChannel(player);
channel.pipeline().remove(PacketEvents.getHandlerName(player.getName()));
}
}
@@ -0,0 +1,50 @@
package io.github.retrooper.packetevents.handler;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.utils.NMSUtils;
import io.netty.channel.*;
import org.bukkit.entity.Player;
import java.util.concurrent.Future;
final class NettyPacketHandler_8 {
public static void injectPlayer(final Player player) {
final ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
Object packet = NettyPacketHandler.read(player, msg);
if (packet == null) {
return;
}
super.channelRead(ctx, msg);
}
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
Object packet = NettyPacketHandler.write(player, msg);
if (packet == null) {
return;
}
super.write(ctx, msg, promise);
}
};
final ChannelPipeline pipeline = ((Channel) NMSUtils.getChannel(player)).pipeline();
pipeline.addBefore("packet_handler", PacketEvents.getHandlerName(player.getName()), channelDuplexHandler);
}
public static Future<?> uninjectPlayer(final Player player) {
final Channel channel = (Channel) NMSUtils.getChannel(player);
return channel.eventLoop().submit(new Runnable() {
@Override
public void run() {
channel.pipeline().remove(PacketEvents.getHandlerName(player.getName()));
}
});
}
public static void uninjectPlayerNow(final Player player) {
final Channel channel = (Channel) NMSUtils.getChannel(player);
channel.pipeline().remove(PacketEvents.getHandlerName(player.getName()));
}
}
@@ -1,131 +0,0 @@
package io.github.retrooper.packetevents.injector;
import io.github.retrooper.packetevents.enums.ServerVersion;
import org.bukkit.entity.Player;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.UUID;
public class ChannelManager {
private static final ServerVersion version = ServerVersion.getVersion();
private static final String nmsDir = ServerVersion.getNMSDirectory();
private static final Class<?> networkManager;
private static final Field channelField;
private static final Class<?> craftPlayer;
private static final Method handleMethod;
private static final Class<?> entityPlayer;
private static final Class<?> playerConnection;
private static final Field playerConnectionField;
private static final Field networkManagerField;
private static HashMap<UUID, Object> playerChannels = new HashMap<>();
static {
try {
networkManager = Class.forName(nmsDir + ".NetworkManager");
craftPlayer = Class.forName("org.bukkit.craftbukkit." + ServerVersion.getNmsSuffix() + ".entity.CraftPlayer");
entityPlayer = Class.forName(nmsDir + ".EntityPlayer");
playerConnection = Class.forName(nmsDir + ".PlayerConnection");
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw new IllegalStateException("Failed to find a NMS class! You are probably using an unsupported version of spigot.");
}
try {
channelField = networkManager.getDeclaredField(getChannelFieldName());
} catch (NoSuchFieldException e) {
e.printStackTrace();
throw new IllegalStateException("Failed to find the channel field in the NetworkManager! You are probably using an unsupported version of spigot.");
}
if (!channelField.isAccessible()) {
channelField.setAccessible(true);
}
try {
handleMethod = craftPlayer.getMethod("getHandle");
} catch (NoSuchMethodException e) {
e.printStackTrace();
throw new IllegalStateException("Failed to find the getHandle function in the CraftPlayer class! You are probably using an unsupported version of spigot.");
}
try {
playerConnectionField = entityPlayer.getDeclaredField("playerConnection");
} catch (NoSuchFieldException e) {
e.printStackTrace();
throw new IllegalStateException("Failed to find the playerConnection field in the EntityPlayer class! You are probably using an unsupported version of spigot.");
}
if (!playerConnectionField.isAccessible()) {
playerConnectionField.setAccessible(true);
}
try {
networkManagerField = playerConnection.getDeclaredField("networkManager");
} catch (NoSuchFieldException e) {
e.printStackTrace();
throw new IllegalStateException("Failed to find the networkManager field in the PlayerConnection class! You are probably using an unsupported version of spigot.");
}
if (!networkManagerField.isAccessible()) {
networkManagerField.setAccessible(true);
}
}
private static Object getChannelObject(final Player player) throws IllegalAccessException, InvocationTargetException {
final Object craftPlayerObj = craftPlayer.cast(player);
final Object entityPlayerObj = handleMethod.invoke(craftPlayerObj);
final Object playerConnectionObj = playerConnectionField.get(entityPlayerObj);
final Object networkManagerObj = networkManagerField.get(playerConnectionObj);
return channelField.get(networkManagerObj);
}
public static void removeChannel(final UUID uuid) {
playerChannels.remove(uuid);
}
public static boolean contains(final Player player) {
return playerChannels.containsKey(player.getUniqueId());
}
public static Object getChannel(final Player player) {
final UUID uuid = player.getUniqueId();
if (contains(player)) {
return playerChannels.get(uuid);
}
Object channel = null;
try {
channel = getChannelObject(player);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
if (channel != null) {
playerChannels.put(uuid, channel);
} else {
System.out.println("ITS NULL");
}
return channel;
}
private static String getChannelFieldName() {
if (version == ServerVersion.v_1_7_10) {
return "m";
} else if (version == ServerVersion.v_1_8) {
return "i";
} else if (version == ServerVersion.v_1_8_3) {
return "k";
} else { //all 1.8.8 ->1.15
return "channel";
}
}
}
@@ -1,31 +0,0 @@
package io.github.retrooper.packetevents.injector;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.enums.ServerVersion;
import org.bukkit.entity.Player;
public class PacketInjector {
private final static ServerVersion version = PacketEvents.getServerVersion();
public void injectPlayer(final Player player) {
if(version == ServerVersion.v_1_7_10) {
PlayerInject_1_7_10.injectPlayer(player);
}
else {
PlayerInject_1_8.injectPlayer(player);
}
}
public void uninjectPlayer(final Player player) {
if(version == ServerVersion.v_1_7_10) {
PlayerInject_1_7_10.uninjectPlayer(player);
}
else {
PlayerInject_1_8.uninjectPlayer(player);
}
ChannelManager.removeChannel(player.getUniqueId());
}
}
@@ -1,62 +0,0 @@
package io.github.retrooper.packetevents.injector;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.event.impl.PacketReceiveEvent;
import io.github.retrooper.packetevents.event.impl.PacketSendEvent;
import io.github.retrooper.packetevents.event.impl.PlayerInjectEvent;
import io.github.retrooper.packetevents.event.impl.PlayerUninjectEvent;
import net.minecraft.util.io.netty.channel.Channel;
import net.minecraft.util.io.netty.channel.ChannelDuplexHandler;
import net.minecraft.util.io.netty.channel.ChannelHandlerContext;
import net.minecraft.util.io.netty.channel.ChannelPromise;
import org.bukkit.entity.Player;
class PlayerInject_1_7_10 {
public static void injectPlayer(final Player player) {
final ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() {
@Override
public void channelRead(final ChannelHandlerContext ctx, final Object packet) throws Exception {
String packetName = packet.getClass().getSimpleName();
PacketReceiveEvent e = new PacketReceiveEvent(player, packetName, packet);
PacketEvents.getEventManager().callEvent(e);
if (e.isCancelled()) {
return;
}
super.channelRead(ctx, packet);
}
@Override
public void write(final ChannelHandlerContext ctx, final Object packet, final ChannelPromise promise) throws Exception {
String packetName = packet.getClass().getSimpleName();
PacketSendEvent e = new PacketSendEvent(player, packetName, packet);
PacketEvents.getEventManager().callEvent(e);
if (e.isCancelled()) {
return;
}
super.write(ctx, packet, promise);
}
};
final PlayerInjectEvent injectEvent = new PlayerInjectEvent(player);
PacketEvents.getEventManager().callEvent(injectEvent);
getChannel(player).pipeline().addBefore("packet_handler", player.getName(), channelDuplexHandler);
}
public static void uninjectPlayer(final Player player) {
final Channel channel = getChannel(player);
final Runnable runnable = new Runnable() {
@Override
public void run() {
channel.pipeline().remove(player.getName());
}
};
final PlayerUninjectEvent uninjectEvent = new PlayerUninjectEvent(player);
PacketEvents.getEventManager().callEvent(uninjectEvent);
channel.eventLoop().submit(runnable);
}
public static Channel getChannel(final Player player) {
return (Channel) ChannelManager.getChannel(player);
}
}
@@ -1,62 +0,0 @@
package io.github.retrooper.packetevents.injector;
import io.github.retrooper.packetevents.event.impl.PacketReceiveEvent;
import io.github.retrooper.packetevents.event.impl.PacketSendEvent;
import io.github.retrooper.packetevents.event.impl.PlayerInjectEvent;
import io.github.retrooper.packetevents.event.impl.PlayerUninjectEvent;
import io.netty.channel.Channel;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.github.retrooper.packetevents.PacketEvents;
import org.bukkit.entity.Player;
class PlayerInject_1_8 {
public static void injectPlayer(final Player player) {
final ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() {
@Override
public void channelRead(final ChannelHandlerContext ctx, final Object packet) throws Exception {
String packetName = packet.getClass().getSimpleName();
PacketReceiveEvent e = new PacketReceiveEvent(player, packetName, packet);
PacketEvents.getEventManager().callEvent(e);
if (e.isCancelled()) {
return;
}
super.channelRead(ctx, packet);
}
@Override
public void write(final ChannelHandlerContext ctx, final Object packet, final ChannelPromise promise) throws Exception {
String packetName = packet.getClass().getSimpleName();
PacketSendEvent e = new PacketSendEvent(player, packetName, packet);
PacketEvents.getEventManager().callEvent(e);
if (e.isCancelled()) {
return;
}
super.write(ctx, packet, promise);
}
};
final PlayerInjectEvent injectEvent = new PlayerInjectEvent(player);
PacketEvents.getEventManager().callEvent(injectEvent);
getChannel(player).pipeline().addBefore("packet_handler", player.getName(), channelDuplexHandler);
}
public static void uninjectPlayer(final Player player) {
final Channel channel = getChannel(player);
final Runnable runnable = new Runnable() {
@Override
public void run() {
channel.pipeline().remove(player.getName());
}
};
final PlayerUninjectEvent uninjectEvent = new PlayerUninjectEvent(player);
PacketEvents.getEventManager().callEvent(uninjectEvent);
channel.eventLoop().submit(runnable);
}
public static Channel getChannel(final Player player) {
return (Channel) ChannelManager.getChannel(player);
}
}
@@ -1,81 +0,0 @@
package io.github.retrooper.packetevents.packet;
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";
public static final String LOOK = c + "Look";
public static final String CLIENT_COMMAND = c + "ClientCommand";
public static final String TRANSACTION = c + "Transaction";
public static final String BLOCK_DIG = c + "BlockDig";
public static final String ENTITY_ACTION = c + "EntityAction";
public static final String USE_ENTITY = c + "UseEntity";
public static final String WINDOW_CLICK = c + "WindowClick";
public static final String STEER_VEHICLE = c + "SteerVehicle";
public static final String CUSTOM_PAYLOAD = c + "CustomPayload";
public static final String ARM_ANIMATION = c + "ArmAnimation";
public static final String BLOCK_PLACE = c + "BlockPlace";
public static final String ABILITIES = c + "Abilities";
public static final String HELD_ITEM_SLOT = c + "HeldItemSlot";
public static final String CLOSE_WINDOW = c + "CloseWindow";
public static final String TAB_COMPLETE = c + "TabComplete";
public static final String CHAT = c + "Chat";
public static final String SET_CREATIVE_SLOT = c + "SetCreativeSlot";
public static final String KEEP_ALIVE = c + "KeepAlive";
}
public static class Server {
private static final String s = "PacketPlayOut";
public static final String ANIMATION = s + "Animation";
public static final String KEEP_ALIVE = s + "KeepAlive";
public static final String CHAT = s + "Chat";
public static final String POSITION = s + "Position";
public static final String TRANSACTION = s + "Transaction";
public static final String NAMED_ENTITY_SPAWN = s + "NamedEntitySpawn";
public static final String SPAWN_ENTITY_LIVING = s + "SpawnEntityLiving";
public static final String SPAWN_ENTITY = s + "SpawnEntity";
public static final String CUSTOM_PAYLOAD = s + "CustomPayload";
public static final String ABILITIES = s + "Abilities";
public static final String ENTITY_METADATA = s + "EntityMetadata";
public static final String ENTITY_VELOCITY = s + "EntityVelocity";
public static final String ENTITY_DESTROY = s + "EntityDestroy";
public static final String ENTITY_HEAD_ROTATION = s + "EntityHeadRotation";
public static final String BLOCK_CHANGE = s + "BlockChange";
public static final String CLOSE_WINDOW = s + "CloseWindow";
public static final String HELD_ITEM_SLOT = s + "HeldItemSlot";
public static final String TAB_COMPLETE = s + "TabComplete";
public static final String RESPAWN = s + "Respawn";
public static final String WORLD_PARTICLES = s + "WorldParticles";
public static final String COMMANDS = s + "Commands";
public static final String OPEN_WINDOW = s + "OpenWindow";
public static final String LOGIN = s + "Login";
public static final String SERVER_DIFFICULTY = s + "ServerDifficulty";
}
public static class Login {
public static final String HANDSHAKE = "PacketHandshakingInSetProtocol";
public static final String PING = "PacketStatusInPing";
public static final String START = "PacketStatusInStart";
public static final String SUCCESS = "PacketLoginOutSuccess";
}
public static 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;
}
return fatherPacket.equals(childPacket);
}
}
@@ -0,0 +1,211 @@
package io.github.retrooper.packetevents.packet;
import java.util.HashMap;
import java.util.Map;
public class PacketType {
public static class Client {
public static class Util {
public static boolean isInstanceOfFlying(final byte packetId) {
return packetId == FLYING
|| packetId == POSITION
|| packetId == POSITION_LOOK
|| packetId == LOOK;
}
}
public static final Map<Class<?>, Byte> packetIds = new HashMap<Class<?>, Byte>();
public static final byte TELEPORT_ACCEPT = 0,
TILE_NBT_QUERY = 1, DIFFICULTY_CHANGE = 2, CHAT = 3, CLIENT_COMMAND = 4,
SETTINGS = 5, TAB_COMPLETE = 6, TRANSACTION = 7, ENCHANT_ITEM = 8,
WINDOW_CLICK = 9, CLOSE_WINDOW = 10, CUSTOM_PAYLOAD = 11, B_EDIT = 12,
ENTITY_NBT_QUERY = 13, USE_ENTITY = 14, JIGSAW_GENERATE = 15, KEEP_ALIVE = 16,
DIFFICULTY_LOCK = 17, POSITION = 18, POSITION_LOOK = 19, LOOK = 20,
FLYING = 21, VEHICLE_MOVE = 22, BOAT_MOVE = 23, PICK_ITEM = 24,
AUTO_RECIPE = 25, ABILITIES = 26, BLOCK_DIG = 27, ENTITY_ACTION = 28,
STEER_VEHICLE = 29, RECIPE_DISPLAYED = 30, ITEM_NAME = 31, RESOURCE_PACK_STATUS = 32,
ADVANCEMENTS = 33, TR_SEL = 34, BEACON = 35, HELD_ITEM_SLOT = 36,
SET_COMMAND_BLOCK = 37, SET_COMMAND_MINECART = 38, SET_CREATIVE_SLOT = 39, SET_JIGSAW = 40,
STRUCT = 41, UPDATE_SIGN = 42, ARM_ANIMATION = 43, SPECTATE = 44,
USE_ITEM = 45, BLOCK_PLACE = 46;
public static void init() {
packetIds.put(PacketTypeClasses.Client.TELEPORT_ACCEPT, TELEPORT_ACCEPT);
packetIds.put(PacketTypeClasses.Client.TILE_NBT_QUERY, TILE_NBT_QUERY);
packetIds.put(PacketTypeClasses.Client.DIFFICULTY_CHANGE, DIFFICULTY_CHANGE);
packetIds.put(PacketTypeClasses.Client.CHAT, CHAT);
packetIds.put(PacketTypeClasses.Client.CLIENT_COMMAND, CLIENT_COMMAND);
packetIds.put(PacketTypeClasses.Client.SETTINGS, SETTINGS);
packetIds.put(PacketTypeClasses.Client.TAB_COMPLETE, TAB_COMPLETE);
packetIds.put(PacketTypeClasses.Client.TRANSACTION, TRANSACTION);
packetIds.put(PacketTypeClasses.Client.ENCHANT_ITEM, ENCHANT_ITEM);
packetIds.put(PacketTypeClasses.Client.WINDOW_CLICK, WINDOW_CLICK);
packetIds.put(PacketTypeClasses.Client.CLOSE_WINDOW, CLOSE_WINDOW);
packetIds.put(PacketTypeClasses.Client.CUSTOM_PAYLOAD, CUSTOM_PAYLOAD);
packetIds.put(PacketTypeClasses.Client.B_EDIT, B_EDIT);
packetIds.put(PacketTypeClasses.Client.ENTITY_NBT_QUERY, ENTITY_NBT_QUERY);
packetIds.put(PacketTypeClasses.Client.USE_ENTITY, USE_ENTITY);
packetIds.put(PacketTypeClasses.Client.JIGSAW_GENERATE, JIGSAW_GENERATE);
packetIds.put(PacketTypeClasses.Client.KEEP_ALIVE, KEEP_ALIVE);
packetIds.put(PacketTypeClasses.Client.DIFFICULTY_LOCK, DIFFICULTY_LOCK);
packetIds.put(PacketTypeClasses.Client.POSITION, POSITION);
packetIds.put(PacketTypeClasses.Client.POSITION_LOOK, POSITION_LOOK);
packetIds.put(PacketTypeClasses.Client.LOOK, LOOK);
packetIds.put(PacketTypeClasses.Client.FLYING, FLYING);
packetIds.put(PacketTypeClasses.Client.VEHICLE_MOVE, VEHICLE_MOVE);
packetIds.put(PacketTypeClasses.Client.BOAT_MOVE, BOAT_MOVE);
packetIds.put(PacketTypeClasses.Client.PICK_ITEM, PICK_ITEM);
packetIds.put(PacketTypeClasses.Client.AUTO_RECIPE, AUTO_RECIPE);
packetIds.put(PacketTypeClasses.Client.ABILITIES, ABILITIES);
packetIds.put(PacketTypeClasses.Client.BLOCK_DIG, BLOCK_DIG);
packetIds.put(PacketTypeClasses.Client.ENTITY_ACTION, ENTITY_ACTION);
packetIds.put(PacketTypeClasses.Client.STEER_VEHICLE, STEER_VEHICLE);
packetIds.put(PacketTypeClasses.Client.RECIPE_DISPLAYED, RECIPE_DISPLAYED);
packetIds.put(PacketTypeClasses.Client.ITEM_NAME, ITEM_NAME);
packetIds.put(PacketTypeClasses.Client.RESOURCE_PACK_STATUS, RESOURCE_PACK_STATUS);
packetIds.put(PacketTypeClasses.Client.ADVANCEMENTS, ADVANCEMENTS);
packetIds.put(PacketTypeClasses.Client.TR_SEL, TR_SEL);
packetIds.put(PacketTypeClasses.Client.BEACON, BEACON);
packetIds.put(PacketTypeClasses.Client.HELD_ITEM_SLOT, HELD_ITEM_SLOT);
packetIds.put(PacketTypeClasses.Client.SET_COMMAND_BLOCK, SET_COMMAND_BLOCK);
packetIds.put(PacketTypeClasses.Client.SET_COMMAND_MINECART, SET_COMMAND_MINECART);
packetIds.put(PacketTypeClasses.Client.SET_CREATIVE_SLOT, SET_CREATIVE_SLOT);
packetIds.put(PacketTypeClasses.Client.SET_JIGSAW, SET_JIGSAW);
packetIds.put(PacketTypeClasses.Client.STRUCT, STRUCT);
packetIds.put(PacketTypeClasses.Client.UPDATE_SIGN, UPDATE_SIGN);
packetIds.put(PacketTypeClasses.Client.ARM_ANIMATION, ARM_ANIMATION);
packetIds.put(PacketTypeClasses.Client.SPECTATE, SPECTATE);
packetIds.put(PacketTypeClasses.Client.USE_ITEM, USE_ITEM);
packetIds.put(PacketTypeClasses.Client.BLOCK_PLACE, BLOCK_PLACE);
}
}
public static class Server {
public static final Map<Class<?>, Byte> packetIds = new HashMap<Class<?>, Byte>();
public static byte SPAWN_ENTITY = 0, SPAWN_ENTITY_EXPERIENCE_ORB = 1, SPAWN_ENTITY_WEATHER = 2, SPAWN_ENTITY_LIVING = 3,
SPAWN_ENTITY_PAINTING = 4, SPAWN_ENTITY_SPAWN = 5, ANIMATION = 6, STATISTIC = 7,
BLOCK_BREAK = 8, BLOCK_BREAK_ANIMATION = 9, TILE_ENTITY_DATA = 10, BLOCK_ACTION = 11,
BLOCK_CHANGE = 12, BOSS = 13, SERVER_DIFFICULTY = 14, CHAT = 15, MULTI_BLOCK_CHANGE = 16,
TAB_COMPLETE = 17, COMMANDS = 18, TRANSACTION = 19, CLOSE_WINDOW = 20,
WINDOW_ITEMS = 21, WINDOW_DATA = 22, SET_SLOT = 23, SET_COOLDOWN = 24,
CUSTOM_PAYLOAD = 25, CUSTOM_SOUND_EFFECT = 26, KICK_DISCONNECT = 27, ENTITY_STATUS = 28,
EXPLOSION = 29, UNLOAD_CHUNK = 30, GAME_STATE_CHANGE = 31, OPEN_WINDOW_HORSE = 32,
KEEP_ALIVE = 33, MAP_CHUNK = 34, WORLD_EVENT = 35, WORLD_PARTICLES = 36,
LIGHT_UPDATE = 37, LOGIN = 38, MAP = 39, OPEN_WINDOW_MERCHANT = 40,
REL_ENTITY_MOVE = 41, REL_ENTITY_MOVE_LOOK = 42, ENTITY_LOOK = 43, ENTITY = 44,
VEHICLE_MOVE = 45, OPEN_BOOK = 46, OPEN_WINDOW = 47, OPEN_SIGN_EDITOR = 48,
AUTO_RECIPE = 49, ABILITIES = 50, COMBAT_EVENT = 51, PLAYER_INFO = 52,
LOOK_AT = 53, POSITION = 54, RECIPES = 55, ENTITY_DESTROY = 56,
REMOVE_ENTITY_EFFECT = 57, RESOURCE_PACK_SEND = 58, RESPAWN = 59, ENTITY_HEAD_ROTATION = 60,
SELECT_ADVANCEMENT_TAB = 61, WORLD_BORDER = 62, CAMERA = 63, HELD_ITEM_SLOT = 64,
VIEW_CENTRE = 65, VIEW_DISTANCE = 66, SCOREBOARD_DISPLAY_OBJECTIVE = 67, ENTITY_METADATA = 68,
ATTACH_ENTITY = 69, ENTITY_VELOCITY = 70, ENTITY_EQUIPMENT = 71, EXPERIENCE = 72,
UPDATE_HEALTH = 73, SCOREBOARD_OBJECTIVE = 74, MOUNT = 75, SCOREBOARD_TEAM = 76,
SCOREBOARD_SCORE = 77, SPAWN_POSITION = 78, UPDATE_TIME = 79, TITLE = 80,
ENTITY_SOUND = 81, NAMED_SOUND_EFFECT = 82, STOP_SOUND = 83, PLAYER_LIST_HEADER_FOOTER = 84,
NBT_QUERY = 85, COLLECT = 86, ENTITY_TELEPORT = 87, ADVANCEMENTS = 88, UPDATE_ATTRIBUTES = 89,
ENTITY_EFFECT = 90, RECIPE_UPDATE = 91, TAGS = 92, MAP_CHUNK_BULK = 93;
public static void init() {
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY, SPAWN_ENTITY);
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY_EXPERIENCE_ORB, SPAWN_ENTITY_EXPERIENCE_ORB);
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY_WEATHER, SPAWN_ENTITY_WEATHER);
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY_LIVING, SPAWN_ENTITY_LIVING);
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY_PAINTING, SPAWN_ENTITY_PAINTING);
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY_SPAWN, SPAWN_ENTITY_SPAWN);
packetIds.put(PacketTypeClasses.Server.ANIMATION, ANIMATION);
packetIds.put(PacketTypeClasses.Server.STATISTIC, STATISTIC);
packetIds.put(PacketTypeClasses.Server.BLOCK_BREAK, BLOCK_BREAK);
packetIds.put(PacketTypeClasses.Server.BLOCK_BREAK_ANIMATION, BLOCK_BREAK_ANIMATION);
packetIds.put(PacketTypeClasses.Server.TILE_ENTITY_DATA, TILE_ENTITY_DATA);
packetIds.put(PacketTypeClasses.Server.BLOCK_ACTION, BLOCK_ACTION);
packetIds.put(PacketTypeClasses.Server.BLOCK_CHANGE, BLOCK_CHANGE);
packetIds.put(PacketTypeClasses.Server.BOSS, BOSS);
packetIds.put(PacketTypeClasses.Server.SPAWN_ENTITY, SPAWN_ENTITY);
packetIds.put(PacketTypeClasses.Server.SERVER_DIFFICULTY, SERVER_DIFFICULTY);
packetIds.put(PacketTypeClasses.Server.CHAT, CHAT);
packetIds.put(PacketTypeClasses.Server.MULTI_BLOCK_CHANGE, MULTI_BLOCK_CHANGE);
packetIds.put(PacketTypeClasses.Server.TAB_COMPLETE, TAB_COMPLETE);
packetIds.put(PacketTypeClasses.Server.COMMANDS, COMMANDS);
packetIds.put(PacketTypeClasses.Server.TRANSACTION, TRANSACTION);
packetIds.put(PacketTypeClasses.Server.CLOSE_WINDOW, CLOSE_WINDOW);
packetIds.put(PacketTypeClasses.Server.WINDOW_ITEMS, WINDOW_ITEMS);
packetIds.put(PacketTypeClasses.Server.WINDOW_DATA, WINDOW_DATA);
packetIds.put(PacketTypeClasses.Server.SET_SLOT, SET_SLOT);
packetIds.put(PacketTypeClasses.Server.CUSTOM_PAYLOAD, CUSTOM_PAYLOAD);
packetIds.put(PacketTypeClasses.Server.CUSTOM_SOUND_EFFECT, CUSTOM_SOUND_EFFECT);
packetIds.put(PacketTypeClasses.Server.KICK_DISCONNECT, KICK_DISCONNECT);
packetIds.put(PacketTypeClasses.Server.ENTITY_STATUS, ENTITY_STATUS);
packetIds.put(PacketTypeClasses.Server.EXPLOSION, EXPLOSION);
packetIds.put(PacketTypeClasses.Server.UNLOAD_CHUNK, UNLOAD_CHUNK);
packetIds.put(PacketTypeClasses.Server.GAME_STATE_CHANGE, GAME_STATE_CHANGE);
packetIds.put(PacketTypeClasses.Server.OPEN_WINDOW_HORSE, OPEN_WINDOW_HORSE);
packetIds.put(PacketTypeClasses.Server.KEEP_ALIVE, KEEP_ALIVE);
packetIds.put(PacketTypeClasses.Server.MAP_CHUNK, MAP_CHUNK);
packetIds.put(PacketTypeClasses.Server.WORLD_EVENT, SPAWN_ENTITY);
packetIds.put(PacketTypeClasses.Server.WORLD_PARTICLES, WORLD_PARTICLES);
packetIds.put(PacketTypeClasses.Server.LIGHT_UPDATE, LIGHT_UPDATE);
packetIds.put(PacketTypeClasses.Server.LOGIN, LOGIN);
packetIds.put(PacketTypeClasses.Server.MAP, MAP);
packetIds.put(PacketTypeClasses.Server.OPEN_WINDOW_MERCHANT, OPEN_WINDOW_MERCHANT);
packetIds.put(PacketTypeClasses.Server.REL_ENTITY_MOVE, REL_ENTITY_MOVE);
packetIds.put(PacketTypeClasses.Server.REL_ENTITY_MOVE_LOOK, REL_ENTITY_MOVE_LOOK);
packetIds.put(PacketTypeClasses.Server.ENTITY_LOOK, ENTITY_LOOK);
packetIds.put(PacketTypeClasses.Server.ENTITY, ENTITY);
packetIds.put(PacketTypeClasses.Server.VEHICLE_MOVE, VEHICLE_MOVE);
packetIds.put(PacketTypeClasses.Server.OPEN_BOOK, OPEN_BOOK);
packetIds.put(PacketTypeClasses.Server.OPEN_WINDOW, OPEN_WINDOW);
packetIds.put(PacketTypeClasses.Server.OPEN_SIGN_EDITOR, OPEN_SIGN_EDITOR);
packetIds.put(PacketTypeClasses.Server.AUTO_RECIPE, AUTO_RECIPE);
packetIds.put(PacketTypeClasses.Server.ABILITIES, ABILITIES);
packetIds.put(PacketTypeClasses.Server.COMBAT_EVENT, COMBAT_EVENT);
packetIds.put(PacketTypeClasses.Server.PLAYER_INFO, PLAYER_INFO);
packetIds.put(PacketTypeClasses.Server.LOOK_AT, LOOK_AT);
packetIds.put(PacketTypeClasses.Server.POSITION, POSITION);
packetIds.put(PacketTypeClasses.Server.RECIPES, RECIPES);
packetIds.put(PacketTypeClasses.Server.ENTITY_DESTROY, ENTITY_DESTROY);
packetIds.put(PacketTypeClasses.Server.REMOVE_ENTITY_EFFECT, REMOVE_ENTITY_EFFECT);
packetIds.put(PacketTypeClasses.Server.RESOURCE_PACK_SEND, RESOURCE_PACK_SEND);
packetIds.put(PacketTypeClasses.Server.RESPAWN, RESPAWN);
packetIds.put(PacketTypeClasses.Server.ENTITY_HEAD_ROTATION, ENTITY_HEAD_ROTATION);
packetIds.put(PacketTypeClasses.Server.SELECT_ADVANCEMENT_TAB, SELECT_ADVANCEMENT_TAB);
packetIds.put(PacketTypeClasses.Server.WORLD_BORDER, WORLD_BORDER);
packetIds.put(PacketTypeClasses.Server.CAMERA, CAMERA);
packetIds.put(PacketTypeClasses.Server.HELD_ITEM_SLOT, HELD_ITEM_SLOT);
packetIds.put(PacketTypeClasses.Server.VIEW_CENTRE, VIEW_CENTRE);
packetIds.put(PacketTypeClasses.Server.VIEW_DISTANCE, VIEW_DISTANCE);
packetIds.put(PacketTypeClasses.Server.SCOREBOARD_DISPLAY_OBJECTIVE, SCOREBOARD_DISPLAY_OBJECTIVE);
packetIds.put(PacketTypeClasses.Server.ENTITY_METADATA, ENTITY_METADATA);
packetIds.put(PacketTypeClasses.Server.ATTACH_ENTITY, ATTACH_ENTITY);
packetIds.put(PacketTypeClasses.Server.ENTITY_VELOCITY, ENTITY_VELOCITY);
packetIds.put(PacketTypeClasses.Server.ENTITY_EQUIPMENT, ENTITY_EQUIPMENT);
packetIds.put(PacketTypeClasses.Server.EXPERIENCE, EXPERIENCE);
packetIds.put(PacketTypeClasses.Server.UPDATE_HEALTH, UPDATE_HEALTH);
packetIds.put(PacketTypeClasses.Server.SCOREBOARD_OBJECTIVE, SCOREBOARD_OBJECTIVE);
packetIds.put(PacketTypeClasses.Server.MOUNT, MOUNT);
packetIds.put(PacketTypeClasses.Server.SCOREBOARD_TEAM, SCOREBOARD_TEAM);
packetIds.put(PacketTypeClasses.Server.SCOREBOARD_SCORE, SCOREBOARD_SCORE);
packetIds.put(PacketTypeClasses.Server.SPAWN_POSITION, SPAWN_POSITION);
packetIds.put(PacketTypeClasses.Server.UPDATE_TIME, UPDATE_TIME);
packetIds.put(PacketTypeClasses.Server.TITLE, TITLE);
packetIds.put(PacketTypeClasses.Server.ENTITY_SOUND, ENTITY_SOUND);
packetIds.put(PacketTypeClasses.Server.NAMED_SOUND_EFFECT, NAMED_SOUND_EFFECT);
packetIds.put(PacketTypeClasses.Server.STOP_SOUND, STOP_SOUND);
packetIds.put(PacketTypeClasses.Server.PLAYER_LIST_HEADER_FOOTER, PLAYER_LIST_HEADER_FOOTER);
packetIds.put(PacketTypeClasses.Server.NBT_QUERY, NBT_QUERY);
packetIds.put(PacketTypeClasses.Server.COLLECT, COLLECT);
packetIds.put(PacketTypeClasses.Server.ENTITY_TELEPORT, ENTITY_TELEPORT);
packetIds.put(PacketTypeClasses.Server.ADVANCEMENTS, ADVANCEMENTS);
packetIds.put(PacketTypeClasses.Server.UPDATE_ATTRIBUTES, UPDATE_ATTRIBUTES);
packetIds.put(PacketTypeClasses.Server.ENTITY_EFFECT, ENTITY_EFFECT);
packetIds.put(PacketTypeClasses.Server.RECIPE_UPDATE, RECIPE_UPDATE);
packetIds.put(PacketTypeClasses.Server.TAGS, TAGS);
packetIds.put(PacketTypeClasses.Server.MAP_CHUNK_BULK, MAP_CHUNK_BULK);
}
}
}
@@ -0,0 +1,234 @@
package io.github.retrooper.packetevents.packet;
import io.github.retrooper.packetevents.annotations.Nullable;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
public class PacketTypeClasses {
public static class Client {
public static Class<?> POSITION, POSITION_LOOK, LOOK, CLIENT_COMMAND,
TRANSACTION, BLOCK_DIG, ENTITY_ACTION, USE_ENTITY,
WINDOW_CLICK, STEER_VEHICLE, CUSTOM_PAYLOAD, ARM_ANIMATION,
BLOCK_PLACE, USE_ITEM, ABILITIES, HELD_ITEM_SLOT,
CLOSE_WINDOW, TAB_COMPLETE, CHAT, SET_CREATIVE_SLOT,
KEEP_ALIVE, SETTINGS, ENCHANT_ITEM, TELEPORT_ACCEPT,
TILE_NBT_QUERY, DIFFICULTY_CHANGE, B_EDIT, ENTITY_NBT_QUERY,
JIGSAW_GENERATE, DIFFICULTY_LOCK, VEHICLE_MOVE, BOAT_MOVE, PICK_ITEM,
AUTO_RECIPE, RECIPE_DISPLAYED, ITEM_NAME, RESOURCE_PACK_STATUS,
ADVANCEMENTS, TR_SEL, BEACON, SET_COMMAND_BLOCK,
SET_COMMAND_MINECART, SET_JIGSAW, STRUCT, UPDATE_SIGN, SPECTATE;
private static final String c = "PacketPlayIn";
@Nullable
public static final Class<?> FLYING = NMSUtils.getNMSClassWithoutException(c + "Flying");
public static void load() {
try {
POSITION = NMSUtils.getNMSClass(c + "Position");
POSITION_LOOK = NMSUtils.getNMSClass(c + "PositionLook");
LOOK = NMSUtils.getNMSClass(c + "Look");
} catch (ClassNotFoundException e) {
POSITION = Reflection.getSubClass(FLYING, c + "Position");
POSITION_LOOK = Reflection.getSubClass(FLYING, c + "PositionLook");
LOOK = Reflection.getSubClass(FLYING, c + "Look");
}
try {
SETTINGS = NMSUtils.getNMSClass(c + "Settings");
ENCHANT_ITEM = NMSUtils.getNMSClass(c + "EnchantItem");
CLIENT_COMMAND = NMSUtils.getNMSClass(c + "ClientCommand");
TRANSACTION = NMSUtils.getNMSClass(c + "Transaction");
BLOCK_DIG = NMSUtils.getNMSClass(c + "BlockDig");
ENTITY_ACTION = NMSUtils.getNMSClass(c + "EntityAction");
USE_ENTITY = NMSUtils.getNMSClass(c + "UseEntity");
WINDOW_CLICK = NMSUtils.getNMSClass(c + "WindowClick");
STEER_VEHICLE = NMSUtils.getNMSClass(c + "SteerVehicle");
CUSTOM_PAYLOAD = NMSUtils.getNMSClass(c + "CustomPayload");
ARM_ANIMATION = NMSUtils.getNMSClass(c + "ArmAnimation");
ABILITIES = NMSUtils.getNMSClass(c + "Abilities");
HELD_ITEM_SLOT = NMSUtils.getNMSClass(c + "HeldItemSlot");
CLOSE_WINDOW = NMSUtils.getNMSClass(c + "CloseWindow");
TAB_COMPLETE = NMSUtils.getNMSClass(c + "TabComplete");
CHAT = NMSUtils.getNMSClass(c + "Chat");
SET_CREATIVE_SLOT = NMSUtils.getNMSClass(c + "SetCreativeSlot");
KEEP_ALIVE = NMSUtils.getNMSClass(c + "KeepAlive");
UPDATE_SIGN = NMSUtils.getNMSClassWithoutException(c + "UpdateSign");
TELEPORT_ACCEPT = NMSUtils.getNMSClassWithoutException(c + "TeleportAccept");
TILE_NBT_QUERY = NMSUtils.getNMSClassWithoutException(c + "TileNBTQuery");
DIFFICULTY_CHANGE = NMSUtils.getNMSClassWithoutException(c + "DifficultyChange");
B_EDIT = NMSUtils.getNMSClassWithoutException(c + "BEdit");
ENTITY_NBT_QUERY = NMSUtils.getNMSClassWithoutException(c + "EntityNBTQuery");
JIGSAW_GENERATE = NMSUtils.getNMSClassWithoutException(c + "JigsawGenerate");
DIFFICULTY_LOCK = NMSUtils.getNMSClassWithoutException(c + "DifficultyLock");
VEHICLE_MOVE = NMSUtils.getNMSClassWithoutException(c + "VehicleMove");
BOAT_MOVE = NMSUtils.getNMSClassWithoutException(c + "BoatMove");
PICK_ITEM = NMSUtils.getNMSClassWithoutException(c + "PickItem");
AUTO_RECIPE = NMSUtils.getNMSClassWithoutException(c + "AutoRecipe");
RECIPE_DISPLAYED = NMSUtils.getNMSClassWithoutException(c + "RecipeDisplayed");
ITEM_NAME = NMSUtils.getNMSClassWithoutException(c + "ItemName");
//1.8+
RESOURCE_PACK_STATUS = NMSUtils.getNMSClassWithoutException(c + "ResourcePackStatus");
ADVANCEMENTS = NMSUtils.getNMSClassWithoutException(c + "Advancements");
TR_SEL = NMSUtils.getNMSClassWithoutException(c + "TrSel");
BEACON = NMSUtils.getNMSClassWithoutException(c + "Beacon");
SET_COMMAND_BLOCK = NMSUtils.getNMSClassWithoutException(c + "SetCommandBlock");
SET_COMMAND_MINECART = NMSUtils.getNMSClassWithoutException(c + "SetCommandMinecart");
SET_JIGSAW = NMSUtils.getNMSClassWithoutException(c + "SetJigsaw");
STRUCT = NMSUtils.getNMSClassWithoutException(c + "Struct");
SPECTATE = NMSUtils.getNMSClassWithoutException(c + "Spectate");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//Block place
try {
BLOCK_PLACE = NMSUtils.getNMSClass(c + "BlockPlace");
} catch (ClassNotFoundException e) {
//They are just on a newer version
try {
USE_ITEM = NMSUtils.getNMSClass(c + "UseItem");
} catch (ClassNotFoundException e2) {
e.printStackTrace();
e2.printStackTrace();
}
}
PacketType.Client.init();
}
}
public static class Server {
private static final String s = "PacketPlayOut";
public static Class<?> SPAWN_ENTITY, SPAWN_ENTITY_EXPERIENCE_ORB, SPAWN_ENTITY_WEATHER, SPAWN_ENTITY_LIVING,
SPAWN_ENTITY_PAINTING, SPAWN_ENTITY_SPAWN, ANIMATION, STATISTIC,
BLOCK_BREAK, BLOCK_BREAK_ANIMATION, TILE_ENTITY_DATA, BLOCK_ACTION,
BLOCK_CHANGE, BOSS, SERVER_DIFFICULTY, CHAT, MULTI_BLOCK_CHANGE,
TAB_COMPLETE, COMMANDS, TRANSACTION, CLOSE_WINDOW,
WINDOW_ITEMS, WINDOW_DATA, SET_SLOT, SET_COOLDOWN,
CUSTOM_PAYLOAD, CUSTOM_SOUND_EFFECT, KICK_DISCONNECT, ENTITY_STATUS,
EXPLOSION, UNLOAD_CHUNK, GAME_STATE_CHANGE, OPEN_WINDOW_HORSE,
KEEP_ALIVE, MAP_CHUNK, WORLD_EVENT, WORLD_PARTICLES,
LIGHT_UPDATE, LOGIN, MAP, OPEN_WINDOW_MERCHANT,
REL_ENTITY_MOVE, REL_ENTITY_MOVE_LOOK, ENTITY_LOOK, ENTITY,
VEHICLE_MOVE, OPEN_BOOK, OPEN_WINDOW, OPEN_SIGN_EDITOR,
AUTO_RECIPE, ABILITIES, COMBAT_EVENT, PLAYER_INFO,
LOOK_AT, POSITION, RECIPES, ENTITY_DESTROY,
REMOVE_ENTITY_EFFECT, RESOURCE_PACK_SEND, RESPAWN, ENTITY_HEAD_ROTATION,
SELECT_ADVANCEMENT_TAB, WORLD_BORDER, CAMERA, HELD_ITEM_SLOT,
VIEW_CENTRE, VIEW_DISTANCE, SCOREBOARD_DISPLAY_OBJECTIVE, ENTITY_METADATA,
ATTACH_ENTITY, ENTITY_VELOCITY, ENTITY_EQUIPMENT, EXPERIENCE,
UPDATE_HEALTH, SCOREBOARD_OBJECTIVE, MOUNT, SCOREBOARD_TEAM,
SCOREBOARD_SCORE, SPAWN_POSITION, UPDATE_TIME, TITLE,
ENTITY_SOUND, NAMED_SOUND_EFFECT, STOP_SOUND, PLAYER_LIST_HEADER_FOOTER,
NBT_QUERY, COLLECT, ENTITY_TELEPORT, ADVANCEMENTS, UPDATE_ATTRIBUTES,
ENTITY_EFFECT, RECIPE_UPDATE, TAGS, MAP_CHUNK_BULK;
public static void load() {
SPAWN_ENTITY = NMSUtils.getNMSClassWithoutException(s + "SpawnEntity");
SPAWN_ENTITY_EXPERIENCE_ORB = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityExperienceOrb");
SPAWN_ENTITY_WEATHER = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityWeather");
SPAWN_ENTITY_LIVING = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityLiving");
SPAWN_ENTITY_PAINTING = NMSUtils.getNMSClassWithoutException(s + "SpawnEntityPainting");
SPAWN_ENTITY_SPAWN = NMSUtils.getNMSClassWithoutException(s + "SpawnEntitySpawn");
ANIMATION = NMSUtils.getNMSClassWithoutException(s + "Animation");
STATISTIC = NMSUtils.getNMSClassWithoutException(s + "Statistic");
BLOCK_BREAK = NMSUtils.getNMSClassWithoutException(s + "BlockBreak");
BLOCK_BREAK_ANIMATION = NMSUtils.getNMSClassWithoutException(s + "BlockBreakAnimation");
TILE_ENTITY_DATA = NMSUtils.getNMSClassWithoutException(s + "TileEntityData");
BLOCK_ACTION = NMSUtils.getNMSClassWithoutException(s + "BlockAction");
BLOCK_CHANGE = NMSUtils.getNMSClassWithoutException(s + "BlockChange");
BOSS = NMSUtils.getNMSClassWithoutException(s + "Boss");
SERVER_DIFFICULTY = NMSUtils.getNMSClassWithoutException(s + "ServerDifficulty");
CHAT = NMSUtils.getNMSClassWithoutException(s + "Chat");
MULTI_BLOCK_CHANGE = NMSUtils.getNMSClassWithoutException(s + "MultiBlockChange");
TAB_COMPLETE = NMSUtils.getNMSClassWithoutException(s + "TabComplete");
COMMANDS = NMSUtils.getNMSClassWithoutException(s + "Commands");
TRANSACTION = NMSUtils.getNMSClassWithoutException(s + "Transaction");
CLOSE_WINDOW = NMSUtils.getNMSClassWithoutException(s + "CloseWindow");
WINDOW_ITEMS = NMSUtils.getNMSClassWithoutException(s + "WindowItems");
WINDOW_DATA = NMSUtils.getNMSClassWithoutException(s + "WindowData");
SET_SLOT = NMSUtils.getNMSClassWithoutException(s + "SetSlot");
SET_COOLDOWN = NMSUtils.getNMSClassWithoutException(s + "SetCooldown");
CUSTOM_PAYLOAD = NMSUtils.getNMSClassWithoutException(s + "CustomPayload");
CUSTOM_SOUND_EFFECT = NMSUtils.getNMSClassWithoutException(s + "CustomSoundEffect");
KICK_DISCONNECT = NMSUtils.getNMSClassWithoutException(s + "KickDisconnect");
ENTITY_STATUS = NMSUtils.getNMSClassWithoutException(s + "EntityStatus");
EXPLOSION = NMSUtils.getNMSClassWithoutException(s + "Explosion");
UNLOAD_CHUNK = NMSUtils.getNMSClassWithoutException(s + "UnloadChunk");
GAME_STATE_CHANGE = NMSUtils.getNMSClassWithoutException(s + "GameStateChange");
OPEN_WINDOW_HORSE = NMSUtils.getNMSClassWithoutException(s + "OpenWindowHorse");
KEEP_ALIVE = NMSUtils.getNMSClassWithoutException(s + "KeepAlive");
MAP_CHUNK = NMSUtils.getNMSClassWithoutException(s + "MapChunk");
WORLD_EVENT = NMSUtils.getNMSClassWithoutException(s + "WorldEvent");
WORLD_PARTICLES = NMSUtils.getNMSClassWithoutException(s + "WorldParticles");
LIGHT_UPDATE = NMSUtils.getNMSClassWithoutException(s + "LightUpdate");
LOGIN = NMSUtils.getNMSClassWithoutException(s + "Login");
MAP = NMSUtils.getNMSClassWithoutException(s + "Map");
OPEN_WINDOW_MERCHANT = NMSUtils.getNMSClassWithoutException(s + "OpenWindowMerchant");
ENTITY = NMSUtils.getNMSClassWithoutException(s + "Entity");
REL_ENTITY_MOVE = Reflection.getSubClass(ENTITY, s + "RelEntityMove");
REL_ENTITY_MOVE_LOOK = Reflection.getSubClass(ENTITY, s + "RelEntityMoveLook");
ENTITY_LOOK = Reflection.getSubClass(ENTITY, s + "EntityLook");
if (REL_ENTITY_MOVE == null) {
//is not a subclass and should be accessed normally
REL_ENTITY_MOVE = NMSUtils.getNMSClassWithoutException(s + "RelEntityMove");
REL_ENTITY_MOVE_LOOK = NMSUtils.getNMSClassWithoutException(s + "RelEntityMoveLook");
ENTITY_LOOK = NMSUtils.getNMSClassWithoutException(s + "RelEntityLook");
}
VEHICLE_MOVE = NMSUtils.getNMSClassWithoutException(s + "VehicleMove");
OPEN_BOOK = NMSUtils.getNMSClassWithoutException(s + "OpenBook");
OPEN_WINDOW = NMSUtils.getNMSClassWithoutException(s + "OpenWindow");
OPEN_SIGN_EDITOR = NMSUtils.getNMSClassWithoutException(s + "OpenSignEditor");
AUTO_RECIPE = NMSUtils.getNMSClassWithoutException(s + "AutoRecipe");
ABILITIES = NMSUtils.getNMSClassWithoutException(s + "Abilities");
COMBAT_EVENT = NMSUtils.getNMSClassWithoutException(s + "CombatEvent");
PLAYER_INFO = NMSUtils.getNMSClassWithoutException(s + "PlayerInfo");
LOOK_AT = NMSUtils.getNMSClassWithoutException(s + "LookAt");
POSITION = NMSUtils.getNMSClassWithoutException(s + "Position");
RECIPES = NMSUtils.getNMSClassWithoutException(s + "Recipes");
ENTITY_DESTROY = NMSUtils.getNMSClassWithoutException(s + "EntityDestroy");
REMOVE_ENTITY_EFFECT = NMSUtils.getNMSClassWithoutException(s + "RemoveEntityEffect");
RESOURCE_PACK_SEND = NMSUtils.getNMSClassWithoutException(s + "ResourcePackSend");
RESPAWN = NMSUtils.getNMSClassWithoutException(s + "Respawn");
ENTITY_HEAD_ROTATION = NMSUtils.getNMSClassWithoutException(s + "EntityHeadRotation");
SELECT_ADVANCEMENT_TAB = NMSUtils.getNMSClassWithoutException(s + "SelectAdvancementTab");
WORLD_BORDER = NMSUtils.getNMSClassWithoutException(s + "WorldBorder");
CAMERA = NMSUtils.getNMSClassWithoutException(s + "Camera");
HELD_ITEM_SLOT = NMSUtils.getNMSClassWithoutException(s + "HeldItemSlot");
VIEW_CENTRE = NMSUtils.getNMSClassWithoutException(s + "ViewCentre");
VIEW_DISTANCE = NMSUtils.getNMSClassWithoutException(s + "ViewDistance");
SCOREBOARD_DISPLAY_OBJECTIVE = NMSUtils.getNMSClassWithoutException(s + "ScoreboardDisplayObjective");
ENTITY_METADATA = NMSUtils.getNMSClassWithoutException(s + "EntityMetadata");
ATTACH_ENTITY = NMSUtils.getNMSClassWithoutException(s + "AttachEntity");
ENTITY_VELOCITY = NMSUtils.getNMSClassWithoutException(s + "EntityVelocity");
ENTITY_EQUIPMENT = NMSUtils.getNMSClassWithoutException(s + "EntityEquipment");
EXPERIENCE = NMSUtils.getNMSClassWithoutException(s + "Experience");
UPDATE_HEALTH = NMSUtils.getNMSClassWithoutException(s + "UpdateHealth");
SCOREBOARD_OBJECTIVE = NMSUtils.getNMSClassWithoutException(s + "ScoreboardObjective");
MOUNT = NMSUtils.getNMSClassWithoutException(s + "Mount");
SCOREBOARD_TEAM = NMSUtils.getNMSClassWithoutException(s + "ScoreboardTeam");
SCOREBOARD_SCORE = NMSUtils.getNMSClassWithoutException(s + "ScoreboardScore");
SPAWN_POSITION = NMSUtils.getNMSClassWithoutException(s + "SpawnPosition");
UPDATE_TIME = NMSUtils.getNMSClassWithoutException(s + "UpdateTime");
TITLE = NMSUtils.getNMSClassWithoutException(s + "Title");
ENTITY_SOUND = NMSUtils.getNMSClassWithoutException(s + "EntitySound");
NAMED_SOUND_EFFECT = NMSUtils.getNMSClassWithoutException(s + "NamedSoundEffect");
STOP_SOUND = NMSUtils.getNMSClassWithoutException(s + "StopSound");
PLAYER_LIST_HEADER_FOOTER = NMSUtils.getNMSClassWithoutException(s + "PlayerListHeaderFooter");
NBT_QUERY = NMSUtils.getNMSClassWithoutException(s + "NBTQuery");
COLLECT = NMSUtils.getNMSClassWithoutException(s + "Collect");
ENTITY_TELEPORT = NMSUtils.getNMSClassWithoutException(s + "EntityTeleport");
ADVANCEMENTS = NMSUtils.getNMSClassWithoutException(s + "Advancements");
UPDATE_ATTRIBUTES = NMSUtils.getNMSClassWithoutException(s + "UpdateAttributes");
ENTITY_EFFECT = NMSUtils.getNMSClassWithoutException(s + "EntityEffect");
RECIPE_UPDATE = NMSUtils.getNMSClassWithoutException(s + "RecipeUpdate");
TAGS = NMSUtils.getNMSClassWithoutException(s + "Tags");
MAP_CHUNK_BULK = NMSUtils.getNMSClassWithoutException(s + "MapChunkBulk");
PacketType.Server.init();
}
}
}
@@ -0,0 +1,5 @@
package io.github.retrooper.packetevents.packetwrappers;
public interface Sendable {
Object asNMSPacket();
}
@@ -4,17 +4,13 @@ import io.github.retrooper.packetevents.enums.ServerVersion;
import org.bukkit.entity.Player;
public class WrappedPacket {
private final Player player;
protected Object packet;
protected static ServerVersion version = ServerVersion.getVersion();
private static final String err = "Your Version is unsupported, " +
"please contact explored " +
"through his discord server (http://discord.gg/2uZY5A4) " +
"and tell him what version your server is running on! " +
"Make sure you are using spigot!";
protected final Player player;
protected Object packet;
public WrappedPacket(final Object packet) {
this.player = null;
if (packet == null) return;
this.packet = packet;
try {
setup();
@@ -25,6 +21,7 @@ public class WrappedPacket {
public WrappedPacket(final Player player, final Object packet) {
this.player = player;
if (packet == null) return;
this.packet = packet;
try {
setup();
@@ -33,16 +30,8 @@ public class WrappedPacket {
}
}
protected void setup() throws Exception {
protected void setup() {
}
protected void throwUnsupportedVersion() {
throw new IllegalStateException(err);
}
public Player getPlayer() {
return player;
}
}
@@ -1,11 +1,21 @@
package io.github.retrooper.packetevents.packetwrappers.in.abilities;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Field;
public final class WrappedPacketInAbilities extends WrappedPacket {
private static Class<?> abilitiesClass;
static {
try {
abilitiesClass = NMSUtils.getNMSClass("PacketPlayInAbilities");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public class WrappedPacketInAbilities extends WrappedPacket {
private boolean isVulnerable;
private boolean isFlying;
private boolean allowFly;
@@ -18,13 +28,17 @@ public class WrappedPacketInAbilities extends WrappedPacket {
}
@Override
protected void setup() throws IllegalAccessException {
this.isVulnerable = fields[0].getBoolean(packet);
this.isFlying = fields[1].getBoolean(packet);
this.allowFly = fields[2].getBoolean(packet);
this.instantBuild = fields[3].getBoolean(packet);
this.flySpeed = fields[4].getFloat(packet);
this.walkSpeed = fields[5].getFloat(packet);
protected void setup() {
try {
this.isVulnerable = Reflection.getField(abilitiesClass, boolean.class, 0).getBoolean(packet);
this.isFlying = Reflection.getField(abilitiesClass, boolean.class, 1).getBoolean(packet);
this.allowFly = Reflection.getField(abilitiesClass, boolean.class, 2).getBoolean(packet);
this.instantBuild = Reflection.getField(abilitiesClass, boolean.class, 3).getBoolean(packet);
this.flySpeed = Reflection.getField(abilitiesClass, float.class, 0).getFloat(packet);
this.walkSpeed = Reflection.getField(abilitiesClass, float.class, 1).getFloat(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public boolean isVulnerable() {
@@ -35,7 +49,7 @@ public class WrappedPacketInAbilities extends WrappedPacket {
return isFlying;
}
public boolean canFly() {
public boolean isFlightAllowed() {
return allowFly;
}
@@ -50,35 +64,4 @@ public class WrappedPacketInAbilities extends WrappedPacket {
public float getWalkSpeed() {
return walkSpeed;
}
private static Class<?> abilitiesClass;
private static Field[] fields = new Field[6];
static {
try {
abilitiesClass = NMSUtils.getNMSClass("PacketPlayInAbilities");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
fields[0] = abilitiesClass.getDeclaredField("a");
fields[1] = abilitiesClass.getDeclaredField("b");
fields[2] = abilitiesClass.getDeclaredField("c");
fields[3] = abilitiesClass.getDeclaredField("d");
fields[4] = abilitiesClass.getDeclaredField("e");
fields[5] = abilitiesClass.getDeclaredField("f");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
for (Field f : fields) {
if (f != null) {
f.setAccessible(true);
}
}
}
}
@@ -1,16 +1,36 @@
package io.github.retrooper.packetevents.packetwrappers.in.blockdig;
import io.github.retrooper.packetevents.enums.PlayerDigType;
import io.github.retrooper.packetevents.enums.Direction;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.enums.minecraft.PlayerDigType;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.utils.BaseBlockUtils;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import io.github.retrooper.packetevents.utils.vector.Vector3i;
import io.github.retrooper.packetevents.enums.Direction;
import java.lang.reflect.Field;
public final class WrappedPacketInBlockDig extends WrappedPacket {
private static Class<?> blockDigClass, blockPositionClass, enumDirectionClass, digTypeClass;
static {
try {
blockDigClass = NMSUtils.getNMSClass("PacketPlayInBlockDig");
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
blockPositionClass = NMSUtils.getNMSClass("BlockPosition");
enumDirectionClass = NMSUtils.getNMSClass("EnumDirection");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
digTypeClass = NMSUtils.getNMSClass("EnumPlayerDigType");
} catch (ClassNotFoundException e) {
//It is probably a subclass
digTypeClass = Reflection.getSubClass(blockDigClass, "EnumPlayerDigType");
}
}
public class WrappedPacketInBlockDig extends WrappedPacket {
private Vector3i blockPosition;
private Direction direction;
private PlayerDigType digType;
@@ -19,41 +39,43 @@ public class WrappedPacketInBlockDig extends WrappedPacket {
super(packet);
}
@Override
protected void setup() throws Exception {
final Direction enumDirection;
final PlayerDigType enumDigType;
protected void setup() {
Direction enumDirection = null;
PlayerDigType enumDigType = null;
//1.7.10
if (version == ServerVersion.v_1_7_10) {
final int x = fields[0].getInt(packet);
final int y = fields[1].getInt(packet);
final int z = fields[2].getInt(packet);
try {
if (version.isLowerThan(ServerVersion.v_1_8)) {
setupCoordinates(blockDigClass, packet);
enumDirection = Direction.get(Reflection.getField(digTypeClass, int.class, 3).getInt(packet));
enumDigType = PlayerDigType.get(Reflection.getField(digTypeClass, int.class, 4).getInt(packet));
} else {
//1.8+
final Object blockPosObj = Reflection.getField(blockDigClass, blockPositionClass, 0).get(packet);
final Object enumDirectionObj = Reflection.getField(blockDigClass, enumDirectionClass, 0).get(packet);
final Object digTypeObj = Reflection.getField(blockDigClass, digTypeClass, 0).get(packet);
this.blockPosition = new Vector3i(x, y, z);
Class<?> blockPosSuper = blockPositionClass;
setupCoordinates(blockPosSuper, blockPosObj);
enumDirection = Direction.get((byte) face.getInt(packet));
enumDigType = PlayerDigType.get((byte)e.getInt(packet));
} else {
//1.8+
final Object blockPosObj = fields[0].get(packet);
final Object enumDirectionObj = fields[1].get(packet);
final Object digTypeObj = fields[2].get(packet);
final int x = blockPosXYZ[0].getInt(blockPosObj);
final int y = blockPosXYZ[1].getInt(blockPosObj);
final int z = blockPosXYZ[2].getInt(blockPosObj);
this.blockPosition = new Vector3i(x, y, z);
enumDirection = Direction.valueOf(((Enum)enumDirectionObj).name());
enumDigType = PlayerDigType.valueOf(((Enum)digTypeObj).name());
enumDirection = Direction.valueOf(((Enum) enumDirectionObj).name());
enumDigType = PlayerDigType.valueOf(((Enum) digTypeObj).name());
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
this.direction = enumDirection;
this.direction = enumDirection;
this.digType = enumDigType;
}
private void setupCoordinates(final Class<?> cls, final Object object) throws IllegalAccessException {
final int x = Reflection.getField(cls, int.class, 0).getInt(object);
final int y = Reflection.getField(cls, int.class, 1).getInt(object);
final int z = Reflection.getField(cls, int.class, 2).getInt(object);
this.blockPosition = new Vector3i(x, y, z);
}
public Vector3i getBlockPosition() {
return blockPosition;
}
@@ -66,74 +88,5 @@ public class WrappedPacketInBlockDig extends WrappedPacket {
return digType;
}
//ALL
private static Class<?> blockDigClass;
//1.8
private static Field[] fields = new Field[3];
private static Class<?> blockPositionClass;
private static Field[] blockPosXYZ = new Field[3];
//1.7
private static Field face;
private static Field e;
static {
try {
blockDigClass = NMSUtils.getNMSClass("PacketPlayInBlockDig");
if (version != ServerVersion.v_1_7_10) {
blockPositionClass = NMSUtils.getNMSClass("BlockPosition");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//blockpos
fields[0] = blockDigClass.getDeclaredField("a");
//direction
fields[1] = blockDigClass.getDeclaredField("b");
//digtype
fields[2] = blockDigClass.getDeclaredField("c");
if (version != ServerVersion.v_1_7_10) {
blockPosXYZ[0] = blockPositionClass.getSuperclass().getDeclaredField(BaseBlockUtils.getPosXFieldName());
blockPosXYZ[1] = blockPositionClass.getSuperclass().getDeclaredField(BaseBlockUtils.getPosXFieldName());
blockPosXYZ[2] = blockPositionClass.getSuperclass().getDeclaredField(BaseBlockUtils.getPosZFieldName());
} else {
face = blockDigClass.getDeclaredField("face");
e = blockDigClass.getDeclaredField("e");
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
for(Field f : fields) {
if(f != null) {
f.setAccessible(true);
}
}
for(Field f : blockPosXYZ) {
if(f != null) {
f.setAccessible(true);
}
}
if(e != null) {
e.setAccessible(true);
}
if(face != null) {
face.setAccessible(true);
}
}
}
@@ -1,7 +1,5 @@
package io.github.retrooper.packetevents.packetwrappers.in.blockplace;
import io.github.retrooper.packetevents.enums.Direction;
import io.github.retrooper.packetevents.enums.Hand;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.utils.vector.Vector3i;
@@ -10,10 +8,14 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public class WrappedPacketInBlockPlace extends WrappedPacket {
public final class WrappedPacketInBlockPlace extends WrappedPacket {
static {
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
WrappedPacketInBlockPlace_1_8.initStatic();
}
}
private Vector3i blockPosition;
private Hand hand;
private Direction direction;
private ItemStack itemStack;
public WrappedPacketInBlockPlace(final Player player, final Object packet) {
@@ -21,55 +23,42 @@ public class WrappedPacketInBlockPlace extends WrappedPacket {
}
@Override
protected void setup() throws Exception {
protected void setup() {
//1.7.10
final Direction direction;
final Vector3i position;
final ItemStack itemStack;
final Hand hand;
if (version.isHigherThan(ServerVersion.v_1_8_8)) {
final WrappedPacketInBlockPlace_1_9 updatedBlockPlace = new WrappedPacketInBlockPlace_1_9(getPlayer(), packet);
final Block block = updatedBlockPlace.getBlock();
position = new Vector3i(block.getX(), block.getY(), block.getZ());
hand = updatedBlockPlace.getHand();
itemStack = new ItemStack(block.getType());
// init direction
} else {
final WrappedPacketInBlockPlace_Legacy legacyBlockPlace = new WrappedPacketInBlockPlace_Legacy(packet);
position = legacyBlockPlace.getBlockPosition();
hand = legacyBlockPlace.getHand();
itemStack = legacyBlockPlace.getItemStack();
//init direction
Vector3i position = null;
ItemStack itemStack = null;
try {
if (version.isHigherThan(ServerVersion.v_1_8_8)) {
final WrappedPacketInBlockPlace_1_9 blockPlace_1_9 = new WrappedPacketInBlockPlace_1_9(getPlayer(), packet);
final Block block = blockPlace_1_9.getBlock();
position = new Vector3i(block.getX(), block.getY(), block.getZ());
itemStack = new ItemStack(block.getType());
} else if (version.isHigherThan(ServerVersion.v_1_7_10)) {
final WrappedPacketInBlockPlace_1_8 blockPlace_1_8 = new WrappedPacketInBlockPlace_1_8(packet);
position = blockPlace_1_8.getBlockPosition();
itemStack = blockPlace_1_8.getItemStack();
} else {
final WrappedPacketInBlockPlace_1_7_10 blockPlace_1_7_10 = new WrappedPacketInBlockPlace_1_7_10(getPlayer(), packet);
position = blockPlace_1_7_10.getBlockPosition();
this.itemStack = blockPlace_1_7_10.getItemStack();
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
this.direction = Direction.NULL;
this.blockPosition = position;
this.itemStack = itemStack;
this.hand = hand;
}
public Player getPlayer() {
return this.player;
}
public Vector3i getBlockPosition() {
return blockPosition;
}
public Hand getHand() {
return hand;
}
public ItemStack getItemStack() {
return itemStack;
}
@Deprecated
public Direction getDirection() {
return direction;
}
static {
if (version.isHigherThan(ServerVersion.v_1_8_8)) {
WrappedPacketInBlockPlace_1_9.setupStaticVars();
} else {
WrappedPacketInBlockPlace_Legacy.setupStaticVars();
}
}
}
@@ -0,0 +1,42 @@
package io.github.retrooper.packetevents.packetwrappers.in.blockplace;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.utils.vector.Vector3i;
import net.minecraft.server.v1_7_R4.PacketPlayInBlockPlace;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
final class WrappedPacketInBlockPlace_1_7_10 extends WrappedPacket {
private Vector3i blockPosition;
private ItemStack itemStack;
private int blockFace;
WrappedPacketInBlockPlace_1_7_10(final Player player, final Object packet) {
super(player, packet);
}
@Override
protected void setup() {
final PacketPlayInBlockPlace blockPlace = (PacketPlayInBlockPlace) packet;
this.blockPosition = new Vector3i(blockPlace.c(), blockPlace.d(), blockPlace.e());
this.blockFace = blockPlace.d();
net.minecraft.server.v1_7_R4.ItemStack stack = blockPlace.getItemStack();
this.itemStack = org.bukkit.craftbukkit.v1_7_R4.inventory.CraftItemStack.asBukkitCopy(stack);
}
public Vector3i getBlockPosition() {
return blockPosition;
}
public ItemStack getItemStack() {
return itemStack;
}
public int getBlockFace() {
return blockFace;
}
}
@@ -0,0 +1,56 @@
package io.github.retrooper.packetevents.packetwrappers.in.blockplace;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import io.github.retrooper.packetevents.utils.vector.Vector3i;
import org.bukkit.inventory.ItemStack;
import java.lang.reflect.InvocationTargetException;
final class WrappedPacketInBlockPlace_1_8 extends WrappedPacket {
private static Class<?> blockPlaceClass, blockPositionClass;
private Vector3i blockPosition;
private ItemStack itemStack;
WrappedPacketInBlockPlace_1_8(final Object packet) {
super(packet);
}
protected static void initStatic() {
try {
blockPlaceClass = NMSUtils.getNMSClass("PacketPlayInBlockPlace");
blockPositionClass = NMSUtils.getNMSClass("BlockPosition");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
@Override
protected void setup() {
try {
Object nmsBlockPos = Reflection.getField(blockPlaceClass, blockPositionClass, 1).get(packet);
final int[] coords = new int[3];
for (int i = 0; i < 3; i++) {
final String s = "get" + (i == 0 ? "X" : i == 1 ? "Y" : "Z");
coords[i] = (int) Reflection.getMethod(blockPositionClass.getSuperclass(), s, 0).invoke(nmsBlockPos);
}
this.blockPosition = new Vector3i(coords[0], coords[1], coords[2]);
this.itemStack = NMSUtils.toBukkitItemStack(Reflection.getField(blockPlaceClass, NMSUtils.nmsItemStackClass, 0).get(packet));
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
public Vector3i getBlockPosition() {
return blockPosition;
}
public ItemStack getItemStack() {
return itemStack;
}
}
@@ -1,61 +1,31 @@
package io.github.retrooper.packetevents.packetwrappers.in.blockplace;
import io.github.retrooper.packetevents.enums.Hand;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.utils.BlockFinder;
import io.github.retrooper.packetevents.utils.NMSUtils;
import io.github.retrooper.packetevents.utils.BlockIteratorUtils;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import java.lang.reflect.Field;
class WrappedPacketInBlockPlace_1_9 extends WrappedPacket {
final class WrappedPacketInBlockPlace_1_9 extends WrappedPacket {
private Block block;
private Hand hand;
public WrappedPacketInBlockPlace_1_9(final Player player, final Object packet) {
super(player, packet);
}
@Override
protected void setup() throws Exception {
this.block = BlockFinder.getBlocksInDirection(getPlayer(), 10);
final Object enumHandObj = enumHandField.get(packet);
this.hand = Hand.valueOf(enumHandObj.toString());
protected void setup() {
this.block = BlockIteratorUtils.getBlockLookingAt(getPlayer(), 3);
}
public Hand getHand() {
return hand;
public Player getPlayer() {
return this.player;
}
public Block getBlock() {
return block;
}
private static Class<?> blockPlaceClass_1_9;
private static Field enumHandField;
protected static void setupStaticVars() {
try {
blockPlaceClass_1_9 = NMSUtils.getNMSClass("PacketPlayInBlockPlace");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
enumHandField = blockPlaceClass_1_9.getDeclaredField("a");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
if(!enumHandField.isAccessible()) {
enumHandField.setAccessible(true);
}
}
}
@@ -1,148 +0,0 @@
package io.github.retrooper.packetevents.packetwrappers.in.blockplace;
import io.github.retrooper.packetevents.enums.Hand;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.utils.BaseBlockUtils;
import io.github.retrooper.packetevents.utils.NMSUtils;
import io.github.retrooper.packetevents.utils.vector.Vector3i;
import org.bukkit.inventory.ItemStack;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class WrappedPacketInBlockPlace_Legacy extends WrappedPacket {
private Vector3i blockPosition;
private ItemStack itemStack;
private Hand hand;
WrappedPacketInBlockPlace_Legacy(final Object packet) {
super(packet);
}
@Override
protected void setup() throws Exception {
final Hand hand = Hand.MAIN_HAND;
final ItemStack itemStack;
final int x, y, z;
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
final Object nmsBlockPosObj = fields[0].get(packet);
x = blockPosXYZ[0].getInt(nmsBlockPosObj);
y = blockPosXYZ[1].getInt(nmsBlockPosObj);
z = blockPosXYZ[2].getInt(nmsBlockPosObj);
Object nmsItemStackObj = fields[1].get(packet);
Object craftItemStack = asBukkitCopyMethod.invoke(null, nmsItemStackObj);
itemStack = (ItemStack) craftItemStack;
}
//1.7.10
else {
x = fields_1_7[0].getInt(packet);
y = fields_1_7[1].getInt(packet);
z = fields_1_7[2].getInt(packet);
Object nmsItemStackObj = fields_1_7[3].get(packet);
Object craftItemStack = asBukkitCopyMethod.invoke(null, nmsItemStackObj);
itemStack = (ItemStack) craftItemStack;
}
this.hand = hand;
this.itemStack = itemStack;
this.blockPosition = new Vector3i(x, y, z);
}
public Hand getHand() {
return hand;
}
public ItemStack getItemStack() {
return itemStack;
}
public Vector3i getBlockPosition() {
return blockPosition;
}
private static Class<?> blockPlaceClass;
private static Class<?> itemStackClass;
private static Class<?> craftItemStackClass;
private static Class<?> blockPositionClass;
private static Field[] fields = new Field[2];
private static Field[] fields_1_7 = new Field[4];
private static Field[] blockPosXYZ = new Field[3];
private static Method asBukkitCopyMethod;
protected static void setupStaticVars() {
try {
blockPlaceClass = NMSUtils.getNMSClass("PacketPlayInBlockPlace");
itemStackClass = NMSUtils.getNMSClass("ItemStack");
craftItemStackClass = NMSUtils.getOBCClass("inventory.CraftItemStack");
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
blockPositionClass = NMSUtils.getNMSClass("BlockPosition");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
asBukkitCopyMethod = craftItemStackClass.getMethod("asBukkitCopy", itemStackClass);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
try {
if (version.isLowerThan(ServerVersion.v_1_8)) {
//x
fields_1_7[0] = blockPlaceClass.getDeclaredField("a");
//y
fields_1_7[1] = blockPlaceClass.getDeclaredField("b");
//z
fields_1_7[2] = blockPlaceClass.getDeclaredField("c");
//itemstack
fields_1_7[3] = blockPlaceClass.getDeclaredField("e");
} else {
//block pos
fields[0] = blockPlaceClass.getDeclaredField("b");
//itemstack
fields[1] = blockPlaceClass.getDeclaredField("d");
blockPosXYZ[0] = blockPositionClass.getSuperclass().getDeclaredField(BaseBlockUtils.getPosXFieldName());
blockPosXYZ[1] = blockPositionClass.getSuperclass().getDeclaredField(BaseBlockUtils.getPosYFieldName());
blockPosXYZ[2] = blockPositionClass.getSuperclass().getDeclaredField(BaseBlockUtils.getPosZFieldName());
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
for (Field f : fields) {
if (f != null) {
f.setAccessible(true);
}
}
for (Field f : fields_1_7) {
if (f != null) {
f.setAccessible(true);
}
}
for (Field f : blockPosXYZ) {
if (f != null) {
f.setAccessible(true);
}
}
}
}
@@ -1,53 +1,38 @@
package io.github.retrooper.packetevents.packetwrappers.in.chat;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Field;
public final class WrappedPacketInChat extends WrappedPacket {
private static Class<?> chatPacketClass;
static {
try {
chatPacketClass = NMSUtils.getNMSClass("PacketPlayInChat");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public class WrappedPacketInChat extends WrappedPacket {
private String message;
public WrappedPacketInChat(Object packet) {
super(packet);
}
@Override
protected void setup() throws IllegalAccessException {
final Object obj = field.get(packet);
this.message = obj.toString();
protected void setup() {
try {
final Object obj = Reflection.getField(chatPacketClass, String.class, 0).get(packet);
this.message = obj.toString();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public String getMessage() {
return message;
}
private static Class<?> chatPacketClass;
private static Field field;
static {
try {
chatPacketClass = NMSUtils.getNMSClass("PacketPlayInChat");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
field = chatPacketClass.getDeclaredField(getChatFieldName());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
field.setAccessible(true);
}
private static String getChatFieldName() {
if (version == ServerVersion.v_1_7_10) {
return "message";
}
return "a";
}
}
@@ -1,16 +1,36 @@
package io.github.retrooper.packetevents.packetwrappers.in.entityaction;
import io.github.retrooper.packetevents.enums.PlayerAction;
import io.github.retrooper.packetevents.annotations.Nullable;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.enums.minecraft.PlayerAction;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import org.bukkit.entity.Entity;
public final class WrappedPacketInEntityAction extends WrappedPacket {
private static Class<?> entityActionClass;
@Nullable
private static Class<?> enumPlayerActionClass;
import javax.annotation.Nullable;
import java.lang.reflect.Field;
static {
try {
entityActionClass = NMSUtils.getNMSClass("PacketPlayInEntityAction");
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
for (final Class<?> sub : entityActionClass.getDeclaredClasses()) {
if (sub.getSimpleName().equals("EnumPlayerAction")) {
enumPlayerActionClass = sub;
break;
}
}
} else {
enumPlayerActionClass = NMSUtils.getNMSClass("EnumPlayerAction");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public class WrappedPacketInEntityAction extends WrappedPacket {
private Entity entity;
private int entityId;
private PlayerAction action;
@@ -21,36 +41,43 @@ public class WrappedPacketInEntityAction extends WrappedPacket {
}
@Override
protected void setup() throws Exception {
final int entityId = fields[0].getInt(packet);
final int jumpBoost = fields[2].getInt(packet);
protected void setup() {
try {
final int entityId = Reflection.getField(entityActionClass, int.class, 0).getInt(packet);
final int jumpBoost;
if (version.isLowerThan(ServerVersion.v_1_8)) {
jumpBoost = Reflection.getField(entityActionClass, int.class, 2).getInt(packet);
} else {
jumpBoost = Reflection.getField(entityActionClass, int.class, 1).getInt(packet);
}
int animationIndex = -1;
int animationIndex = -1;
//1.7.10
if (version.isLowerThan(ServerVersion.v_1_8)) {
animationIndex = fields[1].getInt(packet);
} else {
final Object enumObj = fields[1].get(packet);
final Object[] enumValues = enumPlayerActionConstants;
final int len = enumValues.length;
for (int i = 0; i < len; i++) {
final Object val = enumValues[i];
if (val.toString().equals(enumObj.toString())) {
animationIndex = i;
break;
//1.7.10
if (version.isLowerThan(ServerVersion.v_1_8)) {
animationIndex = Reflection.getField(entityActionClass, int.class, 1).getInt(packet);
} else {
final Object enumObj = Reflection.getField(entityActionClass, enumPlayerActionClass, 0).get(packet);
final String enumValue = enumObj.toString();
try {
this.action = PlayerAction.valueOf(enumValue);
} catch (IllegalArgumentException e) {
//They aren't on a legacy version and the enum has changed
final PlayerAction.UpdatedPlayerAction updatedPlayerAction = PlayerAction.UpdatedPlayerAction.valueOf(enumValue);
this.action = PlayerAction.get(updatedPlayerAction.getIndex());
}
}
this.entityId = entityId;
this.jumpBoost = jumpBoost;
if (animationIndex != -1) {
this.action = PlayerAction.get(animationIndex);
}
this.entity = NMSUtils.getEntityById(this.entityId);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
this.entityId = entityId;
this.action = action;
this.jumpBoost = jumpBoost;
this.action = PlayerAction.get((byte) animationIndex);
this.entity = NMSUtils.getEntityById(this.entityId);
}
public Entity getEntity() {
@@ -68,41 +95,4 @@ public class WrappedPacketInEntityAction extends WrappedPacket {
public int getJumpBoost() {
return jumpBoost;
}
private static Class<?> entityActionClass;
@Nullable
private static Class<?> enumPlayerActionClass;
private static Field[] fields = new Field[3];
@Nullable
private static Object[] enumPlayerActionConstants;
static {
try {
entityActionClass = NMSUtils.getNMSClass("PacketPlayInEntityAction");
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
enumPlayerActionClass = NMSUtils.getNMSClass("PacketPlayInEntityAction$EnumPlayerAction");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
//ints in 1.7.10, EnumPlayerAction in 1.8+
fields[0] = entityActionClass.getDeclaredField("a");
fields[1] = entityActionClass.getDeclaredField("animation");
fields[2] = entityActionClass.getDeclaredField("c");
if (version.isHigherThan(ServerVersion.v_1_7_10)) {
enumPlayerActionConstants = enumPlayerActionClass.getEnumConstants();
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
for (final Field f : fields) {
f.setAccessible(true);
}
}
}
@@ -1,14 +1,21 @@
package io.github.retrooper.packetevents.packetwrappers.in.flying;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Field;
public class WrappedPacketInFlying extends WrappedPacket {
private static Class<?> flyingClass;
static {
try {
flyingClass = NMSUtils.getNMSClass("PacketPlayInFlying");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private double x;
private double y;
@@ -24,73 +31,46 @@ public class WrappedPacketInFlying extends WrappedPacket {
}
@Override
protected void setup() throws IllegalAccessException {
this.x = fields[0].getDouble(packet);
this.y = fields[1].getDouble(packet);
this.z = fields[2].getDouble(packet);
protected void setup() {
try {
//x, y, z, yaw pitch, onGround, isPosition, isLook
this.x = Reflection.getField(flyingClass, double.class, 0).getDouble(packet);
this.y = Reflection.getField(flyingClass, double.class, 1).getDouble(packet);
this.z = Reflection.getField(flyingClass, double.class, 2).getDouble(packet);
this.yaw = fields[3].getFloat(packet);
this.pitch = fields[4].getFloat(packet);
this.yaw = Reflection.getField(flyingClass, float.class, 0).getFloat(packet);
this.pitch = Reflection.getField(flyingClass, float.class, 1).getFloat(packet);
this.onGround = fields[5].getBoolean(packet);
this.onGround = Reflection.getField(flyingClass, boolean.class, 0).getBoolean(packet);
this.isPosition = fields[6].getBoolean(packet);
this.isLook = fields[7].getBoolean(packet);
}
public static class WrappedPacketInPosition extends WrappedPacketInFlying {
public WrappedPacketInPosition(Object packet) {
super(packet);
}
@Override
public boolean isPosition() {
return true;
}
@Override
public boolean isLook() {
return false;
this.isPosition = Reflection.getField(flyingClass, boolean.class, 1).getBoolean(packet);
this.isLook = Reflection.getField(flyingClass, boolean.class, 2).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public static class WrappedPacketInPosition_Look extends WrappedPacketInFlying {
public WrappedPacketInPosition_Look(Object packet) {
super(packet);
}
@Override
public boolean isLook() {
return true;
}
@Override
public boolean isPosition() {
return false;
}
}
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;
}
@@ -102,44 +82,83 @@ public class WrappedPacketInFlying extends WrappedPacket {
return isLook;
}
private static Class<?> flyingClass;
private static Field[] fields = new Field[8]; //x, y, z, yaw pitch, onGround, isPositionPacket, isLookPacket
static {
try {
flyingClass = NMSUtils.getNMSClass("PacketPlayInFlying");
} catch (ClassNotFoundException e) {
e.printStackTrace();
public static class WrappedPacketInPosition extends WrappedPacketInFlying {
public WrappedPacketInPosition(Object packet) {
super(packet);
}
try {
fields[0] = flyingClass.getDeclaredField("x");
fields[1] = flyingClass.getDeclaredField("y");
fields[2] = flyingClass.getDeclaredField("z");
fields[3] = flyingClass.getDeclaredField("yaw");
fields[4] = flyingClass.getDeclaredField("pitch");
fields[5] = flyingClass.getDeclaredField(getOnGroundFieldName());
fields[6] = flyingClass.getDeclaredField("hasPos");
fields[7] = flyingClass.getDeclaredField("hasLook");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
for (Field f : fields) {
if (f != null) {
f.setAccessible(true);
@Override
public boolean isPosition() {
try {
return Reflection.getField(flyingClass, boolean.class, 1).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return true;
}
@Override
public boolean isLook() {
try {
return Reflection.getField(flyingClass, boolean.class, 2).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return false;
}
}
private static String getOnGroundFieldName() {
if (version == ServerVersion.v_1_7_10) {
return "g";
public static class WrappedPacketInPosition_Look extends WrappedPacketInFlying {
public WrappedPacketInPosition_Look(Object packet) {
super(packet);
}
@Override
public boolean isPosition() {
try {
return Reflection.getField(flyingClass, boolean.class, 1).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return true;
}
@Override
public boolean isLook() {
try {
return Reflection.getField(flyingClass, boolean.class, 2).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return true;
}
}
public static class WrappedPacketInLook extends WrappedPacketInFlying {
public WrappedPacketInLook(Object packet) {
super(packet);
}
@Override
public boolean isPosition() {
try {
return Reflection.getField(flyingClass, boolean.class, 1).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return false;
}
@Override
public boolean isLook() {
try {
return Reflection.getField(flyingClass, boolean.class, 2).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return true;
}
return "f";
}
}
@@ -1,54 +1,50 @@
package io.github.retrooper.packetevents.packetwrappers.in.keepalive;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Field;
public final class WrappedPacketInKeepAlive extends WrappedPacket {
private static Class<?> packetClass;
public class WrappedPacketInKeepAlive extends WrappedPacket {
public WrappedPacketInKeepAlive(final Object packet) {
super(packet);
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayInKeepAlive");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private long id;
public WrappedPacketInKeepAlive(final Object packet) {
super(packet);
}
@Override
protected void setup() throws Exception {
if(version.isHigherThan(ServerVersion.v_1_12)) {
this.id = idField.getLong(packet);
}
else {
this.id = idField.getInt(packet);
protected void setup() {
if (Reflection.getField(packetClass, int.class, 0) == null) {
try {
this.id = Reflection.getField(packetClass, long.class, 0).getLong(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else {
try {
this.id = Reflection.getField(packetClass, int.class, 0).getInt(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
/**
* Cast this long to an integer if you are using 1.7.10->1.12.2!
* In 1.13.2->1.15.2 a long is sent
* @return
* Optionally Cast this long to an integer if you are using 1.7.10->1.12.2!
* In 1.13.2->1.16.1 a long is sent
*
* @return response is
*/
public long getId() {
return id;
}
private static Class<?> keepAliveClass;
//1.7.10->1.12.2 has int field "a", rest as long field "a"
private static Field idField;
static {
try {
keepAliveClass = NMSUtils.getNMSClass("PacketPlayInKeepAlive");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
idField = keepAliveClass.getDeclaredField("a");
idField.setAccessible(true);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,55 @@
package io.github.retrooper.packetevents.packetwrappers.in.steervehicle;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
public class WrappedPacketInSteerVehicle extends WrappedPacket {
private static Class<?> packetClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayInSteerVehicle");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private float side, forward;
private boolean jump, unmount;
public WrappedPacketInSteerVehicle(Object packet) {
super(packet);
}
@Override
protected void setup() {
try {
this.side = Reflection.getField(packetClass, float.class, 0).getFloat(packet);
this.forward = Reflection.getField(packetClass, float.class, 1).getFloat(packet);
this.jump = Reflection.getField(packetClass, boolean.class, 0).getBoolean(packet);
this.unmount = Reflection.getField(packetClass, boolean.class, 1).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
//Positive side value means left, negative means right
public float getSideValue() {
return side;
}
//Positive forward value means forward, negative is backwards
public float getForwardValue() {
return forward;
}
public boolean isJump() {
return jump;
}
public boolean isUnmount() {
return unmount;
}
}
@@ -0,0 +1,49 @@
package io.github.retrooper.packetevents.packetwrappers.in.transaction;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
public final class WrappedPacketInTransaction extends WrappedPacket {
private static Class<?> packetClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayInTransaction");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
private int windowId;
private short actionNumber;
private boolean accepted;
public WrappedPacketInTransaction(final Object packet) {
super(packet);
}
@Override
protected void setup() {
try {
this.windowId = Reflection.getField(packetClass, int.class, 0).getInt(packet);
this.actionNumber = Reflection.getField(packetClass, short.class, 0).getShort(packet);
this.accepted = Reflection.getField(packetClass, boolean.class, 0).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public int getWindowId() {
return windowId;
}
public short getActionNumber() {
return actionNumber;
}
public boolean isAccepted() {
return accepted;
}
}
@@ -1,12 +1,36 @@
package io.github.retrooper.packetevents.packetwrappers.in.useentity;
import io.github.retrooper.packetevents.enums.EntityUseAction;
import io.github.retrooper.packetevents.enums.minecraft.EntityUseAction;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import org.bukkit.entity.Entity;
import java.lang.reflect.Field;
public class WrappedPacketInUseEntity extends WrappedPacket {
public final class WrappedPacketInUseEntity extends WrappedPacket {
private static Class<?> useEntityClass, entityClass, enumEntityUseActionClass;
static {
try {
useEntityClass = NMSUtils.getNMSClass("PacketPlayInUseEntity");
entityClass = NMSUtils.getNMSClass("Entity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
enumEntityUseActionClass = NMSUtils.getNMSClass("EnumEntityUseAction");
} catch (ClassNotFoundException e) {
//That is fine, it is probably a subclass
for (final Class<?> sub : useEntityClass.getDeclaredClasses()) {
if (sub.getSimpleName().equals("EnumEntityUseAction")) {
enumEntityUseActionClass = sub;
break;
}
}
}
}
private int entityId;
private Entity entity;
private EntityUseAction action;
@@ -15,16 +39,18 @@ public class WrappedPacketInUseEntity extends WrappedPacket {
super(packet);
}
@Override
protected void setup() throws IllegalAccessException {
this.entityId = fields[0].getInt(packet);
this.entity = NMSUtils.getEntityById(this.entityId);
final Object useActionEnum = fields[1].get(packet);
this.action = EntityUseAction.valueOf(useActionEnum.toString());
protected void setup() {
try {
this.entityId = Reflection.getField(useEntityClass, int.class, 0).getInt(packet);
this.entity = NMSUtils.getEntityById(this.entityId);
final Object useActionEnum = Reflection.getField(useEntityClass, enumEntityUseActionClass, 0).get(packet);
this.action = EntityUseAction.valueOf(useActionEnum.toString());
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public Entity getEntity() {
return entity;
}
@@ -36,38 +62,4 @@ public class WrappedPacketInUseEntity extends WrappedPacket {
public EntityUseAction getAction() {
return action;
}
private static Class<?> useEntityClass;
private static Class<?> entityClass;
private static Field[] fields = new Field[2];
static {
try {
useEntityClass = NMSUtils.getNMSClass("PacketPlayInUseEntity");
entityClass = NMSUtils.getNMSClass("Entity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
fields[0] = useEntityClass.getDeclaredField("a");
fields[1] = useEntityClass.getDeclaredField("action");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
for (Field f : fields) {
if (f != null) {
f.setAccessible(true);
}
}
}
}
@@ -0,0 +1,38 @@
package io.github.retrooper.packetevents.packetwrappers.out.abilities;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
final class PlayerAbilitiesUtils {
public static Class<?> playerAbilitiesClass;
public static Constructor<?> playerAbilitiesConstructor;
static {
try {
playerAbilitiesClass = NMSUtils.getNMSClass("PlayerAbilities");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
playerAbilitiesConstructor = playerAbilitiesClass.getConstructor();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
public static Object getPlayerAbilities(final boolean isVulnerable, final boolean isFlying, final boolean allowFlight, final boolean canBuildInstantly,
final float flySpeed, final float walkSpeed) throws IllegalAccessException, InvocationTargetException, InstantiationException {
final Object instance = playerAbilitiesConstructor.newInstance();
Reflection.getField(playerAbilitiesClass, boolean.class, 0).setBoolean(instance, isVulnerable);
Reflection.getField(playerAbilitiesClass, boolean.class, 1).setBoolean(instance, isFlying);
Reflection.getField(playerAbilitiesClass, boolean.class, 2).setBoolean(instance, allowFlight);
Reflection.getField(playerAbilitiesClass, boolean.class, 3).setBoolean(instance, canBuildInstantly);
Reflection.getField(playerAbilitiesClass, float.class, 0).setFloat(instance, flySpeed);
Reflection.getField(playerAbilitiesClass, float.class, 1).setFloat(instance, walkSpeed);
return instance;
}
}
@@ -0,0 +1,96 @@
package io.github.retrooper.packetevents.packetwrappers.out.abilities;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public final class WrappedPacketOutAbilities extends WrappedPacket implements Sendable {
private static Class<?> packetClass;
private static Constructor<?> packetConstructor;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutAbilities");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
packetConstructor = packetClass.getConstructor(PlayerAbilitiesUtils.playerAbilitiesClass);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
private boolean vulnerable, flying, allowFlight, instantBuild;
private float flySpeed, walkSpeed;
public WrappedPacketOutAbilities(final Object packet) {
super(packet);
}
public WrappedPacketOutAbilities(final boolean isVulnerable, final boolean isFlying, final boolean allowFlight, final boolean canBuildInstantly,
final float flySpeed, final float walkSpeed) {
super(null);
this.vulnerable = isVulnerable;
this.flying = isFlying;
this.allowFlight = allowFlight;
this.instantBuild = canBuildInstantly;
this.flySpeed = flySpeed;
this.walkSpeed = walkSpeed;
}
@Override
protected void setup() {
try {
this.vulnerable = Reflection.getField(packetClass, boolean.class, 0).getBoolean(packet);
this.flying = Reflection.getField(packetClass, boolean.class, 1).getBoolean(packet);
this.allowFlight = Reflection.getField(packetClass, boolean.class, 2).getBoolean(packet);
this.instantBuild = Reflection.getField(packetClass, boolean.class, 3).getBoolean(packet);
this.flySpeed = Reflection.getField(packetClass, float.class, 0).getFloat(packet);
this.walkSpeed = Reflection.getField(packetClass, float.class, 0).getFloat(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public boolean isVulnerable() {
return vulnerable;
}
public boolean isFlying() {
return flying;
}
public boolean isFlightAllowed() {
return allowFlight;
}
public boolean canInstantlyBuild() {
return instantBuild;
}
public float getFlySpeed() {
return flySpeed;
}
public float getWalkSpeed() {
return walkSpeed;
}
@Override
public Object asNMSPacket() {
try {
return packetConstructor.newInstance(PlayerAbilitiesUtils.getPlayerAbilities(vulnerable, flying, allowFlight, instantBuild, flySpeed, walkSpeed));
} catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
}
@@ -0,0 +1,84 @@
package io.github.retrooper.packetevents.packetwrappers.out.animation;
import io.github.retrooper.packetevents.enums.minecraft.EntityAnimationType;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import org.bukkit.entity.Entity;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public final class WrappedPacketOutAnimation extends WrappedPacket implements Sendable {
private static Class<?> animationClass, nmsEntityClass;
private static Constructor<?> animationConstructor;
static {
try {
animationClass = NMSUtils.getNMSClass("PacketPlayOutAnimation");
nmsEntityClass = NMSUtils.getNMSClass("Entity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
animationConstructor = animationClass.getConstructor(nmsEntityClass, int.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
private Entity entity;
private int entityID;
private EntityAnimationType type;
public WrappedPacketOutAnimation(final Object packet) {
super(packet);
}
public WrappedPacketOutAnimation(final Entity target, final EntityAnimationType type) {
super(null);
this.entityID = target.getEntityId();
this.entity = target;
this.type = type;
}
@Override
protected void setup() {
try {
//a - ID
//b - TYPE
this.entityID = Reflection.getField(animationClass, int.class, 0).getInt(packet);
this.entity = NMSUtils.getEntityById(this.entityID);
this.type = EntityAnimationType.get(Reflection.getField(animationClass, int.class, 1).getInt(packet));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public Entity getEntity() {
return this.entity;
}
public int getEntityId() {
return this.entityID;
}
public EntityAnimationType getAnimationType() {
return type;
}
@Override
public Object asNMSPacket() {
final Object nmsEntity = NMSUtils.getNMSEntity(this.entity);
final int index = type.getIndex();
try {
return animationConstructor.newInstance(nmsEntity, index);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
}
@@ -0,0 +1,97 @@
package io.github.retrooper.packetevents.packetwrappers.out.chat;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public final class WrappedPacketOutChat extends WrappedPacket implements Sendable {
private static Constructor<?> chatClassConstructor;
private static Class<?> chatClass, iChatBaseComponentClass, chatSerializerClass;
static {
try {
chatClass = NMSUtils.getNMSClass("PacketPlayOutChat");
iChatBaseComponentClass = NMSUtils.getNMSClass("IChatBaseComponent");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//In 1.8.3+ the ChatSerializer class is declared in the IChatBaseComponent class, so we have to handle that
try {
chatSerializerClass = NMSUtils.getNMSClass("ChatSerializer");
} catch (ClassNotFoundException e) {
//That is fine, it is probably a subclass
chatSerializerClass = Reflection.getSubClass(iChatBaseComponentClass, "ChatSerializer");
}
try {
chatClassConstructor = chatClass.getConstructor(iChatBaseComponentClass);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
private String message;
public WrappedPacketOutChat(final Object packet) {
super(packet);
}
public WrappedPacketOutChat(final String message) {
super(null);
this.message = "{\"text\": \"" + message + "\"}";
}
public static String toStringFromIChatBaseComponent(Object obj) {
try {
return Reflection.getMethod(iChatBaseComponentClass, String.class, 0).invoke(obj).toString();
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
public static Object toIChatBaseComponent(String msg) {
try {
return Reflection.getMethod(chatSerializerClass, 0, String.class).invoke(null, msg);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void setup() {
try {
final Object iChatBaseObj = Reflection.getField(chatClass, iChatBaseComponentClass, 0).get(packet);
final Object contentString = Reflection.getMethod(iChatBaseComponentClass, String.class, 0).invoke(iChatBaseObj);
this.message = contentString.toString();
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
@Override
public Object asNMSPacket() {
try {
return chatClassConstructor.newInstance(toIChatBaseComponent(this.message));
} catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
public String getMessage() {
return this.message;
}
}
@@ -0,0 +1,90 @@
package io.github.retrooper.packetevents.packetwrappers.out.entity;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
public class WrappedPacketOutEntity extends WrappedPacket {
private int entityId;
private double deltaX, deltaY, deltaZ;
private byte yaw, pitch;
private boolean onGround;
public WrappedPacketOutEntity(Object packet) {
super(packet);
}
@Override
protected void setup() {
try {
this.entityId = Reflection.getField(packetClass, int.class, 0).getInt(packet);
this.onGround = Reflection.getField(packetClass, boolean.class, 0).getBoolean(packet);
if (version.isLowerThan(ServerVersion.v_1_9)) {
byte dX = Reflection.getField(packetClass, byte.class, 0).getByte(packet);
byte dY = Reflection.getField(packetClass, byte.class, 1).getByte(packet);
byte dZ = Reflection.getField(packetClass, byte.class, 2).getByte(packet);
this.deltaX = dX / 32.0;
this.deltaY = dY / 32.0;
this.deltaZ = dZ / 32.0;
this.yaw = Reflection.getField(packetClass, byte.class, 3).getByte(packet);
this.pitch = Reflection.getField(packetClass, byte.class, 4).getByte(packet);
} else {
short dX = Reflection.getField(packetClass, short.class, 0).getShort(packet);
short dY = Reflection.getField(packetClass, short.class, 1).getShort(packet);
short dZ = Reflection.getField(packetClass, short.class, 2).getShort(packet);
this.deltaX = dX / 4096.0;
this.deltaY = dY / 4096.0;
this.deltaZ = dZ / 4096.0;
this.yaw = Reflection.getField(packetClass, byte.class, 0).getByte(packet);
this.pitch = Reflection.getField(packetClass, byte.class, 1).getByte(packet);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public byte getPitch() {
return pitch;
}
public byte getYaw() {
return yaw;
}
public double getDeltaZ() {
return deltaZ;
}
public double getDeltaY() {
return deltaY;
}
public double getDeltaX() {
return deltaX;
}
public int getEntityId() {
return entityId;
}
public boolean isOnGround() {
return onGround;
}
private static Class<?> packetClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutEntity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
@@ -0,0 +1,124 @@
package io.github.retrooper.packetevents.packetwrappers.out.entityvelocity;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import org.bukkit.entity.Entity;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public final class WrappedPacketOutEntityVelocity extends WrappedPacket implements Sendable {
private static Constructor<?> velocityConstructor, vec3dConstructor;
private static Class<?> velocityClass, vec3dClass;
/**
* Velocity Constructor parameter types:
* 1.7.10->1.13.2 use int, double, double, double style,
* 1.14+ use int, Vec3D style
*/
static {
try {
velocityClass = NMSUtils.getNMSClass("PacketPlayOutEntityVelocity");
if (version.isHigherThan(ServerVersion.v_1_13_2)) {
vec3dClass = NMSUtils.getNMSClass("Vec3D");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
velocityConstructor = velocityClass.getConstructor(int.class, double.class, double.class, double.class);
} catch (NoSuchMethodException e) {
//That is fine, just a newer version
try {
velocityConstructor = velocityClass.getConstructor(int.class, vec3dClass);
//vec3d constructor
vec3dConstructor = vec3dClass.getConstructor(double.class, double.class, double.class);
} catch (NoSuchMethodException e2) {
e2.printStackTrace();
}
}
}
private Entity entity;
private int entityId;
private double velocityX, velocityY, velocityZ;
public WrappedPacketOutEntityVelocity(final Object packet) {
super(packet);
}
public WrappedPacketOutEntityVelocity(final Entity entity, final double velocityX, final double velocityY, final double velocityZ) {
super(null);
this.entityId = entity.getEntityId();
this.entity = entity;
this.velocityX = velocityX;
this.velocityY = velocityY;
this.velocityZ = velocityZ;
}
@Override
protected void setup() {
try {
int i = 0;
final int entityId = Reflection.getField(velocityClass, int.class, 0).getInt(packet);
final int x = Reflection.getField(velocityClass, int.class, 1).getInt(packet);
final int y = Reflection.getField(velocityClass, int.class, 2).getInt(packet);
final int z = Reflection.getField(velocityClass, int.class, 3).getInt(packet);
this.entityId = entityId;
this.entity = NMSUtils.getEntityById(this.entityId);
this.velocityX = x / 8000.0D;
this.velocityY = y / 8000.0D;
this.velocityZ = z / 8000.0D;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public int getEntityId() {
return entityId;
}
public Entity getEntity() {
return entity;
}
public double getVelocityX() {
return velocityX;
}
public double getVelocityY() {
return velocityY;
}
public double getVelocityZ() {
return velocityZ;
}
@Override
public Object asNMSPacket() {
if (version.isLowerThan(ServerVersion.v_1_14)) {
try {
return velocityConstructor.newInstance(entityId, velocityX, velocityY, velocityZ);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
} else {
try {
return velocityConstructor.newInstance(entityId, vec3dConstructor.newInstance(velocityX, velocityY, velocityZ));
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
return null;
}
}
@@ -0,0 +1,52 @@
package io.github.retrooper.packetevents.packetwrappers.out.keepalive;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import net.minecraft.server.v1_8_R3.PacketPlayOutKeepAlive;
public class WrappedPacketOutKeepAlive extends WrappedPacket {
private long id;
public WrappedPacketOutKeepAlive(Object packet) {
super(packet);
}
/**
* Optionally Cast this long to an integer if you are using 1.7.10->1.12.2!
* In 1.13.2->1.16.1 a long is sent
*
* @return response is
*/
public long getId() {
return id;
}
@Override
protected void setup() {
if (Reflection.getField(packetClass, int.class, 0) == null) {
try {
this.id = Reflection.getField(packetClass, long.class, 0).getLong(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} else {
try {
this.id = Reflection.getField(packetClass, int.class, 0).getInt(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
private static Class<?> packetClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutKeepAlive");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
PacketPlayOutKeepAlive p;
}
}
@@ -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.reflectionutils.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 static Class<?> packetClass, iChatBaseComponentClass;
private static Constructor<?> kickDisconnectConstructor;
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();
}
}
private String kickMessage;
public WrappedPacketOutKickDisconnect(final Object packet) {
super(packet);
}
public WrappedPacketOutKickDisconnect(final String kickMessage) {
super(null);
this.kickMessage = kickMessage;
}
@Override
protected void setup() {
try {
this.kickMessage = WrappedPacketOutChat.toStringFromIChatBaseComponent(Reflection.getField(packetClass, iChatBaseComponentClass, 0).get(packet));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
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;
}
}
@@ -0,0 +1,44 @@
package io.github.retrooper.packetevents.packetwrappers.out.playerinfo;
import io.github.retrooper.packetevents.enums.minecraft.Gamemode;
import io.github.retrooper.packetevents.enums.minecraft.PlayerInfoAction;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import net.minecraft.server.v1_8_R3.PacketPlayOutPlayerInfo;
public class WrappedPacketOutPlayerInfo extends WrappedPacket {
private PlayerInfoAction action;
public WrappedPacketOutPlayerInfo(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketPlayOutPlayerInfo.PlayerInfoData dl;
}
private static Class<?> packetClass, enumPlayerInfoActionClass;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutPlayerInfo");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
enumPlayerInfoActionClass = NMSUtils.getNMSClass("EnumPLayerInfoAction");
} catch (ClassNotFoundException e) {
enumPlayerInfoActionClass = Reflection.getSubClass(packetClass, "EnumPlayerInfoAction");
}
}
public class PlayerDataInfo {
public PlayerDataInfo(Object gameProfile, int var, Gamemode gamemode, String s) {
}
}
}
@@ -0,0 +1,78 @@
package io.github.retrooper.packetevents.packetwrappers.out.transaction;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class WrappedPacketOutTransaction extends WrappedPacket implements Sendable {
private static Class<?> packetClass;
private static Constructor<?> packetConstructor;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutTransaction");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
packetConstructor = packetClass.getConstructor(int.class, short.class, boolean.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
private int windowId;
private short actionNumber;
private boolean accepted;
public WrappedPacketOutTransaction(final Object packet) {
super(packet);
}
public WrappedPacketOutTransaction(final int windowId, final short actionNumber, final boolean accepted) {
super(null);
this.windowId = windowId;
this.actionNumber = actionNumber;
this.accepted = accepted;
}
@Override
protected void setup() {
try {
this.windowId = Reflection.getField(packetClass, int.class, 0).getInt(packet);
this.actionNumber = Reflection.getField(packetClass, short.class, 0).getShort(packet);
this.accepted = Reflection.getField(packetClass, boolean.class, 0).getBoolean(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public int getWindowId() {
return windowId;
}
public short getActionNumber() {
return actionNumber;
}
public boolean isAccepted() {
return accepted;
}
@Override
public Object asNMSPacket() {
try {
return packetConstructor.newInstance(windowId, actionNumber, accepted);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
}
@@ -0,0 +1,83 @@
package io.github.retrooper.packetevents.packetwrappers.out.updatehealth;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.packetwrappers.api.WrappedPacket;
import io.github.retrooper.packetevents.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public final class WrappedPacketOutUpdateHealth extends WrappedPacket implements Sendable {
private static Class<?> packetClass;
private static Constructor<?> packetConstructor;
static {
try {
packetClass = NMSUtils.getNMSClass("PacketPlayOutUpdateHealth");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
packetConstructor = packetClass.getConstructor(float.class, int.class, float.class);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
private float health, foodSaturation;
private int food;
public WrappedPacketOutUpdateHealth(final Object packet) {
super(packet);
}
/**
* See https://wiki.vg/Protocol#Update_Health
*
* @param health
* @param food
* @param foodSaturation
*/
public WrappedPacketOutUpdateHealth(final float health, final int food, final float foodSaturation) {
super(null);
this.health = health;
this.food = food;
this.foodSaturation = foodSaturation;
}
@Override
protected void setup() {
try {
this.health = Reflection.getField(packetClass, float.class, 0).getFloat(packet);
this.foodSaturation = Reflection.getField(packetClass, float.class, 0).getFloat(packet);
this.food = Reflection.getField(packetClass, int.class, 0).getInt(packet);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
public float getHealth() {
return health;
}
public float getFoodSaturation() {
return foodSaturation;
}
public int getFood() {
return food;
}
@Override
public Object asNMSPacket() {
try {
return packetConstructor.newInstance(health, food, foodSaturation);
} catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
}
@@ -0,0 +1,189 @@
package io.github.retrooper.packetevents.reflectionutils;
import io.github.retrooper.packetevents.reflectionutils.fielddata.FieldWithIndex;
import io.github.retrooper.packetevents.reflectionutils.fielddata.FieldWithName;
import io.github.retrooper.packetevents.reflectionutils.fielddata.FieldWithTypeAndIndex;
import io.github.retrooper.packetevents.reflectionutils.methoddata.MethodWithIndexAndParams;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
/**
* @author retrooper
*/
public final class Reflection {
private static final HashMap<Class<?>, Field[]> cachedFields = new HashMap<Class<?>, Field[]>();
private static final HashMap<Class<?>, Method[]> cachedMethods = new HashMap<Class<?>, Method[]>();
private static final HashMap<Class<?>, Class<?>[]> cachedSubclasses = new HashMap<Class<?>, Class<?>[]>();
//FIELDS
private static final HashMap<FieldWithName, Field> fieldWithNameHashMap = new HashMap<FieldWithName, Field>();
private static final HashMap<FieldWithTypeAndIndex, Field> fieldWithTypeAndIndexHashMap = new HashMap<FieldWithTypeAndIndex, Field>();
private static final HashMap<FieldWithIndex, Field> fieldWithIndexHashMap = new HashMap<FieldWithIndex, Field>();
private static final HashMap<MethodWithIndexAndParams, Method> methodWithIndexAndParamsHashMap = new HashMap<MethodWithIndexAndParams, Method>();
public static Field[] getFields(final Class<?> cls) {
if (cachedFields.containsKey(cls)) {
return cachedFields.get(cls);
} else {
final Field[] fields = cls.getDeclaredFields();
for (final Field f : fields) {
f.setAccessible(true);
}
cachedFields.put(cls, fields);
return fields;
}
}
public static Field getField(final Class<?> cls, final String name) {
final FieldWithName fwn = new FieldWithName(cls, name);
if (!fieldWithNameHashMap.containsKey(fwn)) {
for (final Field f : getFields(cls)) {
if (f.getName().equals(name)) {
fieldWithNameHashMap.put(fwn, f);
return f;
}
}
} else {
return fieldWithNameHashMap.get(fwn);
}
return null;
}
public static Field getField(final Class<?> cls, final Class<?> dataType, final int index) {
final FieldWithTypeAndIndex fwtai = new FieldWithTypeAndIndex(cls, dataType, index);
if (!fieldWithTypeAndIndexHashMap.containsKey(fwtai)) {
int i = 0;
for (final Field f : getFields(cls)) {
if (f.getType().equals(dataType)) {
if (i++ == index) {
fieldWithTypeAndIndexHashMap.put(fwtai, f);
return f;
}
}
}
} else {
return fieldWithTypeAndIndexHashMap.get(fwtai);
}
return null;
}
public static Field getField(final Class<?> cls, final int index) {
final FieldWithIndex fwi = new FieldWithIndex(cls, index);
if (!fieldWithIndexHashMap.containsKey(fwi)) {
final Field[] fields = getFields(cls);
if (fields.length <= index) {
return null;
}
final Field field = fields[index];
fieldWithIndexHashMap.put(fwi, field);
return field;
} else {
return fieldWithIndexHashMap.get(fwi);
}
}
//METHODS
public static Method[] getMethods(final Class<?> cls) {
if (cachedMethods.containsKey(cls)) {
return cachedMethods.get(cls);
} else {
final Method[] methods = cls.getDeclaredMethods();
for (final Method m : methods) {
m.setAccessible(true);
}
cachedMethods.put(cls, methods);
return methods;
}
}
public static Method getMethod(final Class<?> cls, final int index, final Class<?>... params) {
final MethodWithIndexAndParams mwiap = new MethodWithIndexAndParams(cls, index, params);
if (!methodWithIndexAndParamsHashMap.containsKey(mwiap)) {
int i = 0;
for (final Method m : getMethods(cls)) {
if (Arrays.equals(m.getParameterTypes(), params) && index == i++) {
return m;
}
}
} else {
return methodWithIndexAndParamsHashMap.get(mwiap);
}
return null;
}
//THE REST LATER
public static Method getMethod(final Class<?> cls, final String name, Class<?> returning, Class<?>... params) {
for (final Method m : getMethods(cls)) {
if (m.getName().equals(name) && Arrays.equals(m.getParameterTypes(), params) && m.getReturnType().equals(returning)) {
return m;
}
}
return null;
}
public static Method getMethod(final Class<?> cls, final String name, final int index) {
int i = 0;
for (final Method m : getMethods(cls)) {
if (m.getName().equals(name) && index == i++) {
return m;
}
}
return null;
}
public static Method getMethod(final Class<?> cls, final Class<?> returning, final int index) {
int i = 0;
for (final Method m : getMethods(cls)) {
if (m.getReturnType().equals(returning) && index == i++) {
return m;
}
}
return null;
}
public static Method getMethod(final Class<?> cls, final String name, final Class<?> returning) {
int i = 0;
for (final Method m : getMethods(cls)) {
if (m.getName().equals(name) && m.getReturnType().equals(returning)) {
return m;
}
}
return null;
}
public static Class<?>[] getSubClasses(final Class<?> cls) {
if (cachedSubclasses.containsKey(cls)) {
return cachedSubclasses.get(cls);
} else {
final Class<?>[] subclasses = cls.getDeclaredClasses();
cachedSubclasses.put(cls, subclasses);
return subclasses;
}
}
public static Class<?> getSubClass(final Class<?> cls, final String name) {
for (final Class<?> subclass : getSubClasses(cls)) {
if (subclass.getSimpleName().equals(name)) {
return subclass;
}
}
return null;
}
public static Class<?> getSubClass(final Class<?> cls, final int index) {
final Class<?>[] subclasses = getSubClasses(cls);
for (int i = 0; i < index + 1; i++) {
final Class<?> c = subclasses[i];
if (i == index) {
return c;
}
}
return null;
}
}
@@ -0,0 +1,19 @@
package io.github.retrooper.packetevents.reflectionutils.fielddata;
public class FieldWithIndex {
private final Class<?> cls;
private final int index;
public FieldWithIndex(Class<?> cls, int index) {
this.cls = cls;
this.index = index;
}
public Class<?> getCls() {
return cls;
}
public int getIndex() {
return index;
}
}
@@ -0,0 +1,20 @@
package io.github.retrooper.packetevents.reflectionutils.fielddata;
public class FieldWithName {
private final Class<?> cls;
private final String name;
public FieldWithName(Class<?> cls, String name) {
this.cls = cls;
this.name = name;
}
public Class<?> getCls() {
return cls;
}
public String getName() {
return name;
}
}
@@ -0,0 +1,24 @@
package io.github.retrooper.packetevents.reflectionutils.fielddata;
public class FieldWithTypeAndIndex {
private final Class<?> cls, type;
private final int index;
public FieldWithTypeAndIndex(Class<?> cls, Class<?> type, int index) {
this.cls = cls;
this.type = type;
this.index = index;
}
public Class<?> getCls() {
return cls;
}
public Class<?> getType() {
return type;
}
public int getIndex() {
return index;
}
}
@@ -0,0 +1,25 @@
package io.github.retrooper.packetevents.reflectionutils.methoddata;
public class MethodWithIndexAndParams {
private final Class<?> cls;
private final int index;
private final Class<?>[] params;
public MethodWithIndexAndParams(Class<?> cls, int index, Class<?>[] params) {
this.cls = cls;
this.index = index;
this.params = params;
}
public Class<?> getCls() {
return cls;
}
public int getIndex() {
return index;
}
public Class<?>[] getParams() {
return params;
}
}
@@ -0,0 +1,44 @@
package io.github.retrooper.packetevents.settings;
import io.github.retrooper.packetevents.enums.ServerVersion;
public class Settings {
private ServerVersion defaultServerVersion;
private String identifier = "";
private boolean autoResolveClientProtocolVersion;
/**
* If PacketEvents fails to detect your server version, it will use the recommended version
*
* @return Recommended version
*/
public ServerVersion getDefaultServerVersion() {
return defaultServerVersion;
}
/**
* Set the recommended version
*
* @param version
*/
public void setDefaultServerVersion(final ServerVersion version) {
defaultServerVersion = version;
}
public String getIdentifier() {
return identifier;
}
public void setIdentifier(final String identifier) {
this.identifier = identifier;
}
public boolean doAutoResolveClientProtocolVersion() {
return autoResolveClientProtocolVersion;
}
public void setDoAutoResolveClientProtocolVersion(boolean autoResolveClientProtocolVersion) {
this.autoResolveClientProtocolVersion = autoResolveClientProtocolVersion;
}
}
@@ -1,33 +0,0 @@
package io.github.retrooper.packetevents.utils;
import io.github.retrooper.packetevents.PacketEvents;
import io.github.retrooper.packetevents.enums.ServerVersion;
public class BaseBlockUtils {
private static final ServerVersion version = PacketEvents.getServerVersion();
public static String getPosXFieldName() {
return "a";
}
public static String getPosYFieldName() {
if (version == ServerVersion.v_1_8) {
return "b";
} else if (version == ServerVersion.v_1_8_3
|| version == ServerVersion.v_1_8_8
|| version == ServerVersion.v_1_9) {
return "c";
}
//1.9.4 and higher
return "b";
}
public static String getPosZFieldName() {
if (version == ServerVersion.v_1_8) {
return "c";
} else if (version == ServerVersion.v_1_8_3 || version == ServerVersion.v_1_8_8 || version == ServerVersion.v_1_9) {
return "d";
}
return "c";
}
}
@@ -1,16 +0,0 @@
package io.github.retrooper.packetevents.utils;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.util.BlockIterator;
public class BlockFinder {
public static Block getBlocksInDirection(final Player player, final int blockDistance) {
final BlockIterator it = new BlockIterator(player, blockDistance);
Block cur = null;
while(it.hasNext()) {
cur = it.next();
}
return cur;
}
}
@@ -0,0 +1,18 @@
package io.github.retrooper.packetevents.utils;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.util.BlockIterator;
public class BlockIteratorUtils {
public static Block getBlockLookingAt(final Player player, final int distance) {
final Location location = player.getEyeLocation();
final BlockIterator blocksToAdd = new BlockIterator(location, 0.0D, distance);
Block block = null;
while (blocksToAdd.hasNext()) {
block = blocksToAdd.next();
}
return block;
}
}
@@ -1,84 +1,98 @@
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.reflectionutils.Reflection;
import io.github.retrooper.packetevents.utils.nms_entityfinder.EntityFinderUtils;
import org.bukkit.Bukkit;
import org.bukkit.World;
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();
private static final String nettyPrefix = version == ServerVersion.v_1_7_10 ? "net.minecraft.util.io.netty" : "io.netty";
public static String nettyPrefix;
private static final String nmsDir = ServerVersion.getNMSDirectory();
private static final String obcDir = ServerVersion.getOBCDirectory();
public static Class<?> minecraftServerClass;
private static Class<?> craftWorldsClass;
private static Method getServerMethod;
private static Field recentTPSField;
private static Method getCraftWorldHandleMethod;
private static Method entityMethod;
private static Class<?> craftPlayerClass;
private static Class<?> entityPlayerClass;
private static Method getCraftPlayerHandle;
private static Field entityPlayerPingField;
public static Class<?> minecraftServerClass, craftWorldsClass,
packetClass, entityPlayerClass, playerConnectionClass,
craftPlayerClass, serverConnectionClass, craftEntityClass,
craftItemStack, nmsItemStackClass, networkManagerClass, nettyChannelClass;
private static Method getCraftWorldHandleMethod, getServerConnection, getCraftPlayerHandle, getCraftEntityHandle, sendPacketMethod, asBukkitCopy;
private static Field entityPlayerPingField, playerConnectionField;
static {
try {
nettyPrefix = "io.netty";
Class.forName("io.netty.channel.Channel");
} catch (ClassNotFoundException e) {
nettyPrefix = "net.minecraft.util.io.netty";
}
try {
nettyChannelClass = getNettyClass("channel.Channel");
minecraftServerClass = getNMSClass("MinecraftServer");
craftWorldsClass = getOBCClass("CraftWorld");
craftPlayerClass = getOBCClass("entity.CraftPlayer");
entityPlayerClass = getNMSClass("EntityPlayer");
packetClass = getNMSClass("Packet");
playerConnectionClass = getNMSClass("PlayerConnection");
serverConnectionClass = getNMSClass("ServerConnection");
craftEntityClass = getOBCClass("entity.CraftEntity");
craftItemStack = getOBCClass("inventory.CraftItemStack");
nmsItemStackClass = getNMSClass("ItemStack");
networkManagerClass = getNMSClass("NetworkManager");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//METHODS
try {
getServerMethod = minecraftServerClass.getMethod("getServer");
getCraftWorldHandleMethod = craftWorldsClass.getMethod("getHandle");
getCraftPlayerHandle = craftPlayerClass.getMethod("getHandle");
getCraftEntityHandle = craftEntityClass.getMethod("getHandle");
sendPacketMethod = playerConnectionClass.getMethod("sendPacket", packetClass);
getServerConnection = minecraftServerClass.getMethod("getServerConnection");
asBukkitCopy = craftItemStack.getMethod("asBukkitCopy", nmsItemStackClass);
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
try {
recentTPSField = minecraftServerClass.getField("recentTps");
entityPlayerPingField = entityPlayerClass.getField("ping");
playerConnectionField = entityPlayerClass.getField("playerConnection");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
public static Object getMinecraftServerInstance() throws InvocationTargetException, IllegalAccessException {
return getServerMethod.invoke(null);
return Reflection.getMethod(minecraftServerClass, "getServer", 0).invoke(null);
}
public static double[] recentTPS() throws IllegalAccessException, InvocationTargetException {
final Object minecraftServerObj = getMinecraftServerInstance();
double[] recentTPS = (double[]) recentTPSField.get(minecraftServerObj);
return recentTPS;
return (double[]) Reflection.getField(minecraftServerClass, double[].class, 0).get(minecraftServerObj);
}
public static Class<?> getNMSClass(String name) throws ClassNotFoundException {
return Class.forName(nmsDir + "." + name);
}
public static Class<?> getNMSClassWithoutException(String name) {
try {
return getNMSClass(name);
} catch (ClassNotFoundException e) {
return null;
}
}
public static Class<?> getOBCClass(String name) throws ClassNotFoundException {
return Class.forName(obcDir + "." + name);
}
@@ -87,6 +101,14 @@ public class NMSUtils {
return Class.forName(nettyPrefix + "." + name);
}
public static final String getChannelFutureListFieldName() {
if (version.isLowerThan(ServerVersion.v_1_8))
return "e";
if (version.isLowerThan(ServerVersion.v_1_13))
return "g";
return "f";
}
@Nullable
public static Entity getEntityById(final int id) {
return EntityFinderUtils.getEntityById(id);
@@ -97,16 +119,59 @@ public class NMSUtils {
return EntityFinderUtils.getEntityByIdWithWorld(world, id);
}
public static int getPlayerPing(final Player player) {
final Object craftPlayer = craftPlayerClass.cast(player);
Object entityPlayer = null;
public static Object getNMSEntity(final Entity entity) {
final Object craftEntity = craftEntityClass.cast(entity);
try {
entityPlayer = getCraftPlayerHandle.invoke(craftPlayer);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
return getCraftEntityHandle.invoke(craftEntity);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
public static Object getCraftPlayer(final Player player) {
return craftPlayerClass.cast(player);
}
public static Object getEntityPlayer(final Player player) {
Object entityPlayer = null;
try {
return getCraftPlayerHandle.invoke(getCraftPlayer(player));
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
public static Object getPlayerConnection(final Player player) {
try {
return playerConnectionField.get(getEntityPlayer(player));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
public static Object getNetworkManager(final Player player) {
try {
return Reflection.getField(playerConnectionClass, networkManagerClass, 0).get(getPlayerConnection(player));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
public static Object getChannel(final Player player) {
try {
return Reflection.getField(networkManagerClass, nettyChannelClass, 0).get(getNetworkManager(player));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
public static int getPlayerPing(final Player player) {
Object entityPlayer = getEntityPlayer(player);
try {
return entityPlayerPingField.getInt(entityPlayer);
} catch (IllegalAccessException e) {
@@ -115,11 +180,43 @@ public class NMSUtils {
return -1;
}
public static ItemStack toBukkitItemStack(final Object nmsItemstack) {
try {
return (ItemStack) asBukkitCopy.invoke(null, nmsItemstack);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
public static boolean is_1_8() {
return version.isHigherThan(ServerVersion.v_1_7_10)
&& version.isLowerThan(ServerVersion.v_1_9);
}
public static void sendSendableWrapper(final Player player, final Sendable sendable) {
sendNMSPacket(player, sendable.asNMSPacket());
}
public static void sendNMSPacket(final Player player, final Object nmsPacket) {
Object entityPlayer = getEntityPlayer(player);
Object playerConnection = null;
try {
playerConnection = playerConnectionField.get(entityPlayer);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
try {
sendPacketMethod.invoke(playerConnection, nmsPacket);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
public static String getServerConnectionFieldName() {
return "p";
}
@@ -1,17 +0,0 @@
package io.github.retrooper.packetevents.utils;
import javax.annotation.Nullable;
import java.lang.reflect.InvocationTargetException;
public class TPSUtils {
@Nullable
public static double[] getRecentTPS() {
try {
return NMSUtils.recentTPS();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
}
@@ -0,0 +1,60 @@
package io.github.retrooper.packetevents.utils.api;
import io.github.retrooper.packetevents.enums.ClientVersion;
import io.github.retrooper.packetevents.handler.NettyPacketHandler;
import io.github.retrooper.packetevents.packetwrappers.Sendable;
import io.github.retrooper.packetevents.utils.NMSUtils;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.UUID;
public final class PlayerUtils {
private final HashMap<UUID, ClientVersion> clientVersionsMap = new HashMap<UUID, ClientVersion>();
public int getPing(final Player player) {
return NMSUtils.getPlayerPing(player);
}
public ClientVersion getClientVersion(final UUID uuid) {
return clientVersionsMap.get(uuid);
}
public ClientVersion getClientVersion(final Player player) {
return getClientVersion(player.getUniqueId());
}
public void setClientVersion(final UUID uuid, final ClientVersion version) {
clientVersionsMap.put(uuid, version);
}
public void setClientVersion(final Player player, final ClientVersion version) {
setClientVersion(player.getUniqueId(), version);
}
public void clearClientVersion(final UUID uuid) {
clientVersionsMap.remove(uuid);
}
public void clearClientVersion(final Player player) {
clearClientVersion(player.getUniqueId());
}
public void injectPlayer(final Player player) {
NettyPacketHandler.injectPlayer(player);
}
public void uninjectPlayer(final Player player) {
NettyPacketHandler.uninjectPlayer(player);
}
public void uninjectPlayerNow(final Player player) {
NettyPacketHandler.uninjectPlayerNow(player);
}
public void sendPacket(final Player player, final Sendable sendable) {
NMSUtils.sendSendableWrapper(player, sendable);
}
}
@@ -0,0 +1,46 @@
package io.github.retrooper.packetevents.utils.api;
import io.github.retrooper.packetevents.enums.ServerVersion;
import io.github.retrooper.packetevents.enums.SystemOS;
import io.github.retrooper.packetevents.utils.NMSUtils;
import java.lang.reflect.InvocationTargetException;
public final class ServerUtils {
@Deprecated
public ServerVersion getServerVersion() {
return getVersion();
}
@Deprecated
public double[] getRecentServerTPS() {
return getRecentTPS();
}
@Deprecated
public double getCurrentServerTPS() {
return getCurrentTPS();
}
public ServerVersion getVersion() {
return ServerVersion.getVersion();
}
public double[] getRecentTPS() {
double[] tpsArray = new double[0];
try {
tpsArray = NMSUtils.recentTPS();
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return tpsArray;
}
public double getCurrentTPS() {
return getRecentTPS()[0];
}
public SystemOS getPlatform() {
return SystemOS.getOperatingSystem();
}
}
@@ -1,70 +1,23 @@
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);
if (entity != null) {
return entity;
}
}
return null;
}
@Nullable
public static Entity getEntityByIdWithWorld(final World world, final int id) {
Object craftWorld = craftWorldClass.cast(world);
Object worldServer = null;
try {
worldServer = craftWorldGetHandle.invoke(craftWorld);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
Object nmsEntity = null;
try {
nmsEntity = getEntityByIdMethod.invoke(worldServer, id);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
try {
return (Entity) getBukkitEntity.invoke(nmsEntity);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
private static final ServerVersion version = ServerVersion.getVersion();
private static Class<?> worldServerClass;
private static Class<?> craftWorldClass;
private static Class<?> entityClass;
private static Method getEntityByIdMethod;
private static Method craftWorldGetHandle;
private static Method getBukkitEntity;
static {
@@ -85,6 +38,47 @@ public class EntityFinderUtils {
}
}
public static Entity getEntityById(final int id) {
for (final World world : Bukkit.getWorlds()) {
final Entity entity = getEntityByIdWithWorld(world, id);
if (entity != null) {
return entity;
}
}
return null;
}
@Nullable
public static Entity getEntityByIdWithWorld(final World world, final int id) {
if (world == null) {
return null;
}
Object craftWorld = craftWorldClass.cast(world);
Object worldServer = null;
try {
worldServer = craftWorldGetHandle.invoke(craftWorld);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
Object nmsEntity = null;
try {
nmsEntity = getEntityByIdMethod.invoke(worldServer, id);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
if (nmsEntity == null) {
return null;
}
try {
return (Entity) getBukkitEntity.invoke(nmsEntity);
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
public static String getEntityByNameMethodName() {
if (version.isHigherThan(ServerVersion.v_1_7_10) && version.isLowerThan(ServerVersion.v_1_9)) {
return "a";
@@ -0,0 +1,16 @@
package io.github.retrooper.packetevents.utils.onlineplayers;
import io.github.retrooper.packetevents.enums.ServerVersion;
import org.bukkit.entity.Player;
public class OnlinePlayerUtilities {
private static final ServerVersion version = ServerVersion.getVersion();
public static Player[] getOnlinePlayers() {
if (version.isLowerThan(ServerVersion.v_1_9)) {
return OnlinePlayerUtils_8.getOnlinePlayers();
} else {
return OnlinePlayerUtils_9.getOnlinePlayers();
}
}
}
@@ -0,0 +1,12 @@
package io.github.retrooper.packetevents.utils.onlineplayers;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class OnlinePlayerUtils_8 {
public static Player[] getOnlinePlayers() {
return Bukkit.getServer().getOnlinePlayers().toArray(new Player[0]);
}
}
@@ -0,0 +1,10 @@
package io.github.retrooper.packetevents.utils.onlineplayers;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class OnlinePlayerUtils_9 {
public static Player[] getOnlinePlayers() {
return Bukkit.getOnlinePlayers().toArray(new Player[0]);
}
}
@@ -1,15 +0,0 @@
package io.github.retrooper.packetevents.utils.vector;
public class Vector2d {
public double x, y;
public Vector2d(final double x, final double y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "X: " + x + ", Y: " + y;
}
}
@@ -1,14 +0,0 @@
package io.github.retrooper.packetevents.utils.vector;
public class Vector2f {
public float x, y;
public Vector2f(final float x, final float y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "X: " + x + ", Y: " + y;
}
}
@@ -1,15 +0,0 @@
package io.github.retrooper.packetevents.utils.vector;
public class Vector2i {
public int x, y;
public Vector2i(final int x, final int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "X: " + x + ", Y: " + y;
}
}
@@ -1,14 +1,14 @@
package io.github.retrooper.packetevents.utils.vector;
public class Vector3d {
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;
@@ -1,6 +1,6 @@
package io.github.retrooper.packetevents.utils.vector;
public class Vector3f {
public final class Vector3f {
public float x, y, z;
public Vector3f(final float x, final float y, final float 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) {
@@ -0,0 +1,10 @@
package io.github.retrooper.packetevents.utils.versionlookup;
import com.comphenix.protocol.ProtocolLibrary;
import org.bukkit.entity.Player;
class ProtocolLibAPIAccessor {
public static int getProtocolVersion(final Player player) {
return ProtocolLibrary.getProtocolManager().getProtocolVersion(player);
}
}
@@ -0,0 +1,14 @@
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
public class ProtocolLibUtils {
public static boolean isAvailable() {
return Bukkit.getPluginManager().isPluginEnabled("ProtocolLib");
}
public static int getProtocolVersion(final Player player) {
return ProtocolLibAPIAccessor.getProtocolVersion(player);
}
}
@@ -0,0 +1,10 @@
package io.github.retrooper.packetevents.utils.versionlookup;
import org.bukkit.entity.Player;
import protocolsupport.api.ProtocolSupportAPI;
class ProtocolSupportAPIAccessor {
public static int getProtocolVersion(final Player player) {
return ProtocolSupportAPI.getProtocolVersion(player).getId();
}
}
Loaded 100 of 105 files, more files were not shown because too many files have changed in this diff. Show more