diff options
| author | Mattie <pugmatt@gmail.com> | 2023-02-06 03:48:50 -0500 |
|---|---|---|
| committer | Mattie <pugmatt@gmail.com> | 2023-02-06 03:48:50 -0500 |
| commit | d44577f11ec967c01049c34aa7725857b44f233f (patch) | |
| tree | cb8dbb59631a0e274665640adc08771fc60bcd13 /serverlist-server/src | |
| parent | ece82dd065e525ddf3b59150fabb14f38c758853 (diff) | |
| download | BedrockConnect-d44577f11ec967c01049c34aa7725857b44f233f.tar.gz BedrockConnect-d44577f11ec967c01049c34aa7725857b44f233f.tar.bz2 BedrockConnect-d44577f11ec967c01049c34aa7725857b44f233f.zip | |
Upgrade Protocol to 3.0
Diffstat (limited to 'serverlist-server/src')
8 files changed, 964 insertions, 220 deletions
diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java index 2b6f537..aa35698 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/BCPlayer.java @@ -1,22 +1,21 @@ package main.com.pyratron.pugmatt.bedrockconnect; -import com.nukkitx.math.vector.Vector2f; -import com.nukkitx.math.vector.Vector3i; -import com.nukkitx.nbt.NBTOutputStream; -import com.nukkitx.nbt.NbtMap; -import com.nukkitx.nbt.NbtMapBuilder; -import com.nukkitx.nbt.NbtUtils; -import com.nukkitx.protocol.bedrock.Bedrock; -import com.nukkitx.protocol.bedrock.BedrockPacket; -import com.nukkitx.protocol.bedrock.BedrockServerSession; -import com.nukkitx.protocol.bedrock.data.*; -import com.nukkitx.protocol.bedrock.data.inventory.ContainerId; -import com.nukkitx.protocol.bedrock.data.inventory.ItemData; -import com.nukkitx.protocol.bedrock.packet.*; -import com.nukkitx.math.vector.Vector3f; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import main.com.pyratron.pugmatt.bedrockconnect.gui.UIComponents; import main.com.pyratron.pugmatt.bedrockconnect.gui.UIForms; import main.com.pyratron.pugmatt.bedrockconnect.sql.Data; +import org.cloudburstmc.math.vector.Vector2f; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.math.vector.Vector3i; +import org.cloudburstmc.nbt.NBTOutputStream; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtUtils; +import org.cloudburstmc.protocol.bedrock.BedrockServerSession; +import org.cloudburstmc.protocol.bedrock.data.*; +import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; +import org.cloudburstmc.protocol.bedrock.packet.*; +import org.cloudburstmc.protocol.common.util.OptionalBoolean; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -70,7 +69,7 @@ public class BCPlayer { this.serverLimit = serverLimit; this.lastAction = LocalTime.now(); - if(session != null && !session.isClosed()) + if(session != null && session.isConnected()) joinGame(); } @@ -217,15 +216,6 @@ public class BCPlayer { } public void joinGame() { - - MovePlayerPacket mp = new MovePlayerPacket(); - mp.setRuntimeEntityId(1); - mp.setOnGround(false); - mp.setMode(MovePlayerPacket.Mode.NORMAL); - mp.setRotation(Vector3f.from(0,0,0)); - mp.setPosition(Vector3f.from(0,0,0)); - session.sendPacket(mp); - StartGamePacket startGamePacket = new StartGamePacket(); startGamePacket.setUniqueEntityId(1); startGamePacket.setRuntimeEntityId(1); @@ -266,16 +256,18 @@ public class BCPlayer { startGamePacket.setUsingMsaGamertagsOnly(false); startGamePacket.setFromWorldTemplate(false); startGamePacket.setWorldTemplateOptionLocked(false); + startGamePacket.setSpawnBiomeType(SpawnBiomeType.DEFAULT); + startGamePacket.setCustomBiomeName(""); + startGamePacket.setEducationProductionId(""); + startGamePacket.setForceExperimentalGameplay(OptionalBoolean.empty()); - //startGamePacket.setOnlySpawningV1Villagers(false); startGamePacket.setAuthoritativeMovementMode(AuthoritativeMovementMode.CLIENT); - SyncedPlayerMovementSettings settings = new SyncedPlayerMovementSettings(); - settings.setMovementMode(AuthoritativeMovementMode.CLIENT); - settings.setRewindHistorySize(0); - settings.setServerAuthoritativeBlockBreaking(false); - startGamePacket.setPlayerMovementSettings(settings); + startGamePacket.setRewindHistorySize(0); + startGamePacket.setServerAuthoritativeBlockBreaking(false); //startGamePacket.setTrial(false); startGamePacket.setVanillaVersion("*"); + startGamePacket.setInventoriesServerAuthoritative(true); + startGamePacket.setServerEngine(""); startGamePacket.setLevelId("world"); startGamePacket.setLevelName("world"); @@ -314,7 +306,7 @@ public class BCPlayer { data2.setChunkX(chunkX + x); data2.setChunkZ(chunkZ + z); data2.setSubChunksLength(0); - data2.setData(EMPTY_LEVEL_CHUNK_DATA); + data2.setData(Unpooled.wrappedBuffer(EMPTY_LEVEL_CHUNK_DATA)); session.sendPacket(data2); } } diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java index d15367a..48c9ab1 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/Server.java @@ -3,9 +3,19 @@ package main.com.pyratron.pugmatt.bedrockconnect; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; -import com.nukkitx.protocol.bedrock.*; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.Channel; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioDatagramChannel; import main.com.pyratron.pugmatt.bedrockconnect.listeners.PacketHandler; import main.com.pyratron.pugmatt.bedrockconnect.utils.BedrockProtocol; +import org.cloudburstmc.netty.channel.raknet.RakChannelFactory; +import org.cloudburstmc.netty.channel.raknet.config.RakChannelOption; +import org.cloudburstmc.protocol.bedrock.BedrockPong; +import org.cloudburstmc.protocol.bedrock.BedrockServerSession; +import org.cloudburstmc.protocol.bedrock.BedrockSession; +import org.cloudburstmc.protocol.bedrock.netty.initializer.BedrockServerInitializer; +import org.cloudburstmc.protocol.bedrock.packet.BedrockPacketHandler; import javax.annotation.Nonnull; @@ -14,7 +24,8 @@ import java.util.*; public class Server { - public BedrockServer server; + private final NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); + public Channel server; public BedrockPong pong; public static final ObjectMapper JSON_MAPPER = new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); @@ -51,35 +62,31 @@ public class Server { InetSocketAddress bindAddress = new InetSocketAddress(bindIp, Integer.parseInt(port)); - server = new BedrockServer(bindAddress); pong = new BedrockPong(); - pong.setEdition("MCPE"); - pong.setMotd(BedrockConnect.language.getWording("serverInfo", "motd")); - pong.setSubMotd(BedrockConnect.language.getWording("serverInfo", "subMotd")); - pong.setPlayerCount(0); - pong.setMaximumPlayerCount(20); - pong.setGameType("Survival"); - pong.setIpv4Port(Integer.parseInt(port)); - pong.setProtocolVersion(BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()); - pong.setVersion(BedrockProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion()); - server.setHandler(new BedrockServerEventHandler() { - @Override - public boolean onConnectionRequest(InetSocketAddress address) { - return true; // Connection will be accepted - } - - @Nonnull - public BedrockPong onQuery(InetSocketAddress address) { - return pong; - } + pong.edition("MCPE"); + pong.motd(BedrockConnect.language.getWording("serverInfo", "motd")); + pong.subMotd(BedrockConnect.language.getWording("serverInfo", "subMotd")); + pong.playerCount(0); + pong.maximumPlayerCount(20); + pong.gameType("Survival"); + pong.ipv4Port(Integer.parseInt(port)); + pong.protocolVersion(BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()); + pong.version(BedrockProtocol.DEFAULT_BEDROCK_CODEC.getMinecraftVersion()); + + server = new ServerBootstrap() + .group(this.eventLoopGroup) + .channelFactory(RakChannelFactory.server(NioDatagramChannel.class)) + .option(RakChannelOption.RAK_ADVERTISEMENT, pong.toByteBuf()) + .childHandler(new BedrockServerInitializer() { + @Override + protected void initSession(BedrockServerSession session) { + session.setPacketHandler(new PacketHandler(session, current, false)); + } + }) + .bind(bindAddress) + .awaitUninterruptibly() + .channel(); - @Override - public void onSessionCreation(BedrockServerSession session) { - session.setPacketHandler(new PacketHandler(session, current, false)); - } - }); - // Start server up - server.bind().join(); System.out.println("Bedrock Connection Started: " + bindIp + ":" + port); if(BedrockConnect.kickInactive) { Timer timer = new Timer(); diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIComponents.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIComponents.java index 102fe0d..531aef3 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIComponents.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIComponents.java @@ -2,11 +2,8 @@ package main.com.pyratron.pugmatt.bedrockconnect.gui; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.nukkitx.protocol.bedrock.BedrockSession; -import com.nukkitx.protocol.bedrock.packet.ModalFormRequestPacket; import main.com.pyratron.pugmatt.bedrockconnect.BCPlayer; import main.com.pyratron.pugmatt.bedrockconnect.BedrockConnect; -import net.minidev.json.JSONUtil; import org.json.simple.JSONArray; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIForms.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIForms.java index 6a8ac1f..78d20b9 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIForms.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/gui/UIForms.java @@ -2,12 +2,10 @@ package main.com.pyratron.pugmatt.bedrockconnect.gui; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.nukkitx.protocol.bedrock.Bedrock; -import com.nukkitx.protocol.bedrock.BedrockServerSession; -import com.nukkitx.protocol.bedrock.packet.ModalFormRequestPacket; - -import com.nukkitx.protocol.bedrock.packet.NetworkStackLatencyPacket; import main.com.pyratron.pugmatt.bedrockconnect.*; +import org.cloudburstmc.protocol.bedrock.BedrockServerSession; +import org.cloudburstmc.protocol.bedrock.packet.ModalFormRequestPacket; +import org.cloudburstmc.protocol.bedrock.packet.NetworkStackLatencyPacket; import java.util.ArrayList; import java.util.List; diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java index 88bb367..acf190d 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/listeners/PacketHandler.java @@ -2,28 +2,31 @@ package main.com.pyratron.pugmatt.bedrockconnect.listeners; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.JsonNodeType; -import com.nukkitx.math.vector.Vector3f; -import com.nukkitx.network.util.Preconditions; -import com.nukkitx.protocol.bedrock.BedrockPacketCodec; -import com.nukkitx.protocol.bedrock.data.AttributeData; -import com.nukkitx.protocol.bedrock.data.PacketCompressionAlgorithm; -import com.nukkitx.protocol.bedrock.packet.*; import com.nimbusds.jose.JOSEException; import com.nimbusds.jose.JWSObject; +import com.nimbusds.jose.Payload; import com.nimbusds.jose.crypto.factories.DefaultJWSVerifierFactory; -import com.nukkitx.protocol.bedrock.BedrockServerSession; -import com.nukkitx.protocol.bedrock.handler.BedrockPacketHandler; -import com.nukkitx.protocol.bedrock.packet.LoginPacket; -import com.nukkitx.protocol.bedrock.util.EncryptionUtils; +import com.nimbusds.jose.shaded.json.JSONObject; +import com.nimbusds.jose.shaded.json.JSONValue; +import com.nimbusds.jwt.SignedJWT; import main.com.pyratron.pugmatt.bedrockconnect.*; import main.com.pyratron.pugmatt.bedrockconnect.gui.MainFormButton; import main.com.pyratron.pugmatt.bedrockconnect.gui.ManageFormButton; import main.com.pyratron.pugmatt.bedrockconnect.gui.UIComponents; import main.com.pyratron.pugmatt.bedrockconnect.gui.UIForms; import main.com.pyratron.pugmatt.bedrockconnect.utils.BedrockProtocol; -import net.minidev.json.JSONObject; +import org.cloudburstmc.math.vector.Vector3f; +import org.cloudburstmc.protocol.bedrock.BedrockServerSession; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; +import org.cloudburstmc.protocol.bedrock.data.AttributeData; +import org.cloudburstmc.protocol.bedrock.data.PacketCompressionAlgorithm; +import org.cloudburstmc.protocol.bedrock.packet.*; +import org.cloudburstmc.protocol.bedrock.util.EncryptionUtils; +import org.cloudburstmc.protocol.common.PacketSignal; +import org.cloudburstmc.protocol.common.util.Preconditions; import java.io.IOException; +import java.net.URI; import java.security.interfaces.ECPublicKey; import java.util.*; import java.net.InetAddress; @@ -60,7 +63,7 @@ public class PacketHandler implements BedrockPacketHandler { } @Override - public boolean handle(RequestChunkRadiusPacket packet) { + public PacketSignal handle(RequestChunkRadiusPacket packet) { ChunkRadiusUpdatedPacket chunkRadiusUpdatePacket = new ChunkRadiusUpdatedPacket(); chunkRadiusUpdatePacket.setRadius(packet.getRadius()); session.sendPacketImmediately(chunkRadiusUpdatePacket); @@ -68,26 +71,26 @@ public class PacketHandler implements BedrockPacketHandler { PlayStatusPacket playStatus = new PlayStatusPacket(); playStatus.setStatus(PlayStatusPacket.Status.PLAYER_SPAWN); session.sendPacket(playStatus); - return false; + return PacketSignal.HANDLED; } // Occasionally, a sent form will not correctly send to a player for whatever reason, and they float in space. This works as a way to open the form back up. - + @Override - public boolean handle(PlayerActionPacket packet) { + public PacketSignal handle(PlayerActionPacket packet) { player.movementOpen(); - return false; + return PacketSignal.HANDLED; } @Override - public boolean handle(AnimatePacket packet) { + public PacketSignal handle(AnimatePacket packet) { if(packet.getAction() == AnimatePacket.Action.SWING_ARM) player.movementOpen(); - return false; + return PacketSignal.HANDLED; } @Override - public boolean handle(ModalFormResponsePacket packet) { + public PacketSignal handle(ModalFormResponsePacket packet) { player.setActive(); player.resetMovementOpen(); @@ -96,7 +99,7 @@ public class PacketHandler implements BedrockPacketHandler { // Re-open window if closed if (packet.getFormData() == null || packet.getFormData().contains("null")) { if(player.getCurrentForm() != packet.getFormId()) - return false; + return PacketSignal.HANDLED; player.openForm(UIForms.MAIN); } else { // If selecting button int chosen = Integer.parseInt(packet.getFormData().replaceAll("\\s+","")); @@ -173,7 +176,7 @@ public class PacketHandler implements BedrockPacketHandler { case UIForms.SERVER_GROUP: if(packet.getFormData() == null || packet.getFormData().contains("null")) { if(player.getCurrentForm() != packet.getFormId()) - return false; + return PacketSignal.HANDLED; player.openForm(UIForms.MAIN); } else { @@ -193,7 +196,7 @@ public class PacketHandler implements BedrockPacketHandler { case UIForms.MANAGE_SERVER: if(packet.getFormData() == null) { if(player.getCurrentForm() != packet.getFormId()) - return false; + return PacketSignal.HANDLED; player.openForm(UIForms.MAIN); } else { @@ -218,7 +221,7 @@ public class PacketHandler implements BedrockPacketHandler { try { if(packet.getFormData() == null || packet.getFormData().contains("null")) { if(player.getCurrentForm() != packet.getFormId()) - return false; + return PacketSignal.HANDLED; player.openForm(UIForms.MANAGE_SERVER); } else { @@ -246,7 +249,7 @@ public class PacketHandler implements BedrockPacketHandler { try { if(packet.getFormData() == null || packet.getFormData().contains("null")) { if(player.getCurrentForm() != packet.getFormId()) - return false; + return PacketSignal.HANDLED; player.openForm(UIForms.MAIN); } else { @@ -278,7 +281,7 @@ public class PacketHandler implements BedrockPacketHandler { case UIForms.EDIT_CHOOSE_SERVER: if(packet.getFormData() == null || packet.getFormData().contains("null")) { if(player.getCurrentForm() != packet.getFormId()) - return false; + return PacketSignal.HANDLED; player.openForm(UIForms.MANAGE_SERVER); } else { @@ -305,7 +308,7 @@ public class PacketHandler implements BedrockPacketHandler { case UIForms.EDIT_SERVER: if(packet.getFormData() == null || packet.getFormData().contains("null")) { if(player.getCurrentForm() != packet.getFormId()) - return false; + return PacketSignal.HANDLED; player.openForm(UIForms.EDIT_CHOOSE_SERVER); } else { @@ -336,7 +339,7 @@ public class PacketHandler implements BedrockPacketHandler { try { if(packet.getFormData() == null || packet.getFormData().contains("null")) { if(player.getCurrentForm() != packet.getFormId()) - return false; + return PacketSignal.HANDLED; player.openForm(UIForms.MANAGE_SERVER); } else { @@ -361,11 +364,11 @@ public class PacketHandler implements BedrockPacketHandler { break; } - return false; + return PacketSignal.HANDLED; } @Override - public boolean handle(NetworkStackLatencyPacket packet) { + public PacketSignal handle(NetworkStackLatencyPacket packet) { // Fix bug where server icons don't load UpdateAttributesPacket updateAttributesPacket = new UpdateAttributesPacket(); updateAttributesPacket.setRuntimeEntityId(1); @@ -374,11 +377,11 @@ public class PacketHandler implements BedrockPacketHandler { Timer timer = new Timer(); TimerTask task = new TimerTask() { - public void run() { if(!session.isClosed()) { session.sendPacket(updateAttributesPacket); } } + public void run() { if(session.isConnected()) { session.sendPacket(updateAttributesPacket); } } }; timer.schedule(task, 500); - return false; + return PacketSignal.HANDLED; } public void transfer(String ip, int port) { @@ -393,58 +396,101 @@ public class PacketHandler implements BedrockPacketHandler { } @Override - public boolean handle(SetLocalPlayerAsInitializedPacket packet) { + public PacketSignal handle(SetLocalPlayerAsInitializedPacket packet) { session.sendPacketImmediately(UIForms.createMain(player.getServerList(), session)); - return false; + return PacketSignal.HANDLED; } @Override - public boolean handle(RequestNetworkSettingsPacket packet) { + public PacketSignal handle(RequestNetworkSettingsPacket packet) { + int protocolVersion = packet.getProtocolVersion(); + + BedrockCodec packetCodec = BedrockProtocol.getBedrockCodec(packet.getProtocolVersion()); + + if (protocolVersion != BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { + PlayStatusPacket status = new PlayStatusPacket(); + if (protocolVersion > BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { + status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_SERVER_OLD); + } else { + status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_CLIENT_OLD); + } + + session.sendPacketImmediately(status); + return PacketSignal.HANDLED; + } + session.setCodec(packetCodec); + PacketCompressionAlgorithm algorithm = PacketCompressionAlgorithm.ZLIB; NetworkSettingsPacket responsePacket = new NetworkSettingsPacket(); responsePacket.setCompressionAlgorithm(algorithm); - responsePacket.setCompressionThreshold(512); + responsePacket.setCompressionThreshold(0); session.sendPacketImmediately(responsePacket); session.setCompression(algorithm); - return false; + return PacketSignal.HANDLED; } public PacketHandler(BedrockServerSession session, Server server, boolean packetListening) { - session.setPacketCodec(BedrockProtocol.DEFAULT_BEDROCK_CODEC); this.session = session; this.server = server; - - session.addDisconnectHandler((DisconnectReason) -> disconnect()); } - public void disconnect() { + @Override + public void onDisconnect(String reason) { System.out.println(name + " disconnected"); if(player != null) server.removePlayer(player); } - private static boolean validateChainData(JsonNode data) throws Exception { + private static boolean validateChainData(List<SignedJWT> chain) throws Exception { + if (chain.size() != 3) { + return false; + } + + Payload identity = null; ECPublicKey lastKey = null; - boolean validChain = false; - for (JsonNode node : data) { - JWSObject jwt = JWSObject.parse(node.asText()); + boolean mojangSigned = false; + Iterator<SignedJWT> iterator = chain.iterator(); + while (iterator.hasNext()) { + SignedJWT jwt = iterator.next(); + identity = jwt.getPayload(); + + // x509 cert is expected in every claim + URI x5u = jwt.getHeader().getX509CertURL(); + if (x5u == null) { + return false; + } - if (!validChain) { - validChain = verifyJwt(jwt, EncryptionUtils.getMojangPublicKey()); + ECPublicKey expectedKey = EncryptionUtils.generateKey(jwt.getHeader().getX509CertURL().toString()); + // First key is self-signed + if (lastKey == null) { + lastKey = expectedKey; + } else if (!lastKey.equals(expectedKey)) { + return false; } - if (lastKey != null) { - verifyJwt(jwt, lastKey); + if (!EncryptionUtils.verifyJwt(jwt, lastKey)) { + return false; } - JsonNode payloadNode = Server.JSON_MAPPER.readTree(jwt.getPayload().toString()); - JsonNode ipkNode = payloadNode.get("identityPublicKey"); - Preconditions.checkState(ipkNode != null && ipkNode.getNodeType() == JsonNodeType.STRING, "identityPublicKey node is missing in chain"); - lastKey = EncryptionUtils.generateKey(ipkNode.asText()); + if (mojangSigned) { + return !iterator.hasNext(); + } + + if (lastKey.equals(EncryptionUtils.getMojangPublicKey())) { + mojangSigned = true; + } + + Object payload = JSONValue.parse(jwt.getPayload().toString()); + Preconditions.checkArgument(payload instanceof JSONObject, "Payload is not an object"); + + Object identityPublicKey = ((JSONObject) payload).get("identityPublicKey"); + Preconditions.checkArgument(identityPublicKey instanceof String, "identityPublicKey node is missing in chain"); + lastKey = EncryptionUtils.generateKey((String) identityPublicKey); } - return validChain; + + return mojangSigned; } @@ -453,12 +499,12 @@ public class PacketHandler implements BedrockPacketHandler { } @Override - public boolean handle(DisconnectPacket packet) { - return false; + public PacketSignal handle(DisconnectPacket packet) { + return PacketSignal.UNHANDLED; } @Override - public boolean handle(ResourcePackClientResponsePacket packet) { + public PacketSignal handle(ResourcePackClientResponsePacket packet) { switch (packet.getStatus()) { case COMPLETED: BedrockConnect.data.userExists(uuid, name, session, this); @@ -475,49 +521,18 @@ public class PacketHandler implements BedrockPacketHandler { break; } - return true; + return PacketSignal.HANDLED; } // Heavily referenced from https://github.com/NukkitX/ProxyPass/blob/master/src/main/java/com/nukkitx/proxypass/network/bedrock/session/UpstreamPacketHandler.java @Override - public boolean handle(LoginPacket packet) { - BedrockPacketCodec packetCodec = BedrockProtocol.getBedrockCodec(packet.getProtocolVersion()); - - if (packetCodec == null) { - session.setPacketCodec(BedrockProtocol.DEFAULT_BEDROCK_CODEC); - - PlayStatusPacket status = new PlayStatusPacket(); - - if (packet.getProtocolVersion() > BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { - status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_SERVER_OLD); - } - else if (packet.getProtocolVersion() < BedrockProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) { - status.setStatus(PlayStatusPacket.Status.LOGIN_FAILED_CLIENT_OLD); - } - - session.sendPacket(status); - } - - session.setPacketCodec(packetCodec); - - JsonNode certData; - try { - certData = Server.JSON_MAPPER.readTree(packet.getChainData().toByteArray()); - } catch (IOException e) { - throw new RuntimeException("Certificate JSON can not be read."); - } + public PacketSignal handle(LoginPacket packet) { - JsonNode certChainData = certData.get("chain"); - if (certChainData.getNodeType() != JsonNodeType.ARRAY) { - throw new RuntimeException("Certificate data is not valid"); - } + List<SignedJWT> certChainData = packet.getChain(); - boolean validChain; try { - validChain = validateChainData(certChainData); - - JWSObject jwt = JWSObject.parse(certChainData.get(certChainData.size() - 1).asText()); + JWSObject jwt = certChainData.get(certChainData.size() - 1); JsonNode payload = Server.JSON_MAPPER.readTree(jwt.getPayload().toBytes()); if (payload.get("extraData").getNodeType() != JsonNodeType.OBJECT) { @@ -531,7 +546,7 @@ public class PacketHandler implements BedrockPacketHandler { } ECPublicKey identityPublicKey = EncryptionUtils.generateKey(payload.get("identityPublicKey").textValue()); - JWSObject clientJwt = JWSObject.parse(packet.getSkinData().toString()); + JWSObject clientJwt = packet.getExtra(); verifyJwt(clientJwt, identityPublicKey); System.out.println("Made it through login - " + "User: " + extraData.getAsString("displayName") + " (" + extraData.getAsString("identity") + ")"); @@ -541,7 +556,7 @@ public class PacketHandler implements BedrockPacketHandler { uuid = extraData.getAsString("identity"); - //whitelist check + // Whitelist check if (Whitelist.hasWhitelist() && !Whitelist.isPlayerWhitelisted(name)) { session.disconnect(Whitelist.getWhitelistMessage()); System.out.println("Kicked " + name + ": \"" + Whitelist.getWhitelistMessage() + "\""); @@ -564,8 +579,771 @@ public class PacketHandler implements BedrockPacketHandler { session.disconnect("disconnectionScreen.internalError.cantConnect"); throw new RuntimeException("Unable to complete login", e); } - return true; + return PacketSignal.HANDLED; + } + + // Handle rest of packets to avoid log warnings + + @Override + public PacketSignal handle(AdventureSettingsPacket packet) { + return PacketSignal.HANDLED; + } + + + @Override + public PacketSignal handle(BlockEntityDataPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(BlockPickRequestPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(BookEditPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ClientCacheBlobStatusPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ClientCacheMissResponsePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ClientCacheStatusPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ClientToServerHandshakePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(CommandBlockUpdatePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(CommandRequestPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ContainerClosePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(CraftingEventPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(EntityEventPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(EntityPickRequestPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(EventPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(InteractPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(InventoryContentPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(InventorySlotPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(InventoryTransactionPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ItemFrameDropItemPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(LabTablePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(LecternUpdatePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(LevelEventGenericPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(LevelSoundEventPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(MapInfoRequestPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(MobArmorEquipmentPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(MobEquipmentPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(MoveEntityAbsolutePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(MovePlayerPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PhotoTransferPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PlayerHotbarPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PlayerInputPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PlayerSkinPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PurchaseReceiptPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ResourcePackChunkRequestPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(RiderJumpPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ServerSettingsRequestPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetDefaultGameTypePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetPlayerGameTypePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SubClientLoginPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(TextPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(AddBehaviorTreePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(AddEntityPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(AddHangingEntityPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(AddItemEntityPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(AddPaintingPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(AddPlayerPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(AvailableCommandsPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(BlockEventPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(BossEventPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(CameraPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ChangeDimensionPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ChunkRadiusUpdatedPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ClientboundMapItemDataPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(CommandOutputPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ContainerOpenPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ContainerSetDataPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(CraftingDataPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ExplodePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(LevelChunkPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(GameRulesChangedPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(GuiDataPickItemPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(HurtArmorPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(AutomationClientConnectPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(LevelEventPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(MapCreateLockedCopyPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(MobEffectPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ModalFormRequestPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(MoveEntityDeltaPacket packet) { + return PacketSignal.HANDLED; } + @Override + public PacketSignal handle(NpcRequestPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(OnScreenTextureAnimationPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PlayerListPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PlaySoundPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PlayStatusPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(RemoveEntityPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(RemoveObjectivePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ResourcePackChunkDataPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ResourcePackDataInfoPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ResourcePacksInfoPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ResourcePackStackPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(RespawnPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ScriptCustomEventPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ServerSettingsResponsePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ServerToClientHandshakePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetCommandsEnabledPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetDifficultyPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetDisplayObjectivePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetEntityDataPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetEntityLinkPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetEntityMotionPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetHealthPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetLastHurtByPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetScoreboardIdentityPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetScorePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetSpawnPositionPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetTimePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SetTitlePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ShowCreditsPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ShowProfilePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ShowStoreOfferPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SimpleEventPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SpawnExperienceOrbPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(StartGamePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(StopSoundPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(StructureBlockUpdatePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(StructureTemplateDataRequestPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(StructureTemplateDataResponsePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(TakeItemEntityPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(TransferPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(UpdateAttributesPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(UpdateBlockPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(UpdateBlockPropertiesPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(UpdateBlockSyncedPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(UpdateEquipPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(UpdateSoftEnumPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(UpdateTradePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(AvailableEntityIdentifiersPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(BiomeDefinitionListPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(LevelSoundEvent2Packet packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(NetworkChunkPublisherUpdatePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SpawnParticleEffectPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(VideoStreamConnectPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(EmotePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(TickSyncPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(AnvilDamagePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(NetworkSettingsPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PlayerAuthInputPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(SettingsCommandPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(EducationSettingsPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(CompletedUsingItemPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(MultiplayerSettingsPacket packet) { + return PacketSignal.HANDLED; + } + + // 1.16 new packets + @Override + public PacketSignal handle(DebugInfoPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(EmoteListPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(CodeBuilderPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(CreativeContentPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ItemStackRequestPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(LevelSoundEvent1Packet packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ItemStackResponsePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PlayerArmorDamagePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PlayerEnchantOptionsPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(UpdatePlayerGameTypePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PacketViolationWarningPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PositionTrackingDBClientRequestPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PositionTrackingDBServerBroadcastPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(MotionPredictionHintsPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(AnimateEntityPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(CameraShakePacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(PlayerFogPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(CorrectPlayerMovePredictionPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(ItemComponentPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(FilterTextPacket packet) { + return PacketSignal.HANDLED; + } + + @Override + public PacketSignal handle(RequestAbilityPacket packet) { + return PacketSignal.HANDLED; + } } diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java index 7abe8f1..07e79b2 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/sql/Data.java @@ -1,10 +1,10 @@ package main.com.pyratron.pugmatt.bedrockconnect.sql; -import com.nukkitx.protocol.bedrock.BedrockServerSession; import main.com.pyratron.pugmatt.bedrockconnect.BedrockConnect; import main.com.pyratron.pugmatt.bedrockconnect.BCPlayer; import main.com.pyratron.pugmatt.bedrockconnect.gui.UIComponents; import main.com.pyratron.pugmatt.bedrockconnect.listeners.PacketHandler; +import org.cloudburstmc.protocol.bedrock.BedrockServerSession; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java index b8bf0f5..50500dc 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/BedrockProtocol.java @@ -1,23 +1,11 @@ package main.com.pyratron.pugmatt.bedrockconnect.utils; -import com.nukkitx.protocol.bedrock.BedrockPacketCodec; -import com.nukkitx.protocol.bedrock.v419.Bedrock_v419; -import com.nukkitx.protocol.bedrock.v422.Bedrock_v422; -import com.nukkitx.protocol.bedrock.v428.Bedrock_v428; -import com.nukkitx.protocol.bedrock.v431.Bedrock_v431; -import com.nukkitx.protocol.bedrock.v440.Bedrock_v440; -import com.nukkitx.protocol.bedrock.v448.Bedrock_v448; -import com.nukkitx.protocol.bedrock.v465.Bedrock_v465; -import com.nukkitx.protocol.bedrock.v471.Bedrock_v471; -import com.nukkitx.protocol.bedrock.v475.Bedrock_v475; -import com.nukkitx.protocol.bedrock.v486.Bedrock_v486; -import com.nukkitx.protocol.bedrock.v503.Bedrock_v503; -import com.nukkitx.protocol.bedrock.v527.Bedrock_v527; -import com.nukkitx.protocol.bedrock.v534.Bedrock_v534; -import com.nukkitx.protocol.bedrock.v544.Bedrock_v544; -import com.nukkitx.protocol.bedrock.v554.Bedrock_v554; -import com.nukkitx.protocol.bedrock.v557.Bedrock_v557; -import com.nukkitx.protocol.bedrock.v560.Bedrock_v560; +import org.cloudburstmc.protocol.bedrock.codec.BedrockCodec; +import org.cloudburstmc.protocol.bedrock.codec.v544.Bedrock_v544; +import org.cloudburstmc.protocol.bedrock.codec.v545.Bedrock_v545; +import org.cloudburstmc.protocol.bedrock.codec.v554.Bedrock_v554; +import org.cloudburstmc.protocol.bedrock.codec.v557.Bedrock_v557; +import org.cloudburstmc.protocol.bedrock.codec.v560.Bedrock_v560; import java.util.ArrayList; import java.util.List; @@ -28,52 +16,36 @@ public class BedrockProtocol { /** * Latest available version */ - public static final BedrockPacketCodec DEFAULT_BEDROCK_CODEC = Bedrock_v554.V554_CODEC.toBuilder() - .minecraftVersion("1.19.30") - .protocolVersion(553) - .build(); + public static final BedrockCodec DEFAULT_BEDROCK_CODEC = Bedrock_v560.CODEC; /** * A list of all supported Bedrock versions that can join BedrockConnect */ - public static final List<BedrockPacketCodec> SUPPORTED_BEDROCK_CODECS = new ArrayList<>(); + public static final List<BedrockCodec> SUPPORTED_BEDROCK_CODECS = new ArrayList<>(); static { - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v419.V419_CODEC.toBuilder() - .minecraftVersion("1.16.100/1.16.101") + SUPPORTED_BEDROCK_CODECS.add(Bedrock_v544.CODEC); + SUPPORTED_BEDROCK_CODECS.add(Bedrock_v545.CODEC.toBuilder() + .minecraftVersion("1.19.21/1.19.22") .build()); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v422.V422_CODEC.toBuilder() - .minecraftVersion("1.16.200/1.16.201") + SUPPORTED_BEDROCK_CODECS.add(Bedrock_v554.CODEC.toBuilder() + .minecraftVersion("1.19.30/1.19.31") + .build()); + SUPPORTED_BEDROCK_CODECS.add(Bedrock_v557.CODEC.toBuilder() + .minecraftVersion("1.19.40/1.19.41") + .build()); + SUPPORTED_BEDROCK_CODECS.add(DEFAULT_BEDROCK_CODEC.toBuilder() + .minecraftVersion("1.19.50/1.19.51") .build()); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v428.V428_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v431.V431_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v440.V440_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v448.V448_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v465.V465_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v471.V471_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v475.V475_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v486.V486_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v503.V503_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v527.V527_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v534.V534_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v544.V544_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v544.V544_CODEC.toBuilder() - .minecraftVersion("1.19.21") - .protocolVersion(545) - .build()); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v554.V554_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v557.V557_CODEC); - SUPPORTED_BEDROCK_CODECS.add(Bedrock_v560.V560_CODEC); - } /** - * Gets the {@link BedrockPacketCodec} of the given protocol version. + * Gets the {@link BedrockCodec} of the given protocol version. * @param protocolVersion The protocol version to attempt to find * @return The packet codec, or null if the client's protocol is unsupported */ - public static BedrockPacketCodec getBedrockCodec(int protocolVersion) { - for (BedrockPacketCodec packetCodec : SUPPORTED_BEDROCK_CODECS) { + public static BedrockCodec getBedrockCodec(int protocolVersion) { + for (BedrockCodec packetCodec : SUPPORTED_BEDROCK_CODECS) { if (packetCodec.getProtocolVersion() == protocolVersion) { return packetCodec; } diff --git a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/PaletteManager.java b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/PaletteManager.java index 1efc1fb..fdc5a63 100644 --- a/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/PaletteManager.java +++ b/serverlist-server/src/main/com/pyratron/pugmatt/bedrockconnect/utils/PaletteManager.java @@ -4,14 +4,14 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.nukkitx.nbt.NBTInputStream; -import com.nukkitx.nbt.NbtList; -import com.nukkitx.nbt.NbtMap; -import com.nukkitx.nbt.NbtUtils; -import com.nukkitx.protocol.bedrock.data.inventory.ItemData; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import main.com.pyratron.pugmatt.bedrockconnect.BedrockConnect; +import org.cloudburstmc.nbt.NBTInputStream; +import org.cloudburstmc.nbt.NbtList; +import org.cloudburstmc.nbt.NbtMap; +import org.cloudburstmc.nbt.NbtUtils; +import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import java.io.*; import java.nio.ByteOrder; @@ -85,7 +85,7 @@ public class PaletteManager { try { NbtMap tag = (NbtMap) NbtUtils.createReaderLE(bais).readTag(); creativeItems.add(ItemData.builder() - .id(itemNode.get("id").asInt()) + .netId(itemNode.get("id").asInt()) .damage(damage) .count(1) .tag(tag).build()); @@ -94,7 +94,7 @@ public class PaletteManager { } } else { creativeItems.add(ItemData.builder() - .id(itemNode.get("id").asInt()) + .netId(itemNode.get("id").asInt()) .damage(damage) .count(1).build()); } |
