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 384fda8..1653435 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
@@ -22,6 +22,7 @@
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.reversion.api.RegisteredTranslator;
import au.com.grieve.reversion.api.ReversionServer;
import au.com.grieve.reversion.translators.v390ee_to_v408be.Register_v390ee_to_v408be;
@@ -93,6 +94,9 @@ private void registerTranslators() {
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);
}
@@ -151,10 +155,6 @@ public void onGeyserStart(GeyserStartEvent event) {
bedrockServer.setAccessible(true);
ReversionServer server = edition.createReversionServer(GeyserConnector.getInstance().getBedrockServer().getBindAddress());
- for (RegisteredTranslator translator : getRegisteredTranslators()) {
- server.registerTranslator(translator);
- getLogger().debug("Registered Translator: " + translator.getName());
- }
GeyserConnector.getInstance().getBedrockServer().close();
bedrockServer.set(GeyserConnector.getInstance(), server);
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 9fdcb97..ab70cc8 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
@@ -18,26 +18,36 @@
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.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 lombok.RequiredArgsConstructor;
import org.geysermc.connector.GeyserConnector;
-import org.geysermc.connector.extension.GeyserExtension;
import org.geysermc.connector.network.BedrockProtocol;
import java.net.InetSocketAddress;
@RequiredArgsConstructor
public class BedrockEdition implements Edition {
- private final GeyserExtension extension;
+ private final GeyserReversionExtension extension;
@Override
public ReversionServer createReversionServer(InetSocketAddress address) {
extension.getLogger().info("BedrockServer listening on " + address.toString());
- ReversionServer server = new BedrockReversionServer("bedrock", BedrockProtocol.DEFAULT_BEDROCK_CODEC, address);
+ BedrockReversionServer server = new BedrockReversionServer("geyser-bedrock", BedrockProtocol.DEFAULT_BEDROCK_CODEC, address);
server.setHandler(new BedrockServerEventHandler(GeyserConnector.getInstance()));
+
+ for (RegisteredTranslator translator : extension.getRegisteredTranslators()) {
+ if (translator instanceof BedrockRegisteredTranslator) {
+ server.registerTranslator((BedrockRegisteredTranslator) translator);
+ }
+ extension.getLogger().debug("Registered Translator: " + translator.getName());
+ }
+
return server;
}
}
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 13a92b1..922c092 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
@@ -18,17 +18,19 @@
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.education.commands.EducationCommand;
+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 lombok.Getter;
import org.geysermc.connector.GeyserConnector;
import org.geysermc.connector.event.annotations.GeyserEventHandler;
import org.geysermc.connector.event.events.geyser.GeyserStartEvent;
-import org.geysermc.connector.extension.GeyserExtension;
import org.geysermc.connector.network.BedrockProtocol;
import java.io.File;
@@ -36,10 +38,10 @@
@Getter
public class EducationEdition implements Edition {
- private final GeyserExtension extension;
+ private final GeyserReversionExtension extension;
private final TokenManager tokenManager;
- public EducationEdition(GeyserExtension extension) {
+ public EducationEdition(GeyserReversionExtension extension) {
this.extension = extension;
this.tokenManager = new TokenManager(new File(extension.getDataFolder(), "tokens.yml"));
@@ -58,8 +60,16 @@ public void onGeyserStart(GeyserStartEvent event) {
@Override
public ReversionServer createReversionServer(InetSocketAddress address) {
extension.getLogger().info("EducationServer listening on " + address.toString());
- ReversionServer server = new EducationReversionServer("bedrock", BedrockProtocol.DEFAULT_BEDROCK_CODEC, tokenManager, address);
+ EducationReversionServer server = new EducationReversionServer("geyser-bedrock", BedrockProtocol.DEFAULT_BEDROCK_CODEC, tokenManager, address);
server.setHandler(new BedrockServerEventHandler(GeyserConnector.getInstance()));
+
+ for (RegisteredTranslator translator : extension.getRegisteredTranslators()) {
+ if (translator instanceof BedrockRegisteredTranslator) {
+ server.registerTranslator((BedrockRegisteredTranslator) translator);
+ }
+ extension.getLogger().debug("Registered Translator: " + translator.getName());
+ }
+
return server;
}
}
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
new file mode 100644
index 0000000..739df1f
--- /dev/null
+++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/translators/geyser/v408/Register_Geyser_v408.java
@@ -0,0 +1,52 @@
+/*
+ * 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
new file mode 100644
index 0000000..4f96bba
--- /dev/null
+++ b/geyser-reversion/src/main/java/au/com/grieve/geyser/reversion/translators/geyser/v408/handlers/StartGameHandler_Geyser_v408.java
@@ -0,0 +1,83 @@
+/*
+ * 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 ced8301..eb86960 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,7 +38,7 @@
1.8
1.8
UTF-8
- 1.0.9
+ 1.0.10