From 758240410ddbe643983bf07922c80c4158d2e6ea Mon Sep 17 00:00:00 2001 From: bundabrg Date: Fri, 18 Sep 2020 17:03:30 +0800 Subject: [PATCH] Isoloation and Licences * Implement full isolation between Geyser Protocol and Reversion Protocol. This allows incompatible changes to still work * Update licence to MIT Squashed commit of the following: commit 5b8ba31874912d6a2aa82e1edb7a74bb03b0ac74 Author: bundabrg Date: Fri Sep 18 17:01:20 2020 +0800 Clean up commit 5e1128ce146f2081c56eb127aa59d3a4b497ba38 Author: bundabrg Date: Fri Sep 18 12:48:18 2020 +0800 Checkpoint commit f2e1dab1a254ab3110e786dc2697986a296a8f08 Author: bundabrg Date: Thu Sep 17 17:19:48 2020 +0800 It compiles commit e44f0256494ffe2bb0e80a32b7b86f239a8fcdf1 Author: bundabrg Date: Thu Sep 17 15:59:22 2020 +0800 Update Copyright and start work on Relocated version of Reversion commit 46ccf28033a669a79f80f6b5a313bfd3b818096f Author: bundabrg Date: Thu Sep 17 14:47:25 2020 +0800 checkpoint before isolation commit c3bae9aa3897ef288b4001ed220c9c15b0c95e7b Author: bundabrg Date: Thu Sep 17 12:54:13 2020 +0800 Checkpoint commit db5e03e1a6c576f5bbbe87b626f49598a694b13c Author: bundabrg Date: Thu Sep 17 12:54:03 2020 +0800 Checkpoint commit 0df2fde7d261bbc995c7a11c0f6890ff2600699f Author: bundabrg Date: Sun Sep 13 23:20:06 2020 +0800 Update Docs commit 72292437e5c5e74baada7c361fd1951ec9baf834 Author: bundabrg Date: Sun Sep 13 23:01:56 2020 +0800 Initial Support for Bedrock-v414 --- .idea/copyright/MIT.xml | 6 + .idea/copyright/profiles_settings.xml | 2 +- README.md | 1 + docs/index.md | 1 + geyser-reversion/pom.xml | 63 +- .../reversion/GeyserReversionExtension.java | 69 +- .../grieve/geyser/reversion/api/Edition.java | 30 +- .../reversion/config/Configuration.java | 30 +- .../editions/bedrock/BedrockEdition.java | 47 +- .../BedrockEditionServerEventHandler.java | 95 ++ .../BedrockEditionUpstreamPacketHandler.java | 1069 +++++++++++++++++ .../handlers/BedrockServerEventHandler.java | 42 - .../BedrockUpstreamPacketHandler.java | 101 -- .../editions/education/EducationEdition.java | 45 +- .../education/commands/EducationCommand.java | 30 +- .../reversion/server/GeyserBedrockServer.java | 67 ++ .../reversion/server/GeyserServerSession.java | 81 ++ .../geyser/v408/Register_Geyser_v408.java | 52 - .../StartGameHandler_Geyser_v408.java | 83 -- pom.xml | 32 +- 20 files changed, 1510 insertions(+), 436 deletions(-) create mode 100644 .idea/copyright/MIT.xml create mode 100644 geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockEditionServerEventHandler.java create mode 100644 geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockEditionUpstreamPacketHandler.java delete mode 100644 geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockServerEventHandler.java delete mode 100644 geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockUpstreamPacketHandler.java create mode 100644 geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/server/GeyserBedrockServer.java create mode 100644 geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/server/GeyserServerSession.java delete mode 100644 geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/translators/geyser/v408/Register_Geyser_v408.java delete mode 100644 geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/translators/geyser/v408/handlers/StartGameHandler_Geyser_v408.java diff --git a/.idea/copyright/MIT.xml b/.idea/copyright/MIT.xml new file mode 100644 index 0000000..8b3d4d6 --- /dev/null +++ b/.idea/copyright/MIT.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml index 069eb2b..c3ba54a 100644 --- a/.idea/copyright/profiles_settings.xml +++ b/.idea/copyright/profiles_settings.xml @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/README.md b/README.md index dd9a94c..6e0c915 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ allow any supported version to connect to any supported Geyser. * Minecraft Bedrock v1.16.100.50 (beta) * Minecraft Bedrock v1.16.100.52 (beta) * Minecraft Bedrock v1.16.100.53 (beta) +* Minecraft Bedrock v1.16.100.55 (beta) ### Minecraft Education * Minecraft Education v1.14.31 diff --git a/docs/index.md b/docs/index.md index 28a402c..48df7b6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -15,6 +15,7 @@ allow any supported version to connect to any supported Geyser. * Minecraft Bedrock v1.16.100.50 (beta) * Minecraft Bedrock v1.16.100.52 (beta) * Minecraft Bedrock v1.16.100.53 (beta) +* Minecraft Bedrock v1.16.100.55 (beta) ### Minecraft Education * Minecraft Education v1.14.31 diff --git a/geyser-reversion/pom.xml b/geyser-reversion/pom.xml index e1ef475..5f01398 100644 --- a/geyser-reversion/pom.xml +++ b/geyser-reversion/pom.xml @@ -1,20 +1,26 @@ 1.2.0-SNAPSHOT provided - - - au.com.grieve.reversion - translator-v390ee_to_v408be - ${reversion.version} - compile - - - au.com.grieve.reversion - translator-v409be_to_v408be - ${reversion.version} - compile - - - au.com.grieve.reversion - translator-v411be_to_v409be - ${reversion.version} - compile - - - au.com.grieve.reversion - translator-v412be_to_v411be - ${reversion.version} - compile - - - au.com.grieve.reversion - edition-education - ${reversion.version} - compile - au.com.grieve.reversion - edition-bedrock + build-all-relocated ${reversion.version} compile diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/GeyserReversionExtension.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/GeyserReversionExtension.java index 1653435..0f3d338 100644 --- a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/GeyserReversionExtension.java +++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/GeyserReversionExtension.java @@ -1,19 +1,25 @@ /* - * EduSupport - Minecraft Protocol Support for MultiVersion in Geyser - * Copyright (C) 2020 GeyserReversion Developers + * MIT License * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * Copyright (c) 2020 GeyserReversion Developers * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ package au.com.grieve.geyser.reversion; @@ -22,13 +28,9 @@ import au.com.grieve.geyser.reversion.config.Configuration; import au.com.grieve.geyser.reversion.editions.bedrock.BedrockEdition; import au.com.grieve.geyser.reversion.editions.education.EducationEdition; -import au.com.grieve.geyser.reversion.translators.geyser.v408.Register_Geyser_v408; +import au.com.grieve.geyser.reversion.server.GeyserBedrockServer; +import au.com.grieve.reversion.Build; import au.com.grieve.reversion.api.RegisteredTranslator; -import au.com.grieve.reversion.api.ReversionServer; -import au.com.grieve.reversion.translators.v390ee_to_v408be.Register_v390ee_to_v408be; -import au.com.grieve.reversion.translators.v409be_to_v408be.Register_v409be_to_v408be; -import au.com.grieve.reversion.translators.v411be_to_v409be.Register_v411be_to_v409be; -import au.com.grieve.reversion.translators.v412be_to_v411be.Register_v412be_to_v411be; import lombok.Getter; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.event.annotations.GeyserEventHandler; @@ -67,6 +69,8 @@ public class GeyserReversionExtension extends GeyserExtension { private final Map registeredEditions = new HashMap<>(); private final List registeredTranslators = new ArrayList<>(); + private GeyserBedrockServer server; + private Configuration config; public GeyserReversionExtension(ExtensionManager extensionManager, ExtensionClassLoader extensionClassLoader) { @@ -90,13 +94,9 @@ private void registerEditions() { * Register built-in translators */ private void registerTranslators() { - registerTranslator(Register_v409be_to_v408be.TRANSLATOR); - registerTranslator(Register_v411be_to_v409be.TRANSLATOR); - registerTranslator(Register_v390ee_to_v408be.TRANSLATOR); - registerTranslator(Register_v412be_to_v411be.TRANSLATOR); - - // Add Geyser Translators - registerTranslator(Register_Geyser_v408.TRANSLATOR); + for (RegisteredTranslator translator : Build.TRANSLATORS) { + registerTranslator(translator); + } } @@ -139,7 +139,7 @@ private void loadConfig() { /** * Replace Geyser BedrockServer with one provided by an edition */ - @GeyserEventHandler(priority = EventHandler.PRIORITY.HIGH) + @GeyserEventHandler(priority = EventHandler.PRIORITY.LOW) public void onGeyserStart(GeyserStartEvent event) { Edition edition = registeredEditions.get(config.getEdition()); @@ -148,24 +148,27 @@ public void onGeyserStart(GeyserStartEvent event) { return; } + server = new GeyserBedrockServer(GeyserConnector.getInstance().getBedrockServer()); + InetSocketAddress address = GeyserConnector.getInstance().getBedrockServer().getBindAddress(); + // Create a new server on the same address/port as the default server + server.registerServer(edition.createReversionServer(address), true); + try { Field bedrockServer = GeyserConnector.class.getDeclaredField("bedrockServer"); bedrockServer.setAccessible(true); - ReversionServer server = edition.createReversionServer(GeyserConnector.getInstance().getBedrockServer().getBindAddress()); - GeyserConnector.getInstance().getBedrockServer().close(); - bedrockServer.set(GeyserConnector.getInstance(), server); +// bedrockServer.set(GeyserConnector.getInstance(), server); - } catch (NoSuchFieldException | IllegalAccessException e) { - getLogger().error(String.format("Unable to set Edition '%s'. Extension disabled.", config.getEdition()), e); + } catch (NoSuchFieldException e) { + getLogger().error(String.format("Unable to enable Edition '%s'. Extension disabled.", config.getEdition()), e); } - // Give the old BedrockServer time to close down + // Give the old BedrockServer time to close down then bind our default server GeyserConnector.getInstance().getGeneralThreadPool().schedule(() -> { - GeyserConnector.getInstance().getBedrockServer().bind().whenComplete((avoid, throwable) -> { + server.bind().whenComplete((avoid, throwable) -> { if (throwable != null) { getLogger().severe(LanguageUtils.getLocaleStringLog("geyser.core.fail", address.getAddress().toString(), address.getPort())); throwable.printStackTrace(); diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/api/Edition.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/api/Edition.java index f2a4777..81b32e0 100644 --- a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/api/Edition.java +++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/api/Edition.java @@ -1,19 +1,25 @@ /* - * EduSupport - Minecraft Protocol Support for MultiVersion in Geyser - * Copyright (C) 2020 GeyserReversion Developers + * MIT License * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * Copyright (c) 2020 GeyserReversion Developers * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ package au.com.grieve.geyser.reversion.api; diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/config/Configuration.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/config/Configuration.java index d856b2c..6855061 100644 --- a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/config/Configuration.java +++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/config/Configuration.java @@ -1,19 +1,25 @@ /* - * EduSupport - Minecraft Protocol Support for MultiVersion in Geyser - * Copyright (C) 2020 GeyserReversion Developers + * MIT License * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * Copyright (c) 2020 GeyserReversion Developers * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ package au.com.grieve.geyser.reversion.config; diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/BedrockEdition.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/BedrockEdition.java index ab70cc8..9b640db 100644 --- a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/BedrockEdition.java +++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/BedrockEdition.java @@ -1,35 +1,43 @@ /* - * EduSupport - Minecraft Protocol Support for MultiVersion in Geyser - * Copyright (C) 2020 GeyserReversion Developers + * MIT License * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * Copyright (c) 2020 GeyserReversion Developers * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ package au.com.grieve.geyser.reversion.editions.bedrock; import au.com.grieve.geyser.reversion.GeyserReversionExtension; import au.com.grieve.geyser.reversion.api.Edition; -import au.com.grieve.geyser.reversion.editions.bedrock.handlers.BedrockServerEventHandler; +import au.com.grieve.geyser.reversion.editions.bedrock.handlers.BedrockEditionServerEventHandler; +import au.com.grieve.reversion.Build; import au.com.grieve.reversion.api.RegisteredTranslator; import au.com.grieve.reversion.api.ReversionServer; import au.com.grieve.reversion.editions.bedrock.BedrockRegisteredTranslator; import au.com.grieve.reversion.editions.bedrock.BedrockReversionServer; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockPacketCodec; import lombok.RequiredArgsConstructor; -import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.network.BedrockProtocol; import java.net.InetSocketAddress; +import java.util.Arrays; @RequiredArgsConstructor public class BedrockEdition implements Edition { @@ -38,8 +46,15 @@ public class BedrockEdition implements Edition { @Override public ReversionServer createReversionServer(InetSocketAddress address) { extension.getLogger().info("BedrockServer listening on " + address.toString()); - BedrockReversionServer server = new BedrockReversionServer("geyser-bedrock", BedrockProtocol.DEFAULT_BEDROCK_CODEC, address); - server.setHandler(new BedrockServerEventHandler(GeyserConnector.getInstance())); + + BedrockPacketCodec defaultCodec = Arrays.stream(Build.PROTOCOLS) + .filter(p -> p.getProtocolVersion() == BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) + .findFirst() + .orElseThrow(() -> new RuntimeException("Unsupported Geyser")); + + System.err.println("Codec: " + defaultCodec); + BedrockReversionServer server = new BedrockReversionServer(defaultCodec, address); + server.setHandler(new BedrockEditionServerEventHandler(extension)); for (RegisteredTranslator translator : extension.getRegisteredTranslators()) { if (translator instanceof BedrockRegisteredTranslator) { diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockEditionServerEventHandler.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockEditionServerEventHandler.java new file mode 100644 index 0000000..7d28d64 --- /dev/null +++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockEditionServerEventHandler.java @@ -0,0 +1,95 @@ +/* + * MIT License + * + * Copyright (c) 2020 GeyserReversion Developers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package au.com.grieve.geyser.reversion.editions.bedrock.handlers; + +import au.com.grieve.geyser.reversion.GeyserReversionExtension; +import au.com.grieve.geyser.reversion.server.GeyserServerSession; +import au.com.grieve.reversion.editions.bedrock.BedrockReversionSession; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockPong; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockServerEventHandler; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockServerSession; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.socket.DatagramPacket; +import lombok.Getter; +import org.geysermc.connector.GeyserConnector; +import org.geysermc.connector.network.UpstreamPacketHandler; +import org.geysermc.connector.network.session.GeyserSession; + +import javax.annotation.ParametersAreNonnullByDefault; +import java.net.InetSocketAddress; + +@Getter +@ParametersAreNonnullByDefault +public class BedrockEditionServerEventHandler implements BedrockServerEventHandler { + + private final GeyserReversionExtension extension; + + public BedrockEditionServerEventHandler(GeyserReversionExtension extension) { + this.extension = extension; + } + + + @Override + public boolean onConnectionRequest(InetSocketAddress inetSocketAddress) { + return extension.getServer().getHandler().onConnectionRequest(inetSocketAddress); + } + + @Override + public BedrockPong onQuery(InetSocketAddress inetSocketAddress) { + com.nukkitx.protocol.bedrock.BedrockPong originalPong = extension.getServer().getHandler().onQuery(inetSocketAddress); + if (originalPong == null) { + return null; + } + + BedrockPong translatedPong = new BedrockPong(); + translatedPong.setEdition(originalPong.getEdition()); + translatedPong.setExtras(originalPong.getExtras()); + translatedPong.setGameType(originalPong.getGameType()); + translatedPong.setIpv4Port(originalPong.getIpv4Port()); + translatedPong.setIpv6Port(originalPong.getIpv6Port()); + translatedPong.setMaximumPlayerCount(originalPong.getMaximumPlayerCount()); + translatedPong.setMotd(originalPong.getMotd()); + translatedPong.setProtocolVersion(originalPong.getProtocolVersion()); + translatedPong.setSubMotd(originalPong.getSubMotd()); + translatedPong.setVersion(originalPong.getVersion()); + return translatedPong; + } + + @Override + public void onSessionCreation(BedrockServerSession bedrockServerSession) { + bedrockServerSession.setLogging(true); + GeyserServerSession facadeSession = new GeyserServerSession((BedrockReversionSession) bedrockServerSession); + GeyserSession geyserSession = new GeyserSession(GeyserConnector.getInstance(), facadeSession); + + facadeSession.setPacketHandler(new UpstreamPacketHandler(GeyserConnector.getInstance(), geyserSession)); + bedrockServerSession.setPacketHandler(new BedrockEditionUpstreamPacketHandler((BedrockReversionSession) bedrockServerSession, + geyserSession, facadeSession)); + } + + @Override + public void onUnhandledDatagram(ChannelHandlerContext ctx, DatagramPacket packet) { + extension.getServer().getHandler().onUnhandledDatagram(ctx, packet); + } +} diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockEditionUpstreamPacketHandler.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockEditionUpstreamPacketHandler.java new file mode 100644 index 0000000..ce89199 --- /dev/null +++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockEditionUpstreamPacketHandler.java @@ -0,0 +1,1069 @@ +/* + * MIT License + * + * Copyright (c) 2020 GeyserReversion Developers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package au.com.grieve.geyser.reversion.editions.bedrock.handlers; + +import au.com.grieve.geyser.reversion.server.GeyserServerSession; +import au.com.grieve.reversion.api.LoginData; +import au.com.grieve.reversion.editions.bedrock.BedrockReversionSession; +import au.com.grieve.reversion.exceptions.LoginException; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.handler.BedrockPacketHandler; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AddBehaviorTreePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AddEntityPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AddHangingEntityPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AddItemEntityPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AddPaintingPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AddPlayerPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AdventureSettingsPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AnimateEntityPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AnimatePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AnvilDamagePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AutomationClientConnectPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AvailableCommandsPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.AvailableEntityIdentifiersPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.BiomeDefinitionListPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.BlockEntityDataPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.BlockEventPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.BlockPickRequestPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.BookEditPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.BossEventPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.CameraPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.CameraShakePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ChangeDimensionPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ChunkRadiusUpdatedPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ClientCacheBlobStatusPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ClientCacheMissResponsePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ClientCacheStatusPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ClientToServerHandshakePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ClientboundMapItemDataPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.CodeBuilderPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.CommandBlockUpdatePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.CommandOutputPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.CommandRequestPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.CompletedUsingItemPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ContainerClosePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ContainerOpenPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ContainerSetDataPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.CorrectPlayerMovePredictionPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.CraftingDataPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.CraftingEventPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.CreativeContentPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.DebugInfoPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.DisconnectPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.EducationSettingsPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.EmoteListPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.EmotePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.EntityEventPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.EntityFallPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.EntityPickRequestPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.EventPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ExplodePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.GameRulesChangedPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.GuiDataPickItemPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.HurtArmorPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.InteractPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.InventoryContentPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.InventorySlotPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.InventoryTransactionPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ItemFrameDropItemPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ItemStackRequestPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ItemStackResponsePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.LabTablePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.LecternUpdatePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.LevelChunkPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.LevelEventGenericPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.LevelEventPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.LevelSoundEvent1Packet; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.LevelSoundEvent2Packet; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.LevelSoundEventPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.LoginPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.MapCreateLockedCopyPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.MapInfoRequestPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.MobArmorEquipmentPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.MobEffectPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.MobEquipmentPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ModalFormRequestPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ModalFormResponsePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.MoveEntityDeltaPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.MovePlayerPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.MultiplayerSettingsPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.NetworkChunkPublisherUpdatePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.NetworkSettingsPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.NetworkStackLatencyPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.NpcRequestPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.OnScreenTextureAnimationPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PacketViolationWarningPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PhotoTransferPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PlaySoundPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PlayerActionPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PlayerArmorDamagePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PlayerAuthInputPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PlayerEnchantOptionsPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PlayerFogPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PlayerHotbarPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PlayerInputPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PlayerListPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PlayerSkinPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PositionTrackingDBClientRequestPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PositionTrackingDBServerBroadcastPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PurchaseReceiptPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.RemoveEntityPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.RemoveObjectivePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.RequestChunkRadiusPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ResourcePackChunkDataPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ResourcePackChunkRequestPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ResourcePackClientResponsePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ResourcePackDataInfoPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ResourcePackStackPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.RespawnPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.RiderJumpPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ScriptCustomEventPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ServerSettingsRequestPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ServerSettingsResponsePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetCommandsEnabledPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetDefaultGameTypePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetDifficultyPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetDisplayObjectivePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetEntityDataPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetEntityLinkPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetEntityMotionPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetEntityMotionPlusPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetHealthPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetLastHurtByPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetLocalPlayerAsInitializedPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetPlayerGameTypePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetScorePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetScoreboardIdentityPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetSpawnPositionPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetTimePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SetTitlePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SettingsCommandPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ShowCreditsPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ShowProfilePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ShowStoreOfferPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SimpleEventPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SpawnExperienceOrbPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SpawnParticleEffectPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.StartGamePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.StopSoundPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.StructureBlockUpdatePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.StructureTemplateDataRequestPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.StructureTemplateDataResponsePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.SubClientLoginPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.TakeItemEntityPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.TextPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.TickSyncPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.TransferPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.UpdateAttributesPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.UpdateBlockPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.UpdateBlockPropertiesPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.UpdateBlockSyncedPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.UpdateEquipPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.UpdatePlayerGameTypePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.UpdateSoftEnumPacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.UpdateTradePacket; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.VideoStreamConnectPacket; +import com.fasterxml.jackson.databind.JsonNode; +import com.nukkitx.protocol.bedrock.BedrockPacketCodec; +import com.nukkitx.protocol.bedrock.packet.PlayStatusPacket; +import com.nukkitx.protocol.bedrock.packet.ResourcePacksInfoPacket; +import com.nukkitx.protocol.bedrock.packet.ServerToClientHandshakePacket; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import lombok.Getter; +import org.geysermc.connector.network.BedrockProtocol; +import org.geysermc.connector.network.session.GeyserSession; +import org.geysermc.connector.network.session.auth.AuthData; +import org.geysermc.connector.network.session.auth.BedrockClientData; +import org.geysermc.connector.utils.LanguageUtils; + +import java.util.UUID; + + +@Getter +public class BedrockEditionUpstreamPacketHandler implements BedrockPacketHandler { + private final BedrockReversionSession serverSession; + private final GeyserSession geyserSession; + private final GeyserServerSession facadeSession; + + public BedrockEditionUpstreamPacketHandler(BedrockReversionSession serverSession, GeyserSession session, GeyserServerSession facadeSession) { + this.serverSession = serverSession; + this.geyserSession = session; + this.facadeSession = facadeSession; + } + + @Override + public boolean handle(LoginPacket loginPacket) { + + // Check that we support the codec + BedrockPacketCodec packetCodec = BedrockProtocol.getBedrockCodec(loginPacket.getProtocolVersion()); + if (packetCodec == null) { + if (loginPacket.getProtocolVersion() > BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { + geyserSession.disconnect(LanguageUtils.getLocaleStringLog("geyser.network.outdated.server", BedrockProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion())); + return true; + } + + if (loginPacket.getProtocolVersion() < BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { + geyserSession.disconnect(LanguageUtils.getLocaleStringLog("geyser.network.outdated.client", BedrockProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion())); + return true; + } + } + + // Encrypt Connection + serverSession.enableEncryption(serverSession.getLoginData().getEncryptionKey()); + + try { + ServerToClientHandshakePacket packet = new ServerToClientHandshakePacket(); + packet.setJwt(serverSession.getLoginData().getHandshakeJwt().serialize()); + geyserSession.sendUpstreamPacketImmediately(packet); + } catch (LoginException e) { + geyserSession.disconnect("You are not able to connect. Please make sure your account is authorized to connect or contact the server administrator."); + geyserSession.getConnector().getLogger().error("Failed to encrypt connection: " + e.getMessage()); + return true; + } + + // Setup Session + JsonNode extraData = serverSession.getLoginData().getPayload().get("extraData"); + geyserSession.setAuthenticationData(new AuthData( + extraData.get("displayName").asText(), + UUID.fromString(extraData.get("identity").asText()), + extraData.get("XUID").asText() + )); + + serverSession.getLoginData(); + geyserSession.setClientData(LoginData.JSON_MAPPER.convertValue(serverSession.getLoginData().getClientData(), BedrockClientData.class)); + + PlayStatusPacket playStatus = new PlayStatusPacket(); + playStatus.setStatus(PlayStatusPacket.Status.LOGIN_SUCCESS); + geyserSession.sendUpstreamPacket(playStatus); + + ResourcePacksInfoPacket resourcePacksInfo = new ResourcePacksInfoPacket(); + geyserSession.sendUpstreamPacket(resourcePacksInfo); + return true; + } + + public boolean handlePacket(BedrockPacket original) { + // Isolate Reversion protocol from Geyser Protocol in case there are overlapping differences + ByteBuf buffer = ByteBufAllocator.DEFAULT.ioBuffer(); + + serverSession.getServer().getToCodec().tryEncode(buffer, original); + com.nukkitx.protocol.bedrock.BedrockPacket translated = BedrockProtocol.DEFAULT_BEDROCK_CODEC.tryDecode(buffer, serverSession.getServer().getToCodec().getId(original.getClass())); + + buffer.release(); + + return translated.handle(facadeSession.getPacketHandler()); + } + + @Override + public boolean handle(AdventureSettingsPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AnimatePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AnvilDamagePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AvailableEntityIdentifiersPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(BlockEntityDataPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(BlockPickRequestPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(BookEditPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ClientCacheBlobStatusPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ClientCacheMissResponsePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ClientCacheStatusPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ClientToServerHandshakePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(CommandBlockUpdatePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(CommandRequestPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(CompletedUsingItemPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ContainerClosePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(CraftingEventPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(EducationSettingsPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(EmotePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(EntityEventPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(EntityFallPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(EntityPickRequestPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(EventPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(InteractPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(InventoryContentPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(InventorySlotPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(InventoryTransactionPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ItemFrameDropItemPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(LabTablePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(LecternUpdatePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(LevelEventGenericPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(LevelSoundEvent1Packet packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(LevelSoundEventPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(MapInfoRequestPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(MobArmorEquipmentPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(MobEquipmentPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ModalFormResponsePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(MoveEntityAbsolutePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(MovePlayerPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(MultiplayerSettingsPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(NetworkStackLatencyPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PhotoTransferPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PlayerActionPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PlayerAuthInputPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PlayerHotbarPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PlayerInputPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PlayerSkinPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PurchaseReceiptPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(RequestChunkRadiusPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ResourcePackChunkRequestPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ResourcePackClientResponsePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(RiderJumpPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ServerSettingsRequestPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetDefaultGameTypePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetLocalPlayerAsInitializedPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetPlayerGameTypePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SubClientLoginPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AddBehaviorTreePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AddEntityPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AddHangingEntityPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AddItemEntityPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AddPaintingPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AddPlayerPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AvailableCommandsPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(BlockEventPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(BossEventPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(CameraPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ChangeDimensionPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ChunkRadiusUpdatedPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ClientboundMapItemDataPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(CommandOutputPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ContainerOpenPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ContainerSetDataPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(CraftingDataPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(DisconnectPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ExplodePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(LevelChunkPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(GameRulesChangedPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(GuiDataPickItemPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(HurtArmorPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AutomationClientConnectPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(LevelEventPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(MapCreateLockedCopyPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(MobEffectPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ModalFormRequestPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(MoveEntityDeltaPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(NetworkSettingsPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(NpcRequestPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(OnScreenTextureAnimationPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PlayerListPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PlaySoundPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.PlayStatusPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(RemoveEntityPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(RemoveObjectivePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ResourcePackChunkDataPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ResourcePackDataInfoPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ResourcePacksInfoPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ResourcePackStackPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(RespawnPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ScriptCustomEventPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ServerSettingsResponsePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.packet.ServerToClientHandshakePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetCommandsEnabledPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetDifficultyPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetDisplayObjectivePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetEntityDataPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetEntityLinkPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetEntityMotionPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetHealthPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetLastHurtByPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetScoreboardIdentityPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetScorePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetSpawnPositionPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetTimePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SettingsCommandPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetTitlePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ShowCreditsPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ShowProfilePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ShowStoreOfferPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SimpleEventPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SpawnExperienceOrbPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SpawnParticleEffectPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(StartGamePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(StopSoundPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(StructureBlockUpdatePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(StructureTemplateDataRequestPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(StructureTemplateDataResponsePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(TakeItemEntityPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(TextPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(TickSyncPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(TransferPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(UpdateAttributesPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(UpdateBlockPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(UpdateBlockPropertiesPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(UpdateBlockSyncedPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(UpdateEquipPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(UpdateSoftEnumPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(UpdateTradePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(BiomeDefinitionListPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(LevelSoundEvent2Packet packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(NetworkChunkPublisherUpdatePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(VideoStreamConnectPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(CodeBuilderPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(EmoteListPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ItemStackRequestPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(ItemStackResponsePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PlayerArmorDamagePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PlayerEnchantOptionsPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(CreativeContentPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(UpdatePlayerGameTypePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PositionTrackingDBServerBroadcastPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PositionTrackingDBClientRequestPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PacketViolationWarningPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(DebugInfoPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(SetEntityMotionPlusPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(AnimateEntityPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(CameraShakePacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(CorrectPlayerMovePredictionPacket packet) { + return handlePacket(packet); + } + + @Override + public boolean handle(PlayerFogPacket packet) { + return handlePacket(packet); + } +} diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockServerEventHandler.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockServerEventHandler.java deleted file mode 100644 index 3bb938c..0000000 --- a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockServerEventHandler.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * EduSupport - Minecraft Protocol Support for MultiVersion in Geyser - * Copyright (C) 2020 GeyserReversion Developers - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package au.com.grieve.geyser.reversion.editions.bedrock.handlers; - -import au.com.grieve.reversion.api.ReversionSession; -import com.nukkitx.protocol.bedrock.BedrockServerSession; -import lombok.Getter; -import org.geysermc.connector.GeyserConnector; -import org.geysermc.connector.network.ConnectorServerEventHandler; -import org.geysermc.connector.network.session.GeyserSession; - -@Getter -public class BedrockServerEventHandler extends ConnectorServerEventHandler { - private final GeyserConnector connector; - - public BedrockServerEventHandler(GeyserConnector connector) { - super(connector); - this.connector = connector; - } - - @Override - public void onSessionCreation(BedrockServerSession bedrockServerSession) { - bedrockServerSession.setLogging(true); - bedrockServerSession.setPacketHandler(new BedrockUpstreamPacketHandler((ReversionSession) bedrockServerSession, this.connector, new GeyserSession(this.connector, bedrockServerSession))); - } -} diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockUpstreamPacketHandler.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockUpstreamPacketHandler.java deleted file mode 100644 index 81bfe4e..0000000 --- a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/bedrock/handlers/BedrockUpstreamPacketHandler.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * EduSupport - Minecraft Protocol Support for MultiVersion in Geyser - * Copyright (C) 2020 GeyserReversion Developers - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package au.com.grieve.geyser.reversion.editions.bedrock.handlers; - -import au.com.grieve.reversion.api.LoginData; -import au.com.grieve.reversion.api.ReversionSession; -import au.com.grieve.reversion.exceptions.LoginException; -import com.fasterxml.jackson.databind.JsonNode; -import com.nukkitx.protocol.bedrock.BedrockPacketCodec; -import com.nukkitx.protocol.bedrock.packet.LoginPacket; -import com.nukkitx.protocol.bedrock.packet.PlayStatusPacket; -import com.nukkitx.protocol.bedrock.packet.ResourcePacksInfoPacket; -import com.nukkitx.protocol.bedrock.packet.ServerToClientHandshakePacket; -import lombok.Getter; -import org.geysermc.connector.GeyserConnector; -import org.geysermc.connector.network.BedrockProtocol; -import org.geysermc.connector.network.UpstreamPacketHandler; -import org.geysermc.connector.network.session.GeyserSession; -import org.geysermc.connector.network.session.auth.AuthData; -import org.geysermc.connector.network.session.auth.BedrockClientData; -import org.geysermc.connector.utils.LanguageUtils; - -import java.util.UUID; - - -@Getter -public class BedrockUpstreamPacketHandler extends UpstreamPacketHandler { - private final ReversionSession serverSession; - private final GeyserSession geyserSession; - - public BedrockUpstreamPacketHandler(ReversionSession serverSession, GeyserConnector connector, GeyserSession session) { - super(connector, session); - this.serverSession = serverSession; - this.geyserSession = session; - } - - @Override - public boolean handle(LoginPacket loginPacket) { - // Check that we support the codec - BedrockPacketCodec packetCodec = BedrockProtocol.getBedrockCodec(loginPacket.getProtocolVersion()); - if (packetCodec == null) { - if (loginPacket.getProtocolVersion() > BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { - this.session.disconnect(LanguageUtils.getLocaleStringLog("geyser.network.outdated.server", BedrockProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion())); - return true; - } - - if (loginPacket.getProtocolVersion() < BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { - this.session.disconnect(LanguageUtils.getLocaleStringLog("geyser.network.outdated.client", BedrockProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion())); - return true; - } - } - - // Encrypt Connection - serverSession.enableEncryption(serverSession.getLoginData().getEncryptionKey()); - - try { - ServerToClientHandshakePacket packet = new ServerToClientHandshakePacket(); - packet.setJwt(serverSession.getLoginData().getHandshakeJwt().serialize()); - session.sendUpstreamPacketImmediately(packet); - } catch (LoginException e) { - session.disconnect("You are not able to connect. Please make sure your account is authorized to connect or contact the server administrator."); - session.getConnector().getLogger().error("Failed to encrypt connection: " + e.getMessage()); - return true; - } - - // Setup Session - JsonNode extraData = serverSession.getLoginData().getPayload().get("extraData"); - geyserSession.setAuthenticationData(new AuthData( - extraData.get("displayName").asText(), - UUID.fromString(extraData.get("identity").asText()), - extraData.get("XUID").asText() - )); - - serverSession.getLoginData(); - session.setClientData(LoginData.JSON_MAPPER.convertValue(serverSession.getLoginData().getClientData(), BedrockClientData.class)); - - PlayStatusPacket playStatus = new PlayStatusPacket(); - playStatus.setStatus(PlayStatusPacket.Status.LOGIN_SUCCESS); - session.sendUpstreamPacket(playStatus); - - ResourcePacksInfoPacket resourcePacksInfo = new ResourcePacksInfoPacket(); - session.sendUpstreamPacket(resourcePacksInfo); - return true; - } -} diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/education/EducationEdition.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/education/EducationEdition.java index 922c092..364e479 100644 --- a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/education/EducationEdition.java +++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/education/EducationEdition.java @@ -1,32 +1,40 @@ /* - * EduSupport - Minecraft Protocol Support for MultiVersion in Geyser - * Copyright (C) 2020 GeyserReversion Developers + * MIT License * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * Copyright (c) 2020 GeyserReversion Developers * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ package au.com.grieve.geyser.reversion.editions.education; import au.com.grieve.geyser.reversion.GeyserReversionExtension; import au.com.grieve.geyser.reversion.api.Edition; -import au.com.grieve.geyser.reversion.editions.bedrock.handlers.BedrockServerEventHandler; +import au.com.grieve.geyser.reversion.editions.bedrock.handlers.BedrockEditionServerEventHandler; import au.com.grieve.geyser.reversion.editions.education.commands.EducationCommand; +import au.com.grieve.reversion.Build; import au.com.grieve.reversion.api.RegisteredTranslator; import au.com.grieve.reversion.api.ReversionServer; import au.com.grieve.reversion.editions.bedrock.BedrockRegisteredTranslator; import au.com.grieve.reversion.editions.education.EducationReversionServer; import au.com.grieve.reversion.editions.education.utils.TokenManager; +import au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockPacketCodec; import lombok.Getter; import org.geysermc.connector.GeyserConnector; import org.geysermc.connector.event.annotations.GeyserEventHandler; @@ -35,6 +43,7 @@ import java.io.File; import java.net.InetSocketAddress; +import java.util.Arrays; @Getter public class EducationEdition implements Edition { @@ -60,8 +69,14 @@ public void onGeyserStart(GeyserStartEvent event) { @Override public ReversionServer createReversionServer(InetSocketAddress address) { extension.getLogger().info("EducationServer listening on " + address.toString()); - EducationReversionServer server = new EducationReversionServer("geyser-bedrock", BedrockProtocol.DEFAULT_BEDROCK_CODEC, tokenManager, address); - server.setHandler(new BedrockServerEventHandler(GeyserConnector.getInstance())); + + BedrockPacketCodec defaultCodec = Arrays.stream(Build.PROTOCOLS) + .filter(p -> p.getProtocolVersion() == BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) + .findFirst() + .orElseThrow(() -> new RuntimeException("Unsupported Geyser")); + + EducationReversionServer server = new EducationReversionServer(defaultCodec, tokenManager, address); + server.setHandler(new BedrockEditionServerEventHandler(extension)); for (RegisteredTranslator translator : extension.getRegisteredTranslators()) { if (translator instanceof BedrockRegisteredTranslator) { diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/education/commands/EducationCommand.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/education/commands/EducationCommand.java index 845df04..c70d804 100644 --- a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/education/commands/EducationCommand.java +++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/editions/education/commands/EducationCommand.java @@ -1,19 +1,25 @@ /* - * EduSupport - Minecraft Protocol Support for MultiVersion in Geyser - * Copyright (C) 2020 GeyserReversion Developers + * MIT License * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * Copyright (c) 2020 GeyserReversion Developers * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. */ package au.com.grieve.geyser.reversion.editions.education.commands; diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/server/GeyserBedrockServer.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/server/GeyserBedrockServer.java new file mode 100644 index 0000000..116814d --- /dev/null +++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/server/GeyserBedrockServer.java @@ -0,0 +1,67 @@ +/* + * MIT License + * + * Copyright (c) 2020 GeyserReversion Developers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package au.com.grieve.geyser.reversion.server; + +import au.com.grieve.reversion.api.ReversionServer; +import com.nukkitx.protocol.bedrock.BedrockServer; +import lombok.Getter; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.CompletableFuture; + +/** + * Provides a Facade BedrockServer to Geyser + */ +@Getter +public class GeyserBedrockServer extends BedrockServer { + protected final BedrockServer original; + + // List of Reversion Servers + protected final Set servers = new HashSet<>(); + + // Default Server (follows Geyser settings) + protected ReversionServer defaultServer; + + public GeyserBedrockServer(BedrockServer original) { + super(original.getBindAddress()); + + this.original = original; + + setHandler(original.getHandler()); + } + + public void registerServer(ReversionServer server, boolean isDefault) { + servers.add(server); + if (isDefault) { + defaultServer = server; + } + } + + @Override + public CompletableFuture bind() { + return defaultServer.bind(); + } +} diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/server/GeyserServerSession.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/server/GeyserServerSession.java new file mode 100644 index 0000000..6786fb8 --- /dev/null +++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/server/GeyserServerSession.java @@ -0,0 +1,81 @@ +/* + * MIT License + * + * Copyright (c) 2020 GeyserReversion Developers + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package au.com.grieve.geyser.reversion.server; + +import au.com.grieve.reversion.editions.bedrock.BedrockReversionSession; +import com.nukkitx.protocol.bedrock.BedrockPacket; +import com.nukkitx.protocol.bedrock.BedrockServerSession; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import org.geysermc.connector.network.BedrockProtocol; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public class GeyserServerSession extends BedrockServerSession { + protected final BedrockReversionSession reversionSession; + + public GeyserServerSession(BedrockReversionSession reversionSession) { + super(null, null, null); + + this.reversionSession = reversionSession; + + } + + @Override + public void sendPacket(BedrockPacket original) { + // Isolate Reversion protocol from Geyser Protocol in case there are overlapping differences + ByteBuf buffer = ByteBufAllocator.DEFAULT.ioBuffer(); + + BedrockProtocol.DEFAULT_BEDROCK_CODEC.tryEncode(buffer, original); + au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockPacket translated = reversionSession.getServer().getToCodec().tryDecode(buffer, BedrockProtocol.DEFAULT_BEDROCK_CODEC.getId(original.getClass())); + buffer.release(); + + reversionSession.sendPacket(translated); + } + + @Override + public void sendPacketImmediately(BedrockPacket original) { + // Isolate Reversion protocol from Geyser Protocol in case there are overlapping differences + ByteBuf buffer = ByteBufAllocator.DEFAULT.ioBuffer(); + + BedrockProtocol.DEFAULT_BEDROCK_CODEC.tryEncode(buffer, original); + au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockPacket translated = reversionSession.getServer().getToCodec().tryDecode(buffer, BedrockProtocol.DEFAULT_BEDROCK_CODEC.getId(original.getClass())); + buffer.release(); + + reversionSession.sendPacketImmediately(translated); + } + + @Override + public boolean isClosed() { + return reversionSession.isClosed(); + } + + @Override + public void disconnect(@Nullable String reason, boolean hideReason) { + super.disconnect(reason, hideReason); + } +} diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/translators/geyser/v408/Register_Geyser_v408.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/translators/geyser/v408/Register_Geyser_v408.java deleted file mode 100644 index 739df1f..0000000 --- a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/translators/geyser/v408/Register_Geyser_v408.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * EduSupport - Minecraft Protocol Support for MultiVersion in Geyser - * Copyright (C) 2020 GeyserReversion Developers - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package au.com.grieve.geyser.reversion.translators.geyser.v408; - -import au.com.grieve.geyser.reversion.translators.geyser.v408.handlers.StartGameHandler_Geyser_v408; -import au.com.grieve.reversion.editions.bedrock.BedrockRegisteredTranslator; -import au.com.grieve.reversion.editions.bedrock.BedrockTranslator; -import au.com.grieve.reversion.editions.bedrock.handlers.LevelChunkHandler_Bedrock; -import au.com.grieve.reversion.editions.bedrock.handlers.UpdateBlockHandler_Bedrock; -import au.com.grieve.reversion.editions.bedrock.mappers.BlockMapper; -import au.com.grieve.reversion.editions.bedrock.mappers.EntityMapper; -import au.com.grieve.reversion.editions.bedrock.mappers.ItemMapper; -import com.nukkitx.protocol.bedrock.packet.LevelChunkPacket; -import com.nukkitx.protocol.bedrock.packet.StartGamePacket; -import com.nukkitx.protocol.bedrock.packet.UpdateBlockPacket; -import com.nukkitx.protocol.bedrock.v408.Bedrock_v408; - -public class Register_Geyser_v408 { - public static BedrockRegisteredTranslator TRANSLATOR = BedrockRegisteredTranslator.builder() - .fromEdition("bedrock") - .fromProtocolVersion(408) - .toEdition("geyser-bedrock") - .toProtocolVersion(408) - .codec(Bedrock_v408.V408_CODEC) - .translator(BedrockTranslator.class) - .blockMapper(BlockMapper.builder() - .palette(() -> Register_Geyser_v408.class.getResourceAsStream("/protocol/bedrock-v408/blockpalette.nbt")) - .build() - ) - .itemMapper(ItemMapper.DEFAULT) - .entityMapper(EntityMapper.DEFAULT) - .registerPacketHandler(LevelChunkPacket.class, LevelChunkHandler_Bedrock.class) - .registerPacketHandler(StartGamePacket.class, StartGameHandler_Geyser_v408.class) - .registerPacketHandler(UpdateBlockPacket.class, UpdateBlockHandler_Bedrock.class) - .build(); -} diff --git a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/translators/geyser/v408/handlers/StartGameHandler_Geyser_v408.java b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/translators/geyser/v408/handlers/StartGameHandler_Geyser_v408.java deleted file mode 100644 index 4f96bba..0000000 --- a/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/translators/geyser/v408/handlers/StartGameHandler_Geyser_v408.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * EduSupport - Minecraft Protocol Support for MultiVersion in Geyser - * Copyright (C) 2020 GeyserReversion Developers - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package au.com.grieve.geyser.reversion.translators.geyser.v408.handlers; - -import au.com.grieve.geyser.reversion.GeyserReversionExtension; -import au.com.grieve.reversion.editions.bedrock.BedrockTranslator; -import au.com.grieve.reversion.editions.bedrock.handlers.StartGameHandler_Bedrock; -import com.nukkitx.nbt.NbtList; -import com.nukkitx.nbt.NbtMap; -import com.nukkitx.protocol.bedrock.packet.StartGamePacket; - -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -/* - Geyser re-arranged the block palette which will cause issues with the new baked in palette format. - What we do here is to re-arrange it back based upon the supported bedrock palette in Geyser and keep a record - of the mapping so we translate it in other packets - */ -public class StartGameHandler_Geyser_v408 extends StartGameHandler_Bedrock { - protected boolean initialized = false; - - public StartGameHandler_Geyser_v408(BedrockTranslator translator) { - super(translator); - } - - @Override - public boolean fromDownstream(StartGamePacket packet) { - // Only grab runtime ID's for the first player - if (!initialized) { - initialized = true; - - NbtList geyserTags = packet.getBlockPalette(); - - Map translatedTags = IntStream.range(0, getTranslator().getRegisteredTranslator().getBlockMapper().getUpstreamPalette().size()) - .boxed() - .collect(Collectors.toMap(i -> i, i -> getTranslator().getRegisteredTranslator().getBlockMapper().getUpstreamPalette().get(i).getCompound("block"))); - - for (int geyserId = 0; geyserId < geyserTags.size(); geyserId++) { - NbtMap geyserTag = geyserTags.get(geyserId).getCompound("block"); - boolean found = false; - for (Map.Entry entry : translatedTags.entrySet()) { - if (geyserTag.equals(entry.getValue())) { - getTranslator().getRegisteredTranslator().getBlockMapper().registerRuntimeIdMapping(geyserId, entry.getKey()); - found = true; - translatedTags.remove(entry.getKey()); - break; - } - } - if (!found) { - GeyserReversionExtension.getInstance().getLogger().error("Unable to find upstream palette entry: " + geyserTag); - getTranslator().getRegisteredTranslator().getBlockMapper().registerRuntimeIdMapping(geyserId, 0); // Set to 0 for now - } - if (translatedTags.size() == 0) { - break; - } - } - - if (translatedTags.size() > 0) { - GeyserReversionExtension.getInstance().getLogger().error("Extra upstream unmatched palette entries: \n" + translatedTags); - } - } - - return super.fromDownstream(packet); - } -} diff --git a/pom.xml b/pom.xml index eb86960..fc994de 100644 --- a/pom.xml +++ b/pom.xml @@ -1,20 +1,26 @@ 1.8 1.8 UTF-8 - 1.0.10 + 1.0.11