From cc01a4132d5ade850659d65655254a06da1128ac Mon Sep 17 00:00:00 2001 From: Lixfel Date: Sat, 18 Jun 2022 16:07:06 +0200 Subject: [PATCH] Test fix tablist Signed-off-by: Lixfel --- .../steamwar/bungeecore/tablist/Tablist.java | 57 ++++++++++++------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/src/de/steamwar/bungeecore/tablist/Tablist.java b/src/de/steamwar/bungeecore/tablist/Tablist.java index 53c2bbe7..896638b8 100644 --- a/src/de/steamwar/bungeecore/tablist/Tablist.java +++ b/src/de/steamwar/bungeecore/tablist/Tablist.java @@ -81,22 +81,25 @@ public class Tablist extends MessageToMessageDecoder { List addNpc = new ArrayList<>(); List removeNpc = new ArrayList<>(); List update = new ArrayList<>(); - for (TablistPart.Item item : direct) { - if(npcs.remove(item.getUuid())) - removeNpc.add(directTabItems.get(item.getUuid()).getUsername()); - - PlayerListItem.Item tabItem = directTabItems.get(item.getUuid()); - if(tabItem == null) { - tablist.add(0, item); - } else if(!tabItem.getDisplayName().equals(item.getDisplayName())) { - tabItem.setDisplayName(item.getDisplayName()); - update.add(tabItem); - } - } Set nonNPCs = direct.stream().map(TablistPart.Item::getUuid).collect(Collectors.toSet()); - for(PlayerListItem.Item item : directTabItems.values()) { - if(!nonNPCs.contains(item.getUuid()) && !npcs.contains(item.getUuid())) - addNpc.add(item.getUsername()); + synchronized (directTabItems) { + for (TablistPart.Item item : direct) { + PlayerListItem.Item tabItem = directTabItems.get(item.getUuid()); + + if(npcs.remove(item.getUuid())) + removeNpc.add(tabItem.getUsername()); + + if(tabItem == null) { + tablist.add(0, item); + } else if(!tabItem.getDisplayName().equals(item.getDisplayName())) { + tabItem.setDisplayName(item.getDisplayName()); + update.add(tabItem); + } + } + for(PlayerListItem.Item item : directTabItems.values()) { + if(!nonNPCs.contains(item.getUuid()) && !npcs.contains(item.getUuid())) + addNpc.add(item.getUsername()); + } } sendNpcPacket(addNpc, false); sendNpcPacket(removeNpc, true); @@ -104,6 +107,7 @@ public class Tablist extends MessageToMessageDecoder { // Main list handling int i = 0; List add = new ArrayList<>(); + List remove = new ArrayList<>(); for (; i < tablist.size() && i < 80; i++) { PlayerListItem.Item tabItem; if(current.size() > i) { @@ -119,6 +123,8 @@ public class Tablist extends MessageToMessageDecoder { TablistPart.Item item = tablist.get(i); if(!Arrays.equals(tabItem.getProperties(), item.getProperties())) { + if(tabItem.getProperties() != null) + remove.add(tabItem); tabItem.setProperties(item.getProperties()); tabItem.setDisplayName(item.getDisplayName()); add.add(tabItem); @@ -127,21 +133,22 @@ public class Tablist extends MessageToMessageDecoder { update.add(tabItem); } } - sendTabPacket(add, PlayerListItem.Action.ADD_PLAYER); sendTabPacket(update, PlayerListItem.Action.UPDATE_DISPLAY_NAME); // Excess removal - List remove = new ArrayList<>(); while(i < current.size()) { remove.add(current.remove(i)); } sendTabPacket(remove, PlayerListItem.Action.REMOVE_PLAYER); + sendTabPacket(add, PlayerListItem.Action.ADD_PLAYER); } public void onServerSwitch() { connection = (ServerConnection) player.getServer(); - directTabItems.clear(); - sendNpcPacket(npcs.stream().map(npc -> directTabItems.get(npc).getUsername()).collect(Collectors.toList()), true); + synchronized (directTabItems) { + directTabItems.clear(); + sendNpcPacket(npcs.stream().map(npc -> directTabItems.get(npc).getUsername()).collect(Collectors.toList()), true); + } npcs.clear(); if(connection != null) { @@ -153,7 +160,9 @@ public class Tablist extends MessageToMessageDecoder { public void disable() { sendTabPacket(current, PlayerListItem.Action.REMOVE_PLAYER); current.clear(); - sendNpcPacket(npcs.stream().map(npc -> directTabItems.get(npc).getUsername()).collect(Collectors.toList()), true); + synchronized (directTabItems) { + sendNpcPacket(npcs.stream().map(npc -> directTabItems.get(npc).getUsername()).collect(Collectors.toList()), true); + } npcs.clear(); if(connection != null) @@ -194,12 +203,16 @@ public class Tablist extends MessageToMessageDecoder { if(!player.getUniqueId().equals(item.getUuid()) && item.getGamemode() == 3) item.setGamemode(1); - directTabItems.put(item.getUuid(), item); + synchronized (directTabItems) { + directTabItems.put(item.getUuid(), item); + } } break; case REMOVE_PLAYER: for(PlayerListItem.Item item : list.getItems()) { - directTabItems.remove(item.getUuid()); + synchronized (directTabItems) { + directTabItems.remove(item.getUuid()); + } npcs.remove(item.getUuid()); } break;