mirror of
https://github.com/GeyserMC/GeyserConnect.git
synced 2025-06-26 14:15:22 +02:00
Update to 1.18
This commit is contained in:
parent
1f9f2e1eb5
commit
d8ce39636b
15 changed files with 105 additions and 162 deletions
4
pom.xml
4
pom.xml
|
@ -67,8 +67,8 @@
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.geysermc</groupId>
|
<groupId>org.geysermc</groupId>
|
||||||
<artifactId>connector</artifactId>
|
<artifactId>core</artifactId>
|
||||||
<version>1.4.3-SNAPSHOT</version>
|
<version>2.0.0-SNAPSHOT</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.nukkitx.network</groupId>
|
<groupId>com.nukkitx.network</groupId>
|
||||||
|
|
|
@ -30,16 +30,16 @@ import io.netty.channel.DefaultEventLoopGroup;
|
||||||
import io.netty.util.concurrent.DefaultThreadFactory;
|
import io.netty.util.concurrent.DefaultThreadFactory;
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
|
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.geysermc.connect.storage.DisabledStorageManager;
|
|
||||||
import org.geysermc.connect.utils.Server;
|
|
||||||
import org.geysermc.connect.utils.ServerCategory;
|
|
||||||
import org.geysermc.connector.GeyserConnector;
|
|
||||||
import org.geysermc.connector.network.BedrockProtocol;
|
|
||||||
import org.geysermc.connector.utils.FileUtils;
|
|
||||||
import org.geysermc.connect.proxy.GeyserProxyBootstrap;
|
import org.geysermc.connect.proxy.GeyserProxyBootstrap;
|
||||||
import org.geysermc.connect.storage.AbstractStorageManager;
|
import org.geysermc.connect.storage.AbstractStorageManager;
|
||||||
|
import org.geysermc.connect.storage.DisabledStorageManager;
|
||||||
import org.geysermc.connect.utils.Logger;
|
import org.geysermc.connect.utils.Logger;
|
||||||
import org.geysermc.connect.utils.Player;
|
import org.geysermc.connect.utils.Player;
|
||||||
|
import org.geysermc.connect.utils.Server;
|
||||||
|
import org.geysermc.connect.utils.ServerCategory;
|
||||||
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
|
import org.geysermc.geyser.network.MinecraftProtocol;
|
||||||
|
import org.geysermc.geyser.util.FileUtils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -142,7 +142,7 @@ public class MasterServer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BedrockPong onQuery(InetSocketAddress address) {
|
public BedrockPong onQuery(InetSocketAddress address) {
|
||||||
int playerCount = players.size() + GeyserConnector.getInstance().getSessionManager().size();
|
int playerCount = players.size() + GeyserImpl.getInstance().getSessionManager().size();
|
||||||
|
|
||||||
String subMotd = geyserConnectConfig.getSubmotd();
|
String subMotd = geyserConnectConfig.getSubmotd();
|
||||||
if (subMotd == null || subMotd.isEmpty()) {
|
if (subMotd == null || subMotd.isEmpty()) {
|
||||||
|
@ -157,8 +157,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(BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion());
|
bdPong.setProtocolVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion());
|
||||||
bdPong.setVersion(BedrockProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion());
|
bdPong.setVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion());
|
||||||
return bdPong;
|
return bdPong;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,7 +191,7 @@ public class MasterServer {
|
||||||
public void createGeyserProxy() {
|
public void createGeyserProxy() {
|
||||||
if (geyserProxy == null) {
|
if (geyserProxy == null) {
|
||||||
// Make sure Geyser doesn't start the listener
|
// Make sure Geyser doesn't start the listener
|
||||||
GeyserConnector.setShouldStartListener(false);
|
GeyserImpl.setShouldStartListener(false);
|
||||||
|
|
||||||
this.geyserProxy = new GeyserProxyBootstrap();
|
this.geyserProxy = new GeyserProxyBootstrap();
|
||||||
geyserProxy.onEnable();
|
geyserProxy.onEnable();
|
||||||
|
|
|
@ -42,20 +42,21 @@ import com.nukkitx.protocol.bedrock.data.ExperimentData;
|
||||||
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 org.geysermc.connect.ui.FormID;
|
import org.geysermc.connect.ui.FormID;
|
||||||
import org.geysermc.connect.ui.UIHandler;
|
import org.geysermc.connect.ui.UIHandler;
|
||||||
import org.geysermc.connect.utils.Player;
|
import org.geysermc.connect.utils.Player;
|
||||||
import org.geysermc.connect.utils.Server;
|
import org.geysermc.connect.utils.Server;
|
||||||
import org.geysermc.connector.entity.attribute.GeyserAttributeType;
|
|
||||||
import org.geysermc.connector.network.BedrockProtocol;
|
|
||||||
import org.geysermc.connector.network.session.auth.AuthData;
|
|
||||||
import org.geysermc.connector.network.session.auth.BedrockClientData;
|
|
||||||
import org.geysermc.connector.registry.Registries;
|
|
||||||
import org.geysermc.connector.utils.FileUtils;
|
|
||||||
import org.geysermc.cumulus.Form;
|
import org.geysermc.cumulus.Form;
|
||||||
import org.geysermc.cumulus.response.CustomFormResponse;
|
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.entity.attribute.GeyserAttributeType;
|
||||||
|
import org.geysermc.geyser.network.MinecraftProtocol;
|
||||||
|
import org.geysermc.geyser.registry.Registries;
|
||||||
|
import org.geysermc.geyser.session.auth.AuthData;
|
||||||
|
import org.geysermc.geyser.session.auth.BedrockClientData;
|
||||||
|
import org.geysermc.geyser.util.FileUtils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -83,7 +84,7 @@ public class PacketHandler implements BedrockPacketHandler {
|
||||||
|
|
||||||
public void disconnect(DisconnectReason reason) {
|
public void disconnect(DisconnectReason reason) {
|
||||||
if (player != null) {
|
if (player != null) {
|
||||||
masterServer.getLogger().info(player.getAuthData().getName() + " has disconnected from the master server (" + reason + ")");
|
masterServer.getLogger().info(player.getAuthData().name() + " has disconnected from the master server (" + reason + ")");
|
||||||
masterServer.getStorageManager().saveServers(player);
|
masterServer.getStorageManager().saveServers(player);
|
||||||
|
|
||||||
masterServer.getPlayers().remove(player);
|
masterServer.getPlayers().remove(player);
|
||||||
|
@ -94,16 +95,16 @@ public class PacketHandler implements BedrockPacketHandler {
|
||||||
public boolean handle(LoginPacket packet) {
|
public boolean handle(LoginPacket packet) {
|
||||||
masterServer.getLogger().debug("Login: " + packet.toString());
|
masterServer.getLogger().debug("Login: " + packet.toString());
|
||||||
|
|
||||||
BedrockPacketCodec packetCodec = BedrockProtocol.getBedrockCodec(packet.getProtocolVersion());
|
BedrockPacketCodec packetCodec = MinecraftProtocol.getBedrockCodec(packet.getProtocolVersion());
|
||||||
if (packetCodec == null) {
|
if (packetCodec == null) {
|
||||||
session.setPacketCodec(BedrockProtocol.DEFAULT_BEDROCK_CODEC);
|
session.setPacketCodec(MinecraftProtocol.DEFAULT_BEDROCK_CODEC);
|
||||||
|
|
||||||
String message = "disconnectionScreen.internalError.cantConnect";
|
String message = "disconnectionScreen.internalError.cantConnect";
|
||||||
PlayStatusPacket status = new PlayStatusPacket();
|
PlayStatusPacket status = new PlayStatusPacket();
|
||||||
if (packet.getProtocolVersion() > BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) {
|
if (packet.getProtocolVersion() > MinecraftProtocol.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() < BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) {
|
} else if (packet.getProtocolVersion() < MinecraftProtocol.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";
|
||||||
}
|
}
|
||||||
|
@ -207,7 +208,7 @@ public class PacketHandler implements BedrockPacketHandler {
|
||||||
public boolean handle(ResourcePackClientResponsePacket packet) {
|
public boolean handle(ResourcePackClientResponsePacket packet) {
|
||||||
switch (packet.getStatus()) {
|
switch (packet.getStatus()) {
|
||||||
case COMPLETED:
|
case COMPLETED:
|
||||||
masterServer.getLogger().info("Logged in " + player.getAuthData().getName() + " (" + player.getAuthData().getXboxUUID() + ", " + player.getAuthData().getUUID() + ")");
|
masterServer.getLogger().info("Logged in " + player.getAuthData().name() + " (" + player.getAuthData().xuid() + ", " + player.getAuthData().uuid() + ")");
|
||||||
player.sendStartGame();
|
player.sendStartGame();
|
||||||
break;
|
break;
|
||||||
case HAVE_ALL_PACKS:
|
case HAVE_ALL_PACKS:
|
||||||
|
@ -221,6 +222,11 @@ public class PacketHandler implements BedrockPacketHandler {
|
||||||
stack.getExperiments().add(new ExperimentData("data_driven_items", true));
|
stack.getExperiments().add(new ExperimentData("data_driven_items", true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (session.getPacketCodec().getProtocolVersion() <= Bedrock_v471.V471_CODEC.getProtocolVersion()) {
|
||||||
|
// Allow extended world height in the overworld to work for pre-1.18 clients
|
||||||
|
stack.getExperiments().add(new ExperimentData("caves_and_cliffs", true));
|
||||||
|
}
|
||||||
|
|
||||||
session.sendPacket(stack);
|
session.sendPacket(stack);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -233,7 +239,7 @@ public class PacketHandler implements BedrockPacketHandler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean handle(SetLocalPlayerAsInitializedPacket packet) {
|
public boolean handle(SetLocalPlayerAsInitializedPacket packet) {
|
||||||
masterServer.getLogger().debug("Player initialized: " + player.getAuthData().getName());
|
masterServer.getLogger().debug("Player initialized: " + player.getAuthData().name());
|
||||||
|
|
||||||
// Handle the virtual host if specified
|
// Handle the virtual host if specified
|
||||||
GeyserConnectConfig.VirtualHostSection vhost = MasterServer.getInstance().getGeyserConnectConfig().getVhost();
|
GeyserConnectConfig.VirtualHostSection vhost = MasterServer.getInstance().getGeyserConnectConfig().getVhost();
|
||||||
|
@ -264,7 +270,7 @@ public class PacketHandler implements BedrockPacketHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log the virtual host usage
|
// Log the virtual host usage
|
||||||
masterServer.getLogger().info(player.getAuthData().getName() + " is using virtualhost: " + address + ":" + port + (!online ? " (offline)" : ""));
|
masterServer.getLogger().info(player.getAuthData().name() + " is using virtualhost: " + address + ":" + port + (!online ? " (offline)" : ""));
|
||||||
|
|
||||||
// Send the player to the wanted server
|
// Send the player to the wanted server
|
||||||
player.sendToServer(new Server(address, port, online, false));
|
player.sendToServer(new Server(address, port, online, false));
|
||||||
|
|
|
@ -28,15 +28,15 @@ package org.geysermc.connect.proxy;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
|
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
|
||||||
import org.geysermc.common.PlatformType;
|
import org.geysermc.common.PlatformType;
|
||||||
import org.geysermc.connector.GeyserConnector;
|
|
||||||
import org.geysermc.connector.bootstrap.GeyserBootstrap;
|
|
||||||
import org.geysermc.connector.command.CommandManager;
|
|
||||||
import org.geysermc.connector.configuration.GeyserConfiguration;
|
|
||||||
import org.geysermc.connector.dump.BootstrapDumpInfo;
|
|
||||||
import org.geysermc.connector.ping.GeyserLegacyPingPassthrough;
|
|
||||||
import org.geysermc.connector.ping.IGeyserPingPassthrough;
|
|
||||||
import org.geysermc.connect.GeyserConnectConfig;
|
import org.geysermc.connect.GeyserConnectConfig;
|
||||||
import org.geysermc.connect.MasterServer;
|
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.configuration.GeyserConfiguration;
|
||||||
|
import org.geysermc.geyser.dump.BootstrapDumpInfo;
|
||||||
|
import org.geysermc.geyser.ping.GeyserLegacyPingPassthrough;
|
||||||
|
import org.geysermc.geyser.ping.IGeyserPingPassthrough;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -54,7 +54,7 @@ public class GeyserProxyBootstrap implements GeyserBootstrap {
|
||||||
private GeyserProxyLogger geyserLogger;
|
private GeyserProxyLogger geyserLogger;
|
||||||
private IGeyserPingPassthrough geyserPingPassthrough;
|
private IGeyserPingPassthrough geyserPingPassthrough;
|
||||||
|
|
||||||
private GeyserConnector connector;
|
private GeyserImpl geyser;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
|
@ -83,19 +83,19 @@ 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
|
||||||
connector = GeyserConnector.start(PlatformType.STANDALONE, this);
|
geyser = GeyserImpl.start(PlatformType.STANDALONE, this);
|
||||||
geyserCommandManager = new GeyserProxyCommandManager(connector);
|
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
|
||||||
geyserPingPassthrough = GeyserLegacyPingPassthrough.init(connector);
|
geyserPingPassthrough = GeyserLegacyPingPassthrough.init(geyser);
|
||||||
|
|
||||||
// Swap the normal handler to our custom handler so we can change some
|
// Swap the normal handler to our custom handler so we can change some
|
||||||
connector.getBedrockServer().setHandler(new ProxyConnectorServerEventHandler(connector));
|
geyser.getBedrockServer().setHandler(new ProxyConnectorServerEventHandler(geyser));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
connector.shutdown();
|
geyser.shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -25,13 +25,13 @@
|
||||||
|
|
||||||
package org.geysermc.connect.proxy;
|
package org.geysermc.connect.proxy;
|
||||||
|
|
||||||
import org.geysermc.connector.GeyserConnector;
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
import org.geysermc.connector.command.CommandManager;
|
import org.geysermc.geyser.command.CommandManager;
|
||||||
|
|
||||||
public class GeyserProxyCommandManager extends CommandManager {
|
public class GeyserProxyCommandManager extends CommandManager {
|
||||||
|
|
||||||
public GeyserProxyCommandManager(GeyserConnector connector) {
|
public GeyserProxyCommandManager(GeyserImpl geyser) {
|
||||||
super(connector);
|
super(geyser);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -27,7 +27,7 @@ package org.geysermc.connect.proxy;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.geysermc.connector.configuration.GeyserJacksonConfiguration;
|
import org.geysermc.geyser.configuration.GeyserJacksonConfiguration;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
|
|
|
@ -27,12 +27,13 @@ package org.geysermc.connect.proxy;
|
||||||
|
|
||||||
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
||||||
import io.netty.channel.EventLoop;
|
import io.netty.channel.EventLoop;
|
||||||
import org.geysermc.connector.GeyserConnector;
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
import org.geysermc.connector.network.session.GeyserSession;
|
import org.geysermc.geyser.session.GeyserSession;
|
||||||
|
|
||||||
public class GeyserProxySession extends GeyserSession {
|
public class GeyserProxySession extends GeyserSession {
|
||||||
public GeyserProxySession(GeyserConnector connector, BedrockServerSession bedrockServerSession, EventLoop eventLoop) {
|
public GeyserProxySession(GeyserImpl geyser, BedrockServerSession bedrockServerSession, EventLoop eventLoop) {
|
||||||
super(connector, bedrockServerSession, eventLoop);
|
super(geyser, bedrockServerSession, eventLoop);
|
||||||
|
sentSpawnPacket = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -26,17 +26,13 @@
|
||||||
package org.geysermc.connect.proxy;
|
package org.geysermc.connect.proxy;
|
||||||
|
|
||||||
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
import com.nukkitx.protocol.bedrock.BedrockServerSession;
|
||||||
import org.geysermc.connector.GeyserConnector;
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
import org.geysermc.connector.network.ConnectorServerEventHandler;
|
import org.geysermc.geyser.network.ConnectorServerEventHandler;
|
||||||
import org.geysermc.connect.MasterServer;
|
|
||||||
import org.geysermc.connect.utils.Player;
|
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
|
|
||||||
public class ProxyConnectorServerEventHandler extends ConnectorServerEventHandler {
|
public class ProxyConnectorServerEventHandler extends ConnectorServerEventHandler {
|
||||||
|
|
||||||
public ProxyConnectorServerEventHandler(GeyserConnector connector) {
|
public ProxyConnectorServerEventHandler(GeyserImpl geyser) {
|
||||||
super(connector);
|
super(geyser);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -51,7 +51,7 @@ public class JsonStorageManager extends AbstractStorageManager {
|
||||||
@Override
|
@Override
|
||||||
public void saveServers(Player player) {
|
public void saveServers(Player player) {
|
||||||
try {
|
try {
|
||||||
mapper.writeValue(dataFolder.resolve(player.getAuthData().getXboxUUID() + ".json").toFile(), player.getServers());
|
mapper.writeValue(dataFolder.resolve(player.getAuthData().xuid() + ".json").toFile(), player.getServers());
|
||||||
} catch (IOException ignored) { }
|
} catch (IOException ignored) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ public class JsonStorageManager extends AbstractStorageManager {
|
||||||
List<Server> servers = new ArrayList<>();
|
List<Server> servers = new ArrayList<>();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
List<Server> loadedServers = mapper.readValue(dataFolder.resolve(player.getAuthData().getXboxUUID() + ".json").toFile(), new TypeReference<List<Server>>(){});
|
List<Server> loadedServers = mapper.readValue(dataFolder.resolve(player.getAuthData().xuid() + ".json").toFile(), new TypeReference<>(){});
|
||||||
servers.addAll(loadedServers);
|
servers.addAll(loadedServers);
|
||||||
} catch (IOException ignored) { }
|
} catch (IOException ignored) { }
|
||||||
|
|
||||||
|
|
|
@ -50,9 +50,9 @@ public class MySQLStorageManager extends AbstractStorageManager {
|
||||||
GeyserConnectConfig.MySQLConnectionSection connectionInformation = MasterServer.getInstance().getGeyserConnectConfig().getCustomServers().getMysql();
|
GeyserConnectConfig.MySQLConnectionSection connectionInformation = MasterServer.getInstance().getGeyserConnectConfig().getCustomServers().getMysql();
|
||||||
connection = DriverManager.getConnection("jdbc:mysql://" + connectionInformation.getHost() + ":" + connectionInformation.getPort() + "/" + connectionInformation.getDatabase(), connectionInformation.getUser(), connectionInformation.getPass());
|
connection = DriverManager.getConnection("jdbc:mysql://" + connectionInformation.getHost() + ":" + connectionInformation.getPort() + "/" + connectionInformation.getDatabase(), connectionInformation.getUser(), connectionInformation.getPass());
|
||||||
|
|
||||||
Statement createPlayersTable = connection.createStatement();
|
try (Statement createPlayersTable = connection.createStatement()) {
|
||||||
createPlayersTable.executeUpdate("CREATE TABLE IF NOT EXISTS players (xuid VARCHAR(32), servers TEXT, PRIMARY KEY(xuid));");
|
createPlayersTable.executeUpdate("CREATE TABLE IF NOT EXISTS players (xuid VARCHAR(32), servers TEXT, PRIMARY KEY(xuid));");
|
||||||
createPlayersTable.close();
|
}
|
||||||
} catch (ClassNotFoundException | SQLException e) {
|
} catch (ClassNotFoundException | SQLException e) {
|
||||||
MasterServer.getInstance().getLogger().severe("Unable to connect to MySQL database!", e);
|
MasterServer.getInstance().getLogger().severe("Unable to connect to MySQL database!", e);
|
||||||
}
|
}
|
||||||
|
@ -67,10 +67,8 @@ public class MySQLStorageManager extends AbstractStorageManager {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void saveServers(Player player) {
|
public void saveServers(Player player) {
|
||||||
try {
|
try (Statement updatePlayersServers = connection.createStatement()) {
|
||||||
Statement updatePlayersServers = connection.createStatement();
|
updatePlayersServers.executeUpdate("REPLACE INTO players(xuid, servers) VALUES('" + player.getAuthData().xuid() + "', '" + mapper.writeValueAsString(player.getServers()) + "');");
|
||||||
updatePlayersServers.executeUpdate("REPLACE INTO players(xuid, servers) VALUES('" + player.getAuthData().getXboxUUID() + "', '" + mapper.writeValueAsString(player.getServers()) + "');");
|
|
||||||
updatePlayersServers.close();
|
|
||||||
} catch (IOException | SQLException ignored) { }
|
} catch (IOException | SQLException ignored) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,16 +76,13 @@ public class MySQLStorageManager extends AbstractStorageManager {
|
||||||
public List<Server> loadServers(Player player) {
|
public List<Server> loadServers(Player player) {
|
||||||
List<Server> servers = new ArrayList<>();
|
List<Server> servers = new ArrayList<>();
|
||||||
|
|
||||||
try {
|
try (Statement getPlayersServers = connection.createStatement()) {
|
||||||
Statement getPlayersServers = connection.createStatement();
|
ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getAuthData().xuid() + "';");
|
||||||
ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getAuthData().getXboxUUID() + "';");
|
|
||||||
|
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
List<Server> loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference<List<Server>>(){});
|
List<Server> loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference<>(){});
|
||||||
servers.addAll(loadedServers);
|
servers.addAll(loadedServers);
|
||||||
}
|
}
|
||||||
|
|
||||||
getPlayersServers.close();
|
|
||||||
} catch (IOException | SQLException ignored) { }
|
} catch (IOException | SQLException ignored) { }
|
||||||
|
|
||||||
return servers;
|
return servers;
|
||||||
|
|
|
@ -48,9 +48,9 @@ public class SQLiteStorageManager extends AbstractStorageManager {
|
||||||
Class.forName("org.sqlite.JDBC");
|
Class.forName("org.sqlite.JDBC");
|
||||||
connection = DriverManager.getConnection("jdbc:sqlite:players.db");
|
connection = DriverManager.getConnection("jdbc:sqlite:players.db");
|
||||||
|
|
||||||
Statement createPlayersTable = connection.createStatement();
|
try (Statement createPlayersTable = connection.createStatement()) {
|
||||||
createPlayersTable.executeUpdate("CREATE TABLE IF NOT EXISTS players (xuid TEXT, servers TEXT, PRIMARY KEY(xuid));");
|
createPlayersTable.executeUpdate("CREATE TABLE IF NOT EXISTS players (xuid TEXT, servers TEXT, PRIMARY KEY(xuid));");
|
||||||
createPlayersTable.close();
|
}
|
||||||
} catch (ClassNotFoundException | SQLException e) {
|
} catch (ClassNotFoundException | SQLException e) {
|
||||||
MasterServer.getInstance().getLogger().severe("Unable to load sqlite database!", e);
|
MasterServer.getInstance().getLogger().severe("Unable to load sqlite database!", e);
|
||||||
}
|
}
|
||||||
|
@ -65,10 +65,8 @@ public class SQLiteStorageManager extends AbstractStorageManager {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void saveServers(Player player) {
|
public void saveServers(Player player) {
|
||||||
try {
|
try (Statement updatePlayersServers = connection.createStatement()) {
|
||||||
Statement updatePlayersServers = connection.createStatement();
|
updatePlayersServers.executeUpdate("INSERT OR REPLACE INTO players(xuid, servers) VALUES('" + player.getAuthData().xuid() + "', '" + mapper.writeValueAsString(player.getServers()) + "');");
|
||||||
updatePlayersServers.executeUpdate("INSERT OR REPLACE INTO players(xuid, servers) VALUES('" + player.getAuthData().getXboxUUID() + "', '" + mapper.writeValueAsString(player.getServers()) + "');");
|
|
||||||
updatePlayersServers.close();
|
|
||||||
} catch (IOException | SQLException ignored) { }
|
} catch (IOException | SQLException ignored) { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,16 +74,13 @@ public class SQLiteStorageManager extends AbstractStorageManager {
|
||||||
public List<Server> loadServers(Player player) {
|
public List<Server> loadServers(Player player) {
|
||||||
List<Server> servers = new ArrayList<>();
|
List<Server> servers = new ArrayList<>();
|
||||||
|
|
||||||
try {
|
try (Statement getPlayersServers = connection.createStatement()) {
|
||||||
Statement getPlayersServers = connection.createStatement();
|
ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getAuthData().xuid() + "';");
|
||||||
ResultSet rs = getPlayersServers.executeQuery("SELECT servers FROM players WHERE xuid='" + player.getAuthData().getXboxUUID() + "';");
|
|
||||||
|
|
||||||
while (rs.next()) {
|
while (rs.next()) {
|
||||||
List<Server> loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference<List<Server>>() {});
|
List<Server> loadedServers = mapper.readValue(rs.getString("servers"), new TypeReference<>() {});
|
||||||
servers.addAll(loadedServers);
|
servers.addAll(loadedServers);
|
||||||
}
|
}
|
||||||
|
|
||||||
getPlayersServers.close();
|
|
||||||
} catch (IOException | SQLException ignored) { }
|
} catch (IOException | SQLException ignored) { }
|
||||||
|
|
||||||
return servers;
|
return servers;
|
||||||
|
|
|
@ -29,8 +29,8 @@ import lombok.extern.log4j.Log4j2;
|
||||||
import net.minecrell.terminalconsole.SimpleTerminalConsole;
|
import net.minecrell.terminalconsole.SimpleTerminalConsole;
|
||||||
import org.apache.logging.log4j.core.config.Configurator;
|
import org.apache.logging.log4j.core.config.Configurator;
|
||||||
import org.geysermc.connect.MasterServer;
|
import org.geysermc.connect.MasterServer;
|
||||||
import org.geysermc.connector.GeyserLogger;
|
import org.geysermc.geyser.GeyserLogger;
|
||||||
import org.geysermc.connector.common.ChatColor;
|
import org.geysermc.geyser.text.ChatColor;
|
||||||
|
|
||||||
@Log4j2
|
@Log4j2
|
||||||
public class Logger extends SimpleTerminalConsole implements GeyserLogger {
|
public class Logger extends SimpleTerminalConsole implements GeyserLogger {
|
||||||
|
|
|
@ -1,59 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019-2020 GeyserMC. http://geysermc.org
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*
|
|
||||||
* @author GeyserMC
|
|
||||||
* @link https://github.com/GeyserMC/GeyserConnect
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.geysermc.connect.utils;
|
|
||||||
|
|
||||||
import com.nukkitx.nbt.*;
|
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class is mostly copied from core Geyser
|
|
||||||
*/
|
|
||||||
public class PaletteManger {
|
|
||||||
|
|
||||||
public static final byte[] EMPTY_LEVEL_CHUNK_DATA;
|
|
||||||
private static final NbtMap EMPTY_TAG = NbtMap.EMPTY;
|
|
||||||
|
|
||||||
static {
|
|
||||||
/* Create empty chunk data */
|
|
||||||
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
|
|
||||||
outputStream.write(new byte[258]); // Biomes + Border Size + Extra Data Size
|
|
||||||
|
|
||||||
try (NBTOutputStream nbtOutputStream = NbtUtils.createNetworkWriter(outputStream)) {
|
|
||||||
nbtOutputStream.writeTag(EMPTY_TAG);
|
|
||||||
}
|
|
||||||
|
|
||||||
EMPTY_LEVEL_CHUNK_DATA = outputStream.toByteArray();
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new AssertionError("Unable to generate empty level chunk data");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void init() {
|
|
||||||
// no-op
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -31,25 +31,26 @@ import com.nukkitx.math.vector.Vector3i;
|
||||||
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;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.geysermc.connect.GeyserConnect;
|
|
||||||
import org.geysermc.connect.MasterServer;
|
import org.geysermc.connect.MasterServer;
|
||||||
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;
|
||||||
import org.geysermc.connector.GeyserConnector;
|
|
||||||
import org.geysermc.connector.common.AuthType;
|
|
||||||
import org.geysermc.connector.network.UpstreamPacketHandler;
|
|
||||||
import org.geysermc.connector.network.session.auth.AuthData;
|
|
||||||
import org.geysermc.connector.network.session.auth.BedrockClientData;
|
|
||||||
import org.geysermc.connector.registry.BlockRegistries;
|
|
||||||
import org.geysermc.connector.registry.Registries;
|
|
||||||
import org.geysermc.connector.registry.type.ItemMappings;
|
|
||||||
import org.geysermc.connector.utils.DimensionUtils;
|
|
||||||
import org.geysermc.cumulus.Form;
|
import org.geysermc.cumulus.Form;
|
||||||
|
import org.geysermc.geyser.GeyserImpl;
|
||||||
|
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;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -147,6 +148,10 @@ public class Player {
|
||||||
settings.setServerAuthoritativeBlockBreaking(false);
|
settings.setServerAuthoritativeBlockBreaking(false);
|
||||||
startGamePacket.setPlayerMovementSettings(settings);
|
startGamePacket.setPlayerMovementSettings(settings);
|
||||||
|
|
||||||
|
if (session.getPacketCodec().getProtocolVersion() <= Bedrock_v471.V471_CODEC.getProtocolVersion()) {
|
||||||
|
startGamePacket.getExperiments().add(new ExperimentData("caves_and_cliffs", true));
|
||||||
|
}
|
||||||
|
|
||||||
startGamePacket.setVanillaVersion("*");
|
startGamePacket.setVanillaVersion("*");
|
||||||
session.sendPacket(startGamePacket);
|
session.sendPacket(startGamePacket);
|
||||||
|
|
||||||
|
@ -161,7 +166,7 @@ public class Player {
|
||||||
data.setChunkX(0);
|
data.setChunkX(0);
|
||||||
data.setChunkZ(0);
|
data.setChunkZ(0);
|
||||||
data.setSubChunksLength(0);
|
data.setSubChunksLength(0);
|
||||||
data.setData(PaletteManger.EMPTY_LEVEL_CHUNK_DATA);
|
data.setData(ChunkUtils.EMPTY_CHUNK_DATA);
|
||||||
data.setCachingEnabled(false);
|
data.setCachingEnabled(false);
|
||||||
session.sendPacket(data);
|
session.sendPacket(data);
|
||||||
|
|
||||||
|
@ -171,7 +176,7 @@ public class Player {
|
||||||
session.sendPacket(biomeDefinitionListPacket);
|
session.sendPacket(biomeDefinitionListPacket);
|
||||||
|
|
||||||
AvailableEntityIdentifiersPacket entityPacket = new AvailableEntityIdentifiersPacket();
|
AvailableEntityIdentifiersPacket entityPacket = new AvailableEntityIdentifiersPacket();
|
||||||
entityPacket.setIdentifiers(Registries.ENTITY_IDENTIFIERS.get());
|
entityPacket.setIdentifiers(Registries.BEDROCK_ENTITY_IDENTIFIERS.get());
|
||||||
session.sendPacket(entityPacket);
|
session.sendPacket(entityPacket);
|
||||||
|
|
||||||
// Send a CreativeContentPacket - required for 1.16.100
|
// Send a CreativeContentPacket - required for 1.16.100
|
||||||
|
@ -228,11 +233,11 @@ public class Player {
|
||||||
transferPacket.setPort(currentServer.getPort());
|
transferPacket.setPort(currentServer.getPort());
|
||||||
session.sendPacket(transferPacket);
|
session.sendPacket(transferPacket);
|
||||||
} else {
|
} else {
|
||||||
GeyserProxySession geyserSession = new GeyserProxySession(GeyserConnector.getInstance(), session, MasterServer.getInstance().getEventLoopGroup().next());
|
GeyserProxySession geyserSession = new GeyserProxySession(GeyserImpl.getInstance(), session, MasterServer.getInstance().getEventLoopGroup().next());
|
||||||
session.setPacketHandler(new UpstreamPacketHandler(GeyserConnector.getInstance(), geyserSession));
|
session.setPacketHandler(new UpstreamPacketHandler(GeyserImpl.getInstance(), geyserSession));
|
||||||
// The player will be tracked from Geyser from here
|
// The player will be tracked from Geyser from here
|
||||||
MasterServer.getInstance().getPlayers().remove(this);
|
MasterServer.getInstance().getPlayers().remove(this);
|
||||||
GeyserConnector.getInstance().getSessionManager().addPendingSession(geyserSession);
|
GeyserImpl.getInstance().getSessionManager().addPendingSession(geyserSession);
|
||||||
|
|
||||||
geyserSession.getUpstream().getSession().setPacketCodec(session.getPacketCodec());
|
geyserSession.getUpstream().getSession().setPacketCodec(session.getPacketCodec());
|
||||||
|
|
||||||
|
@ -253,6 +258,10 @@ public class Player {
|
||||||
SetLocalPlayerAsInitializedPacket initializedPacket = new SetLocalPlayerAsInitializedPacket();
|
SetLocalPlayerAsInitializedPacket initializedPacket = new SetLocalPlayerAsInitializedPacket();
|
||||||
initializedPacket.setRuntimeEntityId(geyserSession.getPlayerEntity().getGeyserId());
|
initializedPacket.setRuntimeEntityId(geyserSession.getPlayerEntity().getGeyserId());
|
||||||
session.getPacketHandler().handle(initializedPacket);
|
session.getPacketHandler().handle(initializedPacket);
|
||||||
|
|
||||||
|
if (geyserSession.getRemoteAuthType() != AuthType.ONLINE) {
|
||||||
|
geyserSession.authenticate(geyserSession.getAuthData().name());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ import java.io.InputStreamReader;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
|
||||||
public class WebUtils extends org.geysermc.connector.utils.WebUtils {
|
public class WebUtils {
|
||||||
/**
|
/**
|
||||||
* Makes a web request to the given URL and returns the body as a string
|
* Makes a web request to the given URL and returns the body as a string
|
||||||
*
|
*
|
||||||
|
|
Loading…
Add table
Reference in a new issue