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.8UTF-8
- 1.0.10
+ 1.0.11