diff options
| author | Krakenied <krakenied1@gmail.com> | 2025-03-02 06:24:23 +0100 |
|---|---|---|
| committer | Krakenied <46192742+Krakenied@users.noreply.github.com> | 2025-05-13 20:34:15 +0200 |
| commit | 0b6b06840c4779e27536e0efe7908a29ffe6d506 (patch) | |
| tree | 1616da90ce86d5d3d8d9e4d8af2af3b07fb5d094 /bukkit/src/main/java/com | |
| parent | 46f04a594727a6cd6f83f49f50a4ea8ecb603cc9 (diff) | |
Full QuestController placeholder support
Diffstat (limited to 'bukkit/src/main/java/com')
3 files changed, 77 insertions, 53 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java index a3bdf14d..ea3ff1a1 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java @@ -165,8 +165,10 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.NonNull; import java.io.File; import java.io.FileOutputStream; @@ -179,8 +181,10 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.WeakHashMap; import java.util.function.BiFunction; import java.util.logging.Level; +import java.util.regex.Pattern; public class BukkitQuestsPlugin extends JavaPlugin implements Quests { @@ -982,4 +986,47 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests { public boolean isPrimaryThread() { return Bukkit.isPrimaryThread(); } + + private final WeakHashMap<Player, Pattern> playerPatternMap = new WeakHashMap<>(); + + /** + * Applies {player} internal placeholder (using cache for patterns) and PAPI placeholders + * for the player while respecting the plugin config. + * + * @param type type of config option + * @param player the player to apply placeholders for + * @param str string to apply placeholders in + * @return string with all the placeholders applied + */ + @Contract(value = "_, _, null -> null; _, _, !null -> !null") + public @org.jspecify.annotations.Nullable String applyPlayerAndPAPI(final @NonNull PAPIType type, final @org.jspecify.annotations.Nullable Player player, @org.jspecify.annotations.Nullable String str) { + if (str == null) { + return null; + } + + // Handle internal {player} replacement + if (player != null) { + final Pattern pattern = this.playerPatternMap.computeIfAbsent(player, key -> Pattern.compile('{' + key.getName() + '}', Pattern.LITERAL)); + str = pattern.matcher(str).replaceAll(player.getName()); + } + + // Handle PlaceholderAPI placeholders + if (this.getConfig().getBoolean(type.configKey)) { + return this.placeholderAPIProcessor.apply(player, str); + } else { + return str; + } + } + + public enum PAPIType { + GUI("options.gui-use-placeholderapi"), + PROGRESS("options.progress-use-placeholderapi"), + QUESTS("options.quests-use-placeholderapi"); + + private final String configKey; + + PAPIType(final String configKey) { + this.configKey = configKey; + } + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java index c98a8517..afd298ac 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java @@ -13,6 +13,10 @@ public class PlaceholderAPIHook implements AbstractPlaceholderAPIHook { return null; } + if (text.indexOf('%') == -1) { + return text; + } + return PlaceholderAPI.setPlaceholders(player, text); } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java index 04ef14b4..2a0972ab 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java @@ -96,6 +96,7 @@ public class NormalQuestController implements QuestController { questResultMessage = Messages.QUEST_CATEGORY_QUEST_PERMISSION.getMessage(); break; } + questResultMessage = this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, questResultMessage); // PreStartQuestEvent -- start PreStartQuestEvent preStartQuestEvent = new PreStartQuestEvent(player, qPlayer, questResultMessage, code); Bukkit.getPluginManager().callEvent(preStartQuestEvent); @@ -123,29 +124,23 @@ public class NormalQuestController implements QuestController { QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest); String displayName = qItemStack.getName(); String displayNameStripped = Chat.legacyStrip(displayName); - String questStartMessage = Messages.QUEST_START.getMessage().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName); + String questStartMessage = this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.QUEST_START.getMessage().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName)); // PlayerStartQuestEvent -- start PlayerStartQuestEvent questStartEvent = new PlayerStartQuestEvent(player, qPlayer, questProgress, questStartMessage); Bukkit.getPluginManager().callEvent(questStartEvent); // PlayerStartQuestEvent -- end Messages.send(questStartEvent.getQuestStartMessage(), player); if (config.getBoolean("options.titles-enabled")) { - plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_START_TITLE.getMessageLegacyColor().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName), - Messages.TITLE_QUEST_START_SUBTITLE.getMessageLegacyColor().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName)); + this.plugin.getTitleHandle().sendTitle(player, + this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.TITLE_QUEST_START_TITLE.getMessageLegacyColor().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName)), + this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.TITLE_QUEST_START_SUBTITLE.getMessageLegacyColor().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName)) + ); } for (String s : quest.getStartCommands()) { - s = s.replace("{player}", player.getName()); - if (plugin.getConfig().getBoolean("options.quests-use-placeholderapi")) { - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), plugin.getPlaceholderAPIProcessor().apply(player, s)); - } else { - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s); - } + Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, s)); } for (String s : quest.getStartString()) { - if (plugin.getConfig().getBoolean("options.quests-use-placeholderapi")) { - s = plugin.getPlaceholderAPIProcessor().apply(player, s); - } - Chat.send(player, s, true); + Chat.send(player, this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, s), true); } SoundUtils.playSoundForPlayer(player, plugin.getQuestsConfig().getString("options.sounds.quest-start")); } @@ -235,7 +230,7 @@ public class NormalQuestController implements QuestController { QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest); String displayName = qItemStack.getName(); String displayNameStripped = Chat.legacyStrip(displayName); - String questFinishMessage = Messages.QUEST_COMPLETE.getMessage().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName); + String questFinishMessage = this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.QUEST_COMPLETE.getMessage().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName)); // PlayerFinishQuestEvent -- start PlayerFinishQuestEvent questFinishEvent = new PlayerFinishQuestEvent(player, qPlayer, questProgress, questFinishMessage); Bukkit.getPluginManager().callEvent(questFinishEvent); @@ -249,24 +244,18 @@ public class NormalQuestController implements QuestController { vaultReward.give(player); for (String s : quest.getRewards()) { - s = s.replace("{player}", player.getName()); - if (plugin.getConfig().getBoolean("options.quests-use-placeholderapi")) { - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), plugin.getPlaceholderAPIProcessor().apply(player, s)); - } else { - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s); - } + Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, s)); } }); Messages.send(questFinishEvent.getQuestFinishMessage(), player); if (config.getBoolean("options.titles-enabled")) { - plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessageLegacyColor().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName), - Messages.TITLE_QUEST_COMPLETE_SUBTITLE.getMessageLegacyColor().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName)); + this.plugin.getTitleHandle().sendTitle(player, + this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessageLegacyColor().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName)), + this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.TITLE_QUEST_COMPLETE_SUBTITLE.getMessageLegacyColor().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName)) + ); } for (String s : quest.getRewardString()) { - if (plugin.getConfig().getBoolean("options.quests-use-placeholderapi")) { - s = plugin.getPlaceholderAPIProcessor().apply(player, s); - } - player.sendMessage(Chat.legacyColor(s)); + Chat.send(player, this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, s), true); } SoundUtils.playSoundForPlayer(player, plugin.getQuestsConfig().getString("options.sounds.quest-complete")); } @@ -298,38 +287,30 @@ public class NormalQuestController implements QuestController { Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); if (!questProgress.isStarted()) { if (player != null) { - Messages.QUEST_CANCEL_NOTSTARTED.send(player); + Chat.send(player, this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.QUEST_CANCEL_NOTSTARTED.getMessage()), true); } return false; } if (!quest.isCancellable() || quest.isAutoStartEnabled() || config.getBoolean("options.quest-autostart")) { - Messages.QUEST_CANCEL_NOTCANCELLABLE.send(player); + Chat.send(player, this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.QUEST_CANCEL_NOTCANCELLABLE.getMessage()), true); return false; } - resetQuest(questProgress); + resetQuest(questProgress); if (player != null) { QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest); String displayName = qItemStack.getName(); String displayNameStripped = Chat.legacyStrip(displayName); - String questCancelMessage = Messages.QUEST_CANCEL.getMessage().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName); + String questCancelMessage = this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.QUEST_CANCEL.getMessage().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName)); // PlayerCancelQuestEvent -- start PlayerCancelQuestEvent questCancelEvent = new PlayerCancelQuestEvent(player, qPlayer, questProgress, questCancelMessage); Bukkit.getPluginManager().callEvent(questCancelEvent); // PlayerCancelQuestEvent -- end Messages.send(questCancelEvent.getQuestCancelMessage(), player); for (String s : quest.getCancelCommands()) { - s = s.replace("{player}", player.getName()); - if (plugin.getConfig().getBoolean("options.quests-use-placeholderapi")) { - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), plugin.getPlaceholderAPIProcessor().apply(player, s)); - } else { - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s); - } + Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, s)); } for (String s : quest.getCancelString()) { - if (plugin.getConfig().getBoolean("options.quests-use-placeholderapi")) { - s = plugin.getPlaceholderAPIProcessor().apply(player, s); - } - player.sendMessage(Chat.legacyColor(s)); + Chat.send(player, this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, s), true); } SoundUtils.playSoundForPlayer(player, plugin.getQuestsConfig().getString("options.sounds.quest-cancel")); } @@ -353,25 +334,17 @@ public class NormalQuestController implements QuestController { QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest); String displayName = qItemStack.getName(); String displayNameStripped = Chat.legacyStrip(displayName); - String questExpireMessage = Messages.QUEST_EXPIRE.getMessage().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName); + String questExpireMessage = this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.QUEST_EXPIRE.getMessage().replace("{quest}", displayNameStripped).replace("{questcolored}", displayName)); // PlayerCancelQuestEvent -- start PlayerExpireQuestEvent questCancelEvent = new PlayerExpireQuestEvent(player, qPlayer, questProgress, questExpireMessage); Bukkit.getPluginManager().callEvent(questCancelEvent); // PlayerCancelQuestEvent -- end Messages.send(questCancelEvent.getQuestExpireMessage(), player); for (String s : quest.getExpiryCommands()) { - s = s.replace("{player}", player.getName()); - if (plugin.getConfig().getBoolean("options.quests-use-placeholderapi")) { - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), plugin.getPlaceholderAPIProcessor().apply(player, s)); - } else { - Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s); - } + Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, s)); } for (String s : quest.getExpiryString()) { - if (plugin.getConfig().getBoolean("options.quests-use-placeholderapi")) { - s = plugin.getPlaceholderAPIProcessor().apply(player, s); - } - player.sendMessage(Chat.legacyColor(s)); + Chat.send(player, this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, s), true); } } if (config.getBoolean("options.allow-quest-track") @@ -409,7 +382,7 @@ public class NormalQuestController implements QuestController { final QItemStack item = this.plugin.getQItemStackRegistry().getQuestItemStack(trackedQuest); final String displayName = item.getName(); final String displayNameStripped = Chat.legacyStrip(displayName); - Messages.QUEST_TRACK_STOP.send(player, "{questcolored}", displayName, "{quest}", displayNameStripped); + Chat.send(player, this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.QUEST_TRACK_STOP.getMessage().replace("{questcolored}", displayName).replace("{quest}", displayNameStripped)), true); } // return and handle quest != null case @@ -426,7 +399,7 @@ public class NormalQuestController implements QuestController { final QItemStack item = this.plugin.getQItemStackRegistry().getQuestItemStack(quest); final String displayName = item.getName(); final String displayNameStripped = Chat.legacyStrip(displayName); - Messages.QUEST_TRACK.send(player, "{questcolored}", displayName, "{quest}", displayNameStripped); + Chat.send(player, this.plugin.applyPlayerAndPAPI(BukkitQuestsPlugin.PAPIType.QUESTS, player, Messages.QUEST_TRACK.getMessage().replace("{questcolored}", displayName).replace("{quest}", displayNameStripped)), true); } private Set<Quest> getStartedQuestsForPlayer(QPlayer qPlayer) { |
