Skip to content

Commit

Permalink
rename per_player for:playerlist
Browse files Browse the repository at this point in the history
  • Loading branch information
mcmonkey4eva committed Jul 13, 2020
1 parent 3c1f003 commit 70aaf5f
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 27 deletions.
Expand Up @@ -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 [<name>] (t:<entity>|...) (per_player)");
setRequiredArguments(1, 3);
setSyntax("rename [<name>] (t:<entity>|...) (per_player) (for:<player>|...)");
setRequiredArguments(1, 4);
setParseArgs(false);
isProcedural = false;
}

// <--[command]
// @Name Rename
// @Syntax rename [<name>] (t:<entity>|...) (per_player)
// @Syntax rename [<name>] (t:<entity>|...) (per_player) (for:<player>|...)
// @Required 1
// @Maximum 3
// @Maximum 4
// @Plugin Citizens
// @Short Renames the linked NPC or list of entities.
// @Group npc
Expand All @@ -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 <player.name> 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
// <NPCTag.name>
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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<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());
+ perPlayer.debug()
+ (players == null ? "" : ArgumentHelper.debugList("for", players)));
}
for (ObjectTag target : targets.objectForms) {
EntityTag entity = target.asType(EntityTag.class, CoreUtilities.noDebugContext);
Expand All @@ -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 {
Expand All @@ -138,12 +154,32 @@ public void execute(final ScriptEntry scriptEntry) {
}
else {
final BukkitTagContext originalContext = (BukkitTagContext) scriptEntry.context.clone();
customNames.put(bukkitEntity.getEntityId(), p -> {
HashMap<UUID, Function<Player, String>> playerToFuncMap = customNames.get(bukkitEntity.getEntityId());
if (playerToFuncMap == null) {
playerToFuncMap = new HashMap<>();
customNames.put(bukkitEntity.getEntityId(), playerToFuncMap);
}
Function<Player, String> 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, "");
}
}
}
}
Expand Down Expand Up @@ -191,13 +227,24 @@ else if (entity instanceof PlayerTag) {
}
}

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

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

public static Function<Player, String> getCustomNameFor(int eid) {
return customNames.get(eid);
public static String getCustomNameFor(int eid, Player player) {
HashMap<UUID, Function<Player, String>> map = customNames.get(eid);
if (map == null) {
return null;
}
Function<Player, String> func = map.get(player.getUniqueId());
if (func == null) {
func = map.get(null);
if (func == null) {
return null;
}
}
return func.apply(player);
}
}
Expand Up @@ -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 {

Expand Down Expand Up @@ -170,11 +169,10 @@ public void processCustomNameForPacket(Packet<?> packet) {
PacketPlayOutEntityMetadata metadataPacket = (PacketPlayOutEntityMetadata) packet;
try {
int eid = ENTITY_METADATA_EID.getInt(metadataPacket);
Function<Player, String> 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<DataWatcher.Item<?>> data = (List<DataWatcher.Item<?>>) ENTITY_METADATA_LIST.get(metadataPacket);
for (DataWatcher.Item item : data) {
DataWatcherObject<?> watcherObject = item.a();
Expand Down
Expand Up @@ -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 {

Expand Down Expand Up @@ -170,11 +169,10 @@ public void processCustomNameForPacket(Packet<?> packet) {
PacketPlayOutEntityMetadata metadataPacket = (PacketPlayOutEntityMetadata) packet;
try {
int eid = ENTITY_METADATA_EID.getInt(metadataPacket);
Function<Player, String> 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<DataWatcher.Item<?>> data = (List<DataWatcher.Item<?>>) ENTITY_METADATA_LIST.get(metadataPacket);
for (DataWatcher.Item item : data) {
DataWatcherObject<?> watcherObject = item.a();
Expand Down
Expand Up @@ -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 {

Expand Down Expand Up @@ -174,11 +173,10 @@ public void processCustomNameForPacket(Packet<?> packet) {
PacketPlayOutEntityMetadata metadataPacket = (PacketPlayOutEntityMetadata) packet;
try {
int eid = ENTITY_METADATA_EID.getInt(metadataPacket);
Function<Player, String> 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<DataWatcher.Item<?>> data = (List<DataWatcher.Item<?>>) ENTITY_METADATA_LIST.get(metadataPacket);
for (DataWatcher.Item item : data) {
DataWatcherObject<?> watcherObject = item.a();
Expand Down

0 comments on commit 70aaf5f

Please sign in to comment.