Fixed problem with header & footer task

Improved placeholder cache
This commit is contained in:
AlexDev_ 2025-01-06 23:15:29 +01:00
parent 99032b4280
commit 94bcd99fe2
5 changed files with 61 additions and 20 deletions

View File

@ -167,6 +167,18 @@ public record Group(
.collect(Collectors.toSet());
}
public List<TabPlayer> 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<TabPlayer> getTabPlayers(@NotNull Velocitab plugin, @NotNull TabPlayer tabPlayer) {
if (plugin.getSettings().isShowAllPlayersFromAllGroups()) {

View File

@ -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<UUID, Map<String, String>> placeholders;
private final Map<UUID, Set<CompletableFuture<?>>> requests;
private final Set<UUID> 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<String, String> 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<String> 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

View File

@ -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

View File

@ -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) {

View File

@ -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<Player> players = group.getPlayersAsList(plugin);
final List<TabPlayer> players = group.getTabPlayersAsList(plugin);
if (players.isEmpty()) {
return;
}
final List<String> 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) {