eddc706c9a
实现完整的现金/钱包、银行卡、支票、活期储蓄与定期存款系统, 实现并以 Highest 优先级注册 Vault Economy 接口,接入 PlaceholderAPI。 全程遵循 Folia 调度模型(AsyncScheduler / 实体区域线程), 数据缓存线程安全,支票兑现与定期领取做防刷处理。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
289 lines
7.7 KiB
Java
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 共享银行账户");
|
|
}
|
|
}
|