Compare commits

...
11 Commits
Author SHA1 Message Date
NEZNAMY 0827d083bf 4.1.9 2024-10-11 19:56:06 +02:00
NEZNAMY 2f7b42ab85 [Bukkit] Fix NPE caused by another plugin making a not-null field null (#1368) 2024-10-07 19:20:14 +02:00
NEZNAMY 735aa666d6 I just love Velocity 2024-10-06 18:21:54 +02:00
NEZNAMY c2ceb643e5 [Bukkit] Bump dependency 2024-10-03 18:22:18 +02:00
NEZNAMY 5c166f647f [Velocity] Fix exploit (not specifying more to keep users safe) 2024-10-02 20:48:10 +02:00
NEZNAMY 03a8fb9aa2 4.1.9-SNAPSHOT 2024-08-30 19:11:38 +02:00
NEZNAMY 1a44c97d5a 4.1.8 2024-08-30 18:57:45 +02:00
NEZNAMY 29cf0a26d6 4.1.8-SNAPSHOT 2024-08-25 20:11:13 +02:00
NEZNAMY 33d172598d [BungeeCord] Avoid sending UPDATE_LIST_ORDER tablist action to <1.21.2 players (#1359) 2024-08-25 20:10:53 +02:00
NEZNAMY af1e685c2b Merge pull request #1357 from hans362/fix-get-skin
Get skin from profile properties by property name
2024-08-20 16:01:48 +02:00
hans362 09129974db Get skin from profile properties by property name 2024-08-20 21:26:08 +08:00
8 changed files with 46 additions and 10 deletions

No files matched your search

+1 -1
View File
@@ -4,7 +4,7 @@ plugins {
allprojects {
group = "me.neznamy"
version = "4.1.7"
version = "4.1.9"
description = "An all-in-one solution that works"
ext.set("id", "tab")
+1 -1
View File
@@ -2,7 +2,7 @@ dependencies {
implementation(projects.shared)
implementation("org.bstats:bstats-bukkit:3.0.1")
compileOnly("org.purpurmc.purpur:purpur-api:1.16.5-R0.1-SNAPSHOT")
compileOnly("me.clip:placeholderapi:2.11.2")
compileOnly("me.clip:placeholderapi:2.11.6")
compileOnly("com.mojang:authlib:1.5.25")
compileOnly("com.github.MilkBowl:VaultAPI:1.7") {
exclude("org.bukkit", "bukkit")
@@ -16,6 +16,7 @@ import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
@@ -309,7 +310,8 @@ public class TeamPacketData {
if (!TeamPacketClass.isInstance(packet)) return;
int action = TeamPacket_ACTION.getInt(packet);
if (action == TeamAction.UPDATE) return;
TeamPacket_PLAYERS.set(packet, player.getScoreboard().onTeamPacket(
action, (String) TeamPacket_NAME.get(packet), (Collection<String>) TeamPacket_PLAYERS.get(packet)));
Collection<String> players = (Collection<String>) TeamPacket_PLAYERS.get(packet);
if (players == null) players = Collections.emptyList();
TeamPacket_PLAYERS.set(packet, player.getScoreboard().onTeamPacket(action, (String) TeamPacket_NAME.get(packet), players));
}
}
@@ -93,8 +93,13 @@ public class BungeeTabPlayer extends ProxyTabPlayer {
LoginResult loginResult = ((InitialHandler)getPlayer().getPendingConnection()).getLoginProfile();
if (loginResult == null) return null;
Property[] properties = loginResult.getProperties();
if (properties == null || properties.length == 0) return null; //Offline mode
return new TabList.Skin(properties[0].getValue(), properties[0].getSignature());
if (properties == null) return null; //Offline mode
for (Property property : properties) {
if (property.getName().equals(TabList.TEXTURES_PROPERTY)) {
return new TabList.Skin(property.getValue(), property.getSignature());
}
}
return null;
}
@Override
@@ -20,7 +20,15 @@ public class BungeeTabList1193 extends BungeeTabList {
private static final Map<Action, EnumSet<PlayerListItemUpdate.Action>> actions = new EnumMap<>(Action.class);
static {
actions.put(Action.ADD_PLAYER, EnumSet.allOf(PlayerListItemUpdate.Action.class));
// Do not use allOf because <1.21.2 does not support UPDATE_LIST_ORDER
// TODO Once bungeecord dependency is updated, support it properly
actions.put(Action.ADD_PLAYER, EnumSet.of(
PlayerListItemUpdate.Action.ADD_PLAYER,
PlayerListItemUpdate.Action.UPDATE_GAMEMODE,
PlayerListItemUpdate.Action.UPDATE_LISTED,
PlayerListItemUpdate.Action.UPDATE_LATENCY,
PlayerListItemUpdate.Action.UPDATE_DISPLAY_NAME
));
actions.put(Action.UPDATE_GAME_MODE, EnumSet.of(PlayerListItemUpdate.Action.UPDATE_GAMEMODE));
actions.put(Action.UPDATE_DISPLAY_NAME, EnumSet.of(PlayerListItemUpdate.Action.UPDATE_DISPLAY_NAME));
actions.put(Action.UPDATE_LATENCY, EnumSet.of(PlayerListItemUpdate.Action.UPDATE_LATENCY));
@@ -84,7 +84,12 @@ public class SpongeTabPlayer extends BackendTabPlayer {
public TabList.Skin getSkin() {
List<ProfileProperty> list = getPlayer().profile().properties();
if (list.isEmpty()) return null; // Offline mode
return new TabList.Skin(list.get(0).value(), list.get(0).signature().orElse(null));
for (ProfileProperty property : list) {
if (property.name().equals(TabList.TEXTURES_PROPERTY)) {
return new TabList.Skin(property.value(), property.signature().orElse(null));
}
}
return null;
}
@Override
@@ -18,12 +18,19 @@ import me.neznamy.tab.shared.platform.EventListener;
import me.neznamy.tab.shared.platform.TabPlayer;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
/**
* The core for Velocity forwarding events into all enabled features
*/
@SuppressWarnings("UnstableApiUsage")
public class VelocityEventListener implements EventListener<Player> {
/** Map for tracking online players */
private final Map<Player, UUID> players = new ConcurrentHashMap<>();
/**
* Listens to player disconnecting from the server.
*
@@ -32,7 +39,10 @@ public class VelocityEventListener implements EventListener<Player> {
*/
@Subscribe
public void onQuit(@NotNull DisconnectEvent e) {
quit(e.getPlayer().getUniqueId());
// Check if the player was actually connected to the server in the first place to avoid processing
// disconnect of an existing player who is still there (because players are mapped by UUID in TAB)
UUID id = players.remove(e.getPlayer());
if (id != null) quit(id);
}
/**
@@ -66,6 +76,7 @@ public class VelocityEventListener implements EventListener<Player> {
tab.getCPUManager().runTask(() -> {
TabPlayer player = tab.getPlayer(e.getPlayer().getUniqueId());
if (player == null) {
players.put(e.getPlayer(), e.getPlayer().getUniqueId());
tab.getFeatureManager().onJoin(createPlayer(e.getPlayer()));
} else {
player.getScoreboard().freeze(); // Prevent server switch listeners from sending packets before re-registering objectives in onLoginPacket
@@ -65,7 +65,12 @@ public class VelocityTabPlayer extends ProxyTabPlayer {
public TabList.Skin getSkin() {
List<GameProfile.Property> properties = getPlayer().getGameProfile().getProperties();
if (properties.isEmpty()) return null; //Offline mode
return new TabList.Skin(properties.get(0).getValue(), properties.get(0).getSignature());
for (GameProfile.Property property : properties) {
if (property.getName().equals(TabList.TEXTURES_PROPERTY)) {
return new TabList.Skin(property.getValue(), property.getSignature());
}
}
return null;
}
@Override