Vault -> DiamondBank-OG

This commit is contained in:
NotAlexNoyle committed 2026-05-20 04:20:08 -04:00
1 parent e2eac83855
commit a3d290eef0
20 files changed
+343 -110

No files matched your search

+3
View File
@@ -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
---
-1
View File
@@ -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));
}
@@ -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);
}
}
+4 -4
View File
@@ -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
+14 -5
View File
@@ -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:
+2 -2
View File
@@ -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.