From 6eadce14b1724a830d0ec6b0b4475476bf7d00b1 Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 22 May 2026 22:21:08 +0200 Subject: [PATCH 1/8] Set TitleActionbarPacket's default action to SET_ACTION_BAR --- .../proxy/protocol/packet/title/TitleActionbarPacket.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java index f34983eaf9..6bab8dd679 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java @@ -28,7 +28,7 @@ public class TitleActionbarPacket extends GenericTitlePacket { private ComponentHolder component; public TitleActionbarPacket() { - setAction(ActionType.SET_TITLE); + setAction(ActionType.SET_ACTION_BAR); } @Override From aed4598902c1c4b4297ee8ed6c5f7b8dcb48f8d6 Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 22 May 2026 22:52:26 +0200 Subject: [PATCH 2/8] Enforce action types and drop method visibility --- .../protocol/packet/title/GenericTitlePacket.java | 14 ++++---------- .../protocol/packet/title/LegacyTitlePacket.java | 10 ++++++++-- .../packet/title/TitleActionbarPacket.java | 8 ++++++++ .../protocol/packet/title/TitleClearPacket.java | 8 ++++++-- .../protocol/packet/title/TitleSubtitlePacket.java | 8 ++++++++ .../protocol/packet/title/TitleTextPacket.java | 8 ++++++++ .../protocol/packet/title/TitleTimesPacket.java | 8 ++++++++ 7 files changed, 50 insertions(+), 14 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java index 8641173e74..75a01bef66 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java @@ -45,10 +45,9 @@ public int getAction(ProtocolVersion version) { } } - private ActionType action; - protected void setAction(ActionType action) { + void setAction(ActionType action) { this.action = action; } @@ -88,7 +87,6 @@ public void setFadeOut(int fadeOut) { throw new UnsupportedOperationException("Invalid function for this TitlePacket ActionType"); } - @Override public final void decode(ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersion version) { @@ -103,21 +101,17 @@ public final void decode(ByteBuf buf, ProtocolUtils.Direction direction, * @return GenericTitlePacket instance that follows the invoker type/version */ public static GenericTitlePacket constructTitlePacket(ActionType type, ProtocolVersion version) { - GenericTitlePacket packet = null; if (version.noLessThan(ProtocolVersion.MINECRAFT_1_17)) { - packet = switch (type) { + return switch (type) { case SET_ACTION_BAR -> new TitleActionbarPacket(); case SET_SUBTITLE -> new TitleSubtitlePacket(); case SET_TIMES -> new TitleTimesPacket(); case SET_TITLE -> new TitleTextPacket(); - case HIDE, RESET -> new TitleClearPacket(); + case HIDE, RESET -> new TitleClearPacket(type); default -> throw new IllegalArgumentException("Invalid ActionType"); }; } else { - packet = new LegacyTitlePacket(); + return new LegacyTitlePacket(type); } - packet.setAction(type); - return packet; } - } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java index ebae8a9e5b..d2879a7748 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java @@ -31,6 +31,13 @@ public class LegacyTitlePacket extends GenericTitlePacket { private int stay; private int fadeOut; + public LegacyTitlePacket() { + } + + public LegacyTitlePacket(ActionType type) { + setAction(type); + } + @Override public void encode(ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersion version) { if (version.lessThan(ProtocolVersion.MINECRAFT_1_11) @@ -54,11 +61,10 @@ && getAction() == ActionType.SET_ACTION_BAR) { case HIDE, RESET -> {} default -> throw new UnsupportedOperationException("Unknown action " + getAction()); } - } @Override - public void setAction(ActionType action) { + void setAction(ActionType action) { super.setAction(action); } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java index 6bab8dd679..4b21fe6471 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java @@ -31,6 +31,14 @@ public TitleActionbarPacket() { setAction(ActionType.SET_ACTION_BAR); } + @Override + void setAction(ActionType action) { + if (action != ActionType.SET_ACTION_BAR) { + throw new IllegalArgumentException("TitleActionbarPacket only accepts the SET_ACTION_BAR action."); + } + super.setAction(action); + } + @Override public void encode(ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersion version) { component.write(buf); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java index 1b3489691f..6b836e2ba9 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java @@ -28,10 +28,14 @@ public TitleClearPacket() { setAction(ActionType.HIDE); } + public TitleClearPacket(ActionType type) { + setAction(type); + } + @Override - public void setAction(ActionType action) { + void setAction(ActionType action) { if (action != ActionType.HIDE && action != ActionType.RESET) { - throw new IllegalArgumentException("TitleClearPacket only accepts CLEAR and RESET actions"); + throw new IllegalArgumentException("TitleClearPacket only accepts the CLEAR and RESET actions."); } super.setAction(action); } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java index 0f375ae20a..a6f21005af 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java @@ -31,6 +31,14 @@ public TitleSubtitlePacket() { setAction(ActionType.SET_SUBTITLE); } + @Override + void setAction(ActionType action) { + if (action != ActionType.SET_SUBTITLE) { + throw new IllegalArgumentException("TitleSubtitlePacket only accepts the SET_SUBTITLE action."); + } + super.setAction(action); + } + @Override public void encode(ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersion version) { component.write(buf); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java index ae75f5d618..11d45b43ba 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java @@ -31,6 +31,14 @@ public TitleTextPacket() { setAction(ActionType.SET_TITLE); } + @Override + void setAction(ActionType action) { + if (action != ActionType.SET_TITLE) { + throw new IllegalArgumentException("TitleTextPacket only accepts the SET_TITLE action."); + } + super.setAction(action); + } + @Override public void encode(ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersion version) { component.write(buf); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java index 8764a12fab..9eaed2ddbe 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java @@ -32,6 +32,14 @@ public TitleTimesPacket() { setAction(ActionType.SET_TIMES); } + @Override + void setAction(ActionType action) { + if (action != ActionType.SET_TIMES) { + throw new IllegalArgumentException("TitleTimesPacket only accepts the SET_TIMES action."); + } + super.setAction(action); + } + @Override public void encode(ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersion version) { buf.writeInt(fadeIn); From e796a1331651553b8e9de01879f08c365f20c71e Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 22 May 2026 23:02:20 +0200 Subject: [PATCH 3/8] Refactor setAction() away in favor of final action fields or set-in-stone action types --- .../packet/title/GenericTitlePacket.java | 11 ++------- .../packet/title/LegacyTitlePacket.java | 23 +++++++++++-------- .../packet/title/TitleActionbarPacket.java | 11 ++------- .../packet/title/TitleClearPacket.java | 18 ++++++++------- .../packet/title/TitleSubtitlePacket.java | 11 ++------- .../packet/title/TitleTextPacket.java | 11 ++------- .../packet/title/TitleTimesPacket.java | 11 ++------- 7 files changed, 33 insertions(+), 63 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java index 75a01bef66..c968737f42 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java @@ -26,6 +26,7 @@ public abstract class GenericTitlePacket implements MinecraftPacket { public enum ActionType { + SET_TITLE(0), SET_SUBTITLE(1), SET_ACTION_BAR(2), @@ -45,15 +46,7 @@ public int getAction(ProtocolVersion version) { } } - private ActionType action; - - void setAction(ActionType action) { - this.action = action; - } - - public final ActionType getAction() { - return action; - } + public abstract ActionType getAction(); public ComponentHolder getComponent() { throw new UnsupportedOperationException("Invalid function for this TitlePacket ActionType"); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java index d2879a7748..32c87abef0 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java @@ -26,30 +26,33 @@ public class LegacyTitlePacket extends GenericTitlePacket { + private final ActionType action; + private @Nullable ComponentHolder component; private int fadeIn; private int stay; private int fadeOut; public LegacyTitlePacket() { + this(null); } - public LegacyTitlePacket(ActionType type) { - setAction(type); + public LegacyTitlePacket(ActionType action) { + this.action = action; } @Override public void encode(ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersion version) { if (version.lessThan(ProtocolVersion.MINECRAFT_1_11) - && getAction() == ActionType.SET_ACTION_BAR) { + && this.action == ActionType.SET_ACTION_BAR) { throw new IllegalStateException("Action bars are only supported on 1.11 and newer"); } - ProtocolUtils.writeVarInt(buf, getAction().getAction(version)); + ProtocolUtils.writeVarInt(buf, this.action.getAction(version)); - switch (getAction()) { + switch (this.action) { case SET_TITLE, SET_SUBTITLE, SET_ACTION_BAR -> { if (component == null) { - throw new IllegalStateException("No component found for " + getAction()); + throw new IllegalStateException("No component found for " + this.action); } component.write(buf); } @@ -59,13 +62,13 @@ && getAction() == ActionType.SET_ACTION_BAR) { buf.writeInt(fadeOut); } case HIDE, RESET -> {} - default -> throw new UnsupportedOperationException("Unknown action " + getAction()); + default -> throw new UnsupportedOperationException("Unknown action " + this.action); } } @Override - void setAction(ActionType action) { - super.setAction(action); + public ActionType getAction() { + return action; } @Override @@ -111,7 +114,7 @@ public void setFadeOut(int fadeOut) { @Override public String toString() { return "GenericTitlePacket{" - + "action=" + getAction() + + "action=" + action + ", component='" + component + '\'' + ", fadeIn=" + fadeIn + ", stay=" + stay diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java index 4b21fe6471..ace02567f6 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java @@ -27,16 +27,9 @@ public class TitleActionbarPacket extends GenericTitlePacket { private ComponentHolder component; - public TitleActionbarPacket() { - setAction(ActionType.SET_ACTION_BAR); - } - @Override - void setAction(ActionType action) { - if (action != ActionType.SET_ACTION_BAR) { - throw new IllegalArgumentException("TitleActionbarPacket only accepts the SET_ACTION_BAR action."); - } - super.setAction(action); + public ActionType getAction() { + return ActionType.SET_ACTION_BAR; } @Override diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java index 6b836e2ba9..8df1abc6c3 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java @@ -24,20 +24,22 @@ public class TitleClearPacket extends GenericTitlePacket { - public TitleClearPacket() { - setAction(ActionType.HIDE); - } + private final ActionType action; - public TitleClearPacket(ActionType type) { - setAction(type); + public TitleClearPacket() { + this.action = ActionType.HIDE; } - @Override - void setAction(ActionType action) { + public TitleClearPacket(ActionType action) { if (action != ActionType.HIDE && action != ActionType.RESET) { throw new IllegalArgumentException("TitleClearPacket only accepts the CLEAR and RESET actions."); } - super.setAction(action); + this.action = action; + } + + @Override + public ActionType getAction() { + return action; } @Override diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java index a6f21005af..d4334afc31 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java @@ -27,16 +27,9 @@ public class TitleSubtitlePacket extends GenericTitlePacket { private ComponentHolder component; - public TitleSubtitlePacket() { - setAction(ActionType.SET_SUBTITLE); - } - @Override - void setAction(ActionType action) { - if (action != ActionType.SET_SUBTITLE) { - throw new IllegalArgumentException("TitleSubtitlePacket only accepts the SET_SUBTITLE action."); - } - super.setAction(action); + public ActionType getAction() { + return ActionType.SET_SUBTITLE; } @Override diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java index 11d45b43ba..71094584a6 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java @@ -27,16 +27,9 @@ public class TitleTextPacket extends GenericTitlePacket { private ComponentHolder component; - public TitleTextPacket() { - setAction(ActionType.SET_TITLE); - } - @Override - void setAction(ActionType action) { - if (action != ActionType.SET_TITLE) { - throw new IllegalArgumentException("TitleTextPacket only accepts the SET_TITLE action."); - } - super.setAction(action); + public ActionType getAction() { + return ActionType.SET_TITLE; } @Override diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java index 9eaed2ddbe..a9cc704dc7 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java @@ -28,16 +28,9 @@ public class TitleTimesPacket extends GenericTitlePacket { private int stay; private int fadeOut; - public TitleTimesPacket() { - setAction(ActionType.SET_TIMES); - } - @Override - void setAction(ActionType action) { - if (action != ActionType.SET_TIMES) { - throw new IllegalArgumentException("TitleTimesPacket only accepts the SET_TIMES action."); - } - super.setAction(action); + public ActionType getAction() { + return ActionType.SET_TIMES; } @Override From 9c2b0709202b284cb56ca321156c2a639f21f99f Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 22 May 2026 23:10:51 +0200 Subject: [PATCH 4/8] Use internal field --- .../proxy/protocol/packet/title/TitleClearPacket.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java index 8df1abc6c3..7f0cf9a641 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java @@ -44,13 +44,13 @@ public ActionType getAction() { @Override public void encode(ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersion version) { - buf.writeBoolean(getAction() == ActionType.RESET); + buf.writeBoolean(this.action == ActionType.RESET); } @Override public String toString() { return "TitleClearPacket{" - + ", resetTimes=" + (getAction() == ActionType.RESET) + + ", resetTimes=" + (this.action == ActionType.RESET) + '}'; } From 3c0f1710d5e7f78f6f6d40c456740fb92f3bc29c Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 22 May 2026 23:30:36 +0200 Subject: [PATCH 5/8] Throw instead of accidentally storing an invalid state --- .../proxy/protocol/packet/title/LegacyTitlePacket.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java index 32c87abef0..2cbc88a754 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java @@ -34,7 +34,8 @@ public class LegacyTitlePacket extends GenericTitlePacket { private int fadeOut; public LegacyTitlePacket() { - this(null); + // This method only exists to keep StateRegistry happy (all mappings are encode-only, the constructor isn't stored). + throw new AssertionError("A bare LegacyTitlePacket should never be instantiated"); } public LegacyTitlePacket(ActionType action) { From d3939c6b3babb5979b1f5b6164a11b07d315f44d Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 22 May 2026 23:31:21 +0200 Subject: [PATCH 6/8] Force getAction() returning non-null --- .../proxy/protocol/packet/title/GenericTitlePacket.java | 3 ++- .../proxy/protocol/packet/title/LegacyTitlePacket.java | 3 ++- .../proxy/protocol/packet/title/TitleActionbarPacket.java | 3 ++- .../proxy/protocol/packet/title/TitleClearPacket.java | 3 ++- .../proxy/protocol/packet/title/TitleSubtitlePacket.java | 3 ++- .../proxy/protocol/packet/title/TitleTextPacket.java | 3 ++- .../proxy/protocol/packet/title/TitleTimesPacket.java | 3 ++- 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java index c968737f42..719635e506 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/GenericTitlePacket.java @@ -22,6 +22,7 @@ import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.packet.chat.ComponentHolder; import io.netty.buffer.ByteBuf; +import org.jetbrains.annotations.NotNull; public abstract class GenericTitlePacket implements MinecraftPacket { @@ -46,7 +47,7 @@ public int getAction(ProtocolVersion version) { } } - public abstract ActionType getAction(); + public abstract @NotNull ActionType getAction(); public ComponentHolder getComponent() { throw new UnsupportedOperationException("Invalid function for this TitlePacket ActionType"); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java index 2cbc88a754..cf02e749cd 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java @@ -23,6 +23,7 @@ import com.velocitypowered.proxy.protocol.packet.chat.ComponentHolder; import io.netty.buffer.ByteBuf; import org.checkerframework.checker.nullness.qual.Nullable; +import org.jetbrains.annotations.NotNull; public class LegacyTitlePacket extends GenericTitlePacket { @@ -68,7 +69,7 @@ public void encode(ByteBuf buf, ProtocolUtils.Direction direction, ProtocolVersi } @Override - public ActionType getAction() { + public @NotNull ActionType getAction() { return action; } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java index ace02567f6..b52c636490 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleActionbarPacket.java @@ -22,13 +22,14 @@ import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.packet.chat.ComponentHolder; import io.netty.buffer.ByteBuf; +import org.jetbrains.annotations.NotNull; public class TitleActionbarPacket extends GenericTitlePacket { private ComponentHolder component; @Override - public ActionType getAction() { + public @NotNull ActionType getAction() { return ActionType.SET_ACTION_BAR; } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java index 7f0cf9a641..cfaf8507e1 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleClearPacket.java @@ -21,6 +21,7 @@ import com.velocitypowered.proxy.connection.MinecraftSessionHandler; import com.velocitypowered.proxy.protocol.ProtocolUtils; import io.netty.buffer.ByteBuf; +import org.jetbrains.annotations.NotNull; public class TitleClearPacket extends GenericTitlePacket { @@ -38,7 +39,7 @@ public TitleClearPacket(ActionType action) { } @Override - public ActionType getAction() { + public @NotNull ActionType getAction() { return action; } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java index d4334afc31..a17d539944 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleSubtitlePacket.java @@ -22,13 +22,14 @@ import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.packet.chat.ComponentHolder; import io.netty.buffer.ByteBuf; +import org.jetbrains.annotations.NotNull; public class TitleSubtitlePacket extends GenericTitlePacket { private ComponentHolder component; @Override - public ActionType getAction() { + public @NotNull ActionType getAction() { return ActionType.SET_SUBTITLE; } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java index 71094584a6..ceab8290e4 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTextPacket.java @@ -22,13 +22,14 @@ import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.packet.chat.ComponentHolder; import io.netty.buffer.ByteBuf; +import org.jetbrains.annotations.NotNull; public class TitleTextPacket extends GenericTitlePacket { private ComponentHolder component; @Override - public ActionType getAction() { + public @NotNull ActionType getAction() { return ActionType.SET_TITLE; } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java index a9cc704dc7..219729918a 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/TitleTimesPacket.java @@ -21,6 +21,7 @@ import com.velocitypowered.proxy.connection.MinecraftSessionHandler; import com.velocitypowered.proxy.protocol.ProtocolUtils; import io.netty.buffer.ByteBuf; +import org.jetbrains.annotations.NotNull; public class TitleTimesPacket extends GenericTitlePacket { @@ -29,7 +30,7 @@ public class TitleTimesPacket extends GenericTitlePacket { private int fadeOut; @Override - public ActionType getAction() { + public @NotNull ActionType getAction() { return ActionType.SET_TIMES; } From 04f98aa94bfeee9db9691cf389b20be6952763f2 Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 22 May 2026 23:32:19 +0200 Subject: [PATCH 7/8] Actually force the given action to be non-null --- .../proxy/protocol/packet/title/LegacyTitlePacket.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java index cf02e749cd..90db7f4708 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java @@ -22,6 +22,7 @@ import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.packet.chat.ComponentHolder; import io.netty.buffer.ByteBuf; +import java.util.Objects; import org.checkerframework.checker.nullness.qual.Nullable; import org.jetbrains.annotations.NotNull; @@ -40,7 +41,7 @@ public LegacyTitlePacket() { } public LegacyTitlePacket(ActionType action) { - this.action = action; + this.action = Objects.requireNonNull(action, "action"); } @Override From f7cd23b45904e074b719d88b837c01b449a023d4 Mon Sep 17 00:00:00 2001 From: Wouter Gritter Date: Fri, 22 May 2026 23:34:05 +0200 Subject: [PATCH 8/8] Fix comment --- .../proxy/protocol/packet/title/LegacyTitlePacket.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java index 90db7f4708..f4af08dd96 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/protocol/packet/title/LegacyTitlePacket.java @@ -36,7 +36,7 @@ public class LegacyTitlePacket extends GenericTitlePacket { private int fadeOut; public LegacyTitlePacket() { - // This method only exists to keep StateRegistry happy (all mappings are encode-only, the constructor isn't stored). + // This constructor only exists to keep StateRegistry happy (all mappings are encode-only, the constructor isn't stored or used). throw new AssertionError("A bare LegacyTitlePacket should never be instantiated"); }