Initial commit: EssentialsC v1.1.0

This commit is contained in:
Coldsmile_7
2026-04-14 04:39:29 +08:00
commit 093781ea68
29 changed files with 1489 additions and 0 deletions

View File

@@ -0,0 +1,128 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
public class AdminMenuCommand extends BaseCommand implements Listener {
private static final int MENU_SIZE = 27;
public AdminMenuCommand() {
super("essentialsc.command.admin");
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
@Override
protected boolean execute(@NotNull Player player, String[] args) {
openMenu(player);
return true;
}
private void openMenu(Player player) {
String title = getLang().getString("admin-menu-title");
Inventory menu = Bukkit.createInventory(null, MENU_SIZE, title);
// 时间控制
addItem(menu, 10, Material.CLOCK, getLang().getString("admin-time-control"),
Arrays.asList("§7左键: 设为白天", "§7右键: 设为夜晚"));
addItem(menu, 11, Material.SUNFLOWER, getLang().getString("admin-weather-control"),
Arrays.asList("§7左键: 晴天", "§7右键: 雨天"));
// 状态恢复
addItem(menu, 13, Material.GOLDEN_APPLE, getLang().getString("admin-heal-self"),
Arrays.asList("§7补满生命值和饱食度"));
addItem(menu, 14, Material.BREAD, getLang().getString("admin-feed-self"),
Arrays.asList("§7补满饱食度"));
addItem(menu, 15, Material.ANVIL, getLang().getString("admin-repair-hand"),
Arrays.asList("§7修复当前手持物品"));
// 管理员功能
addItem(menu, 21, Material.ENDER_PEARL, getLang().getString("admin-vanish"),
Arrays.asList("§7点击切换隐身状态"));
addItem(menu, 22, Material.BOOK, getLang().getString("admin-reload"),
Arrays.asList("§7重新加载配置文件"));
player.openInventory(menu);
}
private void addItem(Inventory inv, int slot, Material material, String name, java.util.List<String> lore) {
ItemStack item = new ItemStack(material);
ItemMeta meta = item.getItemMeta();
if (meta != null) {
meta.setDisplayName(name);
meta.setLore(lore);
item.setItemMeta(meta);
}
inv.setItem(slot, item);
}
@EventHandler
public void onMenuClick(InventoryClickEvent event) {
String title = getLang().getString("admin-menu-title");
if (!event.getView().getTitle().equals(title)) return;
if (!(event.getWhoClicked() instanceof Player player)) return;
event.setCancelled(true);
ItemStack clicked = event.getCurrentItem();
if (clicked == null || !clicked.hasItemMeta()) return;
String name = clicked.getItemMeta().getDisplayName();
String timeControl = getLang().getString("admin-time-control");
String weatherControl = getLang().getString("admin-weather-control");
String healSelf = getLang().getString("admin-heal-self");
String feedSelf = getLang().getString("admin-feed-self");
String repairHand = getLang().getString("admin-repair-hand");
String vanish = getLang().getString("admin-vanish");
String reload = getLang().getString("admin-reload");
switch (name) {
case String t when t.equals(timeControl) -> {
if (event.isLeftClick()) player.getWorld().setTime(1000);
else player.getWorld().setTime(13000);
player.sendMessage(getLang().getString("admin-time-set"));
}
case String w when w.equals(weatherControl) -> {
if (event.isLeftClick()) player.getWorld().setStorm(false);
else player.getWorld().setStorm(true);
player.sendMessage(getLang().getString("admin-weather-set"));
}
case String h when h.equals(healSelf) -> {
player.setHealth(player.getMaxHealth());
player.setFoodLevel(20);
player.sendMessage(getLang().getString("admin-heal-success"));
}
case String f when f.equals(feedSelf) -> {
player.setFoodLevel(20);
player.setSaturation(20f);
player.sendMessage(getLang().getString("admin-feed-success"));
}
case String r when r.equals(repairHand) -> {
var item = player.getInventory().getItemInMainHand();
if (item.getItemMeta() instanceof org.bukkit.inventory.meta.Damageable d) {
d.setDamage(0);
item.setItemMeta((org.bukkit.inventory.meta.ItemMeta) d);
player.sendMessage(getLang().getString("admin-repair-success"));
}
}
case String v when v.equals(vanish) -> {
new VanishCommand().execute(player, new String[]{});
openMenu(player); // 刷新菜单
}
case String rl when rl.equals(reload) -> {
plugin.reloadConfig();
player.sendMessage(getLang().getString("admin-reload-success"));
}
default -> {} // 忽略其他点击
}
}
}

View File

@@ -0,0 +1,17 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
public class AnvilCommand extends BaseCommand {
public AnvilCommand() {
super("essentialsc.command.anvil");
}
@Override
protected boolean execute(Player player, String[] args) {
player.openAnvil(null, true);
player.sendMessage(getLang().getString("anvil-opened"));
return true;
}
}

View File

@@ -0,0 +1,52 @@
package cn.infstar.essentialsC.commands;
import cn.infstar.essentialsC.EssentialsC;
import cn.infstar.essentialsC.LangManager;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public abstract class BaseCommand implements CommandExecutor {
protected String permission;
protected static cn.infstar.essentialsC.EssentialsC plugin;
public BaseCommand(String permission) {
this.permission = permission;
if (plugin == null) {
plugin = cn.infstar.essentialsC.EssentialsC.getPlugin(cn.infstar.essentialsC.EssentialsC.class);
}
}
public String getPermission() {
return permission;
}
/**
* 获取语言管理器
*/
protected LangManager getLang() {
return EssentialsC.getLangManager();
}
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, String[] args) {
if (!(sender instanceof Player player)) {
sender.sendMessage(getLang().getString("messages.player-only"));
return true;
}
if (!player.hasPermission(permission)) {
String message = getLang().getString("messages.no-permission",
java.util.Map.of("permission", permission));
player.sendMessage(message);
return true;
}
return execute(player, args);
}
protected abstract boolean execute(Player player, String[] args);
}

