From c7af9f82063080506a798a5b95fc4c34b56cc6a6 Mon Sep 17 00:00:00 2001 From: fullwall Date: Sun, 26 Feb 2023 15:50:37 +0800 Subject: [PATCH] Add placeholders api --- .../java/net/citizensnpcs/api/npc/NPC.java | 2 +- .../citizensnpcs/api/util/Placeholders.java | 42 ++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/citizensnpcs/api/npc/NPC.java b/src/main/java/net/citizensnpcs/api/npc/NPC.java index 897fc7ec..3b67fffd 100644 --- a/src/main/java/net/citizensnpcs/api/npc/NPC.java +++ b/src/main/java/net/citizensnpcs/api/npc/NPC.java @@ -470,11 +470,11 @@ public enum Metadata { * The Minecart item data. Byte. */ MINECART_ITEM_DATA("minecart-item-data"), + /** * The Minecart item offset as defined by Minecraft. {@link Minecart#setDisplayBlockOffset(int)} */ MINECART_OFFSET("minecart-item-offset"), - /** * Whether the NPC's nameplate should be visible. Boolean. */ diff --git a/src/main/java/net/citizensnpcs/api/util/Placeholders.java b/src/main/java/net/citizensnpcs/api/util/Placeholders.java index f9e968a6..806ef2e9 100644 --- a/src/main/java/net/citizensnpcs/api/util/Placeholders.java +++ b/src/main/java/net/citizensnpcs/api/util/Placeholders.java @@ -12,6 +12,8 @@ import org.bukkit.command.BlockCommandSender; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; @@ -19,14 +21,41 @@ import me.clip.placeholderapi.PlaceholderAPI; import net.citizensnpcs.api.CitizensAPI; +import net.citizensnpcs.api.event.CitizensDisableEvent; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.trait.trait.Owner; -public class Placeholders { +public class Placeholders implements Listener { + public static interface PlaceholderFunction { + public String apply(NPC npc, CommandSender sender, String input); + } + + private static class PlaceholderProvider { + PlaceholderFunction func; + Pattern regex; + + PlaceholderProvider(Pattern regex, PlaceholderFunction func) { + this.regex = regex; + this.func = func; + } + } + private static OfflinePlayer getPlayer(BlockCommandSender sender) { return CitizensAPI.getNMSHelper().getPlayer(sender); } + @EventHandler + private static void onCitizensDisable(CitizensDisableEvent event) { + PLACEHOLDERS.clear(); + } + + public static void registerNPCPlaceholder(Pattern regex, PlaceholderFunction func) { + if (regex.pattern().charAt(0) != '<') { + regex = Pattern.compile('<' + regex.pattern() + '>', regex.flags()); + } + PLACEHOLDERS.add(new PlaceholderProvider(regex, func)); + } + public static String replace(String text, CommandSender sender, NPC npc) { text = replace(text, sender instanceof OfflinePlayer ? (OfflinePlayer) sender : sender instanceof BlockCommandSender ? getPlayer((BlockCommandSender) sender) : null); @@ -49,6 +78,16 @@ public static String replace(String text, CommandSender sender, NPC npc) { out.append(replacement); } matcher.appendTail(out); + for (PlaceholderProvider entry : PLACEHOLDERS) { + matcher = entry.regex.matcher(out.toString()); + out = new StringBuffer(); + while (matcher.find()) { + String group = matcher.group().substring(1, matcher.group().length() - 1); + matcher.appendReplacement(out, ""); + out.append(entry.func.apply(npc, sender, group)); + } + matcher.appendTail(out); + } return out.toString(); } @@ -130,6 +169,7 @@ private static String setPlaceholderAPIPlaceholders(String text, OfflinePlayer p private static final Pattern PLACEHOLDER_MATCHER = Pattern.compile("<(id|npc|owner)>"); private static boolean PLACEHOLDERAPI_ENABLED = true; + private static final List PLACEHOLDERS = Lists.newArrayList(); private static final Pattern PLAYER_PLACEHOLDER_MATCHER = Pattern.compile( "(|

|@p|%player%|||||)"); private static final String[] PLAYER_PLACEHOLDERS = { "", "

", "@p", "%player%" };