diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 3431c58..d008c7d 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,5 +1,5 @@ custom: -- 'https://viaversion.com/donate' -- 'https://viaversion.com/backwards' -- 'https://viaversion.com/rewind' -- 'https://creeper123123321.github.io/#donate' + - 'https://viaversion.com/donate' + - 'https://viaversion.com/backwards' + - 'https://viaversion.com/rewind' + - 'https://creeper123123321.github.io/#donate' diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index f40c24d..4cb83f0 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -1,18 +1,18 @@ # This workflow will build a Java project with Gradle # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle name: Java CI with Gradle -on: [push, pull_request] +on: [ push, pull_request ] jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-java@v1 - with: - java-version: 16 - - name: Build with Gradle - run: ./gradlew build - - uses: actions/upload-artifact@v2 - with: - name: artifact - path: build/libs/ + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: 16 + - name: Build with Gradle + run: ./gradlew build + - uses: actions/upload-artifact@v2 + with: + name: artifact + path: build/libs/ diff --git a/README.md b/README.md index 2cb2197..ab53a0c 100644 --- a/README.md +++ b/README.md @@ -10,53 +10,71 @@ Discord: https://viaversion.com/discord Supported versions: https://viaversion.com/ ## How does it work? -- [ViaVersion](https://viaversion.com), [ViaBackwards](https://viaversion.com/backwards) and [ViaRewind](https://viaversion.com/rewind) translates the connections to backend server. -- VIAaaS auth page stores account credentials in the player's browser local storage. Check for XSS vulnerabilities on your domain. -- Due to technical/security reasons, it requires a CORS Proxy for calling Mojang APIs, which may make Mojang see that - as suspicious and reset/block your account password if the IP address seems suspect. + +- [ViaVersion](https://viaversion.com), [ViaBackwards](https://viaversion.com/backwards) + and [ViaRewind](https://viaversion.com/rewind) translates the connections to backend server. +- VIAaaS auth page stores account credentials in the player's browser local storage. Check for XSS vulnerabilities on + your domain. +- Due to technical/security reasons, it requires a CORS Proxy for calling Mojang APIs, which may make Mojang see that as + suspicious and reset/block your account password if the IP address seems suspect. - Account credentials aren't sent to VIAaaS instance, though it's intermediated by CORS Proxy. - VIAaaS receives a the session hash from instance and then the browser validates it to Mojang. ## Setting up server instance -Download: [GitHub Actions](https://github.com/ViaVersion/VIAaaS/actions) (needs to be logged into GitHub) or [JitPack](https://jitpack.io/com/github/viaversion/viaaas/master-SNAPSHOT/viaaas-master-SNAPSHOT-all.jar) + +Download: [GitHub Actions](https://github.com/ViaVersion/VIAaaS/actions) (needs to be logged into GitHub) +or [JitPack](https://jitpack.io/com/github/viaversion/viaaas/master-SNAPSHOT/viaaas-master-SNAPSHOT-all.jar) How to start VIAaaS server: + ```sh java -jar VIAaaS-all.jar ``` + - Requires Java 11 - Default Minecraft: ```via.localhost``` with port 25565 - Default HTTPS: ```https://localhost:25543/``` - Default WS URL: ```wss://localhost:25543/ws``` ### How to create a public server -- You need a domain wildcarding to VIAaaS instance, like ``*.example.com -> 192.168.123.123``. You can use [DuckDNS](https://duckdns.org/) DDNS service. + +- You need a domain wildcarding to VIAaaS instance, like ``*.example.com -> 192.168.123.123``. You can + use [DuckDNS](https://duckdns.org/) DDNS service. - Configure the hostname in the config - Open the Minecraft port (25565) -- The HTTPS page needs a certificate, you can use [Apache](https://httpd.apache.org/) (with a [Let's Encrypt](https://letsencrypt.org/) certificate) as a proxy. See apache_copypasta.txt file. +- The HTTPS page needs a certificate, you can use [Apache](https://httpd.apache.org/) (with + a [Let's Encrypt](https://letsencrypt.org/) certificate) as a proxy. See apache_copypasta.txt file. ## CORS Proxy + - For less chance of Mojang seeing the login as suspect, you (the player) should set up a CORS proxy on your machine. - Note the ending slash in cors-anywhere address -- You can use my public instance at https://crp123-cors.herokuapp.com/ ([source](https://github.com/creeper123123321/cors-anywhere/)) too, -but proxies have a bit more chance of being seen as suspect. +- You can use my public instance + at https://crp123-cors.herokuapp.com/ ([source](https://github.com/creeper123123321/cors-anywhere/)) too, but proxies + have a bit more chance of being seen as suspect. Setting up [cors-anywhere](https://www.npmjs.com/package/cors-anywhere) on local machine: + ```sh git clone https://github.com/Rob--W/cors-anywhere cd cors-anywhere npm install node server.js ``` + - It will be available at ```http://localhost:8080/``` ## Usage for players + Usage for offline mode: + - Connect to ```mc.example.net.via.localhost``` Usage for online mode: -- You can use two accounts (avoids Bad Login error), the same account for front-end and back-end connections, or use ```_of``` - (offline mode in frontend. May be useful if you have a client which is incompatible with online mode). + +- You can use two accounts (avoids Bad Login error), the same account for front-end and back-end connections, or + use ```_of``` + (offline mode in frontend. May be useful if you have a client which is incompatible with online mode). - Go to VIAaaS auth webpage (default is https://localhost:25543/) - Configure CORS proxy, see above in "CORS Proxy" section - Listen to the username A you'll use to connect to the proxy. @@ -65,62 +83,83 @@ Usage for online mode: - Connect to ```mc.example.com._u(B).via.localhost``` (```_u``` can be removed if you are using the same username) - Approve the login in the webpage - If you use the same online mode account, your client may show Bad Login. You can use a mod like - [Auth Me](https://www.curseforge.com/minecraft/mc-mods/auth-me) or [ReAuth](https://www.curseforge.com/minecraft/mc-mods/reauth). + [Auth Me](https://www.curseforge.com/minecraft/mc-mods/auth-me) + or [ReAuth](https://www.curseforge.com/minecraft/mc-mods/reauth). ### Address options + Example address: + - ```server.example.net._p25565._v1_12_2._of._uBACKUSERNAME.via.example.com``` - ```server.example.net.v_1_8.via.example.com``` - It's inspired by [Tor2web](https://www.tor2web.org/) proxies. Address parts: + - You can use ``(option)_(value)`` too, like ``p_25565``. - ```server.example.net```: backend server address - ```_p```: backend port -- ```_v```: backend version ([protocol id](https://wiki.vg/Protocol_version_numbers) or name with underline instead of dots). ```AUTO``` is default and ``-1`` is fallback if it fails. -- ```_o```: ```t``` to force online mode in frontend, ```f``` to disable online mode in frontend. If not set, it will be based on backend online mode. +- ```_v```: backend version ([protocol id](https://wiki.vg/Protocol_version_numbers) or name with underline instead of + dots). ```AUTO``` is default and ``-1`` is fallback if it fails. +- ```_o```: ```t``` to force online mode in frontend, ```f``` to disable online mode in frontend. If not set, it will be + based on backend online mode. - ```_u```: username to use in backend connection - ```via.example.com```: instance address (defined in config) ## WARNING + - VIAaaS may trigger anti-cheats, due to block, item, movement and other differences between versions. USE AT OWN RISK - Take care of browser local storage. Check for XSS vulnerabilities on your domain. - Check the security of CORS proxy, it will intermediate Mojang API calls. - Mojang may lock your account when API is called from a suspect IP address ## FAQ + ### Accounts + My Microsoft account <18 years old is not able to log in, it's giving XSTS error: + - Add your account to a family (see https://wiki.vg/Microsoft_Authentication_Scheme#Authenticate_with_XSTS) Why a online webpage for online mode?: -- It's easier to maintain in that way, because providing login via chat requires encoding and decoding more packets which change through versions. + +- It's easier to maintain in that way, because providing login via chat requires encoding and decoding more packets + which change through versions. - It allows your account password and token to be kept with you. How to use Microsoft Account?: -- If you are using a public VIAaaS instance, use this page https://viaversion.github.io/VIAaaS/ and configure the WebSocket address. + +- If you are using a public VIAaaS instance, use this page https://viaversion.github.io/VIAaaS/ and configure the + WebSocket address. ### Connection + How to use IPv6?: + - When listening to 0.0.0.0, it should listen on IPv6 too. -- To use IPv6 in backend address, you need to use a instance with IPv6 connectivity. The hostname parser currently doesn't support - direct IPv6, but you can use a DNS name with https://sslip.io/ +- To use IPv6 in backend address, you need to use a instance with IPv6 connectivity. The hostname parser currently + doesn't support direct IPv6, but you can use a DNS name with https://sslip.io/ I'm getting a DNS error/"Unknown host" while connecting to (...).localhost + - Try configuring via-127-0-0-1.nip.io as hostname suffix How to use with Geyser? + - Currently you need to set the parameters (at least the hostname) in Geyser's `address` field: ```yml remote: # The IP address of the remote (Java Edition) server address: 2b2t.org._v1_12_2.via.localhost ``` -- If you are using a public GeyserConnect instance: connect to a publicly available VIAaaS instance, like ```mc.example.com.via.example.net``` as a Java Edition server. +- If you are using a public GeyserConnect instance: connect to a publicly available VIAaaS instance, + like ```mc.example.com.via.example.net``` as a Java Edition server. Can I use it to connect to .onion Minecraft hidden servers? -- You can use .onion addresses if the instance is proxying the backend connections to TOR. - Note that VIAaaS may log your requests. + +- You can use .onion addresses if the instance is proxying the backend connections to TOR. Note that VIAaaS may log your + requests. Can you support more versions? + - See [DirtMultiVersion](https://github.com/DirtPowered/DirtMultiversion) diff --git a/build.gradle.kts b/build.gradle.kts index e484301..ac7f8b5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -102,9 +102,11 @@ tasks { tasks.named("processResources") { filesMatching("viaaas_info.json") { - filter("tokens" to mapOf( + filter( + "tokens" to mapOf( "version" to project.property("version") - )) + ) + ) } } diff --git a/index.html b/index.html index 3d73090..37b9e39 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ - + diff --git a/src/main/kotlin/com/viaversion/aas/Util.kt b/src/main/kotlin/com/viaversion/aas/Util.kt index 9a0b786..0b20f37 100644 --- a/src/main/kotlin/com/viaversion/aas/Util.kt +++ b/src/main/kotlin/com/viaversion/aas/Util.kt @@ -7,14 +7,14 @@ import com.google.common.primitives.Ints import com.google.gson.JsonObject import com.viaversion.aas.config.VIAaaSConfig import com.viaversion.aas.util.StacklessException +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion +import com.viaversion.viaversion.api.type.Type import io.ktor.client.request.* import io.netty.buffer.ByteBuf import io.netty.channel.Channel import io.netty.channel.ChannelFutureListener import io.netty.handler.codec.DecoderException import org.slf4j.LoggerFactory -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion -import com.viaversion.viaversion.api.type.Type import java.math.BigInteger import java.net.InetAddress import java.net.InetSocketAddress diff --git a/src/main/kotlin/com/viaversion/aas/VIAaaS.kt b/src/main/kotlin/com/viaversion/aas/VIAaaS.kt index aec100b..c19eae6 100644 --- a/src/main/kotlin/com/viaversion/aas/VIAaaS.kt +++ b/src/main/kotlin/com/viaversion/aas/VIAaaS.kt @@ -1,6 +1,5 @@ package com.viaversion.aas -import com.google.gson.JsonObject import com.google.gson.JsonParser import com.viaversion.aas.command.VIAaaSConsole import com.viaversion.aas.command.ViaAspirinCommand @@ -11,6 +10,10 @@ import com.viaversion.aas.platform.* import com.viaversion.aas.protocol.registerAspirinProtocols import com.viaversion.aas.web.ViaWebApp import com.viaversion.aas.web.WebDashboardServer +import com.viaversion.viaversion.ViaManagerImpl +import com.viaversion.viaversion.api.Via +import com.viaversion.viaversion.api.data.MappingDataLoader +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import de.gerrygames.viarewind.api.ViaRewindConfigImpl import io.ktor.application.* import io.ktor.client.* @@ -37,15 +40,9 @@ import io.netty.channel.socket.nio.NioSocketChannel import io.netty.util.concurrent.Future import org.apache.logging.log4j.Level import org.apache.logging.log4j.io.IoBuilder -import com.viaversion.viaversion.ViaManagerImpl -import com.viaversion.viaversion.api.Via -import com.viaversion.viaversion.api.data.MappingDataLoader -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import java.io.File import java.net.InetAddress import java.security.KeyPairGenerator -import java.security.SecureRandom -import java.util.* import java.util.concurrent.CompletableFuture val viaaasVer = JsonParser.parseString( diff --git a/src/main/kotlin/com/viaversion/aas/VIAaaSAddress.kt b/src/main/kotlin/com/viaversion/aas/VIAaaSAddress.kt index d9ea276..747dfd8 100644 --- a/src/main/kotlin/com/viaversion/aas/VIAaaSAddress.kt +++ b/src/main/kotlin/com/viaversion/aas/VIAaaSAddress.kt @@ -41,20 +41,20 @@ class VIAaaSAddress { fun parseOption(part: String): Boolean { val option = when { - part.length < 2 -> null - part.startsWith("_") -> part[1] - part[1] == '_' -> part[0] - else -> null - }?.toString() + part.length < 2 -> null + part.startsWith("_") -> part[1] + part[1] == '_' -> part[0] + else -> null + }?.toString() if (option != null) { val arg = part.substring(2) when (option.toLowerCase(Locale.ROOT)) { "p" -> port = arg.toInt() "o" -> online = when { - arg.startsWith("t", ignoreCase = true) -> true - arg.startsWith("f", ignoreCase = true) -> false - else -> null - } + arg.startsWith("t", ignoreCase = true) -> true + arg.startsWith("f", ignoreCase = true) -> false + else -> null + } "v" -> parseProtocol(arg) "u" -> { if (arg.length > 16) throw StacklessException("Invalid username") diff --git a/src/main/kotlin/com/viaversion/aas/codec/CompressionCodec.kt b/src/main/kotlin/com/viaversion/aas/codec/CompressionCodec.kt index 43a71b8..8f5ce06 100644 --- a/src/main/kotlin/com/viaversion/aas/codec/CompressionCodec.kt +++ b/src/main/kotlin/com/viaversion/aas/codec/CompressionCodec.kt @@ -1,10 +1,10 @@ package com.viaversion.aas.codec +import com.viaversion.viaversion.api.type.Type import io.netty.buffer.ByteBuf import io.netty.channel.ChannelHandlerContext import io.netty.handler.codec.DecoderException import io.netty.handler.codec.MessageToMessageCodec -import com.viaversion.viaversion.api.type.Type import java.util.zip.Deflater import java.util.zip.Inflater diff --git a/src/main/kotlin/com/viaversion/aas/codec/FrameCodec.kt b/src/main/kotlin/com/viaversion/aas/codec/FrameCodec.kt index 72bb8d3..3538916 100644 --- a/src/main/kotlin/com/viaversion/aas/codec/FrameCodec.kt +++ b/src/main/kotlin/com/viaversion/aas/codec/FrameCodec.kt @@ -1,11 +1,11 @@ package com.viaversion.aas.codec import com.viaversion.aas.badLength +import com.viaversion.viaversion.api.type.Type +import com.viaversion.viaversion.exception.CancelDecoderException import io.netty.buffer.ByteBuf import io.netty.channel.ChannelHandlerContext import io.netty.handler.codec.ByteToMessageCodec -import com.viaversion.viaversion.api.type.Type -import com.viaversion.viaversion.exception.CancelDecoderException class FrameCodec : ByteToMessageCodec() { override fun decode(ctx: ChannelHandlerContext, input: ByteBuf, out: MutableList) { diff --git a/src/main/kotlin/com/viaversion/aas/codec/MinecraftCodec.kt b/src/main/kotlin/com/viaversion/aas/codec/MinecraftCodec.kt index bb33f21..76f01ef 100644 --- a/src/main/kotlin/com/viaversion/aas/codec/MinecraftCodec.kt +++ b/src/main/kotlin/com/viaversion/aas/codec/MinecraftCodec.kt @@ -4,11 +4,12 @@ import com.viaversion.aas.handler.MinecraftHandler import com.viaversion.aas.packet.Packet import com.viaversion.aas.packet.PacketRegistry import com.viaversion.aas.util.StacklessException +import com.viaversion.viaversion.api.protocol.packet.Direction +import com.viaversion.viaversion.exception.CancelEncoderException import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBufAllocator import io.netty.channel.ChannelHandlerContext import io.netty.handler.codec.MessageToMessageCodec -import com.viaversion.viaversion.exception.CancelEncoderException class MinecraftCodec : MessageToMessageCodec() { override fun encode(ctx: ChannelHandlerContext, msg: Packet, out: MutableList) { @@ -16,7 +17,12 @@ class MinecraftCodec : MessageToMessageCodec() { val buf = ByteBufAllocator.DEFAULT.buffer() try { val handler = ctx.pipeline().get(MinecraftHandler::class.java) - PacketRegistry.encode(msg, buf, handler.data.frontVer!!, serverBound = !handler.frontEnd) + PacketRegistry.encode( + msg, + buf, + handler.data.frontVer!!, + if (handler.frontEnd) Direction.CLIENTBOUND else Direction.SERVERBOUND + ) out.add(buf.retain()) } finally { buf.release() @@ -30,7 +36,8 @@ class MinecraftCodec : MessageToMessageCodec() { PacketRegistry.decode( msg, handler.data.frontVer ?: 0, - handler.data.state.state, handler.frontEnd + handler.data.state.state, + if (handler.frontEnd) Direction.SERVERBOUND else Direction.CLIENTBOUND ) ) if (msg.isReadable) throw StacklessException("Remaining bytes!!!") diff --git a/src/main/kotlin/com/viaversion/aas/command/VIAaaSConsole.kt b/src/main/kotlin/com/viaversion/aas/command/VIAaaSConsole.kt index 7e472ca..7bcc48f 100644 --- a/src/main/kotlin/com/viaversion/aas/command/VIAaaSConsole.kt +++ b/src/main/kotlin/com/viaversion/aas/command/VIAaaSConsole.kt @@ -2,12 +2,12 @@ package com.viaversion.aas.command import com.viaversion.aas.command.sub.StopSubCommand import com.viaversion.aas.serverFinishing +import com.viaversion.viaversion.api.command.ViaCommandSender import net.minecrell.terminalconsole.SimpleTerminalConsole import org.jline.reader.Candidate import org.jline.reader.LineReader import org.jline.reader.LineReaderBuilder import org.slf4j.LoggerFactory -import com.viaversion.viaversion.api.command.ViaCommandSender import java.util.* object VIAaaSConsole : SimpleTerminalConsole(), ViaCommandSender { diff --git a/src/main/kotlin/com/viaversion/aas/command/sub/AspirinReloadSubCommand.kt b/src/main/kotlin/com/viaversion/aas/command/sub/AspirinReloadSubCommand.kt index 159fe71..c827457 100644 --- a/src/main/kotlin/com/viaversion/aas/command/sub/AspirinReloadSubCommand.kt +++ b/src/main/kotlin/com/viaversion/aas/command/sub/AspirinReloadSubCommand.kt @@ -4,7 +4,7 @@ import com.viaversion.aas.config.VIAaaSConfig import com.viaversion.viaversion.api.command.ViaCommandSender import com.viaversion.viaversion.api.command.ViaSubCommand -object AspirinReloadSubCommand: ViaSubCommand() { +object AspirinReloadSubCommand : ViaSubCommand() { override fun name() = "aasreload" override fun description() = "Reloads VIAaaS config" diff --git a/src/main/kotlin/com/viaversion/aas/handler/BackEndInit.kt b/src/main/kotlin/com/viaversion/aas/handler/BackEndInit.kt index c4d318d..f821380 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/BackEndInit.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/BackEndInit.kt @@ -3,11 +3,11 @@ package com.viaversion.aas.handler import com.viaversion.aas.codec.FrameCodec import com.viaversion.aas.codec.MinecraftCodec import com.viaversion.aas.handler.autoprotocol.ProtocolDetectorHandler +import com.viaversion.viaversion.connection.UserConnectionImpl +import com.viaversion.viaversion.protocol.ProtocolPipelineImpl import io.netty.channel.Channel import io.netty.channel.ChannelInitializer import io.netty.handler.timeout.ReadTimeoutHandler -import com.viaversion.viaversion.connection.UserConnectionImpl -import com.viaversion.viaversion.protocol.ProtocolPipelineImpl import java.util.concurrent.TimeUnit class BackEndInit(val connectionData: ConnectionData) : ChannelInitializer() { diff --git a/src/main/kotlin/com/viaversion/aas/handler/MinecraftHandler.kt b/src/main/kotlin/com/viaversion/aas/handler/MinecraftHandler.kt index 7a66924..92a7226 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/MinecraftHandler.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/MinecraftHandler.kt @@ -3,11 +3,11 @@ package com.viaversion.aas.handler import com.viaversion.aas.mcLogger import com.viaversion.aas.packet.Packet import com.viaversion.aas.setAutoRead +import com.viaversion.viaversion.exception.CancelCodecException import io.netty.channel.Channel import io.netty.channel.ChannelHandlerContext import io.netty.channel.SimpleChannelInboundHandler import io.netty.handler.proxy.Socks5ProxyHandler -import com.viaversion.viaversion.exception.CancelCodecException import java.net.SocketAddress import java.nio.channels.ClosedChannelException diff --git a/src/main/kotlin/com/viaversion/aas/handler/Util.kt b/src/main/kotlin/com/viaversion/aas/handler/Util.kt index 7b2e1f1..3f8e56d 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/Util.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/Util.kt @@ -3,9 +3,9 @@ package com.viaversion.aas.handler import com.viaversion.aas.config.VIAaaSConfig import com.viaversion.aas.packet.Packet import com.viaversion.aas.send +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import io.netty.channel.ChannelPipeline import io.netty.handler.proxy.Socks5ProxyHandler -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import java.net.InetSocketAddress fun forward(handler: MinecraftHandler, packet: Packet, flush: Boolean = false) { diff --git a/src/main/kotlin/com/viaversion/aas/handler/ViaCodec.kt b/src/main/kotlin/com/viaversion/aas/handler/ViaCodec.kt index aca54c4..f01818c 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/ViaCodec.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/ViaCodec.kt @@ -1,11 +1,11 @@ package com.viaversion.aas.handler -import io.netty.buffer.ByteBuf -import io.netty.channel.ChannelHandlerContext -import io.netty.handler.codec.MessageToMessageCodec import com.viaversion.viaversion.api.connection.UserConnection import com.viaversion.viaversion.exception.CancelDecoderException import com.viaversion.viaversion.exception.CancelEncoderException +import io.netty.buffer.ByteBuf +import io.netty.channel.ChannelHandlerContext +import io.netty.handler.codec.MessageToMessageCodec class ViaCodec(val info: UserConnection) : MessageToMessageCodec() { override fun decode(ctx: ChannelHandlerContext, bytebuf: ByteBuf, out: MutableList) { diff --git a/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetectionState.kt b/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetectionState.kt index dc1a1cc..a0f79b2 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetectionState.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetectionState.kt @@ -1,17 +1,16 @@ package com.viaversion.aas.handler.autoprotocol +import com.google.gson.JsonParser import com.viaversion.aas.handler.MinecraftHandler import com.viaversion.aas.handler.state.MinecraftConnectionState import com.viaversion.aas.mcLogger import com.viaversion.aas.packet.Packet import com.viaversion.aas.packet.status.StatusResponse import com.viaversion.aas.parseProtocol -import com.google.gson.JsonParser import com.viaversion.aas.util.StacklessException -import io.netty.channel.ChannelHandlerContext -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import com.viaversion.viaversion.api.protocol.packet.State -import java.nio.channels.ClosedChannelException +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion +import io.netty.channel.ChannelHandlerContext import java.util.concurrent.CompletableFuture class ProtocolDetectionState(val future: CompletableFuture) : MinecraftConnectionState { @@ -22,7 +21,7 @@ class ProtocolDetectionState(val future: CompletableFuture) : M handler.data.frontChannel.close() if (packet !is StatusResponse) throw StacklessException("unexpected packet") val ver = JsonParser.parseString(packet.json).asJsonObject - .getAsJsonObject("version").get("protocol").asInt.parseProtocol() + .getAsJsonObject("version").get("protocol").asInt.parseProtocol() future.complete(ver) mcLogger.info("A.D.: ${handler.endRemoteAddress} $ver") } diff --git a/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetector.kt b/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetector.kt index 281069f..ba4ce14 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetector.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetector.kt @@ -1,5 +1,7 @@ package com.viaversion.aas.handler.autoprotocol +import com.google.common.cache.CacheBuilder +import com.google.common.cache.CacheLoader import com.viaversion.aas.channelSocketFactory import com.viaversion.aas.childLoop import com.viaversion.aas.codec.FrameCodec @@ -11,8 +13,8 @@ import com.viaversion.aas.mcLogger import com.viaversion.aas.packet.handshake.Handshake import com.viaversion.aas.packet.status.StatusRequest import com.viaversion.aas.send -import com.google.common.cache.CacheBuilder -import com.google.common.cache.CacheLoader +import com.viaversion.viaversion.api.protocol.packet.State +import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import io.netty.bootstrap.Bootstrap import io.netty.channel.Channel import io.netty.channel.ChannelFuture @@ -21,8 +23,6 @@ import io.netty.channel.ChannelOption import io.netty.handler.timeout.ReadTimeoutHandler import io.netty.resolver.NoopAddressResolverGroup import io.netty.util.concurrent.Future -import com.viaversion.viaversion.api.protocol.version.ProtocolVersion -import com.viaversion.viaversion.api.protocol.packet.State import java.net.InetSocketAddress import java.util.concurrent.CompletableFuture import java.util.concurrent.ExecutionException diff --git a/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetectorHandler.kt b/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetectorHandler.kt index 044a9d2..8fa9304 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetectorHandler.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/autoprotocol/ProtocolDetectorHandler.kt @@ -3,12 +3,11 @@ package com.viaversion.aas.handler.autoprotocol import com.viaversion.aas.handler.ConnectionData import com.viaversion.aas.handler.MinecraftHandler import com.viaversion.aas.mcLogger +import io.netty.channel.ChannelDuplexHandler import io.netty.channel.ChannelHandlerContext import io.netty.channel.ChannelPromise import java.net.InetSocketAddress import java.util.concurrent.TimeUnit -import io.netty.channel.ChannelDuplexHandler -import java.lang.Exception import java.util.function.Consumer // https://github.com/ViaVersion/ViaFabric/blob/mc-1.16/src/main/java/com/github/creeper123123321/viafabric/handler/clientside/ProtocolDetectionHandler.java @@ -28,15 +27,15 @@ class ProtocolDetectorHandler(val connectionData: ConnectionData) : ChannelDuple ctx.pipeline().remove(this) }, 10, TimeUnit.SECONDS) ProtocolDetector.detectVersion(address).whenComplete { protocol, _ -> - if (protocol != null && protocol.version != -1) { - connectionData.viaBackServerVer = protocol.version - } else { - connectionData.viaBackServerVer = -1 // fallback - } - - ctx.pipeline().remove(this) - timeoutRun.cancel(false) + if (protocol != null && protocol.version != -1) { + connectionData.viaBackServerVer = protocol.version + } else { + connectionData.viaBackServerVer = -1 // fallback } + + ctx.pipeline().remove(this) + timeoutRun.cancel(false) + } // Let's cache it before we need it } } diff --git a/src/main/kotlin/com/viaversion/aas/handler/state/HandshakeState.kt b/src/main/kotlin/com/viaversion/aas/handler/state/HandshakeState.kt index e90086a..b3f85f4 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/state/HandshakeState.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/state/HandshakeState.kt @@ -1,18 +1,18 @@ package com.viaversion.aas.handler.state +import com.google.common.cache.CacheBuilder +import com.google.common.cache.CacheLoader +import com.google.common.net.HostAndPort +import com.google.common.util.concurrent.RateLimiter import com.viaversion.aas.VIAaaSAddress import com.viaversion.aas.config.VIAaaSConfig import com.viaversion.aas.handler.MinecraftHandler import com.viaversion.aas.mcLogger import com.viaversion.aas.packet.Packet import com.viaversion.aas.packet.handshake.Handshake -import com.google.common.cache.CacheBuilder -import com.google.common.cache.CacheLoader -import com.google.common.net.HostAndPort -import com.google.common.util.concurrent.RateLimiter import com.viaversion.aas.util.StacklessException -import io.netty.channel.ChannelHandlerContext import com.viaversion.viaversion.api.protocol.packet.State +import io.netty.channel.ChannelHandlerContext import java.net.InetAddress import java.net.InetSocketAddress import java.util.concurrent.TimeUnit diff --git a/src/main/kotlin/com/viaversion/aas/handler/state/LoginState.kt b/src/main/kotlin/com/viaversion/aas/handler/state/LoginState.kt index a012a38..bdf792a 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/state/LoginState.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/state/LoginState.kt @@ -10,13 +10,13 @@ import com.viaversion.aas.handler.forward import com.viaversion.aas.packet.Packet import com.viaversion.aas.packet.login.* import com.viaversion.aas.util.StacklessException +import com.viaversion.viaversion.api.protocol.packet.State import io.netty.channel.Channel import io.netty.channel.ChannelHandlerContext import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.future.await import kotlinx.coroutines.launch -import com.viaversion.viaversion.api.protocol.packet.State import java.util.* import java.util.concurrent.CompletableFuture import javax.crypto.Cipher diff --git a/src/main/kotlin/com/viaversion/aas/handler/state/MinecraftConnectionState.kt b/src/main/kotlin/com/viaversion/aas/handler/state/MinecraftConnectionState.kt index 45493ea..ee34f25 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/state/MinecraftConnectionState.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/state/MinecraftConnectionState.kt @@ -1,10 +1,10 @@ package com.viaversion.aas.handler.state -import com.viaversion.aas.packet.Packet import com.viaversion.aas.handler.MinecraftHandler import com.viaversion.aas.mcLogger -import io.netty.channel.ChannelHandlerContext +import com.viaversion.aas.packet.Packet import com.viaversion.viaversion.api.protocol.packet.State +import io.netty.channel.ChannelHandlerContext interface MinecraftConnectionState { val state: State diff --git a/src/main/kotlin/com/viaversion/aas/handler/state/PlayState.kt b/src/main/kotlin/com/viaversion/aas/handler/state/PlayState.kt index c6bed74..f6b3b4e 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/state/PlayState.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/state/PlayState.kt @@ -1,5 +1,6 @@ package com.viaversion.aas.handler.state +import com.google.gson.JsonPrimitive import com.viaversion.aas.config.VIAaaSConfig import com.viaversion.aas.handler.MinecraftHandler import com.viaversion.aas.handler.forward @@ -10,14 +11,13 @@ import com.viaversion.aas.packet.play.Kick import com.viaversion.aas.packet.play.PluginMessage import com.viaversion.aas.parseProtocol import com.viaversion.aas.readRemainingBytes -import com.viaversion.aas.writeFlushClose -import com.google.gson.JsonPrimitive import com.viaversion.aas.util.StacklessException +import com.viaversion.aas.writeFlushClose +import com.viaversion.viaversion.api.protocol.packet.State +import com.viaversion.viaversion.api.type.Type import io.netty.buffer.ByteBufAllocator import io.netty.buffer.Unpooled import io.netty.channel.ChannelHandlerContext -import com.viaversion.viaversion.api.type.Type -import com.viaversion.viaversion.api.protocol.packet.State object PlayState : MinecraftConnectionState { override val state: State @@ -40,7 +40,8 @@ object PlayState : MinecraftConnectionState { } else { Type.STRING.read(Unpooled.wrappedBuffer(pluginMessage.data)) } + " (VIAaaS C: ${handler.data.frontVer!!.parseProtocol()} S: ${ - handler.data.viaBackServerVer!!.parseProtocol()})" + handler.data.viaBackServerVer!!.parseProtocol() + })" if (is1_7(handler)) { pluginMessage.data = brand.toByteArray(Charsets.UTF_8) diff --git a/src/main/kotlin/com/viaversion/aas/handler/state/StatusState.kt b/src/main/kotlin/com/viaversion/aas/handler/state/StatusState.kt index d847a2c..6fc705b 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/state/StatusState.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/state/StatusState.kt @@ -1,5 +1,8 @@ package com.viaversion.aas.handler.state +import com.google.gson.JsonArray +import com.google.gson.JsonObject +import com.google.gson.JsonParser import com.viaversion.aas.config.VIAaaSConfig import com.viaversion.aas.handler.MinecraftHandler import com.viaversion.aas.handler.forward @@ -7,14 +10,11 @@ import com.viaversion.aas.packet.Packet import com.viaversion.aas.packet.UnknownPacket import com.viaversion.aas.packet.status.StatusResponse import com.viaversion.aas.parseProtocol -import com.viaversion.aas.writeFlushClose -import com.google.gson.JsonArray -import com.google.gson.JsonObject -import com.google.gson.JsonParser import com.viaversion.aas.util.StacklessException -import io.netty.channel.ChannelHandlerContext +import com.viaversion.aas.writeFlushClose import com.viaversion.viaversion.api.Via import com.viaversion.viaversion.api.protocol.packet.State +import io.netty.channel.ChannelHandlerContext import java.util.* object StatusState : MinecraftConnectionState { diff --git a/src/main/kotlin/com/viaversion/aas/handler/state/Util.kt b/src/main/kotlin/com/viaversion/aas/handler/state/Util.kt index 430e287..7e7e2af 100644 --- a/src/main/kotlin/com/viaversion/aas/handler/state/Util.kt +++ b/src/main/kotlin/com/viaversion/aas/handler/state/Util.kt @@ -8,6 +8,7 @@ import com.viaversion.aas.handler.MinecraftHandler import com.viaversion.aas.handler.forward import com.viaversion.aas.packet.handshake.Handshake import com.viaversion.aas.util.StacklessException +import com.viaversion.viaversion.api.protocol.packet.State import io.netty.bootstrap.Bootstrap import io.netty.channel.ChannelFuture import io.netty.channel.ChannelFutureListener @@ -17,7 +18,6 @@ import io.netty.resolver.NoopAddressResolverGroup import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch -import com.viaversion.viaversion.api.protocol.packet.State import java.net.Inet4Address import java.net.InetAddress import java.net.InetSocketAddress diff --git a/src/main/kotlin/com/viaversion/aas/packet/PacketRegistry.kt b/src/main/kotlin/com/viaversion/aas/packet/PacketRegistry.kt index 8ea7686..9814124 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/PacketRegistry.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/PacketRegistry.kt @@ -1,5 +1,6 @@ package com.viaversion.aas.packet +import com.google.common.collect.Range import com.viaversion.aas.packet.handshake.Handshake import com.viaversion.aas.packet.login.* import com.viaversion.aas.packet.play.Kick @@ -8,91 +9,100 @@ import com.viaversion.aas.packet.status.StatusPing import com.viaversion.aas.packet.status.StatusPong import com.viaversion.aas.packet.status.StatusRequest import com.viaversion.aas.packet.status.StatusResponse -import com.google.common.collect.Range import com.viaversion.aas.util.StacklessException -import io.netty.buffer.ByteBuf +import com.viaversion.viaversion.api.protocol.packet.Direction +import com.viaversion.viaversion.api.protocol.packet.State import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import com.viaversion.viaversion.api.type.Type -import com.viaversion.viaversion.api.protocol.packet.State +import com.viaversion.viaversion.protocols.protocol1_13to1_12_2.ClientboundPackets1_13 +import com.viaversion.viaversion.protocols.protocol1_14to1_13_2.ClientboundPackets1_14 +import com.viaversion.viaversion.protocols.protocol1_15to1_14_4.ClientboundPackets1_15 +import com.viaversion.viaversion.protocols.protocol1_16_2to1_16_1.ClientboundPackets1_16_2 +import com.viaversion.viaversion.protocols.protocol1_16to1_15_2.ClientboundPackets1_16 +import com.viaversion.viaversion.protocols.protocol1_17to1_16_4.ClientboundPackets1_17 +import com.viaversion.viaversion.protocols.protocol1_8.ClientboundPackets1_8 +import com.viaversion.viaversion.protocols.protocol1_9to1_8.ClientboundPackets1_9 +import io.netty.buffer.ByteBuf import java.util.function.Supplier object PacketRegistry { val entries = mutableListOf() init { - // Obviosly stolen from https://github.com/VelocityPowered/Velocity/blob/dev/1.1.0/proxy/src/main/java/com/velocitypowered/proxy/protocol/StateRegistry.java - register(Range.all(), State.HANDSHAKE, 0, true, ::Handshake) - register(Range.all(), State.LOGIN, 0, true, ::LoginStart) - register(Range.all(), State.LOGIN, 1, true, ::CryptoResponse) - register(Range.atLeast(ProtocolVersion.v1_13.version), State.LOGIN, 2, true, ::PluginResponse) - register(Range.all(), State.LOGIN, 0, false, ::LoginDisconnect) - register(Range.all(), State.LOGIN, 1, false, ::CryptoRequest) - register(Range.all(), State.LOGIN, 2, false, ::LoginSuccess) - register(Range.all(), State.LOGIN, 3, false, ::SetCompression) - register(Range.atLeast(ProtocolVersion.v1_13.version), State.LOGIN, 4, false, ::PluginRequest) - register(Range.all(), State.STATUS, 0, true, ::StatusRequest) - register(Range.all(), State.STATUS, 1, true, ::StatusPing) - register(Range.all(), State.STATUS, 0, false, ::StatusResponse) - register(Range.all(), State.STATUS, 1, false, ::StatusPong) + // Obviously stolen from https://github.com/VelocityPowered/Velocity/blob/dev/1.1.0/proxy/src/main/java/com/velocitypowered/proxy/protocol/StateRegistry.java + register(State.HANDSHAKE, Direction.SERVERBOUND, ::Handshake, Range.all(), 0) + + register(State.LOGIN, Direction.SERVERBOUND, ::LoginStart, Range.all(), 0) + register(State.LOGIN, Direction.SERVERBOUND, ::CryptoResponse, Range.all(), 1) + register(State.LOGIN, Direction.SERVERBOUND, ::PluginResponse, Range.atLeast(ProtocolVersion.v1_13.version), 2) + + register(State.LOGIN, Direction.CLIENTBOUND, ::LoginDisconnect, Range.all(), 0) + register(State.LOGIN, Direction.CLIENTBOUND, ::CryptoRequest, Range.all(), 1) + register(State.LOGIN, Direction.CLIENTBOUND, ::LoginSuccess, Range.all(), 2) + register(State.LOGIN, Direction.CLIENTBOUND, ::SetCompression, Range.all(), 3) + register(State.LOGIN, Direction.CLIENTBOUND, ::PluginRequest, Range.atLeast(ProtocolVersion.v1_13.version), 4) + + register(State.STATUS, Direction.SERVERBOUND, ::StatusRequest, Range.all(), 0) + register(State.STATUS, Direction.SERVERBOUND, ::StatusPing, Range.all(), 1) + register(State.STATUS, Direction.CLIENTBOUND, ::StatusResponse, Range.all(), 0) + register(State.STATUS, Direction.CLIENTBOUND, ::StatusPong, Range.all(), 1) + + // Play register( - ::Kick, State.PLAY, false, mapOf( - Range.closed(ProtocolVersion.v1_7_1.version, ProtocolVersion.v1_8.version) to 0x40, - Range.closed(ProtocolVersion.v1_9.version, ProtocolVersion.v1_12_2.version) to 0x1A, - Range.closed(ProtocolVersion.v1_13.version, ProtocolVersion.v1_13_2.version) to 0x1B, - Range.closed(ProtocolVersion.v1_14.version, ProtocolVersion.v1_14_4.version) to 0x1A, - Range.closed(ProtocolVersion.v1_15.version, ProtocolVersion.v1_15_2.version) to 0x1B, - Range.closed(ProtocolVersion.v1_16.version, ProtocolVersion.v1_16_1.version) to 0x1A, - Range.closed(ProtocolVersion.v1_16_2.version, ProtocolVersion.v1_16_4.version) to 0x19 + State.PLAY, Direction.CLIENTBOUND, ::Kick, mapOf( + ProtocolVersion.v1_7_1..ProtocolVersion.v1_8 to ClientboundPackets1_8.DISCONNECT.id, + ProtocolVersion.v1_9..ProtocolVersion.v1_12_2 to ClientboundPackets1_9.DISCONNECT.id, + ProtocolVersion.v1_13..ProtocolVersion.v1_13_2 to ClientboundPackets1_13.DISCONNECT.id, + ProtocolVersion.v1_14..ProtocolVersion.v1_14_4 to ClientboundPackets1_14.DISCONNECT.id, + ProtocolVersion.v1_15..ProtocolVersion.v1_15_2 to ClientboundPackets1_15.DISCONNECT.id, + ProtocolVersion.v1_16..ProtocolVersion.v1_16_1 to ClientboundPackets1_16.DISCONNECT.id, + ProtocolVersion.v1_16_2..ProtocolVersion.v1_16_4 to ClientboundPackets1_16_2.DISCONNECT.id, + Range.singleton(ProtocolVersion.v1_17.fullSnapshotVersion) to ClientboundPackets1_17.DISCONNECT.id ) ) + register( - ::PluginMessage, State.PLAY, true, mapOf( - Range.closed(ProtocolVersion.v1_7_1.version, ProtocolVersion.v1_8.version) to 0x17, - Range.closed(ProtocolVersion.v1_9.version, ProtocolVersion.v1_11_1.version) to 0x09, - Range.singleton(ProtocolVersion.v1_12.version) to 0x0A, - Range.closed(ProtocolVersion.v1_12_1.version, ProtocolVersion.v1_12_2.version) to 0x09, - Range.closed(ProtocolVersion.v1_13.version, ProtocolVersion.v1_13_2.version) to 0x0A, - Range.closed(ProtocolVersion.v1_14.version, ProtocolVersion.v1_16_4.version) to 0x0B - ) - ) - register( - ::PluginMessage, State.PLAY, false, - mapOf( - Range.closed(ProtocolVersion.v1_7_1.version, ProtocolVersion.v1_8.version) to 0x3F, - Range.closed(ProtocolVersion.v1_9.version, ProtocolVersion.v1_12_2.version) to 0x18, - Range.closed(ProtocolVersion.v1_13.version, ProtocolVersion.v1_13_2.version) to 0x19, - Range.closed(ProtocolVersion.v1_14.version, ProtocolVersion.v1_14_4.version) to 0x18, - Range.closed(ProtocolVersion.v1_15.version, ProtocolVersion.v1_15_2.version) to 0x19, - Range.closed(ProtocolVersion.v1_16.version, ProtocolVersion.v1_16_1.version) to 0x18, - Range.closed(ProtocolVersion.v1_16_2.version, ProtocolVersion.v1_16_4.version) to 0x17 + State.PLAY, Direction.CLIENTBOUND, ::PluginMessage, mapOf( + ProtocolVersion.v1_7_1..ProtocolVersion.v1_8 to ClientboundPackets1_8.PLUGIN_MESSAGE.id, + ProtocolVersion.v1_9..ProtocolVersion.v1_12_2 to ClientboundPackets1_9.PLUGIN_MESSAGE.id, + ProtocolVersion.v1_13..ProtocolVersion.v1_13_2 to ClientboundPackets1_13.PLUGIN_MESSAGE.id, + ProtocolVersion.v1_14..ProtocolVersion.v1_14_4 to ClientboundPackets1_14.PLUGIN_MESSAGE.id, + ProtocolVersion.v1_15..ProtocolVersion.v1_15_2 to ClientboundPackets1_15.PLUGIN_MESSAGE.id, + ProtocolVersion.v1_16..ProtocolVersion.v1_16_1 to ClientboundPackets1_16.PLUGIN_MESSAGE.id, + ProtocolVersion.v1_16_2..ProtocolVersion.v1_16_4 to ClientboundPackets1_16_2.PLUGIN_MESSAGE.id, + Range.singleton(ProtocolVersion.v1_17.fullSnapshotVersion) to ClientboundPackets1_17.PLUGIN_MESSAGE.id ) ) } + operator fun ProtocolVersion.rangeTo(o: ProtocolVersion): Range { + return Range.closed(this.originalVersion, o.originalVersion) + } + inline fun register( - protocol: Range, state: State, - id: Int, - serverBound: Boolean, - constructor: Supplier

