fix: various bugs, improve non-VT user handling (#170)

This commit is contained in:
AlexDev_ 2024-03-01 01:52:50 +01:00 committed by GitHub
parent 3064aad4f3
commit c0abf481c1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 46 additions and 13 deletions

View File

@ -45,6 +45,7 @@ public class LuckPermsHook extends Hook {
private final LuckPerms api;
private final EventSubscription<UserDataRecalculateEvent> event;
private final Map<UUID, Long> lastUpdate;
private boolean enabled;
public LuckPermsHook(@NotNull Velocitab plugin) throws IllegalStateException {
super(plugin);
@ -53,10 +54,12 @@ public class LuckPermsHook extends Hook {
this.event = api.getEventBus().subscribe(
plugin, UserDataRecalculateEvent.class, this::onLuckPermsGroupUpdate
);
this.enabled = true;
}
public void closeEvent() {
event.close();
this.enabled = false;
}
@NotNull
@ -92,6 +95,10 @@ public class LuckPermsHook extends Hook {
}
lastUpdate.put(event.getUser().getUniqueId(), System.currentTimeMillis());
if (!enabled) {
return;
}
final PlayerTabList tabList = plugin.getTabList();
plugin.getServer().getPlayer(event.getUser().getUniqueId())
.ifPresent(player -> plugin.getServer().getScheduler()
@ -103,7 +110,12 @@ public class LuckPermsHook extends Hook {
final TabPlayer tabPlayer = tabPlayerOptional.get();
final Role oldRole = tabPlayer.getRole();
tabPlayer.setRole(getRoleFromMetadata(event.getData().getMetaData()));
final Role newRole = getRoleFromMetadata(event.getUser().getCachedData().getMetaData());
if (oldRole.equals(newRole)) {
return;
}
tabPlayer.setRole(newRole);
tabList.updatePlayerDisplayName(tabPlayer);
tabList.getVanishTabList().recalculateVanishForPlayer(tabPlayer);
checkRoleUpdate(tabPlayer, oldRole);

View File

@ -26,9 +26,11 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise;
import lombok.RequiredArgsConstructor;
import net.william278.velocitab.Velocitab;
import net.william278.velocitab.player.TabPlayer;
import org.jetbrains.annotations.NotNull;
import java.util.List;
import java.util.Optional;
@RequiredArgsConstructor
@ -44,6 +46,11 @@ public class PlayerChannelHandler extends ChannelDuplexHandler {
return;
}
final Optional<TabPlayer> tabPlayer = plugin.getTabList().getTabPlayer(player);
if (tabPlayer.isEmpty()) {
super.write(ctx, msg, promise);
return;
}
if (plugin.getSettings().isRemoveSpectatorEffect() && minecraftPacket.containsAction(UpsertPlayerInfoPacket.Action.UPDATE_GAME_MODE)) {
forceGameMode(minecraftPacket.getEntries());

View File

@ -82,8 +82,9 @@ public class ScoreboardManager {
public void resetCache(@NotNull Player player) {
final String team = createdTeams.remove(player.getUniqueId());
if (team != null) {
final TabPlayer tabPlayer = plugin.getTabList().getTabPlayer(player).orElseThrow();
dispatchGroupPacket(UpdateTeamsPacket.removeTeam(plugin, team), tabPlayer);
plugin.getTabList().getTabPlayer(player).ifPresent(tabPlayer ->
dispatchGroupPacket(UpdateTeamsPacket.removeTeam(plugin, team), tabPlayer)
);
}
}

View File

@ -20,12 +20,16 @@
package net.william278.velocitab.player;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
import java.util.Optional;
@RequiredArgsConstructor
public class Role implements Comparable<Role> {
public static final int DEFAULT_WEIGHT = 0;
public static final Role DEFAULT_ROLE = new Role(DEFAULT_WEIGHT, null, null, null, null);
@Getter
@ -39,14 +43,6 @@ public class Role implements Comparable<Role> {
@Nullable
private final String suffix;
public Role(int weight, @Nullable String name, @Nullable String displayName, @Nullable String prefix, @Nullable String suffix) {
this.weight = weight;
this.name = name;
this.displayName = displayName;
this.prefix = prefix;
this.suffix = suffix;
}
@Override
public int compareTo(@NotNull Role o) {
return Double.compare(weight, o.weight);
@ -73,4 +69,15 @@ public class Role implements Comparable<Role> {
return Integer.toString(weight);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
final Role role = (Role) obj;
return weight == role.weight &&
Objects.equals(name, role.name) &&
Objects.equals(displayName, role.displayName) &&
Objects.equals(prefix, role.prefix) &&
Objects.equals(suffix, role.suffix);
}
}

View File

@ -19,6 +19,7 @@
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.proxy.ServerConnection;
@ -128,7 +129,7 @@ public class PlayerTabList {
return;
}
final List<RegisteredServer> serversInGroup = new ArrayList<>(tabPlayer.getGroup().registeredServers(plugin));
final List<RegisteredServer> serversInGroup = Lists.newArrayList(tabPlayer.getGroup().registeredServers(plugin));
if (serversInGroup.isEmpty()) {
return;
}

View File

@ -77,11 +77,16 @@ 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.getPreviousServer() != null) {
if (isDefault && !plugin.getSettings().isFallbackEnabled()) {
final Optional<TabPlayer> tabPlayer = tabList.getTabPlayer(joined);
if (tabPlayer.isEmpty()) {
return;
}
if (event.getPreviousServer() == null) {
return;
}
final Component header = tabPlayer.get().getLastHeader();
final Component footer = tabPlayer.get().getLastFooter();
final Component displayName = tabPlayer.get().getLastDisplayName();