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