View File

@@ -0,0 +1,17 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
public class CartographyTableCommand extends BaseCommand {
public CartographyTableCommand() {
super("essentialsc.command.cartographytable");
}
@Override
protected boolean execute(Player player, String[] args) {
// 使用 Paper API 打开制图台(标题跟随客户端语言)
player.openCartographyTable(null, true);
return true;
}
}

View File

@@ -0,0 +1,17 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
public class EnchantingTableCommand extends BaseCommand {
public EnchantingTableCommand() {
super("essentialsc.command.enchantingtable");
}
@Override
protected boolean execute(Player player, String[] args) {
player.openEnchanting(null, true);
player.sendMessage(getLang().getString("enchantingtable-opened"));
return true;
}
}

View File

@@ -0,0 +1,17 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
public class EnderChestCommand extends BaseCommand {
public EnderChestCommand() {
super("essentialsc.command.enderchest");
}
@Override
protected boolean execute(Player player, String[] args) {
// 打开玩家的末影箱(标题由客户端决定)
player.openInventory(player.getEnderChest());
return true;
}
}

View File

@@ -0,0 +1,45 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
public class FeedCommand extends BaseCommand {
public FeedCommand() {
super("essentialsc.command.feed");
}
@Override
protected boolean execute(@NotNull Player player, String[] args) {
if (args.length == 0) {
// 喂饱自己
feedPlayer(player);
player.sendMessage(getLang().getString("messages.feed-self"));
} else {
// 检查是否有喂饱他人的权限
if (!player.hasPermission("essentialsc.command.feed.others")) {
player.sendMessage(getLang().getString("messages.no-permission-others"));
return true;
}
Player target = Bukkit.getPlayer(args[0]);
if (target == null) {
player.sendMessage(getLang().getString("messages.player-not-found", Map.of("player", args[0])));
return true;
}
feedPlayer(target);
player.sendMessage(getLang().getString("messages.feed-other", Map.of("player", target.getName())));
target.sendMessage(getLang().getString("messages.feed-by-other", Map.of("admin", player.getName())));
}
return true;
}
private void feedPlayer(Player player) {
player.setFoodLevel(20);
player.setSaturation(20f);
}
}

View File

@@ -0,0 +1,27 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
public class FlyCommand extends BaseCommand {
public FlyCommand() {
super("essentialsc.command.fly");
}
@Override
protected boolean execute(Player player, String[] args) {
boolean currentFlyState = player.getAllowFlight();
if (currentFlyState) {
player.setAllowFlight(false);
player.setFlying(false);
player.sendMessage(getLang().getString("messages.fly-disabled"));
} else {
player.setAllowFlight(true);
player.setFlying(true);
player.sendMessage(getLang().getString("messages.fly-enabled"));
}
return true;
}
}

View File

@@ -0,0 +1,17 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
public class GrindstoneCommand extends BaseCommand {
public GrindstoneCommand() {
super("essentialsc.command.grindstone");
}
@Override
protected boolean execute(Player player, String[] args) {
// 使用 Paper API 打开砂轮(标题跟随客户端语言)
player.openGrindstone(null, true);
return true;
}
}

