eddc706c9a
实现完整的现金/钱包、银行卡、支票、活期储蓄与定期存款系统, 实现并以 Highest 优先级注册 Vault Economy 接口,接入 PlaceholderAPI。 全程遵循 Folia 调度模型(AsyncScheduler / 实体区域线程), 数据缓存线程安全,支票兑现与定期领取做防刷处理。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
81 lines
2.9 KiB
Java
81 lines
2.9 KiB
Java
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 <金额> —— 将现金具现化为一张实体支票。
|
|
*
|
|
* <p>流程:异步扣除现金 → 切回玩家区域线程生成并发放支票物品。背包满时退款,
|
|
* 避免吞钱。</p>
|
|
*/
|
|
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<Integer, ItemStack> 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<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
|
return Collections.emptyList();
|
|
}
|
|
}
|