feat: code

This commit is contained in:
2026-02-11 14:09:38 -08:00
parent 1f008968d1
commit ce7b7f50ab
10 changed files with 574 additions and 6 deletions

View File

@@ -3,17 +3,18 @@ package online.mineroo.paper;
import org.bukkit.configuration.file.FileConfiguration;
public class Config {
private final ServerSection server;
private final PlayersSection player;
private final ProxySection proxy;
private final TestSection test;
private final CurrenciesSection currencies;
public Config(FileConfiguration config) {
this.test = new TestSection(config);
this.proxy = new ProxySection(config);
this.server = new ServerSection(config);
this.player = new PlayersSection(config);
this.currencies = new CurrenciesSection(config);
}
public TestSection getTest() {
@@ -32,6 +33,10 @@ public class Config {
return player;
}
public CurrenciesSection getCurrencies() {
return currencies;
}
public static class TestSection {
private final String apiHostname;
@@ -67,7 +72,10 @@ public class Config {
this.bind = new ServerBindSection(
config.getString("server.bind.address", ""),
config.getObject("server.bind.port", Integer.class, null),
config.getString("server.bind.token", "get token from `mineroo.online/resources/servers` page!"));
config.getString(
"server.bind.token", "get token from `mineroo.online/resources/servers` page!"
)
);
}
public String getServerName() {
@@ -113,7 +121,8 @@ public class Config {
public PlayersSection(FileConfiguration config) {
this.bind = new PlayerBindSection(
config.getBoolean("players.bind.required", false),
config.getBoolean("players.bind.share_player_info", true));
config.getBoolean("players.bind.share_player_info", true)
);
}
public PlayerBindSection getPlayerBind() {
@@ -138,4 +147,15 @@ public class Config {
return sharePlayerInfo;
}
}
public static class CurrenciesSection {
private final String primary;
public CurrenciesSection(FileConfiguration config) {
this.primary = config.getString("currencies.primary", "money");
}
public String getPrimary() {
return primary;
}
}
}

View File

@@ -7,9 +7,11 @@ import online.mineroo.common.NetworkServiceInterface;
import online.mineroo.common.cache.UserInfoCache;
import online.mineroo.common.request.RequestClient;
import online.mineroo.paper.commands.MainCommand;
import online.mineroo.paper.economy.MinerooEconomy;
import online.mineroo.paper.expansions.MinerooExpansion;
import online.mineroo.paper.listeners.BindListener;
import online.mineroo.paper.listeners.PlayerBindListener;
import online.mineroo.paper.listeners.PlayerCurrencyListener;
import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.plugin.java.JavaPlugin;
@@ -38,6 +40,7 @@ public class MinerooCore extends JavaPlugin implements Listener {
});
getServer().getPluginManager().registerEvents(new PlayerBindListener(this), this);
getServer().getPluginManager().registerEvents(new PlayerCurrencyListener(this), this);
messageManager = new MessageManager();
@@ -49,6 +52,22 @@ public class MinerooCore extends JavaPlugin implements Listener {
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
new MinerooExpansion(this).register();
}
// register vault
if (getServer().getPluginManager().getPlugin("Vault") != null) {
MinerooEconomy economy = new MinerooEconomy(this);
getServer().getServicesManager().register(
net.milkbowl.vault.economy.Economy.class,
economy,
this,
org.bukkit.plugin.ServicePriority.Highest
);
getLogger().info("✅ Mineroo Vault Economy has been hooked!");
} else {
getLogger().warning("❌ Vault not found! Economy features will be disabled.");
}
}
@Override

View File

