Skip to content

Commit

Permalink
add rename option 'list_name_only'
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Jan 4, 2021
1 parent 990d3e1 commit fe7beeb
Show file tree
Hide file tree
Showing 7 changed files with 78 additions and 29 deletions.
Expand Up @@ -43,7 +43,9 @@ public void mirrorOn() {
return;
}
mirroredUUID = npc.getEntity().getUniqueId();
RenameCommand.addDynamicRename(npc.getEntity(), null, Player::getName);
RenameCommand.RenameData renamer = new RenameCommand.RenameData();
renamer.nameFunction = Player::getName;
RenameCommand.addDynamicRename(npc.getEntity(), null, renamer);
}

public void mirrorOff() {
Expand Down
Expand Up @@ -33,17 +33,17 @@ public class RenameCommand extends AbstractCommand {

public RenameCommand() {
setName("rename");
setSyntax("rename [<name>/cancel] (t:<entity>|...) (per_player) (for:<player>|...)");
setRequiredArguments(1, 4);
setSyntax("rename [<name>/cancel] (t:<entity>|...) (per_player) (for:<player>|...) (list_name_only)");
setRequiredArguments(1, 5);
setParseArgs(false);
isProcedural = false;
}

// <--[command]
// @Name Rename
// @Syntax rename [<name>/cancel] (t:<entity>|...) (per_player) (for:<player>|...)
// @Syntax rename [<name>/cancel] (t:<entity>|...) (per_player) (for:<player>|...) (list_name_only)
// @Required 1
// @Maximum 4
// @Maximum 5
// @Short Renames the linked NPC or list of entities.
// @Group entity
//
Expand All @@ -63,6 +63,8 @@ public RenameCommand() {
// Rename to "cancel" per_player to intentionally end a per_player rename.
// Optionally specify "for:" a list of players when using per_player.
//
// Optionally specify 'list_name_only' to only change the tab list name for a player. Works with 'per_player'.
//
// @Tags
// <EntityTag.name>
// <NPCTag.nickname>
Expand Down Expand Up @@ -97,6 +99,10 @@ else if (!scriptEntry.hasObject("per_player")
&& arg.matches("per_player")) {
scriptEntry.addObject("per_player", new ElementTag(true));
}
else if (!scriptEntry.hasObject("list_name_only")
&& arg.matches("list_name_only")) {
scriptEntry.addObject("list_name_only", new ElementTag(true));
}
else if (!scriptEntry.hasObject("name")) {
scriptEntry.addObject("name", new ElementTag(arg.getRawValue()));
}
Expand All @@ -119,13 +125,15 @@ else if (!scriptEntry.hasObject("name")) {
public void execute(final ScriptEntry scriptEntry) {
final ElementTag name = scriptEntry.getElement("name");
ElementTag perPlayer = scriptEntry.getElement("per_player");
ElementTag listNameOnly = scriptEntry.getElement("list_name_only");
ListTag targets = scriptEntry.getObjectTag("targets");
List<PlayerTag> players = (List<PlayerTag>) scriptEntry.getObject("players");
if (perPlayer != null && perPlayer.asBoolean()) {
if (scriptEntry.dbCallShouldDebug()) {
Debug.report(scriptEntry, getName(), name.debug()
+ targets.debug()
+ perPlayer.debug()
+ (listNameOnly != null ? listNameOnly.debug() : "")
+ (players == null ? "" : ArgumentHelper.debugList("for", players)));
}
for (ObjectTag target : targets.objectForms) {
Expand Down Expand Up @@ -157,7 +165,7 @@ public void execute(final ScriptEntry scriptEntry) {
}
else {
final BukkitTagContext originalContext = (BukkitTagContext) scriptEntry.context.clone();
HashMap<UUID, Function<Player, String>> playerToFuncMap = customNames.get(bukkitEntity.getUniqueId());
HashMap<UUID, RenameData> playerToFuncMap = customNames.get(bukkitEntity.getUniqueId());
if (playerToFuncMap == null) {
playerToFuncMap = new HashMap<>();
customNames.put(bukkitEntity.getUniqueId(), playerToFuncMap);
Expand All @@ -166,12 +174,15 @@ public void execute(final ScriptEntry scriptEntry) {
originalContext.player = new PlayerTag(p);
return TagManager.tag(name.asString(), originalContext);
};
RenameData renamer = new RenameData();
renamer.nameFunction = nameGetter;
renamer.listOnly = listNameOnly != null && listNameOnly.asBoolean();
if (players == null) {
playerToFuncMap.put(null, nameGetter);
playerToFuncMap.put(null, renamer);
}
else {
for (PlayerTag player : players) {
playerToFuncMap.put(player.getOfflinePlayer().getUniqueId(), nameGetter);
playerToFuncMap.put(player.getOfflinePlayer().getUniqueId(), renamer);
}
}
if (players == null) {
Expand All @@ -195,6 +206,7 @@ public void execute(final ScriptEntry scriptEntry) {
}
if (scriptEntry.dbCallShouldDebug()) {
Debug.report(scriptEntry, getName(), ArgumentHelper.debugObj("name", nameString)
+ (listNameOnly != null ? listNameOnly.debug() : "")
+ targets.debug());
}
for (ObjectTag target : targets.objectForms) {
Expand Down Expand Up @@ -222,8 +234,13 @@ public void execute(final ScriptEntry scriptEntry) {
}
}
else if (entity instanceof PlayerTag) {
String limitedName = nameString.length() > 16 ? nameString.substring(0, 16) : nameString;
NMSHandler.getInstance().getProfileEditor().setPlayerName(((PlayerTag) entity).getPlayerEntity(), limitedName);
if (listNameOnly != null && listNameOnly.asBoolean()) {
((PlayerTag) entity).getPlayerEntity().setPlayerListName(nameString);
}
else {
String limitedName = nameString.length() > 16 ? nameString.substring(0, 16) : nameString;
NMSHandler.getInstance().getProfileEditor().setPlayerName(((PlayerTag) entity).getPlayerEntity(), limitedName);
}
}
else {
Entity bukkitEntity = entity.getDenizenEntity().getBukkitEntity();
Expand All @@ -234,19 +251,26 @@ else if (entity instanceof PlayerTag) {
}
}

public static HashMap<UUID, HashMap<UUID, Function<Player, String>>> customNames = new HashMap<>();
public static HashMap<UUID, HashMap<UUID, RenameData>> customNames = new HashMap<>();

public static class RenameData {

public Function<Player, String> nameFunction;

public boolean listOnly;
}

public static boolean hasAnyDynamicRenames() {
return !customNames.isEmpty();
}

public static void addDynamicRename(Entity bukkitEntity, Player forPlayer, Function<Player, String> getterFunction) {
HashMap<UUID, Function<Player, String>> playerToFuncMap = customNames.get(bukkitEntity.getUniqueId());
public static void addDynamicRename(Entity bukkitEntity, Player forPlayer, RenameData rename) {
HashMap<UUID, RenameData> playerToFuncMap = customNames.get(bukkitEntity.getUniqueId());
if (playerToFuncMap == null) {
playerToFuncMap = new HashMap<>();
customNames.put(bukkitEntity.getUniqueId(), playerToFuncMap);
}
playerToFuncMap.put(forPlayer == null ? null : forPlayer.getUniqueId(), getterFunction);
playerToFuncMap.put(forPlayer == null ? null : forPlayer.getUniqueId(), rename);
if (forPlayer == null) {
for (Player player : NMSHandler.getEntityHelper().getPlayersThatSee(bukkitEntity)) {
NMSHandler.getPacketHelper().sendRename(player, bukkitEntity, "");
Expand All @@ -257,18 +281,18 @@ public static void addDynamicRename(Entity bukkitEntity, Player forPlayer, Funct
}
}

public static String getCustomNameFor(UUID entityId, Player player) {
HashMap<UUID, Function<Player, String>> map = customNames.get(entityId);
public static String getCustomNameFor(UUID entityId, Player player, boolean isForList) {
HashMap<UUID, RenameData> map = customNames.get(entityId);
if (map == null) {
return null;
}
Function<Player, String> func = map.get(player.getUniqueId());
if (func == null) {
func = map.get(null);
if (func == null) {
RenameData rename = map.get(player.getUniqueId());
if (rename == null || (rename.listOnly && !isForList)) {
rename = map.get(null);
if (rename == null || (rename.listOnly && !isForList)) {
return null;
}
}
return func.apply(player);
return rename.nameFunction.apply(player);
}
}
Expand Up @@ -173,7 +173,7 @@ public void processCustomNameForPacket(Packet<?> packet) {
if (ent == null) {
return; // If it doesn't exist on-server, it's definitely not relevant, so move on
}
String nameToApply = RenameCommand.getCustomNameFor(ent.getUniqueID(), player.getBukkitEntity());
String nameToApply = RenameCommand.getCustomNameFor(ent.getUniqueID(), player.getBukkitEntity(), false);
if (nameToApply == null) {
return;
}
Expand Down
Expand Up @@ -173,7 +173,7 @@ public void processCustomNameForPacket(Packet<?> packet) {
if (ent == null) {
return; // If it doesn't exist on-server, it's definitely not relevant, so move on
}
String nameToApply = RenameCommand.getCustomNameFor(ent.getUniqueID(), player.getBukkitEntity());
String nameToApply = RenameCommand.getCustomNameFor(ent.getUniqueID(), player.getBukkitEntity(), false);
if (nameToApply == null) {
return;
}
Expand Down
Expand Up @@ -2,7 +2,9 @@

import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.nms.v1_16.impl.SidebarImpl;
import com.denizenscript.denizen.objects.EntityTag;
import com.denizenscript.denizen.utilities.Utilities;
import com.denizenscript.denizen.utilities.depends.Depends;
import com.denizenscript.denizencore.utilities.ReflectionHelper;
import com.denizenscript.denizen.nms.v1_16.Handler;
import com.denizenscript.denizen.nms.v1_16.impl.jnbt.CompoundTagImpl;
Expand Down Expand Up @@ -33,6 +35,7 @@
import org.bukkit.inventory.ItemStack;

import java.lang.invoke.MethodHandle;
import java.lang.reflect.Field;
import java.util.*;

public class PacketHelperImpl implements PacketHelper {
Expand Down Expand Up @@ -277,11 +280,26 @@ public void forceSpectate(Player player, Entity entity) {
}
}

public static Field ENTITY_TRACKER_ENTRY_GETTER = ReflectionHelper.getFields(PlayerChunkMap.EntityTracker.class).get("trackerEntry");

@Override
public void sendRename(Player player, Entity entity, String name) {
try {
if (entity.getType() == EntityType.PLAYER) {
// TODO: player rename somehow
if (entity.getType() == EntityType.PLAYER) { // For player entities, force a respawn packet and let the dynamic intercept correct the details
PlayerChunkMap tracker = ((WorldServer) ((CraftEntity) entity).getHandle().world).getChunkProvider().playerChunkMap;
PlayerChunkMap.EntityTracker entityTracker = tracker.trackedEntities.get(entity.getEntityId());
if (entityTracker != null) {
try {
EntityTrackerEntry entry = (EntityTrackerEntry) ENTITY_TRACKER_ENTRY_GETTER.get(entityTracker);
if (entry != null) {
entry.a(((CraftPlayer) player).getHandle());
entry.b(((CraftPlayer) player).getHandle());
}
}
catch (Throwable ex) {
Debug.echoError(ex);
}
}
return;
}
PacketPlayOutEntityMetadata packet = new PacketPlayOutEntityMetadata();
Expand Down
@@ -1,16 +1,19 @@
package com.denizenscript.denizen.nms.v1_16.impl;

import com.denizenscript.denizen.nms.abstracts.ProfileEditor;
import com.denizenscript.denizen.nms.v1_16.Handler;
import com.denizenscript.denizen.nms.v1_16.helpers.PacketHelperImpl;
import com.denizenscript.denizen.nms.v1_16.impl.network.handlers.DenizenNetworkManagerImpl;
import com.denizenscript.denizen.scripts.commands.entity.RenameCommand;
import com.denizenscript.denizen.utilities.FormattedTextHelper;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import com.denizenscript.denizen.nms.NMSHandler;
import com.denizenscript.denizen.nms.util.PlayerProfile;
import com.denizenscript.denizencore.utilities.ReflectionHelper;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.debugging.Debug;
import net.md_5.bungee.api.ChatColor;
import net.minecraft.server.v1_16_R3.*;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_16_R3.CraftServer;
Expand Down Expand Up @@ -90,17 +93,19 @@ public static boolean handleAlteredProfiles(PacketPlayOutPlayerInfo packet, Deni
manager.oldManager.sendPacket(newPacket);
}
else {
String rename = RenameCommand.getCustomNameFor(gameProfile.getId(), manager.player.getBukkitEntity());
String rename = RenameCommand.getCustomNameFor(gameProfile.getId(), manager.player.getBukkitEntity(), false);
PacketPlayOutPlayerInfo newPacket = new PacketPlayOutPlayerInfo(PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER);
List newPacketDataList = ReflectionHelper.getFieldValue(PacketPlayOutPlayerInfo.class, "b", newPacket);
GameProfile patchedProfile = new GameProfile(gameProfile.getId(), rename != null ? rename : gameProfile.getName());
GameProfile patchedProfile = new GameProfile(gameProfile.getId(), rename != null ? (rename.length() > 16 ? rename.substring(0, 16) : rename) : gameProfile.getName());
if (ProfileEditor.mirrorUUIDs.contains(gameProfile.getId())) {
patchedProfile.getProperties().putAll(ownProfile.getProperties());
}
else {
patchedProfile.getProperties().putAll(gameProfile.getProperties());
}
Object newData = playerInfoData_construct.newInstance(newPacket, patchedProfile, playerInfoData_latency.getInt(data), playerInfoData_gamemode.get(data), playerInfoData_displayName.get(data));
String listRename = RenameCommand.getCustomNameFor(gameProfile.getId(), manager.player.getBukkitEntity(), true);
IChatBaseComponent displayName = listRename != null ? Handler.componentToNMS(FormattedTextHelper.parse(listRename, ChatColor.WHITE)) : (IChatBaseComponent) playerInfoData_displayName.get(data);
Object newData = playerInfoData_construct.newInstance(newPacket, patchedProfile, playerInfoData_latency.getInt(data), playerInfoData_gamemode.get(data), displayName);
newPacketDataList.add(newData);
manager.oldManager.sendPacket(newPacket);
}
Expand Down
Expand Up @@ -292,7 +292,7 @@ public void processCustomNameForPacket(Packet<?> packet) {
if (ent == null) {
return; // If it doesn't exist on-server, it's definitely not relevant, so move on
}
String nameToApply = RenameCommand.getCustomNameFor(ent.getUniqueID(), player.getBukkitEntity());
String nameToApply = RenameCommand.getCustomNameFor(ent.getUniqueID(), player.getBukkitEntity(), false);
if (nameToApply == null) {
return;
}
Expand Down

0 comments on commit fe7beeb

Please sign in to comment.