aboutsummaryrefslogtreecommitdiffstats
path: root/bukkit/src/main/java/com/leonardobishop
diff options
context:
space:
mode:
authorKrakenied <krakenied1@gmail.com>2024-11-15 16:48:34 +0100
committerKrakenied <46192742+Krakenied@users.noreply.github.com>2024-11-16 02:03:02 +0100
commit1e9618d6e5855eebaf46bb15a82a169bc8ed511c (patch)
treee3f76b434f56c3d97da0e55459c123d28fd5738c /bukkit/src/main/java/com/leonardobishop
parent102ed9a46f8ab07262a9b50419809e401dd9828b (diff)
Add placeholder support to vaultreward option
Diffstat (limited to 'bukkit/src/main/java/com/leonardobishop')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java2
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/DummyVaultReward.java24
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/NumericVaultReward.java21
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/PlaceholderVaultReward.java39
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/VaultReward.java46
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java16
6 files changed, 143 insertions, 5 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java
index 50fcf8f9..660f3eed 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java
@@ -276,7 +276,7 @@ public class BukkitQuestsLoader implements QuestsLoader {
List<String> startCommands = config.getStringList("startcommands");
List<String> cancelCommands = config.getStringList("cancelcommands");
List<String> expiryCommands = config.getStringList("expirycommands");
- double vaultReward = config.getDouble("vaultreward", 0.0D);
+ String vaultReward = config.getString("vaultreward", null);
boolean repeatable = config.getBoolean("options.repeatable", false);
boolean cooldown = config.getBoolean("options.cooldown.enabled", false);
boolean timeLimit = config.getBoolean("options.time-limit.enabled", false);
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/DummyVaultReward.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/DummyVaultReward.java
new file mode 100644
index 00000000..93c644b7
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/DummyVaultReward.java
@@ -0,0 +1,24 @@
+package com.leonardobishop.quests.bukkit.hook.vault.rewards;
+
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+final class DummyVaultReward extends VaultReward {
+
+ static final DummyVaultReward INSTANCE = new DummyVaultReward();
+
+ DummyVaultReward() {
+ // temporarily ignore it
+ //noinspection DataFlowIssue
+ super(null);
+ }
+
+ @Override
+ public double getRewardValue(final @NotNull Player player) {
+ return 0.0d;
+ }
+
+ @Override
+ public void give(final @NotNull Player player) {
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/NumericVaultReward.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/NumericVaultReward.java
new file mode 100644
index 00000000..2b1ed151
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/NumericVaultReward.java
@@ -0,0 +1,21 @@
+package com.leonardobishop.quests.bukkit.hook.vault.rewards;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+final class NumericVaultReward extends VaultReward {
+
+ private final double value;
+
+ NumericVaultReward(final @NotNull BukkitQuestsPlugin plugin, final double value) {
+ super(plugin);
+
+ this.value = value;
+ }
+
+ @Override
+ public double getRewardValue(final @NotNull Player player) {
+ return this.value;
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/PlaceholderVaultReward.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/PlaceholderVaultReward.java
new file mode 100644
index 00000000..93e2a6b2
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/PlaceholderVaultReward.java
@@ -0,0 +1,39 @@
+package com.leonardobishop.quests.bukkit.hook.vault.rewards;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.hook.papi.AbstractPlaceholderAPIHook;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+final class PlaceholderVaultReward extends VaultReward {
+
+ private final String rewardString;
+
+ PlaceholderVaultReward(final @NotNull BukkitQuestsPlugin plugin, final @NotNull String rewardString) {
+ super(plugin);
+
+ this.rewardString = rewardString;
+ }
+
+ @Override
+ public double getRewardValue(final @NotNull Player player) {
+ final AbstractPlaceholderAPIHook hook = this.plugin.getPlaceholderAPIHook();
+
+ if (hook == null) {
+ this.plugin.getLogger().warning("Could not give '" + this.rewardString + "' vault reward to " + player.getName() + ". No PlaceholderAPI hook found!");
+ return 0.0d;
+ }
+
+ final String papiRewardString = this.plugin.getPlaceholderAPIHook().replacePlaceholders(player, this.rewardString);
+
+ final double vaultReward;
+ try {
+ vaultReward = Double.parseDouble(papiRewardString);
+ } catch (final NumberFormatException e) {
+ this.plugin.getLogger().warning("Could not give '" + this.rewardString + "' (PAPI: '" + papiRewardString + "') vault reward to " + player.getName() + ". Invalid double format!");
+ return 0.0d;
+ }
+
+ return vaultReward;
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/VaultReward.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/VaultReward.java
new file mode 100644
index 00000000..158d026f
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/VaultReward.java
@@ -0,0 +1,46 @@
+package com.leonardobishop.quests.bukkit.hook.vault.rewards;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public abstract class VaultReward {
+
+ final BukkitQuestsPlugin plugin;
+
+ VaultReward(final @NotNull BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ public abstract double getRewardValue(final @NotNull Player player);
+
+ public void give(final @NotNull Player player) {
+ this.plugin.getVaultHook().depositPlayer(player, this.getRewardValue(player));
+ }
+
+ public static @NotNull VaultReward parse(final @NotNull BukkitQuestsPlugin plugin, final @Nullable String str) {
+ if (str == null) {
+ return DummyVaultReward.INSTANCE;
+ }
+
+ if (str.indexOf('%') == -1) {
+ return parseNumeric(plugin, str);
+ }
+
+ return new PlaceholderVaultReward(plugin, str);
+ }
+
+ private static @NotNull VaultReward parseNumeric(final @NotNull BukkitQuestsPlugin plugin, final @NotNull String str) {
+ final double value;
+
+ try {
+ value = Double.parseDouble(str);
+ } catch (final NumberFormatException e) {
+ plugin.getLogger().warning("Could not parse '" + str + "' vault reward. Invalid double format!");
+ return DummyVaultReward.INSTANCE;
+ }
+
+ return new NumericVaultReward(plugin, value);
+ }
+}
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 af2a316d..04ef14b4 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
@@ -9,6 +9,7 @@ import com.leonardobishop.quests.bukkit.api.event.PlayerStartTrackQuestEvent;
import com.leonardobishop.quests.bukkit.api.event.PlayerStopTrackQuestEvent;
import com.leonardobishop.quests.bukkit.api.event.PreStartQuestEvent;
import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig;
+import com.leonardobishop.quests.bukkit.hook.vault.rewards.VaultReward;
import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStack;
import com.leonardobishop.quests.bukkit.util.FormatUtils;
import com.leonardobishop.quests.bukkit.util.Messages;
@@ -29,8 +30,10 @@ import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.Set;
+import java.util.WeakHashMap;
import java.util.concurrent.TimeUnit;
public class NormalQuestController implements QuestController {
@@ -39,6 +42,7 @@ public class NormalQuestController implements QuestController {
private final BukkitQuestsConfig config;
private final List<Quest> autoStartQuestCache;
+ private final Map<Quest, VaultReward> vaultRewardCache;
public NormalQuestController(BukkitQuestsPlugin plugin) {
this.plugin = plugin;
@@ -49,6 +53,8 @@ public class NormalQuestController implements QuestController {
if (quest.isAutoStartEnabled()) autoStartQuestCache.add(quest);
}
this.autoStartQuestCache = autoStartQuestCache;
+
+ this.vaultRewardCache = new WeakHashMap<>();
}
@Override
@@ -235,10 +241,12 @@ public class NormalQuestController implements QuestController {
Bukkit.getPluginManager().callEvent(questFinishEvent);
// PlayerFinishQuestEvent -- end
plugin.getScheduler().doSync(() -> {
- final double vaultReward = quest.getVaultReward();
- if (vaultReward > 0.0D) {
- this.plugin.getVaultHook().depositPlayer(player, vaultReward);
- }
+ final VaultReward vaultReward = this.vaultRewardCache.computeIfAbsent(quest,
+ k -> VaultReward.parse(this.plugin, k.getVaultReward())
+ );
+
+ // Use cached reward to do not parse it every single time
+ vaultReward.give(player);
for (String s : quest.getRewards()) {
s = s.replace("{player}", player.getName());