diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java index f8dc1783..315717a6 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/Tablist.java @@ -43,6 +43,7 @@ import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import java.util.*; +import java.util.logging.Level; import java.util.stream.IntStream; @ChannelHandler.Sharable @@ -63,7 +64,6 @@ public class Tablist extends ChannelInboundHandlerAdapter { this.player = player; this.viewer = Chatter.of(player); this.directTabItems = Storage.directTabItems.computeIfAbsent(player, p -> new HashMap<>()); - injection(); } public void update(TablistPart global, int seconds) { @@ -139,7 +139,9 @@ public class Tablist extends ChannelInboundHandlerAdapter { synchronized (directTabItems) { directTabItems.clear(); } + } + public void onServerPostSwitch() { if(player.getProtocolVersion().greaterThan(ProtocolVersion.MINECRAFT_1_20)) { current.clear(); sendPacket(player, createTeamPacket); @@ -148,8 +150,14 @@ public class Tablist extends ChannelInboundHandlerAdapter { private void injection() { connection = (VelocityServerConnection) player.getCurrentServer().orElse(null); - if(connection == null) - return; + if(connection == null) { + connection = ((ConnectedPlayer) player).getConnectionInFlight(); + + if(connection == null) { + VelocityCore.getLogger().log(Level.WARNING, "Could not inject Tablist: %s".formatted(player)); + return; + } + } ChannelPipeline pipeline = connection.getConnection().getChannel().pipeline(); if(pipeline.get("steamwar-tablist") != null) //Catch unclean exit diff --git a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java index 2b8b47bd..29cebb38 100644 --- a/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java +++ b/VelocityCore/src/de/steamwar/velocitycore/tablist/TablistManager.java @@ -21,8 +21,9 @@ package de.steamwar.velocitycore.tablist; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.connection.DisconnectEvent; -import com.velocitypowered.api.event.connection.PostLoginEvent; +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.Player; import com.velocitypowered.api.proxy.server.RegisteredServer; import de.steamwar.network.packets.common.FightInfoPacket; @@ -59,17 +60,19 @@ public class TablistManager extends BasicListener { } @Subscribe - public void onJoin(PostLoginEvent event) { + public void onServerConnection(ServerConnectedEvent event) { synchronized (tablists) { - tablists.put(event.getPlayer(), new Tablist(event.getPlayer())); + tablists.computeIfAbsent(event.getPlayer(), Tablist::new).onServerSwitch(); } - Tablist.sendPacket(event.getPlayer(), Tablist.createTeamPacket); + + if(event.getPlayer().getProtocolVersion().noGreaterThan(ProtocolVersion.MINECRAFT_1_20)) + Tablist.sendPacket(event.getPlayer(), Tablist.createTeamPacket); } @Subscribe - public void onServerConnection(ServerPostConnectEvent event) { + public void onServerPostConnection(ServerPostConnectEvent event) { synchronized (tablists) { - tablists.get(event.getPlayer()).onServerSwitch(); + tablists.get(event.getPlayer()).onServerPostSwitch(); } } @@ -90,14 +93,14 @@ public class TablistManager extends BasicListener { private void updateTablist() { List subservers = new ArrayList<>(); - for (RegisteredServer server : new ArrayList<>(VelocityCore.getProxy().getAllServers())){ - if(server.getPlayersConnected().isEmpty()) + for (RegisteredServer server : new ArrayList<>(VelocityCore.getProxy().getAllServers())) { + if (server.getPlayersConnected().isEmpty()) continue; Subserver subserver = Subserver.getSubserver(server.getServerInfo()); - if(fightInfos.containsKey(server)) + if (fightInfos.containsKey(server)) subservers.add(new TablistServer(server, fightInfos.get(server))); - else if(subserver == null || subserver.getType() != Servertype.BAUSERVER) + else if (subserver == null || subserver.getType() != Servertype.BAUSERVER) subservers.add(new TablistServer(server)); } subservers.add(new TablistBuild());