Compare commits

..
100 Commits
Author SHA1 Message Date
purplexdev e142d95abc attempt because github annoying 2020-05-28 19:53:33 +02:00
purplexdev 6ac93a97df attempt because github annoying 2020-05-28 19:50:57 +02:00
purplexdev 7db7e44bfc channelmanager 2020-05-28 19:48:32 +02:00
purplexdev 4792bda57b listener example commit failure fix 2020-05-28 19:46:12 +02:00
purplexdev cd009e7080 listener example commit failure fix 2020-05-28 19:32:51 +02:00
purplexdev bcc967d72d 1.2.5 Beta out!
Tested on 1.7.10 & 1.8.8, but should work for 1.7.10->1.15.2
Massive code cleanup, massive file size reduction.
Vector utility classes added,
TPS Accessing, All current wrapper classes OPTIMIZED.

Packets not received when relogging BUG FIXED!

New custom enums: Hand, Direction.
2020-05-28 19:16:02 +02:00
purplexdev 913cbf94f4 1.2.4 Update, pretty stable, many bugs fixed and lots of optimizations!
* PacketManager renamed to EventManager
* 1.7.10 player injecting fixed
* Channel handling for injecting players optimized
* Unneeded wrapper classes are not public anymore(unaccessible and your IDE shouldn't recommend them anymore)
* Wrapper classes start with WrappedPacketIn and not WrappedPacketPlayIn to shorten, for example WrappedPacketInAbilities,
* Handshake packet adding attempt but not finished
Next update wrappers and TPS accessing will be optimized!
2020-05-28 08:26:04 +02:00
purplexdev 1941d2c34d useless comments removed, NOT STABLE, 1.2.3 2020-05-26 18:45:55 +02:00
purplexdev 36140fb42b Stackoverflow exception fixed, dumb mistake 2020-05-26 18:39:59 +02:00
purplexdev 91e2668998 1.2.3 Massive beta, lots of code cleanup,
reload event not started,
packetloginevent added,
Not tested, most likely not stable.
2020-05-26 18:36:39 +02:00
purplexdev b6f625b498 Merge remote-tracking branch 'og/master' 2020-05-26 17:51:46 +02:00
purplexdev 0c176aabd2 Crazy package movement, mass code cleanup and working on player version manager 2020-05-26 17:51:23 +02:00
purplexdev 39ec5958e1 Crazy package movement, mass code cleanup and working on player version manager 2020-05-26 17:51:10 +02:00
purplex 6467fece64 no dependencies :) 2020-05-25 21:31:40 +02:00
purplexdev c6a8d5ad84 Massive code cleanup and optimizations for 1.2.2 2020-05-25 21:15:45 +02:00
purplexdev 42b1f2b1a9 1.2.2 PacketEvents cleanup method unnecessary argument removed 2020-05-25 21:07:21 +02:00
purplexdev 208823466c 1.2.2 PacketEvents cleanup method unnecessary argument removed 2020-05-25 21:07:02 +02:00
purplexdev 0c67bfb999 PacketEvents.getCurrentServerTPS() //Easily get current and recent server tps,
Many class packages moved, better package organization.
2020-05-25 21:01:54 +02:00
purplexdev d64e92d84a 1.2.1, ServerTickEvent.java now includes the current tick count and if a second has passed 2020-05-25 20:22:11 +02:00
purplexdev 29ec5f6638 MainExample (main class) better documented! 2020-05-25 19:49:50 +02:00
purplexdev 9d10d5001d Merge remote-tracking branch 'og/master' 2020-05-25 19:18:08 +02:00
purplexdev 834b29f84a testexample top edited 2020-05-25 19:16:41 +02:00
purplex 7787ce9f33 random config file removed 2020-05-25 18:24:38 +02:00
purplexdev 4775e9f815 Merge remote-tracking branch 'og/master' 2020-05-25 18:22:31 +02:00
purplexdev 7764939208 More documentation, tested and working for sure! 2020-05-25 18:22:07 +02:00
purplex 9c331ef630 Set theme jekyll-theme-cayman 2020-05-20 20:59:15 +02:00
purplex 3c3261bd96 Set theme jekyll-theme-architect 2020-05-20 20:57:09 +02:00
purplex f71530a4ee Set theme jekyll-theme-cayman 2020-05-20 20:54:07 +02:00
purplex c9e4f627c8 readme small update 2020-05-20 20:49:21 +02:00
purplex 75a5ec6022 readme small update 2020-05-20 20:49:13 +02:00
purplexdev 366490d7fc Merge remote-tracking branch 'og/master' 2020-05-11 10:42:25 +02:00
purplexdev 9f22bebd3b More understandable examples added and comments added 2020-05-11 10:42:00 +02:00
purplex 35b0e6ccd8 jitpack version updated to 1.1.9 2020-05-07 20:12:31 +02:00
purplexdev 3073342482 1.1.9 update, netty deadlock bug fixed by injecting player asynchronously 2020-05-07 09:28:31 +02:00
purplex e83086fd21 readme version updated
1.1.8 is new update
2020-05-04 17:17:06 +02:00
unknown 9c886d8abb injecting errors fixed 2020-05-04 12:28:29 +02:00
purplex 36b574edda release version updated 2020-05-01 22:18:09 +02:00
unknown 90e490466e Massive code cleanup, multiple 1.9+ bugs fixed, reflection usage is minimalized and optimized! 2020-05-01 14:49:30 +02:00
purplex 2743dafc40 latest stable versions 2020-05-01 09:38:42 +02:00
purplex 7443f3f965 readme updated and highlighted gradle, maven,.... bold 2020-05-01 08:51:03 +02:00
purplex 5e493a386c license tag part removed 2020-05-01 08:47:26 +02:00
purplex 321b306a34 gpl3 license badge update 2020-05-01 08:47:04 +02:00
purplex 08996c3e17 gpl3 badge added 2020-05-01 08:46:09 +02:00
purplex 39fc28def6 readme text updated 2020-04-30 20:53:56 +02:00
purplex c2b0109820 readme text updated 2020-04-30 11:22:38 +02:00
purplex 86dbca109b jitpack.io badge repositioned 2020-04-30 11:21:59 +02:00
purplex 904a9c458d jitpack.io badge 2020-04-30 11:21:30 +02:00
unknown 36431251c0 bug fix, unregistered testexample 2020-04-30 11:16:38 +02:00
purplex d51eb9b11e release version updated to 1.1.5, name added in title 2020-04-30 11:09:56 +02:00
unknown 9af0183a04 Flying, position, position_look wrapper added, further optimizations, various bugs fixed, imports changed, event system cleaned up 2020-04-30 11:08:20 +02:00
unknown 92cc803207 Merge branch 'master' of https://github.com/purplexdev/packetevents 2020-04-29 10:24:02 +02:00
unknown d5b693fcc4 1.7.10 support added, abilities, block_dig packet added, use_entity packet optimized 2020-04-29 10:23:51 +02:00
purplex 26a4b57915 license updated to GNU general public v3 2020-04-28 14:44:00 +02:00
purplex 56b3217cf7 tinyprotocol dependency removed 2020-04-28 14:41:38 +02:00
purplex c205f07fa3 gradle, maven,.... version updated to 1.1.3 2020-04-28 14:37:37 +02:00
unknown e3a2ab4e3e Various bug fixes, support for 1.8->1.15 spigot servers, WrappedPacketPlayInUseEntity wrapper added. More coming soon. 2020-04-28 14:31:11 +02:00
unknown 831fd763be imports fix attempt 2020-04-27 13:33:30 +02:00
unknown 95ee18cf5b ServerVersion retrieve errors fixed 2020-04-27 12:22:37 +02:00
unknown 0dd0444271 Merge branch 'master' of https://github.com/purplexdev/packetevents 2020-04-27 11:50:25 +02:00
unknown c4713479e5 build error for 1.8.9 fix attempt 2020-04-27 11:50:15 +02:00
purplex d2320a0f0a dependency version update 2020-04-27 11:29:54 +02:00
unknown e3e2cd2a18 Merge branch 'master' of https://github.com/purplexdev/packetevents 2020-04-27 11:24:40 +02:00
unknown 98754dee92 Massive optimization, 1.8->1.15 support, unneeded reflection usage (lazy) removed, now everythign is written for each version, bugs with newer versions fixed 2020-04-27 11:24:27 +02:00
purplex 9df833d052 readme, all versions updated to 1.0.8 2020-04-24 13:59:56 +02:00
unknown 1efd5fa3db PacketManager cleanup and unregister method 2020-04-24 13:54:34 +02:00
unknown 7faaf65a08 Merge branch 'master' of https://github.com/purplexdev/packetevents 2020-04-24 13:50:30 +02:00
unknown a0fab0bf49 Examples improved, small improvements 2020-04-24 13:48:20 +02:00
purplex 452824c795 maven creds changed 2020-04-23 14:12:59 +02:00
purplex 33a39739dd discord server updated 2020-04-23 13:34:38 +02:00
purplex 56b836e22a example dir added 2020-04-22 16:20:59 +02:00
purplex ae4441cbb2 maven scope removed 2020-04-22 15:06:05 +02:00
purplex 0018c682a5 gradle, sbt, leiningen version updated 2020-04-22 15:04:46 +02:00
purplex 704dba8599 ReadME message updated 2020-04-22 15:03:15 +02:00
purplex c3b842c3ae Gradle, Maven, sbt, leiningen details added
Taken from 
https://jitpack.io/#purplexdev/packetevents
2020-04-22 15:01:29 +02:00
unknown 3545f91074 TestExample has been unregistered and bukkit events registered 2020-04-22 14:37:29 +02:00
unknown f91378a5b1 Merge branch 'master' of https://github.com/purpdev/packetevents 2020-04-22 14:28:14 +02:00
unknown 8412353ee0 og 2020-04-22 14:27:19 +02:00
purplex 87657311b6 maven title update 2020-04-21 22:47:00 +02:00
purplex 807cbdb79a Maven credentials fix 2020-04-21 22:46:37 +02:00
purplex bce16c23e5 Maven creds added 2020-04-21 22:45:58 +02:00
purplex ff4c7f0231 README added(not finished) 2020-04-21 22:36:36 +02:00
purplex a6230b15d7 Licensed
Licensed to TinyProtocol’s license
2020-04-21 22:35:10 +02:00
unknown fa70848c0e testexample unregistered 2020-04-21 16:01:47 +02:00
unknown 0274014768 Packet cancelling and enums added, reflection usage added 2020-04-21 16:01:00 +02:00
unknown 44ebf50956 pom.xml changes 2020-04-21 09:35:11 +02:00
unknown 009fe731a3 ServerTickEvent added 2020-04-20 14:54:41 +02:00
unknown b4c28e53d4 pom.xml errors fixed 2020-04-20 08:16:23 +02:00
unknown 8aa8a99909 Bugs fixed and testexample improved 2020-04-20 08:07:42 +02:00
unknown 2916e57d20 TestExample improved and bugs fixed! 2020-04-20 08:06:34 +02:00
purplex 6d0a4c07c6 Merge pull request #1 from purpdev/dependabot/maven/io.netty-netty-all-4.1.42.Final
Bump netty-all from 4.0.23.Final to 4.1.42.Final
2020-04-18 19:18:50 +02:00
unknown 7a3db02214 TinyProtocol example removed, bugs fixed, testexample is no longer registered 2020-04-17 14:59:05 +02:00
dependabot[bot] 652ba2d41c Bump netty-all from 4.0.23.Final to 4.1.42.Final
Bumps [netty-all](https://github.com/netty/netty) from 4.0.23.Final to 4.1.42.Final.
- [Release notes](https://github.com/netty/netty/releases)
- [Commits](https://github.com/netty/netty/compare/netty-4.0.23.Final...netty-4.1.42.Final)

Signed-off-by: dependabot[bot] <support@github.com>
2020-04-17 12:50:48 +00:00
unknown d101b02f61 pom.xml added 2020-04-17 14:50:12 +02:00
unknown 908252f63e Package refactor 2020-04-17 14:48:08 +02:00
unknown dab75120de Merge branch 'master' of https://github.com/purplexdev/packetevents 2020-04-14 15:05:26 +02:00
unknown bb27e9ce19 Packet names and values added 2020-04-14 15:05:01 +02:00
purplex 7bbd7544c6 last .idea file deleted 2020-04-14 14:34:44 +02:00
purplex b2c8c3cad2 first .idea file deleted 2020-04-14 14:34:33 +02:00
unknown 9f385062a6 PacketSendEvent part ready 2020-04-14 14:33:50 +02:00
unknown e913c7f115 Custom event system ready 2020-04-14 14:32:56 +02:00
89 changed files with 2940 additions and 1447 deletions

No files matched your search

-39
View File
@@ -1,39 +0,0 @@
# Automatically build the project and run any configured tests for every push
# and submitted pull request. This can help catch issues that only occur on
# certain platforms or Java versions, and provides a first line of defence
# against bad commits.
name: build
on: [pull_request, push]
jobs:
build:
strategy:
matrix:
# Use these Java versions
java: [
17, # Current Java LTS & minimum supported by Minecraft
]
# and run on both Linux and Windows
os: [ubuntu-20.04, windows-2022]
runs-on: ${{ matrix.os }}
steps:
- name: checkout repository
uses: actions/checkout@v2
- name: validate gradle wrapper
uses: gradle/wrapper-validation-action@v1
- name: setup jdk ${{ matrix.java }}
uses: actions/setup-java@v1
with:
java-version: ${{ matrix.java }}
- name: make gradle wrapper executable
if: ${{ runner.os != 'Windows' }}
run: chmod +x ./gradlew
- name: build
run: ./gradlew build
- name: capture build artifacts
if: ${{ runner.os == 'Linux' && matrix.java == '17' }} # Only upload artifacts built from latest java on one OS
uses: actions/upload-artifact@v2
with:
name: Artifacts
path: build/libs/
-33
View File
@@ -1,33 +0,0 @@
# gradle
.gradle/
build/
out/
classes/
# eclipse
*.launch
# idea
.idea/
*.iml
*.ipr
*.iws
# vscode
.settings/
.vscode/
bin/
.classpath
.project
# macos
*.DS_Store
# fabric
run/
+1 -1
View File
@@ -671,4 +671,4 @@ into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.
<https://www.gnu.org/licenses/why-not-lgpl.html>.
+66 -5
View File
@@ -1,9 +1,70 @@
# Fabric Example Mod
# packetevents by purplex
## Setup
PacketListener coded by purplex.
Dependencies? Nah...
Licensed with the GPL3 license.
[![](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
Coding help discord server: https://discord.gg/ZWTkg4v
How to use with **Gradle, Maven, sbt and leiningen**.
The lastest stable version is displayed below.
[![](https://jitpack.io/v/purplexdev/packetevents.svg)](https://jitpack.io/#purplexdev/packetevents)
# Gradle
```gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.purplexdev:packetevents:1.1.9'
}
```
# Maven
```xml
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.github.purplexdev</groupId>
<artifactId>packetevents</artifactId>
<version>1.1.9</version>
</dependency>
</dependencies>
```
# sbt
```
resolvers += "jitpack" at "https://jitpack.io"
libraryDependencies += "com.github.purplexdev" % "packetevents" % "1.1.9"
```
# leiningen
```
:repositories [["jitpack" "https://jitpack.io"]]
:dependencies [[com.github.purplexdev/packetevents "1.1.9"]]
```
For setup instructions please see the [fabric wiki page](https://fabricmc.net/wiki/tutorial:setup) that relates to the IDE that you are using.
## License
This template is available under the CC0 license. Feel free to learn from it and incorporate it in your own projects.
-93
View File
@@ -1,93 +0,0 @@
plugins {
id 'fabric-loom' version '0.11-SNAPSHOT'
id 'maven-publish'
}
version = project.mod_version
group = project.maven_group
project.ext.adventureVersion = '4.10.1'
project.ext.adventureDependencies=["net.kyori:adventure-api:${adventureVersion}",
"net.kyori:adventure-text-serializer-gson:${adventureVersion}",
"net.kyori:adventure-text-serializer-legacy:${adventureVersion}",
"net.kyori:adventure-text-serializer-gson-legacy-impl:${adventureVersion}",
"net.kyori:adventure-key:${adventureVersion}",
"net.kyori:adventure-nbt:${adventureVersion}",
"net.kyori:examination-api:1.3.0",
"net.kyori:examination-string:1.3.0"]
repositories {
mavenCentral()
maven { url 'https://repo.codemc.io/repository/maven-snapshots/' }
maven {
name = 'ParchmentMC'
url = 'https://maven.parchmentmc.org'
}
}
dependencies {
modImplementation 'com.github.retrooper.packetevents:netty-common:2.0.0-SNAPSHOT'
include('com.github.retrooper.packetevents:netty-common:2.0.0-SNAPSHOT')
modImplementation(adventureDependencies)
include(adventureDependencies)
// To change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings loom.layered() {
officialMojangMappings()
parchment("org.parchmentmc.data:parchment-${project.parchment_minecraft_version}:${project.parchment_mappings}")
}
modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"
// Fabric API. This is technically optional, but you probably want it anyway.
modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
}
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
processResources {
inputs.property "version", project.version
filesMatching("fabric.mod.json") {
expand "version": project.version
}
}
tasks.withType(JavaCompile).configureEach {
// Minecraft 1.18 (1.18-pre2) upwards uses Java 17.
it.options.release = 17
}
java {
// Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task
// if it is present.
// If you remove this line, sources will not be generated.
withSourcesJar()
}
jar {
from("LICENSE") {
rename { "${it}_${project.archivesBaseName}"}
}
}
// configure the maven publication
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
// See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing.
repositories {
// Add repositories to publish to here.
// Notice: This block does NOT have the same function as the block in the top level.
// The repositories here will be used for publishing your artifact, not for
// retrieving dependencies.
}
}
-18
View File
@@ -1,18 +0,0 @@
# Done to increase the memory available to gradle.
org.gradle.jvmargs=-Xmx1G
# Fabric Properties
# check these on https://fabricmc.net/develop
minecraft_version=1.19.4
parchment_mappings=2023.03.12
parchment_minecraft_version=1.19.3
loader_version=0.14.18
# Mod Properties
mod_version = 2.0.0
maven_group = io.github.retrooper
archives_base_name = packetevents
# Dependencies
fabric_version=0.77.0+1.19.4
Binary file not shown.
-5
View File
@@ -1,5 +0,0 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
-234
View File
@@ -1,234 +0,0 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=${0##*/}
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Collect all arguments for the java command;
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
# shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# * put everything else in single quotes, so that it's not re-expanded.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
Vendored
-89
View File
@@ -1,89 +0,0 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
+184
View File
@@ -0,0 +1,184 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>me.purplex</groupId>
<artifactId>packetevents</artifactId>
<version>1.2.5</version>
<packaging>jar</packaging>
<name>packetevents</name>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<defaultGoal>clean package</defaultGoal>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</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>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
<repository>
<id>funkemunky-releases</id>
<url>https://nexus.funkemunky.cc/content/repositories/releases/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.14.1</artifactId>
<version>1.14.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.15.1</artifactId>
<version>1.15.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.github.spigot</groupId>
<artifactId>1.14.3</artifactId>
<version>1.14.3</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>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
-10
View File
@@ -1,10 +0,0 @@
pluginManagement {
repositories {
maven {
name = 'Fabric'
url = 'https://maven.fabricmc.net/'
}
mavenCentral()
gradlePluginPortal()
}
}
@@ -1,21 +0,0 @@
package io.github.retrooper.packetevents;
import io.netty.channel.ChannelPipeline;
public class ChannelUtilities {
public static boolean pipelineContainsSplitterAndPrepender(ChannelPipeline pipeline)
{
boolean containsSplitter = false;
boolean containsPrepender = false;
for(var handler : pipeline) {
PacketEventsMod.LOGGER.info(handler.getClass().getName());
if(handler.getKey().equals("splitter")) {
containsSplitter = true;
}
if(handler.getKey().equals("prepender")) {
containsPrepender = true;
}
}
return containsSplitter && containsPrepender;
}
}
@@ -1,62 +0,0 @@
package io.github.retrooper.packetevents;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.event.PacketListenerAbstract;
import com.github.retrooper.packetevents.event.PacketSendEvent;
import io.github.retrooper.packetevents.factory.fabric.FabricPacketEventsBuilder;
import io.github.retrooper.packetevents.factory.fabric.ServerInstanceManager;
import io.github.retrooper.packetevents.mixin.ClientPacketListenerAccessor;
import io.github.retrooper.packetevents.mixin.ConnectionAccessor;
import io.github.retrooper.packetevents.mixin.ServerGamePacketListenerImplAccessor;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint;
import net.minecraft.client.Minecraft;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PacketEventsMod implements PreLaunchEntrypoint, ModInitializer, ClientModInitializer {
//single player world are locked on loading, don't know why
public static final Logger LOGGER = LoggerFactory.getLogger("packetevents");
@Override
public void onPreLaunch() {
PacketEvents.setAPI(FabricPacketEventsBuilder.build("packetevents"));
PacketEvents.getAPI().getSettings().debug(true).bStats(true);
PacketEvents.getAPI().load();
//TODO Test if userconnectevent and userdisconnectevent work.
//especially disconnect
}
@Override
public void onInitialize() {
ServerInstanceManager.init();
PacketEvents.getAPI().init();
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> {
var connection = ((ServerGamePacketListenerImplAccessor)handler).getConnection();
var channel = ((ConnectionAccessor)connection).getChannel();
if(ChannelUtilities.pipelineContainsSplitterAndPrepender(channel.pipeline()))
PacketEvents.getAPI().getInjector().setPlayer(channel, handler.player);
});
PacketEvents.getAPI().getEventManager().registerListener(new PacketListenerAbstract() {
@Override
public void onPacketSend(PacketSendEvent event) {
//System.out.println("Packet send: " + event.getPacketType());
//System.out.println("player: " + event.getPlayer());
}
});
}
@Override
public void onInitializeClient() {
ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> {
var connection = ((ClientPacketListenerAccessor)handler).getConnection();
var channel = ((ConnectionAccessor)connection).getChannel();
if(ChannelUtilities.pipelineContainsSplitterAndPrepender(channel.pipeline()))
PacketEvents.getAPI().getInjector().setPlayer(channel, Minecraft.getInstance().player);
});
}
}
@@ -1,270 +0,0 @@
package io.github.retrooper.packetevents.factory.fabric;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.PacketEventsAPI;
import com.github.retrooper.packetevents.injector.ChannelInjector;
import com.github.retrooper.packetevents.manager.InternalPacketListener;
import com.github.retrooper.packetevents.manager.player.PlayerManager;
import com.github.retrooper.packetevents.manager.protocol.ProtocolManager;
import com.github.retrooper.packetevents.manager.server.ServerManager;
import com.github.retrooper.packetevents.manager.server.ServerVersion;
import com.github.retrooper.packetevents.netty.NettyManager;
import com.github.retrooper.packetevents.protocol.ProtocolVersion;
import com.github.retrooper.packetevents.protocol.packettype.PacketType;
import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.settings.PacketEventsSettings;
import com.github.retrooper.packetevents.util.LogManager;
import com.github.retrooper.packetevents.util.reflection.ReflectionObject;
import io.github.retrooper.packetevents.PacketEventsMod;
import io.github.retrooper.packetevents.handler.ServerPacketDecoder;
import io.github.retrooper.packetevents.handler.ServerPacketEncoder;
import io.github.retrooper.packetevents.impl.netty.NettyManagerImpl;
import io.github.retrooper.packetevents.impl.netty.manager.player.PlayerManagerAbstract;
import io.github.retrooper.packetevents.impl.netty.manager.protocol.ProtocolManagerAbstract;
import io.github.retrooper.packetevents.impl.netty.manager.server.ServerManagerAbstract;
import io.netty.channel.Channel;
import net.kyori.adventure.text.format.NamedTextColor;
import net.minecraft.SharedConstants;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.Connection;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.entity.player.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
import java.util.logging.Level;
import java.util.regex.Pattern;
public class FabricPacketEventsBuilder {
private static final Pattern STRIP_COLOR_PATTERN = Pattern.compile("(?i)" + '\u00A7' + "[0-9A-FK-ORX]");
private static PacketEventsAPI<MinecraftServer> INSTANCE;
public static void clearBuildCache() {
INSTANCE = null;
}
public static PacketEventsAPI<MinecraftServer> build(String modId) {
if (INSTANCE == null) {
INSTANCE = buildNoCache(modId);
}
return INSTANCE;
}
public static PacketEventsAPI<MinecraftServer> build(String modId, PacketEventsSettings settings) {
if (INSTANCE == null) {
INSTANCE = buildNoCache(modId, settings);
}
return INSTANCE;
}
public static PacketEventsAPI<MinecraftServer> buildNoCache(String modId) {
return buildNoCache(modId, new PacketEventsSettings());
}
public static PacketEventsAPI<MinecraftServer> buildNoCache(String modId, PacketEventsSettings inSettings) {
return new PacketEventsAPI<>() {
private final PacketEventsSettings settings = inSettings;
//TODO Implement platform version
private final ProtocolManager protocolManager = new ProtocolManagerAbstract() {
@Override
public ProtocolVersion getPlatformVersion() {
return ProtocolVersion.UNKNOWN;
}
};
private final ServerManager serverManager = new ServerManagerAbstract() {
private static ServerVersion VERSION;
@Override
public ServerVersion getVersion() {
//TODO Not perfect, as this is on the client! Might be inaccurate by a few patch versions.
if (VERSION == null) {
int targetPV = SharedConstants.getProtocolVersion();
for (ServerVersion version : ServerVersion.reversedValues()) {
if (version.getProtocolVersion() == targetPV) {
VERSION = version;
}
}
}
return VERSION;
}
};
private final PlayerManagerAbstract playerManager = new PlayerManagerAbstract() {
@Override
public int getPing(@NotNull Object player) {
UUID id = ((Player) player).getGameProfile().getId();
try {
var minecraft = getPlugin();
if(minecraft == null)
return ((LocalPlayer) player).connection.getPlayerInfo(id).getLatency();
else {
var playerManager = minecraft.getPlayerList();
var playerEntity = playerManager.getPlayer(id);
return playerEntity.latency;
}
} catch (Exception ex) {
PacketEvents.getAPI().getLogManager().debug("Failed to get ping for player " + id);
return -1;
}
}
@Override
public Object getChannel(@NotNull Object player) {
Connection connection = ((LocalPlayer) player).connection.getConnection();
ReflectionObject reflectConnection = new ReflectionObject(connection);
return reflectConnection.readObject(0, Channel.class);
}
};
private final ChannelInjector injector = new ChannelInjector() {
@Override
public boolean isServerBound() {
return true;
}
@Override
public void inject() {
}
@Override
public void uninject() {
}
@Override
public void updateUser(Object ch, User user) {
Channel channel = (Channel) ch;
ServerPacketDecoder decoder = (ServerPacketDecoder) channel.pipeline().get(PacketEvents.DECODER_NAME);
decoder.user = user;
ServerPacketEncoder encoder = (ServerPacketEncoder) channel.pipeline().get(PacketEvents.ENCODER_NAME);
encoder.user = user;
}
@Override
public void setPlayer(Object ch, Object player) {
Channel channel = (Channel) ch;
ServerPacketDecoder decoder = (ServerPacketDecoder) channel.pipeline().get(PacketEvents.DECODER_NAME);
decoder.player = (Player) player;
ServerPacketEncoder encoder = (ServerPacketEncoder) channel.pipeline().get(PacketEvents.ENCODER_NAME);
encoder.player = (Player) player;
}
};
private final NettyManager nettyManager = new NettyManagerImpl();
private final LogManager logManager = new LogManager() {
@Override
protected void log(Level level, @Nullable NamedTextColor color, String message) {
//First we must strip away the color codes that might be in this message
message = STRIP_COLOR_PATTERN.matcher(message).replaceAll("");
PacketEventsMod.LOGGER.info(message);
}
};
private boolean loaded;
private boolean initialized;
@Override
public void load() {
if (!loaded) {
final String id = modId.toLowerCase();
//Resolve server version and cache
PacketEvents.IDENTIFIER = "pe-" + id;
PacketEvents.ENCODER_NAME = "pe-encoder-" + id;
PacketEvents.DECODER_NAME = "pe-decoder-" + id;
PacketEvents.CONNECTION_HANDLER_NAME = "pe-connection-handler-" + id;
PacketEvents.SERVER_CHANNEL_HANDLER_NAME = "pe-connection-initializer-" + id;
injector.inject();
loaded = true;
//Register internal packet listener (should be the first listener)
//This listener doesn't do any modifications to the packets, just reads data
getEventManager().registerListener(new InternalPacketListener());
}
}
@Override
public boolean isLoaded() {
return loaded;
}
@Override
public void init() {
//Load if we haven't loaded already
load();
if (!initialized) {
if (settings.shouldCheckForUpdates()) {
getUpdateChecker().handleUpdateCheck();
}
if (settings.isbStatsEnabled()) {
//TODO Cross-platform metrics?
}
PacketType.Play.Client.load();
PacketType.Play.Server.load();
initialized = true;
}
}
@Override
public boolean isInitialized() {
return initialized;
}
@Override
public void terminate() {
if (initialized) {
//Eject the injector if needed(depends on the injector implementation)
injector.uninject();
//Unregister all our listeners
getEventManager().unregisterAllListeners();
initialized = false;
}
}
@Override
public MinecraftServer getPlugin() {
return ServerInstanceManager.getServerInstance();
}
@Override
public ProtocolManager getProtocolManager() {
return protocolManager;
}
@Override
public ServerManager getServerManager() {
return serverManager;
}
@Override
public LogManager getLogManager() {
return logManager;
}
@Override
public PlayerManager getPlayerManager() {
return playerManager;
}
@Override
public ChannelInjector getInjector() {
return injector;
}
@Override
public PacketEventsSettings getSettings() {
return settings;
}
@Override
public NettyManager getNettyManager() {
return nettyManager;
}
};
}
}
@@ -1,16 +0,0 @@
package io.github.retrooper.packetevents.factory.fabric;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.minecraft.server.MinecraftServer;
public class ServerInstanceManager {
private static MinecraftServer serverInstance;
public static void init() {
ServerLifecycleEvents.SERVER_STARTED.register(server -> serverInstance = server);
ServerLifecycleEvents.SERVER_STOPPED.register(server -> serverInstance = null);
}
public static MinecraftServer getServerInstance() {
return serverInstance;
}
}
@@ -1,31 +0,0 @@
package io.github.retrooper.packetevents.handler;
import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.util.PacketEventsImplHelper;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import java.util.List;
@ChannelHandler.Sharable
public class ClientPacketDecoder extends ServerPacketDecoder {
public ClientPacketDecoder(User user) {
super(user);
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
if (msg.isReadable()) {
ByteBuf outputBuffer = ctx.alloc().buffer().writeBytes(msg);
boolean recompress = handleCompression(ctx, outputBuffer);
PacketEventsImplHelper.handleClientBoundPacket(ctx.channel(), user, player, outputBuffer, false);
//TODO hasTasksAfter
if (outputBuffer.isReadable()) {
if (recompress) {
recompress(ctx, outputBuffer);
}
out.add(outputBuffer.retain());
}
}
}
}
@@ -1,22 +0,0 @@
package io.github.retrooper.packetevents.handler;
import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.util.PacketEventsImplHelper;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
@ChannelHandler.Sharable
public class ClientPacketEncoder extends ServerPacketEncoder {
public ClientPacketEncoder(User user) {
super(user);
}
@Override
protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception {
if (msg.isReadable()) {
PacketEventsImplHelper.handleServerBoundPacket(ctx.channel(), user, player, msg, false);
out.writeBytes(msg);
}
}
}
@@ -1,104 +0,0 @@
package io.github.retrooper.packetevents.handler;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.util.PacketEventsImplHelper;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import net.minecraft.world.entity.player.Player;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
@ChannelHandler.Sharable
public class PacketDecoder extends MessageToMessageDecoder<ByteBuf> {
private static Method DECOMPRESSOR_METHOD, COMPRESSOR_METHOD;
public User user;
public Player player;
public boolean checkedCompression;
public PacketDecoder(User user) {
this.user = user;
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
if (msg.isReadable()) {
ByteBuf outputBuffer = ctx.alloc().buffer().writeBytes(msg);
boolean recompress = handleCompression(ctx, outputBuffer);
PacketEventsImplHelper.handleClientBoundPacket(ctx.channel(), user, player, outputBuffer, false);
//TODO hasTasksAfter
if (outputBuffer.isReadable()) {
if (recompress) {
recompress(ctx, outputBuffer);
}
out.add(outputBuffer.retain());
}
}
}
@Override
public void channelInactive(@NotNull ChannelHandlerContext ctx) throws Exception {
super.channelInactive(ctx);
}
protected boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) {
if (checkedCompression) return false;
if (ctx.pipeline().names().indexOf("decompress") > ctx.pipeline().names().indexOf(PacketEvents.DECODER_NAME)) {
// Need to decompress this packet due to bad order
ChannelHandler decompressor = ctx.pipeline().get("decompress");
//CompressionDecoder
try {
if (DECOMPRESSOR_METHOD == null) {
DECOMPRESSOR_METHOD = decompressor.getClass().getDeclaredMethod("decode", ChannelHandlerContext.class, ByteBuf.class, List.class);
}
List<?> list = new ArrayList<>(1);
DECOMPRESSOR_METHOD.invoke(decompressor, ctx, buffer, list);
ByteBuf decompressed = (ByteBuf) list.get(0);
if (buffer != decompressed) {
try {
buffer.clear().writeBytes(decompressed);
} finally {
decompressed.release();
}
}
//Relocate handlers
PacketDecoder decoder = (PacketDecoder) ctx.pipeline().remove(PacketEvents.DECODER_NAME);
ctx.pipeline().addAfter("decompress", PacketEvents.DECODER_NAME, decoder);
PacketEncoder encoder = (PacketEncoder) ctx.pipeline().remove(PacketEvents.ENCODER_NAME);
ctx.pipeline().addAfter("compress", PacketEvents.ENCODER_NAME, encoder);
checkedCompression = true;
return true;
} catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
e.printStackTrace();
}
}
return false;
}
protected void recompress(ChannelHandlerContext ctx, ByteBuf buffer) {
ByteBuf compressed = ctx.alloc().buffer();
try {
ChannelHandler compressor = ctx.pipeline().get("compress");
if (COMPRESSOR_METHOD == null) {
COMPRESSOR_METHOD = compressor.getClass().getDeclaredMethod("encode", ChannelHandlerContext.class, ByteBuf.class, ByteBuf.class);
}
COMPRESSOR_METHOD.invoke(compressor, ctx, buffer, compressed);
} catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
e.printStackTrace();
}
try {
buffer.clear().writeBytes(compressed);
PacketEvents.getAPI().getLogManager().debug("Recompressed packet!");
} finally {
compressed.release();
}
}
}
@@ -1,64 +0,0 @@
package io.github.retrooper.packetevents.handler;
import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.util.PacketEventsImplHelper;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.netty.handler.codec.EncoderException;
import io.netty.handler.codec.MessageToByteEncoder;
import io.netty.util.ReferenceCountUtil;
import net.minecraft.world.entity.player.Player;
@ChannelHandler.Sharable
public class PacketEncoder extends MessageToByteEncoder<ByteBuf> {
public User user;
public Player player;
public PacketEncoder(User user) {
this.user = user;
}
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
ByteBuf buf = null;
try {
if (acceptOutboundMessage(msg)) {
ByteBuf in = (ByteBuf) msg;
buf = allocateBuffer(ctx, in, true);
try {
encode(ctx, in, buf);
} finally {
ReferenceCountUtil.release(in);
}
if (buf.isReadable()) {
ctx.write(buf, promise);
} else {
buf.release();
//We cancelled this packet, do not pass it on to the next handler.
//ctx.write(Unpooled.EMPTY_BUFFER, promise);
}
buf = null;
} else {
ctx.write(msg, promise);
}
} catch (EncoderException e) {
throw e;
} catch (Throwable e) {
throw new EncoderException(e);
} finally {
if (buf != null) {
buf.release();
}
}
}
@Override
protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception {
if (msg.isReadable()) {
PacketEventsImplHelper.handleServerBoundPacket(ctx.channel(), user, player, msg, false);
out.writeBytes(msg);
}
}
}
@@ -1,104 +0,0 @@
package io.github.retrooper.packetevents.handler;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.util.PacketEventsImplHelper;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToMessageDecoder;
import net.minecraft.world.entity.player.Player;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
@ChannelHandler.Sharable
public class ServerPacketDecoder extends MessageToMessageDecoder<ByteBuf> {
private static Method DECOMPRESSOR_METHOD, COMPRESSOR_METHOD;
public User user;
public Player player;
public boolean checkedCompression;
public ServerPacketDecoder(User user) {
this.user = user;
}
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
if (msg.isReadable()) {
ByteBuf outputBuffer = ctx.alloc().buffer().writeBytes(msg);
boolean recompress = handleCompression(ctx, outputBuffer);
PacketEventsImplHelper.handleServerBoundPacket(ctx.channel(), user, player, outputBuffer, false);
//TODO hasTasksAfter
if (outputBuffer.isReadable()) {
if (recompress) {
recompress(ctx, outputBuffer);
}
out.add(outputBuffer.retain());
}
}
}
@Override
public void channelInactive(@NotNull ChannelHandlerContext ctx) throws Exception {
super.channelInactive(ctx);
}
protected boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) {
if (checkedCompression) return false;
if (ctx.pipeline().names().indexOf("decompress") > ctx.pipeline().names().indexOf(PacketEvents.DECODER_NAME)) {
// Need to decompress this packet due to bad order
ChannelHandler decompressor = ctx.pipeline().get("decompress");
//CompressionDecoder
try {
if (DECOMPRESSOR_METHOD == null) {
DECOMPRESSOR_METHOD = decompressor.getClass().getDeclaredMethod("decode", ChannelHandlerContext.class, ByteBuf.class, List.class);
}
List<?> list = new ArrayList<>(1);
DECOMPRESSOR_METHOD.invoke(decompressor, ctx, buffer, list);
ByteBuf decompressed = (ByteBuf) list.get(0);
if (buffer != decompressed) {
try {
buffer.clear().writeBytes(decompressed);
} finally {
decompressed.release();
}
}
//Relocate handlers
ServerPacketDecoder decoder = (ServerPacketDecoder) ctx.pipeline().remove(PacketEvents.DECODER_NAME);
ctx.pipeline().addAfter("decompress", PacketEvents.DECODER_NAME, decoder);
ServerPacketEncoder encoder = (ServerPacketEncoder) ctx.pipeline().remove(PacketEvents.ENCODER_NAME);
ctx.pipeline().addAfter("compress", PacketEvents.ENCODER_NAME, encoder);
checkedCompression = true;
return true;
} catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
e.printStackTrace();
}
}
return false;
}
protected void recompress(ChannelHandlerContext ctx, ByteBuf buffer) {
ByteBuf compressed = ctx.alloc().buffer();
try {
ChannelHandler compressor = ctx.pipeline().get("compress");
if (COMPRESSOR_METHOD == null) {
COMPRESSOR_METHOD = compressor.getClass().getDeclaredMethod("encode", ChannelHandlerContext.class, ByteBuf.class, ByteBuf.class);
}
COMPRESSOR_METHOD.invoke(compressor, ctx, buffer, compressed);
} catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) {
e.printStackTrace();
}
try {
buffer.clear().writeBytes(compressed);
PacketEvents.getAPI().getLogManager().debug("Recompressed packet!");
} finally {
compressed.release();
}
}
}
@@ -1,64 +0,0 @@
package io.github.retrooper.packetevents.handler;
import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.util.PacketEventsImplHelper;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import io.netty.handler.codec.EncoderException;
import io.netty.handler.codec.MessageToByteEncoder;
import io.netty.util.ReferenceCountUtil;
import net.minecraft.world.entity.player.Player;
@ChannelHandler.Sharable
public class ServerPacketEncoder extends MessageToByteEncoder<ByteBuf> {
public User user;
public Player player;
public ServerPacketEncoder(User user) {
this.user = user;
}
@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) {
ByteBuf buf = null;
try {
if (acceptOutboundMessage(msg)) {
ByteBuf in = (ByteBuf) msg;
buf = allocateBuffer(ctx, in, true);
try {
encode(ctx, in, buf);
} finally {
ReferenceCountUtil.release(in);
}
if (buf.isReadable()) {
ctx.write(buf, promise);
} else {
buf.release();
//We cancelled this packet, do not pass it on to the next handler.
//ctx.write(Unpooled.EMPTY_BUFFER, promise);
}
buf = null;
} else {
ctx.write(msg, promise);
}
} catch (EncoderException e) {
throw e;
} catch (Throwable e) {
throw new EncoderException(e);
} finally {
if (buf != null) {
buf.release();
}
}
}
@Override
protected void encode(ChannelHandlerContext ctx, ByteBuf msg, ByteBuf out) throws Exception {
if (msg.isReadable()) {
PacketEventsImplHelper.handleClientBoundPacket(ctx.channel(), user, player, msg, false);
out.writeBytes(msg);
}
}
}
@@ -1,12 +0,0 @@
package io.github.retrooper.packetevents.mixin;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.network.Connection;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(ClientPacketListener.class)
public interface ClientPacketListenerAccessor {
@Accessor
Connection getConnection();
}
@@ -1,11 +0,0 @@
package io.github.retrooper.packetevents.mixin;
import io.netty.channel.Channel;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(net.minecraft.network.Connection.class)
public interface ConnectionAccessor {
@Accessor
Channel getChannel();
}
@@ -1,67 +0,0 @@
package io.github.retrooper.packetevents.mixin;
import com.github.retrooper.packetevents.PacketEvents;
import com.github.retrooper.packetevents.manager.protocol.ProtocolManager;
import com.github.retrooper.packetevents.netty.channel.ChannelHelper;
import com.github.retrooper.packetevents.protocol.ConnectionState;
import com.github.retrooper.packetevents.protocol.player.ClientVersion;
import com.github.retrooper.packetevents.protocol.player.User;
import com.github.retrooper.packetevents.protocol.player.UserProfile;
import io.github.retrooper.packetevents.ChannelUtilities;
import io.github.retrooper.packetevents.PacketEventsMod;
import io.github.retrooper.packetevents.handler.ServerPacketDecoder;
import io.github.retrooper.packetevents.handler.ServerPacketEncoder;
import io.github.retrooper.packetevents.handler.ClientPacketDecoder;
import io.github.retrooper.packetevents.handler.ClientPacketEncoder;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import net.minecraft.network.protocol.PacketFlow;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(net.minecraft.network.Connection.class)
public class PacketEventsInjectorMixin {
@Shadow @Final
private PacketFlow receiving;
@Inject(method = "channelActive", at = @At("HEAD"))
private void channelActive(ChannelHandlerContext ctx, CallbackInfo info) {
Channel channel = ctx.channel();
User user = new User(channel, ConnectionState.HANDSHAKING, ClientVersion.getLatest(),
new UserProfile(null, null));
ProtocolManager.USERS.put(channel, user);
ServerPacketDecoder decoder;
ServerPacketEncoder encoder;
if(receiving == PacketFlow.CLIENTBOUND) {
PacketEventsMod.LOGGER.info("Connected as Client!");
decoder = new ClientPacketDecoder(user);
encoder = new ClientPacketEncoder(user);
}
else
{
PacketEventsMod.LOGGER.info("Connected as Server!");
decoder = new ServerPacketDecoder(user);
encoder = new ServerPacketEncoder(user);
}
if(ChannelUtilities.pipelineContainsSplitterAndPrepender(channel.pipeline()))
{
channel.pipeline().addAfter("splitter", PacketEvents.DECODER_NAME, decoder);
channel.pipeline().addAfter("prepender", PacketEvents.ENCODER_NAME, encoder);
}
PacketEventsMod.LOGGER.info("Pipeline: " + ChannelHelper.pipelineHandlerNamesAsString(channel));
}
@Inject(method = "channelInactive", at = @At("HEAD"))
private void channelInactive(ChannelHandlerContext ctx, CallbackInfo info) {
PacketEventsMod.LOGGER.debug("Disconnected!");
}
}
@@ -1,12 +0,0 @@
package io.github.retrooper.packetevents.mixin;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import net.minecraft.network.Connection;
@Mixin(ServerGamePacketListenerImpl.class)
public interface ServerGamePacketListenerImplAccessor {
@Accessor
Connection getConnection();
}
@@ -0,0 +1,113 @@
package me.purplex.packetevents;
import me.purplex.packetevents.enums.ServerVersion;
import me.purplex.packetevents.event.impl.ServerTickEvent;
import me.purplex.packetevents.event.manager.EventManager;
import me.purplex.packetevents.injector.PacketInjector; //public packet injector
import me.purplex.packetevents.utils.TPSUtils; //tps utils
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;
import java.util.concurrent.*;
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();
private static int currentTick;
private static BukkitTask serverTickTask;
public static JavaPlugin plugin;
public static EventManager getEventManager() {
return eventManager;
}
@Deprecated
public static void setup(final JavaPlugin plugin, final boolean serverTickEventEnabled) {
PacketEvents.plugin = plugin;
Bukkit.getPluginManager().registerEvents(getInstance(), plugin);
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);
}
}
@Deprecated
public static void cleanup() {
if (serverTickTask != null) {
serverTickTask.cancel();
}
getEventManager().unregisterAllListeners();
}
@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);
}
@EventHandler
public void onQuit(PlayerQuitEvent e) {
packetInjector.uninjectPlayer(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;
}
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 long currentTimeMS() {
return System.nanoTime() / 1000000;
}
}
@@ -0,0 +1,9 @@
package me.purplex.packetevents.enums;
public enum Direction {
DOWN, UP, NORTH, SOUTH, WEST, EAST;
public static Direction get(final byte i) {
return values()[i];
}
}
@@ -0,0 +1,9 @@
package me.purplex.packetevents.enums;
public enum EntityUseAction {
INTERACT, INTERACT_AT, ATTACK, INVALID;
public static EntityUseAction get(final byte i) {
return values()[i];
}
}
@@ -0,0 +1,6 @@
package me.purplex.packetevents.enums;
public enum Hand {
MAIN_HAND,
OFF_HAND;
}
@@ -0,0 +1,25 @@
package me.purplex.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];
}
}
@@ -0,0 +1,24 @@
package me.purplex.packetevents.enums;
public enum PlayerDigType {
START_DESTROY_BLOCK,
ABORT_DESTROY_BLOCK,
STOP_DESTROY_BLOCK,
DROP_ALL_ITEMS,
DROP_ITEM,
RELEASE_USE_ITEM,
SWAP_HELD_ITEMS,
WRONG_PACKET;
public static PlayerDigType get(final byte i) {
return values()[i];
}
}
@@ -0,0 +1,71 @@
package me.purplex.packetevents.enums;
import org.apache.commons.lang.ArrayUtils;
import org.bukkit.Bukkit;
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;
public static ServerVersion getVersion() {
ServerVersion[] vals = values();
ArrayUtils.reverse(vals);
for (ServerVersion val : vals) {
String valName = val.name().substring(2).replace("_", ".");
if (Bukkit.getBukkitVersion().contains(valName)) {
return val;
}
}
return ERROR;
}
private static final String nmsVersionSuffix = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3];
public static String getNmsSuffix() {
return nmsVersionSuffix;
}
public static String getNMSDirectory() {
return "net.minecraft.server." + nmsVersionSuffix;
}
public static String getOBCDirectory() {
return "org.bukkit.craftbukkit." + getNmsSuffix();
}
/**
* Returns if the current version is more up to date than the argument passed version
*
* @param version
* @return
*/
public boolean isHigherThan(final ServerVersion version) {
if (this == version) return false;
return !isLowerThan(version);
}
/**
* Returns if the current version is more outdated than the argument passed version
*
* @param version
* @return
*/
public boolean isLowerThan(final ServerVersion version) {
if(version == this) return false;
byte len = (byte) values().length;
for (byte i = 0; i < len; i++) {
final ServerVersion v = values()[i];
if(v == this) {
return true;
}
else if(v == version) {
return false;
}
}
return false;
}
}
@@ -0,0 +1,22 @@
package me.purplex.packetevents.event;
import me.purplex.packetevents.PacketEvents;
import me.purplex.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();
/**
* Timestamp of the packet
* @return
*/
public long getTimestamp() {
return timestamp;
}
}
@@ -0,0 +1,17 @@
package me.purplex.packetevents.event.handler;
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 {
}
@@ -0,0 +1,27 @@
package me.purplex.packetevents.event.impl;
import me.purplex.packetevents.event.PacketEvent;
import org.bukkit.entity.Player;
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;
}
}
@@ -0,0 +1,62 @@
package me.purplex.packetevents.event.impl;
import me.purplex.packetevents.event.PacketEvent;
import org.bukkit.entity.Player;
public class PacketReceiveEvent extends PacketEvent {
private final Player player;
private final String name;
private final Object packet;
private boolean cancelled;
public PacketReceiveEvent(final Player player, final String packetName, final Object packet) {
this.player = player;
this.name = packetName;
this.packet = packet;
}
/**
* Get the player sending the packet
*
* @return
*/
public Player getPlayer() {
return this.player;
}
/**
* Get the packet's name (NMS packet class simple name)
*
* @return
*/
public String getPacketName() {
return this.name;
}
/**
* Get the raw packet object
*
* @return packet
*/
public Object getPacket() {
return this.packet;
}
/**
* Cancel the packet
*
* @param cancelled
*/
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
/**
* Returns if the packet has been cancelled
*
* @return cancelled
*/
public boolean isCancelled() {
return cancelled;
}
}
@@ -0,0 +1,258 @@
package me.purplex.packetevents.event.impl;
import me.purplex.packetevents.event.PacketEvent;
import org.bukkit.entity.Player;
public class PacketSendEvent extends PacketEvent {
private final Player player;
private final String name;
private final Object packet;
private boolean cancelled;
public PacketSendEvent(final Player player, final String packetName, final Object packet) {
this.player = player;
this.name = packetName;
this.packet = packet;
this.cancelled = false;
}
public Player getPlayer() {
return this.player;
}
public String getPacketName() {
return this.name;
}
/**
* Get the raw packet object
*
* @return nmsPacket
*/
public Object getPacket() {
return this.packet;
}
public void setCancelled(boolean cancelled) {
this.cancelled = cancelled;
}
public boolean isCancelled() {
return cancelled;
}
/*
/**
* Get the player's ping in the EntityPlayer's class
* @return ping
* @throws VersionNotFoundException
public int getPing() throws VersionNotFoundException {
int ping;
if (version == ServerVersion.v_1_8) {
net.minecraft.server.v1_8_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
} else if (version == ServerVersion.v_1_8_3) {
net.minecraft.server.v1_8_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
} else if (version == ServerVersion.v_1_8_8) {
net.minecraft.server.v1_8_R3.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
} else if (version == ServerVersion.v_1_9) {
net.minecraft.server.v1_9_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
} else if (version == ServerVersion.v_1_9_4) {
net.minecraft.server.v1_9_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
} else if (version == ServerVersion.v_1_10_2) {
net.minecraft.server.v1_10_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
} else if (version == ServerVersion.v_1_11_1 || version == ServerVersion.v_1_11_2) {
net.minecraft.server.v1_11_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
} else if (version == ServerVersion.v_1_12_1 || version == ServerVersion.v_1_12_2) {
net.minecraft.server.v1_12_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
} else if (version == ServerVersion.v_1_13) {
net.minecraft.server.v1_13_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
}
else if(version == ServerVersion.v_1_13_2) {
net.minecraft.server.v1_13_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
}
else if (version == ServerVersion.v_1_14 || version == ServerVersion.v_1_14_1) {
net.minecraft.server.v1_14_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
} else if (version == ServerVersion.v_1_15_1) {
net.minecraft.server.v1_15_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer)player).getHandle();
ping = ePlayer.ping;
} else {
throw new VersionNotFoundException();
}
return ping;
}
/**
* Get the motX variable in the EntityPlayer class
*
* @return motX
public double getMotX() throws VersionNotFoundException {
double motX;
if (version == ServerVersion.v_1_8) {
net.minecraft.server.v1_8_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer)player).getHandle();
motX = ePlayer.motX;
} else if (version == ServerVersion.v_1_8_3) {
net.minecraft.server.v1_8_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer)player).getHandle();
motX = ePlayer.motX;
} else if (version == ServerVersion.v_1_8_8) {
net.minecraft.server.v1_8_R3.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer)player).getHandle();
motX = ePlayer.motX;
} else if (version == ServerVersion.v_1_9) {
net.minecraft.server.v1_9_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer)player).getHandle();
motX = ePlayer.motX;
} else if (version == ServerVersion.v_1_9_4) {
net.minecraft.server.v1_9_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer)player).getHandle();
motX = ePlayer.motX;
} else if (version == ServerVersion.v_1_10_2) {
net.minecraft.server.v1_10_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer)player).getHandle();
motX = ePlayer.motX;
} else if (version == ServerVersion.v_1_11_1 || version == ServerVersion.v_1_11_2) {
net.minecraft.server.v1_11_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer)player).getHandle();
motX = ePlayer.motX;
} else if (version == ServerVersion.v_1_12_1 || version == ServerVersion.v_1_12_2) {
net.minecraft.server.v1_12_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer)player).getHandle();
motX = ePlayer.motX;
} else if (version == ServerVersion.v_1_13) {
net.minecraft.server.v1_13_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer)player).getHandle();
motX = ePlayer.motX;
}
else if(version == ServerVersion.v_1_13_2) {
net.minecraft.server.v1_13_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer)player).getHandle();
motX = ePlayer.motX;
}
else if (version == ServerVersion.v_1_14 || version == ServerVersion.v_1_14_1) {
net.minecraft.server.v1_14_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer)player).getHandle();
motX = ePlayer.getMot().getX();
} else if (version == ServerVersion.v_1_15_1) {
net.minecraft.server.v1_15_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer)player).getHandle();
motX = ePlayer.getMot().getX();
} else {
throw new VersionNotFoundException();
}
return motX;
}
/**
* Get the motY variable in the EntityPlayer class
*
* @return motY
public double getMotY() throws VersionNotFoundException {
double motY;
if (version == ServerVersion.v_1_8) {
net.minecraft.server.v1_8_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer)player).getHandle();
motY = ePlayer.motY;
} else if (version == ServerVersion.v_1_8_3) {
net.minecraft.server.v1_8_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer)player).getHandle();
motY = ePlayer.motY;
} else if (version == ServerVersion.v_1_8_8) {
net.minecraft.server.v1_8_R3.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer)player).getHandle();
motY = ePlayer.motY;
} else if (version == ServerVersion.v_1_9) {
net.minecraft.server.v1_9_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer)player).getHandle();
motY = ePlayer.motY;
} else if (version == ServerVersion.v_1_9_4) {
net.minecraft.server.v1_9_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer)player).getHandle();
motY = ePlayer.motY;
} else if (version == ServerVersion.v_1_10_2) {
net.minecraft.server.v1_10_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer)player).getHandle();
motY = ePlayer.motY;
} else if (version == ServerVersion.v_1_11_1 || version == ServerVersion.v_1_11_2) {
net.minecraft.server.v1_11_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer)player).getHandle();
motY = ePlayer.motY;
} else if (version == ServerVersion.v_1_12_1 || version == ServerVersion.v_1_12_2) {
net.minecraft.server.v1_12_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer)player).getHandle();
motY = ePlayer.motY;
} else if (version == ServerVersion.v_1_13) {
net.minecraft.server.v1_13_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer)player).getHandle();
motY = ePlayer.motY;
}
else if(version == ServerVersion.v_1_13_2) {
net.minecraft.server.v1_13_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer)player).getHandle();
motY = ePlayer.motY;
}
else if (version == ServerVersion.v_1_14 || version == ServerVersion.v_1_14_1) {
net.minecraft.server.v1_14_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer)player).getHandle();
motY = ePlayer.getMot().getY();
} else if (version == ServerVersion.v_1_15_1) {
net.minecraft.server.v1_15_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer)player).getHandle();
motY = ePlayer.getMot().getY();
} else {
throw new VersionNotFoundException();
}
return motY;
}
/**
* Get the motZ variable in the EntityPlayer class
*
* @return motZ
public double getMotZ() throws VersionNotFoundException {
double motZ;
if (version == ServerVersion.v_1_8) {
net.minecraft.server.v1_8_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R1.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.motZ;
} else if (version == ServerVersion.v_1_8_3) {
net.minecraft.server.v1_8_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R2.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.motZ;
} else if (version == ServerVersion.v_1_8_8) {
net.minecraft.server.v1_8_R3.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.motZ;
} else if (version == ServerVersion.v_1_9) {
net.minecraft.server.v1_9_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R1.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.motZ;
} else if (version == ServerVersion.v_1_9_4) {
net.minecraft.server.v1_9_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_9_R2.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.motZ;
} else if (version == ServerVersion.v_1_10_2) {
net.minecraft.server.v1_10_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_10_R1.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.motZ;
} else if (version == ServerVersion.v_1_11_1 || version == ServerVersion.v_1_11_2) {
net.minecraft.server.v1_11_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_11_R1.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.motZ;
} else if (version == ServerVersion.v_1_12_1 || version == ServerVersion.v_1_12_2) {
net.minecraft.server.v1_12_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.motZ;
} else if (version == ServerVersion.v_1_13) {
net.minecraft.server.v1_13_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.motZ;
}
else if(version == ServerVersion.v_1_13_2) {
net.minecraft.server.v1_13_R2.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.motZ;
}
else if (version == ServerVersion.v_1_14 || version == ServerVersion.v_1_14_1) {
net.minecraft.server.v1_14_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.getMot().getZ();
} else if (version == ServerVersion.v_1_15_1) {
net.minecraft.server.v1_15_R1.EntityPlayer ePlayer = ((org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer)player).getHandle();
motZ = ePlayer.getMot().getZ();
} else {
throw new VersionNotFoundException();
}
return motZ;
}
*/
}
@@ -0,0 +1,16 @@
package me.purplex.packetevents.event.impl;
import me.purplex.packetevents.event.PacketEvent;
import org.bukkit.entity.Player;
public class PlayerInjectEvent extends PacketEvent {
private final Player player;
public PlayerInjectEvent(final Player player) {
this.player = player;
}
public Player getPlayer() {
return player;
}
}
@@ -0,0 +1,16 @@
package me.purplex.packetevents.event.impl;
import me.purplex.packetevents.event.PacketEvent;
import org.bukkit.entity.Player;
public class PlayerUninjectEvent extends PacketEvent {
private final Player player;
public PlayerUninjectEvent(final Player player) {
this.player = player;
}
public Player getPlayer() {
return player;
}
}
@@ -0,0 +1,5 @@
package me.purplex.packetevents.event.impl;
//unfinished
public class ServerReloadEvent {
}
@@ -0,0 +1,32 @@
package me.purplex.packetevents.event.impl;
import me.purplex.packetevents.PacketEvents;
import me.purplex.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;
}
}
@@ -0,0 +1,4 @@
package me.purplex.packetevents.event.listener;
public interface PacketListener {
}
@@ -0,0 +1,68 @@
package me.purplex.packetevents.event.manager;
import me.purplex.packetevents.event.PacketEvent;
import me.purplex.packetevents.event.handler.PacketHandler;
import me.purplex.packetevents.event.listener.PacketListener;
import java.lang.reflect.*;
public class EventManager implements PacketEventManager {
@Override
public void callEvent(final PacketEvent e) {
for (final PacketListener listener : this.packetListeners) {
boolean calledOnPacket = false;
//Annotated methods
final Method[] methods = listener.getClass().getMethods();
for (int i = 0; i < methods.length; i++) {
final Method m = methods[i];
if (m.isAnnotationPresent(PacketHandler.class)) {
if (!calledOnPacket && m.getParameterTypes()[0].equals(PacketEvent.class)) {
try {
m.invoke(listener, e);
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InvocationTargetException ex) {
ex.printStackTrace();
}
calledOnPacket = true;
} else if (m.getParameterTypes()[0].getSimpleName().equals(e.getClass().getSimpleName())) {
try {
m.invoke(listener, e);
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InvocationTargetException ex) {
ex.printStackTrace();
}
}
}
}
}
}
@Override
public void registerListener(final PacketListener e) {
this.packetListeners.add(e);
}
@Override
public boolean unregisterListener(final PacketListener e) {
return this.packetListeners.remove(e);
}
@Override
public boolean unregisterAllListeners() {
if (this.packetListeners.size() != 0) {
this.packetListeners.clear();
return true;
}
return false;
}
/*@Override
public void sendPacket(Player player, WrappedPacket packet) {
}*/
}
@@ -0,0 +1,20 @@
package me.purplex.packetevents.event.manager;
import me.purplex.packetevents.event.PacketEvent;
import me.purplex.packetevents.event.listener.PacketListener;
import java.util.ArrayList;
import java.util.LinkedList;
public interface PacketEventManager {
public ArrayList<PacketListener> packetListeners = new ArrayList<>();
public void callEvent(PacketEvent e);
public void registerListener(PacketListener e);
public boolean unregisterListener(PacketListener e);
public boolean unregisterAllListeners();
//public void sendPacket(Player player, WrappedPacket packet);
}
@@ -0,0 +1,60 @@
package me.purplex.packetevents.example;
import me.purplex.packetevents.PacketEvents;
import me.purplex.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
//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(Location loc) {
this.to = loc;
}
public void setFrom(Location loc) {
this.from = from;
}
}
@@ -0,0 +1,37 @@
package me.purplex.packetevents.example;
import me.purplex.packetevents.PacketEvents;
import org.bukkit.plugin.java.JavaPlugin;
public class MainExample extends JavaPlugin {
@Override
public void onEnable() {
//Should the ServerTickEvent ever get called?
final boolean serverTickEventEnabled = true;
/**
* Starts the servertickevent repeating task (if enabled)
* and registers onJoin and onQuit events to inject and uninject players.
* The first argument is an instance to your Main Class,
* The second argument is a boolean whether the servertickevent should ever get called
*/
PacketEvents.setup(this, serverTickEventEnabled);
/**
* Register TestExample's PacketListener
*/
PacketEvents.getEventManager().registerListener(new RegisteredListener());
}
@Override
public void onDisable() {
/**
* Stops server tick event task if enabled and unregister all listeners
*/
PacketEvents.cleanup();
}
}
@@ -0,0 +1,182 @@
package me.purplex.packetevents.example;
import me.purplex.packetevents.PacketEvents;
import me.purplex.packetevents.enums.Direction;
import me.purplex.packetevents.enums.EntityUseAction;
import me.purplex.packetevents.enums.Hand;
import me.purplex.packetevents.enums.PlayerDigType;
import me.purplex.packetevents.event.PacketEvent;
import me.purplex.packetevents.event.impl.*;
import me.purplex.packetevents.event.handler.PacketHandler;
import me.purplex.packetevents.event.listener.PacketListener;
import me.purplex.packetevents.packet.Packet;
import me.purplex.packetevents.packetwrappers.in.abilities.WrappedPacketInAbilities;
import me.purplex.packetevents.packetwrappers.in.blockdig.WrappedPacketInBlockDig;
import me.purplex.packetevents.packetwrappers.in.chat.WrappedPacketInChat;
import me.purplex.packetevents.packetwrappers.in.flying.WrappedPacketInFlying;
import me.purplex.packetevents.packetwrappers.in.use_entity.WrappedPacketInUseEntity;
import me.purplex.packetevents.packetwrappers.login.handshake.WrappedPacketLoginHandshake;
import me.purplex.packetevents.utils.playerprotocolversion.PlayerVersionManager;
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;
/**
* 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 distance = entity.getLocation().distanceSquared(p.getLocation());
final Hand hand = useEntity.getHand();
final EntityUseAction action = 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;
//System.out.println("YOU SAID: " + message);
}
}
@PacketHandler
public void onPacketSend(PacketSendEvent e) {
}
@PacketHandler
public void onCustomMove(CustomMoveEvent e) {
double distance = e.getTo().distanceSquared(e.getFrom());
}
@PacketHandler
public void onInject(PlayerInjectEvent event) {
//event.getPlayer().sendMessage("injected");
//event.setCancelled(true) is possible
}
@PacketHandler
public void onUninject(PlayerUninjectEvent e) {
//e.setCancelled(true); will
}
/**
* Another way to listen to packets
*
* @param e PacketEvent
*/
@PacketHandler
public void onPacket(PacketEvent e) {
if (e instanceof PacketSendEvent) {
final PacketSendEvent p = (PacketSendEvent) e;
final Player targetPlayer = p.getPlayer();
final Object rawNMSPacket = p.getPacket();
final long timestamp = p.getTimestamp();
} 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");
} else if (e instanceof PacketLoginEvent) {
//System.out.println("LLLOOOOOGIN");
final PacketLoginEvent event = (PacketLoginEvent) e;
if (event.getPacketName().equals(Packet.Login.HANDSHAKE)) {
final WrappedPacketLoginHandshake handshake = new WrappedPacketLoginHandshake(event.getPacket());
final String hostname = handshake.hostname;
final int port = handshake.port;
final int protocolVersion = handshake.protocolVersion;
PlayerVersionManager.setPlayerProtocolVersion(event.getPlayer().getUniqueId(), protocolVersion);
// System.out.println("PROTOCOL NUMBER: " + protocolVersion);
}
}
}
/**
* Call the CustomMoveEvent event
*
* @param e PlayerMoveEvent
*/
@EventHandler
public void onMove(PlayerMoveEvent e) {
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());
}
}
/**
* Only listen to server tick (if enabled)
*
* @param e ServerTickEvent
*/
@PacketHandler
public void onServerTick(ServerTickEvent e) {
}
}
@@ -0,0 +1,134 @@
package me.purplex.packetevents.injector;
import me.purplex.packetevents.enums.ServerVersion;
import net.minecraft.server.v1_8_R3.NetworkManager;
import net.minecraft.util.io.netty.channel.Channel;
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.");
}
//FIELDS & METHODS
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.getDeclaredMethod("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.");
}
if (!handleMethod.isAccessible()) {
handleMethod.setAccessible(true);
}
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 Object getChannel(final Player player) {
final UUID uuid = player.getUniqueId();
if (playerChannels.containsKey(uuid)) {
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";
}
}
}
@@ -0,0 +1,33 @@
package me.purplex.packetevents.injector;
import me.purplex.packetevents.PacketEvents;
import me.purplex.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);
// player.sendMessage("injected");
}
}
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());
}
}
@@ -0,0 +1,61 @@
package me.purplex.packetevents.injector;
import me.purplex.packetevents.PacketEvents;
import me.purplex.packetevents.event.impl.PacketReceiveEvent;
import me.purplex.packetevents.event.impl.PacketSendEvent;
import me.purplex.packetevents.event.impl.PlayerInjectEvent;
import me.purplex.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);
}
}
@@ -0,0 +1,62 @@
package me.purplex.packetevents.injector;
import io.netty.channel.Channel;
import io.netty.channel.ChannelDuplexHandler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import me.purplex.packetevents.PacketEvents;
import me.purplex.packetevents.event.impl.PacketReceiveEvent;
import me.purplex.packetevents.event.impl.PacketSendEvent;
import me.purplex.packetevents.event.impl.PlayerInjectEvent;
import me.purplex.packetevents.event.impl.PlayerUninjectEvent;
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);
}
}
@@ -0,0 +1,82 @@
package me.purplex.packetevents.packet;
public abstract class Packet {
public static class Client {
private static final String CLIENT = "PacketPlayIn";
public static final String KEEP_ALIVE = CLIENT + "KeepAlive";
@Deprecated
public static final String FLYING = CLIENT + "Flying";
public static final String POSITION = CLIENT + "Position";
public static final String POSITION_LOOK = CLIENT + "PositionLook";
public static final String LOOK = CLIENT + "Look";
@Deprecated
public static final String LEGACY_POSITION = FLYING + "$" + CLIENT + "Position";
@Deprecated
public static final String LEGACY_POSITION_LOOK = FLYING + "$" + CLIENT + "PositionLook";
@Deprecated
public static final String LEGACY_LOOK = FLYING + "$" + CLIENT + "Look";
public static final String TRANSACTION = CLIENT + "Transaction";
public static final String BLOCK_DIG = CLIENT + "BlockDig";
public static final String ENTITY_ACTION = CLIENT + "EntityAction";
public static final String USE_ENTITY = CLIENT + "UseEntity";
public static final String WINDOW_CLICK = CLIENT + "WindowClick";
public static final String STEER_VEHICLE = CLIENT + "SteerVehicle";
public static final String CUSTOM_PAYLOAD = CLIENT + "CustomPayload";
public static final String ARM_ANIMATION = CLIENT + "ArmAnimation";
public static final String BLOCK_PLACE_1_9 = CLIENT + "BlockPlace1_9";
public static final String BLOCK_PLACE = CLIENT + "BlockPlace";
public static final String ABILITIES = CLIENT + "Abilities";
public static final String HELD_ITEM_SLOT = CLIENT + "HeldItemSlot";
public static final String CLOSE_WINDOW = CLIENT + "CloseWindow";
public static final String TAB_COMPLETE = CLIENT + "TabComplete";
public static final String CHAT = CLIENT + "Chat";
public static final String CREATIVE_SLOT = CLIENT + "SetCreativeSlot";
public static final String CLIENT_COMMAND = CLIENT + "ClientCommand";
}
public static class Server {
private static final String SERVER = "PacketPlayOut";
public static final String ANIMATION = SERVER + "Animation";
public static final String KEEP_ALIVE = SERVER + "KeepAlive";
public static final String CHAT = SERVER + "Chat";
public static final String POSITION = SERVER + "Position";
public static final String TRANSACTION = SERVER + "Transaction";
public static final String NAMED_ENTITY_SPAWN = SERVER + "NamedEntitySpawn";
public static final String SPAWN_ENTITY_LIVING = SERVER + "SpawnEntityLiving";
public static final String SPAWN_ENTITY = SERVER + "SpawnEntity";
public static final String CUSTOM_PAYLOAD = SERVER + "CustomPayload";
public static final String ABILITIES = SERVER + "Abilities";
public static final String ENTITY_METADATA = SERVER + "EntityMetadata";
public static final String ENTITY_VELOCITY = SERVER + "EntityVelocity";
public static final String ENTITY_DESTROY = SERVER + "EntityDestroy";
public static final String ENTITY_HEAD_ROTATION = SERVER + "EntityHeadRotation";
public static final String BLOCK_CHANGE = SERVER + "BlockChange";
public static final String CLOSE_WINDOW = SERVER + "CloseWindow";
public static final String HELD_ITEM = SERVER + "HeldItemSlot";
public static final String TAB_COMPLETE = SERVER + "TabComplete";
public static final String RESPAWN = SERVER + "Respawn";
public static final String WORLD_PARTICLE = SERVER + "WorldParticles";
public static final String COMMANDS = SERVER + "Commands";
public static final String OPEN_WINDOW = SERVER + "OpenWindow";
public static final String LOGIN = SERVER + "Login";
public static final String SERVER_DIFFICULTY = SERVER + "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)) {
return true;
}
return fatherPacket.equals(childPacket);
}
}
@@ -0,0 +1,29 @@
package me.purplex.packetevents.packetwrappers.api;
import me.purplex.packetevents.enums.ServerVersion;
public class WrappedPacket {
protected Object packet;
protected static ServerVersion version = ServerVersion.getVersion();
private static final String err = "Your Version is unsupported, " +
"please contact purplex(creator) " +
"through his discord server (http://discord.gg/2uZY5A4) " +
"and tell him what version your server is running on! " +
"Make sure you are using spigot!";
public WrappedPacket(Object packet) {
this.packet = packet;
try {
setup();
} catch (Exception e) {
e.printStackTrace();
}
}
protected void setup() throws Exception {
}
protected void throwUnsupportedVersion() {
throw new IllegalStateException(err);
}
}
@@ -0,0 +1,12 @@
package me.purplex.packetevents.packetwrappers.api.sendable;
import org.bukkit.entity.Player;
/**
* Unfinished
*/
public class WrappedServerPacket {
public WrappedServerPacket(Player target) {
}
}
@@ -0,0 +1,15 @@
package me.purplex.packetevents.packetwrappers.api.version;
import me.purplex.packetevents.PacketEvents;
import me.purplex.packetevents.enums.ServerVersion;
public abstract class WrappedVersionPacket {
protected final Object packet;
protected static ServerVersion version = PacketEvents.getServerVersion();
public WrappedVersionPacket(Object packet) {
this.packet = packet;
setup();
}
protected abstract void setup();
}
@@ -0,0 +1,81 @@
package me.purplex.packetevents.packetwrappers.in.abilities;
import me.purplex.packetevents.packetwrappers.api.WrappedPacket;
import me.purplex.packetevents.utils.NMSUtils;
import java.lang.reflect.Field;
public class WrappedPacketInAbilities extends WrappedPacket {
private boolean isVulnerable;
private boolean isFlying;
private boolean allowFly;
private boolean instantBuild;
private float flySpeed;
private float walkSpeed;
public WrappedPacketInAbilities(Object packet) {
super(packet);
}
@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);
}
public boolean isVulnerable() {
return isVulnerable;
}
public boolean isFlying() {
return isFlying;
}
public boolean canFly() {
return allowFly;
}
public boolean canInstantlyBuild() {
return instantBuild;
}
public float getFlySpeed() {
return flySpeed;
}
public float getWalkSpeed() {
return walkSpeed;
}
private static Class<?> abilitiesClass;
private static Field[] fields = new Field[6];
static {
//CLASS
try {
abilitiesClass = NMSUtils.getNMSClass("PacketPlayInAbilities");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//FIELDS
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) {
f.setAccessible(true);
}
}
}
@@ -0,0 +1,139 @@
package me.purplex.packetevents.packetwrappers.in.blockdig;
import me.purplex.packetevents.enums.Direction;
import me.purplex.packetevents.enums.PlayerDigType;
import me.purplex.packetevents.enums.ServerVersion;
import me.purplex.packetevents.packetwrappers.api.WrappedPacket;
import me.purplex.packetevents.utils.BaseBlockUtils;
import me.purplex.packetevents.utils.NMSUtils;
import me.purplex.packetevents.utils.math.*;
import java.lang.reflect.Field;
public class WrappedPacketInBlockDig extends WrappedPacket {
private Vector3i blockPosition;
private Direction direction;
private PlayerDigType digType;
public WrappedPacketInBlockDig(Object packet) {
super(packet);
}
@Override
protected void setup() throws Exception {
final Direction enumDirection;
final PlayerDigType enumDigType;
//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);
this.blockPosition = new Vector3i(x, y, z);
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());
}
this.direction = enumDirection;
this.digType = enumDigType;
}
public Vector3i getBlockPosition() {
return blockPosition;
}
public Direction getDirection() {
return direction;
}
public PlayerDigType getDigType() {
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 {
//CLASSES
try {
blockDigClass = NMSUtils.getNMSClass("PacketPlayInBlockDig");
if (version != ServerVersion.v_1_7_10) {
blockPositionClass = NMSUtils.getNMSClass("BlockPosition");
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//FIELDS
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);
}
}
}
@@ -0,0 +1,55 @@
package me.purplex.packetevents.packetwrappers.in.chat;
import me.purplex.packetevents.enums.ServerVersion;
import me.purplex.packetevents.packetwrappers.api.WrappedPacket;
import me.purplex.packetevents.utils.NMSUtils;
import java.lang.reflect.Field;
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();
}
public String getMessage() {
return message;
}
private static Class<?> chatPacketClass;
private static Field field;
static {
//CLASSES
try {
chatPacketClass = NMSUtils.getNMSClass("PacketPlayInChat");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
field = chatPacketClass.getDeclaredField(getChatFieldName());
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
if (!field.isAccessible()) {
field.setAccessible(true);
}
}
private static String getChatFieldName() {
if (version == ServerVersion.v_1_7_10) {
return "message";
}
return "a";
}
}
@@ -0,0 +1,144 @@
package me.purplex.packetevents.packetwrappers.in.flying;
import me.purplex.packetevents.enums.ServerVersion;
import me.purplex.packetevents.packetwrappers.api.WrappedPacket;
import me.purplex.packetevents.utils.NMSUtils;
import java.lang.reflect.Field;
public class WrappedPacketInFlying extends WrappedPacket {
private double x;
private double y;
private double z;
private float yaw;
private float pitch;
private boolean onGround;
private boolean isPosition;
private boolean isLook;
public WrappedPacketInFlying(Object packet) {
super(packet);
}
@Override
protected void setup() throws IllegalAccessException {
this.x = fields[0].getDouble(packet);
this.y = fields[1].getDouble(packet);
this.z = fields[2].getDouble(packet);
this.yaw = fields[3].getFloat(packet);
this.pitch = fields[4].getFloat(packet);
this.onGround = fields[5].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;
}
}
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() {
return x;
}
public double getY() {
return y;
}
public double getZ() {
return z;
}
public float getYaw() {
return yaw;
}
public float getPitch() {
return pitch;
}
public boolean isOnGround() {
return onGround;
}
public boolean isPosition() {
return isPosition;
}
public boolean isLook() {
return isLook;
}
private static Class<?> flyingClass;
private static Field[] fields = new Field[8]; //x, y, z, yaw pitch, onGround, isPositionPacket, isLookPacket
static {
//CLASS
try {
flyingClass = NMSUtils.getNMSClass("PacketPlayInFlying");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//FIELDS
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.isAccessible()) {
f.setAccessible(true);
}
}
}
private static String getOnGroundFieldName() {
if (version == ServerVersion.v_1_7_10) {
return "g";
}
return "f";
}
}
@@ -0,0 +1,105 @@
package me.purplex.packetevents.packetwrappers.in.use_entity;
import me.purplex.packetevents.enums.EntityUseAction;
import me.purplex.packetevents.enums.Hand;
import me.purplex.packetevents.enums.ServerVersion;
import me.purplex.packetevents.packetwrappers.api.WrappedPacket;
import me.purplex.packetevents.utils.NMSUtils;
import me.purplex.packetevents.utils.math.Vector3d;
import org.bukkit.entity.Entity;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
public class WrappedPacketInUseEntity extends WrappedPacket {
private int entityId;
private Entity entity;
private EntityUseAction action;
private Hand hand;
public WrappedPacketInUseEntity(Object packet) {
super(packet);
}
@Override
protected void setup() throws IllegalAccessException, InvocationTargetException {
entityId = fields[0].getInt(packet);
// Object nmsEntity = NMSUtils.getEntityById(entityId);
//this.entity = (Entity) getBukkitEntityFromNMS.invoke(nmsEntity);
this.entity = (Entity) NMSUtils.getEntityById(entityId);
Object useActionEnum = fields[1].get(packet);
action = EntityUseAction.valueOf(useActionEnum.toString());
Object handObj;
if (fields[2] == null) {
handObj = Hand.MAIN_HAND.name();
} else {
handObj = fields[2].get(packet);
}
hand = Hand.valueOf(handObj.toString());
}
/**
* Getting entity will be optimized
* @return
*/
@Deprecated
public Entity getEntity() {
return entity;
}
public int getEntityId() {
return entityId;
}
public EntityUseAction getAction() {
return action;
}
public Hand getHand() {
return hand;
}
private static Class<?> useEntityClass;
private static Class<?> entityClass;
private static Field[] fields = new Field[3];
static {
//CLASSES
try {
useEntityClass = NMSUtils.getNMSClass("PacketPlayInUseEntity");
entityClass = NMSUtils.getNMSClass("Entity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//FIELDS
try {
fields[0] = useEntityClass.getDeclaredField("a");
fields[1] = useEntityClass.getDeclaredField("action");
if (version.isHigherThan(ServerVersion.v_1_8_8)) {
fields[2] = useEntityClass.getDeclaredField("d");
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
for (Field f : fields) {
if (f != null) {
if (!f.isAccessible()) {
f.setAccessible(true);
}
}
}
}
}
@@ -0,0 +1,98 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.enums.ServerVersion;
import me.purplex.packetevents.packetwrappers.api.WrappedPacket;
public class WrappedPacketLoginHandshake extends WrappedPacket {
public String hostname;
public int port;
public int protocolVersion;
public WrappedPacketLoginHandshake(Object packet) {
super(packet);
}
@Override
protected void setup() {
if(version == ServerVersion.v_1_7_10) {
WrappedPacketLoginHandshake_1_7_10 p = new WrappedPacketLoginHandshake_1_7_10(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version == ServerVersion.v_1_8) {
WrappedPacketLoginHandshake_1_8 p = new WrappedPacketLoginHandshake_1_8(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version == ServerVersion.v_1_8_3) {
WrappedPacketLoginHandshake_1_8_3 p = new WrappedPacketLoginHandshake_1_8_3(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version == ServerVersion.v_1_8_8) {
WrappedPacketLoginHandshake_1_8_8 p = new WrappedPacketLoginHandshake_1_8_8(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version == ServerVersion.v_1_9) {
WrappedPacketLoginHandshake_1_9 p = new WrappedPacketLoginHandshake_1_9(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version==ServerVersion.v_1_9_4) {
WrappedPacketLoginHandshake_1_9_4 p = new WrappedPacketLoginHandshake_1_9_4(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version==ServerVersion.v_1_10) {
WrappedPacketLoginHandshake_1_10 p = new WrappedPacketLoginHandshake_1_10(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version == ServerVersion.v_1_11) {
WrappedPacketLoginHandshake_1_11 p = new WrappedPacketLoginHandshake_1_11(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version == ServerVersion.v_1_12) {
WrappedPacketLoginHandshake_1_12 p = new WrappedPacketLoginHandshake_1_12(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version == ServerVersion.v_1_13) {
WrappedPacketLoginHandshake_1_13 p = new WrappedPacketLoginHandshake_1_13(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version == ServerVersion.v_1_13_2) {
WrappedPacketLoginHandshake_1_13_2 p = new WrappedPacketLoginHandshake_1_13_2(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version == ServerVersion.v_1_14) {
WrappedPacketLoginHandshake_1_14 p = new WrappedPacketLoginHandshake_1_14(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else if(version == ServerVersion.v_1_15) {
WrappedPacketLoginHandshake_1_15 p = new WrappedPacketLoginHandshake_1_15(packet);
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.protocolVersion;
}
else {
throwUnsupportedVersion();
}
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_10_R1.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_10 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_10(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.b();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_11_R1.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_11 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_11(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.b();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_12_R1.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_12 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_12(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.b();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_13_R1.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_13 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_13(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.c();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_13_R2.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_13_2 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_13_2(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.c();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_14_R1.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_14 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_14(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.c();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_15_R1.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_15 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
protected WrappedPacketLoginHandshake_1_15(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.c();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_7_R4.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_7_10 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_7_10(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.b;
this.port = p.c;
this.protocolVersion = p.d();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_8_R1.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_8 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_8(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.b;
this.port = p.c;
this.protocolVersion = p.b();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_8_R2.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_8_3 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_8_3(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.b;
this.port = p.c;
this.protocolVersion = p.b();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_8_R3.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_8_8 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_8_8(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.b();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_9_R1.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_9 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_9(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.b();
}
}
@@ -0,0 +1,21 @@
package me.purplex.packetevents.packetwrappers.login.handshake;
import me.purplex.packetevents.packetwrappers.api.version.WrappedVersionPacket;
import net.minecraft.server.v1_9_R2.PacketHandshakingInSetProtocol;
class WrappedPacketLoginHandshake_1_9_4 extends WrappedVersionPacket {
public String hostname;
public int port;
public int protocolVersion;
WrappedPacketLoginHandshake_1_9_4(Object packet) {
super(packet);
}
@Override
protected void setup() {
PacketHandshakingInSetProtocol p = (PacketHandshakingInSetProtocol)packet;
this.hostname = p.hostname;
this.port = p.port;
this.protocolVersion = p.b();
}
}
@@ -0,0 +1,33 @@
package me.purplex.packetevents.utils;
import me.purplex.packetevents.PacketEvents;
import me.purplex.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";
}
}
@@ -0,0 +1,105 @@
package me.purplex.packetevents.utils;
import me.purplex.packetevents.enums.ServerVersion;
import net.minecraft.server.v1_7_R4.WorldServer;
import net.minecraft.server.v1_8_R3.MinecraftServer;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.craftbukkit.v1_8_R1.CraftWorld;
import org.bukkit.entity.Entity;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
public class NMSUtils {
private static final ServerVersion version = ServerVersion.getVersion();
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 Class<?> worldServerClass;
private static Method getCraftWorldHandleMethod;
private static Method entityMethod;
static {
//CLASSES
try {
minecraftServerClass = getNMSClass("MinecraftServer");
worldServerClass = getNMSClass("WorldServer");
craftWorldsClass = getOBCClass("CraftWorld");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//METHODS
try {
getServerMethod = minecraftServerClass.getMethod("getServer");
getCraftWorldHandleMethod = craftWorldsClass.getMethod("getHandle");
// entityMethod = worldServerClass.getMethod(is_1_8() ? "a" : "getEntity");
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
//FIELDS
try {
recentTPSField = minecraftServerClass.getField("recentTps");
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
public static Object getMinecraftServerInstance() throws InvocationTargetException, IllegalAccessException {
return getServerMethod.invoke(null);
}
public static double[] recentTPS() throws IllegalAccessException, InvocationTargetException {
final Object minecraftServerObj = getMinecraftServerInstance();
double[] recentTPS = (double[]) recentTPSField.get(minecraftServerObj);
return recentTPS;
}
public static Class<?> getNMSClass(String name) throws ClassNotFoundException {
return Class.forName(nmsDir + "." + name);
}
public static Class<?> getOBCClass(String name) throws ClassNotFoundException {
return Class.forName(obcDir + "." + name);
}
public static Object getEntityById(final int id) throws InvocationTargetException, IllegalAccessException {
//1.13.2 worlds field -> getWorlds()
//1.8->1.8.8, world.a(ID); rest is getEntity(ID);
final List<World> worlds = Bukkit.getWorlds();
for (World w : worlds) {
/* Object craftWorld = craftWorldsClass.cast(w);
Object worldServer = getCraftWorldHandleMethod.invoke(craftWorld);
try {
return entityMethod.invoke(worldServer, id);
} catch (NullPointerException e) {
continue;
}*/
for(Entity e : w.getEntities()) {
if(e.getEntityId() == id) {
return e;
}
}
}
return null;
}
public static boolean is_1_8() {
return version.isHigherThan(ServerVersion.v_1_7_10)
&& version.isLowerThan(ServerVersion.v_1_9);
}
}
@@ -0,0 +1,15 @@
package me.purplex.packetevents.utils;
import java.lang.reflect.InvocationTargetException;
public class TPSUtils {
public static double[] getRecentTPS() {
try {
return NMSUtils.recentTPS();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
}
@@ -0,0 +1,15 @@
package me.purplex.packetevents.utils.math;
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;
}
}
@@ -0,0 +1,14 @@
package me.purplex.packetevents.utils.math;
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;
}
}
@@ -0,0 +1,15 @@
package me.purplex.packetevents.utils.math;
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;
}
}
@@ -0,0 +1,16 @@
package me.purplex.packetevents.utils.math;
public class Vector3d {
public double x, y, z;
public Vector3d(final double x, final double y, final double z) {
this.x = x;
this.y = y;
this.z = z;
}
@Override
public String toString() {
return "X: " + x + ", Y: " + y + ", Z: " + z;
}
}
@@ -0,0 +1,16 @@
package me.purplex.packetevents.utils.math;
public class Vector3f {
public float x, y, z;
public Vector3f(final float x, final float y, final float z) {
this.x = x;
this.y = y;
this.z = z;
}
@Override
public String toString() {
return "X: " + x + ", Y: " + y + ", Z: " + z;
}
}
@@ -0,0 +1,16 @@
package me.purplex.packetevents.utils.math;
public class Vector3i {
public int x, y, z;
public Vector3i(final int x, final int y, final int z) {
this.x = x;
this.y = y;
this.z = z;
}
@Override
public String toString() {
return "X: " + x + ", Y: " + y + ", Z: " + z;
}
}
@@ -0,0 +1,34 @@
package me.purplex.packetevents.utils.playerprotocolversion;
import org.bukkit.entity.Player;
import java.util.*;
public class PlayerVersionManager {
private static HashMap<UUID, Integer> protocolVersion = new HashMap<UUID, Integer>();
public static int getPlayerProtocolVersion(final Player player) {
return protocolVersion.get(player.getUniqueId());
}
public static void setPlayerProtocolVersion(final Player player, final int version) {
protocolVersion.put(player.getUniqueId(), version);
}
public static void clearPlayer(final Player player) {
protocolVersion.remove(player.getUniqueId());
}
public static int getPlayerProtocolVersion(final UUID uuid) {
return protocolVersion.get(uuid);
}
public static void setPlayerProtocolVersion(final UUID uuid, final int version) {
protocolVersion.put(uuid, version);
}
public static void clearPlayer(final UUID uuid) {
protocolVersion.remove(uuid);
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 453 B

-43
View File
@@ -1,43 +0,0 @@
{
"schemaVersion": 1,
"id": "packetevents",
"version": "${version}",
"name": "PacketEvents Fabric",
"description": "fabric implementation of packetevents",
"authors": [
"Me!"
],
"contact": {
"homepage": "https://github.com/retrooper/packetevents-fabric",
"sources": "https://github.com/retrooper/packetevents-fabric"
},
"license": "GPLv3",
"icon": "assets/packetevents/icon.png",
"environment": "*",
"entrypoints": {
"preLaunch": [
"io.github.retrooper.packetevents.PacketEventsMod"
],
"main": [
"io.github.retrooper.packetevents.PacketEventsMod"
],
"client": [
"io.github.retrooper.packetevents.PacketEventsMod"
]
},
"mixins": [
"packetevents.mixins.json"
],
"depends": {
"fabricloader": ">=0.14.18",
"fabric": "*",
"minecraft": "1.19.x",
"java": ">=17"
},
"suggests": {
}
}
@@ -1,17 +0,0 @@
{
"required": true,
"minVersion": "0.8",
"package": "io.github.retrooper.packetevents.mixin",
"compatibilityLevel": "JAVA_17",
"mixins": [
"ConnectionAccessor",
"PacketEventsInjectorMixin",
"ServerGamePacketListenerImplAccessor"
],
"injectors": {
"defaultRequire": 1
},
"client": [
"ClientPacketListenerAccessor"
]
}
+4
View File
@@ -0,0 +1,4 @@
name: packetevents
version: 1.2.4
main: me.purplex.packetevents.example.MainExample
author: purplex