13
0
geforkt von Mirrors/Velocity

Fix 1.7 tablist behaving weird with colored names

The 1.7 tablist packet only contains three types of information:

 - Name of the tablist entry (limited to 16 characters including colors)
 - Ping of the entry
 - If this entry needs to be added or removed (client accepts duplicates
 as 'ping update')

The previous logic was trying to preserve parity with
GameProfile#getName returning a stripped down name to have a 'real'
username.
That is fundamentally broken, because entries with duplicate content,
but different colors are very common, especially with custom tablists.

For packets coming from a native 1.7 server we just won't define the
displayname anymore, as there is no such thing as a 'displayname',
because tablist entries are not bound to any player.

Using the Velocity Tablist API to modify existing entries will work, though
the backend server will completely loose control over the entry. Custom
entries added over the Velocity Tablist API will work, but are cut off
by the 16 character limitation.

This commit only fixes the bug, where entries are incorrectly handled
with their stripped name, a lot of the things explained above were
already implemented correctly.
Dieser Commit ist enthalten in:
Gabik21 2020-04-07 12:17:02 +02:00
Ursprung c54ea62012
Commit 2217e8a5c9
Es konnte kein GPG-Schlüssel zu dieser Signatur gefunden werden
GPG-Schlüssel-ID: A95DB353715365DF

Datei anzeigen

@ -60,29 +60,25 @@ public class VelocityTabListLegacy extends VelocityTabList {
Item item = packet.getItems().get(0); // Only one item per packet in 1.7 Item item = packet.getItems().get(0); // Only one item per packet in 1.7
Component displayName = LegacyComponentSerializer.legacy().deserialize(item.getName());
String strippedName = PlainComponentSerializer.INSTANCE.serialize(displayName);
switch (packet.getAction()) { switch (packet.getAction()) {
case PlayerListItem.ADD_PLAYER: case PlayerListItem.ADD_PLAYER:
if (nameMapping.containsKey(strippedName)) { // ADD_PLAYER also used for updating ping if (nameMapping.containsKey(item.getName())) { // ADD_PLAYER also used for updating ping
VelocityTabListEntry entry = entries.get(nameMapping.get(strippedName)); VelocityTabListEntry entry = entries.get(nameMapping.get(item.getName()));
if (entry != null) { if (entry != null) {
entry.setLatency(item.getLatency()); entry.setLatency(item.getLatency());
} }
} else { } else {
UUID uuid = UUID.randomUUID(); // Use a fake uuid to preserve function of custom entries UUID uuid = UUID.randomUUID(); // Use a fake uuid to preserve function of custom entries
nameMapping.put(strippedName, uuid); nameMapping.put(item.getName(), uuid);
entries.put(uuid, (VelocityTabListEntry) TabListEntry.builder() entries.put(uuid, (VelocityTabListEntry) TabListEntry.builder()
.tabList(this) .tabList(this)
.profile(new GameProfile(uuid, strippedName, ImmutableList.of())) .profile(new GameProfile(uuid, item.getName(), ImmutableList.of()))
.displayName(displayName)
.latency(item.getLatency()) .latency(item.getLatency())
.build()); .build());
} }
break; break;
case PlayerListItem.REMOVE_PLAYER: case PlayerListItem.REMOVE_PLAYER:
UUID removedUuid = nameMapping.remove(strippedName); UUID removedUuid = nameMapping.remove(item.getName());
if (removedUuid != null) { if (removedUuid != null) {
entries.remove(removedUuid); entries.remove(removedUuid);
} }