From e16d38633cec8c32900a1fee882f9eabbc1fd44b Mon Sep 17 00:00:00 2001 From: Krakenied Date: Tue, 20 Aug 2024 20:04:52 +0200 Subject: Vault reward integration Closes https://github.com/LMBishop/Quests/issues/708 --- bukkit/build.gradle.kts | 4 +- .../quests/bukkit/BukkitQuestsPlugin.java | 10 +++ .../bukkit/command/AdminInfoCommandHandler.java | 1 + .../quests/bukkit/config/BukkitQuestsLoader.java | 2 + .../bukkit/hook/vault/AbstractVaultHook.java | 9 +++ .../quests/bukkit/hook/vault/VaultHook.java | 76 ++++++++++++++++++++++ .../questcontroller/NormalQuestController.java | 5 ++ bukkit/src/main/resources/plugin.yml | 1 + .../leonardobishop/quests/common/quest/Quest.java | 18 +++++ docs/configuration/creating-a-quest.md | 12 ++++ 10 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/AbstractVaultHook.java create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/VaultHook.java diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts index 71470226..b57dd564 100644 --- a/bukkit/build.gradle.kts +++ b/bukkit/build.gradle.kts @@ -37,7 +37,7 @@ repositories { maven("https://repo.oraxen.com/releases") // PlaceholderAPI maven("https://repo.extendedclip.com/content/repositories/dev/") - // CustomFishing, ItemsAdder, SCore, ShopGUIPlus, Slimefun4 + // CustomFishing, ItemsAdder, SCore, ShopGUIPlus, Slimefun4, Vault maven("https://jitpack.io/") // PlayerPoints maven("https://repo.rosewooddev.io/repository/public/") @@ -114,6 +114,8 @@ dependencies { compileOnlyPlugin("com.bgsoftware:SuperiorSkyblockAPI:2022.9") // uSkyBlock TODO fix whenever repo is up //compileOnlyPlugin("ovh.uskyblock:uSkyBlock-API:2.8.9") + // Vault + compileOnlyPlugin("com.github.MilkBowl:VaultAPI:1.7.1") // VotingPlugin compileOnlyPlugin("com.bencodez:votingplugin:6.15") // WildStacker 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 fa89c30c..759f1104 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java @@ -34,6 +34,8 @@ import com.leonardobishop.quests.bukkit.hook.title.QuestsTitle; import com.leonardobishop.quests.bukkit.hook.title.Title_Bukkit; import com.leonardobishop.quests.bukkit.hook.title.Title_BukkitNoTimings; import com.leonardobishop.quests.bukkit.hook.title.Title_Nothing; +import com.leonardobishop.quests.bukkit.hook.vault.AbstractVaultHook; +import com.leonardobishop.quests.bukkit.hook.vault.VaultHook; import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler; import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler11; import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler16; @@ -199,6 +201,7 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests { private AbstractCoreProtectHook coreProtectHook; private AbstractEssentialsHook essentialsHook; private AbstractPlayerBlockTrackerHook playerBlockTrackerHook; + private AbstractVaultHook vaultHook; private AbstractWildStackerHook wildStackerHook; private ItemGetter itemGetter; private SkullGetter skullGetter; @@ -418,6 +421,9 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests { } catch (ClassCastException | ClassNotFoundException | NoSuchMethodException ignored) { } + // Plugin checks are handled in the hook class + this.vaultHook = new VaultHook(this); + if (CompatUtils.isPluginEnabled("WildStacker")) { this.wildStackerHook = new WildStackerHook(); } @@ -886,6 +892,10 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests { return playerBlockTrackerHook; } + public @NotNull AbstractVaultHook getVaultHook() { + return this.vaultHook; + } + public @Nullable AbstractWildStackerHook getWildStackerHook() { return wildStackerHook; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminInfoCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminInfoCommandHandler.java index b807035e..9392b7f2 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminInfoCommandHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminInfoCommandHandler.java @@ -61,6 +61,7 @@ public class AdminInfoCommandHandler implements CommandHandler { for (String s : quest.getRewards()) { sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s); } + sender.sendMessage(ChatColor.RED + "Vault reward: " + ChatColor.GRAY + quest.getVaultReward()); sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Quest options"); sender.sendMessage(ChatColor.RED + "Category: " + ChatColor.GRAY + quest.getCategoryId()); sender.sendMessage(ChatColor.RED + "Repeatable: " + ChatColor.GRAY + quest.isRepeatable()); 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 086569fb..50fcf8f9 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,6 +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); boolean repeatable = config.getBoolean("options.repeatable", false); boolean cooldown = config.getBoolean("options.cooldown.enabled", false); boolean timeLimit = config.getBoolean("options.time-limit.enabled", false); @@ -310,6 +311,7 @@ public class BukkitQuestsLoader implements QuestsLoader { .withStartCommands(startCommands) .withCancelCommands(cancelCommands) .withExpiryCommands(expiryCommands) + .withVaultReward(vaultReward) .withPlaceholders(placeholders) .withProgressPlaceholders(progressPlaceholders) .withCooldown(cooldownTime) diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/AbstractVaultHook.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/AbstractVaultHook.java new file mode 100644 index 00000000..86cfd945 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/AbstractVaultHook.java @@ -0,0 +1,9 @@ +package com.leonardobishop.quests.bukkit.hook.vault; + +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; + +public interface AbstractVaultHook { + + void depositPlayer(final @NotNull OfflinePlayer player, final double amount); +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/VaultHook.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/VaultHook.java new file mode 100644 index 00000000..7d3e648b --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/vault/VaultHook.java @@ -0,0 +1,76 @@ +package com.leonardobishop.quests.bukkit.hook.vault; + +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import net.milkbowl.vault.economy.Economy; +import net.milkbowl.vault.economy.EconomyResponse; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; + +public final class VaultHook implements AbstractVaultHook { + + private final BukkitQuestsPlugin plugin; + private Economy economy = null; + + public VaultHook(final @NotNull BukkitQuestsPlugin plugin) { + this.plugin = plugin; + + try { + Class.forName("net.milkbowl.vault.economy.Economy"); + } catch (final ClassNotFoundException e) { + return; + } + + final Plugin vaultPlugin = Bukkit.getServer() + .getPluginManager() + .getPlugin("Vault"); + if (vaultPlugin == null) { + return; + } + + final RegisteredServiceProvider esp = Bukkit.getServer() + .getServicesManager() + .getRegistration(Economy.class); + if (esp == null) { + return; + } + + this.economy = esp.getProvider(); + + // Log that we hooked successfully + this.plugin.getLogger().info("Successfully hooked into " + esp.getPlugin().getName() + " economy."); + } + + @Override + public void depositPlayer(final @NotNull OfflinePlayer player, final double amount) { + if (amount <= 0) { + this.plugin.getQuestsLogger().debug("Tried to deposit Vault reward of " + amount + " to " + + player.getName() + " account, however the amount was not a positive number."); + return; + } + + if (this.economy == null) { + this.plugin.getQuestsLogger().debug("Tried to deposit Vault reward of " + amount + " to " + + player.getName() + " account, however the economy could not be found."); + return; + } + + final EconomyResponse response = this.economy.depositPlayer(player, amount); + this.plugin.getQuestsLogger().debug("Deposited Vault reward of " + amount + " to " + + player.getName() + " account. Response: " + this.responseToString(response) + "."); + } + + @Contract(pure = true) + private @NotNull String responseToString(final @NotNull EconomyResponse response) { + return "EconomyResponse{" + + "amount=" + response.amount + + ", balance=" + response.balance + + ", type=" + response.type.name() + + ", errorMessage='" + + response.errorMessage + + "'}"; + } +} 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 0fcc1fc2..af2a316d 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 @@ -235,6 +235,11 @@ 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); + } + for (String s : quest.getRewards()) { s = s.replace("{player}", player.getName()); if (plugin.getConfig().getBoolean("options.quests-use-placeholderapi")) { diff --git a/bukkit/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml index 8e1db3ba..43ff65f8 100644 --- a/bukkit/src/main/resources/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -29,6 +29,7 @@ softdepend: - ShopGUIPlus - SuperiorSkyblock2 - uSkyBlock +- Vault - Votifier - VotingPlugin - WildStacker diff --git a/common/src/main/java/com/leonardobishop/quests/common/quest/Quest.java b/common/src/main/java/com/leonardobishop/quests/common/quest/Quest.java index a3cc26f9..3194b504 100644 --- a/common/src/main/java/com/leonardobishop/quests/common/quest/Quest.java +++ b/common/src/main/java/com/leonardobishop/quests/common/quest/Quest.java @@ -25,6 +25,7 @@ public class Quest implements Comparable { private List startCommands; private List cancelCommands; private List expiryCommands; + private double vaultReward; private boolean repeatEnabled; private boolean cooldownEnabled; private int cooldown; @@ -205,6 +206,16 @@ public class Quest implements Comparable { return Collections.unmodifiableList(expiryCommands); } + /** + * Get the Vault reward for this quest. + * The Vault reward is an amount of Vault economy money to be given upon completing the quest. + * + * @return double + */ + public double getVaultReward() { + return this.vaultReward; + } + /** * Get if this quest can be repeated after completion. * @@ -342,6 +353,7 @@ public class Quest implements Comparable { private List startCommands = Collections.emptyList(); private List cancelCommands = Collections.emptyList(); private List expiryCommands = Collections.emptyList(); + private double vaultReward = 0.0D; private boolean repeatEnabled = false; private boolean cooldownEnabled = false; private int cooldown = 0; @@ -405,6 +417,11 @@ public class Quest implements Comparable { return this; } + public Builder withVaultReward(double vaultReward) { + this.vaultReward = vaultReward; + return this; + } + public Builder withSortOrder(int sortOrder) { this.sortOrder = sortOrder; return this; @@ -482,6 +499,7 @@ public class Quest implements Comparable { quest.startCommands = this.startCommands; quest.cancelCommands = this.cancelCommands; quest.expiryCommands = this.expiryCommands; + quest.vaultReward = this.vaultReward; quest.repeatEnabled = this.repeatEnabled; quest.cooldownEnabled = this.cooldownEnabled; quest.cooldown = this.cooldown; diff --git a/docs/configuration/creating-a-quest.md b/docs/configuration/creating-a-quest.md index 997a63f6..be938a95 100644 --- a/docs/configuration/creating-a-quest.md +++ b/docs/configuration/creating-a-quest.md @@ -223,6 +223,18 @@ rewardstring: - " &8- &7You have received 10 dimaonds." ``` +## Vault reward + + +*`vaultreward`* + +**Optional.** The Vault reward is an amount of Vault economy money +that will be given to the player when they complete the quest. + +``` yaml +vaultreward: 600.0 +``` + ## Placeholders -- cgit v1.2.3-70-g09d2