Support Bedrock 1.19.30

This commit is contained in:
Camotoy 2022-09-20 16:23:05 -04:00
parent c8961ff363
commit 6445810297
No known key found for this signature in database
GPG key ID: 7EEFB66FE798081F
7 changed files with 87 additions and 34 deletions

View file

@ -66,9 +66,9 @@
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.geysermc</groupId> <groupId>org.geysermc.geyser</groupId>
<artifactId>core</artifactId> <artifactId>core</artifactId>
<version>2.0.7-SNAPSHOT</version> <version>2.1.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.minecrell</groupId> <groupId>net.minecrell</groupId>

View file

@ -35,7 +35,7 @@ import org.geysermc.connect.storage.AbstractStorageManager;
import org.geysermc.connect.storage.DisabledStorageManager; import org.geysermc.connect.storage.DisabledStorageManager;
import org.geysermc.connect.utils.*; import org.geysermc.connect.utils.*;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.network.MinecraftProtocol; import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.FileUtils;
import java.io.File; import java.io.File;
@ -154,8 +154,8 @@ public class MasterServer {
bdPong.setMaximumPlayerCount(geyserConnectConfig.getMaxPlayers()); bdPong.setMaximumPlayerCount(geyserConnectConfig.getMaxPlayers());
bdPong.setGameType("Survival"); bdPong.setGameType("Survival");
bdPong.setIpv4Port(port); bdPong.setIpv4Port(port);
bdPong.setProtocolVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()); bdPong.setProtocolVersion(GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion());
bdPong.setVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion()); bdPong.setVersion(GameProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion());
return bdPong; return bdPong;
} }

View file

