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

View File

@ -26,9 +26,11 @@ import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelPromise; import io.netty.channel.ChannelPromise;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import net.william278.velocitab.Velocitab; import net.william278.velocitab.Velocitab;
import net.william278.velocitab.player.TabPlayer;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.List; import java.util.List;
import java.util.Optional;
@RequiredArgsConstructor @RequiredArgsConstructor
@ -44,6 +46,11 @@ public class PlayerChannelHandler extends ChannelDuplexHandler {
return; 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)) { if (plugin.getSettings().isRemoveSpectatorEffect() && minecraftPacket.containsAction(UpsertPlayerInfoPacket.Action.UPDATE_GAME_MODE)) {
forceGameMode(minecraftPacket.getEntries()); forceGameMode(minecraftPacket.getEntries());

View File

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

View File

@ -20,12 +20,16 @@
package net.william278.velocitab.player; package net.william278.velocitab.player;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@RequiredArgsConstructor
public class Role implements Comparable<Role> { public class Role implements Comparable<Role> {
public static final int DEFAULT_WEIGHT = 0; public static final int DEFAULT_WEIGHT = 0;
public static final Role DEFAULT_ROLE = new Role(DEFAULT_WEIGHT, null, null, null, null); public static final Role DEFAULT_ROLE = new Role(DEFAULT_WEIGHT, null, null, null, null);
@Getter @Getter
@ -39,14 +43,6 @@ public class Role implements Comparable<Role> {
@Nullable @Nullable
private final String suffix; 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 @Override
public int compareTo(@NotNull Role o) { public int compareTo(@NotNull Role o) {
return Double.compare(weight, o.weight); return Double.compare(weight, o.weight);
@ -73,4 +69,15 @@ public class Role implements Comparable<Role> {
return Integer.toString(weight); 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; package net.william278.velocitab.tab;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.ServerConnection;
@ -128,7 +129,7 @@ public class PlayerTabList {
return; return;
} }
final List<RegisteredServer> serversInGroup = new ArrayList<>(tabPlayer.getGroup().registeredServers(plugin)); final List<RegisteredServer> serversInGroup = Lists.newArrayList(tabPlayer.getGroup().registeredServers(plugin));
if (serversInGroup.isEmpty()) { if (serversInGroup.isEmpty()) {
return; return;
} }

View File

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