Skip to content

Commit ecb4f4b

Browse files
authored
Fix nametag visibility duplicate names edge case (#675)
1 parent 6ea9377 commit ecb4f4b

3 files changed

Lines changed: 26 additions & 23 deletions

File tree

common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/rewriter/PlayerPacketRewriter1_8.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,13 @@ public void register() {
511511
String username = message.split(" ")[1];
512512
final GameProfileStorage storage = wrapper.user().get(GameProfileStorage.class);
513513

514-
final GameProfileStorage.GameProfile profile = storage.get(username, true);
514+
// Multiple players with the same name may exist. This will only represent
515+
// fake players so it's fine to just pick the first one.
516+
List<GameProfileStorage.GameProfile> profiles = storage.get(username, true);
517+
if (profiles.isEmpty()) {
518+
return;
519+
}
520+
final GameProfileStorage.GameProfile profile = profiles.get(0);
515521
if (profile != null && profile.uuid != null) {
516522
wrapper.cancel();
517523

common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/storage/EntityTracker1_8.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -222,17 +222,16 @@ public void checkNametagVisibility(final int entityId) {
222222

223223
public void checkNametagVisbility(final String username) {
224224
final GameProfileStorage profileStorage = user().get(GameProfileStorage.class);
225-
final GameProfileStorage.GameProfile profile = profileStorage.get(username, false);
226-
if (profile == null) {
227-
return;
228-
}
225+
final List<GameProfileStorage.GameProfile> profiles = profileStorage.get(username, false);
229226

230-
final int entityId = getPlayerEntityId(profile.uuid);
231-
if (entityId == -1) {
232-
return;
233-
}
227+
for (GameProfileStorage.GameProfile profile : profiles) {
228+
final int entityId = getPlayerEntityId(profile.uuid);
229+
if (entityId == -1) {
230+
return;
231+
}
234232

235-
checkNametagVisibility(entityId);
233+
checkNametagVisibility(entityId);
234+
}
236235
}
237236

238237
private boolean isPlayerNametagHidden(final int entityId) {

common/src/main/java/com/viaversion/viarewind/protocol/v1_8to1_7_6_10/storage/GameProfileStorage.java

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717
*/
1818
package com.viaversion.viarewind.protocol.v1_8to1_7_6_10.storage;
1919

20+
import com.google.common.collect.ArrayListMultimap;
21+
import com.google.common.collect.HashMultimap;
22+
import com.google.common.collect.ListMultimap;
23+
import com.google.common.collect.Multimap;
2024
import com.viaversion.nbt.tag.CompoundTag;
2125
import com.viaversion.nbt.tag.ListTag;
2226
import com.viaversion.nbt.tag.StringTag;
@@ -34,6 +38,7 @@
3438

3539
public class GameProfileStorage extends StoredObject {
3640
private final Map<UUID, GameProfile> properties = new HashMap<>();
41+
private final ListMultimap<String, GameProfile> nameToProfile = ArrayListMultimap.create();
3742

3843
public GameProfileStorage(UserConnection user) {
3944
super(user);
@@ -42,26 +47,17 @@ public GameProfileStorage(UserConnection user) {
4247
public GameProfile put(UUID uuid, String name, String displayName, int ping, int gamemode) {
4348
GameProfile gameProfile = new GameProfile(uuid, name, displayName, ping, gamemode);
4449
properties.put(uuid, gameProfile);
50+
nameToProfile.put(name, gameProfile);
4551
return gameProfile;
4652
}
4753

4854
public GameProfile get(UUID uuid) {
4955
return properties.get(uuid);
5056
}
5157

52-
public GameProfile get(String name, boolean ignoreCase) {
58+
public List<GameProfile> get(String name, boolean ignoreCase) {
5359
if (ignoreCase) name = name.toLowerCase();
54-
55-
for (GameProfile profile : properties.values()) {
56-
if (profile.name == null) continue;
57-
58-
String n = ignoreCase ? profile.name.toLowerCase() : profile.name;
59-
60-
if (n.equals(name)) {
61-
return profile;
62-
}
63-
}
64-
return null;
60+
return nameToProfile.get(name);
6561
}
6662

6763
public List<GameProfile> getAllWithPrefix(String prefix, boolean ignoreCase) {
@@ -81,7 +77,9 @@ public List<GameProfile> getAllWithPrefix(String prefix, boolean ignoreCase) {
8177
}
8278

8379
public GameProfile remove(UUID uuid) {
84-
return properties.remove(uuid);
80+
GameProfile removedProfile = properties.remove(uuid);
81+
nameToProfile.get(removedProfile.name).remove(removedProfile);
82+
return removedProfile;
8583
}
8684

8785

0 commit comments

Comments
 (0)