View File

@@ -0,0 +1,42 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.Map;
public class HatCommand extends BaseCommand {
public HatCommand() {
super("essentialsc.command.hat");
}
@Override
protected boolean execute(Player player, String[] args) {
ItemStack handItem = player.getInventory().getItemInMainHand();
if (handItem == null || handItem.isEmpty()) {
player.sendMessage(getLang().getString("messages.hat-no-item"));
return true;
}
ItemStack helmet = player.getInventory().getHelmet();
// 如果头盔栏有物品,先放回背包
if (helmet != null && !helmet.isEmpty()) {
player.getInventory().setHelmet(handItem);
player.getInventory().setItemInMainHand(helmet);
} else {
player.getInventory().setHelmet(handItem);
player.getInventory().setItemInMainHand(null);
}
player.updateInventory();
String itemName = handItem.getType().toString();
String message = getLang().getString("messages.hat-success",
Map.of("item", itemName));
player.sendMessage(message);
return true;
}
}

View File

@@ -0,0 +1,48 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
public class HealCommand extends BaseCommand {
public HealCommand() {
super("essentialsc.command.heal");
}
@Override
protected boolean execute(@NotNull Player player, String[] args) {
if (args.length == 0) {
// 治疗自己
healPlayer(player);
player.sendMessage(getLang().getString("messages.heal-self"));
} else {
// 检查是否有治疗他人的权限
if (!player.hasPermission("essentialsc.command.heal.others")) {
player.sendMessage(getLang().getString("messages.no-permission-others"));
return true;
}
Player target = Bukkit.getPlayer(args[0]);
if (target == null) {
player.sendMessage(getLang().getString("messages.player-not-found", Map.of("player", args[0])));
return true;
}
healPlayer(target);
player.sendMessage(getLang().getString("messages.heal-other", Map.of("player", target.getName())));
target.sendMessage(getLang().getString("messages.heal-by-other", Map.of("admin", player.getName())));
}
return true;
}
private void healPlayer(Player player) {
player.setHealth(player.getMaxHealth());
player.setFoodLevel(20);
player.setSaturation(20f);
player.clearActivePotionEffects();
player.setFireTicks(0);
}
}

View File

@@ -0,0 +1,113 @@
package cn.infstar.essentialsC.commands;
import cn.infstar.essentialsC.EssentialsC;
import cn.infstar.essentialsC.LangManager;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
public class HelpCommand extends BaseCommand {
public HelpCommand() {
super("essentialsc.command.help");
}
@Override
protected boolean execute(@NotNull Player player, String[] args) {
LangManager lang = getLang();
String version = plugin.getDescription().getVersion();
player.sendMessage(lang.getString("help.title"));
player.sendMessage(lang.getString("help.version",
java.util.Map.of("version", version)));
player.sendMessage("");
// 功能方块命令(检查权限后显示)
boolean hasBlockCommands = false;
StringBuilder blockCommands = new StringBuilder();
if (player.hasPermission("essentialsc.command.workbench")) {
blockCommands.append(lang.getString("help.commands.workbench")).append("\n");
hasBlockCommands = true;
}
if (player.hasPermission("essentialsc.command.anvil")) {
blockCommands.append(lang.getString("help.commands.anvil")).append("\n");
hasBlockCommands = true;
}
if (player.hasPermission("essentialsc.command.enchantingtable")) {
blockCommands.append(lang.getString("help.commands.enchantingtable")).append("\n");
hasBlockCommands = true;
}
if (player.hasPermission("essentialsc.command.cartographytable")) {
blockCommands.append(lang.getString("help.commands.cartographytable")).append("\n");
hasBlockCommands = true;
}
if (player.hasPermission("essentialsc.command.grindstone")) {
blockCommands.append(lang.getString("help.commands.grindstone")).append("\n");
hasBlockCommands = true;
}
if (player.hasPermission("essentialsc.command.loom")) {
blockCommands.append(lang.getString("help.commands.loom")).append("\n");
hasBlockCommands = true;
}
if (player.hasPermission("essentialsc.command.smithingtable")) {
blockCommands.append(lang.getString("help.commands.smithingtable")).append("\n");
hasBlockCommands = true;
}
if (player.hasPermission("essentialsc.command.stonecutter")) {
blockCommands.append(lang.getString("help.commands.stonecutter")).append("\n");
hasBlockCommands = true;
}
if (player.hasPermission("essentialsc.command.enderchest")) {
blockCommands.append(lang.getString("help.commands.enderchest")).append("\n");
hasBlockCommands = true;
}
if (hasBlockCommands) {
player.sendMessage(lang.getString("help.section-blocks"));
player.sendMessage(blockCommands.toString().trim());
player.sendMessage("");
}
// 其他命令(检查权限后显示)
boolean hasOtherCommands = false;
StringBuilder otherCommands = new StringBuilder();
if (player.hasPermission("essentialsc.command.hat")) {
otherCommands.append(lang.getString("help.commands.hat")).append("\n");
hasOtherCommands = true;
}
if (player.hasPermission("essentialsc.command.suicide")) {
otherCommands.append(lang.getString("help.commands.suicide")).append("\n");
hasOtherCommands = true;
}
if (player.hasPermission("essentialsc.command.fly")) {
otherCommands.append(lang.getString("help.commands.fly")).append("\n");
hasOtherCommands = true;
}
if (player.hasPermission("essentialsc.command.heal")) {
otherCommands.append(lang.getString("help.commands.heal")).append("\n");
hasOtherCommands = true;
}
if (player.hasPermission("essentialsc.command.vanish")) {
otherCommands.append(lang.getString("help.commands.vanish")).append("\n");
hasOtherCommands = true;
}
if (player.hasPermission("essentialsc.command.seen")) {
otherCommands.append(lang.getString("help.commands.seen")).append("\n");
hasOtherCommands = true;
}
if (player.hasPermission("essentialsc.command.admin")) {
otherCommands.append(lang.getString("help.commands.admin")).append("\n");
hasOtherCommands = true;
}
if (hasOtherCommands) {
player.sendMessage(lang.getString("help.section-other"));
player.sendMessage(otherCommands.toString().trim());
player.sendMessage("");
}
player.sendMessage(lang.getString("help.footer"));
return true;
}
}

View File

@@ -0,0 +1,17 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
public class LoomCommand extends BaseCommand {
public LoomCommand() {
super("essentialsc.command.loom");
}
@Override
protected boolean execute(Player player, String[] args) {
// 使用 Paper API 打开织布机(标题跟随客户端语言)
player.openLoom(null, true);
return true;
}
}

View File

@@ -0,0 +1,20 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class PaperCommand extends Command {
private final BaseCommand baseCommand;
public PaperCommand(String name, BaseCommand baseCommand) {
super(name);
this.baseCommand = baseCommand;
this.setPermission(baseCommand.permission);
}
@Override
public boolean execute(CommandSender sender, String commandLabel, String[] args) {
return baseCommand.onCommand(sender, this, commandLabel, args);
}
}

View File

@@ -0,0 +1,83 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.Damageable;
import org.jetbrains.annotations.NotNull;
public class RepairCommand extends BaseCommand {
public RepairCommand() {
super("essentialsc.command.repair");
}
@Override
protected boolean execute(@NotNull Player player, String[] args) {
if (args.length > 0 && args[0].equalsIgnoreCase("all")) {
// 检查是否有修复全部的权限
if (!player.hasPermission("essentialsc.command.repair.all")) {
player.sendMessage(getLang().getString("messages.no-permission-repair-all"));
return true;
}
int repairedCount = repairAll(player);
if (repairedCount > 0) {
player.sendMessage(getLang().getString("messages.repair-all-success", java.util.Map.of("count", String.valueOf(repairedCount))));
} else {
player.sendMessage(getLang().getString("messages.repair-no-items"));
}
} else {
// 修复手中物品
ItemStack item = player.getInventory().getItemInMainHand();
if (item == null || item.getType().isAir()) {
player.sendMessage(getLang().getString("messages.repair-no-item-in-hand"));
return true;
}
if (repairItem(item)) {
player.sendMessage(getLang().getString("messages.repair-hand-success"));
} else {
player.sendMessage(getLang().getString("messages.repair-not-damaged"));
}
}
return true;
}
private boolean repairItem(ItemStack item) {
if (item.getItemMeta() instanceof Damageable damageable) {
if (damageable.hasDamage()) {
Damageable newMeta = (Damageable) damageable.clone();
newMeta.setDamage(0);
item.setItemMeta((org.bukkit.inventory.meta.ItemMeta) newMeta);
return true;
}
}
return false;
}
private int repairAll(Player player) {
int count = 0;
ItemStack[] contents = player.getInventory().getContents();
for (ItemStack item : contents) {
if (item != null && !item.getType().isAir()) {
if (repairItem(item)) {
count++;
}
}
}
// 也修复盔甲栏
ItemStack[] armor = player.getInventory().getArmorContents();
for (ItemStack item : armor) {
if (item != null && !item.getType().isAir()) {
if (repairItem(item)) {
count++;
}
}
}
player.updateInventory();
return count;
}
}

View File

@@ -0,0 +1,56 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
public class SeenCommand extends BaseCommand {
public SeenCommand() {
super("essentialsc.command.seen");
}
@Override
protected boolean execute(@NotNull Player player, String[] args) {
if (args.length == 0) {
player.sendMessage(getLang().getString("messages.seen-usage"));
return true;
}
OfflinePlayer target = Bukkit.getOfflinePlayer(args[0]);
if (!target.hasPlayedBefore() && !target.isOnline()) {
player.sendMessage(getLang().getString("messages.player-not-found", Map.of("player", args[0])));
return true;
}
StringBuilder info = new StringBuilder();
info.append("§6========== §e玩家信息 §6==========\n");
info.append("§7玩家名称: §f").append(target.getName()).append("\n");
if (target.isOnline()) {
info.append("§7状态: §a在线\n");
Player onlinePlayer = target.getPlayer();
if (onlinePlayer != null) {
info.append("§7所在世界: §f").append(onlinePlayer.getWorld().getName()).append("\n");
}
} else {
info.append("§7状态: §c离线\n");
long lastSeen = target.getLastSeen();
if (lastSeen > 0) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
info.append("§7最后上线: §f").append(sdf.format(new Date(lastSeen))).append("\n");
}
}
info.append("§7首次加入: §f").append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(target.getFirstPlayed()))).append("\n");
info.append("§6=============================");
player.sendMessage(info.toString());
return true;
}
}

View File

@@ -0,0 +1,17 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
public class SmithingTableCommand extends BaseCommand {
public SmithingTableCommand() {
super("essentialsc.command.smithingtable");
}
@Override
protected boolean execute(Player player, String[] args) {
// 使用 Paper API 打开锻造台(标题跟随客户端语言)
player.openSmithingTable(null, true);
return true;
}
}

View File

@@ -0,0 +1,17 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
public class StonecutterCommand extends BaseCommand {
public StonecutterCommand() {
super("essentialsc.command.stonecutter");
}
@Override
protected boolean execute(Player player, String[] args) {
// 使用 Paper API 打开切石机(标题跟随客户端语言)
player.openStonecutter(null, true);
return true;
}
}

View File

@@ -0,0 +1,21 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
import java.util.Map;
public class SuicideCommand extends BaseCommand {
public SuicideCommand() {
super("essentialsc.command.suicide");
}
@Override
protected boolean execute(Player player, String[] args) {
String message = getLang().getString("messages.suicide-message",
Map.of("player", player.getName()));
player.setHealth(0);
// 消息会在玩家死亡后显示,所以这里不发送
return true;
}
}

View File

@@ -0,0 +1,55 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
public class VanishCommand extends BaseCommand {
private static final Set<UUID> vanishedPlayers = new HashSet<>();
public VanishCommand() {
super("essentialsc.command.vanish");
}
@Override
protected boolean execute(@NotNull Player player, String[] args) {
UUID uuid = player.getUniqueId();
if (vanishedPlayers.contains(uuid)) {
// 取消隐身
vanishedPlayers.remove(uuid);
showPlayerToAll(player);
player.sendMessage(getLang().getString("messages.vanish-disabled"));
} else {
// 开启隐身
vanishedPlayers.add(uuid);
hidePlayerFromAll(player);
player.sendMessage(getLang().getString("messages.vanish-enabled"));
}
return true;
}
private void hidePlayerFromAll(Player player) {
for (Player online : player.getServer().getOnlinePlayers()) {
if (online != player) {
online.hidePlayer(plugin, player);
}
}
}
private void showPlayerToAll(Player player) {
for (Player online : player.getServer().getOnlinePlayers()) {
if (online != player) {
online.showPlayer(plugin, player);
}
}
}
public static boolean isVanished(Player player) {
return vanishedPlayers.contains(player.getUniqueId());
}
}

View File

@@ -0,0 +1,17 @@
package cn.infstar.essentialsC.commands;
import org.bukkit.entity.Player;
public class WorkbenchCommand extends BaseCommand {
public WorkbenchCommand() {
super("essentialsc.command.workbench");
}
@Override
protected boolean execute(Player player, String[] args) {
// 打开工作台(标题由客户端语言决定)
player.openWorkbench(null, true);
return true;
}
}