From 94bcd99fe24d073da65edb6a06af1bfb9c60b10c Mon Sep 17 00:00:00 2001 From: AlexDev_ <56083016+alexdev03@users.noreply.github.com> Date: Mon, 6 Jan 2025 23:15:29 +0100 Subject: [PATCH] Fixed problem with header & footer task Improved placeholder cache --- .../william278/velocitab/config/Group.java | 12 +++++ .../placeholder/PlaceholderManager.java | 50 +++++++++++++------ .../velocitab/tab/PlayerTabList.java | 2 +- .../velocitab/tab/TabListListener.java | 11 +++- .../william278/velocitab/tab/TaskManager.java | 6 +-- 5 files changed, 61 insertions(+), 20 deletions(-) diff --git a/src/main/java/net/william278/velocitab/config/Group.java b/src/main/java/net/william278/velocitab/config/Group.java index 4b1b965..3a17703 100644 --- a/src/main/java/net/william278/velocitab/config/Group.java +++ b/src/main/java/net/william278/velocitab/config/Group.java @@ -167,6 +167,18 @@ public record Group( .collect(Collectors.toSet()); } + public List getTabPlayersAsList(@NotNull Velocitab plugin) { + if (plugin.getSettings().isShowAllPlayersFromAllGroups()) { + return Lists.newArrayList(plugin.getTabList().getPlayers().values()); + } + + return plugin.getTabList().getPlayers() + .values() + .stream() + .filter(tabPlayer -> tabPlayer.isLoaded() && tabPlayer.getGroup().equals(this)) + .collect(Collectors.toList()); + } + @NotNull public Set getTabPlayers(@NotNull Velocitab plugin, @NotNull TabPlayer tabPlayer) { if (plugin.getSettings().isShowAllPlayersFromAllGroups()) { diff --git a/src/main/java/net/william278/velocitab/placeholder/PlaceholderManager.java b/src/main/java/net/william278/velocitab/placeholder/PlaceholderManager.java index 3f18764..c1ad923 100644 --- a/src/main/java/net/william278/velocitab/placeholder/PlaceholderManager.java +++ b/src/main/java/net/william278/velocitab/placeholder/PlaceholderManager.java @@ -21,6 +21,7 @@ package net.william278.velocitab.placeholder; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import com.velocitypowered.api.proxy.Player; import lombok.Setter; import net.william278.velocitab.Velocitab; @@ -32,10 +33,8 @@ import net.william278.velocitab.player.TabPlayer; import org.apache.commons.lang3.StringUtils; import org.jetbrains.annotations.NotNull; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.UUID; +import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -62,10 +61,14 @@ public class PlaceholderManager { private final Velocitab plugin; private final Map> placeholders; + private final Map>> requests; + private final Set blocked; public PlaceholderManager(Velocitab plugin) { this.plugin = plugin; this.placeholders = Maps.newConcurrentMap(); + this.requests = Maps.newConcurrentMap(); + this.blocked = Sets.newConcurrentHashSet(); } public void fetchPlaceholders(@NotNull Group group) { @@ -79,6 +82,10 @@ public class PlaceholderManager { return; } + if (blocked.contains(uuid)) { + return; + } + final Map parsed = placeholders.computeIfAbsent(uuid, k -> Maps.newConcurrentMap()); final TabPlayer tabPlayer = plugin.getTabList().getTabPlayer(player) .orElse(new TabPlayer(plugin, player, @@ -95,18 +102,26 @@ public class PlaceholderManager { placeholders.forEach(placeholder -> replaceSingle(placeholder, plugin, tabPlayer) .ifPresentOrElse(replacement -> parsed.put(placeholder, replacement), - () -> plugin.getPAPIProxyBridgeHook().ifPresent(hook -> - hook.formatPlaceholders(placeholder, player).thenAccept(replacement -> { - if (replacement == null || replacement.equals(placeholder)) { - return; - } + () -> plugin.getPAPIProxyBridgeHook().ifPresent(hook -> { + final CompletableFuture future = hook.formatPlaceholders(placeholder, player); + requests.computeIfAbsent(player.getUniqueId(), u -> Sets.newConcurrentHashSet()).add(future); + future.thenAccept(replacement -> { + if (replacement == null || replacement.equals(placeholder)) { + return; + } - if (debug) { - plugin.getLogger().info("Placeholder {} replaced with {} in {}ms", placeholder, replacement, System.currentTimeMillis() - start); - } + if (blocked.contains(player.getUniqueId())) { + return; + } - parsed.put(placeholder, replacement); - })))); + if (debug) { + plugin.getLogger().info("Placeholder {} replaced with {} in {}ms", placeholder, replacement, System.currentTimeMillis() - start); + } + + parsed.put(placeholder, replacement); + requests.get(player.getUniqueId()).remove(future); + }); + }))); } @NotNull @@ -128,7 +143,14 @@ public class PlaceholderManager { } public void clearPlaceholders(@NotNull UUID uuid) { + blocked.add(uuid); placeholders.remove(uuid); + Optional.ofNullable(requests.get(uuid)).ifPresent(set -> set.forEach(c -> c.cancel(true))); + } + + public void unblockPlayer(@NotNull UUID uuid) { + blocked.remove(uuid); + requests.remove(uuid); } @NotNull diff --git a/src/main/java/net/william278/velocitab/tab/PlayerTabList.java b/src/main/java/net/william278/velocitab/tab/PlayerTabList.java index 97afd74..f0581dc 100644 --- a/src/main/java/net/william278/velocitab/tab/PlayerTabList.java +++ b/src/main/java/net/william278/velocitab/tab/PlayerTabList.java @@ -390,7 +390,7 @@ public class PlayerTabList { } public void updateHeaderFooter(@NotNull Group group) { - group.getTabPlayers(plugin).forEach(this::updatePlayerDisplayName); + group.getTabPlayers(plugin).forEach(p -> p.sendHeaderAndFooter(this)); } // Update a player's name in the tab list and scoreboard team diff --git a/src/main/java/net/william278/velocitab/tab/TabListListener.java b/src/main/java/net/william278/velocitab/tab/TabListListener.java index 8889ec3..ca80cec 100644 --- a/src/main/java/net/william278/velocitab/tab/TabListListener.java +++ b/src/main/java/net/william278/velocitab/tab/TabListListener.java @@ -149,9 +149,15 @@ public class TabListListener { final Group group = groupOptional.get(); plugin.getScoreboardManager().resetCache(joined, group); + plugin.getServer().getScheduler().buildTask(plugin, () -> { + plugin.getPlaceholderManager().unblockPlayer(joined.getUniqueId()); + }).delay(10, TimeUnit.MILLISECONDS).schedule(); + final ScheduledTask task = plugin.getServer().getScheduler() - .buildTask(plugin, () -> plugin.getPlaceholderManager().fetchPlaceholders(joined.getUniqueId(), group.getTextsWithPlaceholders())) - .delay(10, TimeUnit.MILLISECONDS) + .buildTask(plugin, () -> { + plugin.getPlaceholderManager().fetchPlaceholders(joined.getUniqueId(), group.getTextsWithPlaceholders()); + }) + .delay(15, TimeUnit.MILLISECONDS) .repeat(50, TimeUnit.MILLISECONDS) .schedule(); @@ -180,6 +186,7 @@ public class TabListListener { // Remove the player from the tab list of all other players tabList.removePlayer(event.getPlayer()); plugin.getPlaceholderManager().clearPlaceholders(event.getPlayer().getUniqueId()); + plugin.getPlaceholderManager().unblockPlayer(event.getPlayer().getUniqueId()); } private void checkDelayedDisconnect(@NotNull DisconnectEvent event) { diff --git a/src/main/java/net/william278/velocitab/tab/TaskManager.java b/src/main/java/net/william278/velocitab/tab/TaskManager.java index 943438a..1f907d5 100644 --- a/src/main/java/net/william278/velocitab/tab/TaskManager.java +++ b/src/main/java/net/william278/velocitab/tab/TaskManager.java @@ -21,7 +21,6 @@ package net.william278.velocitab.tab; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.scheduler.ScheduledTask; import net.william278.velocitab.Velocitab; import net.william278.velocitab.config.Group; @@ -96,12 +95,13 @@ public class TaskManager { } private void updatePlaceholders(@NotNull Group group) { - final List players = group.getPlayersAsList(plugin); + final List players = group.getTabPlayersAsList(plugin); if (players.isEmpty()) { return; } + final List texts = group.getTextsWithPlaceholders(); - players.forEach(player -> plugin.getPlaceholderManager().fetchPlaceholders(player.getUniqueId(), texts)); + players.forEach(player -> plugin.getPlaceholderManager().fetchPlaceholders(player.getPlayer().getUniqueId(), texts)); } private void updateLatency(@NotNull Group group) {