From 2300ed4f7fd3e23a1d24bebc85397812f0bb352d Mon Sep 17 00:00:00 2001 From: Gero Date: Tue, 10 Oct 2023 20:02:57 +0200 Subject: [PATCH 1/7] Send LoginAcknowledged immediately --- .../backend/LoginSessionHandler.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java index e9801c3157..69ea8a65ba 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java @@ -156,22 +156,17 @@ public boolean handle(ServerLoginSuccess packet) { smc.setActiveSessionHandler(StateRegistry.PLAY, new TransitionSessionHandler(server, serverConn, resultFuture)); } else { - smc.setAutoReading(false); - CompletableFuture switchFuture; + smc.write(new LoginAcknowledged()); + smc.setActiveSessionHandler(StateRegistry.CONFIG, + new ConfigSessionHandler(server, serverConn, resultFuture)); if (serverConn.getPlayer().getConnection() .getActiveSessionHandler() instanceof ClientPlaySessionHandler) { - switchFuture = ((ClientPlaySessionHandler) serverConn.getPlayer().getConnection() - .getActiveSessionHandler()).doSwitch(); - } else { - switchFuture = CompletableFuture.completedFuture(null); + smc.setAutoReading(false); + ((ClientPlaySessionHandler) serverConn.getPlayer().getConnection() + .getActiveSessionHandler()).doSwitch().thenAcceptAsync((unused) -> { + smc.setAutoReading(true); + }, smc.eventLoop()); } - switchFuture.thenAcceptAsync((unused) -> { - smc.write(new LoginAcknowledged()); - // Sync backend - smc.setActiveSessionHandler(StateRegistry.CONFIG, - new ConfigSessionHandler(server, serverConn, resultFuture)); - smc.setAutoReading(true); - }, smc.eventLoop()); } return true; From 52eb6156678eb3146aca84ffbc9fe0f94b40f379 Mon Sep 17 00:00:00 2001 From: Gero Date: Tue, 10 Oct 2023 20:04:55 +0200 Subject: [PATCH 2/7] Resend player list header/footer after backend server switched to config state --- .../connection/backend/ConfigSessionHandler.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) 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 d84ae49cee..0b2d203e06 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 @@ -24,6 +24,7 @@ import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.MinecraftSessionHandler; import com.velocitypowered.proxy.connection.client.ClientConfigSessionHandler; +import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import com.velocitypowered.proxy.connection.player.VelocityResourcePackInfo; import com.velocitypowered.proxy.connection.util.ConnectionMessages; import com.velocitypowered.proxy.connection.util.ConnectionRequestResults; @@ -152,22 +153,24 @@ public boolean handle(ResourcePackRequest packet) { @Override public boolean handle(FinishedUpdate packet) { MinecraftConnection smc = serverConn.ensureConnected(); + ConnectedPlayer player = serverConn.getPlayer(); ClientConfigSessionHandler configHandler = - (ClientConfigSessionHandler) serverConn.getPlayer().getConnection() - .getActiveSessionHandler(); + (ClientConfigSessionHandler) player.getConnection().getActiveSessionHandler(); smc.setAutoReading(false); // Even when not auto reading messages are still decoded. Decode them with the correct state smc.getChannel().pipeline().get(MinecraftDecoder.class).setState(StateRegistry.PLAY); configHandler.handleBackendFinishUpdate(serverConn).thenAcceptAsync((unused) -> { - if (serverConn == serverConn.getPlayer().getConnectedServer()) { + if (serverConn == player.getConnectedServer()) { smc.setActiveSessionHandler(StateRegistry.PLAY); + player.sendPlayerListHeaderAndFooter( + player.getPlayerListHeader(), player.getPlayerListFooter()); } else { smc.setActiveSessionHandler(StateRegistry.PLAY, new TransitionSessionHandler(server, serverConn, resultFuture)); } - if (serverConn.getPlayer().getAppliedResourcePack() == null && resourcePackToApply != null) { - serverConn.getPlayer().queueResourcePack(resourcePackToApply); + if (player.getAppliedResourcePack() == null && resourcePackToApply != null) { + player.queueResourcePack(resourcePackToApply); } smc.setAutoReading(true); }, smc.eventLoop()); From de4ca465d7be889d88437f04db6b13e0c31c1a17 Mon Sep 17 00:00:00 2001 From: Gero Date: Tue, 10 Oct 2023 20:09:55 +0200 Subject: [PATCH 3/7] Fix clearHeaderAndFooter not clearing fields in ConnectedPlayer --- .../java/com/velocitypowered/api/proxy/Player.java | 2 -- .../proxy/connection/client/ConnectedPlayer.java | 10 +++++++++- .../proxy/tablist/KeyedVelocityTabList.java | 3 +-- .../velocitypowered/proxy/tablist/VelocityTabList.java | 3 +-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/com/velocitypowered/api/proxy/Player.java b/api/src/main/java/com/velocitypowered/api/proxy/Player.java index 9382fec220..d10b68ac03 100644 --- a/api/src/main/java/com/velocitypowered/api/proxy/Player.java +++ b/api/src/main/java/com/velocitypowered/api/proxy/Player.java @@ -148,9 +148,7 @@ public interface Player extends /** * Clears the tab list header and footer for the player. * - * @deprecated Use {@link TabList#clearHeaderAndFooter()}. */ - @Deprecated void clearHeaderAndFooter(); /** 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 c922e933a0..a5e569b3f5 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 @@ -545,7 +545,15 @@ public void setGameProfileProperties(List properties) { @Override public void clearHeaderAndFooter() { - tabList.clearHeaderAndFooter(); + clearHeaderAndFooterSilent(); + if (this.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_8) >= 0) { + this.connection.write(HeaderAndFooter.reset()); + } + } + + public void clearHeaderAndFooterSilent() { + this.playerListHeader = Component.empty(); + this.playerListFooter = Component.empty(); } @Override diff --git a/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java b/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java index 63a9ae56f6..49d3a7271d 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java @@ -26,7 +26,6 @@ import com.velocitypowered.api.util.GameProfile; import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; -import com.velocitypowered.proxy.protocol.packet.HeaderAndFooter; import com.velocitypowered.proxy.protocol.packet.LegacyPlayerListItem; import com.velocitypowered.proxy.protocol.packet.chat.RemoteChatSession; import java.util.ArrayList; @@ -70,7 +69,7 @@ public void setHeaderAndFooter(Component header, Component footer) { @Override public void clearHeaderAndFooter() { - connection.write(HeaderAndFooter.reset()); + this.player.clearHeaderAndFooter(); } @Override diff --git a/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java b/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java index f707c95ca9..28b41fa278 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java @@ -25,7 +25,6 @@ import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import com.velocitypowered.proxy.console.VelocityConsole; -import com.velocitypowered.proxy.protocol.packet.HeaderAndFooter; import com.velocitypowered.proxy.protocol.packet.RemovePlayerInfo; import com.velocitypowered.proxy.protocol.packet.UpsertPlayerInfo; import com.velocitypowered.proxy.protocol.packet.chat.RemoteChatSession; @@ -74,7 +73,7 @@ public void setHeaderAndFooter(Component header, Component footer) { @Override public void clearHeaderAndFooter() { - connection.write(HeaderAndFooter.reset()); + this.player.clearHeaderAndFooter(); } @Override From 351f35609563e50d0048f176aa73847d5401fbbf Mon Sep 17 00:00:00 2001 From: Gero Date: Tue, 10 Oct 2023 20:12:07 +0200 Subject: [PATCH 4/7] Clear boss bars, header/footer, tab list when switching client to config state --- .../proxy/connection/backend/ConfigSessionHandler.java | 2 ++ .../connection/client/ClientPlaySessionHandler.java | 9 +++++---- .../velocitypowered/proxy/tablist/InternalTabList.java | 2 ++ .../proxy/tablist/KeyedVelocityTabList.java | 7 ++++++- .../velocitypowered/proxy/tablist/VelocityTabList.java | 5 +++++ .../proxy/tablist/VelocityTabListLegacy.java | 5 +++++ 6 files changed, 25 insertions(+), 5 deletions(-) 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 0b2d203e06..7374f79858 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 @@ -165,6 +165,8 @@ public boolean handle(FinishedUpdate packet) { smc.setActiveSessionHandler(StateRegistry.PLAY); player.sendPlayerListHeaderAndFooter( player.getPlayerListHeader(), player.getPlayerListFooter()); + // The client cleared the tab list. TODO: Restore changes done via TabList API + player.getTabList().clearAllSilent(); } else { smc.setActiveSessionHandler(StateRegistry.PLAY, new TransitionSessionHandler(server, serverConn, resultFuture)); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java index 304fbbaae0..4cecc119c4 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java @@ -482,12 +482,13 @@ public CompletableFuture doSwitch() { // Send keep alive to try to avoid timeouts player.sendKeepAlive(); - // Reset Tablist header and footer to prevent desync - player.clearHeaderAndFooter(); + // Config state clears everything in the client. No need to clear later. + spawned = false; + serverBossBars.clear(); + player.clearHeaderAndFooterSilent(); + player.getTabList().clearAllSilent(); } - spawned = false; - player.switchToConfigState(); return configSwitchFuture; diff --git a/proxy/src/main/java/com/velocitypowered/proxy/tablist/InternalTabList.java b/proxy/src/main/java/com/velocitypowered/proxy/tablist/InternalTabList.java index f3add22903..dcf00ecaee 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/tablist/InternalTabList.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/tablist/InternalTabList.java @@ -35,4 +35,6 @@ default void processUpdate(UpsertPlayerInfo infoPacket) { default void processRemove(RemovePlayerInfo infoPacket) { } + + void clearAllSilent(); } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java b/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java index 49d3a7271d..e7a9b0fd09 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java @@ -130,10 +130,15 @@ public void clearAll() { for (TabListEntry value : listEntries) { items.add(LegacyPlayerListItem.Item.from(value)); } - entries.clear(); + clearAllSilent(); connection.delayedWrite(new LegacyPlayerListItem(LegacyPlayerListItem.REMOVE_PLAYER, items)); } + @Override + public void clearAllSilent() { + entries.clear(); + } + @Override public Collection getEntries() { return Collections.unmodifiableCollection(this.entries.values()); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java b/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java index 28b41fa278..685c140560 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java @@ -174,6 +174,11 @@ public Collection getEntries() { @Override public void clearAll() { this.connection.delayedWrite(new RemovePlayerInfo(new ArrayList<>(this.entries.keySet()))); + clearAllSilent(); + } + + @Override + public void clearAllSilent() { this.entries.clear(); } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabListLegacy.java b/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabListLegacy.java index d23ac4cb51..6e17777882 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabListLegacy.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabListLegacy.java @@ -71,6 +71,11 @@ public void clearAll() { connection.delayedWrite(new LegacyPlayerListItem(LegacyPlayerListItem.REMOVE_PLAYER, Collections.singletonList(LegacyPlayerListItem.Item.from(value)))); } + clearAllSilent(); + } + + @Override + public void clearAllSilent() { entries.clear(); nameMapping.clear(); } From 84b200496b7255677539bc02995988bfae24f9ba Mon Sep 17 00:00:00 2001 From: Gero Date: Wed, 11 Oct 2023 15:53:32 +0200 Subject: [PATCH 5/7] Send client settings in config state --- .../proxy/connection/backend/LoginSessionHandler.java | 9 ++++++--- .../connection/backend/TransitionSessionHandler.java | 5 ++++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java index 69ea8a65ba..10079db726 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java @@ -159,10 +159,13 @@ public boolean handle(ServerLoginSuccess packet) { smc.write(new LoginAcknowledged()); smc.setActiveSessionHandler(StateRegistry.CONFIG, new ConfigSessionHandler(server, serverConn, resultFuture)); - if (serverConn.getPlayer().getConnection() - .getActiveSessionHandler() instanceof ClientPlaySessionHandler) { + ConnectedPlayer player = serverConn.getPlayer(); + if (player.getClientSettingsPacket() != null) { + smc.write(player.getClientSettingsPacket()); + } + if (player.getConnection().getActiveSessionHandler() instanceof ClientPlaySessionHandler) { smc.setAutoReading(false); - ((ClientPlaySessionHandler) serverConn.getPlayer().getConnection() + ((ClientPlaySessionHandler) player.getConnection() .getActiveSessionHandler()).doSwitch().thenAcceptAsync((unused) -> { smc.setAutoReading(true); }, smc.eventLoop()); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/TransitionSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/TransitionSessionHandler.java index 30d1f42424..bf25250d9c 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/TransitionSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/TransitionSessionHandler.java @@ -22,6 +22,7 @@ import com.velocitypowered.api.event.player.ServerConnectedEvent; import com.velocitypowered.api.event.player.ServerPostConnectEvent; +import com.velocitypowered.api.network.ProtocolVersion; import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.connection.ConnectionTypes; @@ -143,7 +144,9 @@ public boolean handle(JoinGame packet) { // Now set the connected server. serverConn.getPlayer().setConnectedServer(serverConn); - if (player.getClientSettingsPacket() != null) { + // Send client settings. In 1.20.2+ this is done in the config state. + if (smc.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_20_2) < 0 + && player.getClientSettingsPacket() != null) { serverConn.ensureConnected().write(player.getClientSettingsPacket()); } From c8f6eb7fa184a46c888f5a204ba192fc4dc405ec Mon Sep 17 00:00:00 2001 From: Gero Date: Wed, 11 Oct 2023 17:10:23 +0200 Subject: [PATCH 6/7] clearPlayerListHeaderAndFooter --- .../java/com/velocitypowered/api/proxy/Player.java | 13 +++++++++++-- .../backend/TransitionSessionHandler.java | 2 +- .../connection/client/ClientPlaySessionHandler.java | 2 +- .../proxy/connection/client/ConnectedPlayer.java | 6 +++--- .../proxy/tablist/KeyedVelocityTabList.java | 2 +- .../proxy/tablist/VelocityTabList.java | 2 +- 6 files changed, 18 insertions(+), 9 deletions(-) diff --git a/api/src/main/java/com/velocitypowered/api/proxy/Player.java b/api/src/main/java/com/velocitypowered/api/proxy/Player.java index d10b68ac03..c3ce357afc 100644 --- a/api/src/main/java/com/velocitypowered/api/proxy/Player.java +++ b/api/src/main/java/com/velocitypowered/api/proxy/Player.java @@ -31,7 +31,6 @@ import net.kyori.adventure.text.event.HoverEvent; import net.kyori.adventure.text.event.HoverEventSource; import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.checker.nullness.qual.Nullable; import org.jetbrains.annotations.NotNull; /** @@ -148,8 +147,18 @@ public interface Player extends /** * Clears the tab list header and footer for the player. * + * @deprecated Use {@link Player#clearPlayerListHeaderAndFooter()}. + */ + @Deprecated + default void clearHeaderAndFooter() { + clearPlayerListHeaderAndFooter(); + } + + /** + * Clears the player list header and footer. + * */ - void clearHeaderAndFooter(); + void clearPlayerListHeaderAndFooter(); /** * Returns the player's player list header. diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/TransitionSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/TransitionSessionHandler.java index bf25250d9c..0f32fbefba 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/TransitionSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/TransitionSessionHandler.java @@ -105,7 +105,7 @@ public boolean handle(JoinGame packet) { player.sendKeepAlive(); // Reset Tablist header and footer to prevent desync - player.clearHeaderAndFooter(); + player.clearPlayerListHeaderAndFooter(); } // The goods are in hand! We got JoinGame. Let's transition completely to the new state. diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java index 4cecc119c4..6004cf8345 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java @@ -485,7 +485,7 @@ public CompletableFuture doSwitch() { // Config state clears everything in the client. No need to clear later. spawned = false; serverBossBars.clear(); - player.clearHeaderAndFooterSilent(); + player.clearPlayerListHeaderAndFooterSilent(); player.getTabList().clearAllSilent(); } 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 a5e569b3f5..f7e67cc37c 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 @@ -544,14 +544,14 @@ public void setGameProfileProperties(List properties) { } @Override - public void clearHeaderAndFooter() { - clearHeaderAndFooterSilent(); + public void clearPlayerListHeaderAndFooter() { + clearPlayerListHeaderAndFooterSilent(); if (this.getProtocolVersion().compareTo(ProtocolVersion.MINECRAFT_1_8) >= 0) { this.connection.write(HeaderAndFooter.reset()); } } - public void clearHeaderAndFooterSilent() { + public void clearPlayerListHeaderAndFooterSilent() { this.playerListHeader = Component.empty(); this.playerListFooter = Component.empty(); } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java b/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java index e7a9b0fd09..e24c337ed0 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/tablist/KeyedVelocityTabList.java @@ -69,7 +69,7 @@ public void setHeaderAndFooter(Component header, Component footer) { @Override public void clearHeaderAndFooter() { - this.player.clearHeaderAndFooter(); + this.player.clearPlayerListHeaderAndFooter(); } @Override diff --git a/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java b/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java index 685c140560..4a95b00ded 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/tablist/VelocityTabList.java @@ -73,7 +73,7 @@ public void setHeaderAndFooter(Component header, Component footer) { @Override public void clearHeaderAndFooter() { - this.player.clearHeaderAndFooter(); + this.player.clearPlayerListHeaderAndFooter(); } @Override From 14362c0daf3ed2764351ec595ab06675fa68a6a6 Mon Sep 17 00:00:00 2001 From: Gero Date: Wed, 11 Oct 2023 17:12:08 +0200 Subject: [PATCH 7/7] fix style --- api/src/main/java/com/velocitypowered/api/proxy/Player.java | 1 - 1 file changed, 1 deletion(-) diff --git a/api/src/main/java/com/velocitypowered/api/proxy/Player.java b/api/src/main/java/com/velocitypowered/api/proxy/Player.java index c3ce357afc..99bf09da0e 100644 --- a/api/src/main/java/com/velocitypowered/api/proxy/Player.java +++ b/api/src/main/java/com/velocitypowered/api/proxy/Player.java @@ -156,7 +156,6 @@ default void clearHeaderAndFooter() { /** * Clears the player list header and footer. - * */ void clearPlayerListHeaderAndFooter();