From f390682e18b2cf0ecc8c7b4fecb603c3f9041bb4 Mon Sep 17 00:00:00 2001 From: Andrew Steinborn Date: Sun, 19 Oct 2025 18:29:13 -0400 Subject: [PATCH] convert some more packets to records --- .../command/builtin/VelocityCommand.java | 1 - .../backend/BackendPlaySessionHandler.java | 32 ++++---- .../backend/ConfigSessionHandler.java | 12 +-- .../connection/client/AuthSessionHandler.java | 2 +- .../client/ClientConfigSessionHandler.java | 2 +- .../connection/client/ConnectedPlayer.java | 4 +- .../client/InitialInboundConnection.java | 6 +- .../client/InitialLoginSessionHandler.java | 10 +-- .../client/LoginInboundConnection.java | 4 +- .../util/ConnectionRequestResults.java | 4 +- .../proxy/protocol/packet/BossBarPacket.java | 8 -- .../protocol/packet/DisconnectPacket.java | 33 +------- .../packet/EncryptionRequestPacket.java | 17 ----- .../protocol/packet/HandshakePacket.java | 76 +++---------------- .../protocol/packet/KeepAlivePacket.java | 11 --- .../packet/LoginPluginResponsePacket.java | 8 -- .../packet/ResourcePackRequestPacket.java | 71 +++++------------ .../protocol/packet/ServerLoginPacket.java | 66 +++++----------- .../ServerboundCookieResponsePacket.java | 8 -- .../packet/TabCompleteResponsePacket.java | 2 +- .../proxy/protocol/PacketRegistryTest.java | 32 ++++---- 21 files changed, 110 insertions(+), 299 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/VelocityCommand.java b/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/VelocityCommand.java index cc9caa5d1..bfa13597e 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/VelocityCommand.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/VelocityCommand.java @@ -55,7 +55,6 @@ import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.JoinConfiguration; import net.kyori.adventure.text.TextComponent; import net.kyori.adventure.text.TranslatableComponent; import net.kyori.adventure.text.event.ClickEvent; diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/BackendPlaySessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/BackendPlaySessionHandler.java index 1d5219c26..f6fb8a973 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/BackendPlaySessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/BackendPlaySessionHandler.java @@ -158,7 +158,7 @@ public class BackendPlaySessionHandler implements MinecraftSessionHandler { @Override public boolean handle(KeepAlivePacket packet) { - serverConn.getPendingPings().put(packet.getRandomId(), System.nanoTime()); + serverConn.getPendingPings().put(packet.randomId(), System.nanoTime()); return false; // forwards on } @@ -178,10 +178,10 @@ public class BackendPlaySessionHandler implements MinecraftSessionHandler { @Override public boolean handle(BossBarPacket packet) { if (serverConn.getPlayer().getProtocolVersion().lessThan(ProtocolVersion.MINECRAFT_1_20_2)) { - if (packet.getAction() == BossBarPacket.ADD) { - playerSessionHandler.getServerBossBars().add(packet.getUuid()); - } else if (packet.getAction() == BossBarPacket.REMOVE) { - playerSessionHandler.getServerBossBars().remove(packet.getUuid()); + if (packet.action() == BossBarPacket.ADD) { + playerSessionHandler.getServerBossBars().add(packet.uuid()); + } else if (packet.action() == BossBarPacket.REMOVE) { + playerSessionHandler.getServerBossBars().remove(packet.uuid()); } } return false; // forward @@ -190,13 +190,13 @@ public class BackendPlaySessionHandler implements MinecraftSessionHandler { @Override public boolean handle(final ResourcePackRequestPacket packet) { final ResourcePackInfo.Builder builder = new VelocityResourcePackInfo.BuilderImpl( - Preconditions.checkNotNull(packet.getUrl())) - .setId(packet.getId()) - .setPrompt(packet.getPrompt() == null ? null : packet.getPrompt().getComponent()) + Preconditions.checkNotNull(packet.url())) + .setId(packet.id()) + .setPrompt(packet.prompt() == null ? null : packet.prompt().getComponent()) .setShouldForce(packet.isRequired()) .setOrigin(ResourcePackInfo.Origin.DOWNSTREAM_SERVER); - final String hash = packet.getHash(); + final String hash = packet.hash(); if (hash != null && !hash.isEmpty()) { if (PLAUSIBLE_SHA1_HASH.matcher(hash).matches()) { builder.setHash(ByteBufUtil.decodeHexDump(hash)); @@ -222,14 +222,14 @@ public class BackendPlaySessionHandler implements MinecraftSessionHandler { // Do not apply a resource pack that has already been applied if (serverConn.getConnection() != null) { serverConn.getConnection().write(new ResourcePackResponsePacket( - packet.getId(), packet.getHash(), PlayerResourcePackStatusEvent.Status.ACCEPTED)); + packet.id(), packet.hash(), PlayerResourcePackStatusEvent.Status.ACCEPTED)); if (serverConn.getConnection().getProtocolVersion().noLessThan(ProtocolVersion.MINECRAFT_1_20_3)) { serverConn.getConnection().write(new ResourcePackResponsePacket( - packet.getId(), packet.getHash(), + packet.id(), packet.hash(), PlayerResourcePackStatusEvent.Status.DOWNLOADED)); } serverConn.getConnection().write(new ResourcePackResponsePacket( - packet.getId(), packet.getHash(), + packet.id(), packet.hash(), PlayerResourcePackStatusEvent.Status.SUCCESSFUL)); } if (modifiedPack) { @@ -241,16 +241,16 @@ public class BackendPlaySessionHandler implements MinecraftSessionHandler { } } else if (serverConn.getConnection() != null) { serverConn.getConnection().write(new ResourcePackResponsePacket( - packet.getId(), - packet.getHash(), + packet.id(), + packet.hash(), PlayerResourcePackStatusEvent.Status.DECLINED )); } }, playerConnection.eventLoop()).exceptionally((ex) -> { if (serverConn.getConnection() != null) { serverConn.getConnection().write(new ResourcePackResponsePacket( - packet.getId(), - packet.getHash(), + packet.id(), + packet.hash(), PlayerResourcePackStatusEvent.Status.DECLINED )); } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/ConfigSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/ConfigSessionHandler.java index baa5e4add..709f43982 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/ConfigSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/ConfigSessionHandler.java @@ -141,7 +141,7 @@ public class ConfigSessionHandler implements MinecraftSessionHandler { @Override public boolean handle(KeepAlivePacket packet) { - serverConn.getPendingPings().put(packet.getRandomId(), System.nanoTime()); + serverConn.getPendingPings().put(packet.randomId(), System.nanoTime()); serverConn.getPlayer().getConnection().write(packet); return true; } @@ -171,11 +171,11 @@ public class ConfigSessionHandler implements MinecraftSessionHandler { if (serverConn.getConnection() != null) { // We can technically skip these first 2 states, however, for conformity to normal state flow expectations... serverConn.getConnection().write(new ResourcePackResponsePacket( - packet.getId(), packet.getHash(), PlayerResourcePackStatusEvent.Status.ACCEPTED)); + packet.id(), packet.hash(), PlayerResourcePackStatusEvent.Status.ACCEPTED)); serverConn.getConnection().write(new ResourcePackResponsePacket( - packet.getId(), packet.getHash(), PlayerResourcePackStatusEvent.Status.DOWNLOADED)); + packet.id(), packet.hash(), PlayerResourcePackStatusEvent.Status.DOWNLOADED)); serverConn.getConnection().write(new ResourcePackResponsePacket( - packet.getId(), packet.getHash(), PlayerResourcePackStatusEvent.Status.SUCCESSFUL)); + packet.id(), packet.hash(), PlayerResourcePackStatusEvent.Status.SUCCESSFUL)); } if (modifiedPack) { logger.warn("A plugin has tried to modify a ResourcePack provided by the backend server " @@ -187,12 +187,12 @@ public class ConfigSessionHandler implements MinecraftSessionHandler { } } else if (serverConn.getConnection() != null) { serverConn.getConnection().write(new ResourcePackResponsePacket( - packet.getId(), packet.getHash(), PlayerResourcePackStatusEvent.Status.DECLINED)); + packet.id(), packet.hash(), PlayerResourcePackStatusEvent.Status.DECLINED)); } }, playerConnection.eventLoop()).exceptionally((ex) -> { if (serverConn.getConnection() != null) { serverConn.getConnection().write(new ResourcePackResponsePacket( - packet.getId(), packet.getHash(), PlayerResourcePackStatusEvent.Status.DECLINED)); + packet.id(), packet.hash(), PlayerResourcePackStatusEvent.Status.DECLINED)); } logger.error("Exception while handling resource pack send for {}", playerConnection, ex); return null; diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/AuthSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/AuthSessionHandler.java index 60c7ac7d2..0fa890203 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/AuthSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/AuthSessionHandler.java @@ -195,7 +195,7 @@ public class AuthSessionHandler implements MinecraftSessionHandler { @Override public boolean handle(ServerboundCookieResponsePacket packet) { server.getEventManager() - .fire(new CookieReceiveEvent(connectedPlayer, packet.getKey(), packet.getPayload())) + .fire(new CookieReceiveEvent(connectedPlayer, packet.key(), packet.payload())) .thenAcceptAsync(event -> { if (event.getResult().isAllowed()) { // The received cookie must have been requested by a proxy plugin in login phase, diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandler.java index 776f99d68..26e601ed5 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientConfigSessionHandler.java @@ -188,7 +188,7 @@ public class ClientConfigSessionHandler implements MinecraftSessionHandler { @Override public boolean handle(ServerboundCookieResponsePacket packet) { server.getEventManager() - .fire(new CookieReceiveEvent(player, packet.getKey(), packet.getPayload())) + .fire(new CookieReceiveEvent(player, packet.key(), packet.payload())) .thenAcceptAsync(event -> { if (event.getResult().isAllowed()) { final VelocityServerConnection serverConnection = player.getConnectionInFlight(); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java index 9dc6c67ec..427e69ae5 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java @@ -735,7 +735,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player, return; } - Component disconnectReason = disconnect.getReason().getComponent(); + Component disconnectReason = disconnect.reason().getComponent(); String plainTextReason = PASS_THRU_TRANSLATE.serialize(disconnectReason); if (connectedServer != null && connectedServer.getServerInfo().equals(server.getServerInfo())) { if (this.server.getConfiguration().isLogPlayerConnections()) { @@ -1349,7 +1349,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player, private boolean sendKeepAliveToBackend(final @Nullable VelocityServerConnection serverConnection, final @NotNull KeepAlivePacket packet) { if (serverConnection != null) { - final Long sentTime = serverConnection.getPendingPings().remove(packet.getRandomId()); + final Long sentTime = serverConnection.getPendingPings().remove(packet.randomId()); if (sentTime != null) { final MinecraftConnection smc = serverConnection.getConnection(); if (smc != null) { diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialInboundConnection.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialInboundConnection.java index 35368844f..4ded1dfe6 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialInboundConnection.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialInboundConnection.java @@ -61,12 +61,12 @@ public final class InitialInboundConnection implements VelocityInboundConnection @Override public Optional getVirtualHost() { - return Optional.of(InetSocketAddress.createUnresolved(cleanedAddress, handshake.getPort())); + return Optional.of(InetSocketAddress.createUnresolved(cleanedAddress, handshake.port())); } @Override public Optional getRawVirtualHost() { - return Optional.of(handshake.getServerAddress()); + return Optional.of(handshake.serverAddress()); } @Override @@ -101,7 +101,7 @@ public final class InitialInboundConnection implements VelocityInboundConnection @Override public HandshakeIntent getHandshakeIntent() { - return handshake.getIntent(); + return handshake.intent(); } /** diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialLoginSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialLoginSessionHandler.java index 4cb81fe9f..8de17ca5a 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialLoginSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/InitialLoginSessionHandler.java @@ -120,7 +120,7 @@ public class InitialLoginSessionHandler implements MinecraftSessionHandler { inbound.setPlayerKey(playerKey); this.login = packet; - final PreLoginEvent event = new PreLoginEvent(inbound, login.getUsername(), login.holderUuid()); + final PreLoginEvent event = new PreLoginEvent(inbound, login.username(), login.holderUuid()); server.getEventManager().fire(event).thenRunAsync(() -> { if (mcConnection.isClosed()) { // The player was disconnected @@ -146,13 +146,13 @@ public class InitialLoginSessionHandler implements MinecraftSessionHandler { && (server.getConfiguration().isOnlineMode() || result.isOnlineModeAllowed())) { // Request encryption. EncryptionRequestPacket request = generateEncryptionRequest(); - this.verify = Arrays.copyOf(request.getVerifyToken(), 4); + this.verify = Arrays.copyOf(request.verifyToken(), 4); mcConnection.write(request); this.currentState = LoginState.ENCRYPTION_REQUEST_SENT; } else { mcConnection.setActiveSessionHandler(StateRegistry.LOGIN, new AuthSessionHandler(server, inbound, - GameProfile.forOfflinePlayer(login.getUsername()), false)); + GameProfile.forOfflinePlayer(login.username()), false)); } }); }); @@ -203,7 +203,7 @@ public class InitialLoginSessionHandler implements MinecraftSessionHandler { String playerIp = ((InetSocketAddress) mcConnection.getRemoteAddress()).getHostString(); String url = String.format(MOJANG_HASJOINED_URL, - urlFormParameterEscaper().escape(login.getUsername()), serverId); + urlFormParameterEscaper().escape(login.username()), serverId); if (server.getConfiguration().shouldPreventClientProxyConnections()) { url += "&ip=" + urlFormParameterEscaper().escape(playerIp); @@ -263,7 +263,7 @@ public class InitialLoginSessionHandler implements MinecraftSessionHandler { // Something else went wrong logger.error( "Got an unexpected error code {} whilst contacting Mojang to log in {} ({})", - response.statusCode(), login.getUsername(), playerIp); + response.statusCode(), login.username(), playerIp); inbound.disconnect(Component.translatable("multiplayer.disconnect.authservers_down")); } }, mcConnection.eventLoop()) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/LoginInboundConnection.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/LoginInboundConnection.java index 9922c5095..8ae1e913f 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/LoginInboundConnection.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/LoginInboundConnection.java @@ -133,10 +133,10 @@ public class LoginInboundConnection implements LoginPhaseConnection, KeyIdentifi } void handleLoginPluginResponse(final LoginPluginResponsePacket response) { - final MessageConsumer consumer = this.outstandingResponses.remove(response.getId()); + final MessageConsumer consumer = this.outstandingResponses.remove(response.id()); if (consumer != null) { try { - consumer.onMessageResponse(response.isSuccess() ? ByteBufUtil.getBytes(response.content()) + consumer.onMessageResponse(response.success() ? ByteBufUtil.getBytes(response.content()) : null); } finally { final Runnable onAllMessagesHandled = this.onAllMessagesHandled; diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/util/ConnectionRequestResults.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/util/ConnectionRequestResults.java index d7c267589..7b11b21bf 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/util/ConnectionRequestResults.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/util/ConnectionRequestResults.java @@ -63,11 +63,11 @@ public class ConnectionRequestResults { } public static Impl forDisconnect(DisconnectPacket disconnect, RegisteredServer server) { - return forDisconnect(disconnect.getReason().getComponent(), server); + return forDisconnect(disconnect.reason().getComponent(), server); } public static Impl forUnsafeDisconnect(DisconnectPacket disconnect, RegisteredServer server) { - return new Impl(Status.SERVER_DISCONNECTED, disconnect.getReason().getComponent(), server, + return new Impl(Status.SERVER_DISCONNECTED, disconnect.reason().getComponent(), server, false); } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/BossBarPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/BossBarPacket.java index 103d35cb0..f4c9b4243 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/BossBarPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/BossBarPacket.java @@ -65,14 +65,6 @@ public record BossBarPacket(UUID uuid, int action, @Nullable ComponentHolder nam public static final int UPDATE_STYLE = 4; public static final int UPDATE_PROPERTIES = 5; - public UUID getUuid() { - return uuid; - } - - public int getAction() { - return action; - } - public static BossBarPacket createAddPacket( final UUID id, final BossBar bar, diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/DisconnectPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/DisconnectPacket.java index d272dd16b..0526a9ace 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/DisconnectPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/DisconnectPacket.java @@ -28,36 +28,11 @@ import com.velocitypowered.proxy.protocol.packet.chat.ComponentHolder; import io.netty.buffer.ByteBuf; import net.kyori.adventure.text.Component; -public final class DisconnectPacket implements MinecraftPacket { +public record DisconnectPacket(StateRegistry state, ComponentHolder reason) + implements MinecraftPacket { - private final ComponentHolder reason; - private final StateRegistry state; - - public DisconnectPacket(StateRegistry state, ComponentHolder reason) { - this.state = state; - this.reason = Preconditions.checkNotNull(reason, "reason"); - } - - public ComponentHolder reason() { - if (reason == null) { - throw new IllegalStateException("No reason specified"); - } - return reason; - } - - public ComponentHolder getReason() { - return reason(); - } - - public StateRegistry state() { - return state; - } - - @Override - public String toString() { - return "Disconnect{" - + "reason='" + reason + '\'' - + '}'; + public DisconnectPacket { + Preconditions.checkNotNull(reason, "reason"); } @Override diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/EncryptionRequestPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/EncryptionRequestPacket.java index 5a4ea974b..91d649b17 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/EncryptionRequestPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/EncryptionRequestPacket.java @@ -24,7 +24,6 @@ import com.velocitypowered.proxy.protocol.MinecraftPacket; import com.velocitypowered.proxy.protocol.PacketCodec; import com.velocitypowered.proxy.protocol.ProtocolUtils; import io.netty.buffer.ByteBuf; -import java.util.Arrays; public final class EncryptionRequestPacket implements MinecraftPacket { @@ -57,22 +56,6 @@ public final class EncryptionRequestPacket implements MinecraftPacket { return shouldAuthenticate; } - public byte[] getPublicKey() { - return publicKey(); - } - - public byte[] getVerifyToken() { - return verifyToken(); - } - - @Override - public String toString() { - return "EncryptionRequest{" - + "publicKey=" + Arrays.toString(publicKey) - + ", verifyToken=" + Arrays.toString(verifyToken) - + '}'; - } - @Override public boolean handle(MinecraftSessionHandler handler) { return handler.handle(this); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/HandshakePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/HandshakePacket.java index 9fd1943bb..f4d4a407b 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/HandshakePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/HandshakePacket.java @@ -27,75 +27,19 @@ import com.velocitypowered.proxy.protocol.PacketCodec; import com.velocitypowered.proxy.protocol.ProtocolUtils; import io.netty.buffer.ByteBuf; -public final class HandshakePacket implements MinecraftPacket { +public record HandshakePacket(ProtocolVersion protocolVersion, String serverAddress, int port, + HandshakeIntent intent) + implements MinecraftPacket { // This size was chosen to ensure Forge clients can still connect even with very long hostnames. // While DNS technically allows any character to be used, in practice ASCII is used. private static final int MAXIMUM_HOSTNAME_LENGTH = 255 + HANDSHAKE_HOSTNAME_TOKEN.length() + 1; - private final ProtocolVersion protocolVersion; - private final String serverAddress; - private final int port; - private final HandshakeIntent intent; - private final int nextStatus; - - public HandshakePacket() { - this(ProtocolVersion.MINIMUM_VERSION, "", 0, HandshakeIntent.LOGIN); - } - - public HandshakePacket(ProtocolVersion protocolVersion, String serverAddress, int port, - HandshakeIntent intent) { - this.protocolVersion = protocolVersion; - this.serverAddress = serverAddress; - this.port = port; - this.intent = intent; - this.nextStatus = intent.id(); - } - - public ProtocolVersion protocolVersion() { - return protocolVersion; - } - - public String serverAddress() { - return serverAddress; - } - - public int port() { - return port; - } + public static final HandshakePacket DEFAULT = new HandshakePacket(ProtocolVersion.MINIMUM_VERSION, "", 0, + HandshakeIntent.LOGIN); public int nextStatus() { - return this.nextStatus; - } - - public HandshakeIntent intent() { - return this.intent; - } - - public ProtocolVersion getProtocolVersion() { - return protocolVersion(); - } - - public String getServerAddress() { - return serverAddress(); - } - - public int getPort() { - return port(); - } - - public HandshakeIntent getIntent() { - return intent(); - } - - @Override - public String toString() { - return "Handshake{" - + "protocolVersion=" + protocolVersion - + ", serverAddress='" + serverAddress + '\'' - + ", port=" + port - + ", nextStatus=" + nextStatus - + '}'; + return intent.id(); } @Override @@ -121,10 +65,10 @@ public final class HandshakePacket implements MinecraftPacket { @Override public void encode(HandshakePacket packet, ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersion ignored) { - ProtocolUtils.writeVarInt(buf, packet.protocolVersion.getProtocol()); - ProtocolUtils.writeString(buf, packet.serverAddress); - buf.writeShort(packet.port); - ProtocolUtils.writeVarInt(buf, packet.nextStatus); + ProtocolUtils.writeVarInt(buf, packet.protocolVersion().getProtocol()); + ProtocolUtils.writeString(buf, packet.serverAddress()); + buf.writeShort(packet.port()); + ProtocolUtils.writeVarInt(buf, packet.nextStatus()); } @Override diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/KeepAlivePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/KeepAlivePacket.java index a24668a4b..1689ce1c9 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/KeepAlivePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/KeepAlivePacket.java @@ -26,17 +26,6 @@ import io.netty.buffer.ByteBuf; public record KeepAlivePacket(long randomId) implements MinecraftPacket { - public long getRandomId() { - return randomId; - } - - @Override - public String toString() { - return "KeepAlive{" - + "randomId=" + randomId - + '}'; - } - @Override public boolean handle(MinecraftSessionHandler handler) { return handler.handle(this); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/LoginPluginResponsePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/LoginPluginResponsePacket.java index ba4b520ea..7ee5514be 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/LoginPluginResponsePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/LoginPluginResponsePacket.java @@ -47,14 +47,6 @@ public final class LoginPluginResponsePacket extends DefaultByteBufHolder return success; } - public int getId() { - return id(); - } - - public boolean isSuccess() { - return success(); - } - @Override public String toString() { return "LoginPluginResponse{" diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ResourcePackRequestPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ResourcePackRequestPacket.java index eb2aaf3dc..27d951e5b 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ResourcePackRequestPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ResourcePackRequestPacket.java @@ -33,54 +33,25 @@ import java.util.UUID; import java.util.regex.Pattern; import org.checkerframework.checker.nullness.qual.Nullable; -public final class ResourcePackRequestPacket implements MinecraftPacket { - - private final @Nullable UUID id; // 1.20.3+ - private final String url; - private final String hash; - private final boolean isRequired; // 1.17+ - private final @Nullable ComponentHolder prompt; // 1.17+ +public record ResourcePackRequestPacket( + @Nullable UUID id, // 1.20.3+ + String url, + String hash, + boolean isRequired, // 1.17+ + @Nullable ComponentHolder prompt // 1.17+ +) implements MinecraftPacket { private static final Pattern PLAUSIBLE_SHA1_HASH = Pattern.compile("^[a-z0-9]{40}$"); // 1.20.2+ - public ResourcePackRequestPacket(@Nullable UUID id, String url, String hash, - boolean isRequired, @Nullable ComponentHolder prompt) { - this.id = id; - this.url = url; - this.hash = hash; - this.isRequired = isRequired; - this.prompt = prompt; - } - - public @Nullable UUID getId() { - return id; - } - - public String getUrl() { - return url; - } - - public boolean isRequired() { - return isRequired; - } - - public String getHash() { - return hash; - } - - public @Nullable ComponentHolder getPrompt() { - return prompt; - } - public VelocityResourcePackInfo toServerPromptedPack() { final ResourcePackInfo.Builder builder = - new VelocityResourcePackInfo.BuilderImpl(Preconditions.checkNotNull(url)) - .setId(id).setPrompt(prompt == null ? null : prompt.getComponent()) - .setShouldForce(isRequired).setOrigin(ResourcePackInfo.Origin.DOWNSTREAM_SERVER); + new VelocityResourcePackInfo.BuilderImpl(Preconditions.checkNotNull(url())) + .setId(id()).setPrompt(prompt() == null ? null : prompt().getComponent()) + .setShouldForce(isRequired()).setOrigin(ResourcePackInfo.Origin.DOWNSTREAM_SERVER); - if (hash != null && !hash.isEmpty()) { - if (PLAUSIBLE_SHA1_HASH.matcher(hash).matches()) { - builder.setHash(ByteBufUtil.decodeHexDump(hash)); + if (hash() != null && !hash().isEmpty()) { + if (PLAUSIBLE_SHA1_HASH.matcher(hash()).matches()) { + builder.setHash(ByteBufUtil.decodeHexDump(hash())); } } return (VelocityResourcePackInfo) builder.build(); @@ -129,21 +100,21 @@ public final class ResourcePackRequestPacket implements MinecraftPacket { public void encode(ResourcePackRequestPacket packet, ByteBuf buf, Direction direction, ProtocolVersion protocolVersion) { if (protocolVersion.noLessThan(ProtocolVersion.MINECRAFT_1_20_3)) { - if (packet.id == null) { + if (packet.id() == null) { throw new IllegalStateException("Resource pack id not set yet!"); } - ProtocolUtils.writeUuid(buf, packet.id); + ProtocolUtils.writeUuid(buf, packet.id()); } - if (packet.url == null || packet.hash == null) { + if (packet.url() == null || packet.hash() == null) { throw new IllegalStateException("Packet not fully filled in yet!"); } - ProtocolUtils.writeString(buf, packet.url); - ProtocolUtils.writeString(buf, packet.hash); + ProtocolUtils.writeString(buf, packet.url()); + ProtocolUtils.writeString(buf, packet.hash()); if (protocolVersion.noLessThan(ProtocolVersion.MINECRAFT_1_17)) { - buf.writeBoolean(packet.isRequired); - if (packet.prompt != null) { + buf.writeBoolean(packet.isRequired()); + if (packet.prompt() != null) { buf.writeBoolean(true); - packet.prompt.write(buf); + packet.prompt().write(buf); } else { buf.writeBoolean(false); } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ServerLoginPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ServerLoginPacket.java index 334497830..881dc49ee 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ServerLoginPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ServerLoginPacket.java @@ -28,55 +28,29 @@ import io.netty.buffer.ByteBuf; import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; -public final class ServerLoginPacket implements MinecraftPacket { +public record ServerLoginPacket( + String username, + @Nullable IdentifiedKey playerKey, // Introduced in 1.19.3 + @Nullable UUID holderUuid // Used for key revision 2 +) implements MinecraftPacket { private static final QuietDecoderException EMPTY_USERNAME = new QuietDecoderException( "Empty username!"); - private final String username; - private final @Nullable IdentifiedKey playerKey; // Introduced in 1.19.3 - private final @Nullable UUID holderUuid; // Used for key revision 2 - + /** + * Creates a ServerLoginPacket with a player key. + */ public ServerLoginPacket(String username, @Nullable IdentifiedKey playerKey) { this(username, playerKey, null); } + /** + * Creates a ServerLoginPacket with a holder UUID. + */ public ServerLoginPacket(String username, @Nullable UUID holderUuid) { this(username, null, holderUuid); } - private ServerLoginPacket(String username, @Nullable IdentifiedKey playerKey, - @Nullable UUID holderUuid) { - this.username = username; - this.playerKey = playerKey; - this.holderUuid = holderUuid; - } - - public String username() { - return username; - } - - public String getUsername() { - return username(); - } - - public @Nullable IdentifiedKey playerKey() { - return this.playerKey; - } - - public @Nullable UUID holderUuid() { - return holderUuid; - } - - @Override - public String toString() { - return "ServerLogin{" - + "username='" + username + '\'' - + "playerKey='" + playerKey + '\'' - + "holderUUID='" + holderUuid + '\'' - + '}'; - } - @Override public boolean handle(MinecraftSessionHandler handler) { return handler.handle(this); @@ -127,33 +101,33 @@ public final class ServerLoginPacket implements MinecraftPacket { @Override public void encode(ServerLoginPacket packet, ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersion version) { - if (packet.username == null) { + if (packet.username() == null) { throw new IllegalStateException("No username found!"); } - ProtocolUtils.writeString(buf, packet.username); + ProtocolUtils.writeString(buf, packet.username()); if (version.noLessThan(ProtocolVersion.MINECRAFT_1_19)) { if (version.lessThan(ProtocolVersion.MINECRAFT_1_19_3)) { - if (packet.playerKey != null) { + if (packet.playerKey() != null) { buf.writeBoolean(true); - ProtocolUtils.writePlayerKey(buf, packet.playerKey); + ProtocolUtils.writePlayerKey(buf, packet.playerKey()); } else { buf.writeBoolean(false); } } if (version.noLessThan(ProtocolVersion.MINECRAFT_1_20_2)) { - ProtocolUtils.writeUuid(buf, packet.holderUuid); + ProtocolUtils.writeUuid(buf, packet.holderUuid()); return; } if (version.noLessThan(ProtocolVersion.MINECRAFT_1_19_1)) { - if (packet.playerKey != null && packet.playerKey.getSignatureHolder() != null) { + if (packet.playerKey() != null && packet.playerKey().getSignatureHolder() != null) { buf.writeBoolean(true); - ProtocolUtils.writeUuid(buf, packet.playerKey.getSignatureHolder()); - } else if (packet.holderUuid != null) { + ProtocolUtils.writeUuid(buf, packet.playerKey().getSignatureHolder()); + } else if (packet.holderUuid() != null) { buf.writeBoolean(true); - ProtocolUtils.writeUuid(buf, packet.holderUuid); + ProtocolUtils.writeUuid(buf, packet.holderUuid()); } else { buf.writeBoolean(false); } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ServerboundCookieResponsePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ServerboundCookieResponsePacket.java index 0eae56d52..88fe984bc 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ServerboundCookieResponsePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/ServerboundCookieResponsePacket.java @@ -30,14 +30,6 @@ import org.checkerframework.checker.nullness.qual.Nullable; public record ServerboundCookieResponsePacket(Key key, byte @Nullable [] payload) implements MinecraftPacket { - public Key getKey() { - return key; - } - - public byte @Nullable [] getPayload() { - return payload; - } - @Override public boolean handle(MinecraftSessionHandler handler) { return handler.handle(this); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/TabCompleteResponsePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/TabCompleteResponsePacket.java index b4de69fb3..ee311e799 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/TabCompleteResponsePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/TabCompleteResponsePacket.java @@ -42,7 +42,7 @@ public final class TabCompleteResponsePacket implements MinecraftPacket { this.transactionId = transactionId; this.start = start; this.length = length; - this.offers = offers; + this.offers = List.copyOf(offers); } public int transactionId() { diff --git a/proxy/src/test/java/com/velocitypowered/proxy/protocol/PacketRegistryTest.java b/proxy/src/test/java/com/velocitypowered/proxy/protocol/PacketRegistryTest.java index 6ccfd4ec9..bcb24f266 100644 --- a/proxy/src/test/java/com/velocitypowered/proxy/protocol/PacketRegistryTest.java +++ b/proxy/src/test/java/com/velocitypowered/proxy/protocol/PacketRegistryTest.java @@ -71,7 +71,7 @@ class PacketRegistryTest { assertNotNull(packet, "Packet was not found in registry"); assertEquals(HandshakePacket.Codec.class, packet.getClass(), "Registry returned wrong class"); - assertEquals(0, registry.forVersion(MINECRAFT_1_12).getPacketId(new HandshakePacket()), + assertEquals(0, registry.forVersion(MINECRAFT_1_12).getPacketId(HandshakePacket.DEFAULT), "Registry did not return the correct packet ID"); } @@ -81,7 +81,7 @@ class PacketRegistryTest { PacketCodec packet = registry.forVersion(MINECRAFT_1_12_1).getCodec(0); assertNotNull(packet, "Packet was not found in registry"); assertEquals(HandshakePacket.Codec.class, packet.getClass(), "Registry returned wrong class"); - HandshakePacket handshakePacket = new HandshakePacket(); + HandshakePacket handshakePacket = HandshakePacket.DEFAULT; assertEquals(0, registry.forVersion(MINECRAFT_1_12_1).getPacketId(handshakePacket), "Registry did not return the correct packet ID"); assertEquals(0, registry.forVersion(MINECRAFT_1_14_2).getPacketId(handshakePacket), @@ -227,9 +227,9 @@ class PacketRegistryTest { .build(); // 1.12 should have ID 0x00 - assertEquals(0x00, registry.forVersion(MINECRAFT_1_12).getPacketId(new HandshakePacket())); + assertEquals(0x00, registry.forVersion(MINECRAFT_1_12).getPacketId(HandshakePacket.DEFAULT)); // 1.13 should have ID 0x01 - assertEquals(0x01, registry.forVersion(MINECRAFT_1_13).getPacketId(new HandshakePacket())); + assertEquals(0x01, registry.forVersion(MINECRAFT_1_13).getPacketId(HandshakePacket.DEFAULT)); } @Test @@ -242,7 +242,7 @@ class PacketRegistryTest { VersionRange.of(MINECRAFT_1_12, 0x01)) .build(); - assertEquals(0x00, registry.forVersion(MINECRAFT_1_12).getPacketId(new HandshakePacket())); + assertEquals(0x00, registry.forVersion(MINECRAFT_1_12).getPacketId(HandshakePacket.DEFAULT)); assertEquals(0x01, registry.forVersion(MINECRAFT_1_12).getPacketId(new StatusPingPacket(0L))); assertNotNull(registry.forVersion(MINECRAFT_1_12).getCodec(0x00)); assertNotNull(registry.forVersion(MINECRAFT_1_12).getCodec(0x01)); @@ -311,7 +311,7 @@ class PacketRegistryTest { @Test void canDecodePacketReturnsTrue() { MultiVersionPacketRegistry registry = setupRegistry(); - assertTrue(registry.forVersion(MINECRAFT_1_12).canDecodePacket(new HandshakePacket()), + assertTrue(registry.forVersion(MINECRAFT_1_12).canDecodePacket(HandshakePacket.DEFAULT), "Should be able to decode HandshakePacket in 1.12"); } @@ -330,7 +330,7 @@ class PacketRegistryTest { .build(); // Encode-only packets can still be identified by class for encoding purposes - assertTrue(registry.forVersion(MINECRAFT_1_12).canDecodePacket(new HandshakePacket()), + assertTrue(registry.forVersion(MINECRAFT_1_12).canDecodePacket(HandshakePacket.DEFAULT), "Encode-only packets can be identified for encoding"); // But cannot be decoded by ID (not in packetIdToCodec) assertNull(registry.forVersion(MINECRAFT_1_12).getCodec(0x00), @@ -364,7 +364,7 @@ class PacketRegistryTest { SimplePacketRegistry registry = new SimplePacketRegistry(ProtocolUtils.Direction.CLIENTBOUND); registry.register(0x42, HandshakePacket.class, new HandshakePacket.Codec()); - int id = registry.getPacketId(new HandshakePacket()); + int id = registry.getPacketId(HandshakePacket.DEFAULT); assertEquals(0x42, id, "Should return correct packet ID"); } @@ -383,7 +383,7 @@ class PacketRegistryTest { SimplePacketRegistry registry = new SimplePacketRegistry(ProtocolUtils.Direction.CLIENTBOUND); registry.register(0x00, HandshakePacket.class, new HandshakePacket.Codec()); - assertTrue(registry.canDecodePacket(new HandshakePacket()), + assertTrue(registry.canDecodePacket(HandshakePacket.DEFAULT), "Should be able to decode registered packet"); assertFalse(registry.canDecodePacket(new StatusPingPacket(0L)), "Should not be able to decode unregistered packet"); @@ -405,8 +405,8 @@ class PacketRegistryTest { VersionRange.of(MINECRAFT_1_12, 0x01)) .build(); - assertEquals(0x00, clientbound.forVersion(MINECRAFT_1_12).getPacketId(new HandshakePacket())); - assertEquals(0x01, serverbound.forVersion(MINECRAFT_1_12).getPacketId(new HandshakePacket())); + assertEquals(0x00, clientbound.forVersion(MINECRAFT_1_12).getPacketId(HandshakePacket.DEFAULT)); + assertEquals(0x01, serverbound.forVersion(MINECRAFT_1_12).getPacketId(HandshakePacket.DEFAULT)); } // ==================== Wide Version Range Tests ==================== @@ -420,9 +420,9 @@ class PacketRegistryTest { .build(); // Should work for all supported versions in range - assertEquals(0x00, registry.forVersion(MINECRAFT_1_8).getPacketId(new HandshakePacket())); - assertEquals(0x00, registry.forVersion(MINECRAFT_1_12).getPacketId(new HandshakePacket())); - assertEquals(0x00, registry.forVersion(MINECRAFT_1_16_2).getPacketId(new HandshakePacket())); + assertEquals(0x00, registry.forVersion(MINECRAFT_1_8).getPacketId(HandshakePacket.DEFAULT)); + assertEquals(0x00, registry.forVersion(MINECRAFT_1_12).getPacketId(HandshakePacket.DEFAULT)); + assertEquals(0x00, registry.forVersion(MINECRAFT_1_16_2).getPacketId(HandshakePacket.DEFAULT)); } @Test @@ -433,7 +433,7 @@ class PacketRegistryTest { VersionRange.of(MINECRAFT_1_15, 0x00)) .build(); - assertEquals(0x00, registry.forVersion(MINECRAFT_1_15).getPacketId(new HandshakePacket())); - assertEquals(0x00, registry.forVersion(MINECRAFT_1_16_2).getPacketId(new HandshakePacket())); + assertEquals(0x00, registry.forVersion(MINECRAFT_1_15).getPacketId(HandshakePacket.DEFAULT)); + assertEquals(0x00, registry.forVersion(MINECRAFT_1_16_2).getPacketId(HandshakePacket.DEFAULT)); } } \ No newline at end of file