Vault -> DiamondBank-OG
This commit is contained in:
1 parent
e2eac83855
commit
a3d290eef0
20 files changed
+343
-110
No files matched your search
@@ -4,6 +4,7 @@ The [TrueOG Network](https://trueog.net) fork of [Duels](https://github.com/Real
|
||||
|
||||
Changes from Duels:
|
||||
|
||||
- Added a chat wizard for setting a bounty amount post-duel command in the GUI by @NotAlexNoyle
|
||||
- Remove update checker by @NotAlexNoyle
|
||||
- Only start Duels from one world, configurable in config.yml by @NotAlexNoyle
|
||||
- Inventory loss bug fixes by @szumielxd
|
||||
@@ -16,6 +17,8 @@ Changes from Duels:
|
||||
- Whitelist arenas/worlds and fix duel transportation, with [PetTeleport-OG](https://github.com/true-og/PetTeleport-OG) and [HorseTp-OG](https://github.com/true-og/HorseTp-OG) support by @NotAlexNoyle
|
||||
- Add [EternalCombat](https://github.com/EternalCodeTeam/EternalCombat) support by @NotAlexNoyle
|
||||
- Replace BountyHunters hook with [PlayerBounties-OG](https://github.com/true-og/PlayerBounties-OG) support by @NotAlexNoyle
|
||||
- Replaced Vault hook with [DiamondBank-OG](https://github.com/true-og/DiamondBank-OG) API by @NotAlexNoyle
|
||||
- Replaced Multiverse hook with [MyWorlds](https://github.com/true-og/MyWorlds) API by @NotAlexNoyle
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -115,7 +115,6 @@ project(":duels-plugin") {
|
||||
}
|
||||
|
||||
compileOnly(localJar("MVdWPlaceholderAPI-3.1.1"))
|
||||
compileOnly(localJar("Vault-1.6.7"))
|
||||
compileOnly(localJar("CombatTagPlus"))
|
||||
compileOnly(localJar("PvPManager-3.7.16"))
|
||||
compileOnly(localJar("Factions-1.6.9.5-U0.1.14"))
|
||||
|
||||
@@ -2,7 +2,7 @@ package me.realized.duels.betting;
|
||||
|
||||
import me.realized.duels.DuelsPlugin;
|
||||
import me.realized.duels.gui.betting.BettingGui;
|
||||
import me.realized.duels.hook.hooks.VaultHook;
|
||||
import me.realized.duels.hook.hooks.DiamondBankHook;
|
||||
import me.realized.duels.setting.Settings;
|
||||
import me.realized.duels.util.Loadable;
|
||||
import me.realized.duels.util.Log;
|
||||
@@ -22,12 +22,10 @@ public class BettingManager implements Loadable, Listener {
|
||||
|
||||
@Override
|
||||
public void handleLoad() {
|
||||
final VaultHook vaultHook = plugin.getHookManager().getHook(VaultHook.class);
|
||||
final DiamondBankHook diamondBankHook = plugin.getHookManager().getHook(DiamondBankHook.class);
|
||||
|
||||
if (vaultHook == null) {
|
||||
Log.info(this, "Vault was not found! Money betting feature will be automatically disabled.");
|
||||
} else if (vaultHook.getEconomy() == null) {
|
||||
Log.info(this, "Economy plugin supporting Vault was not found! Money betting feature will be automatically disabled.");
|
||||
if (diamondBankHook == null) {
|
||||
Log.info(this, "DiamondBank-OG was not found! Diamond betting feature will be automatically disabled.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,10 +14,10 @@ import me.realized.duels.command.commands.duel.subcommands.VersionCommand;
|
||||
import me.realized.duels.data.UserData;
|
||||
import me.realized.duels.hook.hooks.CombatLogXHook;
|
||||
import me.realized.duels.hook.hooks.CombatTagPlusHook;
|
||||
import me.realized.duels.hook.hooks.DiamondBankHook;
|
||||
import me.realized.duels.hook.hooks.EternalCombatHook;
|
||||
import me.realized.duels.hook.hooks.GameModeInventoriesHook;
|
||||
import me.realized.duels.hook.hooks.PvPManagerHook;
|
||||
import me.realized.duels.hook.hooks.VaultHook;
|
||||
import me.realized.duels.hook.hooks.worldguard.WorldGuardHook;
|
||||
import me.realized.duels.kit.KitImpl;
|
||||
import me.realized.duels.setting.Settings;
|
||||
@@ -37,7 +37,7 @@ public class DuelCommand extends BaseCommand {
|
||||
private final CombatLogXHook combatLogX;
|
||||
private final EternalCombatHook eternalCombat;
|
||||
private final WorldGuardHook worldGuard;
|
||||
private final VaultHook vault;
|
||||
private final DiamondBankHook diamondBank;
|
||||
private final GameModeInventoriesHook gameModeInventories;
|
||||
|
||||
public DuelCommand(final DuelsPlugin plugin) {
|
||||
@@ -56,7 +56,7 @@ public class DuelCommand extends BaseCommand {
|
||||
this.combatLogX = hookManager.getHook(CombatLogXHook.class);
|
||||
this.eternalCombat = hookManager.getHook(EternalCombatHook.class);
|
||||
this.worldGuard = hookManager.getHook(WorldGuardHook.class);
|
||||
this.vault = hookManager.getHook(VaultHook.class);
|
||||
this.diamondBank = hookManager.getHook(DiamondBankHook.class);
|
||||
this.gameModeInventories = hookManager.getHook(GameModeInventoriesHook.class);
|
||||
}
|
||||
|
||||
@@ -175,12 +175,12 @@ public class DuelCommand extends BaseCommand {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (vault == null || vault.getEconomy() == null) {
|
||||
if (diamondBank == null) {
|
||||
lang.sendMessage(sender, "ERROR.setting.disabled-option", "option", lang.getMessage("GENERAL.betting"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!vault.getEconomy().has(player, amount)) {
|
||||
if (!diamondBank.has(amount, player)) {
|
||||
lang.sendMessage(sender, "ERROR.command.not-enough-money");
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -298,7 +298,7 @@ public class Config extends AbstractConfiguration<DuelsPlugin> {
|
||||
kitSelectingUsePermission = configuration.getBoolean("request.kit-selecting.use-permission", false);
|
||||
arenaSelectingEnabled = configuration.getBoolean("request.arena-selecting.enabled", true);
|
||||
arenaSelectingUsePermission = configuration.getBoolean("request.arena-selecting.use-permission", false);
|
||||
itemBettingEnabled = configuration.getBoolean("request.item-betting.enabled", true);
|
||||
itemBettingEnabled = configuration.getBoolean("request.item-betting.enabled", false);
|
||||
itemBettingUsePermission = configuration.getBoolean("request.item-betting.use-permission", false);
|
||||
moneyBettingEnabled = configuration.getBoolean("request.money-betting.enabled", true);
|
||||
moneyBettingUsePermission = configuration.getBoolean("request.money-betting.use-permission", false);
|
||||
|
||||
@@ -50,12 +50,12 @@ import me.realized.duels.data.UserData;
|
||||
import me.realized.duels.data.UserManagerImpl;
|
||||
import me.realized.duels.hook.hooks.CombatLogXHook;
|
||||
import me.realized.duels.hook.hooks.CombatTagPlusHook;
|
||||
import me.realized.duels.hook.hooks.DiamondBankHook;
|
||||
import me.realized.duels.hook.hooks.EssentialsHook;
|
||||
import me.realized.duels.hook.hooks.EternalCombatHook;
|
||||
import me.realized.duels.hook.hooks.GameModeInventoriesHook;
|
||||
import me.realized.duels.hook.hooks.McMMOHook;
|
||||
import me.realized.duels.hook.hooks.PvPManagerHook;
|
||||
import me.realized.duels.hook.hooks.VaultHook;
|
||||
import me.realized.duels.hook.hooks.worldguard.WorldGuardHook;
|
||||
import me.realized.duels.inventories.InventoryManager;
|
||||
import me.realized.duels.kit.KitImpl;
|
||||
@@ -95,7 +95,7 @@ public class DuelManager implements Loadable {
|
||||
private PvPManagerHook pvpManager;
|
||||
private CombatLogXHook combatLogX;
|
||||
private EternalCombatHook eternalCombat;
|
||||
private VaultHook vault;
|
||||
private DiamondBankHook diamondBank;
|
||||
private EssentialsHook essentials;
|
||||
private McMMOHook mcMMO;
|
||||
private WorldGuardHook worldGuard;
|
||||
@@ -123,7 +123,7 @@ public class DuelManager implements Loadable {
|
||||
this.pvpManager = plugin.getHookManager().getHook(PvPManagerHook.class);
|
||||
this.combatLogX = plugin.getHookManager().getHook(CombatLogXHook.class);
|
||||
this.eternalCombat = plugin.getHookManager().getHook(EternalCombatHook.class);
|
||||
this.vault = plugin.getHookManager().getHook(VaultHook.class);
|
||||
this.diamondBank = plugin.getHookManager().getHook(DiamondBankHook.class);
|
||||
this.essentials = plugin.getHookManager().getHook(EssentialsHook.class);
|
||||
this.mcMMO = plugin.getHookManager().getHook(McMMOHook.class);
|
||||
this.worldGuard = plugin.getHookManager().getHook(WorldGuardHook.class);
|
||||
@@ -198,9 +198,9 @@ public class DuelManager implements Loadable {
|
||||
private void handleTie(final Player player, final ArenaImpl arena, final MatchImpl match, boolean alive) {
|
||||
arena.remove(player);
|
||||
|
||||
// Reset player balance if there was a bet placed.
|
||||
if (vault != null && match.getBet() > 0) {
|
||||
vault.add(match.getBet(), player);
|
||||
// Refund the player's bet in the case of a tie.
|
||||
if (diamondBank != null && match.getBet() > 0) {
|
||||
diamondBank.add(match.getBet(), player);
|
||||
}
|
||||
|
||||
if (mcMMO != null) {
|
||||
@@ -236,7 +236,7 @@ public class DuelManager implements Loadable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Rewards the duel winner with money and items bet on the match.
|
||||
* Rewards the duel winner with diamonds and items bet on the match.
|
||||
*
|
||||
* @param player Player determined to be the winner
|
||||
* @param opponent Player that opposed the winner
|
||||
@@ -248,9 +248,9 @@ public class DuelManager implements Loadable {
|
||||
|
||||
final String opponentName = opponent != null ? opponent.getName() : lang.getMessage("GENERAL.none");
|
||||
|
||||
if (vault != null && match.getBet() > 0) {
|
||||
if (diamondBank != null && match.getBet() > 0) {
|
||||
final int amount = match.getBet() * 2;
|
||||
vault.add(amount, player);
|
||||
diamondBank.add(amount, player);
|
||||
lang.sendMessage(player, "DUEL.reward.money.message", "name", opponentName, "money", amount);
|
||||
|
||||
final String title = lang.getMessage("DUEL.reward.money.title", "name", opponentName, "money", amount);
|
||||
@@ -348,12 +348,10 @@ public class DuelManager implements Loadable {
|
||||
|
||||
final int bet = settings.getBet();
|
||||
|
||||
if (bet > 0 && vault != null && vault.getEconomy() != null) {
|
||||
if (!vault.has(bet, first, second)) {
|
||||
lang.sendMessage(Arrays.asList(first, second), "DUEL.start-failure.not-enough-money", "bet_amount", bet);
|
||||
refundItems(items, first, second);
|
||||
return;
|
||||
}
|
||||
if (bet > 0 && (diamondBank == null || !diamondBank.has(bet, first, second))) {
|
||||
lang.sendMessage(Arrays.asList(first, second), "DUEL.start-failure.not-enough-money", "bet_amount", bet);
|
||||
refundItems(items, first, second);
|
||||
return;
|
||||
}
|
||||
|
||||
final Map<UUID, PreDuelState> states = captureStates(first, second);
|
||||
@@ -365,8 +363,10 @@ public class DuelManager implements Loadable {
|
||||
return;
|
||||
}
|
||||
|
||||
if (bet > 0 && vault != null && vault.getEconomy() != null) {
|
||||
vault.remove(bet, first, second);
|
||||
if (bet > 0 && !diamondBank.remove(bet, first, second)) {
|
||||
lang.sendMessage(Arrays.asList(first, second), "DUEL.start-failure.not-enough-money", "bet_amount", bet);
|
||||
refundItems(items, first, second);
|
||||
return;
|
||||
}
|
||||
|
||||
final MatchImpl match = arena.startMatch(kit, items, settings.getBet(), source);
|
||||
|
||||
@@ -148,7 +148,7 @@ public class BettingGui extends AbstractGui<DuelsPlugin> {
|
||||
return;
|
||||
}
|
||||
|
||||
button.onClick(player);
|
||||
button.onClick(player, event);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -7,6 +7,7 @@ import me.realized.duels.config.Config;
|
||||
import me.realized.duels.gui.BaseButton;
|
||||
import me.realized.duels.gui.settings.buttons.ArenaSelectButton;
|
||||
import me.realized.duels.gui.settings.buttons.CancelButton;
|
||||
import me.realized.duels.gui.settings.buttons.DiamondBetButton;
|
||||
import me.realized.duels.gui.settings.buttons.ItemBettingButton;
|
||||
import me.realized.duels.gui.settings.buttons.KitSelectButton;
|
||||
import me.realized.duels.gui.settings.buttons.OwnInventoryButton;
|
||||
@@ -23,7 +24,8 @@ public class SettingsGui extends SinglePageGui<DuelsPlugin> {
|
||||
{13},
|
||||
{12, 14},
|
||||
{12, 13, 14},
|
||||
{12, 13, 14, 22}
|
||||
{12, 13, 14, 22},
|
||||
{11, 12, 13, 14, 15}
|
||||
};
|
||||
|
||||
public SettingsGui(final DuelsPlugin plugin) {
|
||||
@@ -49,6 +51,10 @@ public class SettingsGui extends SinglePageGui<DuelsPlugin> {
|
||||
buttons.add(new ArenaSelectButton(plugin));
|
||||
}
|
||||
|
||||
if (config.isMoneyBettingEnabled()) {
|
||||
buttons.add(new DiamondBetButton(plugin));
|
||||
}
|
||||
|
||||
if (config.isItemBettingEnabled()) {
|
||||
buttons.add(new ItemBettingButton(plugin));
|
||||
}
|
||||
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
package me.realized.duels.gui.settings.buttons;
|
||||
|
||||
import me.realized.duels.DuelsPlugin;
|
||||
import me.realized.duels.Permissions;
|
||||
import me.realized.duels.gui.BaseButton;
|
||||
import me.realized.duels.hook.hooks.DiamondBankHook;
|
||||
import me.realized.duels.setting.Settings;
|
||||
import me.realized.duels.util.inventory.ItemBuilder;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class DiamondBetButton extends BaseButton {
|
||||
|
||||
public DiamondBetButton(final DuelsPlugin plugin) {
|
||||
super(plugin, ItemBuilder.of(Material.DIAMOND).name(plugin.getLang().getMessage("GUI.settings.buttons.diamond-bet.name")).build());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void update(final Player player) {
|
||||
if (config.isMoneyBettingUsePermission() && !player.hasPermission(Permissions.MONEY_BETTING) && !player.hasPermission(Permissions.SETTING_ALL)) {
|
||||
setLore(lang.getMessage("GUI.settings.buttons.diamond-bet.lore-no-permission").split("\n"));
|
||||
return;
|
||||
}
|
||||
|
||||
final Settings settings = settingManager.getSafely(player);
|
||||
final int bet = settings.getBet();
|
||||
getDisplayed().setAmount(Math.max(1, Math.min(64, bet)));
|
||||
setLore(lang.getMessage("GUI.settings.buttons.diamond-bet.lore", "bet_amount", bet).split("\n"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(final Player player) {
|
||||
if (config.isMoneyBettingUsePermission() && !player.hasPermission(Permissions.MONEY_BETTING) && !player.hasPermission(Permissions.SETTING_ALL)) {
|
||||
lang.sendMessage(player, "ERROR.no-permission", "permission", Permissions.MONEY_BETTING);
|
||||
return;
|
||||
}
|
||||
|
||||
final DiamondBankHook diamondBank = plugin.getHookManager().getHook(DiamondBankHook.class);
|
||||
|
||||
if (diamondBank == null) {
|
||||
lang.sendMessage(player, "ERROR.setting.disabled-option", "option", lang.getMessage("GENERAL.betting"));
|
||||
return;
|
||||
}
|
||||
|
||||
settingManager.requestBetInput(player);
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package me.realized.duels.hook;
|
||||
import me.realized.duels.DuelsPlugin;
|
||||
import me.realized.duels.hook.hooks.CombatLogXHook;
|
||||
import me.realized.duels.hook.hooks.CombatTagPlusHook;
|
||||
import me.realized.duels.hook.hooks.DiamondBankHook;
|
||||
import me.realized.duels.hook.hooks.EssentialsHook;
|
||||
import me.realized.duels.hook.hooks.EternalCombatHook;
|
||||
import me.realized.duels.hook.hooks.FactionsHook;
|
||||
@@ -14,7 +15,6 @@ import me.realized.duels.hook.hooks.PlaceholderHook;
|
||||
import me.realized.duels.hook.hooks.PlayerBountiesOGHook;
|
||||
import me.realized.duels.hook.hooks.PvPManagerHook;
|
||||
import me.realized.duels.hook.hooks.SimpleClansHook;
|
||||
import me.realized.duels.hook.hooks.VaultHook;
|
||||
import me.realized.duels.hook.hooks.worldguard.WorldGuardHook;
|
||||
import me.realized.duels.util.hook.AbstractHookManager;
|
||||
|
||||
@@ -24,6 +24,7 @@ public class HookManager extends AbstractHookManager<DuelsPlugin> {
|
||||
super(plugin);
|
||||
register(CombatLogXHook.NAME, CombatLogXHook.class);
|
||||
register(CombatTagPlusHook.NAME, CombatTagPlusHook.class);
|
||||
register(DiamondBankHook.NAME, DiamondBankHook.class);
|
||||
register(EssentialsHook.NAME, EssentialsHook.class);
|
||||
register(EternalCombatHook.NAME, EternalCombatHook.class);
|
||||
register(FactionsHook.NAME, FactionsHook.class);
|
||||
@@ -35,7 +36,6 @@ public class HookManager extends AbstractHookManager<DuelsPlugin> {
|
||||
register(PlayerBountiesOGHook.NAME, PlayerBountiesOGHook.class);
|
||||
register(PvPManagerHook.NAME, PvPManagerHook.class);
|
||||
register(SimpleClansHook.NAME, SimpleClansHook.class);
|
||||
register(VaultHook.NAME, VaultHook.class);
|
||||
register(WorldGuardHook.NAME, WorldGuardHook.class);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,159 @@
|
||||
package me.realized.duels.hook.hooks;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import me.realized.duels.DuelsPlugin;
|
||||
import me.realized.duels.util.Log;
|
||||
import me.realized.duels.util.hook.PluginHook;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
|
||||
public class DiamondBankHook extends PluginHook<DuelsPlugin> {
|
||||
|
||||
public static final String NAME = "DiamondBank-OG";
|
||||
|
||||
private static final String API_CLASS = "net.trueog.diamondbankog.api.DiamondBankAPIJava";
|
||||
private static final String PLUGIN_NOTE = "Plugin: Duels-OG";
|
||||
|
||||
private final Object api;
|
||||
private final Method diamondsToShards;
|
||||
private final Method shardsToDiamonds;
|
||||
private final Method getBankShards;
|
||||
private final Method getInventoryShards;
|
||||
private final Method consumeFromPlayer;
|
||||
private final Method addToPlayerBankShards;
|
||||
|
||||
public DiamondBankHook(final DuelsPlugin plugin) {
|
||||
super(plugin, NAME);
|
||||
|
||||
try {
|
||||
final Class<?> apiClass = Class.forName(API_CLASS);
|
||||
final RegisteredServiceProvider<?> provider = Bukkit.getServicesManager().getRegistration(apiClass);
|
||||
|
||||
if (provider == null) {
|
||||
throw new IllegalStateException("DiamondBank-OG API service is not registered.");
|
||||
}
|
||||
|
||||
api = provider.getProvider();
|
||||
diamondsToShards = apiClass.getMethod("diamondsToShards", Double.TYPE);
|
||||
shardsToDiamonds = apiClass.getMethod("shardsToDiamonds", Long.TYPE);
|
||||
getBankShards = apiClass.getMethod("getBankShards", java.util.UUID.class);
|
||||
getInventoryShards = apiClass.getMethod("getInventoryShards", java.util.UUID.class);
|
||||
consumeFromPlayer = apiClass.getMethod("consumeFromPlayer", java.util.UUID.class, Long.TYPE, String.class, String.class);
|
||||
addToPlayerBankShards = apiClass.getMethod("addToPlayerBankShards", java.util.UUID.class, Long.TYPE, String.class, String.class);
|
||||
Log.info("Using DiamondBank-OG for duel betting.");
|
||||
} catch (ReflectiveOperationException | IllegalStateException ex) {
|
||||
throw new IllegalStateException("Failed to hook DiamondBank-OG API: " + ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
|
||||
public boolean has(final int amount, final Player... players) {
|
||||
try {
|
||||
final long shards = toShards(amount);
|
||||
|
||||
for (final Player player : players) {
|
||||
if (totalShards(player) < shards) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (ReflectiveOperationException | RuntimeException ex) {
|
||||
Log.warn("Failed to check DiamondBank-OG balance: " + ex.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean add(final int amount, final Player... players) {
|
||||
try {
|
||||
final long shards = toShards(amount);
|
||||
|
||||
for (final Player player : players) {
|
||||
addToBank(player, shards, "Duels-OG bet payout", "Paid " + format(shards) + " Diamonds to " + player.getName() + ".");
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (ReflectiveOperationException | RuntimeException ex) {
|
||||
Log.warn("Failed to pay DiamondBank-OG duel bet: " + ex.getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean remove(final int amount, final Player... players) {
|
||||
final List<Player> charged = new ArrayList<>();
|
||||
|
||||
try {
|
||||
final long shards = toShards(amount);
|
||||
|
||||
for (final Player player : players) {
|
||||
consume(player, shards, "Duels-OG bet placed", player.getName() + " wagered " + format(shards) + " Diamonds.");
|
||||
charged.add(player);
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (ReflectiveOperationException | RuntimeException ex) {
|
||||
Log.warn("Failed to withdraw DiamondBank-OG duel bet: " + ex.getMessage());
|
||||
refundCharged(amount, charged);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private long toShards(final int amount) throws ReflectiveOperationException {
|
||||
return ((Number) invoke(diamondsToShards, (double) amount)).longValue();
|
||||
}
|
||||
|
||||
private long totalShards(final Player player) throws ReflectiveOperationException {
|
||||
final long bankShards = ((Number) invoke(getBankShards, player.getUniqueId())).longValue();
|
||||
final long inventoryShards = ((Number) invoke(getInventoryShards, player.getUniqueId())).longValue();
|
||||
return bankShards + inventoryShards;
|
||||
}
|
||||
|
||||
private void consume(final Player player, final long shards, final String reason, final String notes) throws ReflectiveOperationException {
|
||||
invoke(consumeFromPlayer, player.getUniqueId(), shards, reason, notes + " " + PLUGIN_NOTE);
|
||||
}
|
||||
|
||||
private void addToBank(final Player player, final long shards, final String reason, final String notes) throws ReflectiveOperationException {
|
||||
invoke(addToPlayerBankShards, player.getUniqueId(), shards, reason, notes + " " + PLUGIN_NOTE);
|
||||
}
|
||||
|
||||
private String format(final long shards) throws ReflectiveOperationException {
|
||||
return String.valueOf(invoke(shardsToDiamonds, shards));
|
||||
}
|
||||
|
||||
private Object invoke(final Method method, final Object... args) throws ReflectiveOperationException {
|
||||
try {
|
||||
return method.invoke(api, args);
|
||||
} catch (InvocationTargetException ex) {
|
||||
final Throwable cause = ex.getCause();
|
||||
|
||||
if (cause instanceof RuntimeException) {
|
||||
throw (RuntimeException) cause;
|
||||
}
|
||||
|
||||
if (cause instanceof Error) {
|
||||
throw (Error) cause;
|
||||
}
|
||||
|
||||
throw new IllegalStateException(cause != null ? cause.getMessage() : ex.getMessage(), cause);
|
||||
}
|
||||
}
|
||||
|
||||
private void refundCharged(final int amount, final List<Player> charged) {
|
||||
if (charged.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
final long shards = toShards(amount);
|
||||
|
||||
for (final Player player : charged) {
|
||||
addToBank(player, shards, "Duels-OG bet rollback", "Refunded " + format(shards) + " Diamonds to " + player.getName() + ".");
|
||||
}
|
||||
} catch (ReflectiveOperationException | RuntimeException ex) {
|
||||
Log.warn("Failed to rollback DiamondBank-OG duel bet: " + ex.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
package me.realized.duels.hook.hooks;
|
||||
|
||||
import java.util.Arrays;
|
||||
import lombok.Getter;
|
||||
import me.realized.duels.DuelsPlugin;
|
||||
import me.realized.duels.util.Log;
|
||||
import me.realized.duels.util.hook.PluginHook;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
|
||||
public class VaultHook extends PluginHook<DuelsPlugin> {
|
||||
|
||||
public static final String NAME = "Vault";
|
||||
|
||||
@Getter
|
||||
private Economy economy;
|
||||
|
||||
public VaultHook(final DuelsPlugin plugin) {
|
||||
super(plugin, NAME);
|
||||
|
||||
final RegisteredServiceProvider<Economy> provider = Bukkit.getServicesManager().getRegistration(Economy.class);
|
||||
|
||||
if (provider == null) {
|
||||
Log.warn("Found no available economy plugin that supports Vault. Money betting will not be available.");
|
||||
return;
|
||||
}
|
||||
|
||||
economy = provider.getProvider();
|
||||
Log.info("Using Economy Provider: " + economy.getClass().getName());
|
||||
}
|
||||
|
||||
public boolean has(final int amount, final Player... players) {
|
||||
if (economy == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (final Player player : players) {
|
||||
if (!economy.has(player, amount)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void add(final int amount, final Player... players) {
|
||||
if (economy != null) {
|
||||
Arrays.stream(players).forEach(player -> economy.depositPlayer(player, amount));
|
||||
}
|
||||
}
|
||||
|
||||
public void remove(final int amount, final Player... players) {
|
||||
if (economy != null) {
|
||||
Arrays.stream(players).forEach(player -> economy.withdrawPlayer(player, amount));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -35,10 +35,10 @@ import me.realized.duels.data.UserManagerImpl;
|
||||
import me.realized.duels.duel.DuelManager;
|
||||
import me.realized.duels.hook.hooks.CombatLogXHook;
|
||||
import me.realized.duels.hook.hooks.CombatTagPlusHook;
|
||||
import me.realized.duels.hook.hooks.DiamondBankHook;
|
||||
import me.realized.duels.hook.hooks.EternalCombatHook;
|
||||
import me.realized.duels.hook.hooks.GameModeInventoriesHook;
|
||||
import me.realized.duels.hook.hooks.PvPManagerHook;
|
||||
import me.realized.duels.hook.hooks.VaultHook;
|
||||
import me.realized.duels.hook.hooks.worldguard.WorldGuardHook;
|
||||
import me.realized.duels.kit.KitManagerImpl;
|
||||
import me.realized.duels.setting.Settings;
|
||||
@@ -87,7 +87,7 @@ public class QueueManager implements Loadable, DQueueManager, Listener {
|
||||
private CombatLogXHook combatLogX;
|
||||
private EternalCombatHook eternalCombat;
|
||||
private WorldGuardHook worldGuard;
|
||||
private VaultHook vault;
|
||||
private DiamondBankHook diamondBank;
|
||||
private GameModeInventoriesHook gameModeInventories;
|
||||
private int queueTask;
|
||||
|
||||
@@ -156,7 +156,7 @@ public class QueueManager implements Loadable, DQueueManager, Listener {
|
||||
this.combatLogX = plugin.getHookManager().getHook(CombatLogXHook.class);
|
||||
this.eternalCombat = plugin.getHookManager().getHook(EternalCombatHook.class);
|
||||
this.worldGuard = plugin.getHookManager().getHook(WorldGuardHook.class);
|
||||
this.vault = plugin.getHookManager().getHook(VaultHook.class);
|
||||
this.diamondBank = plugin.getHookManager().getHook(DiamondBankHook.class);
|
||||
this.gameModeInventories = plugin.getHookManager().getHook(GameModeInventoriesHook.class);
|
||||
this.queueTask = plugin.doSyncRepeat(() -> {
|
||||
boolean update = false;
|
||||
@@ -390,7 +390,7 @@ public class QueueManager implements Loadable, DQueueManager, Listener {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (queue.getBet() > 0 && vault != null && !vault.has(queue.getBet(), player)) {
|
||||
if (queue.getBet() > 0 && (diamondBank == null || !diamondBank.has(queue.getBet(), player))) {
|
||||
lang.sendMessage(player, "ERROR.queue.not-enough-money", "bet_amount", queue.getBet());
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2,19 +2,26 @@ package me.realized.duels.setting;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import me.realized.duels.DuelsPlugin;
|
||||
import me.realized.duels.hook.hooks.DiamondBankHook;
|
||||
import me.realized.duels.util.Loadable;
|
||||
import me.realized.duels.util.NumberUtil;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.AsyncPlayerChatEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
public class SettingsManager implements Loadable, Listener {
|
||||
|
||||
private final DuelsPlugin plugin;
|
||||
private final Map<UUID, Settings> cache = new HashMap<>();
|
||||
private final Set<UUID> awaitingBetInput = ConcurrentHashMap.newKeySet();
|
||||
|
||||
public SettingsManager(final DuelsPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
@@ -27,6 +34,7 @@ public class SettingsManager implements Loadable, Listener {
|
||||
@Override
|
||||
public void handleUnload() {
|
||||
cache.clear();
|
||||
awaitingBetInput.clear();
|
||||
}
|
||||
|
||||
// Only one Settings instance stays in memory while player is online; no need for manual removal of gui from GuiListener
|
||||
@@ -34,8 +42,66 @@ public class SettingsManager implements Loadable, Listener {
|
||||
return cache.computeIfAbsent(player.getUniqueId(), result -> new Settings(plugin, player));
|
||||
}
|
||||
|
||||
public void requestBetInput(final Player player) {
|
||||
awaitingBetInput.add(player.getUniqueId());
|
||||
player.closeInventory();
|
||||
plugin.getLang().sendMessage(player, "GUI.settings.buttons.diamond-bet.prompt");
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void on(final AsyncPlayerChatEvent event) {
|
||||
final UUID uuid = event.getPlayer().getUniqueId();
|
||||
|
||||
if (!awaitingBetInput.remove(uuid)) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
|
||||
final String message = event.getMessage().trim();
|
||||
plugin.doSync(() -> handleBetInput(uuid, message));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void on(final PlayerQuitEvent event) {
|
||||
cache.remove(event.getPlayer().getUniqueId());
|
||||
final UUID uuid = event.getPlayer().getUniqueId();
|
||||
cache.remove(uuid);
|
||||
awaitingBetInput.remove(uuid);
|
||||
}
|
||||
|
||||
private void handleBetInput(final UUID uuid, final String message) {
|
||||
final Player player = Bukkit.getPlayer(uuid);
|
||||
|
||||
if (player == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
final Settings settings = getSafely(player);
|
||||
|
||||
if (message.equalsIgnoreCase("cancel")) {
|
||||
plugin.getLang().sendMessage(player, "GUI.settings.buttons.diamond-bet.cancelled");
|
||||
settings.openGui(player);
|
||||
return;
|
||||
}
|
||||
|
||||
final int bet = NumberUtil.parseInt(message).orElse(-1);
|
||||
|
||||
if (bet < 0) {
|
||||
plugin.getLang().sendMessage(player, "GUI.settings.buttons.diamond-bet.invalid");
|
||||
settings.openGui(player);
|
||||
return;
|
||||
}
|
||||
|
||||
final DiamondBankHook diamondBank = plugin.getHookManager().getHook(DiamondBankHook.class);
|
||||
|
||||
if (bet > 0 && (diamondBank == null || !diamondBank.has(bet, player))) {
|
||||
plugin.getLang().sendMessage(player, "ERROR.command.not-enough-money");
|
||||
settings.openGui(player);
|
||||
return;
|
||||
}
|
||||
|
||||
settings.setBet(bet);
|
||||
plugin.getLang().sendMessage(player, "GUI.settings.buttons.diamond-bet.set", "bet_amount", bet);
|
||||
settings.openGui(player);
|
||||
}
|
||||
}
|
||||
@@ -13,6 +13,7 @@ import me.realized.duels.util.inventory.ItemBuilder;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.inventory.ItemFlag;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
@@ -85,4 +86,8 @@ public class Button<P extends JavaPlugin> {
|
||||
public void update(final Player player) {}
|
||||
|
||||
public void onClick(final Player player) {}
|
||||
|
||||
public void onClick(final Player player, final InventoryClickEvent event) {
|
||||
onClick(player);
|
||||
}
|
||||
}
|
||||
@@ -61,6 +61,6 @@ public class SinglePageGui<P extends JavaPlugin> extends AbstractGui<P> {
|
||||
return;
|
||||
}
|
||||
|
||||
button.onClick(player);
|
||||
button.onClick(player, event);
|
||||
}
|
||||
}
|
||||
@@ -138,19 +138,19 @@ request:
|
||||
|
||||
item-betting:
|
||||
# If set to 'true', players will be able to choose to enable or disable item betting in the Request Settings GUI.
|
||||
# default: true
|
||||
enabled: true
|
||||
# default: false
|
||||
enabled: false
|
||||
|
||||
# If set to 'true', players without the permission 'duels.use.item-betting' will not be able to enable item betting.
|
||||
# default: false
|
||||
use-permission: true
|
||||
|
||||
money-betting:
|
||||
# If set to 'true', players will be able to bet money on their duel by using the command '/duel [player] [bet amount]'.
|
||||
# If set to 'true', players will be able to bet DiamondBank-OG diamonds on their duel by using the command '/duel [player] [bet amount]'.
|
||||
# default: true
|
||||
enabled: true
|
||||
|
||||
# If set to 'true', players without the permission 'duels.use.money-betting' will not be able to bet money on their duel.
|
||||
# If set to 'true', players without the permission 'duels.use.money-betting' will not be able to bet diamonds on their duel.
|
||||
# default: false
|
||||
use-permission: true
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ ERROR:
|
||||
invalid-sub-command: '{PREFIX} &c''%argument%'' is not a valid sub command. Please type ''/%command%'' for help.'
|
||||
invalid-option: '{PREFIX} &c''%option%'' is not a valid option. Available options are: %available_options%'
|
||||
invalid-action: '{PREFIX} &c''%action%'' is not a valid action. Available actions are: %available_actions%'
|
||||
not-enough-money: '{PREFIX} &cYou do not have enough money to bet!'
|
||||
not-enough-money: '{PREFIX} &cYou do not have enough Diamonds to bet!'
|
||||
lobby-save-failure: '{PREFIX} &cCould not save lobby location. Please check the console for more information.'
|
||||
name-not-alphanumeric: '{PREFIX} &c''%name%'' is not alphanumeric.'
|
||||
|
||||
@@ -351,10 +351,6 @@ GUI:
|
||||
- '&7Kit: &d%kit%'
|
||||
- '&7Arena: &e%arena%'
|
||||
- '&7Bet: &B%bet_amount% Diamond(s)'
|
||||
- ' '
|
||||
- '&7To change the bet'
|
||||
- '&7amount, type:'
|
||||
- '&e/duel &f%opponent% &B[amount]'
|
||||
kit-selector:
|
||||
name: '&2Kit Selection'
|
||||
lore:
|
||||
@@ -382,6 +378,19 @@ GUI:
|
||||
lore-no-permission:
|
||||
- '&cYou do not have permission to'
|
||||
- '&cuse this option.'
|
||||
diamond-bet:
|
||||
name: '&BDiamond Bet'
|
||||
lore:
|
||||
- '&7Bet: &B%bet_amount% Diamond(s)'
|
||||
- ' '
|
||||
- '&aClick to enter a bet amount.'
|
||||
prompt: '{PREFIX} &7Type the Diamond bet amount in chat, or type &ccancel &7to keep the current amount.'
|
||||
invalid: '{PREFIX} &cPlease enter a whole number of Diamonds.'
|
||||
cancelled: '{PREFIX} &7Diamond bet unchanged.'
|
||||
set: '{PREFIX} &7Diamond bet set to &B%bet_amount% Diamond(s)&7.'
|
||||
lore-no-permission:
|
||||
- '&cYou do not have permission to'
|
||||
- '&cuse this option.'
|
||||
item-betting:
|
||||
name: '&BAllow Betting Items'
|
||||
lore:
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
name: Duels-OG
|
||||
main: me.realized.duels.DuelsPlugin
|
||||
version: @VERSION@
|
||||
softdepend: [BetterChairs-OG, CombatLogX, CombatTagPlus, Essentials, EternalCombat, Factions, GameModeInventories-OG, LeaderHeads, mcMMO, MVdWPlaceholderAPI, PlaceholderAPI, PvPManager, SimpleClans, Vault, WorldGuard, Multiverse-Core]
|
||||
# Multiverse-Core added as soft-depend due to locations being null when Duels is loaded first.
|
||||
softdepend: [BetterChairs-OG, CombatLogX, CombatTagPlus, DiamondBank-OG, Essentials, EternalCombat, Factions, GameModeInventories-OG, LeaderHeads, mcMMO, MVdWPlaceholderAPI, MyWorlds, PlaceholderAPI, PvPManager, SimpleClans, WorldGuard]
|
||||
# MyWorlds added as soft-depend due to locations being null when Duels is loaded before managed worlds.
|
||||
# Add any world management plugins to softdepend list if arena doesn't load properly in the generated world.
|
||||
api-version: 1.14
|
||||
|
||||
|
||||
Binary file not shown.
Reference in new issue
Block a user