Skip to content

Commit fab15b5

Browse files
committed
Wip
Signed-off-by: BT <43831917+calcastor@users.noreply.github.com>
1 parent ec662a4 commit fab15b5

8 files changed

Lines changed: 119 additions & 63 deletions

File tree

core/src/main/java/dev/pgm/community/Community.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.pgm.community;
22

3-
import static dev.pgm.community.util.FakeIdentityStore.fakeIdentityStore;
3+
import static dev.pgm.community.nick.PlayerIdentity.PLAYER_IDENTITY;
44

55
import dev.pgm.community.commands.graph.CommunityCommandGraph;
66
import dev.pgm.community.events.CommunityEvent;
@@ -67,7 +67,7 @@ public void onEnable() {
6767
public void onDisable() {
6868
Platform.MANIFEST.onDisable();
6969
if (features != null) features.disable();
70-
fakeIdentityStore.clearAll();
70+
PLAYER_IDENTITY.clearAll();
7171
dev.pgm.community.database.DatabaseExecutor.shutdown();
7272
}
7373

util/src/main/java/dev/pgm/community/util/FakeIdentityStore.java renamed to core/src/main/java/dev/pgm/community/nick/PlayerIdentity.java

Lines changed: 61 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
package dev.pgm.community.util;
1+
package dev.pgm.community.nick;
22

33
import static dev.pgm.community.util.PlayerUtils.PLAYER_UTILS;
44

55
import java.util.Collection;
66
import java.util.HashMap;
7+
import java.util.HashSet;
78
import java.util.Map;
89
import java.util.UUID;
910
import org.bukkit.entity.Player;
@@ -12,23 +13,26 @@
1213
import tc.oc.pgm.util.skin.Skin;
1314

1415
@NullMarked
15-
public final class FakeIdentityStore {
16-
public static final FakeIdentityStore fakeIdentityStore = new FakeIdentityStore();
16+
public final class PlayerIdentity {
17+
public static final int MAX_NICK_LENGTH = 16;
18+
public static final PlayerIdentity PLAYER_IDENTITY = new PlayerIdentity();
1719

1820
private final Map<UUID, Map<UUID, Skin>> playerSkins = new HashMap<>();
1921
private final Map<UUID, Map<UUID, String>> playerNames = new HashMap<>();
2022
private final Map<UUID, Map<UUID, String>> playerDisplayNames = new HashMap<>();
21-
private final Map<UUID, Map<String, String>> viewerEntryTeams = new HashMap<>();
23+
private final Map<UUID, Map<String, HashSet<String>>> viewerTeamEntries = new HashMap<>();
2224
private final Map<UUID, Map<String, String>> viewerVisibleNames = new HashMap<>();
2325

24-
private FakeIdentityStore() {}
26+
private PlayerIdentity() {}
2527

2628
public void set(
2729
Player player,
2830
Player viewer,
2931
@Nullable String displayName,
3032
@Nullable String nick,
3133
@Nullable Skin skin) {
34+
validateNick(nick);
35+
3236
UUID playerId = player.getUniqueId();
3337
UUID viewerId = viewer.getUniqueId();
3438

@@ -52,6 +56,13 @@ private static <T> void set(
5256
identities.computeIfAbsent(playerId, k -> new HashMap<>()).put(viewerId, value);
5357
}
5458

59+
public static void validateNick(@Nullable String name) {
60+
if (name != null && name.length() > MAX_NICK_LENGTH) {
61+
throw new IllegalArgumentException(
62+
"Player nick names are limited to " + MAX_NICK_LENGTH + " characters in length");
63+
}
64+
}
65+
5566
public void clearPlayer(UUID playerId, String realName) {
5667
playerSkins.remove(playerId);
5768
playerNames.remove(playerId);
@@ -66,7 +77,7 @@ public void clearViewer(UUID viewerId) {
6677
clearViewer(playerSkins, viewerId);
6778
clearViewer(playerNames, viewerId);
6879
clearViewer(playerDisplayNames, viewerId);
69-
viewerEntryTeams.remove(viewerId);
80+
viewerTeamEntries.remove(viewerId);
7081
viewerVisibleNames.remove(viewerId);
7182
}
7283

@@ -81,7 +92,7 @@ public void clearAll() {
8192
playerSkins.clear();
8293
playerNames.clear();
8394
playerDisplayNames.clear();
84-
viewerEntryTeams.clear();
95+
viewerTeamEntries.clear();
8596
viewerVisibleNames.clear();
8697
}
8798

@@ -108,12 +119,22 @@ private void clearVisibleName(UUID viewerId, String realName) {
108119
}
109120

110121
public @Nullable String getTeamName(UUID viewerId, String entry) {
111-
Map<String, String> entryTeams = viewerEntryTeams.get(viewerId);
112-
return entryTeams == null ? null : entryTeams.get(entry);
122+
Map<String, HashSet<String>> teamEntries = viewerTeamEntries.get(viewerId);
123+
if (teamEntries == null) return null;
124+
125+
for (Map.Entry<String, HashSet<String>> team : teamEntries.entrySet()) {
126+
if (team.getValue().contains(entry)) return team.getKey();
127+
}
128+
129+
return null;
113130
}
114131

115132
public boolean hasTeamEntry(UUID viewerId, String teamName, String entry) {
116-
return teamName.equals(getTeamName(viewerId, entry));
133+
Map<String, HashSet<String>> teamEntries = viewerTeamEntries.get(viewerId);
134+
if (teamEntries == null) return false;
135+
136+
HashSet<String> entries = teamEntries.get(teamName);
137+
return entries != null && entries.contains(entry);
117138
}
118139

119140
public void createTeam(UUID viewerId, String teamName, Collection<String> entries) {
@@ -122,27 +143,33 @@ public void createTeam(UUID viewerId, String teamName, Collection<String> entrie
122143
}
123144

124145
public void removeTeam(UUID viewerId, String teamName) {
125-
Map<String, String> entryTeams = viewerEntryTeams.get(viewerId);
126-
if (entryTeams == null) return;
146+
Map<String, HashSet<String>> teamEntries = viewerTeamEntries.get(viewerId);
147+
if (teamEntries == null) return;
127148

128-
entryTeams.values().removeIf(teamName::equals);
129-
if (entryTeams.isEmpty()) viewerEntryTeams.remove(viewerId);
149+
teamEntries.remove(teamName);
150+
if (teamEntries.isEmpty()) viewerTeamEntries.remove(viewerId);
130151
}
131152

132153
public void addTeamEntries(UUID viewerId, String teamName, Collection<String> entries) {
133154
if (entries.isEmpty()) return;
134155

135-
Map<String, String> entryTeams =
136-
viewerEntryTeams.computeIfAbsent(viewerId, k -> new HashMap<>());
137-
entries.forEach(entry -> entryTeams.put(entry, teamName));
156+
Map<String, HashSet<String>> teamEntries =
157+
viewerTeamEntries.computeIfAbsent(viewerId, k -> new HashMap<>());
158+
teamEntries.values().forEach(team -> team.removeAll(entries));
159+
teamEntries.values().removeIf(Collection::isEmpty);
160+
teamEntries.computeIfAbsent(teamName, k -> new HashSet<>()).addAll(entries);
138161
}
139162

140163
public void removeTeamEntries(UUID viewerId, String teamName, Collection<String> entries) {
141-
Map<String, String> entryTeams = viewerEntryTeams.get(viewerId);
142-
if (entryTeams == null) return;
164+
Map<String, HashSet<String>> teamEntries = viewerTeamEntries.get(viewerId);
165+
if (teamEntries == null) return;
143166

144-
entries.forEach(entry -> entryTeams.remove(entry, teamName));
145-
if (entryTeams.isEmpty()) viewerEntryTeams.remove(viewerId);
167+
HashSet<String> team = teamEntries.get(teamName);
168+
if (team == null) return;
169+
170+
team.removeAll(entries);
171+
if (team.isEmpty()) teamEntries.remove(teamName);
172+
if (teamEntries.isEmpty()) viewerTeamEntries.remove(viewerId);
146173
}
147174

148175
public String getDisplayName(Player player, Player viewer) {
@@ -152,20 +179,33 @@ public String getDisplayName(Player player, Player viewer) {
152179
return player.getDisplayName();
153180
}
154181

182+
public boolean hasDisplayName(Player player, Player viewer) {
183+
return get(playerDisplayNames, player.getUniqueId(), viewer.getUniqueId()) != null;
184+
}
185+
155186
public String getName(Player player, Player viewer) {
156187
String name = get(playerNames, player.getUniqueId(), viewer.getUniqueId());
157188
if (name != null) return name;
158189

159190
return player.getName();
160191
}
161192

193+
public boolean hasName(Player player, Player viewer) {
194+
return get(playerNames, player.getUniqueId(), viewer.getUniqueId()) != null;
195+
}
196+
162197
public Skin getSkin(Player player, Player viewer) {
163198
Skin skin = get(playerSkins, player.getUniqueId(), viewer.getUniqueId());
164199
if (skin != null && !skin.isEmpty()) return skin;
165200

166201
return PLAYER_UTILS.getPlayerSkin(player);
167202
}
168203

204+
public boolean hasSkin(Player player, Player viewer) {
205+
Skin skin = get(playerSkins, player.getUniqueId(), viewer.getUniqueId());
206+
return skin != null && !skin.isEmpty();
207+
}
208+
169209
private static <T> @Nullable T get(
170210
Map<UUID, Map<UUID, T>> identities, UUID playerId, UUID viewerId) {
171211
Map<UUID, T> viewers = identities.get(playerId);

core/src/main/java/dev/pgm/community/nick/feature/PGMNickIntegration.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.pgm.community.nick.feature;
22

3-
import static dev.pgm.community.util.FakeIdentityStore.fakeIdentityStore;
3+
import static dev.pgm.community.nick.PlayerIdentity.PLAYER_IDENTITY;
44
import static net.kyori.adventure.text.Component.text;
55

66
import dev.pgm.community.utils.PGMUtils;
@@ -41,7 +41,7 @@ public String getNick(Player player) {
4141

4242
@Override
4343
public Skin getPlayerSkin(@NonNull Player player, Player viewer) {
44-
return fakeIdentityStore.getSkin(player, viewer);
44+
return PLAYER_IDENTITY.getSkin(player, viewer);
4545
}
4646

4747
public void cancelTask() {

core/src/main/java/dev/pgm/community/nick/skin/SkinCache.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.pgm.community.nick.skin;
22

3-
import static dev.pgm.community.util.FakeIdentityStore.fakeIdentityStore;
3+
import static dev.pgm.community.nick.PlayerIdentity.PLAYER_IDENTITY;
44
import static dev.pgm.community.util.PlayerUtils.PLAYER_UTILS;
55

66
import com.google.common.cache.Cache;
@@ -68,11 +68,14 @@ public void onPlayerQuit(PlayerQuitEvent event) {
6868
offlineSkins.put(player.getUniqueId(), PLAYER_UTILS.getPlayerSkin(player));
6969
}
7070

71-
fakeIdentityStore.clearViewer(player.getUniqueId());
71+
PLAYER_IDENTITY.clearViewer(player.getUniqueId());
7272
UUID playerId = player.getUniqueId();
7373
String playerName = player.getName();
74-
Bukkit.getScheduler()
75-
.runTask(Community.get(), () -> fakeIdentityStore.clearPlayer(playerId, playerName));
74+
Bukkit.getScheduler().runTask(Community.get(), () -> {
75+
if (Bukkit.getPlayer(playerId) == null) {
76+
PLAYER_IDENTITY.clearPlayer(playerId, playerName);
77+
}
78+
});
7679
}
7780

7881
@EventHandler(priority = EventPriority.LOW)

core/src/main/java/dev/pgm/community/nick/skin/SkinManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.pgm.community.nick.skin;
22

3-
import static dev.pgm.community.util.FakeIdentityStore.fakeIdentityStore;
3+
import static dev.pgm.community.nick.PlayerIdentity.PLAYER_IDENTITY;
44

55
import dev.pgm.community.Community;
66
import org.bukkit.entity.Player;
@@ -34,6 +34,6 @@ public void disable() {
3434
registered = false;
3535
}
3636

37-
fakeIdentityStore.clearAll();
37+
PLAYER_IDENTITY.clearAll();
3838
}
3939
}

platform/platform-modern/src/main/java/dev/pgm/community/platform/modern/ModernPlayerUtils.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.pgm.community.platform.modern;
22

3-
import static dev.pgm.community.util.FakeIdentityStore.fakeIdentityStore;
3+
import static dev.pgm.community.nick.PlayerIdentity.PLAYER_IDENTITY;
44
import static dev.pgm.community.util.Supports.Variant.PAPER;
55

66
import com.destroystokyo.paper.profile.CraftPlayerProfile;
@@ -39,11 +39,11 @@ public Skin getPlayerSkin(Player player) {
3939
@Override
4040
public void setFakeNameAndSkin(
4141
Player player, Player viewer, String displayName, String nick, Skin skin) {
42-
String oldName = fakeIdentityStore.getName(player, viewer);
42+
String oldName = PLAYER_IDENTITY.getName(player, viewer);
4343

44-
fakeIdentityStore.set(player, viewer, displayName, nick, skin);
44+
PLAYER_IDENTITY.set(player, viewer, displayName, nick, skin);
4545

46-
String newName = fakeIdentityStore.getName(player, viewer);
46+
String newName = PLAYER_IDENTITY.getName(player, viewer);
4747

4848
if (!oldName.equals(newName)) {
4949
updateTeamEntry(viewer, oldName, newName);
@@ -52,14 +52,14 @@ public void setFakeNameAndSkin(
5252

5353
private void updateTeamEntry(@NonNull Player viewer, String oldName, String newName) {
5454
UUID viewerId = viewer.getUniqueId();
55-
String teamName = fakeIdentityStore.getTeamName(viewerId, oldName);
55+
String teamName = PLAYER_IDENTITY.getTeamName(viewerId, oldName);
5656
if (teamName == null) return;
5757

5858
sendTeamPacketSilently(viewer, teamName, TeamMode.REMOVE_ENTITIES, List.of(oldName));
59-
fakeIdentityStore.removeTeamEntries(viewerId, teamName, List.of(oldName));
59+
PLAYER_IDENTITY.removeTeamEntries(viewerId, teamName, List.of(oldName));
6060

6161
sendTeamPacketSilently(viewer, teamName, TeamMode.ADD_ENTITIES, List.of(newName));
62-
fakeIdentityStore.addTeamEntries(viewerId, teamName, List.of(newName));
62+
PLAYER_IDENTITY.addTeamEntries(viewerId, teamName, List.of(newName));
6363
}
6464

6565
private void sendTeamPacketSilently(

platform/platform-modern/src/main/java/dev/pgm/community/platform/modern/PacketManipulations.java

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.pgm.community.platform.modern;
22

3-
import static dev.pgm.community.util.FakeIdentityStore.fakeIdentityStore;
3+
import static dev.pgm.community.nick.PlayerIdentity.PLAYER_IDENTITY;
44

55
import com.github.retrooper.packetevents.event.PacketListenerCommon;
66
import com.github.retrooper.packetevents.event.PacketListenerPriority;
@@ -57,25 +57,36 @@ private void handlePlayerInfo(@NonNull PacketSendEvent event) {
5757
Player player = Bukkit.getPlayer(entry.getProfileId());
5858
if (player == null || player.equals(viewer)) continue;
5959

60-
String playerDisplayName = fakeIdentityStore.getDisplayName(player, viewer);
61-
String playerName = fakeIdentityStore.getName(player, viewer);
60+
boolean hasName = PLAYER_IDENTITY.hasName(player, viewer);
61+
boolean hasSkin = PLAYER_IDENTITY.hasSkin(player, viewer);
62+
boolean hasDisplayName = PLAYER_IDENTITY.hasDisplayName(player, viewer);
6263

63-
if (StringUtils.isBlank(playerName) || StringUtils.isBlank(playerDisplayName)) continue;
64+
if (!hasName && !hasSkin && !hasDisplayName) continue;
6465

65-
if (hasAddPlayer) {
66+
if (hasAddPlayer && (hasName || hasSkin)) {
6667
UserProfile profile = entry.getGameProfile();
67-
profile.setName(playerName);
68+
if (hasName) {
69+
String playerName = PLAYER_IDENTITY.getName(player, viewer);
70+
if (StringUtils.isBlank(playerName)) continue;
6871

69-
Skin skin = fakeIdentityStore.getSkin(player, viewer);
70-
profile.getTextureProperties().clear();
71-
profile
72-
.getTextureProperties()
73-
.add(new TextureProperty("textures", skin.getData(), skin.getSignature()));
72+
profile.setName(playerName);
73+
}
74+
75+
if (hasSkin) {
76+
Skin skin = PLAYER_IDENTITY.getSkin(player, viewer);
77+
profile.getTextureProperties().clear();
78+
profile
79+
.getTextureProperties()
80+
.add(new TextureProperty("textures", skin.getData(), skin.getSignature()));
81+
}
7482

7583
entry.setGameProfile(profile);
7684
}
7785

78-
if (hasUpdateDisplayName) {
86+
if (hasUpdateDisplayName && hasDisplayName) {
87+
String playerDisplayName = PLAYER_IDENTITY.getDisplayName(player, viewer);
88+
if (StringUtils.isBlank(playerDisplayName)) continue;
89+
7990
entry.setDisplayName(
8091
LegacyComponentSerializer.legacySection().deserialize(playerDisplayName));
8192
}
@@ -102,18 +113,20 @@ private void handleScoreboardTeams(@NonNull PacketSendEvent event) {
102113
boolean modified = false;
103114
for (int i = 0; i < players.size(); i++) {
104115
String entry = players.get(i);
105-
String visibleName = fakeIdentityStore.getVisibleName(viewerId, entry);
116+
String visibleName = PLAYER_IDENTITY.getVisibleName(viewerId, entry);
106117
if (mode == TeamMode.REMOVE_ENTITIES) {
107-
String removeEntry = StringUtils.isBlank(visibleName) ? entry : visibleName;
108-
if (!fakeIdentityStore.hasTeamEntry(viewerId, teamName, removeEntry)) {
109-
players.remove(i--);
110-
modified = true;
118+
if (!StringUtils.isBlank(visibleName)
119+
&& PLAYER_IDENTITY.hasTeamEntry(viewerId, teamName, visibleName)) {
120+
if (!visibleName.equals(entry)) {
121+
players.set(i, visibleName);
122+
modified = true;
123+
}
111124
continue;
112125
}
113126

114-
if (removeEntry.equals(entry)) continue;
127+
if (PLAYER_IDENTITY.hasTeamEntry(viewerId, teamName, entry)) continue;
115128

116-
players.set(i, removeEntry);
129+
players.remove(i--);
117130
modified = true;
118131
continue;
119132
}
@@ -140,10 +153,10 @@ private void handleScoreboardTeams(@NonNull PacketSendEvent event) {
140153
private void trackTeamPacket(
141154
UUID viewerId, String teamName, TeamMode mode, List<String> players) {
142155
switch (mode) {
143-
case CREATE -> fakeIdentityStore.createTeam(viewerId, teamName, players);
144-
case REMOVE -> fakeIdentityStore.removeTeam(viewerId, teamName);
145-
case ADD_ENTITIES -> fakeIdentityStore.addTeamEntries(viewerId, teamName, players);
146-
case REMOVE_ENTITIES -> fakeIdentityStore.removeTeamEntries(viewerId, teamName, players);
156+
case CREATE -> PLAYER_IDENTITY.createTeam(viewerId, teamName, players);
157+
case REMOVE -> PLAYER_IDENTITY.removeTeam(viewerId, teamName);
158+
case ADD_ENTITIES -> PLAYER_IDENTITY.addTeamEntries(viewerId, teamName, players);
159+
case REMOVE_ENTITIES -> PLAYER_IDENTITY.removeTeamEntries(viewerId, teamName, players);
147160
case UPDATE -> {
148161
// Team metadata update; membership is unchanged.
149162
}

0 commit comments

Comments
 (0)