Skip to content

Commit fb2e2f1

Browse files
committed
Fix nicknames on modern?
Signed-off-by: BT (calcastor/mame) <43831917+calcastor@users.noreply.github.com>
1 parent 27a216b commit fb2e2f1

4 files changed

Lines changed: 70 additions & 54 deletions

File tree

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ private void refreshFakeName(Player player, Player viewer) {
125125
} else {
126126
PLAYER_UTILS.setFakeNameAndSkin(player, viewer, null, null, null);
127127
}
128+
129+
PLAYER_UTILS.refreshPlayer(null, player, viewer);
128130
}
129131

130132
public void onSkinRefresh(Player player, Skin skin) {

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

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22

33
import static dev.pgm.community.util.Supports.Variant.PAPER;
44

5+
import com.comphenix.protocol.events.PacketEvent;
56
import com.destroystokyo.paper.profile.CraftPlayerProfile;
67
import com.destroystokyo.paper.profile.PlayerProfile;
8+
import com.google.common.collect.ImmutableMultimap;
9+
import com.mojang.authlib.GameProfile;
10+
import com.mojang.authlib.properties.Property;
11+
import com.mojang.authlib.properties.PropertyMap;
712
import dev.pgm.community.util.PlayerUtils;
813
import dev.pgm.community.util.Supports;
914
import dev.pgm.community.utils.MessageUtils;
@@ -12,15 +17,24 @@
1217
import java.net.URISyntaxException;
1318
import java.util.Arrays;
1419
import java.util.HashMap;
20+
import java.util.List;
1521
import java.util.Map;
1622
import java.util.UUID;
23+
import net.minecraft.network.protocol.game.ClientboundPlayerInfoRemovePacket;
24+
import net.minecraft.network.protocol.game.ClientboundPlayerInfoUpdatePacket;
25+
import net.minecraft.network.protocol.game.ClientboundSetPlayerTeamPacket;
26+
import net.minecraft.server.level.ServerPlayer;
27+
import net.minecraft.world.scores.PlayerTeam;
28+
import net.minecraft.world.scores.Scoreboard;
29+
import org.apache.commons.lang3.StringUtils;
1730
import org.bukkit.Material;
1831
import org.bukkit.craftbukkit.entity.CraftPlayer;
1932
import org.bukkit.entity.Player;
2033
import org.bukkit.inventory.ItemFlag;
2134
import org.bukkit.inventory.ItemStack;
2235
import org.bukkit.inventory.meta.SkullMeta;
2336
import org.bukkit.profile.PlayerTextures;
37+
import org.jspecify.annotations.Nullable;
2438
import tc.oc.pgm.platform.modern.util.Skins;
2539
import tc.oc.pgm.util.bukkit.BukkitUtils;
2640
import tc.oc.pgm.util.skin.Skin;
@@ -106,4 +120,45 @@ public ItemStack customSkull(String url, String displayName, String... lore) {
106120
head.setItemMeta(headMeta);
107121
return head;
108122
}
123+
124+
@Override
125+
public void refreshPlayer(@Nullable PacketEvent event, Player player, Player viewer) {
126+
String playerDisplayName = PLAYER_UTILS.getPlayerDisplayName(player, viewer);
127+
String playerName = PLAYER_UTILS.getPlayerName(player, viewer);
128+
129+
if (StringUtils.isBlank(playerName) || StringUtils.isBlank(playerDisplayName)) {
130+
return;
131+
}
132+
133+
if (event != null) event.setCancelled(true);
134+
135+
ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle();
136+
ServerPlayer viewerNms = ((CraftPlayer) viewer).getHandle();
137+
GameProfile realProfile = nmsPlayer.gameProfile;
138+
139+
Skin skin = PLAYER_UTILS.getPlayerSkin(player, viewer);
140+
ImmutableMultimap.Builder<String, Property> builder = ImmutableMultimap.builder();
141+
if (skin != null && skin.getData() != null) {
142+
builder.put("textures", new Property("textures", skin.getData(), skin.getSignature()));
143+
} else {
144+
realProfile.properties().get("textures").forEach(p -> builder.put("textures", p));
145+
}
146+
147+
viewerNms.connection.send(new ClientboundPlayerInfoRemovePacket(List.of(player.getUniqueId())));
148+
nmsPlayer.gameProfile =
149+
new GameProfile(realProfile.id(), playerName, new PropertyMap(builder.build()));
150+
viewerNms.connection.send(
151+
ClientboundPlayerInfoUpdatePacket.createPlayerInitializing(List.of(nmsPlayer), viewerNms));
152+
nmsPlayer.gameProfile = realProfile;
153+
154+
Scoreboard scoreboard = nmsPlayer.getBukkitEntity().getScoreboard().getHandle();
155+
PlayerTeam nmsTeam = scoreboard.getPlayersTeam(player.getName());
156+
157+
if (nmsTeam != null) {
158+
ClientboundSetPlayerTeamPacket teamPacket = ClientboundSetPlayerTeamPacket.createPlayerPacket(
159+
nmsTeam, playerName, ClientboundSetPlayerTeamPacket.Action.ADD);
160+
161+
viewerNms.connection.send(teamPacket);
162+
}
163+
}
109164
}

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

