forked from Upstream/Velocitab
Fixed problem with header & footer task
Improved placeholder cache
This commit is contained in:
parent
99032b4280
commit
94bcd99fe2
@ -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()) {
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user