From 1e9618d6e5855eebaf46bb15a82a169bc8ed511c Mon Sep 17 00:00:00 2001 From: Krakenied Date: Fri, 15 Nov 2024 16:48:34 +0100 Subject: Add placeholder support to vaultreward option --- .../quests/bukkit/config/BukkitQuestsLoader.java | 2 +- .../hook/vault/rewards/DummyVaultReward.java | 24 +++++++++++ .../hook/vault/rewards/NumericVaultReward.java | 21 ++++++++++ .../hook/vault/rewards/PlaceholderVaultReward.java | 39 ++++++++++++++++++ .../bukkit/hook/vault/rewards/VaultReward.java | 46 ++++++++++++++++++++++ .../questcontroller/NormalQuestController.java | 16 ++++++-- 6 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/DummyVaultReward.java create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/NumericVaultReward.java create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/PlaceholderVaultReward.java create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/rewards/VaultReward.java (limited to 'bukkit/src') 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 startCommands = config.getStringList("startcommands"); List cancelCommands = config.getStringList("cancelcommands"); List 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 autoStartQuestCache; + private final Map 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()); -- cgit v1.2.3-70-g09d2