├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── build.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── resources
└── plugin.yml
├── settings.gradle
└── src
└── protocolsupport
├── CommandHandler.java
├── ProtocolSupport.java
├── api
├── Connection.java
├── ProtocolSupportAPI.java
├── ProtocolType.java
├── ProtocolVersion.java
├── events
│ ├── ConnectionCloseEvent.java
│ ├── ConnectionEvent.java
│ ├── ConnectionOpenEvent.java
│ ├── PlayerAbstractLoginEvent.java
│ ├── PlayerLoginFinishEvent.java
│ ├── PlayerLoginStartEvent.java
│ └── PlayerProfileCompleteEvent.java
└── utils
│ ├── Any.java
│ ├── Profile.java
│ └── ProfileProperty.java
├── injector
└── BungeeNettyChannelInjector.java
├── protocol
├── ConnectionImpl.java
├── packet
│ ├── handler
│ │ └── PSInitialHandler.java
│ ├── id
│ │ └── LegacyPacketId.java
│ ├── middle
│ │ ├── MiddlePacket.java
│ │ ├── ReadableMiddlePacket.java
│ │ └── WriteableMiddlePacket.java
│ └── middleimpl
│ │ ├── readable
│ │ ├── DefinedReadableMiddlePacket.java
│ │ ├── LegacyDefinedReadableMiddlePacket.java
│ │ ├── LegacyDynamicLengthPassthroughReadableMiddlePacket.java
│ │ ├── LegacyFixedLengthPassthroughReadableMiddlePacket.java
│ │ ├── handshake
│ │ │ ├── v_4_5
│ │ │ │ └── PingHandshakePacket.java
│ │ │ ├── v_4_5_6
│ │ │ │ └── LoginHandshakePacket.java
│ │ │ └── v_6
│ │ │ │ └── PingHandshakePacket.java
│ │ ├── login
│ │ │ └── v_4_5_6
│ │ │ │ ├── EncryptionResponsePacket.java
│ │ │ │ └── LoginClientCommandPacket.java
│ │ └── play
│ │ │ ├── v_4_5
│ │ │ ├── EntityActionPacket.java
│ │ │ └── PlayerAbilitiesPacket.java
│ │ │ ├── v_4_5_6
│ │ │ ├── AnimationPacket.java
│ │ │ ├── BlockDigPacket.java
│ │ │ ├── BlockPlacePacket.java
│ │ │ ├── ClientCommandPacket.java
│ │ │ ├── ClientSettingsPacket.java
│ │ │ ├── FromClientChatPacket.java
│ │ │ ├── FromServerChatPacket.java
│ │ │ ├── HeldSlotPacket.java
│ │ │ ├── InventoryClickPacket.java
│ │ │ ├── InventoryClosePacket.java
│ │ │ ├── InventoryCreativeSetSlotPacket.java
│ │ │ ├── InventorySelectEnchant.java
│ │ │ ├── InventoryTransactionPacket.java
│ │ │ ├── KeepAlivePacket.java
│ │ │ ├── KickPacket.java
│ │ │ ├── PlayerFlyingPacket.java
│ │ │ ├── PlayerListItemPacket.java
│ │ │ ├── PlayerLookPacket.java
│ │ │ ├── PlayerPositionLookPacket.java
│ │ │ ├── PlayerPositionPacket.java
│ │ │ ├── PluginMessagePacket.java
│ │ │ ├── RespawnPacket.java
│ │ │ ├── StartGamePacket.java
│ │ │ ├── TabCompleteRequestPacket.java
│ │ │ ├── TabCompleteResponsePacket.java
│ │ │ ├── UpdateSignPacket.java
│ │ │ └── UseEntityPacket.java
│ │ │ ├── v_5_6
│ │ │ ├── ScoreboardDisplayPacket.java
│ │ │ ├── ScoreboardObjectivePacket.java
│ │ │ ├── ScoreboardScorePacket.java
│ │ │ └── ScoreboardTeamPacket.java
│ │ │ └── v_6
│ │ │ ├── EntityActionPacket.java
│ │ │ ├── PlayerAbilitiesPacket.java
│ │ │ └── VehicleControlPacket.java
│ │ └── writeable
│ │ ├── LegacySingleWriteablePacket.java
│ │ ├── NoopWriteablePacket.java
│ │ ├── SingleWriteablePacket.java
│ │ ├── handshake
│ │ ├── v_4_5_6
│ │ │ └── LoginRequestServerHandshakePacket.java
│ │ └── v_4_5_6_pe
│ │ │ └── HandshakeCachePacket.java
│ │ ├── login
│ │ └── v_4_5_6
│ │ │ └── EncryptionRequestPacket.java
│ │ ├── play
│ │ ├── v_4_5_6
│ │ │ ├── ClientCommandPacket.java
│ │ │ ├── ClientSettingsPacket.java
│ │ │ ├── EntityEffectAddPacket.java
│ │ │ ├── EntityEffectRemovePacket.java
│ │ │ ├── EntityStatusPacket.java
│ │ │ ├── GameStatePacket.java
│ │ │ ├── KeepAlivePacket.java
│ │ │ ├── KickPacket.java
│ │ │ ├── PlayerListItemPacket.java
│ │ │ ├── PluginMessagePacket.java
│ │ │ ├── RespawnPacket.java
│ │ │ ├── StartGamePacket.java
│ │ │ ├── TabCompleteResponsePacket.java
│ │ │ ├── ToClientChatPacket.java
│ │ │ └── ToServerChatPacket.java
│ │ └── v_5_6
│ │ │ ├── ScoreboardDisplayPacket.java
│ │ │ ├── ScoreboardObjectivePacket.java
│ │ │ ├── ScoreboardScorePacket.java
│ │ │ └── ScoreboardTeamPacket.java
│ │ └── status
│ │ └── v_4_5_6
│ │ └── StatusResponsePacket.java
├── pipeline
│ ├── ChannelHandlers.java
│ ├── IPipeLineBuilder.java
│ ├── common
│ │ ├── EncapsulatedConnectionKeepAlive.java
│ │ ├── EncapsulatedHandshakeSender.java
│ │ ├── LogicHandler.java
│ │ ├── NoOpFrameDecoder.java
│ │ ├── NoOpFrameEncoder.java
│ │ ├── PacketCompressor.java
│ │ ├── PacketDecompressor.java
│ │ └── VarIntFrameDecoder.java
│ ├── initial
│ │ ├── InitialPacketDecoder.java
│ │ ├── ProtocolUtils.java
│ │ └── SetProtocolTask.java
│ └── version
│ │ ├── AbstractPacketEncoder.java
│ │ ├── LegacyAbstractFromClientPacketDecoder.java
│ │ ├── LegacyAbstractFromServerPacketDecoder.java
│ │ ├── v_1_4
│ │ ├── FromClientPacketDecoder.java
│ │ ├── FromServerPacketDecoder.java
│ │ ├── PipeLineBuilder.java
│ │ ├── ToClientPacketEncoder.java
│ │ └── ToServerPacketEncoder.java
│ │ ├── v_1_5
│ │ ├── FromClientPacketDecoder.java
│ │ ├── FromServerPacketDecoder.java
│ │ ├── PipeLineBuilder.java
│ │ ├── ToClientPacketEncoder.java
│ │ └── ToServerPacketEncoder.java
│ │ └── v_1_6
│ │ ├── FromClientPacketDecoder.java
│ │ ├── FromServerPacketDecoder.java
│ │ ├── PipeLineBuilder.java
│ │ ├── ToClientPacketEncoder.java
│ │ └── ToServerPacketEncoder.java
├── serializer
│ ├── ArraySerializer.java
│ ├── MiscSerializer.java
│ ├── StringSerializer.java
│ ├── TypeCopier.java
│ └── VarNumberSerializer.java
├── storage
│ ├── NetworkDataCache.java
│ └── ProtocolStorage.java
├── typeremapper
│ └── LegacyDimension.java
└── utils
│ ├── EncapsulatedProtocolInfo.java
│ ├── EncapsulatedProtocolUtils.java
│ ├── GameProfile.java
│ ├── ProtocolVersionsHelper.java
│ └── registry
│ ├── ClassMapMiddleTransformerRegistry.java
│ └── PacketIdMiddleTransformerRegistry.java
└── utils
├── ClassMap.java
├── JsonUtils.java
├── PingSerializer.java
├── ReflectionUtils.java
├── Utils.java
└── netty
├── Allocator.java
├── ChannelInitializer.java
├── Compressor.java
├── Decompressor.java
└── ReplayingDecoderBuffer.java
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 | *.sln merge=union
7 | *.csproj merge=union
8 | *.vbproj merge=union
9 | *.fsproj merge=union
10 | *.dbproj merge=union
11 |
12 | # Standard to msysgit
13 | *.doc diff=astextplain
14 | *.DOC diff=astextplain
15 | *.docx diff=astextplain
16 | *.DOCX diff=astextplain
17 | *.dot diff=astextplain
18 | *.DOT diff=astextplain
19 | *.pdf diff=astextplain
20 | *.PDF diff=astextplain
21 | *.rtf diff=astextplain
22 | *.RTF diff=astextplain
23 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Build Folders #
2 | bin/
3 | build/
4 | target/
5 | gen/
6 | <<<<<<< HEAD
7 | libraries_runtime/
8 | libraries_shade/
9 | build_libraries/
10 | logs/
11 | =======
12 | dllibs/
13 | out/
14 |
15 | .externalToolBuilders/
16 | # Eclipse Files #
17 | *.project
18 | *.classpath
19 | *.prefs
20 | /.apt_generated/
21 | *.factorypath
22 | >>>>>>> branch 'master' of https://github.com/ProtocolSupport/ProtocolSupportBungee
23 |
24 | # Gradle
25 | .gradle
26 | .gradletasknamecache
27 |
28 | # Eclipse Files #
29 | *.project
30 | *.classpath
31 | *.prefs
32 | *.factorypath
33 | .apt_generated/
34 | .externalToolBuilders/
35 |
36 | # Netbeans
37 | .nb-gradle/
38 |
39 | # IntelliJ
40 | .idea/
41 | *.iml
42 |
43 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ProtocolSupportBungee
2 | ================
3 |
4 | [](https://build.true-games.org/job/ProtocolSupportBungee/)
5 | [](https://discord.gg/x935y8p)
6 |
7 |
8 | Support for 1.6, 1.5, 1.4.7, pe clients on BungeeCord
9 | This plugin is under development
10 |
11 | Important notes:
12 | * Only latest version of this plugin is supported
13 | * This plugin can't be reloaded or loaded not at BungeeCord startup
14 |
15 | ---
16 |
17 | ProtocolSupportBungee is a passthrough protocol plugin, not a converter, so servers behind BungeeCord should also support those versions
18 |
19 | Also servers behind Bungeecord should support https://github.com/ProtocolSupport/ProtocolSupport/wiki/Encapsulation-Protocol
20 |
21 | The preferred setup is to put ProtocolSupport to all servers behind BungeeCord
22 |
23 | ---
24 |
25 | Jenkins: http://build.true-games.org/job/ProtocolSupportBungee/
26 |
27 | ---
28 |
29 | Licensed under the terms of GNU AGPLv3
30 |
--------------------------------------------------------------------------------
/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | repositories {
3 | mavenCentral()
4 | maven {
5 | url 'https://jitpack.io'
6 | }
7 | }
8 | dependencies {
9 | classpath group: 'com.github.HurricaneGamesOrg', name: 'ManualGradleDependencySupplier', version: '1e9e953fb4'
10 | }
11 | }
12 |
13 | plugins {
14 | id 'com.github.johnrengelman.shadow' version '5.0.0'
15 | id 'java'
16 | }
17 |
18 | apply plugin: 'org.hurricanegames.ManualGradleDependencySupplier'
19 |
20 |
21 | defaultTasks 'build'
22 |
23 |
24 | group 'protocolsupport'
25 | version '1.16.3-1'
26 |
27 |
28 | import java.nio.file.Path
29 | import java.nio.file.Paths
30 | import java.nio.file.Files
31 |
32 | import org.hurricanegames.manualgradledependencysupplier.DependencySupplier
33 | import org.hurricanegames.manualgradledependencysupplier.DownloadDependencySupplier
34 | import org.hurricanegames.manualgradledependencysupplier.ManualGradleDependencySupplier
35 |
36 |
37 | Path projectDirectoryPath = projectDir.toPath().toAbsolutePath()
38 |
39 |
40 | sourceCompatibility = JavaVersion.VERSION_1_8
41 |
42 | sourceSets {
43 | main {
44 | java {
45 | srcDirs = ['src']
46 | }
47 | resources {
48 | srcDirs = ['resources']
49 | }
50 | }
51 | }
52 |
53 | repositories {
54 | mavenCentral()
55 | }
56 |
57 | dependencies {
58 | compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.8.1'
59 | compile group: 'it.unimi.dsi', name: 'fastutil', version: '8.2.2'
60 |
61 | compileOnly ManualGradleDependencySupplier.supplyDependecies(
62 | projectDirectoryPath.resolve('libraries_runtime'),
63 | [
64 | new DownloadDependencySupplier(
65 | 'bungeecord-1.16.4-1.jar',
66 | new URL('https://papermc.io/api/v1/travertine/1.16/163/download')
67 | )
68 | ],
69 | true
70 | )
71 | }
72 |
73 | compileJava {
74 | doFirst {
75 | classpath -= configurations.compileOnly
76 | classpath += configurations.compileOnly
77 | }
78 |
79 | options.encoding = 'UTF-8'
80 | options.incremental = false
81 | }
82 |
83 |
84 | shadowJar {
85 | from sourceSets.main.java.srcDirs
86 | from 'LICENSE'
87 |
88 | archiveName = jar.archiveName
89 |
90 | exclude 'META-INF/**'
91 | relocate 'org.apache', 'protocolsupport.libs.org.apache'
92 | relocate 'it.unimi.dsi.fastutil', 'protocolsupport.libs.it.unimi.dsi.fastutil'
93 |
94 | minimize()
95 | }
96 |
97 |
98 | task copyFinalJarToTarget(type: DefaultTask) {doLast{
99 | Path targetJarDirectory = projectDirectoryPath.resolve("target")
100 | Files.createDirectories(targetJarDirectory)
101 | Files.copy(
102 | shadowJar.archivePath.toPath().toAbsolutePath(),
103 | targetJarDirectory.resolve(shadowJar.baseName + '.jar'),
104 | java.nio.file.StandardCopyOption.REPLACE_EXISTING
105 | )
106 | }}
107 |
108 |
109 | jar.enabled = false
110 | jar.finalizedBy(shadowJar)
111 | shadowJar.finalizedBy(copyFinalJarToTarget)
112 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ProtocolSupport/ProtocolSupportBungee/3c60790d9a7793caeb94e219f38b3223c919b998/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Mon Sep 12 09:22:55 CEST 2016
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-bin.zip
7 |
--------------------------------------------------------------------------------
/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ##############################################################################
4 | ##
5 | ## Gradle start up script for UN*X
6 | ##
7 | ##############################################################################
8 |
9 | # Attempt to set APP_HOME
10 | # Resolve links: $0 may be a link
11 | PRG="$0"
12 | # Need this for relative symlinks.
13 | while [ -h "$PRG" ] ; do
14 | ls=`ls -ld "$PRG"`
15 | link=`expr "$ls" : '.*-> \(.*\)$'`
16 | if expr "$link" : '/.*' > /dev/null; then
17 | PRG="$link"
18 | else
19 | PRG=`dirname "$PRG"`"/$link"
20 | fi
21 | done
22 | SAVED="`pwd`"
23 | cd "`dirname \"$PRG\"`/" >/dev/null
24 | APP_HOME="`pwd -P`"
25 | cd "$SAVED" >/dev/null
26 |
27 | APP_NAME="Gradle"
28 | APP_BASE_NAME=`basename "$0"`
29 |
30 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
31 | DEFAULT_JVM_OPTS=""
32 |
33 | # Use the maximum available, or set MAX_FD != -1 to use that value.
34 | MAX_FD="maximum"
35 |
36 | warn ( ) {
37 | echo "$*"
38 | }
39 |
40 | die ( ) {
41 | echo
42 | echo "$*"
43 | echo
44 | exit 1
45 | }
46 |
47 | # OS specific support (must be 'true' or 'false').
48 | cygwin=false
49 | msys=false
50 | darwin=false
51 | nonstop=false
52 | case "`uname`" in
53 | CYGWIN* )
54 | cygwin=true
55 | ;;
56 | Darwin* )
57 | darwin=true
58 | ;;
59 | MINGW* )
60 | msys=true
61 | ;;
62 | NONSTOP* )
63 | nonstop=true
64 | ;;
65 | esac
66 |
67 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
68 |
69 | # Determine the Java command to use to start the JVM.
70 | if [ -n "$JAVA_HOME" ] ; then
71 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
72 | # IBM's JDK on AIX uses strange locations for the executables
73 | JAVACMD="$JAVA_HOME/jre/sh/java"
74 | else
75 | JAVACMD="$JAVA_HOME/bin/java"
76 | fi
77 | if [ ! -x "$JAVACMD" ] ; then
78 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
79 |
80 | Please set the JAVA_HOME variable in your environment to match the
81 | location of your Java installation."
82 | fi
83 | else
84 | JAVACMD="java"
85 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
86 |
87 | Please set the JAVA_HOME variable in your environment to match the
88 | location of your Java installation."
89 | fi
90 |
91 | # Increase the maximum file descriptors if we can.
92 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
93 | MAX_FD_LIMIT=`ulimit -H -n`
94 | if [ $? -eq 0 ] ; then
95 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
96 | MAX_FD="$MAX_FD_LIMIT"
97 | fi
98 | ulimit -n $MAX_FD
99 | if [ $? -ne 0 ] ; then
100 | warn "Could not set maximum file descriptor limit: $MAX_FD"
101 | fi
102 | else
103 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
104 | fi
105 | fi
106 |
107 | # For Darwin, add options to specify how the application appears in the dock
108 | if $darwin; then
109 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
110 | fi
111 |
112 | # For Cygwin, switch paths to Windows format before running java
113 | if $cygwin ; then
114 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
115 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
116 | JAVACMD=`cygpath --unix "$JAVACMD"`
117 |
118 | # We build the pattern for arguments to be converted via cygpath
119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
120 | SEP=""
121 | for dir in $ROOTDIRSRAW ; do
122 | ROOTDIRS="$ROOTDIRS$SEP$dir"
123 | SEP="|"
124 | done
125 | OURCYGPATTERN="(^($ROOTDIRS))"
126 | # Add a user-defined pattern to the cygpath arguments
127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
129 | fi
130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
131 | i=0
132 | for arg in "$@" ; do
133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
135 |
136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
138 | else
139 | eval `echo args$i`="\"$arg\""
140 | fi
141 | i=$((i+1))
142 | done
143 | case $i in
144 | (0) set -- ;;
145 | (1) set -- "$args0" ;;
146 | (2) set -- "$args0" "$args1" ;;
147 | (3) set -- "$args0" "$args1" "$args2" ;;
148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
154 | esac
155 | fi
156 |
157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
158 | function splitJvmOpts() {
159 | JVM_OPTS=("$@")
160 | }
161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
163 |
164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
165 |
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 | if "%@eval[2+2]" == "4" goto 4NT_args
53 |
54 | :win9xME_args
55 | @rem Slurp the command line arguments.
56 | set CMD_LINE_ARGS=
57 | set _SKIP=2
58 |
59 | :win9xME_args_slurp
60 | if "x%~1" == "x" goto execute
61 |
62 | set CMD_LINE_ARGS=%*
63 | goto execute
64 |
65 | :4NT_args
66 | @rem Get arguments from the 4NT Shell from JP Software
67 | set CMD_LINE_ARGS=%$
68 |
69 | :execute
70 | @rem Setup the command line
71 |
72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
73 |
74 | @rem Execute Gradle
75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
76 |
77 | :end
78 | @rem End local scope for the variables with windows NT shell
79 | if "%ERRORLEVEL%"=="0" goto mainEnd
80 |
81 | :fail
82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
83 | rem the _cmd.exe /c_ return code!
84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
85 | exit /b 1
86 |
87 | :mainEnd
88 | if "%OS%"=="Windows_NT" endlocal
89 |
90 | :omega
91 |
--------------------------------------------------------------------------------
/resources/plugin.yml:
--------------------------------------------------------------------------------
1 | name: ProtocolSupportBungee
2 | main: protocolsupport.ProtocolSupport
3 | version: 1.16.3-1
4 | author: _Shevchik_
5 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | rootProject.name = 'ProtocolSupportBungee'
2 |
--------------------------------------------------------------------------------
/src/protocolsupport/CommandHandler.java:
--------------------------------------------------------------------------------
1 | package protocolsupport;
2 |
3 | import java.util.List;
4 | import java.util.stream.Collectors;
5 |
6 | import net.md_5.bungee.api.ChatColor;
7 | import net.md_5.bungee.api.CommandSender;
8 | import net.md_5.bungee.api.ProxyServer;
9 | import net.md_5.bungee.api.chat.TextComponent;
10 | import net.md_5.bungee.api.plugin.Command;
11 | import protocolsupport.api.Connection;
12 | import protocolsupport.api.ProtocolSupportAPI;
13 | import protocolsupport.api.ProtocolVersion;
14 |
15 | public class CommandHandler extends Command {
16 |
17 | public CommandHandler() {
18 | super("protocolsupportbungee", "protocolsupport.cmds", "psb");
19 | }
20 |
21 | @Override
22 | public void execute(CommandSender sender, String[] args) {
23 | if ((args.length == 1) || (args.length == 2)) {
24 | if (args[0].equalsIgnoreCase("list")) {
25 | sender.sendMessage(new TextComponent(ChatColor.GREEN + "ProtocolSupport Players:"));
26 | for (ProtocolVersion version : ProtocolVersion.getAllSupported()) {
27 | List players = ProxyServer.getInstance().getPlayers().stream()
28 | .filter(player -> ProtocolSupportAPI.getProtocolVersion(player) == version)
29 | .map(player -> player.getName())
30 | .collect(Collectors.toList());
31 | if (!players.isEmpty() || ((args.length == 2) && (args[1].equalsIgnoreCase("v") || args[1].equalsIgnoreCase("verbose")))) {
32 | sender.sendMessage(new TextComponent(ChatColor.GOLD + "[" + version.getName() + "]: " + ChatColor.GREEN + String.join(", ", players)));
33 | }
34 | }
35 | if ((args.length == 1) || !(args[1].equalsIgnoreCase("v") || args[1].equalsIgnoreCase("verbose"))) {
36 | sender.sendMessage(new TextComponent(ChatColor.GOLD + "List all compatible versions using " + ChatColor.GREEN + "/psb list verbose"));
37 | }
38 | } else if (args[0].equalsIgnoreCase("connections")) {
39 | for (Connection connection : ProtocolSupportAPI.getConnections()) {
40 | sender.sendMessage(new TextComponent(ChatColor.GREEN + connection.toString()));
41 | }
42 | }
43 | }
44 | }
45 |
46 | }
47 |
--------------------------------------------------------------------------------
/src/protocolsupport/ProtocolSupport.java:
--------------------------------------------------------------------------------
1 | package protocolsupport;
2 |
3 | import java.util.logging.Level;
4 |
5 | import net.md_5.bungee.api.ProxyServer;
6 | import net.md_5.bungee.api.plugin.Plugin;
7 | import protocolsupport.injector.BungeeNettyChannelInjector;
8 |
9 | public class ProtocolSupport extends Plugin {
10 |
11 | @Override
12 | public void onLoad() {
13 | try {
14 | getProxy().getPluginManager().registerCommand(this, new CommandHandler());
15 | BungeeNettyChannelInjector.inject();
16 | } catch (Throwable t) {
17 | getLogger().log(Level.SEVERE, "Error occured while initalizing", t);
18 | }
19 | }
20 |
21 | @SuppressWarnings("deprecation")
22 | @Override
23 | public void onEnable() {
24 | if (!ProxyServer.getInstance().getConfig().isDisableEntityMetadataRewrite()) {
25 | getLogger().log(Level.SEVERE, "Entity metadata rewrite must be disabled in order for plugin to work");
26 | }
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/ProtocolSupportAPI.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api;
2 |
3 | import java.net.SocketAddress;
4 | import java.util.ArrayList;
5 | import java.util.List;
6 |
7 | import net.md_5.bungee.api.connection.ProxiedPlayer;
8 | import protocolsupport.protocol.storage.ProtocolStorage;
9 |
10 | public class ProtocolSupportAPI {
11 |
12 | /**
13 | * Returns player protocol version
14 | * Returns UNKNOWN if player is not online or is not a real player
15 | * @param player player
16 | * @return player protocol version or UNKNOWN
17 | */
18 | public static ProtocolVersion getProtocolVersion(ProxiedPlayer player) {
19 | Connection connection = getConnection(player);
20 | return connection != null ? connection.getVersion() : ProtocolVersion.UNKNOWN;
21 | }
22 |
23 | /**
24 | * Returns protocol version of connection with specified address
25 | * Returns UNKNOWN if there is no connection with specified address
26 | * @param address address
27 | * @return connection protocol version or UNKNOWN
28 | */
29 | public static ProtocolVersion getProtocolVersion(SocketAddress address) {
30 | Connection connection = getConnection(address);
31 | return connection != null ? connection.getVersion() : ProtocolVersion.UNKNOWN;
32 | }
33 |
34 | /**
35 | * Returns all currently active connections
36 | * @return all currently active connections
37 | */
38 | public static List getConnections() {
39 | return new ArrayList<>(ProtocolStorage.getConnections());
40 | }
41 |
42 | /**
43 | * Returns player {@link Connection}
44 | * Returns null if player is not online or is not a real player
45 | * @param player player
46 | * @return player {@link Connection} or null
47 | */
48 | public static Connection getConnection(ProxiedPlayer player) {
49 | return getConnection(player.getAddress());
50 | }
51 |
52 | /**
53 | * Returns connection with specified address
54 | * Returns null if there is no connection with specified address
55 | * @param address address
56 | * @return {@link Connection} with specified address
57 | */
58 | public static Connection getConnection(SocketAddress address) {
59 | return ProtocolStorage.getConnection(address);
60 | }
61 |
62 | }
63 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/ProtocolType.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api;
2 |
3 | public enum ProtocolType {
4 | PC, UNKNOWN;
5 | }
6 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/events/ConnectionCloseEvent.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api.events;
2 |
3 | import protocolsupport.api.Connection;
4 |
5 | public class ConnectionCloseEvent extends ConnectionEvent {
6 |
7 | public ConnectionCloseEvent(Connection connection) {
8 | super(connection);
9 | }
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/events/ConnectionEvent.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api.events;
2 |
3 | import net.md_5.bungee.api.plugin.Event;
4 | import protocolsupport.api.Connection;
5 |
6 | public abstract class ConnectionEvent extends Event {
7 |
8 | private final Connection connection;
9 |
10 | public ConnectionEvent(Connection connection) {
11 | this.connection = connection;
12 | }
13 |
14 | public Connection getConnection() {
15 | return this.connection;
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/events/ConnectionOpenEvent.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api.events;
2 |
3 | import protocolsupport.api.Connection;
4 |
5 | public class ConnectionOpenEvent extends ConnectionEvent {
6 |
7 | public ConnectionOpenEvent(Connection connection) {
8 | super(connection);
9 | }
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/events/PlayerAbstractLoginEvent.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api.events;
2 |
3 | import protocolsupport.api.Connection;
4 |
5 | public abstract class PlayerAbstractLoginEvent extends ConnectionEvent {
6 |
7 | public PlayerAbstractLoginEvent(Connection connection) {
8 | super(connection);
9 | }
10 |
11 | private String denyLoginMessage;
12 |
13 | /**
14 | * Returns true if login is denied
15 | * @return true if login is denied
16 | */
17 | public boolean isLoginDenied() {
18 | return denyLoginMessage != null;
19 | }
20 |
21 | /**
22 | * Returns deny login message or null if login is not denied
23 | * @return deny login message or null
24 | */
25 | public String getDenyLoginMessage() {
26 | return denyLoginMessage;
27 | }
28 |
29 | /**
30 | * Sets the login deny message
31 | * If message is null, login won't be denied
32 | * @param message login deny message
33 | */
34 | public void denyLogin(String message) {
35 | this.denyLoginMessage = message;
36 | }
37 |
38 | }
39 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/events/PlayerLoginFinishEvent.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api.events;
2 |
3 | import java.util.UUID;
4 |
5 | import protocolsupport.api.Connection;
6 | import protocolsupport.api.utils.Profile;
7 |
8 | /**
9 | * This event is fired when player login finishes (after online-mode processing and uuid generation, but before actual world join)
10 | * This event is fired only if {@link PlayerLoginStartEvent} has fired for this client
11 | */
12 | public class PlayerLoginFinishEvent extends PlayerAbstractLoginEvent {
13 |
14 | public PlayerLoginFinishEvent(Connection connection) {
15 | super(connection);
16 | }
17 |
18 | /**
19 | * Returns player uuid
20 | * Is a shortcut to {@link Profile#getUUID()}
21 | * @return player uuid
22 | */
23 | public UUID getUUID() {
24 | return getConnection().getProfile().getUUID();
25 | }
26 |
27 | /**
28 | * Returns true if this player logged in using online-mode checks
29 | * Is a shorcut to {@link Profile#isOnlineMode()}
30 | * @return true if this player logged in using online-mode checks
31 | */
32 | public boolean isOnlineMode() {
33 | return getConnection().getProfile().isOnlineMode();
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/events/PlayerLoginStartEvent.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api.events;
2 |
3 | import net.md_5.bungee.BungeeCord;
4 | import protocolsupport.api.Connection;
5 |
6 | /**
7 | * This event is fired after player login start (after login start packet which contains client username)
8 | */
9 | public class PlayerLoginStartEvent extends PlayerAbstractLoginEvent {
10 |
11 | protected final String hostname;
12 | protected boolean onlinemode;
13 |
14 | public PlayerLoginStartEvent(Connection connection, String hostname) {
15 | super(connection);
16 | this.hostname = hostname;
17 | this.onlinemode = BungeeCord.getInstance().config.isOnlineMode();
18 | }
19 |
20 | /**
21 | * Returns hostname which player used when connecting to server
22 | * @return hostname which player used when connecting to server
23 | */
24 | public String getHostname() {
25 | return hostname;
26 | }
27 |
28 | /**
29 | * Returns true if online-mode checks will be used to auth player
30 | * @return true if online-mode checks will be used to auth player
31 | */
32 | public boolean isOnlineMode() {
33 | return onlinemode;
34 | }
35 |
36 | /**
37 | * Sets if online-mode checks will be used to auth player
38 | * @param onlinemode if online-mode checks will be used to auth player
39 | */
40 | public void setOnlineMode(boolean onlinemode) {
41 | this.onlinemode = onlinemode;
42 | }
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/events/PlayerProfileCompleteEvent.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api.events;
2 |
3 | import java.util.Collections;
4 | import java.util.HashMap;
5 | import java.util.HashSet;
6 | import java.util.Map;
7 | import java.util.Set;
8 | import java.util.UUID;
9 |
10 | import protocolsupport.api.Connection;
11 | import protocolsupport.api.utils.ProfileProperty;
12 |
13 | /**
14 | * This event is fired after player profile complete (either after doing online-mode checks, or after generating offline-mode profile)
15 | */
16 | public class PlayerProfileCompleteEvent extends PlayerAbstractLoginEvent {
17 |
18 | public PlayerProfileCompleteEvent(Connection connection) {
19 | super(connection);
20 | connection.getProfile().getPropertiesNames().forEach(name -> properties.put(name, connection.getProfile().getProperties(name)));
21 | }
22 |
23 | protected String forcedName;
24 | protected UUID forcedUUID;
25 |
26 | /**
27 | * Returns forced name or null if not set
28 | * By default forced name is not set
29 | * @return forced name or null
30 | */
31 | public String getForcedName() {
32 | return forcedName;
33 | }
34 |
35 | /**
36 | * Sets forced name
37 | * @param name forced name
38 | */
39 | public void setForcedName(String name) {
40 | this.forcedName = name;
41 | }
42 |
43 | /**
44 | * Returns forced uuid or null if not set
45 | * By default forced uuid is not set
46 | * @return forced name or null
47 | */
48 | public UUID getForcedUUID() {
49 | return forcedUUID;
50 | }
51 |
52 | /**
53 | * Sets forced uuid
54 | * @param uuid forced uuid
55 | */
56 | public void setForcedUUID(UUID uuid) {
57 | this.forcedUUID = uuid;
58 | }
59 |
60 | protected final Map> properties = new HashMap<>();
61 |
62 | /**
63 | * Returns properties
64 | * @return properties
65 | */
66 | public Map> getProperties() {
67 | return properties;
68 | }
69 |
70 | /**
71 | * Returns properties by name
72 | * @param name property name
73 | * @return properties
74 | */
75 | public Set getProperties(String name) {
76 | return properties.getOrDefault(name, Collections.emptySet());
77 | }
78 |
79 | /**
80 | * Removes properties by name
81 | * @param name property name
82 | */
83 | public void removeProperties(String name) {
84 | properties.remove(name);
85 | }
86 |
87 | /**
88 | * Removes property
89 | * @param property property
90 | */
91 | public void removeProperty(ProfileProperty property) {
92 | String propertyName = property.getName();
93 | Set propertiesWithName = properties.get(propertyName);
94 | propertiesWithName.remove(property);
95 | if (propertiesWithName.isEmpty()) {
96 | properties.remove(propertyName);
97 | }
98 | }
99 |
100 | /**
101 | * Adds property
102 | * @param property property
103 | */
104 | public void addProperty(ProfileProperty property) {
105 | properties.computeIfAbsent(property.getName(), k -> new HashSet<>()).add(property);
106 | }
107 |
108 | }
109 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/utils/Any.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api.utils;
2 |
3 | public class Any {
4 |
5 | private final T1 obj1;
6 | private final T2 obj2;
7 |
8 | public Any(T1 t1, T2 t2) {
9 | this.obj1 = t1;
10 | this.obj2 = t2;
11 | }
12 |
13 | public boolean hasObj1() {
14 | return obj1 != null;
15 | }
16 |
17 | public boolean hasObj2() {
18 | return obj2 != null;
19 | }
20 |
21 | public T1 getObj1() {
22 | return obj1;
23 | }
24 |
25 | public T2 getObj2() {
26 | return obj2;
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/utils/Profile.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api.utils;
2 |
3 | import java.util.Collections;
4 | import java.util.HashMap;
5 | import java.util.Map;
6 | import java.util.Set;
7 | import java.util.UUID;
8 |
9 | import com.google.common.base.Charsets;
10 |
11 | import protocolsupport.api.events.PlayerProfileCompleteEvent;
12 |
13 | /**
14 | * Client profile (name, uuid, properties)
15 | */
16 | public abstract class Profile {
17 |
18 | /**
19 | * Returns offline mode uuid for name
20 | * @param name name
21 | * @return offline mode uuid
22 | */
23 | public static UUID generateOfflineModeUUID(String name) {
24 | return UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(Charsets.UTF_8));
25 | }
26 |
27 | protected boolean onlineMode;
28 |
29 | protected String originalname;
30 | protected UUID originaluuid;
31 |
32 | protected String name;
33 | protected UUID uuid;
34 | protected final Map> properties = new HashMap<>();
35 |
36 | /**
37 | * Returns true if this player logged in using online-mode
38 | * @return true if this player logged in using online-mode
39 | */
40 | public boolean isOnlineMode() {
41 | return onlineMode;
42 | }
43 |
44 | /**
45 | * Returns original name of the player
46 | * This name is set from handshake and from online mode query response
47 | * @return original name of the player
48 | */
49 | public String getOriginalName() {
50 | return originalname;
51 | }
52 |
53 | /**
54 | * Returns original uuid of the player
55 | * This uuid is set from online mode profile query response or offline mode uuid generation or spoofed data
56 | * @return original name of the player
57 | */
58 | public UUID getOriginalUUID() {
59 | return originaluuid;
60 | }
61 |
62 | /**
63 | * Returns current name
64 | * This name can be changed by {@link PlayerProfileCompleteEvent#setForcedName}
65 | * @return current name
66 | */
67 | public String getName() {
68 | return name;
69 | }
70 |
71 | /**
72 | * Returns current uuid
73 | * This uuid can be changed by {@link PlayerProfileCompleteEvent#setForcedUUID}
74 | * @return current uuid
75 | */
76 | public UUID getUUID() {
77 | return uuid;
78 | }
79 |
80 | /**
81 | * Returns current properties
82 | * These properties can be changed by {@link PlayerProfileCompleteEvent} property management methods
83 | * @return current properties
84 | */
85 | public Set getPropertiesNames() {
86 | return Collections.unmodifiableSet(properties.keySet());
87 | }
88 |
89 | /**
90 | * Returns current properties
91 | * These properties can be changed by {@link PlayerProfileCompleteEvent} property management methods
92 | * @param name property name
93 | * @return current properties
94 | */
95 | public Set getProperties(String name) {
96 | return Collections.unmodifiableSet(properties.getOrDefault(name, Collections.emptySet()));
97 | }
98 |
99 | }
100 |
--------------------------------------------------------------------------------
/src/protocolsupport/api/utils/ProfileProperty.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.api.utils;
2 |
3 | import java.util.Objects;
4 |
5 | import org.apache.commons.lang3.Validate;
6 |
7 | import protocolsupport.utils.Utils;
8 |
9 | public class ProfileProperty {
10 |
11 | protected final String name;
12 | protected final String value;
13 | protected final String signature;
14 |
15 | public ProfileProperty(String name, String value, String signature) {
16 | Validate.notNull(name, "Name cannot be null");
17 | Validate.notNull(value, "Value cannot be null");
18 | this.name = name;
19 | this.value = value;
20 | this.signature = signature;
21 | }
22 |
23 | public ProfileProperty(String name, String value) {
24 | this(name, value, null);
25 | }
26 |
27 | /**
28 | * Returns name of the property
29 | *
30 | * @return name of the property
31 | */
32 | public String getName() {
33 | return name;
34 | }
35 |
36 | /**
37 | * Returns value of the property
38 | *
39 | * @return value of the property
40 | */
41 | public String getValue() {
42 | return value;
43 | }
44 |
45 | /**
46 | * Returns signature of the property or null if doesn't have one
47 | *
48 | * @return signature of the property or null
49 | */
50 | public String getSignature() {
51 | return signature;
52 | }
53 |
54 | /**
55 | * Checks if property has signature
56 | *
57 | * @return true if property has signature
58 | */
59 | public boolean hasSignature() {
60 | return signature != null;
61 | }
62 |
63 | @Override
64 | public String toString() {
65 | return Utils.toStringAllFields(this);
66 | }
67 |
68 | @Override
69 | public int hashCode() {
70 | int nvHash = getName().hashCode() ^ getValue().hashCode();
71 | return hasSignature() ? nvHash ^ getSignature().hashCode() : nvHash;
72 | }
73 |
74 | @Override
75 | public boolean equals(Object obj) {
76 | if (obj == null) {
77 | return false;
78 | }
79 | if (getClass() != obj.getClass()) {
80 | return false;
81 | }
82 | ProfileProperty otherProperty = (ProfileProperty) obj;
83 | return
84 | getName().equals(otherProperty.getName()) &&
85 | getValue().equalsIgnoreCase(otherProperty.getValue()) &&
86 | Objects.equals(getSignature(), otherProperty.getSignature());
87 | }
88 |
89 | }
--------------------------------------------------------------------------------
/src/protocolsupport/injector/BungeeNettyChannelInjector.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.injector;
2 |
3 | import java.util.Map.Entry;
4 |
5 | import io.netty.channel.Channel;
6 | import io.netty.channel.ChannelHandler;
7 | import io.netty.channel.ChannelHandlerContext;
8 | import io.netty.channel.ChannelPipeline;
9 | import io.netty.handler.codec.haproxy.HAProxyMessageDecoder;
10 | import net.md_5.bungee.BungeeCord;
11 | import net.md_5.bungee.ServerConnector;
12 | import net.md_5.bungee.connection.InitialHandler;
13 | import net.md_5.bungee.netty.ChannelWrapper;
14 | import net.md_5.bungee.netty.HandlerBoss;
15 | import net.md_5.bungee.netty.PacketHandler;
16 | import net.md_5.bungee.netty.PipelineUtils;
17 | import net.md_5.bungee.protocol.Varint21LengthFieldPrepender;
18 | import protocolsupport.protocol.ConnectionImpl;
19 | import protocolsupport.protocol.packet.handler.PSInitialHandler;
20 | import protocolsupport.protocol.pipeline.ChannelHandlers;
21 | import protocolsupport.protocol.pipeline.IPipeLineBuilder;
22 | import protocolsupport.protocol.pipeline.common.LogicHandler;
23 | import protocolsupport.protocol.pipeline.initial.InitialPacketDecoder;
24 | import protocolsupport.protocol.storage.ProtocolStorage;
25 | import protocolsupport.utils.ReflectionUtils;
26 | import protocolsupport.utils.netty.ChannelInitializer;
27 |
28 | //yep, thats our entry point, a single static field
29 | public class BungeeNettyChannelInjector extends Varint21LengthFieldPrepender {
30 |
31 | private BungeeNettyChannelInjector() {
32 | }
33 |
34 | public static void inject() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
35 | ReflectionUtils.setStaticFinalField(PipelineUtils.class, "framePrepender", new BungeeNettyChannelInjector());
36 | }
37 |
38 | @Override
39 | public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
40 | super.handlerAdded(ctx);
41 | ctx.channel().pipeline().addFirst(new ChannelInitializerEntryPoint());
42 | }
43 |
44 | private static class ChannelInitializerEntryPoint extends ChannelInitializer {
45 |
46 | @Override
47 | protected void initChannel(Channel channel) throws Exception {
48 | if (!channel.isOpen()) {
49 | return;
50 | }
51 | ChannelPipeline pipeline = channel.pipeline();
52 | PacketHandler handler = ReflectionUtils.getFieldValue(pipeline.get(HandlerBoss.class), "handler");
53 | CustomHandlerBoss boss = new CustomHandlerBoss(handler);
54 | pipeline.replace(PipelineUtils.BOSS_HANDLER, PipelineUtils.BOSS_HANDLER, boss);
55 | if (handler instanceof InitialHandler) {//user to bungee connection
56 | Entry firstHandler = pipeline.iterator().next();
57 | if (firstHandler.getValue() instanceof HAProxyMessageDecoder) {
58 | pipeline.addAfter(firstHandler.getKey(), ChannelHandlers.INITIAL_DECODER, new InitialPacketDecoder());
59 | } else {
60 | pipeline.addFirst(ChannelHandlers.INITIAL_DECODER, new InitialPacketDecoder());
61 | }
62 | PSInitialHandler initialhandler = new PSInitialHandler(BungeeCord.getInstance(), channel.attr(PipelineUtils.LISTENER).get());
63 | ConnectionImpl connection = new ConnectionImpl(boss, initialhandler);
64 | connection.storeInChannel(channel);
65 | ProtocolStorage.addConnection(channel.remoteAddress(), connection);
66 | pipeline.addBefore(PipelineUtils.BOSS_HANDLER, ChannelHandlers.LOGIC, new LogicHandler(connection, true));
67 | pipeline.remove(PipelineUtils.LEGACY_DECODER);
68 | pipeline.remove(PipelineUtils.LEGACY_KICKER);
69 | boss.setHandler(initialhandler);
70 | } else if (handler instanceof ServerConnector) {//bungee to server connection
71 | ConnectionImpl connection = ConnectionImpl.getFromChannel(((ChannelWrapper) ReflectionUtils.getFieldValue(ReflectionUtils.getFieldValue(handler, "user"), "ch")).getHandle());
72 | pipeline.addBefore(PipelineUtils.BOSS_HANDLER, ChannelHandlers.LOGIC, new LogicHandler(connection, false));
73 | connection.setServerConnectionChannel(channel);
74 | IPipeLineBuilder builder = InitialPacketDecoder.BUILDERS.get(connection.getVersion());
75 | if (builder != null) {
76 | builder.buildBungeeServer(channel, connection);
77 | }
78 | }
79 | }
80 |
81 | }
82 |
83 | public static class CustomHandlerBoss extends HandlerBoss {
84 |
85 | protected PacketHandler handler;
86 | protected PacketHandlerChangeListener listener = (handler) -> handler;
87 |
88 | public CustomHandlerBoss(PacketHandler handler) {
89 | setHandler(handler);
90 | }
91 |
92 | @Override
93 | public void setHandler(PacketHandler handler) {
94 | handler = listener.onPacketHandlerChange(handler);
95 | super.setHandler(handler);
96 | this.handler = handler;
97 | }
98 |
99 | public PacketHandler getHandler() {
100 | return this.handler;
101 | }
102 |
103 | public void setHandlerChangeListener(PacketHandlerChangeListener listener) {
104 | this.listener = listener;
105 | }
106 |
107 | @FunctionalInterface
108 | public static interface PacketHandlerChangeListener {
109 | public PacketHandler onPacketHandlerChange(PacketHandler handler);
110 | }
111 |
112 | }
113 |
114 | }
115 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/id/LegacyPacketId.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.id;
2 |
3 | public class LegacyPacketId {
4 |
5 | public static class Serverbound {
6 |
7 | public static final int HANDSHAKE_LOGIN = 0x02;
8 | public static final int HANDSHAKE_PING = 0xFE;
9 | public static final int LOGIN_ENCRYPTION_RESPONSE = 0xFC;
10 | public static final int LOGIN_PLAY_CLIENT_COMMAND = 0xCD;
11 | public static final int PLAY_USE_ENTITY = 0x07;
12 | public static final int PLAY_FLYING = 0x0A;
13 | public static final int PLAY_POSITION = 0x0B;
14 | public static final int PLAY_LOOK = 0x0C;
15 | public static final int PLAY_POSITION_LOOK = 0x0D;
16 | public static final int PLAY_BLOCK_DIG = 0x0E;
17 | public static final int PLAY_BLOCK_PLACE = 0x0F;
18 | public static final int PLAY_HELD_SLOT = 0x10;
19 | public static final int PLAY_ENTITY_ACTION = 0x13;
20 | public static final int PLAY_VEHICLE_CONTROL = 0x1B;
21 | public static final int PLAY_INVENTORY_CLOSE = 0x65;
22 | public static final int PLAY_INVENTORY_CLICK = 0x66;
23 | public static final int PLAY_INVENTORY_CREATIVE_SET_SLOT = 0x6B;
24 | public static final int PLAY_INVENTORY_SELECT_ENCHANT = 0x6C;
25 | public static final int PLAY_CLIENT_SETTINGS = 0xCC;
26 |
27 | }
28 |
29 | public static class Clientbound {
30 |
31 | public static final int LOGIN_ENCRYPTION_REQUEST = 0xFD;
32 | public static final int PLAY_START_GAME = 0x01;
33 | public static final int PLAY_RESPAWN = 0x09;
34 | public static final int PLAY_PLAYER_LIST = 0xC9;
35 | public static final int PLAY_USE_BED = 0x11;
36 | public static final int PLAY_COLLECT_ENTITY = 0x16;
37 | public static final int PLAY_SPAWN_NAMED_ENTITY = 0x14;
38 | public static final int PLAY_SPAWN_OBJECT = 0x17;
39 | public static final int PLAY_SPAWN_MOB = 0x18;
40 | public static final int PLAY_SPAWN_PAINTING = 0x19;
41 | public static final int PLAY_SPAWN_EXP_ORB = 0x1A;
42 | public static final int PLAY_SPAWN_GLOBALENTITY = 0x47;
43 | public static final int PLAY_ENTITY = 0x1E;
44 | public static final int PLAY_ENTITY_DESTROY = 0x1D;
45 | public static final int PLAY_ENTITY_REL_MOVE = 0x1F;
46 | public static final int PLAY_ENTITY_LOOK = 0x20;
47 | public static final int PLAY_ENTITY_REL_MOVE_LOOK = 0x21;
48 | public static final int PLAY_ENTITY_TELEPORT = 0x22;
49 | public static final int PLAY_ENTITY_HEAD_ROTATION = 0x23;
50 | public static final int PLAY_ENTITY_VELOCITY = 0x1C;
51 | public static final int PLAY_ENTITY_STATUS = 0x26;
52 | public static final int PLAY_ENTITY_EQUIPMENT = 0x05;
53 | public static final int PLAY_ENTITY_ATTACH = 0x27;
54 | public static final int PLAY_ENTITY_METADATA = 0x28;
55 | public static final int PLAY_ENTITY_EFFECT_ADD = 0x29;
56 | public static final int PLAY_ENTITY_EFFECT_REMOVE = 0x2A;
57 | public static final int PLAY_BLOCK_BREAK_ANIMATION = 0x37;
58 | public static final int PLAY_SCOREBOARD_OBJECTIVE = 0xCE;
59 | public static final int PLAY_SCOREBOARD_SCORE = 0xCF;
60 | public static final int PLAY_SCOREBOARD_DISPLAY_SLOT = 0xD0;
61 | public static final int PLAY_SCOREBOARD_TEAM = 0xD1;
62 | public static final int PLAY_GAME_STATE = 0x46;
63 |
64 | }
65 |
66 | public static class Dualbound {
67 |
68 | public static final int PLAY_KEEP_ALIVE = 0x00;
69 | public static final int PLAY_CHAT = 0x03;
70 | public static final int PLAY_ANIMATION = 0x12;
71 | public static final int PLAY_INVENTORY_TRANSACTION = 0x6A;
72 | public static final int PLAY_UPDATE_SIGN = 0x82;
73 | public static final int PLAY_TAB_COMPLETE = 0xCB;
74 | public static final int PLAY_ABILITIES = 0xCA;
75 | public static final int PLAY_PLUGIN_MESSAGE = 0xFA;
76 | public static final int PLAY_KICK = 0xFF;
77 |
78 | }
79 |
80 | }
81 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middle/MiddlePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middle;
2 |
3 | import protocolsupport.api.Connection;
4 | import protocolsupport.protocol.storage.NetworkDataCache;
5 |
6 | public class MiddlePacket {
7 |
8 | protected Connection connection;
9 |
10 | public final void setConnection(Connection connection) {
11 | this.connection = connection;
12 | }
13 |
14 | protected NetworkDataCache cache;
15 |
16 | public void setSharedStorage(NetworkDataCache sharedstorage) {
17 | this.cache = sharedstorage;
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middle/ReadableMiddlePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middle;
2 |
3 | import java.util.Collection;
4 |
5 | import io.netty.buffer.ByteBuf;
6 | import net.md_5.bungee.protocol.PacketWrapper;
7 | import protocolsupport.utils.Utils;
8 |
9 | public abstract class ReadableMiddlePacket extends MiddlePacket {
10 |
11 | public abstract void read(ByteBuf data);
12 |
13 | public abstract Collection toNative();
14 |
15 | @Override
16 | public String toString() {
17 | return Utils.toStringAllFields(this);
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middle/WriteableMiddlePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middle;
2 |
3 | import java.util.Collection;
4 |
5 | import io.netty.buffer.ByteBuf;
6 | import net.md_5.bungee.protocol.DefinedPacket;
7 |
8 | public abstract class WriteableMiddlePacket extends MiddlePacket {
9 |
10 | public abstract Collection toData(T packet);
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/DefinedReadableMiddlePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import protocolsupport.protocol.packet.middle.ReadableMiddlePacket;
5 | import protocolsupport.protocol.serializer.MiscSerializer;
6 | import protocolsupport.utils.netty.Allocator;
7 |
8 | public abstract class DefinedReadableMiddlePacket extends ReadableMiddlePacket {
9 |
10 | protected final int packetId;
11 | public DefinedReadableMiddlePacket(int packetId) {
12 | this.packetId = packetId;
13 | }
14 |
15 | protected byte[] readbytes;
16 |
17 | @Override
18 | public void read(ByteBuf data) {
19 | int readerIndex = data.readerIndex();
20 | read0(data);
21 | ByteBuf buffer = Allocator.allocateBuffer();
22 | try {
23 | writePacketId(buffer);
24 | int readBytes = data.readerIndex() - readerIndex;
25 | data.readerIndex(readerIndex);
26 | buffer.writeBytes(data, readBytes);
27 | readbytes = MiscSerializer.readAllBytes(buffer);
28 | } finally {
29 | buffer.release();
30 | }
31 | }
32 |
33 | protected abstract void writePacketId(ByteBuf to);
34 |
35 | protected abstract void read0(ByteBuf from);
36 |
37 | }
38 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/LegacyDefinedReadableMiddlePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable;
2 |
3 | import io.netty.buffer.ByteBuf;
4 |
5 | public abstract class LegacyDefinedReadableMiddlePacket extends DefinedReadableMiddlePacket {
6 |
7 | public LegacyDefinedReadableMiddlePacket(int packetId) {
8 | super(packetId);
9 | }
10 |
11 | @Override
12 | protected void writePacketId(ByteBuf to) {
13 | to.writeByte(packetId);
14 | }
15 |
16 | }
17 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/LegacyDynamicLengthPassthroughReadableMiddlePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import protocolsupport.protocol.packet.middle.ReadableMiddlePacket;
10 | import protocolsupport.protocol.serializer.MiscSerializer;
11 | import protocolsupport.utils.netty.Allocator;
12 |
13 | public abstract class LegacyDynamicLengthPassthroughReadableMiddlePacket extends ReadableMiddlePacket {
14 |
15 | protected final int packetId;
16 | public LegacyDynamicLengthPassthroughReadableMiddlePacket(int packetId) {
17 | this.packetId = packetId;
18 | }
19 |
20 | protected byte[] bytes;
21 |
22 | @Override
23 | public void read(ByteBuf data) {
24 | ByteBuf buffer = Allocator.allocateBuffer();
25 | try {
26 | buffer.writeByte(packetId);
27 | readTo(data, buffer);
28 | bytes = MiscSerializer.readAllBytes(buffer);
29 | } finally {
30 | buffer.release();
31 | }
32 | }
33 |
34 | protected abstract void readTo(ByteBuf data, ByteBuf to);
35 |
36 | @Override
37 | public Collection toNative() {
38 | return Collections.singletonList(new PacketWrapper(null, Unpooled.wrappedBuffer(bytes)));
39 | }
40 |
41 | }
42 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/LegacyFixedLengthPassthroughReadableMiddlePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import protocolsupport.protocol.packet.middle.ReadableMiddlePacket;
10 |
11 | public abstract class LegacyFixedLengthPassthroughReadableMiddlePacket extends ReadableMiddlePacket {
12 |
13 | protected final int packetId;
14 | protected final int length;
15 | public LegacyFixedLengthPassthroughReadableMiddlePacket(int packetId, int length) {
16 | this.packetId = packetId;
17 | this.length = length;
18 | }
19 |
20 | protected byte[] bytes;
21 |
22 | @Override
23 | public void read(ByteBuf data) {
24 | bytes = new byte[length + 1];
25 | bytes[0] = (byte) packetId;
26 | data.readBytes(bytes, 1, length);
27 | }
28 |
29 | @Override
30 | public Collection toNative() {
31 | return Collections.singletonList(new PacketWrapper(null, Unpooled.wrappedBuffer(bytes)));
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/handshake/v_4_5/PingHandshakePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.handshake.v_4_5;
2 |
3 | import java.util.Arrays;
4 | import java.util.Collection;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.Handshake;
10 | import net.md_5.bungee.protocol.packet.StatusRequest;
11 | import protocolsupport.protocol.packet.id.LegacyPacketId;
12 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
13 | import protocolsupport.protocol.utils.ProtocolVersionsHelper;
14 |
15 | public class PingHandshakePacket extends LegacyDefinedReadableMiddlePacket {
16 |
17 | public PingHandshakePacket() {
18 | super(LegacyPacketId.Serverbound.HANDSHAKE_PING);
19 | }
20 |
21 | @Override
22 | protected void read0(ByteBuf from) {
23 | from.readUnsignedByte();
24 | }
25 |
26 | @Override
27 | public Collection toNative() {
28 | return Arrays.asList(
29 | new PacketWrapper(new Handshake(ProtocolVersionsHelper.LATEST_PC.getId(), "127.0.0.1", 25565, 1), Unpooled.EMPTY_BUFFER),
30 | new PacketWrapper(new StatusRequest(), Unpooled.wrappedBuffer(readbytes))
31 | );
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/handshake/v_4_5_6/LoginHandshakePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.handshake.v_4_5_6;
2 |
3 | import java.util.Arrays;
4 | import java.util.Collection;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.Handshake;
10 | import net.md_5.bungee.protocol.packet.LoginRequest;
11 | import protocolsupport.protocol.packet.id.LegacyPacketId;
12 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
13 | import protocolsupport.protocol.serializer.StringSerializer;
14 | import protocolsupport.protocol.utils.ProtocolVersionsHelper;
15 |
16 | public class LoginHandshakePacket extends LegacyDefinedReadableMiddlePacket {
17 |
18 | public LoginHandshakePacket() {
19 | super(LegacyPacketId.Serverbound.HANDSHAKE_LOGIN);
20 | }
21 |
22 | protected String username;
23 | protected String host;
24 | protected int port;
25 |
26 | @Override
27 | protected void read0(ByteBuf from) {
28 | from.readByte();
29 | username = StringSerializer.readShortUTF16BEString(from);
30 | host = StringSerializer.readShortUTF16BEString(from);
31 | port = from.readInt();
32 | }
33 |
34 | @Override
35 | public Collection toNative() {
36 | return Arrays.asList(
37 | new PacketWrapper(new Handshake(ProtocolVersionsHelper.LATEST_PC.getId(), host, port, 2), Unpooled.wrappedBuffer(readbytes)),
38 | new PacketWrapper(new LoginRequest(username), Unpooled.EMPTY_BUFFER)
39 | );
40 | }
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/handshake/v_6/PingHandshakePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.handshake.v_6;
2 |
3 | import java.util.Arrays;
4 | import java.util.Collection;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.Handshake;
10 | import net.md_5.bungee.protocol.packet.StatusRequest;
11 | import protocolsupport.protocol.packet.id.LegacyPacketId;
12 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
13 | import protocolsupport.protocol.serializer.StringSerializer;
14 | import protocolsupport.protocol.utils.ProtocolVersionsHelper;
15 |
16 | public class PingHandshakePacket extends LegacyDefinedReadableMiddlePacket {
17 |
18 | public PingHandshakePacket() {
19 | super(LegacyPacketId.Serverbound.HANDSHAKE_PING);
20 | }
21 |
22 | protected String host;
23 | protected int port;
24 |
25 | @Override
26 | protected void read0(ByteBuf from) {
27 | from.readUnsignedByte();
28 | from.readUnsignedByte();
29 | StringSerializer.readShortUTF16BEString(from);
30 | from.readUnsignedShort();
31 | from.readUnsignedByte();
32 | host = StringSerializer.readShortUTF16BEString(from);
33 | port = from.readInt();
34 | }
35 |
36 | @Override
37 | public Collection toNative() {
38 | return Arrays.asList(
39 | new PacketWrapper(new Handshake(ProtocolVersionsHelper.LATEST_PC.getId(), host, port, 1), Unpooled.EMPTY_BUFFER),
40 | new PacketWrapper(new StatusRequest(), Unpooled.wrappedBuffer(readbytes))
41 | );
42 | }
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/login/v_4_5_6/EncryptionResponsePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.login.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.EncryptionResponse;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 | import protocolsupport.protocol.serializer.ArraySerializer;
13 |
14 | public class EncryptionResponsePacket extends LegacyDefinedReadableMiddlePacket {
15 |
16 | public EncryptionResponsePacket() {
17 | super(LegacyPacketId.Serverbound.LOGIN_ENCRYPTION_RESPONSE);
18 | }
19 |
20 | protected byte[] sharedSecret;
21 | protected byte[] verifyToken;
22 |
23 | @Override
24 | protected void read0(ByteBuf from) {
25 | sharedSecret = ArraySerializer.readShortLengthByteArray(from);
26 | verifyToken = ArraySerializer.readShortLengthByteArray(from);
27 | }
28 |
29 | @Override
30 | public Collection toNative() {
31 | return Collections.singletonList(new PacketWrapper(new EncryptionResponse(sharedSecret, verifyToken), Unpooled.wrappedBuffer(readbytes)));
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/login/v_4_5_6/LoginClientCommandPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.login.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import net.md_5.bungee.protocol.PacketWrapper;
8 | import protocolsupport.protocol.packet.middle.ReadableMiddlePacket;
9 |
10 | public class LoginClientCommandPacket extends ReadableMiddlePacket {
11 |
12 | @Override
13 | public void read(ByteBuf data) {
14 | data.readByte();
15 | }
16 |
17 | @Override
18 | public Collection toNative() {
19 | return Collections.emptyList();
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5/EntityActionPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class EntityActionPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public EntityActionPacket() {
9 | super(LegacyPacketId.Serverbound.PLAY_ENTITY_ACTION, Integer.BYTES + Byte.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5/PlayerAbilitiesPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class PlayerAbilitiesPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public PlayerAbilitiesPacket() {
9 | super(LegacyPacketId.Dualbound.PLAY_ABILITIES, Byte.BYTES * 3);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/AnimationPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class AnimationPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public AnimationPacket() {
9 | super(LegacyPacketId.Dualbound.PLAY_ANIMATION, Integer.BYTES + Byte.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/BlockDigPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class BlockDigPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public BlockDigPacket() {
9 | super(LegacyPacketId.Serverbound.PLAY_BLOCK_DIG, Byte.BYTES + Integer.BYTES + Byte.BYTES + Integer.BYTES + Byte.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/BlockPlacePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import protocolsupport.protocol.packet.id.LegacyPacketId;
5 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDynamicLengthPassthroughReadableMiddlePacket;
6 | import protocolsupport.protocol.serializer.TypeCopier;
7 |
8 | public class BlockPlacePacket extends LegacyDynamicLengthPassthroughReadableMiddlePacket {
9 |
10 | public BlockPlacePacket() {
11 | super(LegacyPacketId.Serverbound.PLAY_BLOCK_PLACE);
12 | }
13 |
14 | @Override
15 | protected void readTo(ByteBuf data, ByteBuf to) {
16 | TypeCopier.copyBytes(data, to, Integer.BYTES + Byte.BYTES + Integer.BYTES + Byte.BYTES);
17 | TypeCopier.copyLegacyItemStack(data, to);
18 | TypeCopier.copyBytes(data, to, Byte.BYTES * 3);
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/ClientCommandPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.ClientStatus;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 |
13 | public class ClientCommandPacket extends LegacyDefinedReadableMiddlePacket {
14 |
15 | public ClientCommandPacket() {
16 | super(LegacyPacketId.Serverbound.LOGIN_PLAY_CLIENT_COMMAND);
17 | }
18 |
19 | protected int status;
20 |
21 | @Override
22 | protected void read0(ByteBuf from) {
23 | status = from.readByte();
24 | }
25 |
26 | @Override
27 | public Collection toNative() {
28 | if (status == 1) {
29 | return Collections.singletonList(new PacketWrapper(new ClientStatus((byte) status), Unpooled.wrappedBuffer(readbytes)));
30 | } else {
31 | return Collections.emptyList();
32 | }
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/ClientSettingsPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.ClientSettings;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 | import protocolsupport.protocol.serializer.StringSerializer;
13 |
14 | public class ClientSettingsPacket extends LegacyDefinedReadableMiddlePacket {
15 |
16 | public ClientSettingsPacket() {
17 | super(LegacyPacketId.Serverbound.PLAY_CLIENT_SETTINGS);
18 | }
19 |
20 | protected String locale;
21 | protected byte viewDistance;
22 | protected int chatFlags;
23 | protected boolean chatColours;
24 | protected byte difficulty;
25 |
26 | @Override
27 | protected void read0(ByteBuf from) {
28 | locale = StringSerializer.readShortUTF16BEString(from);
29 | viewDistance = from.readByte();
30 | byte chatState = from.readByte();
31 | chatFlags = (byte) (chatState & 7);
32 | chatColours = ((chatState & 8) == 8);
33 | difficulty = from.readByte();
34 | from.readBoolean();
35 | }
36 |
37 | @Override
38 | public Collection toNative() {
39 | return Collections.singletonList(new PacketWrapper(new ClientSettings(locale, viewDistance, chatFlags, chatColours, difficulty, (byte) 255, 1), Unpooled.wrappedBuffer(readbytes)));
40 | }
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/FromClientChatPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.Chat;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 | import protocolsupport.protocol.serializer.StringSerializer;
13 |
14 | public class FromClientChatPacket extends LegacyDefinedReadableMiddlePacket {
15 |
16 | public FromClientChatPacket() {
17 | super(LegacyPacketId.Dualbound.PLAY_CHAT);
18 | }
19 |
20 | protected String message;
21 |
22 | @Override
23 | protected void read0(ByteBuf from) {
24 | message = StringSerializer.readShortUTF16BEString(from);
25 | }
26 |
27 | @Override
28 | public Collection toNative() {
29 | return Collections.singletonList(new PacketWrapper(new Chat(message), Unpooled.wrappedBuffer(readbytes)));
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/FromServerChatPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.api.chat.TextComponent;
9 | import net.md_5.bungee.chat.ComponentSerializer;
10 | import net.md_5.bungee.protocol.PacketWrapper;
11 | import net.md_5.bungee.protocol.packet.Chat;
12 | import protocolsupport.protocol.packet.id.LegacyPacketId;
13 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
14 | import protocolsupport.protocol.serializer.StringSerializer;
15 |
16 | public class FromServerChatPacket extends LegacyDefinedReadableMiddlePacket {
17 |
18 | public FromServerChatPacket() {
19 | super(LegacyPacketId.Dualbound.PLAY_CHAT);
20 | }
21 |
22 | protected String message;
23 |
24 | @Override
25 | protected void read0(ByteBuf from) {
26 | message = ComponentSerializer.toString(new TextComponent(StringSerializer.readShortUTF16BEString(from)));
27 | }
28 |
29 | @Override
30 | public Collection toNative() {
31 | return Collections.singletonList(new PacketWrapper(new Chat(message), Unpooled.wrappedBuffer(readbytes)));
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/HeldSlotPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class HeldSlotPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public HeldSlotPacket() {
9 | super(LegacyPacketId.Serverbound.PLAY_HELD_SLOT, Short.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/InventoryClickPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import protocolsupport.protocol.packet.id.LegacyPacketId;
5 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDynamicLengthPassthroughReadableMiddlePacket;
6 | import protocolsupport.protocol.serializer.TypeCopier;
7 |
8 | public class InventoryClickPacket extends LegacyDynamicLengthPassthroughReadableMiddlePacket {
9 |
10 | public InventoryClickPacket() {
11 | super(LegacyPacketId.Serverbound.PLAY_INVENTORY_CLICK);
12 | }
13 |
14 | @Override
15 | protected void readTo(ByteBuf data, ByteBuf to) {
16 | TypeCopier.copyBytes(data, to, Byte.BYTES + Short.BYTES + Byte.BYTES + Short.BYTES + Byte.BYTES);
17 | TypeCopier.copyLegacyItemStack(data, to);
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/InventoryClosePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class InventoryClosePacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public InventoryClosePacket() {
9 | super(LegacyPacketId.Serverbound.PLAY_INVENTORY_CLOSE, Byte.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/InventoryCreativeSetSlotPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import protocolsupport.protocol.packet.id.LegacyPacketId;
5 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDynamicLengthPassthroughReadableMiddlePacket;
6 | import protocolsupport.protocol.serializer.TypeCopier;
7 |
8 | public class InventoryCreativeSetSlotPacket extends LegacyDynamicLengthPassthroughReadableMiddlePacket {
9 |
10 | public InventoryCreativeSetSlotPacket() {
11 | super(LegacyPacketId.Serverbound.PLAY_INVENTORY_CREATIVE_SET_SLOT);
12 | }
13 |
14 | @Override
15 | protected void readTo(ByteBuf data, ByteBuf to) {
16 | TypeCopier.copyBytes(data, to, Short.BYTES);
17 | TypeCopier.copyLegacyItemStack(data, to);
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/InventorySelectEnchant.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class InventorySelectEnchant extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public InventorySelectEnchant() {
9 | super(LegacyPacketId.Serverbound.PLAY_INVENTORY_SELECT_ENCHANT, Byte.BYTES * 2);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/InventoryTransactionPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class InventoryTransactionPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public InventoryTransactionPacket() {
9 | super(LegacyPacketId.Dualbound.PLAY_INVENTORY_TRANSACTION, Byte.BYTES + Short.BYTES + Byte.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/KeepAlivePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.KeepAlive;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 |
13 | public class KeepAlivePacket extends LegacyDefinedReadableMiddlePacket {
14 |
15 | public KeepAlivePacket() {
16 | super(LegacyPacketId.Dualbound.PLAY_KEEP_ALIVE);
17 | }
18 |
19 | protected int keepaliveId;
20 |
21 | @Override
22 | protected void read0(ByteBuf data) {
23 | keepaliveId = data.readInt();
24 | }
25 |
26 | @Override
27 | public Collection toNative() {
28 | return Collections.singletonList(new PacketWrapper(new KeepAlive(keepaliveId), Unpooled.wrappedBuffer(readbytes)));
29 | }
30 |
31 | }
32 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/KickPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.api.chat.TextComponent;
9 | import net.md_5.bungee.chat.ComponentSerializer;
10 | import net.md_5.bungee.protocol.PacketWrapper;
11 | import net.md_5.bungee.protocol.packet.Kick;
12 | import protocolsupport.protocol.packet.id.LegacyPacketId;
13 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
14 | import protocolsupport.protocol.serializer.StringSerializer;
15 | import protocolsupport.utils.Utils;
16 |
17 | public class KickPacket extends LegacyDefinedReadableMiddlePacket {
18 |
19 | public KickPacket() {
20 | super(LegacyPacketId.Dualbound.PLAY_KICK);
21 | }
22 |
23 | protected String message;
24 |
25 | @Override
26 | protected void read0(ByteBuf from) {
27 | message = ComponentSerializer.toString(new TextComponent(StringSerializer.readShortUTF16BEString(from)));
28 | }
29 |
30 | @Override
31 | public Collection toNative() {
32 | return Collections.singletonList(new PacketWrapper(new Kick(Utils.clampString(message, 256)), Unpooled.wrappedBuffer(readbytes)));
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/PlayerFlyingPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class PlayerFlyingPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public PlayerFlyingPacket() {
9 | super(LegacyPacketId.Serverbound.PLAY_FLYING, Byte.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/PlayerListItemPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.PlayerListItem;
10 | import net.md_5.bungee.protocol.packet.PlayerListItem.Action;
11 | import net.md_5.bungee.protocol.packet.PlayerListItem.Item;
12 | import protocolsupport.protocol.packet.id.LegacyPacketId;
13 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
14 | import protocolsupport.protocol.serializer.StringSerializer;
15 |
16 | public class PlayerListItemPacket extends LegacyDefinedReadableMiddlePacket {
17 |
18 | public PlayerListItemPacket() {
19 | super(LegacyPacketId.Clientbound.PLAY_PLAYER_LIST);
20 | }
21 |
22 | protected Action action;
23 | protected Item[] items;
24 |
25 | @Override
26 | protected void read0(ByteBuf from) {
27 | String username = StringSerializer.readShortUTF16BEString(from);
28 | boolean add = from.readBoolean();
29 | int ping = from.readShort();
30 | action = add ? Action.ADD_PLAYER : Action.REMOVE_PLAYER;
31 | Item item = new Item();
32 | item.setUsername(username);
33 | item.setDisplayName(username);
34 | item.setGamemode(0);
35 | item.setPing(ping);
36 | items = new Item[] { item };
37 | }
38 |
39 | @Override
40 | public Collection toNative() {
41 | PlayerListItem packet = new PlayerListItem();
42 | packet.setAction(action);
43 | packet.setItems(items);
44 | return Collections.singletonList(new PacketWrapper(packet, Unpooled.wrappedBuffer(readbytes)));
45 | }
46 |
47 | }
48 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/PlayerLookPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class PlayerLookPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public PlayerLookPacket() {
9 | super(LegacyPacketId.Serverbound.PLAY_LOOK, (Float.BYTES * 2) + Byte.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/PlayerPositionLookPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class PlayerPositionLookPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public PlayerPositionLookPacket() {
9 | super(LegacyPacketId.Serverbound.PLAY_POSITION_LOOK, (Double.BYTES * 4) + (Float.BYTES * 2) + Byte.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/PlayerPositionPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class PlayerPositionPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public PlayerPositionPacket() {
9 | super(LegacyPacketId.Serverbound.PLAY_POSITION, (Double.BYTES * 4) + Byte.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/PluginMessagePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.PluginMessage;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 | import protocolsupport.protocol.serializer.ArraySerializer;
13 | import protocolsupport.protocol.serializer.StringSerializer;
14 |
15 | public class PluginMessagePacket extends LegacyDefinedReadableMiddlePacket {
16 |
17 | public PluginMessagePacket() {
18 | super(LegacyPacketId.Dualbound.PLAY_PLUGIN_MESSAGE);
19 | }
20 |
21 | protected String tag;
22 | protected byte[] data;
23 |
24 | @Override
25 | protected void read0(ByteBuf from) {
26 | tag = StringSerializer.readShortUTF16BEString(from);
27 | data = ArraySerializer.readShortLengthByteArray(from);
28 | }
29 |
30 | @Override
31 | public Collection toNative() {
32 | return Collections.singletonList(new PacketWrapper(new PluginMessage(tag, data, true), Unpooled.wrappedBuffer(readbytes)));
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/RespawnPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.Respawn;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 | import protocolsupport.protocol.serializer.StringSerializer;
13 |
14 | public class RespawnPacket extends LegacyDefinedReadableMiddlePacket {
15 |
16 | public RespawnPacket() {
17 | super(LegacyPacketId.Clientbound.PLAY_RESPAWN);
18 | }
19 |
20 | protected int dimension;
21 | protected int difficulty;
22 | protected int gamemode;
23 | protected String levelType;
24 |
25 | @Override
26 | protected void read0(ByteBuf from) {
27 | dimension = from.readInt();
28 | difficulty = from.readByte();
29 | gamemode = from.readByte();
30 | from.readShort();
31 | levelType = StringSerializer.readShortUTF16BEString(from);
32 | }
33 |
34 | @Override
35 | public Collection toNative() {
36 | return Collections.singletonList(new PacketWrapper(
37 | new Respawn(dimension, null, 0, (short) difficulty, (short) gamemode, (short) gamemode, levelType, false, false, true), Unpooled.wrappedBuffer(readbytes)
38 | ));
39 | }
40 |
41 | }
42 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/StartGamePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Arrays;
4 | import java.util.Collection;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.Login;
10 | import net.md_5.bungee.protocol.packet.LoginSuccess;
11 | import protocolsupport.protocol.packet.id.LegacyPacketId;
12 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
13 | import protocolsupport.protocol.serializer.StringSerializer;
14 |
15 | public class StartGamePacket extends LegacyDefinedReadableMiddlePacket {
16 |
17 | public StartGamePacket() {
18 | super(LegacyPacketId.Clientbound.PLAY_START_GAME);
19 | }
20 |
21 | protected int entityId;
22 | protected boolean hardcode;
23 | protected int gamemode;
24 | protected int dimension;
25 | protected int difficulty;
26 | protected int maxPlayers;
27 | protected String levelType;
28 |
29 | @Override
30 | protected void read0(ByteBuf from) {
31 | entityId = from.readInt();
32 | levelType = StringSerializer.readShortUTF16BEString(from);
33 | int sGamemodeHardcore = from.readByte();
34 | hardcode = (sGamemodeHardcore & 0b1000) != 0;
35 | gamemode = (sGamemodeHardcore & 0b111);
36 | dimension = from.readByte();
37 | difficulty = from.readByte();
38 | from.readByte();
39 | maxPlayers = from.readByte();
40 | }
41 |
42 | @Override
43 | public Collection toNative() {
44 | return Arrays.asList(
45 | new PacketWrapper(new LoginSuccess(), Unpooled.EMPTY_BUFFER),
46 | new PacketWrapper(
47 | new Login(entityId, hardcode, (short) gamemode, (short) gamemode, null, null, Integer.valueOf(dimension), null, 0, (short) difficulty, (short) maxPlayers, levelType, 10, false, true, false, false),
48 | Unpooled.wrappedBuffer(readbytes)
49 | )
50 | );
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/TabCompleteRequestPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.TabCompleteRequest;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 | import protocolsupport.protocol.serializer.StringSerializer;
13 |
14 | public class TabCompleteRequestPacket extends LegacyDefinedReadableMiddlePacket {
15 |
16 | public TabCompleteRequestPacket() {
17 | super(LegacyPacketId.Dualbound.PLAY_TAB_COMPLETE);
18 | }
19 |
20 | protected String string;
21 |
22 | @Override
23 | protected void read0(ByteBuf from) {
24 | string = StringSerializer.readShortUTF16BEString(from);
25 | }
26 |
27 | @Override
28 | public Collection toNative() {
29 | return Collections.singletonList(new PacketWrapper(new TabCompleteRequest(string, false, false, 0), Unpooled.wrappedBuffer(readbytes)));
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/TabCompleteResponsePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import java.util.Arrays;
4 | import java.util.Collection;
5 | import java.util.Collections;
6 |
7 | import io.netty.buffer.ByteBuf;
8 | import io.netty.buffer.Unpooled;
9 | import net.md_5.bungee.protocol.PacketWrapper;
10 | import net.md_5.bungee.protocol.packet.TabCompleteResponse;
11 | import protocolsupport.protocol.packet.id.LegacyPacketId;
12 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
13 | import protocolsupport.protocol.serializer.StringSerializer;
14 |
15 | public class TabCompleteResponsePacket extends LegacyDefinedReadableMiddlePacket {
16 |
17 | public TabCompleteResponsePacket() {
18 | super(LegacyPacketId.Dualbound.PLAY_TAB_COMPLETE);
19 | }
20 |
21 | protected String string;
22 |
23 | @Override
24 | protected void read0(ByteBuf from) {
25 | string = StringSerializer.readShortUTF16BEString(from);
26 | }
27 |
28 | @Override
29 | public Collection toNative() {
30 | return Collections.singletonList(new PacketWrapper(new TabCompleteResponse(Arrays.asList(string.split("\u0000"))), Unpooled.wrappedBuffer(readbytes)));
31 | }
32 |
33 | }
34 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/UpdateSignPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import protocolsupport.protocol.packet.id.LegacyPacketId;
5 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDynamicLengthPassthroughReadableMiddlePacket;
6 | import protocolsupport.protocol.serializer.TypeCopier;
7 |
8 | public class UpdateSignPacket extends LegacyDynamicLengthPassthroughReadableMiddlePacket {
9 |
10 | public UpdateSignPacket() {
11 | super(LegacyPacketId.Dualbound.PLAY_UPDATE_SIGN);
12 | }
13 |
14 | @Override
15 | protected void readTo(ByteBuf data, ByteBuf to) {
16 | TypeCopier.copyBytes(data, to, Integer.BYTES + Short.BYTES + Integer.BYTES);
17 | TypeCopier.copyShortUTF16BEString(data, to);
18 | TypeCopier.copyShortUTF16BEString(data, to);
19 | TypeCopier.copyShortUTF16BEString(data, to);
20 | TypeCopier.copyShortUTF16BEString(data, to);
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_4_5_6/UseEntityPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class UseEntityPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public UseEntityPacket() {
9 | super(LegacyPacketId.Serverbound.PLAY_USE_ENTITY, Integer.BYTES + Integer.BYTES + Byte.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_5_6/ScoreboardDisplayPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.ScoreboardDisplay;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 | import protocolsupport.protocol.serializer.StringSerializer;
13 |
14 | public class ScoreboardDisplayPacket extends LegacyDefinedReadableMiddlePacket {
15 |
16 | public ScoreboardDisplayPacket() {
17 | super(LegacyPacketId.Clientbound.PLAY_SCOREBOARD_DISPLAY_SLOT);
18 | }
19 |
20 | protected byte position;
21 | protected String name;
22 |
23 | @Override
24 | protected void read0(ByteBuf from) {
25 | position = from.readByte();
26 | name = StringSerializer.readShortUTF16BEString(from);
27 | }
28 |
29 | @Override
30 | public Collection toNative() {
31 | return Collections.singletonList(new PacketWrapper(new ScoreboardDisplay(position, name), Unpooled.wrappedBuffer(readbytes)));
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_5_6/ScoreboardObjectivePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.ScoreboardObjective;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 | import protocolsupport.protocol.serializer.StringSerializer;
13 |
14 | public class ScoreboardObjectivePacket extends LegacyDefinedReadableMiddlePacket {
15 |
16 | public ScoreboardObjectivePacket() {
17 | super(LegacyPacketId.Clientbound.PLAY_SCOREBOARD_OBJECTIVE);
18 | }
19 |
20 | protected String name;
21 | protected String value;
22 | protected byte action;
23 |
24 | @Override
25 | protected void read0(ByteBuf from) {
26 | name = StringSerializer.readShortUTF16BEString(from);
27 | value = StringSerializer.readShortUTF16BEString(from);
28 | action = from.readByte();
29 | }
30 |
31 | @Override
32 | public Collection toNative() {
33 | return Collections.singletonList(new PacketWrapper(new ScoreboardObjective(name, value, ScoreboardObjective.HealthDisplay.INTEGER, action), Unpooled.wrappedBuffer(readbytes)));
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_5_6/ScoreboardScorePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.ScoreboardScore;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 | import protocolsupport.protocol.serializer.StringSerializer;
13 |
14 | public class ScoreboardScorePacket extends LegacyDefinedReadableMiddlePacket {
15 |
16 | public ScoreboardScorePacket() {
17 | super(LegacyPacketId.Clientbound.PLAY_SCOREBOARD_SCORE);
18 | }
19 |
20 | protected String itemName;
21 | protected byte action;
22 | protected String scoreName;
23 | protected int value;
24 |
25 | @Override
26 | protected void read0(ByteBuf from) {
27 | itemName = StringSerializer.readShortUTF16BEString(from);
28 | action = from.readByte();
29 | if (action != 1) {
30 | scoreName = StringSerializer.readShortUTF16BEString(from);
31 | value = from.readInt();
32 | }
33 | }
34 |
35 | @Override
36 | public Collection toNative() {
37 | return Collections.singletonList(new PacketWrapper(new ScoreboardScore(itemName, action, scoreName, value), Unpooled.wrappedBuffer(readbytes)));
38 | }
39 |
40 | }
41 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_5_6/ScoreboardTeamPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import io.netty.buffer.Unpooled;
8 | import net.md_5.bungee.protocol.PacketWrapper;
9 | import net.md_5.bungee.protocol.packet.Team;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyDefinedReadableMiddlePacket;
12 | import protocolsupport.protocol.serializer.StringSerializer;
13 |
14 | public class ScoreboardTeamPacket extends LegacyDefinedReadableMiddlePacket {
15 |
16 | public ScoreboardTeamPacket() {
17 | super(LegacyPacketId.Clientbound.PLAY_SCOREBOARD_TEAM);
18 | }
19 |
20 | protected String name;
21 | protected byte mode;
22 | protected String displayName;
23 | protected String prefix;
24 | protected String suffix;
25 | protected byte friendlyFire;
26 | protected String[] players;
27 |
28 | @Override
29 | protected void read0(ByteBuf from) {
30 | this.name = StringSerializer.readShortUTF16BEString(from);
31 | this.mode = from.readByte();
32 | if ((this.mode == 0) || (this.mode == 2)) {
33 | this.displayName = StringSerializer.readShortUTF16BEString(from);
34 | this.prefix = StringSerializer.readShortUTF16BEString(from);
35 | this.suffix = StringSerializer.readShortUTF16BEString(from);
36 | this.friendlyFire = from.readByte();
37 | }
38 | if ((this.mode == 0) || (this.mode == 3) || (this.mode == 4)) {
39 | int len = from.readShort();
40 | this.players = new String[len];
41 | for (int i = 0; i < len; ++i) {
42 | this.players[i] = StringSerializer.readShortUTF16BEString(from);
43 | }
44 | }
45 | }
46 |
47 | @Override
48 | public Collection toNative() {
49 | return Collections.singletonList(new PacketWrapper(
50 | new Team(name, mode, displayName, prefix, suffix, "always", "always", (byte) -1, friendlyFire, players), Unpooled.wrappedBuffer(readbytes)
51 | ));
52 | }
53 |
54 | }
55 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_6/EntityActionPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class EntityActionPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public EntityActionPacket() {
9 | super(LegacyPacketId.Serverbound.PLAY_ENTITY_ACTION, Integer.BYTES + Byte.BYTES + Integer.BYTES);
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_6/PlayerAbilitiesPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class PlayerAbilitiesPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public PlayerAbilitiesPacket() {
9 | super(LegacyPacketId.Dualbound.PLAY_ABILITIES, Byte.BYTES + (Float.BYTES * 2));
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/readable/play/v_6/VehicleControlPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.readable.play.v_6;
2 |
3 | import protocolsupport.protocol.packet.id.LegacyPacketId;
4 | import protocolsupport.protocol.packet.middleimpl.readable.LegacyFixedLengthPassthroughReadableMiddlePacket;
5 |
6 | public class VehicleControlPacket extends LegacyFixedLengthPassthroughReadableMiddlePacket {
7 |
8 | public VehicleControlPacket() {
9 | super(LegacyPacketId.Serverbound.PLAY_VEHICLE_CONTROL, (Float.BYTES * 2) + (Byte.BYTES * 2));
10 | }
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/LegacySingleWriteablePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.DefinedPacket;
5 |
6 | public abstract class LegacySingleWriteablePacket extends SingleWriteablePacket {
7 |
8 | public LegacySingleWriteablePacket(int packetId) {
9 | super(packetId);
10 | }
11 |
12 | @Override
13 | protected void writePacketId(ByteBuf data) {
14 | data.writeByte(packetId);
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/NoopWriteablePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import net.md_5.bungee.protocol.DefinedPacket;
8 | import protocolsupport.protocol.packet.middle.WriteableMiddlePacket;
9 |
10 | public class NoopWriteablePacket extends WriteableMiddlePacket {
11 |
12 | @Override
13 | public Collection toData(DefinedPacket packet) {
14 | return Collections.emptyList();
15 | }
16 |
17 | }
18 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/SingleWriteablePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import net.md_5.bungee.protocol.DefinedPacket;
8 | import protocolsupport.protocol.packet.middle.WriteableMiddlePacket;
9 | import protocolsupport.utils.netty.Allocator;
10 |
11 | public abstract class SingleWriteablePacket extends WriteableMiddlePacket {
12 |
13 | protected final int packetId;
14 | public SingleWriteablePacket(int packetId) {
15 | this.packetId = packetId;
16 | }
17 |
18 | @Override
19 | public Collection toData(T packet) {
20 | ByteBuf data = Allocator.allocateBuffer();
21 | writePacketId(data);
22 | write(data, packet);
23 | return Collections.singletonList(data);
24 | }
25 |
26 | protected abstract void writePacketId(ByteBuf data);
27 |
28 | protected abstract void write(ByteBuf data, T packet);
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/handshake/v_4_5_6/LoginRequestServerHandshakePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.handshake.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.LoginRequest;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 | import protocolsupport.protocol.serializer.StringSerializer;
8 |
9 | public class LoginRequestServerHandshakePacket extends LegacySingleWriteablePacket {
10 |
11 | public LoginRequestServerHandshakePacket() {
12 | super(LegacyPacketId.Serverbound.HANDSHAKE_LOGIN);
13 | }
14 |
15 | @Override
16 | protected void write(ByteBuf data, LoginRequest packet) {
17 | data.writeByte(connection.getVersion().getId());
18 | StringSerializer.writeShortUTF16BEString(data, packet.getData());
19 | StringSerializer.writeShortUTF16BEString(data, cache.getServerHandshake().getHost());
20 | data.writeInt(cache.getServerHandshake().getPort());
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/handshake/v_4_5_6_pe/HandshakeCachePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.handshake.v_4_5_6_pe;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import net.md_5.bungee.protocol.packet.Handshake;
8 | import protocolsupport.protocol.packet.middle.WriteableMiddlePacket;
9 |
10 | public class HandshakeCachePacket extends WriteableMiddlePacket {
11 |
12 | @Override
13 | public Collection toData(Handshake packet) {
14 | cache.setServerHandshake(packet);
15 | return Collections.emptyList();
16 | }
17 |
18 | }
19 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/login/v_4_5_6/EncryptionRequestPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.login.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.EncryptionRequest;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 | import protocolsupport.protocol.serializer.ArraySerializer;
8 | import protocolsupport.protocol.serializer.StringSerializer;
9 |
10 | public class EncryptionRequestPacket extends LegacySingleWriteablePacket {
11 |
12 | public EncryptionRequestPacket() {
13 | super(LegacyPacketId.Clientbound.LOGIN_ENCRYPTION_REQUEST);
14 | }
15 |
16 | @Override
17 | protected void write(ByteBuf data, EncryptionRequest packet) {
18 | StringSerializer.writeShortUTF16BEString(data, packet.getServerId());
19 | ArraySerializer.writeShortLengthByteArray(data, packet.getPublicKey());
20 | ArraySerializer.writeShortLengthByteArray(data, packet.getVerifyToken());
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/ClientCommandPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import net.md_5.bungee.protocol.packet.ClientStatus;
8 | import protocolsupport.protocol.packet.id.LegacyPacketId;
9 | import protocolsupport.protocol.packet.middle.WriteableMiddlePacket;
10 | import protocolsupport.utils.netty.Allocator;
11 |
12 | public class ClientCommandPacket extends WriteableMiddlePacket {
13 |
14 | @Override
15 | public Collection toData(ClientStatus packet) {
16 | if (packet.getPayload() == 1) {
17 | ByteBuf data = Allocator.allocateBuffer();
18 | data.writeByte(LegacyPacketId.Serverbound.LOGIN_PLAY_CLIENT_COMMAND);
19 | data.writeByte(packet.getPayload());
20 | return Collections.singletonList(data);
21 | } else {
22 | return Collections.emptyList();
23 | }
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/ClientSettingsPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.ClientSettings;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 | import protocolsupport.protocol.serializer.StringSerializer;
8 |
9 | public class ClientSettingsPacket extends LegacySingleWriteablePacket {
10 |
11 | public ClientSettingsPacket() {
12 | super(LegacyPacketId.Serverbound.PLAY_CLIENT_SETTINGS);
13 | }
14 |
15 | @Override
16 | protected void write(ByteBuf data, ClientSettings packet) {
17 | StringSerializer.writeShortUTF16BEString(data, packet.getLocale());
18 | data.writeByte(packet.getViewDistance());
19 | data.writeByte(packet.getChatFlags());
20 | data.writeByte(packet.getDifficulty());
21 | data.writeBoolean(((packet.getSkinParts() >> 0x01) & 1) == 1);
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/EntityEffectAddPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.EntityEffect;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 |
8 | public class EntityEffectAddPacket extends LegacySingleWriteablePacket {
9 |
10 | public EntityEffectAddPacket(int packetId) {
11 | super(LegacyPacketId.Clientbound.PLAY_ENTITY_EFFECT_ADD);
12 | }
13 |
14 | @Override
15 | protected void write(ByteBuf data, EntityEffect packet) {
16 | data.writeInt(packet.getEffectId());
17 | data.writeByte(packet.getEffectId());
18 | data.writeByte(packet.getAmplifier());
19 | data.writeShort(packet.getDuration());
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/EntityEffectRemovePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.EntityEffect;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 |
8 | public class EntityEffectRemovePacket extends LegacySingleWriteablePacket {
9 |
10 | public EntityEffectRemovePacket(int packetId) {
11 | super(LegacyPacketId.Clientbound.PLAY_ENTITY_EFFECT_REMOVE);
12 | }
13 |
14 | @Override
15 | protected void write(ByteBuf data, EntityEffect packet) {
16 | data.writeInt(packet.getEffectId());
17 | data.writeByte(packet.getEffectId());
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/EntityStatusPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.EntityStatus;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 |
8 | public class EntityStatusPacket extends LegacySingleWriteablePacket {
9 |
10 | public EntityStatusPacket() {
11 | super(LegacyPacketId.Clientbound.PLAY_ENTITY_STATUS);
12 | }
13 |
14 | @Override
15 | protected void write(ByteBuf data, EntityStatus packet) {
16 | data.writeInt(packet.getEntityId());
17 | data.writeByte(packet.getStatus());
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/GameStatePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.GameState;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 |
8 | public class GameStatePacket extends LegacySingleWriteablePacket {
9 |
10 | public GameStatePacket() {
11 | super(LegacyPacketId.Clientbound.PLAY_GAME_STATE);
12 | }
13 |
14 | @Override
15 | protected void write(ByteBuf data, GameState packet) {
16 | data.writeByte(packet.getState());
17 | data.writeByte((int) packet.getValue());
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/KeepAlivePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.KeepAlive;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 |
8 | public class KeepAlivePacket extends LegacySingleWriteablePacket {
9 |
10 | public KeepAlivePacket() {
11 | super(LegacyPacketId.Dualbound.PLAY_KEEP_ALIVE);
12 | }
13 |
14 | @Override
15 | protected void write(ByteBuf data, KeepAlive packet) {
16 | data.writeInt((int) packet.getRandomId());
17 | }
18 |
19 | }
20 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/KickPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import net.md_5.bungee.chat.ComponentSerializer;
8 | import net.md_5.bungee.protocol.packet.Kick;
9 | import protocolsupport.protocol.packet.id.LegacyPacketId;
10 | import protocolsupport.protocol.packet.middle.WriteableMiddlePacket;
11 | import protocolsupport.protocol.serializer.StringSerializer;
12 | import protocolsupport.utils.netty.Allocator;
13 |
14 | public class KickPacket extends WriteableMiddlePacket {
15 |
16 | @Override
17 | public Collection toData(Kick packet) {
18 | return Collections.singletonList(create(ComponentSerializer.parse(packet.getMessage())[0].toLegacyText()));
19 | }
20 |
21 | public static ByteBuf create(String message) {
22 | ByteBuf data = Allocator.allocateBuffer();
23 | data.writeByte(LegacyPacketId.Dualbound.PLAY_KICK);
24 | StringSerializer.writeShortUTF16BEString(data, message);
25 | return data;
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/PlayerListItemPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import java.util.ArrayList;
4 | import java.util.Collection;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import net.md_5.bungee.protocol.packet.PlayerListItem;
8 | import net.md_5.bungee.protocol.packet.PlayerListItem.Action;
9 | import net.md_5.bungee.protocol.packet.PlayerListItem.Item;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middle.WriteableMiddlePacket;
12 | import protocolsupport.protocol.serializer.StringSerializer;
13 | import protocolsupport.utils.netty.Allocator;
14 |
15 | public class PlayerListItemPacket extends WriteableMiddlePacket {
16 |
17 | @Override
18 | public Collection toData(PlayerListItem packet) {
19 | ArrayList packets = new ArrayList<>();
20 | for (Item item : packet.getItems()) {
21 | ByteBuf data = Allocator.allocateBuffer();
22 | data.writeByte(LegacyPacketId.Clientbound.PLAY_PLAYER_LIST);
23 | StringSerializer.writeShortUTF16BEString(data, getDisplayName(item));
24 | data.writeBoolean(packet.getAction() != Action.REMOVE_PLAYER);
25 | data.writeShort(item.getPing());
26 | packets.add(data);
27 | }
28 | return packets;
29 | }
30 |
31 | private static String getDisplayName(Item item) {
32 | String name = item.getDisplayName();
33 | if (name == null) {
34 | name = "Unknown";
35 | }
36 | return name;
37 | }
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/PluginMessagePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.PluginMessage;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 | import protocolsupport.protocol.serializer.ArraySerializer;
8 | import protocolsupport.protocol.serializer.StringSerializer;
9 |
10 | public class PluginMessagePacket extends LegacySingleWriteablePacket {
11 |
12 | public PluginMessagePacket() {
13 | super(LegacyPacketId.Dualbound.PLAY_PLUGIN_MESSAGE);
14 | }
15 |
16 | @Override
17 | protected void write(ByteBuf data, PluginMessage packet) {
18 | String tag = packet.getTag();
19 | if (tag.equals("bungeecord:main")) {
20 | tag = "BungeeCord";
21 | }
22 | StringSerializer.writeShortUTF16BEString(data, tag);
23 | ArraySerializer.writeShortLengthByteArray(data, packet.getData());
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/RespawnPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.Respawn;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 | import protocolsupport.protocol.serializer.StringSerializer;
8 | import protocolsupport.protocol.typeremapper.LegacyDimension;
9 |
10 | public class RespawnPacket extends LegacySingleWriteablePacket {
11 |
12 | public RespawnPacket() {
13 | super(LegacyPacketId.Clientbound.PLAY_RESPAWN);
14 | }
15 |
16 | @Override
17 | protected void write(ByteBuf data, Respawn packet) {
18 | data.writeInt(LegacyDimension.get(packet.getDimension()));
19 | data.writeByte(packet.getDifficulty());
20 | data.writeByte(packet.getGameMode());
21 | data.writeShort(256);
22 | StringSerializer.writeShortUTF16BEString(data, packet.getLevelType());
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/StartGamePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.Login;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 | import protocolsupport.protocol.serializer.StringSerializer;
8 | import protocolsupport.protocol.typeremapper.LegacyDimension;
9 |
10 | public class StartGamePacket extends LegacySingleWriteablePacket {
11 |
12 | public StartGamePacket() {
13 | super(LegacyPacketId.Clientbound.PLAY_START_GAME);
14 | }
15 |
16 | @Override
17 | protected void write(ByteBuf data, Login packet) {
18 | data.writeInt(packet.getEntityId());
19 | StringSerializer.writeShortUTF16BEString(data, packet.getLevelType());
20 | data.writeByte(packet.getGameMode());
21 | data.writeByte(LegacyDimension.get(packet.getDimension()));
22 | data.writeByte(packet.getDifficulty());
23 | data.writeByte(0);
24 | data.writeByte(packet.getMaxPlayers());
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/TabCompleteResponsePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.TabCompleteResponse;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 | import protocolsupport.protocol.serializer.StringSerializer;
8 |
9 | public class TabCompleteResponsePacket extends LegacySingleWriteablePacket {
10 |
11 | public TabCompleteResponsePacket() {
12 | super(LegacyPacketId.Dualbound.PLAY_TAB_COMPLETE);
13 | }
14 |
15 | @Override
16 | protected void write(ByteBuf data, TabCompleteResponse packet) {
17 | StringSerializer.writeShortUTF16BEString(data, String.join("\u0000", packet.getCommands()));
18 | }
19 |
20 | }
21 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/ToClientChatPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import net.md_5.bungee.chat.ComponentSerializer;
8 | import net.md_5.bungee.protocol.packet.Chat;
9 | import protocolsupport.api.ProtocolVersion;
10 | import protocolsupport.protocol.packet.id.LegacyPacketId;
11 | import protocolsupport.protocol.packet.middle.WriteableMiddlePacket;
12 | import protocolsupport.protocol.serializer.StringSerializer;
13 | import protocolsupport.utils.netty.Allocator;
14 |
15 | public class ToClientChatPacket extends WriteableMiddlePacket {
16 |
17 | @Override
18 | public Collection toData(Chat packet) {
19 | if (packet.getPosition() != 2) {
20 | ByteBuf data = Allocator.allocateBuffer();
21 | data.writeByte(LegacyPacketId.Dualbound.PLAY_CHAT);
22 | String message = ComponentSerializer.parse(packet.getMessage())[0].toLegacyText();
23 | if (connection.getVersion().isBefore(ProtocolVersion.MINECRAFT_1_6_1)) {
24 | StringSerializer.writeShortUTF16BEString(data, message);
25 | } else {
26 | StringSerializer.writeShortUTF16BEString(data, "{\"text\": \"" + message + "\"}");
27 | }
28 | return Collections.singletonList(data);
29 | } else {
30 | return Collections.emptyList();
31 | }
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_4_5_6/ToServerChatPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import net.md_5.bungee.protocol.packet.Chat;
8 | import protocolsupport.protocol.packet.id.LegacyPacketId;
9 | import protocolsupport.protocol.packet.middle.WriteableMiddlePacket;
10 | import protocolsupport.protocol.serializer.StringSerializer;
11 | import protocolsupport.utils.netty.Allocator;
12 |
13 | public class ToServerChatPacket extends WriteableMiddlePacket {
14 |
15 | @Override
16 | public Collection toData(Chat packet) {
17 | if (packet.getPosition() != 2) {
18 | ByteBuf data = Allocator.allocateBuffer();
19 | data.writeByte(LegacyPacketId.Dualbound.PLAY_CHAT);
20 | StringSerializer.writeShortUTF16BEString(data, packet.getMessage());
21 | return Collections.singletonList(data);
22 | } else {
23 | return Collections.emptyList();
24 | }
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_5_6/ScoreboardDisplayPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.ScoreboardDisplay;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 | import protocolsupport.protocol.serializer.StringSerializer;
8 |
9 | public class ScoreboardDisplayPacket extends LegacySingleWriteablePacket {
10 |
11 | public ScoreboardDisplayPacket() {
12 | super(LegacyPacketId.Clientbound.PLAY_SCOREBOARD_DISPLAY_SLOT);
13 | }
14 |
15 | @Override
16 | protected void write(ByteBuf data, ScoreboardDisplay packet) {
17 | data.writeByte(packet.getPosition());
18 | StringSerializer.writeShortUTF16BEString(data, packet.getName());
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_5_6/ScoreboardObjectivePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.ScoreboardObjective;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 | import protocolsupport.protocol.serializer.StringSerializer;
8 |
9 | public class ScoreboardObjectivePacket extends LegacySingleWriteablePacket {
10 |
11 | public ScoreboardObjectivePacket() {
12 | super(LegacyPacketId.Clientbound.PLAY_SCOREBOARD_OBJECTIVE);
13 | }
14 |
15 | @Override
16 | protected void write(ByteBuf data, ScoreboardObjective packet) {
17 | StringSerializer.writeShortUTF16BEString(data, packet.getName());
18 | StringSerializer.writeShortUTF16BEString(data, packet.getValue());
19 | data.writeByte(packet.getAction());
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_5_6/ScoreboardScorePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.ScoreboardScore;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 | import protocolsupport.protocol.serializer.StringSerializer;
8 |
9 | public class ScoreboardScorePacket extends LegacySingleWriteablePacket {
10 |
11 | public ScoreboardScorePacket() {
12 | super(LegacyPacketId.Clientbound.PLAY_SCOREBOARD_SCORE);
13 | }
14 |
15 | @Override
16 | protected void write(ByteBuf data, ScoreboardScore packet) {
17 | StringSerializer.writeShortUTF16BEString(data, packet.getItemName());
18 | data.writeByte(packet.getAction());
19 | if (packet.getAction() != 1) {
20 | StringSerializer.writeShortUTF16BEString(data, packet.getScoreName());
21 | data.writeInt(packet.getValue());
22 | }
23 | }
24 |
25 | }
26 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/play/v_5_6/ScoreboardTeamPacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import net.md_5.bungee.protocol.packet.Team;
5 | import protocolsupport.protocol.packet.id.LegacyPacketId;
6 | import protocolsupport.protocol.packet.middleimpl.writeable.LegacySingleWriteablePacket;
7 | import protocolsupport.protocol.serializer.StringSerializer;
8 |
9 | public class ScoreboardTeamPacket extends LegacySingleWriteablePacket {
10 |
11 | public ScoreboardTeamPacket() {
12 | super(LegacyPacketId.Clientbound.PLAY_SCOREBOARD_TEAM);
13 | }
14 |
15 | @Override
16 | protected void write(ByteBuf data, Team packet) {
17 | StringSerializer.writeShortUTF16BEString(data, packet.getName());
18 | int mode = packet.getMode();
19 | data.writeByte(mode);
20 | if ((mode == 0) || (mode == 2)) {
21 | StringSerializer.writeShortUTF16BEString(data, packet.getDisplayName());
22 | StringSerializer.writeShortUTF16BEString(data, packet.getPrefix());
23 | StringSerializer.writeShortUTF16BEString(data, packet.getSuffix());
24 | data.writeByte(packet.getFriendlyFire());
25 | }
26 | if ((mode == 0) || (mode == 3) || (mode == 4)) {
27 | data.writeShort(packet.getPlayers().length);
28 | for (String player : packet.getPlayers()) {
29 | StringSerializer.writeShortUTF16BEString(data, player);
30 | }
31 | }
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/packet/middleimpl/writeable/status/v_4_5_6/StatusResponsePacket.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.packet.middleimpl.writeable.status.v_4_5_6;
2 |
3 | import java.util.Collection;
4 | import java.util.Collections;
5 |
6 | import io.netty.buffer.ByteBuf;
7 | import net.md_5.bungee.protocol.packet.StatusResponse;
8 | import protocolsupport.protocol.packet.middle.WriteableMiddlePacket;
9 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.KickPacket;
10 | import protocolsupport.utils.PingSerializer;
11 | import protocolsupport.utils.PingSerializer.ServerPing;
12 |
13 | public class StatusResponsePacket extends WriteableMiddlePacket {
14 |
15 | @Override
16 | public Collection toData(StatusResponse packet) {
17 | return Collections.singletonList(KickPacket.create(convert(connection.getVersion().getId(), PingSerializer.fromJson(packet.getResponse()))));
18 | }
19 |
20 | protected static String convert(int protocolVersion, ServerPing serverPing) {
21 | return
22 | "§1\u0000" +
23 | protocolVersion +
24 | "\u0000" +
25 | serverPing.getVersion().getName() +
26 | "\u0000" +
27 | serverPing.getMotd().toLegacyText() +
28 | "\u0000" +
29 | serverPing.getPlayers().getOnlineCount() +
30 | "\u0000" +
31 | serverPing.getPlayers().getMaxPlayers();
32 | }
33 |
34 | }
35 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/pipeline/ChannelHandlers.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.pipeline;
2 |
3 | public class ChannelHandlers {
4 |
5 | public static final String INITIAL_DECODER = "ps_initial_decoder";
6 | public static final String LOGIC = "ps_logic";
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/pipeline/IPipeLineBuilder.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.pipeline;
2 |
3 | import io.netty.channel.Channel;
4 | import protocolsupport.api.Connection;
5 |
6 | public abstract class IPipeLineBuilder {
7 |
8 | public static final IPipeLineBuilder NOOP = new IPipeLineBuilder() {
9 | @Override
10 | public void buildBungeeServer(Channel channel, Connection connection) {
11 | }
12 | @Override
13 | public void buildBungeeClientPipeLine(Channel channel, Connection connection) {
14 | }
15 | @Override
16 | public void buildBungeeClientCodec(Channel channel, Connection connection) {
17 | }
18 | };
19 |
20 | public abstract void buildBungeeClientCodec(Channel channel, Connection connection);
21 |
22 | public abstract void buildBungeeClientPipeLine(Channel channel, Connection connection);
23 |
24 | public abstract void buildBungeeServer(Channel channel, Connection connection);
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/pipeline/common/EncapsulatedConnectionKeepAlive.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.pipeline.common;
2 |
3 | import io.netty.buffer.ByteBuf;
4 | import io.netty.channel.ChannelHandlerContext;
5 | import io.netty.handler.timeout.IdleStateEvent;
6 | import io.netty.handler.timeout.IdleStateHandler;
7 | import protocolsupport.protocol.serializer.VarNumberSerializer;
8 |
9 | public class EncapsulatedConnectionKeepAlive extends IdleStateHandler {
10 |
11 | public EncapsulatedConnectionKeepAlive() {
12 | super(0, 5, 0);
13 | }
14 |
15 | @Override
16 | protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) throws Exception {
17 | ByteBuf rawemptyframedpacket = ctx.alloc().buffer();
18 | VarNumberSerializer.writeVarInt(rawemptyframedpacket, 0);
19 | ctx.writeAndFlush(rawemptyframedpacket);
20 | }
21 |
22 | }
23 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/pipeline/common/EncapsulatedHandshakeSender.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.pipeline.common;
2 |
3 | import java.net.InetSocketAddress;
4 |
5 | import io.netty.buffer.ByteBuf;
6 | import io.netty.channel.ChannelFutureListener;
7 | import io.netty.channel.ChannelHandlerContext;
8 | import io.netty.channel.ChannelInboundHandlerAdapter;
9 | import protocolsupport.protocol.utils.EncapsulatedProtocolInfo;
10 | import protocolsupport.protocol.utils.EncapsulatedProtocolUtils;
11 |
12 | public class EncapsulatedHandshakeSender extends ChannelInboundHandlerAdapter {
13 |
14 | private final InetSocketAddress remote;
15 | private final boolean hasCompression;
16 | public EncapsulatedHandshakeSender(InetSocketAddress remote, boolean hasCompression) {
17 | this.remote = remote;
18 | this.hasCompression = hasCompression;
19 | }
20 |
21 | @Override
22 | public void channelActive(ChannelHandlerContext ctx) throws Exception {
23 | ByteBuf handshake = ctx.alloc().buffer();
24 | handshake.writeByte(EncapsulatedProtocolUtils.FIRST_BYTE);
25 | EncapsulatedProtocolUtils.writeInfo(handshake, new EncapsulatedProtocolInfo(remote, hasCompression));
26 | ctx.writeAndFlush(handshake).addListener(ChannelFutureListener.FIRE_EXCEPTION_ON_FAILURE);
27 | super.channelActive(ctx);
28 | }
29 |
30 | }
31 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/pipeline/common/LogicHandler.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.pipeline.common;
2 |
3 | import io.netty.channel.ChannelDuplexHandler;
4 | import io.netty.channel.ChannelHandlerContext;
5 | import io.netty.channel.ChannelPromise;
6 | import net.md_5.bungee.api.ProxyServer;
7 | import protocolsupport.api.events.ConnectionCloseEvent;
8 | import protocolsupport.api.events.ConnectionOpenEvent;
9 | import protocolsupport.protocol.ConnectionImpl;
10 | import protocolsupport.protocol.storage.ProtocolStorage;
11 |
12 | public class LogicHandler extends ChannelDuplexHandler {
13 |
14 | protected final ConnectionImpl connection;
15 | protected final boolean isClientConnection;
16 | public LogicHandler(ConnectionImpl connection, boolean isClientConnection) {
17 | this.connection = connection;
18 | this.isClientConnection = isClientConnection;
19 | }
20 |
21 | @Override
22 | public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
23 | msg = connection.handlePacketReceive(msg, isClientConnection);
24 | if (msg == null) {
25 | return;
26 | }
27 | super.channelRead(ctx, msg);
28 | }
29 |
30 | @Override
31 | public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
32 | msg = connection.handlePacketSend(msg, isClientConnection);
33 | if (msg == null) {
34 | promise.setSuccess();
35 | return;
36 | }
37 | super.write(ctx, msg, promise);
38 | }
39 |
40 | @Override
41 | public void channelActive(ChannelHandlerContext ctx) throws Exception {
42 | super.channelActive(ctx);
43 | if (isClientConnection) {
44 | ProxyServer.getInstance().getPluginManager().callEvent(new ConnectionOpenEvent(connection));
45 | }
46 | }
47 |
48 | @Override
49 | public void channelInactive(ChannelHandlerContext ctx) throws Exception {
50 | super.channelInactive(ctx);
51 | if (isClientConnection) {
52 | ProxyServer.getInstance().getPluginManager().callEvent(new ConnectionCloseEvent(connection));
53 | ProtocolStorage.removeConnection(connection.getRawAddress());
54 | }
55 | }
56 |
57 | }
58 |
--------------------------------------------------------------------------------
/src/protocolsupport/protocol/pipeline/common/NoOpFrameDecoder.java:
--------------------------------------------------------------------------------
1 | package protocolsupport.protocol.pipeline.common;
2 |
3 | import java.util.List;
4 |
5 | import io.netty.buffer.ByteBuf;
6 | import io.netty.channel.ChannelHandlerContext;
7 | import io.netty.handler.codec.ByteToMessageDecoder;
8 |
9 | public class NoOpFrameDecoder extends ByteToMessageDecoder {
10 |
11 | @Override
12 | protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List