mirror of
https://github.com/GeyserMC/GeyserConnect.git
synced 2025-06-26 06:15:21 +02:00
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>
|
<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>
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue