Skip to content

Commit

Permalink
Implement support for Minecraft v1.16.200
Browse files Browse the repository at this point in the history
* Bump Reversion library to 1.0.21 - Provides v402 + Multiple Codecs
* Now allow all Geyser supported codecs to be used to determine the toCodec of the server

Squashed commit of the following:

commit 1e0bbb48d2e0f14cb6d971e639e2833625ac7780
Author: bundabrg <bundabrg@grieve.com.au>
Date:   Wed Dec 9 10:05:58 2020 +0800

    Initial look at multiple codecs
  • Loading branch information
bundabrg committed Dec 9, 2020
1 parent 314c777 commit 9c22238
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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<BedrockPacketCodec> 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()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;


Expand All @@ -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();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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<BedrockPacketCodec> 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()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,40 +24,53 @@

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;
import javax.annotation.Nullable;
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
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);
}
Expand All @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<reversion.version>1.0.20</reversion.version>
<reversion.version>1.0.21</reversion.version>
</properties>

<build>
Expand Down

0 comments on commit 9c22238

Please sign in to comment.