Files
CraftBank/src/main/java/com/craftbank/commands/ChequeCommand.java
T
Purpur Build eddc706c9a feat: CraftBank Folia 1.21.8 经济与银行核心插件初始实现
实现完整的现金/钱包、银行卡、支票、活期储蓄与定期存款系统,
实现并以 Highest 优先级注册 Vault Economy 接口,接入 PlaceholderAPI。
全程遵循 Folia 调度模型(AsyncScheduler / 实体区域线程),
数据缓存线程安全,支票兑现与定期领取做防刷处理。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 18:16:15 +08:00

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 &lt;金额&gt; —— 将现金具现化为一张实体支票。
*
* <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();
}
}