diff --git a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/RenameCommand.java b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/RenameCommand.java index b1740c2523..829595254b 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/RenameCommand.java +++ b/plugin/src/main/java/com/denizenscript/denizen/scripts/commands/npc/RenameCommand.java @@ -25,23 +25,25 @@ import org.bukkit.entity.Player; import java.util.HashMap; +import java.util.List; +import java.util.UUID; import java.util.function.Function; public class RenameCommand extends AbstractCommand { public RenameCommand() { setName("rename"); - setSyntax("rename [] (t:|...) (per_player)"); - setRequiredArguments(1, 3); + setSyntax("rename [] (t:|...) (per_player) (for:|...)"); + setRequiredArguments(1, 4); setParseArgs(false); isProcedural = false; } // <--[command] // @Name Rename - // @Syntax rename [] (t:|...) (per_player) + // @Syntax rename [] (t:|...) (per_player) (for:|...) // @Required 1 - // @Maximum 3 + // @Maximum 4 // @Plugin Citizens // @Short Renames the linked NPC or list of entities. // @Group npc @@ -56,10 +58,11 @@ public RenameCommand() { // // Can rename a player to any name up to 16 characters. This will affect only the player's nameplate. // - // Optionally specify per_player to reprocess the input tags for each player when renaming a vanilla entity + // Optionally specify 'per_player' to reprocess the input tags for each player when renaming a vanilla entity // (meaning, if you use "- rename t:<[someent]> per_player", every player will see their own name on that entity). // A per_player rename will remain active until the entity is renamed again or the server is restarted. // Rename to "cancel" per_player to intentionally end a per_player rename. + // Optionally specify "for:" a list of players when using per_player. // // @Tags // @@ -87,6 +90,10 @@ public void parseArgs(ScriptEntry scriptEntry) throws InvalidArgumentsException && arg.matchesPrefix("t", "target", "targets")) { scriptEntry.addObject("targets", ListTag.getListFor(TagManager.tagObject(arg.getValue(), scriptEntry.getContext()), scriptEntry.getContext())); } + else if (!scriptEntry.hasObject("players") + && arg.matchesPrefix("for")) { + scriptEntry.addObject("players", ListTag.getListFor(TagManager.tagObject(arg.getValue(), scriptEntry.getContext()), scriptEntry.getContext()).filter(PlayerTag.class, scriptEntry)); + } else if (!scriptEntry.hasObject("per_player") && arg.matches("per_player")) { scriptEntry.addObject("per_player", new ElementTag(true)); @@ -114,11 +121,13 @@ public void execute(final ScriptEntry scriptEntry) { final ElementTag name = scriptEntry.getElement("name"); ElementTag perPlayer = scriptEntry.getElement("per_player"); ListTag targets = scriptEntry.getObjectTag("targets"); + List players = (List) scriptEntry.getObject("players"); if (perPlayer != null && perPlayer.asBoolean()) { if (scriptEntry.dbCallShouldDebug()) { Debug.report(scriptEntry, getName(), name.debug() + targets.debug() - + perPlayer.debug()); + + perPlayer.debug() + + (players == null ? "" : ArgumentHelper.debugList("for", players))); } for (ObjectTag target : targets.objectForms) { EntityTag entity = target.asType(EntityTag.class, CoreUtilities.noDebugContext); @@ -127,8 +136,15 @@ public void execute(final ScriptEntry scriptEntry) { if (name.asString().equals("cancel")) { customNames.remove(bukkitEntity.getEntityId()); if (bukkitEntity.isCustomNameVisible()) { - for (Player player : NMSHandler.getEntityHelper().getPlayersThatSee(bukkitEntity)) { - NMSHandler.getPacketHelper().sendRename(player, bukkitEntity, bukkitEntity.getCustomName()); + if (players == null) { + for (Player player : NMSHandler.getEntityHelper().getPlayersThatSee(bukkitEntity)) { + NMSHandler.getPacketHelper().sendRename(player, bukkitEntity, bukkitEntity.getCustomName()); + } + } + else { + for (PlayerTag player : players) { + NMSHandler.getPacketHelper().sendRename(player.getPlayerEntity(), bukkitEntity, bukkitEntity.getCustomName()); + } } } else { @@ -138,12 +154,32 @@ public void execute(final ScriptEntry scriptEntry) { } else { final BukkitTagContext originalContext = (BukkitTagContext) scriptEntry.context.clone(); - customNames.put(bukkitEntity.getEntityId(), p -> { + HashMap> playerToFuncMap = customNames.get(bukkitEntity.getEntityId()); + if (playerToFuncMap == null) { + playerToFuncMap = new HashMap<>(); + customNames.put(bukkitEntity.getEntityId(), playerToFuncMap); + } + Function nameGetter = p -> { originalContext.player = new PlayerTag(p); return TagManager.tag(name.asString(), originalContext); - }); - for (Player player : NMSHandler.getEntityHelper().getPlayersThatSee(bukkitEntity)) { - NMSHandler.getPacketHelper().sendRename(player, bukkitEntity, ""); + }; + if (players == null) { + playerToFuncMap.put(null, nameGetter); + } + else { + for (PlayerTag player : players) { + playerToFuncMap.put(player.getOfflinePlayer().getUniqueId(), nameGetter); + } + } + if (players == null) { + for (Player player : NMSHandler.getEntityHelper().getPlayersThatSee(bukkitEntity)) { + NMSHandler.getPacketHelper().sendRename(player, bukkitEntity, ""); + } + } + else { + for (PlayerTag player : players) { + NMSHandler.getPacketHelper().sendRename(player.getPlayerEntity(), bukkitEntity, ""); + } } } } @@ -191,13 +227,24 @@ else if (entity instanceof PlayerTag) { } } - public static HashMap> customNames = new HashMap<>(); + public static HashMap>> customNames = new HashMap<>(); public static boolean hasAnyDynamicRenames() { return !customNames.isEmpty(); } - public static Function getCustomNameFor(int eid) { - return customNames.get(eid); + public static String getCustomNameFor(int eid, Player player) { + HashMap> map = customNames.get(eid); + if (map == null) { + return null; + } + Function func = map.get(player.getUniqueId()); + if (func == null) { + func = map.get(null); + if (func == null) { + return null; + } + } + return func.apply(player); } } diff --git a/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/DenizenNetworkManagerImpl.java index a754482512..38fdf7f01e 100644 --- a/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_14/src/main/java/com/denizenscript/denizen/nms/v1_14/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -31,7 +31,6 @@ import java.net.SocketAddress; import java.util.List; import java.util.Optional; -import java.util.function.Function; public class DenizenNetworkManagerImpl extends NetworkManager { @@ -170,11 +169,10 @@ public void processCustomNameForPacket(Packet packet) { PacketPlayOutEntityMetadata metadataPacket = (PacketPlayOutEntityMetadata) packet; try { int eid = ENTITY_METADATA_EID.getInt(metadataPacket); - Function customNameFor = RenameCommand.getCustomNameFor(eid); - if (customNameFor == null) { + String nameToApply = RenameCommand.getCustomNameFor(eid, player.getBukkitEntity()); + if (nameToApply == null) { return; } - String nameToApply = customNameFor.apply(player.getBukkitEntity()); List> data = (List>) ENTITY_METADATA_LIST.get(metadataPacket); for (DataWatcher.Item item : data) { DataWatcherObject watcherObject = item.a(); diff --git a/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/impl/network/handlers/DenizenNetworkManagerImpl.java index 3183b3bfa9..89bce664bd 100644 --- a/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_15/src/main/java/com/denizenscript/denizen/nms/v1_15/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -31,7 +31,6 @@ import java.net.SocketAddress; import java.util.List; import java.util.Optional; -import java.util.function.Function; public class DenizenNetworkManagerImpl extends NetworkManager { @@ -170,11 +169,10 @@ public void processCustomNameForPacket(Packet packet) { PacketPlayOutEntityMetadata metadataPacket = (PacketPlayOutEntityMetadata) packet; try { int eid = ENTITY_METADATA_EID.getInt(metadataPacket); - Function customNameFor = RenameCommand.getCustomNameFor(eid); - if (customNameFor == null) { + String nameToApply = RenameCommand.getCustomNameFor(eid, player.getBukkitEntity()); + if (nameToApply == null) { return; } - String nameToApply = customNameFor.apply(player.getBukkitEntity()); List> data = (List>) ENTITY_METADATA_LIST.get(metadataPacket); for (DataWatcher.Item item : data) { DataWatcherObject watcherObject = item.a(); diff --git a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/handlers/DenizenNetworkManagerImpl.java b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/handlers/DenizenNetworkManagerImpl.java index cb4b3d3569..897fceab29 100644 --- a/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/handlers/DenizenNetworkManagerImpl.java +++ b/v1_16/src/main/java/com/denizenscript/denizen/nms/v1_16/impl/network/handlers/DenizenNetworkManagerImpl.java @@ -31,7 +31,6 @@ import java.net.SocketAddress; import java.util.List; import java.util.Optional; -import java.util.function.Function; public class DenizenNetworkManagerImpl extends NetworkManager { @@ -174,11 +173,10 @@ public void processCustomNameForPacket(Packet packet) { PacketPlayOutEntityMetadata metadataPacket = (PacketPlayOutEntityMetadata) packet; try { int eid = ENTITY_METADATA_EID.getInt(metadataPacket); - Function customNameFor = RenameCommand.getCustomNameFor(eid); - if (customNameFor == null) { + String nameToApply = RenameCommand.getCustomNameFor(eid, player.getBukkitEntity()); + if (nameToApply == null) { return; } - String nameToApply = customNameFor.apply(player.getBukkitEntity()); List> data = (List>) ENTITY_METADATA_LIST.get(metadataPacket); for (DataWatcher.Item item : data) { DataWatcherObject watcherObject = item.a();