Skip to content

Commit

Permalink
Update player profile packet handler (#2530)
Browse files Browse the repository at this point in the history
* Step 1: use `ProfileEditorImpl` directly

* Step 2: properly return the modified packet
  • Loading branch information
tal5 committed Sep 10, 2023
1 parent 66e8385 commit 12919ca
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 63 deletions.
Expand Up @@ -25,6 +25,7 @@
import org.bukkit.event.player.PlayerRespawnEvent;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.UUID;
Expand Down Expand Up @@ -52,53 +53,54 @@ protected void updatePlayer(final Player player, final boolean isSkinChanging) {
player.updateInventory();
}

// TODO: properly rebundle the packet instead of splitting it up
public static boolean handleAlteredProfiles(ClientboundPlayerInfoUpdatePacket packet, DenizenNetworkManagerImpl manager) {
public static void registerHandlers() {
DenizenNetworkManagerImpl.registerPacketHandler(ClientboundPlayerInfoUpdatePacket.class, ProfileEditorImpl::processPlayerInfoUpdatePacket);
}

public static ClientboundPlayerInfoUpdatePacket processPlayerInfoUpdatePacket(DenizenNetworkManagerImpl networkManager, ClientboundPlayerInfoUpdatePacket playerInfoUpdatePacket) {
if (ProfileEditor.mirrorUUIDs.isEmpty() && !RenameCommand.hasAnyDynamicRenames() && fakeProfiles.isEmpty()) {
return true;
return playerInfoUpdatePacket;
}
EnumSet<ClientboundPlayerInfoUpdatePacket.Action> actions = packet.actions();
EnumSet<ClientboundPlayerInfoUpdatePacket.Action> actions = playerInfoUpdatePacket.actions();
if (!actions.contains(ClientboundPlayerInfoUpdatePacket.Action.ADD_PLAYER) && !actions.contains(ClientboundPlayerInfoUpdatePacket.Action.UPDATE_DISPLAY_NAME)) {
return true;
return playerInfoUpdatePacket;
}
try {
boolean any = false;
for (ClientboundPlayerInfoUpdatePacket.Entry entry : packet.entries()) {
if (ProfileEditor.mirrorUUIDs.contains(entry.profileId()) || RenameCommand.customNames.containsKey(entry.profileId()) || fakeProfiles.containsKey(entry.profileId())) {
any = true;
break;
}
boolean any = false;
for (ClientboundPlayerInfoUpdatePacket.Entry entry : playerInfoUpdatePacket.entries()) {
if (shouldChange(entry)) {
any = true;
break;
}
if (!any) {
return true;
}
if (!any) {
return playerInfoUpdatePacket;
}
GameProfile ownProfile = networkManager.player.getGameProfile();
List<ClientboundPlayerInfoUpdatePacket.Entry> modifiedEntries = new ArrayList<>(playerInfoUpdatePacket.entries().size());
for (ClientboundPlayerInfoUpdatePacket.Entry entry : playerInfoUpdatePacket.entries()) {
if (!shouldChange(entry)) {
modifiedEntries.add(entry);
continue;
}
GameProfile ownProfile = manager.player.getGameProfile();
for (ClientboundPlayerInfoUpdatePacket.Entry data : packet.entries()) {
if (!ProfileEditor.mirrorUUIDs.contains(data.profileId()) && !RenameCommand.customNames.containsKey(data.profileId()) && !fakeProfiles.containsKey(data.profileId())) {
manager.oldManager.send(createInfoPacket(actions, List.of(data)));
}
else {
String rename = RenameCommand.getCustomNameFor(data.profileId(), manager.player.getBukkitEntity(), false);
GameProfile baseProfile = fakeProfiles.containsKey(data.profileId()) ? getGameProfile(fakeProfiles.get(data.profileId())) : data.profile();
GameProfile patchedProfile = new GameProfile(baseProfile.getId(), rename != null ? (rename.length() > 16 ? rename.substring(0, 16) : rename) : baseProfile.getName());
if (ProfileEditor.mirrorUUIDs.contains(data.profileId())) {
patchedProfile.getProperties().putAll(ownProfile.getProperties());
}
else {
patchedProfile.getProperties().putAll(baseProfile.getProperties());
}
String listRename = RenameCommand.getCustomNameFor(data.profileId(), manager.player.getBukkitEntity(), true);
Component displayName = listRename != null ? Handler.componentToNMS(FormattedTextHelper.parse(listRename, ChatColor.WHITE)) : data.displayName();
ClientboundPlayerInfoUpdatePacket.Entry newData = new ClientboundPlayerInfoUpdatePacket.Entry(data.profileId(), patchedProfile, data.listed(), data.latency(), data.gameMode(), displayName, data.chatSession());
manager.oldManager.send(createInfoPacket(actions, List.of(newData)));
}
String rename = RenameCommand.getCustomNameFor(entry.profileId(), networkManager.player.getBukkitEntity(), false);
GameProfile baseProfile = fakeProfiles.containsKey(entry.profileId()) ? getGameProfile(fakeProfiles.get(entry.profileId())) : entry.profile();
GameProfile modifiedProfile = new GameProfile(baseProfile.getId(), rename != null ? (rename.length() > 16 ? rename.substring(0, 16) : rename) : baseProfile.getName());
if (ProfileEditor.mirrorUUIDs.contains(entry.profileId())) {
modifiedProfile.getProperties().putAll(ownProfile.getProperties());
}
return false;
}
catch (Exception e) {
Debug.echoError(e);
return true;
else {
modifiedProfile.getProperties().putAll(baseProfile.getProperties());
}
String listRename = RenameCommand.getCustomNameFor(entry.profileId(), networkManager.player.getBukkitEntity(), true);
Component displayName = listRename != null ? Handler.componentToNMS(FormattedTextHelper.parse(listRename, ChatColor.WHITE)) : entry.displayName();
ClientboundPlayerInfoUpdatePacket.Entry modifiedEntry = new ClientboundPlayerInfoUpdatePacket.Entry(entry.profileId(), modifiedProfile, entry.listed(), entry.latency(), entry.gameMode(), displayName, entry.chatSession());
modifiedEntries.add(modifiedEntry);
}
return createInfoPacket(actions, modifiedEntries);
}

public static boolean shouldChange(ClientboundPlayerInfoUpdatePacket.Entry entry) {
return ProfileEditor.mirrorUUIDs.contains(entry.profileId()) || RenameCommand.customNames.containsKey(entry.profileId()) || fakeProfiles.containsKey(entry.profileId());
}

public static final Field ClientboundPlayerInfoUpdatePacket_entries = ReflectionHelper.getFields(ClientboundPlayerInfoUpdatePacket.class).getFirstOfType(List.class);
Expand Down
Expand Up @@ -3,6 +3,7 @@
import com.denizenscript.denizen.events.player.PlayerReceivesPacketScriptEvent;
import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.nms.v1_20.ReflectionMappingsInfo;
import com.denizenscript.denizen.nms.v1_20.impl.ProfileEditorImpl;
import com.denizenscript.denizen.nms.v1_20.impl.network.handlers.packet.*;
import com.denizenscript.denizen.utilities.Settings;
import com.denizenscript.denizen.utilities.packets.NetworkInterceptCodeGen;
Expand Down Expand Up @@ -344,7 +345,7 @@ public Packet<ClientGamePacketListener> processPacketHandlersFor(Packet<ClientGa
HiddenEntitiesPacketHandlers.registerHandlers();
HideParticlesPacketHandlers.registerHandlers();
PlayerHearsSoundEventPacketHandlers.registerHandlers();
ProfileMirrorPacketHandlers.registerHandlers();
ProfileEditorImpl.registerHandlers();
TablistUpdateEventPacketHandlers.registerHandlers();
}

Expand Down

This file was deleted.

0 comments on commit 12919ca

Please sign in to comment.