- ) { - entries.add(RegistryEntry(protocol, state, id, serverBound, constructor, P::class.java)) - } - - inline fun register( + direction: Direction, constructor: Supplier

, - state: State, - serverBound: Boolean, - idByProtocol: Map, Int> + idByProtocol: Map, Int>, + klass: Class

= P::class.java, ) { - idByProtocol.forEach { (protocol, id) -> register(protocol, state, id, serverBound, constructor) } + entries.add(RegistryEntry(idByProtocol, state, direction, constructor, klass)) + } + + inline fun register( + state: State, + direction: Direction, + constructor: Supplier

, + protocol: Range, + id: Int + ) { + register(constructor = constructor, direction = direction, state = state, idByProtocol = mapOf(protocol to id)) } data class RegistryEntry( - val versionRange: Range, + val idByVersion: Map, Int>, val state: State, - val id: Int, - val serverBound: Boolean, + val direction: Direction, val constructor: Supplier, val packetClass: Class ) @@ -101,34 +111,35 @@ object PacketRegistry { protocolVersion: Int, state: State, id: Int, - serverBound: Boolean + direction: Direction ): Supplier? { return entries.firstOrNull { - it.serverBound == serverBound && it.state == state - && it.versionRange.contains(protocolVersion) && it.id == id + it.direction == direction + && it.state == state + && it.idByVersion.entries.firstOrNull { it.key.contains(protocolVersion) }?.value == id }?.constructor } - fun getPacketId(packetClass: Class, protocolVersion: Int, serverBound: Boolean): Int? { + fun getPacketId(packetClass: Class, protocolVersion: Int, direction: Direction): Int? { return entries.firstOrNull { - it.versionRange.contains(protocolVersion) && it.packetClass == packetClass && it.serverBound == serverBound - }?.id + it.packetClass == packetClass && it.direction == direction + }?.idByVersion?.entries?.firstOrNull { it.key.contains(protocolVersion) }?.value } - fun decode(byteBuf: ByteBuf, protocolVersion: Int, state: State, serverBound: Boolean): Packet { + fun decode(byteBuf: ByteBuf, protocolVersion: Int, state: State, direction: Direction): Packet { val packetId = Type.VAR_INT.readPrimitive(byteBuf) val packet = - getPacketConstructor(protocolVersion, state, packetId, serverBound)?.get() ?: UnknownPacket(packetId) + getPacketConstructor(protocolVersion, state, packetId, direction)?.get() ?: UnknownPacket(packetId) packet.decode(byteBuf, protocolVersion) if (byteBuf.isReadable) throw StacklessException("Remaining bytes!") return packet } - fun encode(packet: Packet, byteBuf: ByteBuf, protocolVersion: Int, serverBound: Boolean) { + fun encode(packet: Packet, byteBuf: ByteBuf, protocolVersion: Int, direction: Direction) { val id = if (packet is UnknownPacket) { packet.id } else { - getPacketId(packet.javaClass, protocolVersion, serverBound)!! + getPacketId(packet.javaClass, protocolVersion, direction)!! } Type.VAR_INT.writePrimitive(byteBuf, id) packet.encode(byteBuf, protocolVersion) diff --git a/src/main/kotlin/com/viaversion/aas/packet/handshake/Handshake.kt b/src/main/kotlin/com/viaversion/aas/packet/handshake/Handshake.kt index 1c54ef0..65f068c 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/handshake/Handshake.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/handshake/Handshake.kt @@ -1,9 +1,9 @@ package com.viaversion.aas.packet.handshake import com.viaversion.aas.packet.Packet -import io.netty.buffer.ByteBuf -import com.viaversion.viaversion.api.type.Type import com.viaversion.viaversion.api.protocol.packet.State +import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf import kotlin.properties.Delegates class Handshake : Packet { diff --git a/src/main/kotlin/com/viaversion/aas/packet/login/CryptoRequest.kt b/src/main/kotlin/com/viaversion/aas/packet/login/CryptoRequest.kt index 94adc07..c81f743 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/login/CryptoRequest.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/login/CryptoRequest.kt @@ -2,9 +2,9 @@ package com.viaversion.aas.packet.login import com.viaversion.aas.packet.Packet import com.viaversion.aas.readByteArray -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf import java.security.KeyFactory import java.security.PublicKey import java.security.spec.X509EncodedKeySpec diff --git a/src/main/kotlin/com/viaversion/aas/packet/login/CryptoResponse.kt b/src/main/kotlin/com/viaversion/aas/packet/login/CryptoResponse.kt index 741a34b..d9ddf09 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/login/CryptoResponse.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/login/CryptoResponse.kt @@ -2,9 +2,9 @@ package com.viaversion.aas.packet.login import com.viaversion.aas.packet.Packet import com.viaversion.aas.readByteArray -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf class CryptoResponse : Packet { lateinit var encryptedKey: ByteArray diff --git a/src/main/kotlin/com/viaversion/aas/packet/login/LoginDisconnect.kt b/src/main/kotlin/com/viaversion/aas/packet/login/LoginDisconnect.kt index 6576769..3c4f2f4 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/login/LoginDisconnect.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/login/LoginDisconnect.kt @@ -1,8 +1,8 @@ package com.viaversion.aas.packet.login import com.viaversion.aas.packet.Packet -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf class LoginDisconnect : Packet { lateinit var msg: String diff --git a/src/main/kotlin/com/viaversion/aas/packet/login/LoginStart.kt b/src/main/kotlin/com/viaversion/aas/packet/login/LoginStart.kt index ecebec8..3c65a6b 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/login/LoginStart.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/login/LoginStart.kt @@ -1,8 +1,8 @@ package com.viaversion.aas.packet.login import com.viaversion.aas.packet.Packet -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf class LoginStart : Packet { lateinit var username: String diff --git a/src/main/kotlin/com/viaversion/aas/packet/login/LoginSuccess.kt b/src/main/kotlin/com/viaversion/aas/packet/login/LoginSuccess.kt index 4d8be0b..d47d134 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/login/LoginSuccess.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/login/LoginSuccess.kt @@ -2,9 +2,9 @@ package com.viaversion.aas.packet.login import com.viaversion.aas.packet.Packet import com.viaversion.aas.parseUndashedId -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf import java.util.* class LoginSuccess : Packet { diff --git a/src/main/kotlin/com/viaversion/aas/packet/login/PluginRequest.kt b/src/main/kotlin/com/viaversion/aas/packet/login/PluginRequest.kt index a5dda81..8f3dc68 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/login/PluginRequest.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/login/PluginRequest.kt @@ -2,8 +2,8 @@ package com.viaversion.aas.packet.login import com.viaversion.aas.packet.Packet import com.viaversion.aas.readRemainingBytes -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf import kotlin.properties.Delegates class PluginRequest : Packet { diff --git a/src/main/kotlin/com/viaversion/aas/packet/login/PluginResponse.kt b/src/main/kotlin/com/viaversion/aas/packet/login/PluginResponse.kt index 56bf99e..7f04030 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/login/PluginResponse.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/login/PluginResponse.kt @@ -2,8 +2,8 @@ package com.viaversion.aas.packet.login import com.viaversion.aas.packet.Packet import com.viaversion.aas.readRemainingBytes -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf import kotlin.properties.Delegates class PluginResponse : Packet { diff --git a/src/main/kotlin/com/viaversion/aas/packet/login/SetCompression.kt b/src/main/kotlin/com/viaversion/aas/packet/login/SetCompression.kt index 634b51b..d4a07a6 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/login/SetCompression.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/login/SetCompression.kt @@ -1,8 +1,8 @@ package com.viaversion.aas.packet.login import com.viaversion.aas.packet.Packet -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf import kotlin.properties.Delegates class SetCompression : Packet { diff --git a/src/main/kotlin/com/viaversion/aas/packet/play/Kick.kt b/src/main/kotlin/com/viaversion/aas/packet/play/Kick.kt index 0b994e2..80d0306 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/play/Kick.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/play/Kick.kt @@ -1,8 +1,8 @@ package com.viaversion.aas.packet.play import com.viaversion.aas.packet.Packet -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf class Kick : Packet { lateinit var msg: String diff --git a/src/main/kotlin/com/viaversion/aas/packet/play/PluginMessage.kt b/src/main/kotlin/com/viaversion/aas/packet/play/PluginMessage.kt index be2476e..a396853 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/play/PluginMessage.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/play/PluginMessage.kt @@ -3,9 +3,9 @@ package com.viaversion.aas.packet.play import com.viaversion.aas.packet.Packet import com.viaversion.aas.readByteArray import com.viaversion.aas.readRemainingBytes -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.protocol.version.ProtocolVersion import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf class PluginMessage : Packet { lateinit var channel: String diff --git a/src/main/kotlin/com/viaversion/aas/packet/status/StatusRequest.kt b/src/main/kotlin/com/viaversion/aas/packet/status/StatusRequest.kt index 7194074..7f175c2 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/status/StatusRequest.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/status/StatusRequest.kt @@ -3,7 +3,7 @@ package com.viaversion.aas.packet.status import com.viaversion.aas.packet.Packet import io.netty.buffer.ByteBuf -class StatusRequest: Packet { +class StatusRequest : Packet { override fun decode(byteBuf: ByteBuf, protocolVersion: Int) { } diff --git a/src/main/kotlin/com/viaversion/aas/packet/status/StatusResponse.kt b/src/main/kotlin/com/viaversion/aas/packet/status/StatusResponse.kt index a8c4157..cb521b8 100644 --- a/src/main/kotlin/com/viaversion/aas/packet/status/StatusResponse.kt +++ b/src/main/kotlin/com/viaversion/aas/packet/status/StatusResponse.kt @@ -1,8 +1,8 @@ package com.viaversion.aas.packet.status import com.viaversion.aas.packet.Packet -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.type.Type +import io.netty.buffer.ByteBuf class StatusResponse : Packet { lateinit var json: String diff --git a/src/main/kotlin/com/viaversion/aas/platform/AspirinBackwards.kt b/src/main/kotlin/com/viaversion/aas/platform/AspirinBackwards.kt index c0847a4..296ee12 100644 --- a/src/main/kotlin/com/viaversion/aas/platform/AspirinBackwards.kt +++ b/src/main/kotlin/com/viaversion/aas/platform/AspirinBackwards.kt @@ -1,8 +1,8 @@ package com.viaversion.aas.platform import com.viaversion.viabackwards.api.ViaBackwardsPlatform -import org.slf4j.LoggerFactory import com.viaversion.viaversion.sponge.util.LoggerWrapper +import org.slf4j.LoggerFactory import java.io.File import java.util.logging.Logger diff --git a/src/main/kotlin/com/viaversion/aas/platform/AspirinPlatform.kt b/src/main/kotlin/com/viaversion/aas/platform/AspirinPlatform.kt index 6cd2bb3..05922a6 100644 --- a/src/main/kotlin/com/viaversion/aas/platform/AspirinPlatform.kt +++ b/src/main/kotlin/com/viaversion/aas/platform/AspirinPlatform.kt @@ -1,20 +1,19 @@ package com.viaversion.aas.platform +import com.google.common.util.concurrent.ThreadFactoryBuilder import com.viaversion.aas.config.AspirinViaConfig import com.viaversion.aas.initFuture import com.viaversion.aas.viaaasVer -import com.google.common.util.concurrent.ThreadFactoryBuilder -import io.netty.channel.DefaultEventLoop -import org.slf4j.LoggerFactory import com.viaversion.viaversion.api.ViaAPI -import com.viaversion.viaversion.api.configuration.ViaVersionConfig import com.viaversion.viaversion.api.command.ViaCommandSender import com.viaversion.viaversion.api.configuration.ConfigurationProvider -import com.viaversion.viaversion.api.platform.PlatformTask +import com.viaversion.viaversion.api.configuration.ViaVersionConfig import com.viaversion.viaversion.api.platform.ViaPlatform +import com.viaversion.viaversion.libs.gson.JsonObject import com.viaversion.viaversion.sponge.util.LoggerWrapper import com.viaversion.viaversion.util.VersionInfo -import com.viaversion.viaversion.libs.gson.JsonObject +import io.netty.channel.DefaultEventLoop +import org.slf4j.LoggerFactory import java.io.File import java.util.* import java.util.concurrent.CompletableFuture @@ -36,7 +35,7 @@ object AspirinPlatform : ViaPlatform { override fun onReload() { } - + override fun runSync(runnable: Runnable): AspirinTask = AspirinTask(eventLoop.submit(runnable)) override fun runSync(p0: Runnable, p1: Long): AspirinTask = AspirinTask(eventLoop.schedule(p0, p1 * 50L, TimeUnit.MILLISECONDS)) @@ -47,7 +46,7 @@ object AspirinPlatform : ViaPlatform { override fun getDump(): JsonObject = JsonObject() override fun kickPlayer(p0: UUID, p1: String): Boolean = false override fun getApi(): ViaAPI = AspirinViaAPI - override fun getDataFolder(): File = File("viaversion") + override fun getDataFolder(): File = File("viaversion") override fun getConf(): ViaVersionConfig = AspirinViaConfig override fun runAsync(p0: Runnable): AspirinTask = AspirinTask(CompletableFuture.runAsync(p0, executor)) override fun getLogger(): Logger = LoggerWrapper(LoggerFactory.getLogger("ViaVersion")) diff --git a/src/main/kotlin/com/viaversion/aas/platform/AspirinRewind.kt b/src/main/kotlin/com/viaversion/aas/platform/AspirinRewind.kt index f50ce4c..d176eca 100644 --- a/src/main/kotlin/com/viaversion/aas/platform/AspirinRewind.kt +++ b/src/main/kotlin/com/viaversion/aas/platform/AspirinRewind.kt @@ -1,8 +1,8 @@ package com.viaversion.aas.platform +import com.viaversion.viaversion.sponge.util.LoggerWrapper import de.gerrygames.viarewind.api.ViaRewindPlatform import org.slf4j.LoggerFactory -import com.viaversion.viaversion.sponge.util.LoggerWrapper import java.util.logging.Logger object AspirinRewind : ViaRewindPlatform { diff --git a/src/main/kotlin/com/viaversion/aas/protocol/AspirinProtocols.kt b/src/main/kotlin/com/viaversion/aas/protocol/AspirinProtocols.kt index 13f19cd..79626d8 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/AspirinProtocols.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/AspirinProtocols.kt @@ -8,6 +8,10 @@ import com.viaversion.viaversion.api.protocol.version.ProtocolVersion // cursed 1.7 -> 1.8 from https://github.com/Gerrygames/ClientViaVersion // + https://github.com/creeper123123321/ViaRewind/tree/17to18 fun registerAspirinProtocols() { - Via.getManager().protocolManager.registerProtocol(Protocol1_7_6to1_7_2, ProtocolVersion.v1_7_6, ProtocolVersion.v1_7_1) + Via.getManager().protocolManager.registerProtocol( + Protocol1_7_6to1_7_2, + ProtocolVersion.v1_7_6, + ProtocolVersion.v1_7_1 + ) Via.getManager().protocolManager.registerProtocol(Protocol1_8To1_7_6, ProtocolVersion.v1_8, ProtocolVersion.v1_7_6) } diff --git a/src/main/kotlin/com/viaversion/aas/protocol/Util.kt b/src/main/kotlin/com/viaversion/aas/protocol/Util.kt index 716894e..cf093ef 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/Util.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/Util.kt @@ -1,7 +1,7 @@ package com.viaversion.aas.protocol -import com.viaversion.viaversion.api.protocol.packet.PacketWrapper import com.viaversion.viaversion.api.minecraft.Position +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper import com.viaversion.viaversion.api.protocol.remapper.ValueReader import com.viaversion.viaversion.api.protocol.remapper.ValueTransformer import com.viaversion.viaversion.api.protocol.remapper.ValueWriter diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/Protocol1_8To1_7_6.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/Protocol1_8To1_7_6.kt index ca262fe..b4193e1 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/Protocol1_8To1_7_6.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/Protocol1_8To1_7_6.kt @@ -4,7 +4,6 @@ import com.viaversion.aas.protocol.id47toid5.packets.* import com.viaversion.aas.protocol.id47toid5.storage.* import com.viaversion.viaversion.api.connection.UserConnection import com.viaversion.viaversion.api.protocol.AbstractSimpleProtocol -import java.util.* // Based on https://github.com/Gerrygames/ClientViaVersion object Protocol1_8To1_7_6 : AbstractSimpleProtocol() { diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/chunks/ChunkPacketTransformer.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/chunks/ChunkPacketTransformer.kt index 9bd8493..aca0dc9 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/chunks/ChunkPacketTransformer.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/chunks/ChunkPacketTransformer.kt @@ -1,10 +1,10 @@ package com.viaversion.aas.protocol.id47toid5.chunks -import io.netty.buffer.ByteBuf -import com.viaversion.viaversion.api.protocol.packet.PacketWrapper import com.viaversion.viaversion.api.minecraft.BlockChangeRecord1_8 +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper import com.viaversion.viaversion.api.type.Type import com.viaversion.viaversion.api.type.types.CustomByteType +import io.netty.buffer.ByteBuf import java.io.IOException import java.util.stream.IntStream import java.util.zip.DataFormatException @@ -102,7 +102,8 @@ object ChunkPacketTransformer { } val chunks = arrayOfNulls(columnCount) (0 until columnCount).forEach { - chunks[it] = Chunk1_8to1_7_6_10(inflatedBuffers[it]!!, primaryBitMask[it], addBitMask[it], skyLightSent, true) + chunks[it] = + Chunk1_8to1_7_6_10(inflatedBuffers[it]!!, primaryBitMask[it], addBitMask[it], skyLightSent, true) } packetWrapper.write(Type.BOOLEAN, skyLightSent) packetWrapper.write(Type.VAR_INT, columnCount) @@ -133,13 +134,13 @@ object ChunkPacketTransformer { packetWrapper.write(Type.INT, chunkX) packetWrapper.write(Type.INT, chunkZ) packetWrapper.write(Type.BLOCK_CHANGE_RECORD_ARRAY, IntStream.range(0, size) - .mapToObj { - val encodedPos = (positions[it].toInt()) - val x = encodedPos.ushr(12).and(0xF) - val y = encodedPos.and(0xFF) - val z = encodedPos.ushr(8).and(0xF) - BlockChangeRecord1_8(x, y, z, blocks[it].toInt()) - } - .toList().toTypedArray()) + .mapToObj { + val encodedPos = (positions[it].toInt()) + val x = encodedPos.ushr(12).and(0xF) + val y = encodedPos.and(0xFF) + val z = encodedPos.ushr(8).and(0xF) + BlockChangeRecord1_8(x, y, z, blocks[it].toInt()) + } + .toList().toTypedArray()) } } \ No newline at end of file diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/metadata/MetadataRewriter.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/metadata/MetadataRewriter.kt index 764aacf..73e27e6 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/metadata/MetadataRewriter.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/metadata/MetadataRewriter.kt @@ -1,11 +1,10 @@ package com.viaversion.aas.protocol.id47toid5.metadata -import de.gerrygames.viarewind.protocol.protocol1_8to1_7_6_10.metadata.MetaIndex1_8to1_7_6_10 import com.viaversion.viaversion.api.Via import com.viaversion.viaversion.api.minecraft.entities.Entity1_10Types import com.viaversion.viaversion.api.minecraft.metadata.Metadata import com.viaversion.viaversion.api.minecraft.metadata.types.MetaType1_8 -import java.util.* +import de.gerrygames.viarewind.protocol.protocol1_8to1_7_6_10.metadata.MetaIndex1_8to1_7_6_10 object MetadataRewriter { fun transform(type: Entity1_10Types.EntityType?, list: MutableList) { diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/EntityPackets.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/EntityPackets.kt index 90f62ca..55827ef 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/EntityPackets.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/EntityPackets.kt @@ -5,13 +5,13 @@ import com.viaversion.aas.protocol.id47toid5.metadata.MetadataRewriter import com.viaversion.aas.protocol.id47toid5.storage.EntityTracker import com.viaversion.aas.protocol.id47toid5.type.CustomIntType import com.viaversion.aas.protocol.xyzToPosition -import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.types.Types1_7_6_10 import com.viaversion.viaversion.api.minecraft.entities.Entity1_10Types +import com.viaversion.viaversion.api.protocol.packet.State import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper import com.viaversion.viaversion.api.protocol.remapper.TypeRemapper import com.viaversion.viaversion.api.type.Type import com.viaversion.viaversion.api.type.types.version.Types1_8 -import com.viaversion.viaversion.api.protocol.packet.State +import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.types.Types1_7_6_10 import kotlin.experimental.and fun Protocol1_8To1_7_6.registerEntityPackets() { @@ -36,7 +36,10 @@ fun Protocol1_8To1_7_6.registerEntityPackets() { packetWrapper.write(Type.VAR_INT, entityId) //Entity Id packetWrapper.write(Type.UNSIGNED_BYTE, 0.toShort()) //Index packetWrapper.write(Type.UNSIGNED_BYTE, 0.toShort()) //Type - packetWrapper.write(Type.BYTE, (if (animation.toInt() == 104) 0x02 else 0x00).toByte()) //Value (sneaking/not sneaking) + packetWrapper.write( + Type.BYTE, + (if (animation.toInt() == 104) 0x02 else 0x00).toByte() + ) //Value (sneaking/not sneaking) packetWrapper.write(Type.UNSIGNED_BYTE, 255.toShort()) //end } else { packetWrapper.write(Type.VAR_INT, entityId) //Entity Id @@ -381,7 +384,12 @@ fun Protocol1_8To1_7_6.registerEntityPackets() { this.registerServerbound(State.PLAY, 0x0B, 0x0B, object : PacketRemapper() { override fun registerMap() { map(Type.VAR_INT, Type.INT) //Entity Id - handler { packetWrapper -> packetWrapper.write(Type.BYTE, (packetWrapper.read(Type.VAR_INT) + 1).toByte()) } //Action Id + handler { packetWrapper -> + packetWrapper.write( + Type.BYTE, + (packetWrapper.read(Type.VAR_INT) + 1).toByte() + ) + } //Action Id map(Type.VAR_INT, Type.INT) //Action Paramter } }) diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/InventoryPackets.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/InventoryPackets.kt index 207e0a6..f763b9a 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/InventoryPackets.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/InventoryPackets.kt @@ -2,14 +2,14 @@ package com.viaversion.aas.protocol.id47toid5.packets import com.viaversion.aas.protocol.id47toid5.Protocol1_8To1_7_6 import com.viaversion.aas.protocol.id47toid5.storage.Windows -import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.types.Types1_7_6_10 import com.viaversion.viaversion.api.minecraft.item.Item +import com.viaversion.viaversion.api.protocol.packet.State import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper import com.viaversion.viaversion.api.type.Type -import com.viaversion.viaversion.api.protocol.packet.State import com.viaversion.viaversion.libs.kyori.adventure.text.Component import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer +import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.types.Types1_7_6_10 fun Protocol1_8To1_7_6.registerInventoryPackets() { diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/LoginPackets.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/LoginPackets.kt index 17ec1d6..380743b 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/LoginPackets.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/LoginPackets.kt @@ -1,9 +1,9 @@ package com.viaversion.aas.protocol.id47toid5.packets import com.viaversion.aas.protocol.id47toid5.Protocol1_8To1_7_6 +import com.viaversion.viaversion.api.protocol.packet.State import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper import com.viaversion.viaversion.api.type.Type -import com.viaversion.viaversion.api.protocol.packet.State fun Protocol1_8To1_7_6.registerLoginPackets() { //Encryption Request diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/PlayerPackets.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/PlayerPackets.kt index 104af1b..8553d8f 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/PlayerPackets.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/PlayerPackets.kt @@ -9,24 +9,23 @@ import com.viaversion.aas.protocol.id47toid5.storage.Scoreboard import com.viaversion.aas.protocol.id47toid5.storage.Tablist import com.viaversion.aas.protocol.xyzToPosition import com.viaversion.aas.protocol.xyzUBytePos -import com.viaversion.aas.readRemainingBytes -import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.types.CustomStringType -import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.types.Types1_7_6_10 -import de.gerrygames.viarewind.utils.ChatUtil -import io.netty.buffer.Unpooled -import com.viaversion.viaversion.api.protocol.packet.PacketWrapper import com.viaversion.viaversion.api.Via import com.viaversion.viaversion.api.minecraft.entities.Entity1_10Types import com.viaversion.viaversion.api.minecraft.item.Item +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper +import com.viaversion.viaversion.api.protocol.packet.State import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper import com.viaversion.viaversion.api.protocol.remapper.TypeRemapper import com.viaversion.viaversion.api.type.Type import com.viaversion.viaversion.api.type.types.CustomByteType import com.viaversion.viaversion.api.type.types.version.Types1_8 -import com.viaversion.viaversion.api.protocol.packet.State -import com.viaversion.viaversion.util.ChatColorUtil import com.viaversion.viaversion.libs.opennbt.tag.builtin.ListTag import com.viaversion.viaversion.libs.opennbt.tag.builtin.StringTag +import com.viaversion.viaversion.util.ChatColorUtil +import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.types.CustomStringType +import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.types.Types1_7_6_10 +import de.gerrygames.viarewind.utils.ChatUtil +import io.netty.buffer.Unpooled import java.nio.charset.StandardCharsets import java.util.* import kotlin.experimental.and diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/WorldPackets.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/WorldPackets.kt index 6a79f3c..e8f97b2 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/WorldPackets.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/packets/WorldPackets.kt @@ -5,14 +5,14 @@ import com.viaversion.aas.protocol.id47toid5.Protocol1_8To1_7_6 import com.viaversion.aas.protocol.id47toid5.chunks.ChunkPacketTransformer import com.viaversion.aas.protocol.id47toid5.data.Particle1_8to1_7 import com.viaversion.aas.protocol.id47toid5.storage.MapStorage -import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.types.Types1_7_6_10 +import com.viaversion.viaversion.api.protocol.packet.State import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper import com.viaversion.viaversion.api.protocol.remapper.TypeRemapper import com.viaversion.viaversion.api.type.Type -import com.viaversion.viaversion.api.protocol.packet.State -import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8 import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.gson.GsonComponentSerializer import com.viaversion.viaversion.libs.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer +import com.viaversion.viaversion.protocols.protocol1_9to1_8.Protocol1_9To1_8 +import de.gerrygames.viarewind.protocol.protocol1_7_6_10to1_8.types.Types1_7_6_10 import kotlin.experimental.and fun Protocol1_8To1_7_6.registerWorldPackets() { diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/EntityTracker.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/EntityTracker.kt index 806fa5b..cea3399 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/EntityTracker.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/EntityTracker.kt @@ -2,14 +2,13 @@ package com.viaversion.aas.protocol.id47toid5.storage import com.viaversion.aas.protocol.id47toid5.Protocol1_8To1_7_6 import com.viaversion.aas.protocol.id47toid5.metadata.MetadataRewriter -import com.viaversion.viaversion.api.protocol.packet.PacketWrapper import com.viaversion.viaversion.api.connection.StoredObject import com.viaversion.viaversion.api.connection.UserConnection import com.viaversion.viaversion.api.minecraft.entities.Entity1_10Types import com.viaversion.viaversion.api.minecraft.metadata.Metadata +import com.viaversion.viaversion.api.protocol.packet.PacketWrapper import com.viaversion.viaversion.api.type.Type import com.viaversion.viaversion.api.type.types.version.Types1_8 -import java.lang.Exception import java.util.concurrent.ConcurrentHashMap class EntityTracker(user: UserConnection) : StoredObject(user) { diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/MapStorage.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/MapStorage.kt index 5d96d69..66b809b 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/MapStorage.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/MapStorage.kt @@ -2,7 +2,6 @@ package com.viaversion.aas.protocol.id47toid5.storage import com.viaversion.viaversion.api.connection.StoredObject import com.viaversion.viaversion.api.connection.UserConnection -import java.util.* class MapStorage(user: UserConnection) : StoredObject(user) { private val maps: MutableMap = HashMap() @@ -18,5 +17,6 @@ class MapStorage(user: UserConnection) : StoredObject(user) { var scale: Byte = 0 var mapIcons = emptyArray() } + class MapIcon(var direction: Byte, var type: Byte, var x: Byte, var z: Byte) } \ No newline at end of file diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/Scoreboard.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/Scoreboard.kt index f3f5a86..36a6846 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/Scoreboard.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/storage/Scoreboard.kt @@ -2,7 +2,6 @@ package com.viaversion.aas.protocol.id47toid5.storage import com.viaversion.viaversion.api.connection.StoredObject import com.viaversion.viaversion.api.connection.UserConnection -import java.util.* class Scoreboard(user: UserConnection) : StoredObject(user) { private val objectives = HashMap() diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/type/CustomIntType.kt b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/type/CustomIntType.kt index b689a5f..0c7a792 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/type/CustomIntType.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id47toid5/type/CustomIntType.kt @@ -1,7 +1,7 @@ package com.viaversion.aas.protocol.id47toid5.type -import io.netty.buffer.ByteBuf import com.viaversion.viaversion.api.type.PartialType +import io.netty.buffer.ByteBuf class CustomIntType(amount: Int) : PartialType(amount, IntArray::class.java) { override fun read(p0: ByteBuf, p1: Int): IntArray { diff --git a/src/main/kotlin/com/viaversion/aas/protocol/id5toid4/Protocol1_7_6to1_7_2.kt b/src/main/kotlin/com/viaversion/aas/protocol/id5toid4/Protocol1_7_6to1_7_2.kt index 0a11a33..e7fdd35 100644 --- a/src/main/kotlin/com/viaversion/aas/protocol/id5toid4/Protocol1_7_6to1_7_2.kt +++ b/src/main/kotlin/com/viaversion/aas/protocol/id5toid4/Protocol1_7_6to1_7_2.kt @@ -3,9 +3,9 @@ package com.viaversion.aas.protocol.id5toid4 import com.viaversion.aas.protocol.INSERT_DASHES import com.viaversion.viaversion.api.connection.UserConnection import com.viaversion.viaversion.api.protocol.AbstractSimpleProtocol +import com.viaversion.viaversion.api.protocol.packet.State import com.viaversion.viaversion.api.protocol.remapper.PacketRemapper import com.viaversion.viaversion.api.type.Type -import com.viaversion.viaversion.api.protocol.packet.State // Based on https://github.com/Gerrygames/ClientViaVersion object Protocol1_7_6to1_7_2 : AbstractSimpleProtocol() { diff --git a/src/main/kotlin/com/viaversion/aas/web/WebClient.kt b/src/main/kotlin/com/viaversion/aas/web/WebClient.kt index 4ddfee4..78d9975 100644 --- a/src/main/kotlin/com/viaversion/aas/web/WebClient.kt +++ b/src/main/kotlin/com/viaversion/aas/web/WebClient.kt @@ -1,8 +1,8 @@ package com.viaversion.aas.web -import com.viaversion.aas.config.VIAaaSConfig import com.google.common.collect.Sets import com.google.common.util.concurrent.RateLimiter +import com.viaversion.aas.config.VIAaaSConfig import io.ktor.features.* import io.ktor.websocket.* import java.util.* diff --git a/src/main/kotlin/com/viaversion/aas/web/WebLogin.kt b/src/main/kotlin/com/viaversion/aas/web/WebLogin.kt index fb59010..4c171e8 100644 --- a/src/main/kotlin/com/viaversion/aas/web/WebLogin.kt +++ b/src/main/kotlin/com/viaversion/aas/web/WebLogin.kt @@ -26,7 +26,8 @@ class WebLogin : WebState { "offline_login" -> { if (!sha512Hex(msg.toByteArray(Charsets.UTF_8)).startsWith("00000")) throw StacklessException("PoW failed") if ((obj.getAsJsonPrimitive("date").asLong - System.currentTimeMillis()).absoluteValue - > Duration.ofMinutes(2).toMillis()) { + > Duration.ofMinutes(2).toMillis() + ) { throw StacklessException("Invalid PoW date") } val username = obj.get("username").asString.trim() diff --git a/src/main/resources/web/index.html b/src/main/resources/web/index.html index 3d9a946..f2749ce 100644 --- a/src/main/resources/web/index.html +++ b/src/main/resources/web/index.html @@ -2,140 +2,171 @@ - + VIAaaS - - - - - - - - - + + + + + + + + - - - - - - - - - + script-src 'sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=' 'self' https://ajax.cloudflare.com/ https://cdnjs.cloudflare.com/ https://alcdn.msauth.net/" http-equiv="Content-Security-Policy"> + + + + + + + + +

-
-

WebSocket connection status: ?

-

CORS Proxy status: ?

-
-

-

Listening to logins from:

+
+

WebSocket connection status: ?

+

CORS Proxy status: ?

+
+

+

Listening to logins from:

-
+
- -

See README - for setting up one. Mojang APIs are called through this proxy, and a remote IP address may look suspicious and block your account. - It will receive sensitive data like email, passwords and tokens. HTTPS is required for non-localhost addresses.

- + +

See README + for setting up one. Mojang APIs are called through this proxy, and a remote IP address may look + suspicious and block your account. + It will receive sensitive data like email, passwords and tokens. HTTPS is required for non-localhost + addresses.

+
- -

It exchanges sensitive data like minecraft.id tokens, server session hashes and usernames. WSS is required.

- + +

It exchanges sensitive data like minecraft.id tokens, server session hashes and usernames. WSS is + required.

+
-
-
-

Browser Minecraft accounts:

-
-
-
+
+
+

Browser Minecraft accounts:

+
+
+
- -
-
- -
+ + +
+ +
- -
-
- - -
-
- - -
-
- -
+ + +
+ + +
+
+ + +
+
+ +
-