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")
.requires(src -> src.hasPermission("velocitab.command.name"))
.then(RequiredArgumentBuilder.<CommandSource, String>argument("name", StringArgumentType.word())
.executes(ctx -> {
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
CompletableFuture<TabListEntry> createEntry(@NotNull TabPlayer player, @NotNull TabList tabList) {
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.william278.velocitab.Velocitab;
import net.william278.velocitab.config.Group;
import net.william278.velocitab.player.TabPlayer;
import org.jetbrains.annotations.NotNull;
import java.util.UUID;
@ -52,9 +51,13 @@ public class TabListListener {
}
@Subscribe
public void onKick(KickedFromServerEvent event) {
public void onKick(@NotNull KickedFromServerEvent event) {
event.getPlayer().getTabList().clearAll();
event.getPlayer().getTabList().clearHeaderAndFooter();
if (event.getResult() instanceof KickedFromServerEvent.DisconnectPlayer) {
tabList.removePlayer(event.getPlayer());
}
}
@SuppressWarnings("UnstableApiUsage")
@ -73,7 +76,15 @@ public class TabListListener {
// 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 (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());
return;
}
@ -89,27 +100,9 @@ public class TabListListener {
// Remove the player from the tracking list, Print warning if player was not removed
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
plugin.getServer().getAllPlayers().forEach(player -> player.getTabList().removeEntry(uuid));
// 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);
tabList.removePlayer(event.getPlayer());
}
@Subscribe