aboutsummaryrefslogtreecommitdiffstats
path: root/bukkit/src
diff options
context:
space:
mode:
authorKrakenied <krakenied1@gmail.com>2025-03-02 06:24:23 +0100
committerKrakenied <46192742+Krakenied@users.noreply.github.com>2025-05-13 20:34:15 +0200
commit0b6b06840c4779e27536e0efe7908a29ffe6d506 (patch)
tree1616da90ce86d5d3d8d9e4d8af2af3b07fb5d094 /bukkit/src
parent46f04a594727a6cd6f83f49f50a4ea8ecb603cc9 (diff)
Full QuestController placeholder support
Diffstat (limited to 'bukkit/src')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java47
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/papi/PlaceholderAPIHook.java4
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java79
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) {