@@ -1,16 +1,278 @@
package online.mineroo.paper.economy;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import net.milkbowl.vault.economy.AbstractEconomy;
import net.milkbowl.vault.economy.EconomyResponse;
import online.mineroo.common.request.UserRequest.SimpleUserInfoResponse;
import online.mineroo.common.request.CurrencyRequest;
import online.mineroo.paper.MinerooCore;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
public class MinerooEconomy {
@SuppressWarnings("deprecation")
public class MinerooEconomy extends AbstractEconomy {
private final MinerooCore plugin;
private final String PRIMARY_CURRENCY;
public MinerooEconomy(MinerooCore plugin) {
this.plugin = plugin;
this.PRIMARY_CURRENCY = this.plugin.getConfigObject().getCurrencies().getPrimary();
}
private CurrencyRequest currency() {
return plugin.getRequestClient().currency();
}
@Override
public boolean isEnabled() {
return plugin.isEnabled();
}
@Override
public String getName() {
return "Mineroo";
}
@Override
public boolean hasBankSupport() {
return false;
}
@Override
public int fractionalDigits() {
return 2;
}
@Override
public String format(double amount) {
return String.format("%.2f", amount);
}
@Override
public String currencyNamePlural() {
return "";
}
@Override
public String currencyNameSingular() {
return "";
}
@Override
public boolean hasAccount(String playerName) {
return hasAccount(Bukkit.getOfflinePlayer(playerName));
}
@Override
public boolean hasAccount(OfflinePlayer player) {
return true;
}
@Override
public boolean hasAccount(String playerName, String worldName) {
return hasAccount(playerName);
}
@Override
public double getBalance(String playerName) {
return getBalance(Bukkit.getOfflinePlayer(playerName));
}
@Override
public double getBalance(OfflinePlayer player) {
return currency().getCachedBalance(player.getUniqueId(), PRIMARY_CURRENCY);
}
@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(String playerName, double amount) {
return getBalance(playerName) >= amount;
}
@Override
public boolean has(OfflinePlayer player, double amount) {
return getBalance(player) >= 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);
}
// --- 核心:扣款 (Withdraw) ---
@Override
public EconomyResponse withdrawPlayer(String playerName, double amount) {
return withdrawPlayer(Bukkit.getOfflinePlayer(playerName), amount);
}
@Override
public EconomyResponse withdrawPlayer(OfflinePlayer player, double amount) {
if (amount < 0) {
return new EconomyResponse(
0, 0, EconomyResponse.ResponseType.FAILURE, "Cannot withdraw negative funds"
);
}
double balance = getBalance(player);
if (balance < amount) {
return new EconomyResponse(
0, balance, EconomyResponse.ResponseType.FAILURE, "Insufficient funds"
);
}
currency().modifyCachedBalance(player.getUniqueId(), PRIMARY_CURRENCY, -amount);
long deltaCents = (long) (-amount * 100);
currency().ModifyPlayerCurrency(
deltaCents,
player.getUniqueId(),
UUID.randomUUID().toString(),
PRIMARY_CURRENCY,
"Plugin Withdraw"
);
return new EconomyResponse(
amount, balance - amount, EconomyResponse.ResponseType.SUCCESS, null
);
}
@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);
}
// --- 核心:存款 (Deposit) ---
@Override
public EconomyResponse depositPlayer(String playerName, double amount) {
return depositPlayer(Bukkit.getOfflinePlayer(playerName), amount);
}
@Override
public EconomyResponse depositPlayer(OfflinePlayer player, double amount) {
if (amount < 0) {
return new EconomyResponse(
0, 0, EconomyResponse.ResponseType.FAILURE, "Cannot deposit negative funds"
);
}
currency().modifyCachedBalance(player.getUniqueId(), PRIMARY_CURRENCY, amount);
long deltaCents = (long) (amount * 100);
currency().ModifyPlayerCurrency(
deltaCents,
player.getUniqueId(),
UUID.randomUUID().toString(),
PRIMARY_CURRENCY,
"Plugin Deposit"
);
return new EconomyResponse(
amount, getBalance(player), EconomyResponse.ResponseType.SUCCESS, null
);
}
@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);
}
// --- 银行功能 (不支持) ---
@Override
public EconomyResponse createBank(String name, String player) {
return new EconomyResponse(
0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "Banks not supported"
);
}
@Override
public EconomyResponse deleteBank(String name) {
return new EconomyResponse(
0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "Banks not supported"
);
}
@Override
public EconomyResponse bankBalance(String name) {
return new EconomyResponse(
0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "Banks not supported"
);
}
@Override
public EconomyResponse bankHas(String name, double amount) {
return new EconomyResponse(
0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "Banks not supported"
);
}
@Override
public EconomyResponse bankWithdraw(String name, double amount) {
return new EconomyResponse(
0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "Banks not supported"
);
}
@Override
public EconomyResponse bankDeposit(String name, double amount) {
return new EconomyResponse(
0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "Banks not supported"
);
}
@Override
public EconomyResponse isBankOwner(String name, String playerName) {
return new EconomyResponse(
0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "Banks not supported"
);
}
@Override
public EconomyResponse isBankMember(String name, String playerName) {
return new EconomyResponse(
0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "Banks not supported"
);
}
@Override
public List<String> getBanks() {
return Collections.emptyList();
}
@Override
public boolean createPlayerAccount(String playerName) {
return true;
}
@Override
public boolean createPlayerAccount(String playerName, String worldName) {
return true;
}
}

View File

@@ -0,0 +1,46 @@
package online.mineroo.paper.listeners;
import java.util.UUID;
import online.mineroo.paper.MinerooCore;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
public class PlayerCurrencyListener implements Listener {
private final MinerooCore plugin;
public PlayerCurrencyListener(MinerooCore plugin) {
this.plugin = plugin;
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
UUID uuid = event.getPlayer().getUniqueId();
plugin.getRequestClient().currency().unloadPlayer(uuid);
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
String currency_slug = plugin.getConfigObject().getCurrencies().getPrimary();
plugin.getRequestClient()
.currency()
.LoadPlayerCurrency(uuid, currency_slug)
.thenAccept(resp -> {
if (resp.getSlug().equals(currency_slug)) {
plugin.getLogger().info(
"Synced balance for " + player.getName() + " [" + resp.getSlug() + " : "
+ resp.getAmount() + "]"
);
} else {
plugin.getLogger().warning("Failed to sync balance for " + player.getName());
}
});
}
}

View File

@@ -12,6 +12,10 @@ server:
port: 0
token: "get token from `mineroo.online/resources/servers` page!"
currencies:
# which currency slug should bound into `VaultApi`
primary: "money"
players:
# for player bind
bind:

View File

@@ -10,3 +10,6 @@ dependencies:
PlaceholderAPI:
load: BEFORE
required: false
Vault:
load: BEFORE
required: false

View File

@@ -6,7 +6,7 @@ author: YuKun Liu
website: https://mineroo.online
description: Mineroo Base Plugin
api-version: "1.21.10"
softdepend: ["PlaceholderAPI"]
softdepend: ["PlaceholderAPI", "Vault"]
permissions:
mineroo.admin.reload:
description: "Reload plugin config files."