package com.craftbank.commands; import com.craftbank.CraftBank; import com.craftbank.economy.EconomyManager; import com.craftbank.util.Amounts; import com.craftbank.util.Msg; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.Collections; import java.util.List; import java.util.Map; /** * /cheque <金额> —— 将现金具现化为一张实体支票。 * *

流程:异步扣除现金 → 切回玩家区域线程生成并发放支票物品。背包满时退款, * 避免吞钱。

*/ public final class ChequeCommand implements TabExecutor { private final CraftBank plugin; private final Msg msg; public ChequeCommand(CraftBank plugin) { this.plugin = plugin; this.msg = new Msg(plugin); } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { if (!(sender instanceof Player player)) { msg.key(sender, "player-only", "&c该指令只能由玩家执行。"); return true; } if (args.length < 1) { msg.raw(sender, "&c用法: /cheque <金额>"); return true; } double amount = Amounts.parse(args[0]); if (amount <= 0) { msg.key(sender, "invalid-amount", "&c请输入一个有效的正数金额。"); return true; } EconomyManager econ = plugin.getEconomyManager(); plugin.runAsync(() -> { econ.loadBlocking(player.getUniqueId(), player.getName(), true); if (!econ.withdraw(player.getUniqueId(), amount)) { msg.key(sender, "insufficient-funds", "&c余额不足。"); return; } // 物品操作必须回到玩家所在区域线程。 plugin.runForPlayer(player, () -> { ItemStack cheque = plugin.getChequeManager() .createCheque(player.getUniqueId(), player.getName(), amount); Map leftover = player.getInventory().addItem(cheque); if (!leftover.isEmpty()) { // 背包放不下: 异步退款。 plugin.runAsync(() -> { econ.deposit(player.getUniqueId(), amount); msg.raw(player, "&c背包已满, 无法生成支票, 金额已退回。"); }); return; } msg.raw(player, "&a已开具一张面额 &f" + econ.format(amount) + " &a的支票。"); }); }); return true; } @Override public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { return Collections.emptyList(); } }