forked from git-mirrors/GeyserConnect
Support Bedrock 1.19.30
This commit is contained in:
parent
c8961ff363
commit
6445810297
7 changed files with 87 additions and 34 deletions
4
pom.xml
4
pom.xml
|
@ -66,9 +66,9 @@
|
|||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.geysermc</groupId>
|
||||
<groupId>org.geysermc.geyser</groupId>
|
||||
<artifactId>core</artifactId>
|
||||
<version>2.0.7-SNAPSHOT</version>
|
||||
<version>2.1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.minecrell</groupId>
|
||||
|
|
|
@ -35,7 +35,7 @@ import org.geysermc.connect.storage.AbstractStorageManager;
|
|||
import org.geysermc.connect.storage.DisabledStorageManager;
|
||||
import org.geysermc.connect.utils.*;
|
||||
import org.geysermc.geyser.GeyserImpl;
|
||||
import org.geysermc.geyser.network.MinecraftProtocol;
|
||||
import org.geysermc.geyser.network.GameProtocol;
|
||||
import org.geysermc.geyser.util.FileUtils;
|
||||
|
||||
import java.io.File;
|
||||
|
@ -154,8 +154,8 @@ public class MasterServer {
|
|||
bdPong.setMaximumPlayerCount(geyserConnectConfig.getMaxPlayers());
|
||||
bdPong.setGameType("Survival");
|
||||
bdPong.setIpv4Port(port);
|
||||
bdPong.setProtocolVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion());
|
||||
bdPong.setVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion());
|
||||
bdPong.setProtocolVersion(GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion());
|
||||
bdPong.setVersion(GameProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion());
|
||||
return bdPong;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,10 +39,12 @@ import com.nukkitx.protocol.bedrock.BedrockPacketCodec;
|
|||
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
||||
import com.nukkitx.protocol.bedrock.data.AttributeData;
|
||||
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.packet.*;
|
||||
import com.nukkitx.protocol.bedrock.util.EncryptionUtils;
|
||||
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.ui.FormID;
|
||||
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.SimpleFormResponse;
|
||||
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.network.MinecraftProtocol;
|
||||
import org.geysermc.geyser.network.GameProtocol;
|
||||
import org.geysermc.geyser.registry.Registries;
|
||||
import org.geysermc.geyser.session.PendingMicrosoftAuthentication.*;
|
||||
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.util.FileUtils;
|
||||
|
||||
|
@ -96,20 +99,34 @@ public class PacketHandler implements BedrockPacketHandler {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean handle(LoginPacket packet) {
|
||||
masterServer.getLogger().debug("Login: " + packet.toString());
|
||||
private boolean checkedProtocol = false;
|
||||
|
||||
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) {
|
||||
session.setPacketCodec(MinecraftProtocol.DEFAULT_BEDROCK_CODEC);
|
||||
session.setPacketCodec(GameProtocol.DEFAULT_BEDROCK_CODEC);
|
||||
|
||||
String message = "disconnectionScreen.internalError.cantConnect";
|
||||
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);
|
||||
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);
|
||||
message = "disconnectionScreen.outdatedClient";
|
||||
}
|
||||
|
@ -121,6 +138,19 @@ public class PacketHandler implements BedrockPacketHandler {
|
|||
|
||||
// Set the session codec
|
||||
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
|
||||
JsonNode rawChainData;
|
||||
|
@ -224,9 +254,7 @@ public class PacketHandler implements BedrockPacketHandler {
|
|||
int port = task.getPort();
|
||||
player.setCurrentServer(new Server(address, port, true, false));
|
||||
GeyserProxySession session = player.createGeyserSession(false);
|
||||
session.setRemoteAddress(address);
|
||||
session.setRemotePort(port);
|
||||
session.setRemoteAuthType(AuthType.ONLINE);
|
||||
session.remoteServer(player.getCurrentServer());
|
||||
|
||||
session.onMicrosoftLoginComplete(task);
|
||||
} else {
|
||||
|
@ -239,7 +267,7 @@ public class PacketHandler implements BedrockPacketHandler {
|
|||
stack.setForcedToAccept(false);
|
||||
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
|
||||
stack.getExperiments().add(new ExperimentData("data_driven_items", true));
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ import org.geysermc.connect.GeyserConnectConfig;
|
|||
import org.geysermc.connect.MasterServer;
|
||||
import org.geysermc.geyser.GeyserBootstrap;
|
||||
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.dump.BootstrapDumpInfo;
|
||||
import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough;
|
||||
|
@ -92,7 +92,8 @@ public class GeyserProxyBootstrap implements GeyserBootstrap {
|
|||
GeyserConfiguration.checkGeyserConfiguration(geyserConfig, geyserLogger);
|
||||
|
||||
// Create the connector and command manager
|
||||
geyser = GeyserImpl.start(PlatformType.STANDALONE, this);
|
||||
geyser = GeyserImpl.load(PlatformType.STANDALONE, this);
|
||||
GeyserImpl.start();
|
||||
geyserCommandManager = new GeyserProxyCommandManager(geyser);
|
||||
|
||||
// Start the ping passthrough thread, again don't think there is a point
|
||||
|
@ -118,7 +119,7 @@ public class GeyserProxyBootstrap implements GeyserBootstrap {
|
|||
}
|
||||
|
||||
@Override
|
||||
public CommandManager getGeyserCommandManager() {
|
||||
public GeyserCommandManager getGeyserCommandManager() {
|
||||
return geyserCommandManager;
|
||||
}
|
||||
|
||||
|
|
|
@ -26,16 +26,16 @@
|
|||
package org.geysermc.connect.proxy;
|
||||
|
||||
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) {
|
||||
super(geyser);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDescription(String command) {
|
||||
public String description(String command) {
|
||||
return ""; // this is not sent over the protocol, so we return none
|
||||
}
|
||||
}
|
||||
|
|
|
@ -33,7 +33,6 @@ import com.nukkitx.nbt.NbtMap;
|
|||
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
||||
import com.nukkitx.protocol.bedrock.data.*;
|
||||
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.Long2ObjectOpenHashMap;
|
||||
import lombok.Getter;
|
||||
|
@ -43,13 +42,12 @@ import org.geysermc.connect.proxy.GeyserProxySession;
|
|||
import org.geysermc.connect.ui.FormID;
|
||||
import org.geysermc.cumulus.Form;
|
||||
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.registry.BlockRegistries;
|
||||
import org.geysermc.geyser.registry.Registries;
|
||||
import org.geysermc.geyser.registry.type.ItemMappings;
|
||||
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.util.ChunkUtils;
|
||||
import org.geysermc.geyser.util.DimensionUtils;
|
||||
|
@ -159,9 +157,9 @@ public class Player {
|
|||
startGamePacket.setVanillaVersion("*");
|
||||
session.sendPacket(startGamePacket);
|
||||
|
||||
if (itemMappings.getFurnaceMinecartData() != null) {
|
||||
if (!itemMappings.getComponentItemData().isEmpty()) {
|
||||
ItemComponentPacket itemComponentPacket = new ItemComponentPacket();
|
||||
itemComponentPacket.getItems().add(itemMappings.getFurnaceMinecartData());
|
||||
itemComponentPacket.getItems().addAll(itemMappings.getComponentItemData());
|
||||
session.sendPacket(itemComponentPacket);
|
||||
}
|
||||
|
||||
|
@ -242,9 +240,7 @@ public class Player {
|
|||
|
||||
geyserSession.setDimension(DimensionUtils.THE_END);
|
||||
|
||||
geyserSession.setRemoteAddress(currentServer.getAddress());
|
||||
geyserSession.setRemotePort(currentServer.getPort());
|
||||
geyserSession.setRemoteAuthType(currentServer.isOnline() ? AuthType.ONLINE : AuthType.OFFLINE);
|
||||
geyserSession.remoteServer(currentServer);
|
||||
|
||||
// Tell Geyser to handle the login
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -29,12 +29,15 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
|
|||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
||||
import org.geysermc.cumulus.util.FormImage;
|
||||
import org.geysermc.geyser.api.network.AuthType;
|
||||
import org.geysermc.geyser.api.network.RemoteServer;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class Server {
|
||||
public class Server implements RemoteServer {
|
||||
|
||||
private String address;
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue