Server Essentials

最好的 All in One Minecraft 服务器插件,添加了: - RTP GUI - 家庭系统 - TPA 系统 - 拍卖行 - 商店 - 管理员命令 - 等级 - 更好的加入/离开信息 - 传送门系统 - 抛硬币系统 - 易于自定义的计分板

资源图片
# 服务器精 Essentials – 新时代的 Minecraft 插件 **一个完全开源的 Minecraft 插件,包含您所需的一切。** ------------------------------------------------------------------------------------------------------------------------ # 依赖 ## [Vault](https://www.spigotmc.org/resources/vault.34315/) | [Luckperms](https://luckperms.net/download) | [PlaceholderAPI](https://www.spigotmc.org/resources/placeholderapi.6245/) ------------------------------------------------------------------------------------------------------------------------- ## 统计 | 服务器 / 玩家 ![bStats 图表](https://bstats.org/signatures/bukkit/ServerEssentials%20v2.svg) _______________________________________________________________________________________________________________ # 特性 ________________________________________________________________________________________________________________________ - ### 全面的 *经济* 系统 ( 使用 [Vault](https://www.spigotmc.org/resources/vault.34315/) ) - ### 最大化的 *积分板* 系统 - ### 每一个 *QoL* 指令,例如 `spawn`、`rtp`、`shop` 以及更多更多... - ### 超过 20+ *管理员* 指令来管理服务器 ( `vanish`、`ban`、`mute`、... ) - ### 100% 可定制性
(示例) 消息配置: rename: usage: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#cc0000> 用法: /rename <名称>" no-item: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#cc0000> 您没有持有任何物品。" no-meta: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#cc0000> 无法获取物品元数据。" renamed: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#ffffff> 物品已重命名为: {item}" setlore: usage: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#cc0000> 用法: /setloreline <文本>" no-player: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#cc0000> 只有玩家可以使用此命令。" no-item: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#cc0000> 您没有持有任何物品。" lore-set: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#ffffff> Lore 设置为: {lore}" Kill: only-players: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#cc0000> 只有玩家可以使用此命令。" kill-count: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#ffffff> 您有 {kills} 玩家 击杀。" Rules: no-permission: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#cc0000> 您没有权限执行此操作。" reloaded: "<#2971FF>[<#7AA7FF>玩家<#2971FF]<#ffffff> 规则已重新加载。" header: ">---- 服务器规则 ----<" rule-line: "{rule}"
经济管理器 public static void loadBalances(File dataFolder) { File storageFolder = new File(dataFolder, "storage"); if (!storageFolder.exists()) { storageFolder.mkdirs(); } file = new File(storageFolder, "balances.yml"); if (!file.exists()) { try { file.createNewFile(); Bukkit.getLogger().info("[EconomyManager] 创建了新的 storage/balances.yml 文件。"); } catch (IOException e) { e.printStackTrace(); } } config = YamlConfiguration.loadConfiguration(file); for (String key : config.getKeys(false)) { try { UUID uuid = UUID.fromString(key); double balance = config.getDouble(key); balances.put(uuid, balance); } catch (IllegalArgumentException ignored) { Bukkit.getLogger().warning("[EconomyManager] balances.yml 中无效的 UUID: " + key); } } } public static void saveBalances() { if (config == null || file == null) return; for (Map.Entry entry : balances.entrySet()) { config.set(entry.getKey().toString(), entry.getValue()); } try { config.save(file); } catch (IOException e) { e.printStackTrace(); } } private double get(UUID uuid) { return balances.getOrDefault(uuid, 0.0); } private void set(UUID uuid, double amount) { balances.put(uuid, amount); saveBalances(); } private void add(UUID uuid, double amount) { set(uuid, get(uuid) + amount); } private void take(UUID uuid, double amount) { set(uuid, Math.max(0, get(uuid) - amount)); } @Override public boolean isEnabled() { return true; } @Override public String getName() { return "ServerEssentialsEconomy"; } @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 s) { return false; } @Override public boolean hasAccount(OfflinePlayer player) { return true; } @Override public boolean hasAccount(String s, String s1) { return false; } @Override public boolean hasAccount(OfflinePlayer offlinePlayer, String s) { return false; } @Override public double getBalance(String s) { return 0; } @Override public double getBalance(OfflinePlayer player) { return get(player.getUniqueId()); } @Override public double getBalance(String s, String s1) { return 0; } @Override public double getBalance(OfflinePlayer offlinePlayer, String s) { return 0; } @Override public boolean has(String s, double v) { return false; } @Override public boolean has(OfflinePlayer player, double amount) { return get(player.getUniqueId()) >= amount; } @Override public boolean has(String s, String s1, double v) { return false; } @Override public boolean has(OfflinePlayer offlinePlayer, String s, double v) { return false; } @Override public EconomyResponse withdrawPlayer(String s, double v) { return null; } @Override public EconomyResponse withdrawPlayer(OfflinePlayer player, double amount) { if (amount < 0) return new EconomyResponse(0, get(player.getUniqueId()), EconomyResponse.ResponseType.FAILURE, "无法取出负数资金"); if (!has(player, amount)) return new EconomyResponse(0, get(player.getUniqueId()), EconomyResponse.ResponseType.FAILURE, "资金不足"); take(player.getUniqueId(), amount); return new EconomyResponse(amount, get(player.getUniqueId()), EconomyResponse.ResponseType.SUCCESS, null); } @Override public EconomyResponse withdrawPlayer(String s, String s1, double v) { return null; } @Override public EconomyResponse withdrawPlayer(OfflinePlayer offlinePlayer, String s, double v) { return null; } @Override public EconomyResponse depositPlayer(String s, double v) { return null; } @Override public EconomyResponse depositPlayer(OfflinePlayer player, double amount) { if (amount < 0) return new EconomyResponse(0, get(player.getUniqueId()), EconomyResponse.ResponseType.FAILURE, "无法存款负数资金"); add(player.getUniqueId(), amount); return new EconomyResponse(amount, get(player.getUniqueId()), EconomyResponse.ResponseType.SUCCESS, null); } @Override public EconomyResponse depositPlayer(String s, String s1, double v) { return null; } @Override public EconomyResponse depositPlayer(OfflinePlayer offlinePlayer, String s, double v) { return null; } @Override public boolean createPlayerAccount(OfflinePlayer player) { if (!balances.containsKey(player.getUniqueId())) { set(player.getUniqueId(), 0.0); } return true; } @Override public boolean createPlayerAccount(String s, String s1) { return false; } @Override public boolean createPlayerAccount(OfflinePlayer offlinePlayer, String s) { return false; } @Override public EconomyResponse createBank(String name, String player) { return notSupported(); } @Override public EconomyResponse createBank(String s, OfflinePlayer offlinePlayer) { return null; } @Override public EconomyResponse deleteBank(String name) { return notSupported(); } @Override public EconomyResponse bankBalance(String name) { return notSupported(); } @Override public EconomyResponse bankHas(String name, double amount) { return notSupported(); } @Override public EconomyResponse bankWithdraw(String name, double amount) { return notSupported(); } @Override public EconomyResponse bankDeposit(String name, double amount) { return notSupported(); } @Override public EconomyResponse isBankOwner(String name, String playerName) { return notSupported(); } @Override public EconomyResponse isBankOwner(String s, OfflinePlayer offlinePlayer) { return null; } @Override public EconomyResponse isBankMember(String name, String playerName) { return notSupported(); } @Override public EconomyResponse isBankMember(String s, OfflinePlayer offlinePlayer) { return null; } @Override public List getBanks() { return List.of(); } @Override public boolean createPlayerAccount(String s) { return false; } private EconomyResponse notSupported() { return new EconomyResponse(0, 0, EconomyResponse.ResponseType.NOT_IMPLEMENTED, "银行功能未受支持"); } }
-------------------------------------------------------------------------------------------------------------------- ## 插件代码
--------------------------------------------------------------------------------------------------------------------------- ## ⚙ 安装 1. 从 [Modrinth](https://modrinth.com/) 或 GitHub 下载最新的 `.jar` 文件。 2. 将其放置在您的 `plugins` 文件夹中。 3. 重新启动您的服务器。 4. 尽情享受吧! ---------------------------------------------------------------------------------------------------------------- ## 💬 支持与社区
Join Discord
--------------------------------------------------------------------------------------------------------------- ## ✅ 为什么选择服务器精 Essentials? - 轻量级、高效且完全可配置 - 积极维护和开源 - 高度可定制的消息、权限和世界支持 - 友好的开发者社区和持续的支持