├── .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 | [![Build Status](https://build.true-games.org/buildStatus/icon?job=ProtocolSupportBungee)](https://build.true-games.org/job/ProtocolSupportBungee/) 5 | [![Chat](https://img.shields.io/badge/chat-on%20discord-7289da.svg)](https://discord.gg/x935y8p) 6 | PayPal donate button 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 list) throws Exception { 13 | if (!buf.isReadable()) { 14 | return; 15 | } 16 | list.add(buf.readBytes(buf.readableBytes())); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/common/NoOpFrameEncoder.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.codec.MessageToByteEncoder; 6 | 7 | public class NoOpFrameEncoder extends MessageToByteEncoder { 8 | 9 | @Override 10 | protected void encode(ChannelHandlerContext ctx, ByteBuf buf, ByteBuf out) throws Exception { 11 | out.writeBytes(buf); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/common/PacketCompressor.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.codec.MessageToByteEncoder; 6 | import protocolsupport.protocol.serializer.MiscSerializer; 7 | import protocolsupport.protocol.serializer.VarNumberSerializer; 8 | import protocolsupport.utils.netty.Compressor; 9 | 10 | public class PacketCompressor extends MessageToByteEncoder { 11 | 12 | private final Compressor compressor = Compressor.create(); 13 | private final int threshold; 14 | 15 | public PacketCompressor(int threshold) { 16 | this.threshold = threshold; 17 | } 18 | 19 | @Override 20 | public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { 21 | super.handlerRemoved(ctx); 22 | compressor.recycle(); 23 | } 24 | 25 | @Override 26 | protected void encode(ChannelHandlerContext ctx, ByteBuf from, ByteBuf to) { 27 | int readable = from.readableBytes(); 28 | if (readable == 0) { 29 | return; 30 | } 31 | if (readable < this.threshold) { 32 | VarNumberSerializer.writeVarInt(to, 0); 33 | to.writeBytes(from); 34 | } else { 35 | VarNumberSerializer.writeVarInt(to, readable); 36 | to.writeBytes(compressor.compress(MiscSerializer.readAllBytes(from))); 37 | } 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/common/PacketDecompressor.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.common; 2 | 3 | import java.text.MessageFormat; 4 | import java.util.List; 5 | import java.util.zip.DataFormatException; 6 | 7 | import io.netty.buffer.ByteBuf; 8 | import io.netty.buffer.Unpooled; 9 | import io.netty.channel.ChannelHandlerContext; 10 | import io.netty.handler.codec.ByteToMessageDecoder; 11 | import io.netty.handler.codec.DecoderException; 12 | import protocolsupport.protocol.serializer.MiscSerializer; 13 | import protocolsupport.protocol.serializer.VarNumberSerializer; 14 | import protocolsupport.utils.netty.Decompressor; 15 | 16 | public class PacketDecompressor extends ByteToMessageDecoder { 17 | 18 | private static final int maxPacketLength = 2 << 21; 19 | 20 | private final Decompressor decompressor = Decompressor.create(); 21 | 22 | @Override 23 | public void channelInactive(ChannelHandlerContext ctx) throws Exception { 24 | super.channelInactive(ctx); 25 | decompressor.recycle(); 26 | } 27 | 28 | @Override 29 | protected void decode(ChannelHandlerContext ctx, ByteBuf from, List list) throws DataFormatException { 30 | if (!from.isReadable()) { 31 | return; 32 | } 33 | int uncompressedlength = VarNumberSerializer.readVarInt(from); 34 | if (uncompressedlength == 0) { 35 | list.add(from.readBytes(from.readableBytes())); 36 | } else { 37 | if (uncompressedlength > maxPacketLength) { 38 | throw new DecoderException(MessageFormat.format("Badly compressed packet - size of {0} is larger than protocol maximum of {1}", uncompressedlength, maxPacketLength)); 39 | } 40 | list.add(Unpooled.wrappedBuffer(decompressor.decompress(MiscSerializer.readAllBytes(from), uncompressedlength))); 41 | } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/common/VarIntFrameDecoder.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 | import io.netty.handler.codec.CorruptedFrameException; 9 | 10 | public class VarIntFrameDecoder extends ByteToMessageDecoder { 11 | 12 | private int packetLength = -1; 13 | 14 | @Override 15 | public void decode(ChannelHandlerContext ctx, ByteBuf input, List list) { 16 | if (packetLength == -1) { 17 | input.markReaderIndex(); 18 | int tmpPacketLength = 0; 19 | for (int i = 0; i < 3; ++i) { 20 | if (!input.isReadable()) { 21 | input.resetReaderIndex(); 22 | return; 23 | } 24 | int part = input.readByte(); 25 | tmpPacketLength |= (part & 0x7F) << (i * 7); 26 | if (part >= 0) { 27 | packetLength = tmpPacketLength; 28 | if (packetLength == 0) { 29 | packetLength = -1; 30 | } 31 | return; 32 | } 33 | } 34 | throw new CorruptedFrameException("Packet length varint length is more than 21 bits"); 35 | } 36 | if (input.readableBytes() < packetLength) { 37 | return; 38 | } 39 | list.add(input.readBytes(packetLength)); 40 | packetLength = -1; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/initial/ProtocolUtils.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.initial; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import io.netty.handler.codec.DecoderException; 5 | import protocolsupport.api.ProtocolVersion; 6 | import protocolsupport.protocol.serializer.VarNumberSerializer; 7 | import protocolsupport.protocol.utils.ProtocolVersionsHelper; 8 | 9 | public class ProtocolUtils { 10 | 11 | protected static ProtocolVersion get16PingVersion(int protocolId) { 12 | switch (protocolId) { 13 | case 78: { 14 | return ProtocolVersion.MINECRAFT_1_6_4; 15 | } 16 | case 74: { 17 | return ProtocolVersion.MINECRAFT_1_6_2; 18 | } 19 | case 73: { 20 | return ProtocolVersion.MINECRAFT_1_6_1; 21 | } 22 | default: { 23 | return ProtocolVersion.MINECRAFT_1_6_4; 24 | } 25 | } 26 | } 27 | 28 | protected static ProtocolVersion readOldHandshake(ByteBuf data) { 29 | return ProtocolVersionsHelper.getOldProtocolVersion(data.readUnsignedByte()); 30 | } 31 | 32 | protected static ProtocolVersion readNewHandshake(ByteBuf data) { 33 | int packetId = VarNumberSerializer.readVarInt(data); 34 | if (packetId == 0x00) { 35 | return ProtocolVersionsHelper.getNewProtocolVersion(VarNumberSerializer.readVarInt(data)); 36 | } else { 37 | throw new DecoderException(packetId + " is not a valid packet id"); 38 | } 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/initial/SetProtocolTask.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.initial; 2 | 3 | import io.netty.channel.Channel; 4 | import protocolsupport.api.ProtocolVersion; 5 | 6 | public class SetProtocolTask implements Runnable { 7 | 8 | private final InitialPacketDecoder initialDecoder; 9 | private final Channel channel; 10 | private final ProtocolVersion version; 11 | 12 | public SetProtocolTask(InitialPacketDecoder initialDecoder, Channel channel, ProtocolVersion version) { 13 | this.initialDecoder = initialDecoder; 14 | this.channel = channel; 15 | this.version = version; 16 | } 17 | 18 | @Override 19 | public void run() { 20 | try { 21 | initialDecoder.setProtocol(channel, version); 22 | } catch (Exception t) { 23 | channel.pipeline().firstContext().fireExceptionCaught(t); 24 | } 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/AbstractPacketEncoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.channel.ChannelPromise; 6 | import io.netty.handler.codec.EncoderException; 7 | import io.netty.util.ReferenceCountUtil; 8 | import net.md_5.bungee.protocol.DefinedPacket; 9 | import net.md_5.bungee.protocol.MinecraftEncoder; 10 | import net.md_5.bungee.protocol.Protocol; 11 | import protocolsupport.api.Connection; 12 | import protocolsupport.protocol.packet.middle.WriteableMiddlePacket; 13 | import protocolsupport.protocol.storage.NetworkDataCache; 14 | import protocolsupport.protocol.utils.ProtocolVersionsHelper; 15 | import protocolsupport.protocol.utils.registry.ClassMapMiddleTransformerRegistry; 16 | 17 | public abstract class AbstractPacketEncoder extends MinecraftEncoder { 18 | 19 | protected final ClassMapMiddleTransformerRegistry> registry = new ClassMapMiddleTransformerRegistry<>(); 20 | 21 | protected final Connection connection; 22 | protected final NetworkDataCache cache; 23 | 24 | public AbstractPacketEncoder(Connection connection, NetworkDataCache cache) { 25 | super(Protocol.HANDSHAKE, true, ProtocolVersionsHelper.LATEST_PC.getId()); 26 | this.connection = connection; 27 | this.cache = cache; 28 | registry.setCallBack(transformer -> { 29 | transformer.setConnection(this.connection); 30 | transformer.setSharedStorage(this.cache); 31 | }); 32 | } 33 | 34 | @Override 35 | public void write(final ChannelHandlerContext ctx, final Object msgObject, final ChannelPromise promise) throws Exception { 36 | try { 37 | if (acceptOutboundMessage(msgObject)) { 38 | DefinedPacket msg = (DefinedPacket) msgObject; 39 | try { 40 | encode(ctx, msg, null); 41 | promise.trySuccess(); 42 | } finally { 43 | ReferenceCountUtil.release(msg); 44 | } 45 | } else { 46 | ctx.write(msgObject, promise); 47 | } 48 | } catch (EncoderException e) { 49 | throw e; 50 | } catch (Throwable e2) { 51 | throw new EncoderException(e2); 52 | } 53 | } 54 | 55 | @SuppressWarnings("unchecked") 56 | @Override 57 | protected void encode(ChannelHandlerContext ctx, DefinedPacket msg, ByteBuf out) throws Exception { 58 | WriteableMiddlePacket transformer = (WriteableMiddlePacket) registry.getTransformer(msg.getClass()); 59 | transformer.toData(msg).forEach(ctx::writeAndFlush); 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/LegacyAbstractFromClientPacketDecoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version; 2 | 3 | import java.util.List; 4 | 5 | import io.netty.buffer.ByteBuf; 6 | import io.netty.buffer.Unpooled; 7 | import io.netty.channel.ChannelHandlerContext; 8 | import net.md_5.bungee.protocol.MinecraftDecoder; 9 | import net.md_5.bungee.protocol.Protocol; 10 | import protocolsupport.api.Connection; 11 | import protocolsupport.protocol.packet.middle.ReadableMiddlePacket; 12 | import protocolsupport.protocol.storage.NetworkDataCache; 13 | import protocolsupport.protocol.utils.ProtocolVersionsHelper; 14 | import protocolsupport.protocol.utils.registry.PacketIdMiddleTransformerRegistry; 15 | import protocolsupport.utils.netty.ReplayingDecoderBuffer; 16 | import protocolsupport.utils.netty.ReplayingDecoderBuffer.EOFSignal; 17 | 18 | public abstract class LegacyAbstractFromClientPacketDecoder extends MinecraftDecoder { 19 | 20 | protected final PacketIdMiddleTransformerRegistry registry = new PacketIdMiddleTransformerRegistry<>(); 21 | 22 | protected final Connection connection; 23 | protected final NetworkDataCache cache; 24 | 25 | protected Protocol protocol = Protocol.HANDSHAKE; 26 | 27 | public LegacyAbstractFromClientPacketDecoder(Connection connection, NetworkDataCache cache) { 28 | super(Protocol.HANDSHAKE, true, ProtocolVersionsHelper.LATEST_PC.getId()); 29 | this.connection = connection; 30 | this.cache = cache; 31 | registry.setCallBack(transformer -> { 32 | transformer.setConnection(this.connection); 33 | transformer.setSharedStorage(this.cache); 34 | }); 35 | } 36 | 37 | @Override 38 | public void setProtocol(Protocol protocol) { 39 | super.setProtocol(protocol); 40 | this.protocol = protocol; 41 | } 42 | 43 | private final ReplayingDecoderBuffer buffer = new ReplayingDecoderBuffer(Unpooled.buffer()); 44 | 45 | @Override 46 | protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List packets) throws Exception { 47 | if (!buf.isReadable()) { 48 | return; 49 | } 50 | buffer.writeBytes(buf); 51 | buffer.markReaderIndex(); 52 | try { 53 | while (buffer.isReadable()) { 54 | buffer.markReaderIndex(); 55 | ReadableMiddlePacket transformer = registry.getTransformer(protocol, buffer.readUnsignedByte(), true); 56 | transformer.read(buffer); 57 | packets.addAll(transformer.toNative()); 58 | buffer.discardReadBytes(); 59 | } 60 | } catch (EOFSignal e) { 61 | buffer.resetReaderIndex(); 62 | } 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/LegacyAbstractFromServerPacketDecoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version; 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.DecoderException; 8 | import net.md_5.bungee.protocol.MinecraftDecoder; 9 | import net.md_5.bungee.protocol.PacketWrapper; 10 | import net.md_5.bungee.protocol.Protocol; 11 | import protocolsupport.api.Connection; 12 | import protocolsupport.protocol.packet.middle.ReadableMiddlePacket; 13 | import protocolsupport.protocol.storage.NetworkDataCache; 14 | import protocolsupport.protocol.utils.ProtocolVersionsHelper; 15 | import protocolsupport.protocol.utils.registry.PacketIdMiddleTransformerRegistry; 16 | 17 | public abstract class LegacyAbstractFromServerPacketDecoder extends MinecraftDecoder { 18 | 19 | protected final PacketIdMiddleTransformerRegistry registry = new PacketIdMiddleTransformerRegistry<>(); 20 | 21 | protected final Connection connection; 22 | protected final NetworkDataCache cache; 23 | 24 | public LegacyAbstractFromServerPacketDecoder(Connection connection, NetworkDataCache cache) { 25 | super(Protocol.GAME, false, ProtocolVersionsHelper.LATEST_PC.getId()); 26 | this.connection = connection; 27 | this.cache = cache; 28 | registry.setCallBack(transformer -> { 29 | transformer.setConnection(this.connection); 30 | transformer.setSharedStorage(this.cache); 31 | }); 32 | } 33 | 34 | @Override 35 | protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List packets) throws Exception { 36 | if (!buf.isReadable()) { 37 | return; 38 | } 39 | buf.markReaderIndex(); 40 | ReadableMiddlePacket transformer = registry.getTransformer(Protocol.GAME, buf.readUnsignedByte(), false); 41 | if (transformer != null) { 42 | transformer.read(buf); 43 | if (buf.isReadable()) { 44 | throw new DecoderException("Did not read all data from packet " + transformer.getClass().getName() + ", bytes left: " + buf.readableBytes()); 45 | } 46 | packets.addAll(transformer.toNative()); 47 | } else { 48 | buf.resetReaderIndex(); 49 | packets.add(new PacketWrapper(null, buf.copy())); 50 | } 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_4/FromServerPacketDecoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_4; 2 | 3 | import net.md_5.bungee.protocol.Protocol; 4 | import protocolsupport.api.Connection; 5 | import protocolsupport.protocol.packet.id.LegacyPacketId; 6 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.FromServerChatPacket; 7 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.KeepAlivePacket; 8 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.KickPacket; 9 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.PlayerListItemPacket; 10 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.PluginMessagePacket; 11 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.RespawnPacket; 12 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.StartGamePacket; 13 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.TabCompleteResponsePacket; 14 | import protocolsupport.protocol.pipeline.version.LegacyAbstractFromServerPacketDecoder; 15 | import protocolsupport.protocol.storage.NetworkDataCache; 16 | 17 | public class FromServerPacketDecoder extends LegacyAbstractFromServerPacketDecoder { 18 | 19 | { 20 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_KEEP_ALIVE, KeepAlivePacket.class); 21 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_KICK, KickPacket.class); 22 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_START_GAME, StartGamePacket.class); 23 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_CHAT, FromServerChatPacket.class); 24 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_RESPAWN, RespawnPacket.class); 25 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_PLAYER_LIST, PlayerListItemPacket.class); 26 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_TAB_COMPLETE, TabCompleteResponsePacket.class); 27 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_PLUGIN_MESSAGE, PluginMessagePacket.class); 28 | } 29 | 30 | public FromServerPacketDecoder(Connection connection, NetworkDataCache cache) { 31 | super(connection, cache); 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_4/PipeLineBuilder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_4; 2 | 3 | import io.netty.channel.Channel; 4 | import io.netty.channel.ChannelPipeline; 5 | import net.md_5.bungee.netty.PipelineUtils; 6 | import protocolsupport.api.Connection; 7 | import protocolsupport.protocol.pipeline.IPipeLineBuilder; 8 | import protocolsupport.protocol.pipeline.common.EncapsulatedHandshakeSender; 9 | import protocolsupport.protocol.pipeline.common.NoOpFrameDecoder; 10 | import protocolsupport.protocol.pipeline.common.NoOpFrameEncoder; 11 | import protocolsupport.protocol.storage.NetworkDataCache; 12 | 13 | public class PipeLineBuilder extends IPipeLineBuilder { 14 | 15 | @Override 16 | public void buildBungeeClientCodec(Channel channel, Connection connection) { 17 | ChannelPipeline pipeline = channel.pipeline(); 18 | NetworkDataCache cache = new NetworkDataCache(); 19 | cache.storeIn(connection); 20 | pipeline.replace(PipelineUtils.PACKET_DECODER, PipelineUtils.PACKET_DECODER, new FromClientPacketDecoder(connection, cache)); 21 | pipeline.replace(PipelineUtils.PACKET_ENCODER, PipelineUtils.PACKET_ENCODER, new ToClientPacketEncoder(connection, cache)); 22 | } 23 | 24 | @Override 25 | public void buildBungeeClientPipeLine(Channel channel, Connection connection) { 26 | ChannelPipeline pipeline = channel.pipeline(); 27 | pipeline.replace(PipelineUtils.FRAME_DECODER, PipelineUtils.FRAME_DECODER, new NoOpFrameDecoder()); 28 | pipeline.replace(PipelineUtils.FRAME_PREPENDER, PipelineUtils.FRAME_PREPENDER, new NoOpFrameEncoder()); 29 | } 30 | 31 | @Override 32 | public void buildBungeeServer(Channel channel, Connection connection) { 33 | ChannelPipeline pipeline = channel.pipeline(); 34 | pipeline.addFirst(new EncapsulatedHandshakeSender(null, false)); 35 | NetworkDataCache cache = NetworkDataCache.getFrom(connection); 36 | pipeline.replace(PipelineUtils.PACKET_DECODER, PipelineUtils.PACKET_DECODER, new FromServerPacketDecoder(connection, cache)); 37 | pipeline.replace(PipelineUtils.PACKET_ENCODER, PipelineUtils.PACKET_ENCODER, new ToServerPacketEncoder(connection, cache)); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_4/ToClientPacketEncoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_4; 2 | 3 | import net.md_5.bungee.protocol.packet.BossBar; 4 | import net.md_5.bungee.protocol.packet.Chat; 5 | import net.md_5.bungee.protocol.packet.Commands; 6 | import net.md_5.bungee.protocol.packet.EncryptionRequest; 7 | import net.md_5.bungee.protocol.packet.EntityEffect; 8 | import net.md_5.bungee.protocol.packet.EntityRemoveEffect; 9 | import net.md_5.bungee.protocol.packet.EntityStatus; 10 | import net.md_5.bungee.protocol.packet.GameState; 11 | import net.md_5.bungee.protocol.packet.KeepAlive; 12 | import net.md_5.bungee.protocol.packet.Kick; 13 | import net.md_5.bungee.protocol.packet.Login; 14 | import net.md_5.bungee.protocol.packet.LoginSuccess; 15 | import net.md_5.bungee.protocol.packet.PlayerListHeaderFooter; 16 | import net.md_5.bungee.protocol.packet.PlayerListItem; 17 | import net.md_5.bungee.protocol.packet.PluginMessage; 18 | import net.md_5.bungee.protocol.packet.Respawn; 19 | import net.md_5.bungee.protocol.packet.ScoreboardDisplay; 20 | import net.md_5.bungee.protocol.packet.ScoreboardObjective; 21 | import net.md_5.bungee.protocol.packet.ScoreboardScore; 22 | import net.md_5.bungee.protocol.packet.StatusResponse; 23 | import net.md_5.bungee.protocol.packet.TabCompleteResponse; 24 | import net.md_5.bungee.protocol.packet.Team; 25 | import net.md_5.bungee.protocol.packet.Title; 26 | import net.md_5.bungee.protocol.packet.ViewDistance; 27 | import protocolsupport.api.Connection; 28 | import protocolsupport.protocol.packet.middleimpl.writeable.NoopWriteablePacket; 29 | import protocolsupport.protocol.packet.middleimpl.writeable.login.v_4_5_6.EncryptionRequestPacket; 30 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.EntityEffectAddPacket; 31 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.EntityEffectRemovePacket; 32 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.EntityStatusPacket; 33 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.GameStatePacket; 34 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.KeepAlivePacket; 35 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.KickPacket; 36 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.PlayerListItemPacket; 37 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.PluginMessagePacket; 38 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.RespawnPacket; 39 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.StartGamePacket; 40 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.TabCompleteResponsePacket; 41 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ToClientChatPacket; 42 | import protocolsupport.protocol.packet.middleimpl.writeable.status.v_4_5_6.StatusResponsePacket; 43 | import protocolsupport.protocol.pipeline.version.AbstractPacketEncoder; 44 | import protocolsupport.protocol.storage.NetworkDataCache; 45 | 46 | public class ToClientPacketEncoder extends AbstractPacketEncoder { 47 | 48 | { 49 | registry.register(EncryptionRequest.class, EncryptionRequestPacket.class); 50 | registry.register(LoginSuccess.class, NoopWriteablePacket.class); 51 | registry.register(Login.class, StartGamePacket.class); 52 | registry.register(StatusResponse.class, StatusResponsePacket.class); 53 | registry.register(Kick.class, KickPacket.class); 54 | registry.register(KeepAlive.class, KeepAlivePacket.class); 55 | registry.register(PluginMessage.class, PluginMessagePacket.class); 56 | registry.register(Respawn.class, RespawnPacket.class); 57 | registry.register(Chat.class, ToClientChatPacket.class); 58 | registry.register(ScoreboardDisplay.class, NoopWriteablePacket.class); 59 | registry.register(ScoreboardObjective.class, NoopWriteablePacket.class); 60 | registry.register(ScoreboardScore.class, NoopWriteablePacket.class); 61 | registry.register(Team.class, NoopWriteablePacket.class); 62 | registry.register(PlayerListItem.class, PlayerListItemPacket.class); 63 | registry.register(TabCompleteResponse.class, TabCompleteResponsePacket.class); 64 | registry.register(EntityStatus.class, EntityStatusPacket.class); 65 | registry.register(EntityEffect.class, EntityEffectAddPacket.class); 66 | registry.register(EntityRemoveEffect.class, EntityEffectRemovePacket.class); 67 | registry.register(GameState.class, GameStatePacket.class); 68 | registry.register(BossBar.class, NoopWriteablePacket.class); 69 | registry.register(Title.class, NoopWriteablePacket.class); 70 | registry.register(PlayerListHeaderFooter.class, NoopWriteablePacket.class); 71 | registry.register(Commands.class, NoopWriteablePacket.class); 72 | registry.register(ViewDistance.class, NoopWriteablePacket.class); 73 | } 74 | 75 | public ToClientPacketEncoder(Connection connection, NetworkDataCache cache) { 76 | super(connection, cache); 77 | } 78 | 79 | } 80 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_4/ToServerPacketEncoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_4; 2 | 3 | import net.md_5.bungee.protocol.packet.Chat; 4 | import net.md_5.bungee.protocol.packet.ClientSettings; 5 | import net.md_5.bungee.protocol.packet.ClientStatus; 6 | import net.md_5.bungee.protocol.packet.Handshake; 7 | import net.md_5.bungee.protocol.packet.KeepAlive; 8 | import net.md_5.bungee.protocol.packet.LoginRequest; 9 | import net.md_5.bungee.protocol.packet.PluginMessage; 10 | import protocolsupport.api.Connection; 11 | import protocolsupport.protocol.packet.middleimpl.writeable.handshake.v_4_5_6.LoginRequestServerHandshakePacket; 12 | import protocolsupport.protocol.packet.middleimpl.writeable.handshake.v_4_5_6_pe.HandshakeCachePacket; 13 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ClientCommandPacket; 14 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ClientSettingsPacket; 15 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.KeepAlivePacket; 16 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.PluginMessagePacket; 17 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ToServerChatPacket; 18 | import protocolsupport.protocol.pipeline.version.AbstractPacketEncoder; 19 | import protocolsupport.protocol.storage.NetworkDataCache; 20 | 21 | public class ToServerPacketEncoder extends AbstractPacketEncoder { 22 | 23 | { 24 | registry.register(Handshake.class, HandshakeCachePacket.class); 25 | registry.register(LoginRequest.class, LoginRequestServerHandshakePacket.class); 26 | registry.register(KeepAlive.class, KeepAlivePacket.class); 27 | registry.register(Chat.class, ToServerChatPacket.class); 28 | registry.register(PluginMessage.class, PluginMessagePacket.class); 29 | registry.register(ClientStatus.class, ClientCommandPacket.class); 30 | registry.register(ClientSettings.class, ClientSettingsPacket.class); 31 | } 32 | 33 | public ToServerPacketEncoder(Connection connection, NetworkDataCache cache) { 34 | super(connection, cache); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_5/FromServerPacketDecoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_5; 2 | 3 | import net.md_5.bungee.protocol.Protocol; 4 | import protocolsupport.api.Connection; 5 | import protocolsupport.protocol.packet.id.LegacyPacketId; 6 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.FromServerChatPacket; 7 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.KeepAlivePacket; 8 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.KickPacket; 9 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.PlayerListItemPacket; 10 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.PluginMessagePacket; 11 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.RespawnPacket; 12 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.StartGamePacket; 13 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.TabCompleteResponsePacket; 14 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6.ScoreboardDisplayPacket; 15 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6.ScoreboardObjectivePacket; 16 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6.ScoreboardScorePacket; 17 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6.ScoreboardTeamPacket; 18 | import protocolsupport.protocol.pipeline.version.LegacyAbstractFromServerPacketDecoder; 19 | import protocolsupport.protocol.storage.NetworkDataCache; 20 | 21 | public class FromServerPacketDecoder extends LegacyAbstractFromServerPacketDecoder { 22 | 23 | { 24 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_KEEP_ALIVE, KeepAlivePacket.class); 25 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_KICK, KickPacket.class); 26 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_START_GAME, StartGamePacket.class); 27 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_CHAT, FromServerChatPacket.class); 28 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_RESPAWN, RespawnPacket.class); 29 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_PLAYER_LIST, PlayerListItemPacket.class); 30 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_TAB_COMPLETE, TabCompleteResponsePacket.class); 31 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_SCOREBOARD_OBJECTIVE, ScoreboardObjectivePacket.class); 32 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_SCOREBOARD_SCORE, ScoreboardScorePacket.class); 33 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_SCOREBOARD_DISPLAY_SLOT, ScoreboardDisplayPacket.class); 34 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_SCOREBOARD_TEAM, ScoreboardTeamPacket.class); 35 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_PLUGIN_MESSAGE, PluginMessagePacket.class); 36 | } 37 | 38 | public FromServerPacketDecoder(Connection connection, NetworkDataCache cache) { 39 | super(connection, cache); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_5/PipeLineBuilder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_5; 2 | 3 | import io.netty.channel.Channel; 4 | import io.netty.channel.ChannelPipeline; 5 | import net.md_5.bungee.netty.PipelineUtils; 6 | import protocolsupport.api.Connection; 7 | import protocolsupport.protocol.pipeline.IPipeLineBuilder; 8 | import protocolsupport.protocol.pipeline.common.EncapsulatedHandshakeSender; 9 | import protocolsupport.protocol.pipeline.common.NoOpFrameDecoder; 10 | import protocolsupport.protocol.pipeline.common.NoOpFrameEncoder; 11 | import protocolsupport.protocol.storage.NetworkDataCache; 12 | 13 | public class PipeLineBuilder extends IPipeLineBuilder { 14 | 15 | @Override 16 | public void buildBungeeClientCodec(Channel channel, Connection connection) { 17 | ChannelPipeline pipeline = channel.pipeline(); 18 | NetworkDataCache cache = new NetworkDataCache(); 19 | cache.storeIn(connection); 20 | pipeline.replace(PipelineUtils.PACKET_DECODER, PipelineUtils.PACKET_DECODER, new FromClientPacketDecoder(connection, cache)); 21 | pipeline.replace(PipelineUtils.PACKET_ENCODER, PipelineUtils.PACKET_ENCODER, new ToClientPacketEncoder(connection, cache)); 22 | } 23 | 24 | @Override 25 | public void buildBungeeClientPipeLine(Channel channel, Connection connection) { 26 | ChannelPipeline pipeline = channel.pipeline(); 27 | pipeline.replace(PipelineUtils.FRAME_DECODER, PipelineUtils.FRAME_DECODER, new NoOpFrameDecoder()); 28 | pipeline.replace(PipelineUtils.FRAME_PREPENDER, PipelineUtils.FRAME_PREPENDER, new NoOpFrameEncoder()); 29 | } 30 | 31 | @Override 32 | public void buildBungeeServer(Channel channel, Connection connection) { 33 | ChannelPipeline pipeline = channel.pipeline(); 34 | pipeline.addFirst(new EncapsulatedHandshakeSender(null, false)); 35 | NetworkDataCache cache = NetworkDataCache.getFrom(connection); 36 | pipeline.replace(PipelineUtils.PACKET_DECODER, PipelineUtils.PACKET_DECODER, new FromServerPacketDecoder(connection, cache)); 37 | pipeline.replace(PipelineUtils.PACKET_ENCODER, PipelineUtils.PACKET_ENCODER, new ToServerPacketEncoder(connection, cache)); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_5/ToClientPacketEncoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_5; 2 | 3 | import net.md_5.bungee.protocol.packet.BossBar; 4 | import net.md_5.bungee.protocol.packet.Chat; 5 | import net.md_5.bungee.protocol.packet.Commands; 6 | import net.md_5.bungee.protocol.packet.EncryptionRequest; 7 | import net.md_5.bungee.protocol.packet.EntityEffect; 8 | import net.md_5.bungee.protocol.packet.EntityRemoveEffect; 9 | import net.md_5.bungee.protocol.packet.EntityStatus; 10 | import net.md_5.bungee.protocol.packet.GameState; 11 | import net.md_5.bungee.protocol.packet.KeepAlive; 12 | import net.md_5.bungee.protocol.packet.Kick; 13 | import net.md_5.bungee.protocol.packet.Login; 14 | import net.md_5.bungee.protocol.packet.LoginSuccess; 15 | import net.md_5.bungee.protocol.packet.PlayerListHeaderFooter; 16 | import net.md_5.bungee.protocol.packet.PlayerListItem; 17 | import net.md_5.bungee.protocol.packet.PluginMessage; 18 | import net.md_5.bungee.protocol.packet.Respawn; 19 | import net.md_5.bungee.protocol.packet.ScoreboardDisplay; 20 | import net.md_5.bungee.protocol.packet.ScoreboardObjective; 21 | import net.md_5.bungee.protocol.packet.ScoreboardScore; 22 | import net.md_5.bungee.protocol.packet.StatusResponse; 23 | import net.md_5.bungee.protocol.packet.TabCompleteResponse; 24 | import net.md_5.bungee.protocol.packet.Team; 25 | import net.md_5.bungee.protocol.packet.Title; 26 | import net.md_5.bungee.protocol.packet.ViewDistance; 27 | import protocolsupport.api.Connection; 28 | import protocolsupport.protocol.packet.middleimpl.writeable.NoopWriteablePacket; 29 | import protocolsupport.protocol.packet.middleimpl.writeable.login.v_4_5_6.EncryptionRequestPacket; 30 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.EntityEffectAddPacket; 31 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.EntityEffectRemovePacket; 32 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.EntityStatusPacket; 33 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.GameStatePacket; 34 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.KeepAlivePacket; 35 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.KickPacket; 36 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.PlayerListItemPacket; 37 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.PluginMessagePacket; 38 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.RespawnPacket; 39 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.StartGamePacket; 40 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.TabCompleteResponsePacket; 41 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ToClientChatPacket; 42 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6.ScoreboardDisplayPacket; 43 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6.ScoreboardObjectivePacket; 44 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6.ScoreboardScorePacket; 45 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6.ScoreboardTeamPacket; 46 | import protocolsupport.protocol.packet.middleimpl.writeable.status.v_4_5_6.StatusResponsePacket; 47 | import protocolsupport.protocol.pipeline.version.AbstractPacketEncoder; 48 | import protocolsupport.protocol.storage.NetworkDataCache; 49 | 50 | public class ToClientPacketEncoder extends AbstractPacketEncoder { 51 | 52 | { 53 | registry.register(EncryptionRequest.class, EncryptionRequestPacket.class); 54 | registry.register(LoginSuccess.class, NoopWriteablePacket.class); 55 | registry.register(Login.class, StartGamePacket.class); 56 | registry.register(StatusResponse.class, StatusResponsePacket.class); 57 | registry.register(Kick.class, KickPacket.class); 58 | registry.register(KeepAlive.class, KeepAlivePacket.class); 59 | registry.register(PluginMessage.class, PluginMessagePacket.class); 60 | registry.register(Respawn.class, RespawnPacket.class); 61 | registry.register(Chat.class, ToClientChatPacket.class); 62 | registry.register(ScoreboardDisplay.class, ScoreboardDisplayPacket.class); 63 | registry.register(ScoreboardObjective.class, ScoreboardObjectivePacket.class); 64 | registry.register(ScoreboardScore.class, ScoreboardScorePacket.class); 65 | registry.register(Team.class, ScoreboardTeamPacket.class); 66 | registry.register(PlayerListItem.class, PlayerListItemPacket.class); 67 | registry.register(TabCompleteResponse.class, TabCompleteResponsePacket.class); 68 | registry.register(EntityStatus.class, EntityStatusPacket.class); 69 | registry.register(EntityEffect.class, EntityEffectAddPacket.class); 70 | registry.register(EntityRemoveEffect.class, EntityEffectRemovePacket.class); 71 | registry.register(GameState.class, GameStatePacket.class); 72 | registry.register(BossBar.class, NoopWriteablePacket.class); 73 | registry.register(Title.class, NoopWriteablePacket.class); 74 | registry.register(PlayerListHeaderFooter.class, NoopWriteablePacket.class); 75 | registry.register(Commands.class, NoopWriteablePacket.class); 76 | registry.register(ViewDistance.class, NoopWriteablePacket.class); 77 | } 78 | 79 | public ToClientPacketEncoder(Connection connection, NetworkDataCache cache) { 80 | super(connection, cache); 81 | } 82 | 83 | } 84 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_5/ToServerPacketEncoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_5; 2 | 3 | import net.md_5.bungee.protocol.packet.Chat; 4 | import net.md_5.bungee.protocol.packet.ClientSettings; 5 | import net.md_5.bungee.protocol.packet.ClientStatus; 6 | import net.md_5.bungee.protocol.packet.Handshake; 7 | import net.md_5.bungee.protocol.packet.KeepAlive; 8 | import net.md_5.bungee.protocol.packet.LoginRequest; 9 | import net.md_5.bungee.protocol.packet.PluginMessage; 10 | import protocolsupport.api.Connection; 11 | import protocolsupport.protocol.packet.middleimpl.writeable.handshake.v_4_5_6.LoginRequestServerHandshakePacket; 12 | import protocolsupport.protocol.packet.middleimpl.writeable.handshake.v_4_5_6_pe.HandshakeCachePacket; 13 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ClientCommandPacket; 14 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ClientSettingsPacket; 15 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.KeepAlivePacket; 16 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.PluginMessagePacket; 17 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ToServerChatPacket; 18 | import protocolsupport.protocol.pipeline.version.AbstractPacketEncoder; 19 | import protocolsupport.protocol.storage.NetworkDataCache; 20 | 21 | public class ToServerPacketEncoder extends AbstractPacketEncoder { 22 | 23 | { 24 | registry.register(Handshake.class, HandshakeCachePacket.class); 25 | registry.register(LoginRequest.class, LoginRequestServerHandshakePacket.class); 26 | registry.register(KeepAlive.class, KeepAlivePacket.class); 27 | registry.register(Chat.class, ToServerChatPacket.class); 28 | registry.register(PluginMessage.class, PluginMessagePacket.class); 29 | registry.register(ClientStatus.class, ClientCommandPacket.class); 30 | registry.register(ClientSettings.class, ClientSettingsPacket.class); 31 | } 32 | 33 | public ToServerPacketEncoder(Connection connection, NetworkDataCache cache) { 34 | super(connection, cache); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_6/FromServerPacketDecoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_6; 2 | 3 | import net.md_5.bungee.protocol.Protocol; 4 | import protocolsupport.api.Connection; 5 | import protocolsupport.protocol.packet.id.LegacyPacketId; 6 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.FromServerChatPacket; 7 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.KeepAlivePacket; 8 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.KickPacket; 9 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.PlayerListItemPacket; 10 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.PluginMessagePacket; 11 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.RespawnPacket; 12 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.StartGamePacket; 13 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_4_5_6.TabCompleteResponsePacket; 14 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6.ScoreboardDisplayPacket; 15 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6.ScoreboardObjectivePacket; 16 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6.ScoreboardScorePacket; 17 | import protocolsupport.protocol.packet.middleimpl.readable.play.v_5_6.ScoreboardTeamPacket; 18 | import protocolsupport.protocol.pipeline.version.LegacyAbstractFromServerPacketDecoder; 19 | import protocolsupport.protocol.storage.NetworkDataCache; 20 | 21 | public class FromServerPacketDecoder extends LegacyAbstractFromServerPacketDecoder { 22 | 23 | { 24 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_KEEP_ALIVE, KeepAlivePacket.class); 25 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_KICK, KickPacket.class); 26 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_START_GAME, StartGamePacket.class); 27 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_CHAT, FromServerChatPacket.class); 28 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_RESPAWN, RespawnPacket.class); 29 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_PLAYER_LIST, PlayerListItemPacket.class); 30 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_TAB_COMPLETE, TabCompleteResponsePacket.class); 31 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_SCOREBOARD_OBJECTIVE, ScoreboardObjectivePacket.class); 32 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_SCOREBOARD_SCORE, ScoreboardScorePacket.class); 33 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_SCOREBOARD_DISPLAY_SLOT, ScoreboardDisplayPacket.class); 34 | registry.register(Protocol.GAME, LegacyPacketId.Clientbound.PLAY_SCOREBOARD_TEAM, ScoreboardTeamPacket.class); 35 | registry.register(Protocol.GAME, LegacyPacketId.Dualbound.PLAY_PLUGIN_MESSAGE, PluginMessagePacket.class); 36 | } 37 | 38 | public FromServerPacketDecoder(Connection connection, NetworkDataCache cache) { 39 | super(connection, cache); 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_6/PipeLineBuilder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_6; 2 | 3 | import io.netty.channel.Channel; 4 | import io.netty.channel.ChannelPipeline; 5 | import net.md_5.bungee.netty.PipelineUtils; 6 | import protocolsupport.api.Connection; 7 | import protocolsupport.protocol.pipeline.IPipeLineBuilder; 8 | import protocolsupport.protocol.pipeline.common.EncapsulatedHandshakeSender; 9 | import protocolsupport.protocol.pipeline.common.NoOpFrameDecoder; 10 | import protocolsupport.protocol.pipeline.common.NoOpFrameEncoder; 11 | import protocolsupport.protocol.storage.NetworkDataCache; 12 | 13 | public class PipeLineBuilder extends IPipeLineBuilder { 14 | 15 | @Override 16 | public void buildBungeeClientCodec(Channel channel, Connection connection) { 17 | ChannelPipeline pipeline = channel.pipeline(); 18 | NetworkDataCache cache = new NetworkDataCache(); 19 | cache.storeIn(connection); 20 | pipeline.replace(PipelineUtils.PACKET_DECODER, PipelineUtils.PACKET_DECODER, new FromClientPacketDecoder(connection, cache)); 21 | pipeline.replace(PipelineUtils.PACKET_ENCODER, PipelineUtils.PACKET_ENCODER, new ToClientPacketEncoder(connection, cache)); 22 | } 23 | 24 | @Override 25 | public void buildBungeeClientPipeLine(Channel channel, Connection connection) { 26 | ChannelPipeline pipeline = channel.pipeline(); 27 | pipeline.replace(PipelineUtils.FRAME_DECODER, PipelineUtils.FRAME_DECODER, new NoOpFrameDecoder()); 28 | pipeline.replace(PipelineUtils.FRAME_PREPENDER, PipelineUtils.FRAME_PREPENDER, new NoOpFrameEncoder()); 29 | } 30 | 31 | @Override 32 | public void buildBungeeServer(Channel channel, Connection connection) { 33 | ChannelPipeline pipeline = channel.pipeline(); 34 | pipeline.addFirst(new EncapsulatedHandshakeSender(null, false)); 35 | NetworkDataCache cache = NetworkDataCache.getFrom(connection); 36 | pipeline.replace(PipelineUtils.PACKET_DECODER, PipelineUtils.PACKET_DECODER, new FromServerPacketDecoder(connection, cache)); 37 | pipeline.replace(PipelineUtils.PACKET_ENCODER, PipelineUtils.PACKET_ENCODER, new ToServerPacketEncoder(connection, cache)); 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_6/ToClientPacketEncoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_6; 2 | 3 | import net.md_5.bungee.protocol.packet.BossBar; 4 | import net.md_5.bungee.protocol.packet.Chat; 5 | import net.md_5.bungee.protocol.packet.Commands; 6 | import net.md_5.bungee.protocol.packet.EncryptionRequest; 7 | import net.md_5.bungee.protocol.packet.EntityEffect; 8 | import net.md_5.bungee.protocol.packet.EntityRemoveEffect; 9 | import net.md_5.bungee.protocol.packet.EntityStatus; 10 | import net.md_5.bungee.protocol.packet.GameState; 11 | import net.md_5.bungee.protocol.packet.KeepAlive; 12 | import net.md_5.bungee.protocol.packet.Kick; 13 | import net.md_5.bungee.protocol.packet.Login; 14 | import net.md_5.bungee.protocol.packet.LoginSuccess; 15 | import net.md_5.bungee.protocol.packet.PlayerListHeaderFooter; 16 | import net.md_5.bungee.protocol.packet.PlayerListItem; 17 | import net.md_5.bungee.protocol.packet.PluginMessage; 18 | import net.md_5.bungee.protocol.packet.Respawn; 19 | import net.md_5.bungee.protocol.packet.ScoreboardDisplay; 20 | import net.md_5.bungee.protocol.packet.ScoreboardObjective; 21 | import net.md_5.bungee.protocol.packet.ScoreboardScore; 22 | import net.md_5.bungee.protocol.packet.StatusResponse; 23 | import net.md_5.bungee.protocol.packet.TabCompleteResponse; 24 | import net.md_5.bungee.protocol.packet.Team; 25 | import net.md_5.bungee.protocol.packet.Title; 26 | import net.md_5.bungee.protocol.packet.ViewDistance; 27 | import protocolsupport.api.Connection; 28 | import protocolsupport.protocol.packet.middleimpl.writeable.NoopWriteablePacket; 29 | import protocolsupport.protocol.packet.middleimpl.writeable.login.v_4_5_6.EncryptionRequestPacket; 30 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.EntityEffectAddPacket; 31 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.EntityEffectRemovePacket; 32 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.EntityStatusPacket; 33 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.GameStatePacket; 34 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.KeepAlivePacket; 35 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.KickPacket; 36 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.PlayerListItemPacket; 37 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.PluginMessagePacket; 38 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.RespawnPacket; 39 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.StartGamePacket; 40 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.TabCompleteResponsePacket; 41 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ToClientChatPacket; 42 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6.ScoreboardDisplayPacket; 43 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6.ScoreboardObjectivePacket; 44 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6.ScoreboardScorePacket; 45 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_5_6.ScoreboardTeamPacket; 46 | import protocolsupport.protocol.packet.middleimpl.writeable.status.v_4_5_6.StatusResponsePacket; 47 | import protocolsupport.protocol.pipeline.version.AbstractPacketEncoder; 48 | import protocolsupport.protocol.storage.NetworkDataCache; 49 | 50 | public class ToClientPacketEncoder extends AbstractPacketEncoder { 51 | 52 | { 53 | registry.register(EncryptionRequest.class, EncryptionRequestPacket.class); 54 | registry.register(LoginSuccess.class, NoopWriteablePacket.class); 55 | registry.register(Login.class, StartGamePacket.class); 56 | registry.register(StatusResponse.class, StatusResponsePacket.class); 57 | registry.register(Kick.class, KickPacket.class); 58 | registry.register(KeepAlive.class, KeepAlivePacket.class); 59 | registry.register(PluginMessage.class, PluginMessagePacket.class); 60 | registry.register(Respawn.class, RespawnPacket.class); 61 | registry.register(Chat.class, ToClientChatPacket.class); 62 | registry.register(ScoreboardDisplay.class, ScoreboardDisplayPacket.class); 63 | registry.register(ScoreboardObjective.class, ScoreboardObjectivePacket.class); 64 | registry.register(ScoreboardScore.class, ScoreboardScorePacket.class); 65 | registry.register(Team.class, ScoreboardTeamPacket.class); 66 | registry.register(PlayerListItem.class, PlayerListItemPacket.class); 67 | registry.register(TabCompleteResponse.class, TabCompleteResponsePacket.class); 68 | registry.register(EntityStatus.class, EntityStatusPacket.class); 69 | registry.register(EntityEffect.class, EntityEffectAddPacket.class); 70 | registry.register(EntityRemoveEffect.class, EntityEffectRemovePacket.class); 71 | registry.register(GameState.class, GameStatePacket.class); 72 | registry.register(BossBar.class, NoopWriteablePacket.class); 73 | registry.register(Title.class, NoopWriteablePacket.class); 74 | registry.register(PlayerListHeaderFooter.class, NoopWriteablePacket.class); 75 | registry.register(Commands.class, NoopWriteablePacket.class); 76 | registry.register(ViewDistance.class, NoopWriteablePacket.class); 77 | } 78 | 79 | public ToClientPacketEncoder(Connection connection, NetworkDataCache cache) { 80 | super(connection, cache); 81 | } 82 | 83 | } 84 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/pipeline/version/v_1_6/ToServerPacketEncoder.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.pipeline.version.v_1_6; 2 | 3 | import net.md_5.bungee.protocol.packet.Chat; 4 | import net.md_5.bungee.protocol.packet.ClientSettings; 5 | import net.md_5.bungee.protocol.packet.ClientStatus; 6 | import net.md_5.bungee.protocol.packet.Handshake; 7 | import net.md_5.bungee.protocol.packet.KeepAlive; 8 | import net.md_5.bungee.protocol.packet.LoginRequest; 9 | import net.md_5.bungee.protocol.packet.PluginMessage; 10 | import protocolsupport.api.Connection; 11 | import protocolsupport.protocol.packet.middleimpl.writeable.handshake.v_4_5_6.LoginRequestServerHandshakePacket; 12 | import protocolsupport.protocol.packet.middleimpl.writeable.handshake.v_4_5_6_pe.HandshakeCachePacket; 13 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ClientCommandPacket; 14 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ClientSettingsPacket; 15 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.KeepAlivePacket; 16 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.PluginMessagePacket; 17 | import protocolsupport.protocol.packet.middleimpl.writeable.play.v_4_5_6.ToServerChatPacket; 18 | import protocolsupport.protocol.pipeline.version.AbstractPacketEncoder; 19 | import protocolsupport.protocol.storage.NetworkDataCache; 20 | 21 | public class ToServerPacketEncoder extends AbstractPacketEncoder { 22 | 23 | { 24 | registry.register(Handshake.class, HandshakeCachePacket.class); 25 | registry.register(LoginRequest.class, LoginRequestServerHandshakePacket.class); 26 | registry.register(KeepAlive.class, KeepAlivePacket.class); 27 | registry.register(Chat.class, ToServerChatPacket.class); 28 | registry.register(PluginMessage.class, PluginMessagePacket.class); 29 | registry.register(ClientStatus.class, ClientCommandPacket.class); 30 | registry.register(ClientSettings.class, ClientSettingsPacket.class); 31 | } 32 | 33 | public ToServerPacketEncoder(Connection connection, NetworkDataCache cache) { 34 | super(connection, cache); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/serializer/ArraySerializer.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.serializer; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import protocolsupport.utils.Utils; 5 | 6 | public class ArraySerializer { 7 | 8 | public static byte[] readShortLengthByteArray(ByteBuf to) { 9 | return Utils.readBytes(to, to.readShort()); 10 | } 11 | 12 | public static void writeShortLengthByteArray(ByteBuf to, byte[] array) { 13 | to.writeShort(array.length); 14 | to.writeBytes(array); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/serializer/MiscSerializer.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.serializer; 2 | 3 | import java.text.MessageFormat; 4 | import java.util.UUID; 5 | 6 | import io.netty.buffer.ByteBuf; 7 | import io.netty.handler.codec.DecoderException; 8 | 9 | public class MiscSerializer { 10 | 11 | public static UUID readUUID(ByteBuf from) { 12 | return new UUID(from.readLong(), from.readLong()); 13 | } 14 | 15 | public static void writeUUID(ByteBuf to, UUID uuid) { 16 | to.writeLong(uuid.getMostSignificantBits()); 17 | to.writeLong(uuid.getLeastSignificantBits()); 18 | } 19 | 20 | public static byte[] readAllBytes(ByteBuf buf) { 21 | return MiscSerializer.readBytes(buf, buf.readableBytes()); 22 | } 23 | 24 | public static byte[] readBytes(ByteBuf buf, int length) { 25 | byte[] result = new byte[length]; 26 | buf.readBytes(result); 27 | return result; 28 | } 29 | 30 | protected static void checkLimit(int length, int limit) { 31 | if (length > limit) { 32 | throw new DecoderException(MessageFormat.format("Size {0} is bigger than allowed {1}", length, limit)); 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/serializer/StringSerializer.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.serializer; 2 | 3 | import java.nio.charset.StandardCharsets; 4 | 5 | import io.netty.buffer.ByteBuf; 6 | import protocolsupport.utils.Utils; 7 | 8 | public class StringSerializer { 9 | 10 | public static String readVarIntUTF8String(ByteBuf from) { 11 | return new String(MiscSerializer.readBytes(from, VarNumberSerializer.readVarInt(from)), StandardCharsets.UTF_8); 12 | } 13 | 14 | public static void writeVarIntUTF8String(ByteBuf to, String string) { 15 | byte[] bytes = string.getBytes(StandardCharsets.UTF_8); 16 | VarNumberSerializer.writeVarInt(to, bytes.length); 17 | to.writeBytes(bytes); 18 | } 19 | 20 | public static String readShortUTF16BEString(ByteBuf buf) { 21 | return new String(Utils.readBytes(buf, buf.readUnsignedShort() * 2), StandardCharsets.UTF_16BE); 22 | } 23 | 24 | public static void writeShortUTF16BEString(ByteBuf buf, String string) { 25 | buf.writeShort(string.length()); 26 | buf.writeBytes(string.getBytes(StandardCharsets.UTF_16BE)); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/serializer/TypeCopier.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.serializer; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | 5 | public class TypeCopier { 6 | 7 | public static void copyLegacyItemStack(ByteBuf from, ByteBuf to) { 8 | int itemId = from.readShort(); 9 | to.writeShort(itemId); 10 | if (itemId != -1) { 11 | to.writeByte(from.readByte()); 12 | to.writeShort(from.readShort()); 13 | int nbtlength = from.readShort(); 14 | to.writeShort(nbtlength); 15 | if (nbtlength != -1) { 16 | copyBytes(from, to, nbtlength); 17 | } 18 | } 19 | } 20 | 21 | public static void copyShortUTF16BEString(ByteBuf from, ByteBuf to) { 22 | int length = from.readUnsignedShort(); 23 | to.writeShort(length); 24 | copyBytes(from, to, length * 2); 25 | } 26 | 27 | public static void copyBytes(ByteBuf from, ByteBuf to, int length) { 28 | to.writeBytes(MiscSerializer.readBytes(from, length)); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/serializer/VarNumberSerializer.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.serializer; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import io.netty.handler.codec.DecoderException; 5 | 6 | public class VarNumberSerializer { 7 | 8 | public static final int MAX_LENGTH = 5; 9 | 10 | public static int readVarInt(ByteBuf from) { 11 | int value = 0; 12 | int length = 0; 13 | byte part; 14 | do { 15 | part = from.readByte(); 16 | value |= (part & 0x7F) << (length++ * 7); 17 | if (length > 5) { 18 | throw new DecoderException("VarInt too big"); 19 | } 20 | } while (part < 0); 21 | return value; 22 | } 23 | 24 | public static void writeVarInt(ByteBuf to, int i) { 25 | while ((i & 0xFFFFFF80) != 0x0) { 26 | to.writeByte(i | 0x80); 27 | i >>>= 7; 28 | } 29 | to.writeByte(i); 30 | } 31 | 32 | public static void writeFixedSizeVarInt(ByteBuf to, int i) { 33 | int writerIndex = to.writerIndex(); 34 | while ((i & 0xFFFFFF80) != 0x0) { 35 | to.writeByte(i | 0x80); 36 | i >>>= 7; 37 | } 38 | int paddingBytes = MAX_LENGTH - (to.writerIndex() - writerIndex) - 1; 39 | if (paddingBytes == 0) { 40 | to.writeByte(i); 41 | } else { 42 | to.writeByte(i | 0x80); 43 | while (--paddingBytes > 0) { 44 | to.writeByte(0x80); 45 | } 46 | to.writeByte(0); 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/storage/NetworkDataCache.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.storage; 2 | 3 | import net.md_5.bungee.protocol.packet.Handshake; 4 | import protocolsupport.api.Connection; 5 | 6 | public class NetworkDataCache { 7 | 8 | private static final String METADATA_KEY = "__PSB_NDC"; 9 | 10 | public static NetworkDataCache getFrom(Connection connection) { 11 | return (NetworkDataCache) connection.getMetadata(METADATA_KEY); 12 | } 13 | 14 | public void storeIn(Connection connection) { 15 | connection.addMetadata(METADATA_KEY, this); 16 | } 17 | 18 | private Handshake serverHandshake; 19 | 20 | public void setServerHandshake(Handshake serverHandshake) { 21 | this.serverHandshake = serverHandshake; 22 | } 23 | 24 | public Handshake getServerHandshake() { 25 | return serverHandshake; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/storage/ProtocolStorage.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.storage; 2 | 3 | import java.net.SocketAddress; 4 | import java.util.Collection; 5 | import java.util.Collections; 6 | import java.util.Map; 7 | import java.util.Set; 8 | import java.util.concurrent.ConcurrentHashMap; 9 | import java.util.stream.Collectors; 10 | 11 | import protocolsupport.protocol.ConnectionImpl; 12 | 13 | public class ProtocolStorage { 14 | 15 | private static final Map primaryStorage = new ConcurrentHashMap<>(1000); 16 | private static final Map secondayStorage = new ConcurrentHashMap<>(2000); 17 | 18 | public static final void addConnection(SocketAddress address, ConnectionImpl connection) { 19 | primaryStorage.put(address, new Data(connection)); 20 | secondayStorage.put(address, connection); 21 | } 22 | 23 | public static final void addAddress(SocketAddress primary, SocketAddress additional) { 24 | Data dataentry = primaryStorage.get(primary); 25 | if (dataentry != null) { 26 | dataentry.addresses.add(additional); 27 | secondayStorage.put(additional, dataentry.connection); 28 | } 29 | } 30 | 31 | public static ConnectionImpl getConnection(SocketAddress address) { 32 | return secondayStorage.get(address); 33 | } 34 | 35 | public static ConnectionImpl removeConnection(SocketAddress address) { 36 | Data dataentry = primaryStorage.remove(address); 37 | for (SocketAddress aaddr : dataentry.addresses) { 38 | secondayStorage.remove(aaddr, dataentry.connection); 39 | } 40 | secondayStorage.remove(address, dataentry.connection); 41 | return dataentry.connection; 42 | } 43 | 44 | public static Collection getConnections() { 45 | return primaryStorage.values().stream().map(data -> data.connection).collect(Collectors.toList()); 46 | } 47 | 48 | private static class Data { 49 | private final ConnectionImpl connection; 50 | private final Set addresses = Collections.newSetFromMap(new ConcurrentHashMap<>()); 51 | public Data(ConnectionImpl connection) { 52 | this.connection = connection; 53 | } 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/typeremapper/LegacyDimension.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.typeremapper; 2 | 3 | import java.text.MessageFormat; 4 | 5 | public class LegacyDimension { 6 | 7 | public static int get(Object dimension) { 8 | if (dimension instanceof String) { 9 | return get(dimension); 10 | } else if (dimension instanceof Number) { 11 | return ((Number) dimension).intValue(); 12 | } else { 13 | throw new IllegalArgumentException("Unknown dimension object " + dimension + " class " + dimension.getClass()); 14 | } 15 | } 16 | 17 | public static int getId(String dimension) { 18 | switch (dimension) { 19 | case "overworld": 20 | case "minecraft:overworld": { 21 | return 0; 22 | } 23 | case "the_nether": 24 | case "minecraft:the_nether": { 25 | return -1; 26 | } 27 | case "the_end": 28 | case "minecraft:the_end": { 29 | return 1; 30 | } 31 | default: { 32 | throw new IllegalArgumentException(MessageFormat.format("Unknown dimension {0}", dimension)); 33 | } 34 | } 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/utils/EncapsulatedProtocolInfo.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.utils; 2 | 3 | import java.net.InetSocketAddress; 4 | 5 | public class EncapsulatedProtocolInfo { 6 | 7 | private final boolean hasCompression; 8 | private final InetSocketAddress address; 9 | 10 | public EncapsulatedProtocolInfo(InetSocketAddress address, boolean hasCompression) { 11 | this.address = address; 12 | this.hasCompression = hasCompression; 13 | } 14 | 15 | public InetSocketAddress getAddress() { 16 | return address; 17 | } 18 | 19 | public boolean hasCompression() { 20 | return hasCompression; 21 | } 22 | 23 | } -------------------------------------------------------------------------------- /src/protocolsupport/protocol/utils/EncapsulatedProtocolUtils.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.utils; 2 | 3 | import java.net.InetAddress; 4 | import java.net.InetSocketAddress; 5 | import java.net.UnknownHostException; 6 | import java.text.MessageFormat; 7 | 8 | import io.netty.buffer.ByteBuf; 9 | import io.netty.handler.codec.DecoderException; 10 | import protocolsupport.protocol.serializer.MiscSerializer; 11 | import protocolsupport.protocol.serializer.VarNumberSerializer; 12 | 13 | public class EncapsulatedProtocolUtils { 14 | 15 | public static final int FIRST_BYTE = 0; 16 | 17 | private static final int CURRENT_VERSION = 1; 18 | 19 | public static EncapsulatedProtocolInfo readInfo(ByteBuf from) { 20 | int encapVersion = VarNumberSerializer.readVarInt(from); 21 | if (encapVersion > CURRENT_VERSION) { 22 | throw new DecoderException(MessageFormat.format("Unsupported encapsulation protocol verrsion {}", encapVersion)); 23 | } 24 | InetSocketAddress remoteaddress = null; 25 | if (from.readBoolean()) { 26 | try { 27 | InetAddress address = InetAddress.getByAddress(MiscSerializer.readBytes(from, VarNumberSerializer.readVarInt(from))); 28 | remoteaddress = new InetSocketAddress(address, VarNumberSerializer.readVarInt(from)); 29 | } catch (UnknownHostException e) { 30 | throw new DecoderException("Invalid ip address"); 31 | } 32 | } 33 | boolean hasCompression = from.readBoolean(); 34 | if (encapVersion == 0) { 35 | VarNumberSerializer.readVarInt(from); 36 | VarNumberSerializer.readVarInt(from); 37 | } 38 | return new EncapsulatedProtocolInfo(remoteaddress, hasCompression); 39 | } 40 | 41 | public static void writeInfo(ByteBuf to, EncapsulatedProtocolInfo info) { 42 | VarNumberSerializer.writeVarInt(to, CURRENT_VERSION); 43 | if (info.getAddress() != null) { 44 | to.writeBoolean(true); 45 | byte[] addr = info.getAddress().getAddress().getAddress(); 46 | VarNumberSerializer.writeVarInt(to, addr.length); 47 | to.writeBytes(addr); 48 | VarNumberSerializer.writeVarInt(to, info.getAddress().getPort()); 49 | } else { 50 | to.writeBoolean(false); 51 | } 52 | to.writeBoolean(info.hasCompression()); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/utils/GameProfile.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.utils; 2 | 3 | import java.util.Arrays; 4 | import java.util.HashSet; 5 | import java.util.Map; 6 | import java.util.Set; 7 | import java.util.UUID; 8 | 9 | import protocolsupport.api.utils.Profile; 10 | import protocolsupport.api.utils.ProfileProperty; 11 | import protocolsupport.utils.Utils; 12 | 13 | public class GameProfile extends Profile { 14 | 15 | public GameProfile() { 16 | } 17 | 18 | public GameProfile(UUID uuid, String name, ProfileProperty... properties) { 19 | this.uuid = uuid; 20 | this.name = name; 21 | Arrays.stream(properties).forEach(this::addProperty); 22 | } 23 | 24 | public void setOnlineMode(boolean onlineMode) { 25 | this.onlineMode = onlineMode; 26 | } 27 | 28 | public void setOriginalName(String name) { 29 | this.originalname = name; 30 | this.name = name; 31 | } 32 | 33 | public void setName(String name) { 34 | this.name = name; 35 | } 36 | 37 | public void setOriginalUUID(UUID uuid) { 38 | this.originaluuid = uuid; 39 | this.uuid = uuid; 40 | } 41 | 42 | public void setUUID(UUID uuid) { 43 | this.uuid = uuid; 44 | } 45 | 46 | public Map> getProperties() { 47 | return properties; 48 | } 49 | 50 | public void setProperties(Map> propertiesMap) { 51 | properties.clear(); 52 | properties.putAll(propertiesMap); 53 | } 54 | 55 | public void clearProperties() { 56 | properties.clear(); 57 | } 58 | 59 | public void addProperty(ProfileProperty profileProperty) { 60 | properties.computeIfAbsent(profileProperty.getName(), k -> new HashSet<>()).add(profileProperty); 61 | } 62 | 63 | @Override 64 | public String toString() { 65 | return Utils.toStringAllFields(this); 66 | } 67 | 68 | } 69 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/utils/ProtocolVersionsHelper.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.utils; 2 | 3 | import java.util.Arrays; 4 | 5 | import gnu.trove.map.hash.TIntObjectHashMap; 6 | import protocolsupport.api.ProtocolType; 7 | import protocolsupport.api.ProtocolVersion; 8 | 9 | public class ProtocolVersionsHelper { 10 | 11 | private static final TIntObjectHashMap byOldProtocolId = new TIntObjectHashMap<>(); 12 | private static final TIntObjectHashMap byNewProtocolId = new TIntObjectHashMap<>(); 13 | 14 | public static ProtocolVersion getOldProtocolVersion(int protocolid) { 15 | ProtocolVersion version = byOldProtocolId.get(protocolid); 16 | return version != null ? version : ProtocolVersion.MINECRAFT_LEGACY; 17 | } 18 | 19 | public static ProtocolVersion getNewProtocolVersion(int protocolid) { 20 | ProtocolVersion version = byNewProtocolId.get(protocolid); 21 | return version != null ? version : ProtocolVersion.MINECRAFT_FUTURE; 22 | } 23 | 24 | public static final ProtocolVersion LATEST_PC = ProtocolVersion.getLatest(ProtocolType.PC); 25 | 26 | static { 27 | Arrays.stream(ProtocolVersion.getAllBeforeI(ProtocolVersion.MINECRAFT_1_6_4)).forEach(version -> byOldProtocolId.put(version.getId(), version)); 28 | Arrays.stream(ProtocolVersion.getAllAfterI(ProtocolVersion.MINECRAFT_1_7_5)).forEach(version -> byNewProtocolId.put(version.getId(), version)); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/utils/registry/ClassMapMiddleTransformerRegistry.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.utils.registry; 2 | 3 | import java.util.NoSuchElementException; 4 | 5 | import protocolsupport.utils.ClassMap; 6 | import protocolsupport.utils.Utils.LazyNewInstance; 7 | 8 | public class ClassMapMiddleTransformerRegistry { 9 | 10 | private final ClassMap> registry = new ClassMap<>(); 11 | private InitCallBack callback; 12 | 13 | public void register(Class clazz, Class packetTransformer) { 14 | registry.register(clazz, new LazyNewInstance<>(packetTransformer)); 15 | } 16 | 17 | public void setCallBack(InitCallBack callback) { 18 | this.callback = callback; 19 | } 20 | 21 | public R getTransformer(Class clazz) throws InstantiationException, IllegalAccessException { 22 | LazyNewInstance transformer = registry.get(clazz); 23 | if (transformer == null) { 24 | throw new NoSuchElementException("No transformer found for packet class " + clazz); 25 | } 26 | R object = transformer.getInstance(); 27 | if (callback != null) { 28 | callback.onInit(object); 29 | } 30 | return object; 31 | } 32 | 33 | @FunctionalInterface 34 | public static interface InitCallBack { 35 | public void onInit(R object); 36 | } 37 | 38 | } 39 | -------------------------------------------------------------------------------- /src/protocolsupport/protocol/utils/registry/PacketIdMiddleTransformerRegistry.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.protocol.utils.registry; 2 | 3 | import java.util.NoSuchElementException; 4 | 5 | import net.md_5.bungee.protocol.Protocol; 6 | import protocolsupport.utils.Utils.LazyNewInstance; 7 | 8 | @SuppressWarnings("unchecked") 9 | public class PacketIdMiddleTransformerRegistry { 10 | 11 | private static final int listenerStateLength = Protocol.values().length; 12 | 13 | private final LazyNewInstance[] registry = new LazyNewInstance[listenerStateLength * 256]; 14 | private InitCallBack callback; 15 | 16 | public void register(Protocol state, int packetId, Class packetTransformer) { 17 | registry[toKey(state, packetId)] = new LazyNewInstance<>(packetTransformer); 18 | } 19 | 20 | public void setCallBack(InitCallBack callback) { 21 | this.callback = callback; 22 | } 23 | 24 | public T getTransformer(Protocol state, int packetId, boolean throwOnNull) throws InstantiationException, IllegalAccessException { 25 | LazyNewInstance transformer = registry[toKey(state, packetId)]; 26 | if (transformer == null) { 27 | if (throwOnNull) { 28 | throw new NoSuchElementException("No transformer found for state " + state + " and packet id " + packetId); 29 | } else { 30 | return null; 31 | } 32 | } 33 | T object = transformer.getInstance(); 34 | if (callback != null) { 35 | callback.onInit(object); 36 | } 37 | return object; 38 | } 39 | 40 | static int toKey(Protocol protocol, int packetId) { 41 | return (protocol.ordinal() << 8) | packetId; 42 | } 43 | 44 | @FunctionalInterface 45 | public static interface InitCallBack { 46 | public void onInit(T object); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /src/protocolsupport/utils/ClassMap.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.utils; 2 | 3 | import java.util.LinkedHashMap; 4 | import java.util.Map.Entry; 5 | 6 | public class ClassMap { 7 | 8 | private final LinkedHashMap, T> map = new LinkedHashMap<>(); 9 | 10 | public void register(Class clazz, T t) { 11 | map.put(clazz, t); 12 | } 13 | 14 | public T get(Class clazz) { 15 | T t = map.get(clazz); 16 | if (t != null) { 17 | return t; 18 | } 19 | for (Entry, T> entry : map.entrySet()) { 20 | if (entry.getKey().isAssignableFrom(clazz)) { 21 | map.put(clazz, entry.getValue()); 22 | return entry.getValue(); 23 | } 24 | } 25 | return null; 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /src/protocolsupport/utils/JsonUtils.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.utils; 2 | 3 | import com.google.gson.JsonArray; 4 | import com.google.gson.JsonElement; 5 | import com.google.gson.JsonObject; 6 | import com.google.gson.JsonPrimitive; 7 | import com.google.gson.JsonSyntaxException; 8 | 9 | public class JsonUtils { 10 | 11 | public static void setIfNotNull(JsonObject jsonElement, String name, Boolean value) { 12 | if (value != null) { 13 | jsonElement.addProperty(name, value); 14 | } 15 | } 16 | 17 | public static boolean hasObject(JsonObject jsonObject, String name) { 18 | return (jsonObject != null) && (jsonObject.get(name) != null); 19 | } 20 | 21 | public static boolean isJsonArray(JsonObject jsonObject, String name) { 22 | return hasObject(jsonObject, name) && jsonObject.get(name).isJsonArray(); 23 | } 24 | 25 | public static JsonArray getAsJsonArray(JsonElement jsonElement, String name) { 26 | if (jsonElement.isJsonArray()) { 27 | return jsonElement.getAsJsonArray(); 28 | } 29 | throw new JsonSyntaxException("Expected " + name + " to be a JsonArray, was " + toString(jsonElement)); 30 | } 31 | 32 | public static JsonArray getJsonArray(JsonObject jsonObject, String name) { 33 | if (jsonObject.has(name)) { 34 | return getAsJsonArray(jsonObject.get(name), name); 35 | } 36 | throw new JsonSyntaxException("Missing " + name + ", expected to find a JsonArray"); 37 | } 38 | 39 | public static String getAsString(JsonElement jsonElement, String name) { 40 | if (jsonElement.isJsonPrimitive()) { 41 | return jsonElement.getAsString(); 42 | } 43 | throw new JsonSyntaxException("Expected " + name + " to be a string, was " + toString(jsonElement)); 44 | } 45 | 46 | public static String getString(JsonObject jsonObject, String name) { 47 | if (jsonObject.has(name)) { 48 | return getAsString(jsonObject.get(name), name); 49 | } 50 | throw new JsonSyntaxException("Missing " + name + ", expected to find a string"); 51 | } 52 | 53 | public static int getAsInt(JsonElement jsonElement, String s) { 54 | if (jsonElement.isJsonPrimitive() && jsonElement.getAsJsonPrimitive().isNumber()) { 55 | return jsonElement.getAsInt(); 56 | } 57 | throw new JsonSyntaxException("Expected " + s + " to be a Int, was " + toString(jsonElement)); 58 | } 59 | 60 | public static int getInt(JsonObject jsonObject, String s) { 61 | if (jsonObject.has(s)) { 62 | return getAsInt(jsonObject.get(s), s); 63 | } 64 | throw new JsonSyntaxException("Missing " + s + ", expected to find a Int"); 65 | } 66 | 67 | public static JsonObject getAsJsonObject(JsonElement jsonElement, String name) { 68 | if (jsonElement.isJsonObject()) { 69 | return jsonElement.getAsJsonObject(); 70 | } 71 | throw new JsonSyntaxException("Expected " + name + " to be a JsonObject, was " + toString(jsonElement)); 72 | } 73 | 74 | public static JsonObject getJsonObject(JsonObject jsonObject, String name) { 75 | if (jsonObject.has(name)) { 76 | return getAsJsonObject(jsonObject.get(name), name); 77 | } 78 | throw new JsonSyntaxException("Missing " + name + ", expected to find an Object"); 79 | } 80 | 81 | private static String toString(JsonElement jsonElement) { 82 | String abbreviateMiddle = String.valueOf(jsonElement); 83 | if (jsonElement == null) { 84 | return "null (missing)"; 85 | } 86 | if (jsonElement.isJsonNull()) { 87 | return "null (json)"; 88 | } 89 | if (jsonElement.isJsonArray()) { 90 | return "an array (" + abbreviateMiddle + ")"; 91 | } 92 | if (jsonElement.isJsonObject()) { 93 | return "an object (" + abbreviateMiddle + ")"; 94 | } 95 | if (jsonElement.isJsonPrimitive()) { 96 | JsonPrimitive asJsonPrimitive = jsonElement.getAsJsonPrimitive(); 97 | if (asJsonPrimitive.isNumber()) { 98 | return "a number (" + abbreviateMiddle + ")"; 99 | } 100 | if (asJsonPrimitive.isBoolean()) { 101 | return "a boolean (" + abbreviateMiddle + ")"; 102 | } 103 | } 104 | return abbreviateMiddle; 105 | } 106 | 107 | } 108 | -------------------------------------------------------------------------------- /src/protocolsupport/utils/PingSerializer.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.utils; 2 | 3 | import java.lang.reflect.Type; 4 | 5 | import com.google.gson.Gson; 6 | import com.google.gson.GsonBuilder; 7 | import com.google.gson.JsonDeserializationContext; 8 | import com.google.gson.JsonDeserializer; 9 | import com.google.gson.JsonElement; 10 | import com.google.gson.JsonObject; 11 | import com.google.gson.JsonParseException; 12 | 13 | import net.md_5.bungee.api.chat.BaseComponent; 14 | import net.md_5.bungee.api.chat.TextComponent; 15 | import net.md_5.bungee.api.chat.TranslatableComponent; 16 | import net.md_5.bungee.chat.ComponentSerializer; 17 | import net.md_5.bungee.chat.TextComponentSerializer; 18 | import net.md_5.bungee.chat.TranslatableComponentSerializer; 19 | 20 | public class PingSerializer { 21 | 22 | private static final Gson gson = new GsonBuilder().registerTypeAdapter(ServerPing.class, new ServerPingDeserializer()).create(); 23 | 24 | private static final Gson chatGson = new GsonBuilder() 25 | .registerTypeAdapter(BaseComponent.class, new ComponentSerializer()) 26 | .registerTypeAdapter(TextComponent.class, new TextComponentSerializer()) 27 | .registerTypeAdapter(TranslatableComponent.class, new TranslatableComponentSerializer()) 28 | .create(); 29 | 30 | public static ServerPing fromJson(String json) { 31 | return gson.fromJson(json, ServerPing.class); 32 | } 33 | 34 | public static final class ServerPingDeserializer implements JsonDeserializer { 35 | @Override 36 | public ServerPing deserialize(JsonElement element, Type type, JsonDeserializationContext ctx) throws JsonParseException { 37 | JsonObject root = element.getAsJsonObject(); 38 | JsonObject version = root.get("version").getAsJsonObject(); 39 | JsonObject players = root.get("players").getAsJsonObject(); 40 | return new ServerPing( 41 | new ServerPingVersion(version.get("name").getAsString()), 42 | new ServerPingPlayers(players.get("online").getAsInt(), players.get("max").getAsInt()), 43 | chatGson.fromJson(root.get("description"), BaseComponent.class) 44 | ); 45 | } 46 | } 47 | 48 | public static final class ServerPing { 49 | protected final ServerPingVersion version; 50 | protected final ServerPingPlayers players; 51 | protected final BaseComponent motd; 52 | public ServerPing(ServerPingVersion version, ServerPingPlayers players, BaseComponent motd) { 53 | this.version = version; 54 | this.players = players; 55 | this.motd = motd; 56 | } 57 | public ServerPingVersion getVersion() { 58 | return version; 59 | } 60 | public ServerPingPlayers getPlayers() { 61 | return players; 62 | } 63 | public BaseComponent getMotd() { 64 | return motd; 65 | } 66 | } 67 | 68 | public static final class ServerPingVersion { 69 | private final String name; 70 | public ServerPingVersion(String name) { 71 | this.name = name; 72 | } 73 | public String getName() { 74 | return name; 75 | } 76 | } 77 | 78 | public static final class ServerPingPlayers { 79 | private final int max; 80 | private final int online; 81 | public ServerPingPlayers(int online, int max) { 82 | this.online = online; 83 | this.max = max; 84 | } 85 | public int getOnlineCount() { 86 | return online; 87 | } 88 | public int getMaxPlayers() { 89 | return max; 90 | } 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /src/protocolsupport/utils/ReflectionUtils.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.utils; 2 | 3 | import java.lang.invoke.MethodHandles; 4 | import java.lang.reflect.AccessibleObject; 5 | import java.lang.reflect.Field; 6 | import java.lang.reflect.Modifier; 7 | 8 | public class ReflectionUtils { 9 | 10 | @SuppressWarnings("unchecked") 11 | public static T getFieldValue(Object target, String name) throws IllegalArgumentException, IllegalAccessException { 12 | Class clazz = target.getClass(); 13 | do { 14 | for (Field field : clazz.getDeclaredFields()) { 15 | if (field.getName().equals(name)) { 16 | return (T) setAccessible(field).get(target); 17 | } 18 | } 19 | } while ((clazz = clazz.getSuperclass()) != null); 20 | return null; 21 | } 22 | 23 | public static void setFieldValue(Object target, String name, Object value) throws IllegalArgumentException, IllegalAccessException { 24 | Class clazz = target.getClass(); 25 | do { 26 | for (Field field : clazz.getDeclaredFields()) { 27 | if (field.getName().equals(name)) { 28 | setAccessible(field).set(target, value); 29 | return; 30 | } 31 | } 32 | } while ((clazz = clazz.getSuperclass()) != null); 33 | } 34 | 35 | public static T setAccessible(T object) { 36 | object.setAccessible(true); 37 | return object; 38 | } 39 | 40 | public static void setStaticFinalField(Class clazz, String fieldname, Object value) { 41 | try { 42 | Field field = setAccessible(clazz.getDeclaredField(fieldname)); 43 | ((MethodHandles.Lookup) setAccessible(MethodHandles.Lookup.class.getDeclaredField("IMPL_LOOKUP")).get(null)) 44 | .findSetter(Field.class, "modifiers", int.class) 45 | .invokeExact(field, field.getModifiers() & ~Modifier.FINAL); 46 | field.set(null, value); 47 | } catch (Throwable e) { 48 | throw new RuntimeException(e); 49 | } 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /src/protocolsupport/utils/Utils.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.utils; 2 | 3 | import java.lang.reflect.Field; 4 | import java.lang.reflect.Modifier; 5 | import java.util.Arrays; 6 | import java.util.Objects; 7 | import java.util.StringJoiner; 8 | import java.util.function.Function; 9 | 10 | import com.google.gson.Gson; 11 | 12 | import io.netty.buffer.ByteBuf; 13 | 14 | public class Utils { 15 | 16 | public static final Gson GSON = new Gson(); 17 | 18 | public static class LazyNewInstance { 19 | private final Class clazz; 20 | public LazyNewInstance(Class clazz) { 21 | this.clazz = clazz; 22 | } 23 | 24 | private T instance; 25 | public T getInstance() throws InstantiationException, IllegalAccessException { 26 | if (instance == null) { 27 | instance = clazz.newInstance(); 28 | } 29 | return instance; 30 | } 31 | } 32 | 33 | public static String toStringAllFields(Object obj) { 34 | StringJoiner joiner = new StringJoiner(", "); 35 | Class clazz = obj.getClass(); 36 | do { 37 | try { 38 | for (Field field : clazz.getDeclaredFields()) { 39 | if (!Modifier.isStatic(field.getModifiers())) { 40 | ReflectionUtils.setAccessible(field); 41 | Object value = field.get(obj); 42 | if ((value == null) || !value.getClass().isArray()) { 43 | joiner.add(field.getName() + ": " + Objects.toString(value)); 44 | } else { 45 | joiner.add(field.getName() + ": " + Arrays.deepToString(new Object[] {value})); 46 | } 47 | } 48 | } 49 | } catch (IllegalAccessException e) { 50 | throw new RuntimeException("Unable to get object fields values", e); 51 | } 52 | } while ((clazz = clazz.getSuperclass()) != null); 53 | return obj.getClass().getName() + "(" + joiner.toString() + ")"; 54 | } 55 | 56 | public static String clampString(String string, int limit) { 57 | return string.substring(0, string.length() > limit ? limit : string.length()); 58 | } 59 | 60 | public static byte[] readBytes(ByteBuf from, int length) { 61 | byte[] data = new byte[length]; 62 | from.readBytes(data, 0, length); 63 | return data; 64 | } 65 | 66 | public static boolean isTrue(Boolean bool) { 67 | return (bool != null) && bool.booleanValue(); 68 | } 69 | 70 | public static T getFromArrayOrNull(T[] array, int index) { 71 | if ((index >= 0) && (index < array.length)) { 72 | return array[index]; 73 | } else { 74 | return null; 75 | } 76 | } 77 | 78 | public static T getJavaPropertyValue(String property, T defaultValue, Function converter) { 79 | return getRawJavaPropertyValue("protocolsupport."+property, defaultValue, converter); 80 | } 81 | 82 | public static T getRawJavaPropertyValue(String property, T defaultValue, Function converter) { 83 | try { 84 | String value = System.getProperty(property); 85 | if (value != null) { 86 | return converter.apply(value); 87 | } 88 | } catch (Throwable t) { 89 | } 90 | return defaultValue; 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /src/protocolsupport/utils/netty/Allocator.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.utils.netty; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import io.netty.buffer.ByteBufAllocator; 5 | import io.netty.buffer.PooledByteBufAllocator; 6 | import io.netty.buffer.UnpooledByteBufAllocator; 7 | import protocolsupport.utils.Utils; 8 | 9 | public class Allocator { 10 | 11 | private static final boolean direct = Utils.getJavaPropertyValue("buffer", true, (t -> { 12 | switch (t.toLowerCase()) { 13 | case "direct": { 14 | return true; 15 | } 16 | case "heap": { 17 | return false; 18 | } 19 | default: { 20 | throw new RuntimeException("Invalid buffer type "+t.toLowerCase()+", should be either heap or direct"); 21 | } 22 | } 23 | })); 24 | private static final ByteBufAllocator allocator = Utils.getJavaPropertyValue("allocator", PooledByteBufAllocator.DEFAULT, (t -> { 25 | switch (t.toLowerCase()) { 26 | case "pooled": { 27 | return PooledByteBufAllocator.DEFAULT; 28 | } 29 | case "unpooled": { 30 | return UnpooledByteBufAllocator.DEFAULT; 31 | } 32 | default: { 33 | throw new IllegalArgumentException("Invalid allocator type "+t.toLowerCase()+", should be either pooled or unpooled"); 34 | } 35 | } 36 | })); 37 | 38 | public static ByteBuf allocateBuffer() { 39 | if (direct) { 40 | return allocator.directBuffer(); 41 | } else { 42 | return allocator.heapBuffer(); 43 | } 44 | } 45 | 46 | public static ByteBuf allocateUnpooledBuffer() { 47 | if (direct) { 48 | return UnpooledByteBufAllocator.DEFAULT.directBuffer(); 49 | } else { 50 | return UnpooledByteBufAllocator.DEFAULT.heapBuffer(); 51 | } 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /src/protocolsupport/utils/netty/ChannelInitializer.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.utils.netty; 2 | 3 | import io.netty.channel.Channel; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.channel.ChannelInboundHandlerAdapter; 6 | import io.netty.channel.ChannelPipeline; 7 | import io.netty.util.internal.logging.InternalLogger; 8 | import io.netty.util.internal.logging.InternalLoggerFactory; 9 | 10 | public abstract class ChannelInitializer extends ChannelInboundHandlerAdapter { 11 | 12 | private static InternalLogger logger = InternalLoggerFactory.getInstance(io.netty.channel.ChannelInitializer.class); 13 | 14 | @Override 15 | public void channelRegistered(ChannelHandlerContext channelHandlerContext) throws Exception { 16 | try { 17 | initChannel(channelHandlerContext.channel()); 18 | } catch (Throwable t) { 19 | exceptionCaught(channelHandlerContext, t); 20 | } finally { 21 | ChannelPipeline pipeline = channelHandlerContext.pipeline(); 22 | if (pipeline.context(this) != null) { 23 | pipeline.remove(this); 24 | } 25 | } 26 | channelHandlerContext.pipeline().fireChannelRegistered(); 27 | } 28 | 29 | @Override 30 | public void exceptionCaught(ChannelHandlerContext channelHandlerContext, Throwable t) throws Exception { 31 | ChannelInitializer.logger.warn("Failed to initialize a channel. Closing: " + channelHandlerContext.channel(), t); 32 | channelHandlerContext.close(); 33 | } 34 | 35 | protected abstract void initChannel(Channel channel) throws Exception; 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/protocolsupport/utils/netty/Compressor.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.utils.netty; 2 | 3 | import java.util.Arrays; 4 | import java.util.zip.Deflater; 5 | 6 | import io.netty.util.Recycler; 7 | import io.netty.util.Recycler.Handle; 8 | import protocolsupport.utils.Utils; 9 | 10 | public class Compressor { 11 | 12 | private static final int compressionLevel = Utils.getJavaPropertyValue("compressionlevel", 3, Integer::parseInt); 13 | 14 | private static final Recycler recycler = new Recycler() { 15 | @Override 16 | protected Compressor newObject(Handle handle) { 17 | return new Compressor(handle); 18 | } 19 | }; 20 | 21 | public static Compressor create() { 22 | return recycler.get(); 23 | } 24 | 25 | private final Deflater deflater = new Deflater(compressionLevel); 26 | private final Handle handle; 27 | protected Compressor(Handle handle) { 28 | this.handle = handle; 29 | } 30 | 31 | public byte[] compress(byte[] input) { 32 | deflater.setInput(input); 33 | deflater.finish(); 34 | byte[] compressedBuf = new byte[((input.length * 11) / 10) + 50]; 35 | int size = deflater.deflate(compressedBuf); 36 | deflater.reset(); 37 | return Arrays.copyOf(compressedBuf, size); 38 | } 39 | 40 | public void recycle() { 41 | handle.recycle(this); 42 | } 43 | 44 | public static byte[] compressStatic(byte[] input) { 45 | Compressor compressor = create(); 46 | try { 47 | return compressor.compress(input); 48 | } finally { 49 | compressor.recycle(); 50 | } 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /src/protocolsupport/utils/netty/Decompressor.java: -------------------------------------------------------------------------------- 1 | package protocolsupport.utils.netty; 2 | 3 | import java.util.zip.DataFormatException; 4 | import java.util.zip.Inflater; 5 | 6 | import io.netty.util.Recycler; 7 | import io.netty.util.Recycler.Handle; 8 | 9 | public class Decompressor { 10 | 11 | private static final Recycler recycler = new Recycler() { 12 | @Override 13 | protected Decompressor newObject(Handle handle) { 14 | return new Decompressor(handle); 15 | } 16 | }; 17 | 18 | public static Decompressor create() { 19 | return recycler.get(); 20 | } 21 | 22 | private final Inflater inflater = new Inflater(); 23 | private final Handle handle; 24 | protected Decompressor(Handle handle) { 25 | this.handle = handle; 26 | } 27 | 28 | public byte[] decompress(byte[] input, int uncompressedlength) throws DataFormatException { 29 | byte[] uncompressed = new byte[uncompressedlength]; 30 | try { 31 | inflater.setInput(input); 32 | inflater.inflate(uncompressed); 33 | } finally { 34 | inflater.reset(); 35 | } 36 | return uncompressed; 37 | } 38 | 39 | public void recycle() { 40 | handle.recycle(this); 41 | } 42 | 43 | public static byte[] decompressStatic(byte[] input, int uncompressedlength) throws DataFormatException { 44 | Decompressor decompressor = create(); 45 | try { 46 | return decompressor.decompress(input, uncompressedlength); 47 | } finally { 48 | decompressor.recycle(); 49 | } 50 | } 51 | 52 | } 53 | --------------------------------------------------------------------------------