Lines changed: 7 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,15 @@
55
import com.comphenix.protocol.PacketType;
66
import com.comphenix.protocol.events.ListenerPriority;
77
import com.comphenix.protocol.events.PacketEvent;
8-
import com.comphenix.protocol.wrappers.EnumWrappers;
98
import com.comphenix.protocol.wrappers.PlayerInfoData;
10-
import com.comphenix.protocol.wrappers.WrappedChatComponent;
11-
import com.comphenix.protocol.wrappers.WrappedGameProfile;
12-
import com.comphenix.protocol.wrappers.WrappedSignedProperty;
139
import java.util.List;
1410
import java.util.Map;
15-
import java.util.Objects;
1611
import java.util.UUID;
17-
import org.apache.commons.lang3.StringUtils;
1812
import org.bukkit.Bukkit;
1913
import org.bukkit.entity.Player;
2014
import org.bukkit.plugin.Plugin;
2115
import tc.oc.pgm.platform.modern.packets.PacketSender;
2216
import tc.oc.pgm.platform.modern.util.Packets;
23-
import tc.oc.pgm.util.skin.Skin;
2417

2518
public class PacketManipulations implements PacketSender {
2619

@@ -34,54 +27,14 @@ public PacketManipulations(Plugin plugin) {
3427
private void handlePlayerInfo(PacketEvent event) {
3528
Player viewer = event.getPlayer();
3629

37-
if (event
38-
.getPacket()
39-
.getPlayerInfoActions()
40-
.read(0)
41-
.contains(EnumWrappers.PlayerInfoAction.ADD_PLAYER)) {
42-
List<PlayerInfoData> infoList = event.getPacket().getPlayerInfoDataLists().read(0);
30+
List<PlayerInfoData> dataList = event.getPacket().getPlayerInfoDataLists().read(0);
31+
for (PlayerInfoData playerInfoData : dataList) {
32+
if (playerInfoData == null) continue;
33+
UUID playerId = playerInfoData.getProfileId();
34+
Player player = Bukkit.getPlayer(playerId);
35+
if (player == null || player.equals(viewer) || !player.isOnline()) continue;
4336

44-
if (infoList.stream().anyMatch(Objects::isNull)) return;
45-
46-
event
47-
.getPacket()
48-
.getPlayerInfoDataLists()
49-
.write(
50-
0,
51-
infoList.stream()
52-
.map(playerInfoData -> {
53-
UUID playerId = playerInfoData.getProfileId();
54-
Player player = Bukkit.getPlayer(playerId);
55-
if (player == null || player.equals(viewer) || !player.isOnline()) {
56-
return playerInfoData;
57-
}
58-
59-
String playerDisplayName = PLAYER_UTILS.getPlayerDisplayName(player, viewer);
60-
String playerName = PLAYER_UTILS.getPlayerName(player, viewer);
61-
62-
if (StringUtils.isBlank(playerName) || StringUtils.isBlank(playerDisplayName)) {
63-
return playerInfoData;
64-
}
65-
66-
WrappedGameProfile playerProfile =
67-
playerInfoData.getProfile().withName(playerName);
68-
Skin skin = PLAYER_UTILS.getPlayerSkin(player, viewer);
69-
playerProfile
70-
.getProperties()
71-
.put(
72-
"textures",
73-
new WrappedSignedProperty(
74-
"textures", skin.getData(), skin.getSignature()));
75-
76-
return new PlayerInfoData(
77-
playerId,
78-
playerInfoData.getLatency(),
79-
playerInfoData.isListed(),
80-
playerInfoData.getGameMode(),
81-
playerProfile,
82-
WrappedChatComponent.fromLegacyText(playerDisplayName));
83-
})
84-
.toList());
37+
PLAYER_UTILS.refreshPlayer(event, player, viewer);
8538
}
8639
}
8740
}

util/src/main/java/dev/pgm/community/util/PlayerUtils.java

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

3+
import com.comphenix.protocol.events.PacketEvent;
34
import org.bukkit.entity.Player;
45
import org.bukkit.inventory.ItemStack;
6+
import org.jspecify.annotations.Nullable;
57
import tc.oc.pgm.util.skin.Skin;
68

79
public interface PlayerUtils {
@@ -18,4 +20,8 @@ public interface PlayerUtils {
1820
Skin getPlayerSkin(Player player, Player viewer);
1921

2022
ItemStack customSkull(String url, String displayName, String... lore);
23+
24+
default void refreshPlayer(@Nullable PacketEvent event, Player player, Player viewer) {
25+
// no-op
26+
}
2127
}

0 commit comments

Comments
 (0)