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 d17adb2..bebbc4b 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 @@ -38,6 +38,9 @@ import java.net.InetSocketAddress; import java.util.Arrays; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; @RequiredArgsConstructor public class BedrockEdition implements Edition { @@ -47,12 +50,19 @@ public class BedrockEdition implements Edition { public ReversionServer createReversionServer(InetSocketAddress address) { extension.getLogger().info("BedrockServer listening on " + address.toString()); - BedrockPacketCodec defaultCodec = Arrays.stream(Build.PROTOCOLS) - .filter(p -> p.getProtocolVersion() == BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) - .findFirst() - .orElseThrow(() -> new RuntimeException("Unsupported Geyser")); + Set supportedCodecs = BedrockProtocol.SUPPORTED_BEDROCK_CODECS.stream() + .map(c -> Arrays.stream(Build.PROTOCOLS) + .filter(b -> c.getProtocolVersion() == b.getProtocolVersion()) + .findFirst() + .orElse(null)) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); - BedrockReversionServer server = new BedrockReversionServer(defaultCodec, address); + if (supportedCodecs.size() == 0) { + throw new RuntimeException("Unsupported Geyser"); + } + + BedrockReversionServer server = new BedrockReversionServer(supportedCodecs, address); server.setHandler(new BedrockEditionServerEventHandler(extension)); for (RegisteredTranslator translator : extension.getRegisteredTranslators()) { 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 index 8388926..4ded3fe 100644 --- 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 @@ -32,7 +32,6 @@ 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; @@ -52,8 +51,8 @@ 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, serverSession); - com.nukkitx.protocol.bedrock.BedrockPacket translated = BedrockProtocol.DEFAULT_BEDROCK_CODEC.tryDecode(buffer, serverSession.getServer().getToCodec().getId(original.getClass())); + facadeSession.getTranslatedCodec().tryEncode(buffer, original, serverSession); + com.nukkitx.protocol.bedrock.BedrockPacket translated = facadeSession.getOriginalCodec().tryDecode(buffer, facadeSession.getTranslatedCodec().getId(original.getClass())); buffer.release(); 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 364e479..e49d0dd 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 @@ -44,6 +44,8 @@ import java.io.File; import java.net.InetSocketAddress; import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; @Getter public class EducationEdition implements Edition { @@ -70,12 +72,18 @@ public void onGeyserStart(GeyserStartEvent event) { public ReversionServer createReversionServer(InetSocketAddress address) { extension.getLogger().info("EducationServer listening on " + address.toString()); - BedrockPacketCodec defaultCodec = Arrays.stream(Build.PROTOCOLS) - .filter(p -> p.getProtocolVersion() == BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) - .findFirst() - .orElseThrow(() -> new RuntimeException("Unsupported Geyser")); + Set supportedCodecs = BedrockProtocol.SUPPORTED_BEDROCK_CODECS.stream() + .map(c -> Arrays.stream(Build.PROTOCOLS) + .filter(b -> c.getProtocolVersion() == b.getProtocolVersion()) + .findFirst() + .orElse(null)) + .collect(Collectors.toSet()); - EducationReversionServer server = new EducationReversionServer(defaultCodec, tokenManager, address); + if (supportedCodecs.size() == 0) { + throw new RuntimeException("Unsupported Geyser"); + } + + EducationReversionServer server = new EducationReversionServer(supportedCodecs, tokenManager, address); server.setHandler(new BedrockEditionServerEventHandler(extension)); for (RegisteredTranslator translator : extension.getRegisteredTranslators()) { 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 index d641e47..2fdd4c1 100644 --- 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 @@ -24,12 +24,15 @@ package au.com.grieve.geyser.reversion.server; +import au.com.grieve.reversion.Build; import au.com.grieve.reversion.editions.bedrock.BedrockReversionSession; import com.nukkitx.network.util.DisconnectReason; import com.nukkitx.protocol.bedrock.BedrockPacket; +import com.nukkitx.protocol.bedrock.BedrockPacketCodec; import com.nukkitx.protocol.bedrock.BedrockServerSession; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; +import lombok.Getter; import org.geysermc.connector.network.BedrockProtocol; import javax.annotation.Nonnull; @@ -37,18 +40,28 @@ import javax.annotation.ParametersAreNonnullByDefault; import javax.crypto.SecretKey; import java.net.InetSocketAddress; +import java.util.Arrays; import java.util.Collection; import java.util.function.Consumer; +@Getter @ParametersAreNonnullByDefault public class GeyserServerSession extends BedrockServerSession { protected final BedrockReversionSession reversionSession; + BedrockPacketCodec originalCodec; + au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockPacketCodec translatedCodec; + public GeyserServerSession(BedrockReversionSession reversionSession) { super(null, null, null); this.reversionSession = reversionSession; + originalCodec = BedrockProtocol.DEFAULT_BEDROCK_CODEC; + translatedCodec = Arrays.stream(Build.PROTOCOLS) + .filter(c -> c.getProtocolVersion() == originalCodec.getProtocolVersion()) + .findFirst() + .orElseThrow(() -> new RuntimeException("Unsupported Geyser")); } @Override @@ -56,8 +69,8 @@ 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()), reversionSession); + originalCodec.tryEncode(buffer, original); + au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockPacket translated = translatedCodec.tryDecode(buffer, BedrockProtocol.DEFAULT_BEDROCK_CODEC.getId(original.getClass()), reversionSession); buffer.release(); reversionSession.sendPacket(translated); } @@ -67,8 +80,8 @@ 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()), reversionSession); + originalCodec.tryEncode(buffer, original); + au.com.grieve.reversion.shaded.nukkitx.protocol.bedrock.BedrockPacket translated = translatedCodec.tryDecode(buffer, BedrockProtocol.DEFAULT_BEDROCK_CODEC.getId(original.getClass()), reversionSession); buffer.release(); reversionSession.sendPacketImmediately(translated); diff --git a/pom.xml b/pom.xml index eb58329..614099d 100644 --- a/pom.xml +++ b/pom.xml @@ -44,7 +44,7 @@ 1.8 1.8 UTF-8 - 1.0.20 + 1.0.21