Fixed some problems: (#149)

- kick problem
- missing permission to name subcommand
- check before clearing header & footer on not handled servers
This commit is contained in:
AlexDev_ 2024-01-24 22:13:29 +01:00 committed by GitHub
parent dda537662e
commit e19d06ee18
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 34 additions and 22 deletions

View File

@ -76,6 +76,7 @@ public final class VelocitabCommand {
}) })
) )
.then(LiteralArgumentBuilder.<CommandSource>literal("name") .then(LiteralArgumentBuilder.<CommandSource>literal("name")
.requires(src -> src.hasPermission("velocitab.command.name"))
.then(RequiredArgumentBuilder.<CommandSource, String>argument("name", StringArgumentType.word()) .then(RequiredArgumentBuilder.<CommandSource, String>argument("name", StringArgumentType.word())
.executes(ctx -> { .executes(ctx -> {
if (!(ctx.getSource() instanceof Player player)) { if (!(ctx.getSource() instanceof Player player)) {

View File

@ -220,6 +220,24 @@ public class PlayerTabList {
}); });
} }
protected void removePlayer(@NotNull Player target) {
final UUID uuid = target.getUniqueId();
plugin.getServer().getAllPlayers().forEach(player -> player.getTabList().removeEntry(uuid));
// Update the tab list of all players
plugin.getServer().getScheduler()
.buildTask(plugin, () -> getPlayers().values().forEach(player -> {
player.getPlayer().getTabList().removeEntry(uuid);
player.sendHeaderAndFooter(this);
}))
.delay(500, TimeUnit.MILLISECONDS)
.schedule();
// Delete player team
plugin.getScoreboardManager().ifPresent(manager -> manager.resetCache(target));
//remove player from tab list cache
getPlayers().remove(uuid);
}
@NotNull @NotNull
CompletableFuture<TabListEntry> createEntry(@NotNull TabPlayer player, @NotNull TabList tabList) { CompletableFuture<TabListEntry> createEntry(@NotNull TabPlayer player, @NotNull TabList tabList) {
return player.getDisplayName(plugin).thenApply(name -> TabListEntry.builder() return player.getDisplayName(plugin).thenApply(name -> TabListEntry.builder()

View File

@ -31,7 +31,6 @@ import com.velocitypowered.api.proxy.server.ServerInfo;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.william278.velocitab.Velocitab; import net.william278.velocitab.Velocitab;
import net.william278.velocitab.config.Group; import net.william278.velocitab.config.Group;
import net.william278.velocitab.player.TabPlayer;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.UUID; import java.util.UUID;
@ -52,9 +51,13 @@ public class TabListListener {
} }
@Subscribe @Subscribe
public void onKick(KickedFromServerEvent event) { public void onKick(@NotNull KickedFromServerEvent event) {
event.getPlayer().getTabList().clearAll(); event.getPlayer().getTabList().clearAll();
event.getPlayer().getTabList().clearHeaderAndFooter(); event.getPlayer().getTabList().clearHeaderAndFooter();
if (event.getResult() instanceof KickedFromServerEvent.DisconnectPlayer) {
tabList.removePlayer(event.getPlayer());
}
} }
@SuppressWarnings("UnstableApiUsage") @SuppressWarnings("UnstableApiUsage")
@ -73,7 +76,15 @@ public class TabListListener {
// If the server is not in a group, use fallback. // If the server is not in a group, use fallback.
// If fallback is disabled, permit the player to switch excluded servers without a header or footer override // If fallback is disabled, permit the player to switch excluded servers without a header or footer override
if (isDefault && !plugin.getSettings().isFallbackEnabled()) { if (isDefault && !plugin.getSettings().isFallbackEnabled()) {
event.getPlayer().sendPlayerListHeaderAndFooter(Component.empty(), Component.empty()); final Component header = event.getPlayer().getPlayerListHeader();
final Component footer = event.getPlayer().getPlayerListFooter();
plugin.getServer().getScheduler().buildTask(plugin, () -> {
if (header.equals(event.getPlayer().getPlayerListHeader()) && footer.equals(event.getPlayer().getPlayerListFooter())) {
event.getPlayer().sendPlayerListHeaderAndFooter(header, footer);
}
}).delay(500, TimeUnit.MILLISECONDS).schedule();
tabList.getPlayers().remove(event.getPlayer().getUniqueId()); tabList.getPlayers().remove(event.getPlayer().getUniqueId());
return; return;
} }
@ -89,27 +100,9 @@ public class TabListListener {
// Remove the player from the tracking list, Print warning if player was not removed // Remove the player from the tracking list, Print warning if player was not removed
final UUID uuid = event.getPlayer().getUniqueId(); final UUID uuid = event.getPlayer().getUniqueId();
final TabPlayer tabPlayer = tabList.getPlayers().get(uuid);
if (tabPlayer == null) {
plugin.log(String.format("Failed to remove disconnecting player %s (UUID: %s)",
event.getPlayer().getUsername(), uuid));
}
// Remove the player from the tab list of all other players // Remove the player from the tab list of all other players
plugin.getServer().getAllPlayers().forEach(player -> player.getTabList().removeEntry(uuid)); tabList.removePlayer(event.getPlayer());
// Update the tab list of all players
plugin.getServer().getScheduler()
.buildTask(plugin, () -> tabList.getPlayers().values().forEach(player -> {
player.getPlayer().getTabList().removeEntry(uuid);
player.sendHeaderAndFooter(tabList);
}))
.delay(500, TimeUnit.MILLISECONDS)
.schedule();
// Delete player team
plugin.getScoreboardManager().ifPresent(manager -> manager.resetCache(event.getPlayer()));
//remove player from tab list cache
tabList.getPlayers().remove(uuid);
} }
@Subscribe @Subscribe