Files
CraftBank/src/main/java/com/craftbank/economy/VaultEconomyProvider.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

289 lines
7.7 KiB
Java

package com.craftbank.economy;
import com.craftbank.CraftBank;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.List;
import java.util.UUID;
/**
* Vault {@link Economy} 接口实现。CraftBank 以此接管整个服务器的经济提供者
* 角色 (替代 XConomy)。所有操作均委托给线程安全的 {@link EconomyManager}。
*/
public class VaultEconomyProvider implements Economy {
private final CraftBank plugin;
private final EconomyManager economy;
public VaultEconomyProvider(CraftBank plugin) {
this.plugin = plugin;
this.economy = plugin.getEconomyManager();
}
@Override
public boolean isEnabled() {
return plugin.isEnabled();
}
@Override
public String getName() {
return "CraftBank";
}
@Override
public boolean hasBankSupport() {
// 这里的 "bank" 指 Vault 的多人共享账户概念, CraftBank 不提供。
return false;
}
@Override
public int fractionalDigits() {
return plugin.getConfig().getInt("Economy_Settings.fractional_digits", 2);
}
@Override
public String format(double amount) {
return economy.format(amount);
}
@Override
public String currencyNamePlural() {
return plugin.getConfig().getString("Economy_Settings.currency_name_plural", "");
}
@Override
public String currencyNameSingular() {
return plugin.getConfig().getString("Economy_Settings.currency_name_singular", "");
}
// ---- 账户存在性 ----
@Override
public boolean hasAccount(String playerName) {
return playerName != null;
}
@Override
public boolean hasAccount(OfflinePlayer player) {
return player != null;
}
@Override
public boolean hasAccount(String playerName, String worldName) {
return hasAccount(playerName);
}
@Override
public boolean hasAccount(OfflinePlayer player, String worldName) {
return hasAccount(player);
}
@Override
public boolean createPlayerAccount(OfflinePlayer player) {
if (player == null) {
return false;
}
economy.loadBlocking(player.getUniqueId(), player.getName(), true);
return true;
}
@Override
public boolean createPlayerAccount(OfflinePlayer player, String worldName) {
return createPlayerAccount(player);
}
@Override
public boolean createPlayerAccount(String playerName) {
return false;
}
@Override
public boolean createPlayerAccount(String playerName, String worldName) {
return false;
}
// ---- 余额查询 ----
@Override
public double getBalance(OfflinePlayer player) {
return economy.getCash(player.getUniqueId());
}
@Override
@SuppressWarnings("deprecation")
public double getBalance(String playerName) {
OfflinePlayer player = plugin.getServer().getOfflinePlayer(playerName);
return getBalance(player);
}
@Override
public double getBalance(String playerName, String world) {
return getBalance(playerName);
}
@Override
public double getBalance(OfflinePlayer player, String world) {
return getBalance(player);
}
@Override
public boolean has(OfflinePlayer player, double amount) {
return economy.has(player.getUniqueId(), amount);
}
@Override
@SuppressWarnings("deprecation")
public boolean has(String playerName, double amount) {
return has(plugin.getServer().getOfflinePlayer(playerName), amount);
}
@Override
public boolean has(String playerName, String worldName, double amount) {
return has(playerName, amount);
}
@Override
public boolean has(OfflinePlayer player, String worldName, double amount) {
return has(player, amount);
}
// ---- 扣款 ----
@Override
public EconomyResponse withdrawPlayer(OfflinePlayer player, double amount) {
if (amount < 0) {
return fail("无法扣除一个负数金额");
}
UUID uuid = player.getUniqueId();
if (economy.withdraw(uuid, amount)) {
return ok(amount, economy.getCash(uuid));
}
return fail("余额不足");
}
@Override
@SuppressWarnings("deprecation")
public EconomyResponse withdrawPlayer(String playerName, double amount) {
return withdrawPlayer(plugin.getServer().getOfflinePlayer(playerName), amount);
}
@Override
public EconomyResponse withdrawPlayer(String playerName, String worldName, double amount) {
return withdrawPlayer(playerName, amount);
}
@Override
public EconomyResponse withdrawPlayer(OfflinePlayer player, String worldName, double amount) {
return withdrawPlayer(player, amount);
}
// ---- 存款 ----
@Override
public EconomyResponse depositPlayer(OfflinePlayer player, double amount) {
if (amount < 0) {
return fail("无法存入一个负数金额");
}
UUID uuid = player.getUniqueId();
if (economy.deposit(uuid, amount)) {
return ok(amount, economy.getCash(uuid));
}
return fail("账户不存在");
}
@Override
@SuppressWarnings("deprecation")
public EconomyResponse depositPlayer(String playerName, double amount) {
return depositPlayer(plugin.getServer().getOfflinePlayer(playerName), amount);
}
@Override
public EconomyResponse depositPlayer(String playerName, String worldName, double amount) {
return depositPlayer(playerName, amount);
}
@Override
public EconomyResponse depositPlayer(OfflinePlayer player, String worldName, double amount) {
return depositPlayer(player, amount);
}
// ---- 不支持的 Vault 银行账户 (多人共享) ----
@Override
public EconomyResponse createBank(String name, String player) {
return unsupported();
}
@Override
public EconomyResponse createBank(String name, OfflinePlayer player) {
return unsupported();
}
@Override
public EconomyResponse deleteBank(String name) {
return unsupported();
}
@Override
public EconomyResponse bankBalance(String name) {
return unsupported();
}
@Override
public EconomyResponse bankHas(String name, double amount) {
return unsupported();
}
@Override
public EconomyResponse bankWithdraw(String name, double amount) {
return unsupported();
}
@Override
public EconomyResponse bankDeposit(String name, double amount) {
return unsupported();
}
@Override
public EconomyResponse isBankOwner(String name, String playerName) {
return unsupported();
}
@Override
public EconomyResponse isBankOwner(String name, OfflinePlayer player) {
return unsupported();
}
@Override
public EconomyResponse isBankMember(String name, String playerName) {
return unsupported();
}
@Override
public EconomyResponse isBankMember(String name, OfflinePlayer player) {
return unsupported();
}
@Override
public List<String> getBanks() {
return List.of();
}
// ---- 辅助 ----
private EconomyResponse ok(double amount, double balance) {
return new EconomyResponse(amount, balance, EconomyResponse.ResponseType.SUCCESS, null);
}
private EconomyResponse fail(String msg) {
return new EconomyResponse(0, 0, EconomyResponse.ResponseType.FAILURE, msg);
}
private EconomyResponse unsupported() {
return new EconomyResponse(0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "CraftBank 不支持 Vault 共享银行账户");
}
}