@ -39,10 +39,12 @@ import com.nukkitx.protocol.bedrock.BedrockPacketCodec;
import com.nukkitx.protocol.bedrock.BedrockServerSession; import com.nukkitx.protocol.bedrock.BedrockServerSession;
import com.nukkitx.protocol.bedrock.data.AttributeData; import com.nukkitx.protocol.bedrock.data.AttributeData;
import com.nukkitx.protocol.bedrock.data.ExperimentData; import com.nukkitx.protocol.bedrock.data.ExperimentData;
import com.nukkitx.protocol.bedrock.data.PacketCompressionAlgorithm;
import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler; import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler;
import com.nukkitx.protocol.bedrock.packet.*; import com.nukkitx.protocol.bedrock.packet.*;
import com.nukkitx.protocol.bedrock.util.EncryptionUtils; import com.nukkitx.protocol.bedrock.util.EncryptionUtils;
import com.nukkitx.protocol.bedrock.v471.Bedrock_v471; import com.nukkitx.protocol.bedrock.v471.Bedrock_v471;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.connect.proxy.GeyserProxySession; import org.geysermc.connect.proxy.GeyserProxySession;
import org.geysermc.connect.ui.FormID; import org.geysermc.connect.ui.FormID;
import org.geysermc.connect.ui.UIHandler; import org.geysermc.connect.ui.UIHandler;
@ -54,12 +56,13 @@ import org.geysermc.cumulus.response.CustomFormResponse;
import org.geysermc.cumulus.response.FormResponse; import org.geysermc.cumulus.response.FormResponse;
import org.geysermc.cumulus.response.SimpleFormResponse; import org.geysermc.cumulus.response.SimpleFormResponse;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.api.network.AuthType;
import org.geysermc.geyser.api.network.RemoteServer;
import org.geysermc.geyser.entity.attribute.GeyserAttributeType; import org.geysermc.geyser.entity.attribute.GeyserAttributeType;
import org.geysermc.geyser.network.MinecraftProtocol; import org.geysermc.geyser.network.GameProtocol;
import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.session.PendingMicrosoftAuthentication.*; import org.geysermc.geyser.session.PendingMicrosoftAuthentication.*;
import org.geysermc.geyser.session.auth.AuthData; import org.geysermc.geyser.session.auth.AuthData;
import org.geysermc.geyser.session.auth.AuthType;
import org.geysermc.geyser.session.auth.BedrockClientData; import org.geysermc.geyser.session.auth.BedrockClientData;
import org.geysermc.geyser.util.FileUtils; import org.geysermc.geyser.util.FileUtils;
@ -96,20 +99,34 @@ public class PacketHandler implements BedrockPacketHandler {
} }
} }
@Override private boolean checkedProtocol = false;
public boolean handle(LoginPacket packet) {
masterServer.getLogger().debug("Login: " + packet.toString());
BedrockPacketCodec packetCodec = MinecraftProtocol.getBedrockCodec(packet.getProtocolVersion()); @Override
public boolean handle(RequestNetworkSettingsPacket packet) {
if (checkProtocol(packet.getProtocolVersion())) {
PacketCompressionAlgorithm algorithm = PacketCompressionAlgorithm.ZLIB;
NetworkSettingsPacket responsePacket = new NetworkSettingsPacket();
responsePacket.setCompressionAlgorithm(algorithm);
responsePacket.setCompressionThreshold(512);
session.sendPacketImmediately(responsePacket);
session.setCompression(algorithm);
}
return true;
}
private boolean checkProtocol(int protocolVersion) {
BedrockPacketCodec packetCodec = GameProtocol.getBedrockCodec(protocolVersion);
if (packetCodec == null) { if (packetCodec == null) {
session.setPacketCodec(MinecraftProtocol.DEFAULT_BEDROCK_CODEC); session.setPacketCodec(GameProtocol.DEFAULT_BEDROCK_CODEC);
String message = "disconnectionScreen.internalError.cantConnect"; String message = "disconnectionScreen.internalError.cantConnect";
PlayStatusPacket status = new PlayStatusPacket(); PlayStatusPacket status = new PlayStatusPacket();
if (packet.getProtocolVersion() > MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { if (protocolVersion > GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) {
status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_SERVER_OLD); status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_SERVER_OLD);
message = "disconnectionScreen.outdatedServer"; message = "disconnectionScreen.outdatedServer";
} else if (packet.getProtocolVersion() < MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { } else if (protocolVersion < GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) {
status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_CLIENT_OLD); status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_CLIENT_OLD);
message = "disconnectionScreen.outdatedClient"; message = "disconnectionScreen.outdatedClient";
} }
@ -121,6 +138,19 @@ public class PacketHandler implements BedrockPacketHandler {
// Set the session codec // Set the session codec
session.setPacketCodec(packetCodec); session.setPacketCodec(packetCodec);
return true;
}
@Override
public boolean handle(LoginPacket packet) {
masterServer.getLogger().debug("Login: " + packet.toString());
if (!checkedProtocol) {
if (!checkProtocol(packet.getProtocolVersion())) {
return false;
}
checkedProtocol = true;
}
// Read the raw chain data // Read the raw chain data
JsonNode rawChainData; JsonNode rawChainData;
@ -224,9 +254,7 @@ public class PacketHandler implements BedrockPacketHandler {
int port = task.getPort(); int port = task.getPort();
player.setCurrentServer(new Server(address, port, true, false)); player.setCurrentServer(new Server(address, port, true, false));
GeyserProxySession session = player.createGeyserSession(false); GeyserProxySession session = player.createGeyserSession(false);
session.setRemoteAddress(address); session.remoteServer(player.getCurrentServer());
session.setRemotePort(port);
session.setRemoteAuthType(AuthType.ONLINE);
session.onMicrosoftLoginComplete(task); session.onMicrosoftLoginComplete(task);
} else { } else {
@ -239,7 +267,7 @@ public class PacketHandler implements BedrockPacketHandler {
stack.setForcedToAccept(false); stack.setForcedToAccept(false);
stack.setGameVersion("*"); stack.setGameVersion("*");
if (Registries.ITEMS.forVersion(session.getPacketCodec().getProtocolVersion()).getFurnaceMinecartData() != null) { if (!Registries.ITEMS.forVersion(session.getPacketCodec().getProtocolVersion()).getComponentItemData().isEmpty()) {
// Allow custom items to work // Allow custom items to work
stack.getExperiments().add(new ExperimentData("data_driven_items", true)); stack.getExperiments().add(new ExperimentData("data_driven_items", true));
} }

View file

@ -32,7 +32,7 @@ import org.geysermc.connect.GeyserConnectConfig;
import org.geysermc.connect.MasterServer; import org.geysermc.connect.MasterServer;
import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserBootstrap;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.command.CommandManager; import org.geysermc.geyser.command.GeyserCommandManager;
import org.geysermc.geyser.configuration.GeyserConfiguration; import org.geysermc.geyser.configuration.GeyserConfiguration;
import org.geysermc.geyser.dump.BootstrapDumpInfo; import org.geysermc.geyser.dump.BootstrapDumpInfo;
import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough; import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough;
@ -92,7 +92,8 @@ public class GeyserProxyBootstrap implements GeyserBootstrap {
GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger); GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger);
// Create the connector and command manager // Create the connector and command manager
geyser = GeyserImpl.start(PlatformType.STANDALONE, this); geyser = GeyserImpl.load(PlatformType.STANDALONE, this);
GeyserImpl.start();
geyserCommandManager = new GeyserProxyCommandManager(geyser); geyserCommandManager = new GeyserProxyCommandManager(geyser);
// Start the ping passthrough thread, again don't think there is a point // Start the ping passthrough thread, again don't think there is a point
@ -118,7 +119,7 @@ public class GeyserProxyBootstrap implements GeyserBootstrap {
} }
@Override @Override
public CommandManager getGeyserCommandManager() { public GeyserCommandManager getGeyserCommandManager() {
return geyserCommandManager; return geyserCommandManager;
} }

View file

@ -26,16 +26,16 @@
package org.geysermc.connect.proxy; package org.geysermc.connect.proxy;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.command.CommandManager; import org.geysermc.geyser.command.GeyserCommandManager;
public class GeyserProxyCommandManager extends CommandManager { public class GeyserProxyCommandManager extends GeyserCommandManager {
public GeyserProxyCommandManager(GeyserImpl geyser) { public GeyserProxyCommandManager(GeyserImpl geyser) {
super(geyser); super(geyser);
} }
@Override @Override
public String getDescription(String command) { public String description(String command) {
return ""; // this is not sent over the protocol, so we return none return ""; // this is not sent over the protocol, so we return none
} }
} }

View file

@ -33,7 +33,6 @@ import com.nukkitx.nbt.NbtMap;
import com.nukkitx.protocol.bedrock.BedrockServerSession; import com.nukkitx.protocol.bedrock.BedrockServerSession;
import com.nukkitx.protocol.bedrock.data.*; import com.nukkitx.protocol.bedrock.data.*;
import com.nukkitx.protocol.bedrock.packet.*; import com.nukkitx.protocol.bedrock.packet.*;
import com.nukkitx.protocol.bedrock.v471.Bedrock_v471;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import lombok.Getter; import lombok.Getter;
@ -43,13 +42,12 @@ import org.geysermc.connect.proxy.GeyserProxySession;
import org.geysermc.connect.ui.FormID; import org.geysermc.connect.ui.FormID;
import org.geysermc.cumulus.Form; import org.geysermc.cumulus.Form;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.level.BedrockDimension; import org.geysermc.geyser.api.network.AuthType;
import org.geysermc.geyser.network.UpstreamPacketHandler; import org.geysermc.geyser.network.UpstreamPacketHandler;
import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.registry.BlockRegistries;
import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.registry.type.ItemMappings; import org.geysermc.geyser.registry.type.ItemMappings;
import org.geysermc.geyser.session.auth.AuthData; import org.geysermc.geyser.session.auth.AuthData;
import org.geysermc.geyser.session.auth.AuthType;
import org.geysermc.geyser.session.auth.BedrockClientData; import org.geysermc.geyser.session.auth.BedrockClientData;
import org.geysermc.geyser.util.ChunkUtils; import org.geysermc.geyser.util.ChunkUtils;
import org.geysermc.geyser.util.DimensionUtils; import org.geysermc.geyser.util.DimensionUtils;
@ -159,9 +157,9 @@ public class Player {
startGamePacket.setVanillaVersion("*"); startGamePacket.setVanillaVersion("*");
session.sendPacket(startGamePacket); session.sendPacket(startGamePacket);
if (itemMappings.getFurnaceMinecartData() != null) { if (!itemMappings.getComponentItemData().isEmpty()) {
ItemComponentPacket itemComponentPacket = new ItemComponentPacket(); ItemComponentPacket itemComponentPacket = new ItemComponentPacket();
itemComponentPacket.getItems().add(itemMappings.getFurnaceMinecartData()); itemComponentPacket.getItems().addAll(itemMappings.getComponentItemData());
session.sendPacket(itemComponentPacket); session.sendPacket(itemComponentPacket);
} }
@ -242,9 +240,7 @@ public class Player {
geyserSession.setDimension(DimensionUtils.THE_END); geyserSession.setDimension(DimensionUtils.THE_END);
geyserSession.setRemoteAddress(currentServer.getAddress()); geyserSession.remoteServer(currentServer);
geyserSession.setRemotePort(currentServer.getPort());
geyserSession.setRemoteAuthType(currentServer.isOnline() ? AuthType.ONLINE : AuthType.OFFLINE);
// Tell Geyser to handle the login // Tell Geyser to handle the login
SetLocalPlayerAsInitializedPacket initializedPacket = new SetLocalPlayerAsInitializedPacket(); SetLocalPlayerAsInitializedPacket initializedPacket = new SetLocalPlayerAsInitializedPacket();
@ -258,7 +254,7 @@ public class Player {
} }
} }
if (geyserSession.getRemoteAuthType() != AuthType.ONLINE) { if (geyserSession.remoteServer().authType() != AuthType.ONLINE) {
geyserSession.authenticate(geyserSession.getAuthData().name()); geyserSession.authenticate(geyserSession.getAuthData().name());
} }
} }

View file

@ -29,12 +29,15 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.geysermc.cumulus.util.FormImage; import org.geysermc.cumulus.util.FormImage;
import org.geysermc.geyser.api.network.AuthType;
import org.geysermc.geyser.api.network.RemoteServer;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class Server { public class Server implements RemoteServer {
private String address; private String address;
private int port = -1; private int port = -1;
@ -85,4 +88,29 @@ public class Server {
return FormImage.of(FormImage.Type.URL, "https://eu.mc-api.net/v3/server/favicon/" + address + ":" + port + ".png?use-fallback-icon=true"); return FormImage.of(FormImage.Type.URL, "https://eu.mc-api.net/v3/server/favicon/" + address + ":" + port + ".png?use-fallback-icon=true");
} }
} }
@Override
public String address() {
return address;
}
@Override
public int port() {
return port;
}
@Override
public @NonNull AuthType authType() {
return this.online ? AuthType.ONLINE : AuthType.OFFLINE;
}
@Override
public String minecraftVersion() {
return null;
}
@Override
public int protocolVersion() {
return 0;
}
} }