From 093781ea68d7f5ff66976d5e84754ea63786a4c9 Mon Sep 17 00:00:00 2001 From: Coldsmile_7 Date: Tue, 14 Apr 2026 04:39:29 +0800 Subject: [PATCH] Initial commit: EssentialsC v1.1.0 --- .gitignore | 72 ++++++++++ pom.xml | 103 ++++++++++++++ .../cn/infstar/essentialsC/EssentialsC.java | 89 ++++++++++++ .../cn/infstar/essentialsC/LangManager.java | 128 ++++++++++++++++++ .../commands/AdminMenuCommand.java | 128 ++++++++++++++++++ .../essentialsC/commands/AnvilCommand.java | 17 +++ .../essentialsC/commands/BaseCommand.java | 52 +++++++ .../commands/CartographyTableCommand.java | 17 +++ .../commands/EnchantingTableCommand.java | 17 +++ .../commands/EnderChestCommand.java | 17 +++ .../essentialsC/commands/FeedCommand.java | 45 ++++++ .../essentialsC/commands/FlyCommand.java | 27 ++++ .../commands/GrindstoneCommand.java | 17 +++ .../essentialsC/commands/HatCommand.java | 42 ++++++ .../essentialsC/commands/HealCommand.java | 48 +++++++ .../essentialsC/commands/HelpCommand.java | 113 ++++++++++++++++ .../essentialsC/commands/LoomCommand.java | 17 +++ .../essentialsC/commands/PaperCommand.java | 20 +++ .../essentialsC/commands/RepairCommand.java | 83 ++++++++++++ .../essentialsC/commands/SeenCommand.java | 56 ++++++++ .../commands/SmithingTableCommand.java | 17 +++ .../commands/StonecutterCommand.java | 17 +++ .../essentialsC/commands/SuicideCommand.java | 21 +++ .../essentialsC/commands/VanishCommand.java | 55 ++++++++ .../commands/WorkbenchCommand.java | 17 +++ src/main/resources/config.yml | 14 ++ src/main/resources/lang/en_US.yml | 74 ++++++++++ src/main/resources/lang/zh_CN.yml | 74 ++++++++++ src/main/resources/paper-plugin.yml | 92 +++++++++++++ 29 files changed, 1489 insertions(+) create mode 100644 .gitignore create mode 100644 pom.xml create mode 100644 src/main/java/cn/infstar/essentialsC/EssentialsC.java create mode 100644 src/main/java/cn/infstar/essentialsC/LangManager.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/AdminMenuCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/AnvilCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/BaseCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/CartographyTableCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/EnchantingTableCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/EnderChestCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/FeedCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/FlyCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/GrindstoneCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/HatCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/HealCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/HelpCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/LoomCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/PaperCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/RepairCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/SeenCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/SmithingTableCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/StonecutterCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/SuicideCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/VanishCommand.java create mode 100644 src/main/java/cn/infstar/essentialsC/commands/WorkbenchCommand.java create mode 100644 src/main/resources/config.yml create mode 100644 src/main/resources/lang/en_US.yml create mode 100644 src/main/resources/lang/zh_CN.yml create mode 100644 src/main/resources/paper-plugin.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eaa96ec --- /dev/null +++ b/.gitignore @@ -0,0 +1,72 @@ +# Compiled class files +*.class + +# Log files +*.log + +# Package Files +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# Maven +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +.mvn/wrapper/maven-wrapper.jar + +# Gradle +.gradle/ +build/ +!gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +# IntelliJ IDEA +.idea/ +*.iws +*.iml +*.ipr +out/ + +# Eclipse +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +# NetBeans +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +# VS Code +.vscode/ + +# macOS +.DS_Store +Thumbs.db + +# Test server (不要上传测试服务器文件) +test-server/ + +# Plugin build output +*.jar.asc diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..7a7d72c --- /dev/null +++ b/pom.xml @@ -0,0 +1,103 @@ + + + 4.0.0 + + cn.infstar + essentialsc + 1.1.0 + jar + + essentialsc + + + 21 + UTF-8 + ${project.basedir}/test-server/plugins + + + + clean package + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.3 + + + package + + shade + + + + + + org.apache.maven.plugins + maven-antrun-plugin + 3.1.0 + + + copy-to-test-server + package + + + + + + + + + + + + + + run + + + + + + + + src/main/resources + true + + + + + + + + aliyunmaven + https://maven.aliyun.com/repository/public + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + + + + io.papermc.paper + paper-api + 1.21.11-R0.1-SNAPSHOT + provided + + + diff --git a/src/main/java/cn/infstar/essentialsC/EssentialsC.java b/src/main/java/cn/infstar/essentialsC/EssentialsC.java new file mode 100644 index 0000000..c5f0652 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/EssentialsC.java @@ -0,0 +1,89 @@ +package cn.infstar.essentialsC; + +import cn.infstar.essentialsC.commands.*; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.plugin.java.JavaPlugin; + +import java.lang.reflect.Field; + +public final class EssentialsC extends JavaPlugin { + + private static LangManager langManager; + + @Override + public void onEnable() { + // 初始化语言管理器 + langManager = new LangManager(this); + + registerCommands(); + getLogger().info("EssentialsC 插件已启用!"); + getLogger().info("当前语言: " + langManager.getCurrentLanguage()); + } + + @Override + public void onDisable() { + getLogger().info("EssentialsC 插件已禁用!"); + } + + /** + * 获取语言管理器实例 + */ + public static LangManager getLangManager() { + return langManager; + } + + private void registerCommands() { + try { + // 获取 CommandMap + Field bukkitCommandMap = Bukkit.getServer().getClass().getDeclaredField("commandMap"); + bukkitCommandMap.setAccessible(true); + org.bukkit.command.CommandMap commandMap = (org.bukkit.command.CommandMap) bukkitCommandMap.get(Bukkit.getServer()); + + // 注册所有命令 + registerCommand(commandMap, "workbench", new WorkbenchCommand()); + registerCommand(commandMap, "anvil", new AnvilCommand()); + registerCommand(commandMap, "enchantingtable", new EnchantingTableCommand()); + registerCommand(commandMap, "cartographytable", new CartographyTableCommand()); + registerCommand(commandMap, "grindstone", new GrindstoneCommand()); + registerCommand(commandMap, "loom", new LoomCommand()); + registerCommand(commandMap, "smithingtable", new SmithingTableCommand()); + registerCommand(commandMap, "stonecutter", new StonecutterCommand()); + registerCommand(commandMap, "enderchest", new EnderChestCommand()); + registerCommand(commandMap, "hat", new HatCommand()); + registerCommand(commandMap, "suicide", new SuicideCommand()); + registerCommand(commandMap, "fly", new FlyCommand()); + registerCommand(commandMap, "heal", new HealCommand()); + registerCommand(commandMap, "vanish", new VanishCommand()); + registerCommand(commandMap, "seen", new SeenCommand()); + registerCommand(commandMap, "admin", new AdminMenuCommand()); + registerCommand(commandMap, "feed", new FeedCommand()); + registerCommand(commandMap, "repair", new RepairCommand()); + registerCommand(commandMap, "essentialsc", new HelpCommand()); + + getLogger().info("成功注册 18 个命令!"); + } catch (Exception e) { + getLogger().severe("无法注册命令: " + e.getMessage()); + e.printStackTrace(); + } + } + + private void registerCommand(org.bukkit.command.CommandMap commandMap, String name, cn.infstar.essentialsC.commands.BaseCommand executor) { + Command command = new Command(name) { + @Override + public boolean execute(CommandSender sender, String commandLabel, String[] args) { + return executor.onCommand(sender, this, commandLabel, args); + } + }; + + // 为 essentialsc 命令添加简化别名 + if (name.equals("essentialsc")) { + command.setAliases(java.util.Arrays.asList("essc")); + } + + command.setPermission(executor.getPermission()); + // 注册到默认命名空间,使玩家可以直接使用 /workbench 而不是 /essentialsc:workbench + commandMap.register("", command); + } +} diff --git a/src/main/java/cn/infstar/essentialsC/LangManager.java b/src/main/java/cn/infstar/essentialsC/LangManager.java new file mode 100644 index 0000000..3d590b5 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/LangManager.java @@ -0,0 +1,128 @@ +package cn.infstar.essentialsC; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Map; + +public class LangManager { + + private final JavaPlugin plugin; + private FileConfiguration config; + private FileConfiguration langFile; + private String currentLanguage; + + public LangManager(JavaPlugin plugin) { + this.plugin = plugin; + loadConfig(); + loadLanguage(); + } + + private void loadConfig() { + File configFile = new File(plugin.getDataFolder(), "config.yml"); + + if (!configFile.exists()) { + plugin.saveResource("config.yml", false); + } + + config = YamlConfiguration.loadConfiguration(configFile); + + // 设置默认值 + config.addDefault("language", "zh_CN"); + config.addDefault("settings.enable-feedback", true); + config.addDefault("settings.message-prefix", "&6[EssentialsC] &r"); + config.options().copyDefaults(true); + + try { + config.save(configFile); + } catch (Exception e) { + plugin.getLogger().severe("无法保存配置文件: " + e.getMessage()); + } + } + + private void loadLanguage() { + currentLanguage = config.getString("language", "zh_CN"); + + File langFolder = new File(plugin.getDataFolder(), "lang"); + if (!langFolder.exists()) { + langFolder.mkdirs(); + } + + File langFileObj = new File(langFolder, currentLanguage + ".yml"); + + // 如果语言文件不存在,从资源中复制 + if (!langFileObj.exists()) { + InputStream inputStream = plugin.getResource("lang/" + currentLanguage + ".yml"); + if (inputStream != null) { + plugin.saveResource("lang/" + currentLanguage + ".yml", false); + } else { + plugin.getLogger().warning("未找到语言文件: " + currentLanguage + ".yml,使用默认语言 en_US"); + currentLanguage = "en_US"; + plugin.saveResource("lang/en_US.yml", false); + langFileObj = new File(langFolder, "en_US.yml"); + } + } + + langFile = YamlConfiguration.loadConfiguration(langFileObj); + + // 尝试加载默认语言作为后备 + if (!currentLanguage.equals("en_US")) { + InputStream defaultLangStream = plugin.getResource("lang/en_US.yml"); + if (defaultLangStream != null) { + YamlConfiguration defaultLang = YamlConfiguration.loadConfiguration( + new InputStreamReader(defaultLangStream, StandardCharsets.UTF_8) + ); + langFile.setDefaults(defaultLang); + } + } + } + + /** + * 获取翻译文本 + */ + public String getString(String path) { + String value = langFile.getString(path); + if (value == null) { + return "&cMissing translation: " + path; + } + return translateColorCodes(value); + } + + /** + * 获取翻译文本并替换占位符 + */ + public String getString(String path, Map placeholders) { + String value = getString(path); + for (Map.Entry entry : placeholders.entrySet()) { + value = value.replace("{" + entry.getKey() + "}", entry.getValue()); + } + return value; + } + + /** + * 重新加载配置和语言 + */ + public void reload() { + loadConfig(); + loadLanguage(); + } + + /** + * 获取当前语言 + */ + public String getCurrentLanguage() { + return currentLanguage; + } + + /** + * 翻译颜色代码 + */ + private String translateColorCodes(String text) { + return text.replace("&", "§"); + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/AdminMenuCommand.java b/src/main/java/cn/infstar/essentialsC/commands/AdminMenuCommand.java new file mode 100644 index 0000000..7955f68 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/AdminMenuCommand.java @@ -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 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 -> {} // 忽略其他点击 + } + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/AnvilCommand.java b/src/main/java/cn/infstar/essentialsC/commands/AnvilCommand.java new file mode 100644 index 0000000..07a2f5c --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/AnvilCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/BaseCommand.java b/src/main/java/cn/infstar/essentialsC/commands/BaseCommand.java new file mode 100644 index 0000000..51048e6 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/BaseCommand.java @@ -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); +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/CartographyTableCommand.java b/src/main/java/cn/infstar/essentialsC/commands/CartographyTableCommand.java new file mode 100644 index 0000000..626b829 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/CartographyTableCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/EnchantingTableCommand.java b/src/main/java/cn/infstar/essentialsC/commands/EnchantingTableCommand.java new file mode 100644 index 0000000..01cc2fd --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/EnchantingTableCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/EnderChestCommand.java b/src/main/java/cn/infstar/essentialsC/commands/EnderChestCommand.java new file mode 100644 index 0000000..b26562e --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/EnderChestCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/FeedCommand.java b/src/main/java/cn/infstar/essentialsC/commands/FeedCommand.java new file mode 100644 index 0000000..9253a6c --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/FeedCommand.java @@ -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); + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/FlyCommand.java b/src/main/java/cn/infstar/essentialsC/commands/FlyCommand.java new file mode 100644 index 0000000..87d4bf6 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/FlyCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/GrindstoneCommand.java b/src/main/java/cn/infstar/essentialsC/commands/GrindstoneCommand.java new file mode 100644 index 0000000..afd8af7 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/GrindstoneCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/HatCommand.java b/src/main/java/cn/infstar/essentialsC/commands/HatCommand.java new file mode 100644 index 0000000..b3c652c --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/HatCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/HealCommand.java b/src/main/java/cn/infstar/essentialsC/commands/HealCommand.java new file mode 100644 index 0000000..0ba905e --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/HealCommand.java @@ -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); + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/HelpCommand.java b/src/main/java/cn/infstar/essentialsC/commands/HelpCommand.java new file mode 100644 index 0000000..1da6356 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/HelpCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/LoomCommand.java b/src/main/java/cn/infstar/essentialsC/commands/LoomCommand.java new file mode 100644 index 0000000..5c233bc --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/LoomCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/PaperCommand.java b/src/main/java/cn/infstar/essentialsC/commands/PaperCommand.java new file mode 100644 index 0000000..034166e --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/PaperCommand.java @@ -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); + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/RepairCommand.java b/src/main/java/cn/infstar/essentialsC/commands/RepairCommand.java new file mode 100644 index 0000000..a2a0d68 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/RepairCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/SeenCommand.java b/src/main/java/cn/infstar/essentialsC/commands/SeenCommand.java new file mode 100644 index 0000000..19d5f34 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/SeenCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/SmithingTableCommand.java b/src/main/java/cn/infstar/essentialsC/commands/SmithingTableCommand.java new file mode 100644 index 0000000..34289ca --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/SmithingTableCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/StonecutterCommand.java b/src/main/java/cn/infstar/essentialsC/commands/StonecutterCommand.java new file mode 100644 index 0000000..7ea46f2 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/StonecutterCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/SuicideCommand.java b/src/main/java/cn/infstar/essentialsC/commands/SuicideCommand.java new file mode 100644 index 0000000..f7f900e --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/SuicideCommand.java @@ -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; + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/VanishCommand.java b/src/main/java/cn/infstar/essentialsC/commands/VanishCommand.java new file mode 100644 index 0000000..1eaff7a --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/VanishCommand.java @@ -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 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()); + } +} diff --git a/src/main/java/cn/infstar/essentialsC/commands/WorkbenchCommand.java b/src/main/java/cn/infstar/essentialsC/commands/WorkbenchCommand.java new file mode 100644 index 0000000..00a7278 --- /dev/null +++ b/src/main/java/cn/infstar/essentialsC/commands/WorkbenchCommand.java @@ -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; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml new file mode 100644 index 0000000..92d97af --- /dev/null +++ b/src/main/resources/config.yml @@ -0,0 +1,14 @@ +# EssentialsC 配置文件 +# 你可以编辑此文件来自定义插件行为 + +# 语言设置 +# 可用语言: en_US, zh_CN (你可以添加更多) +language: "zh_CN" + +# 通用设置 +settings: + # 启用或禁用命令反馈消息 + enable-feedback: true + + # 所有插件消息的前缀 + message-prefix: "&6[EssentialsC] &r" diff --git a/src/main/resources/lang/en_US.yml b/src/main/resources/lang/en_US.yml new file mode 100644 index 0000000..52f7198 --- /dev/null +++ b/src/main/resources/lang/en_US.yml @@ -0,0 +1,74 @@ +# English Language File (en_US) +# You can customize all messages here + +# Command messages +messages: + no-permission: "&cYou don't have permission to use this command!\n&7Required permission: {permission}" + player-only: "&cThis command can only be executed by players!" + hat-success: "&aYou are now wearing {item} on your head!" + hat-failed: "&cFailed to wear item on head!" + hat-no-item: "&cYou need to hold an item in your hand!" + suicide-message: "&e{player} has committed suicide!" + fly-enabled: "&aFlight mode enabled!" + fly-disabled: "&cFlight mode disabled!" + vanish-enabled: "&aYou are now vanished!" + vanish-disabled: "&cYou are no longer vanished!" + seen-usage: "&cUsage: /seen " + admin-menu-title: "&6EssentialsC Admin Menu" + admin-time-control: "&eTime Control" + admin-weather-control: "&eWeather Control" + admin-heal-self: "&aHeal Self" + admin-feed-self: "&aFeed Self" + admin-repair-hand: "&aRepair Hand Item" + admin-vanish: "&dVanish Mode" + admin-reload: "&dReload Plugin" + admin-time-set: "&aTime set!" + admin-weather-set: "&aWeather set!" + admin-heal-success: "&aHealed!" + admin-feed-success: "&aFed!" + admin-repair-success: "&aRepaired!" + admin-reload-success: "&aConfig reloaded!" + anvil-opened: "&aAnvil opened!" + enchantingtable-opened: "&aEnchanting table opened!" + heal-self: "&aYour health and hunger have been restored!" + heal-other: "&aYou have healed player {player}!" + heal-by-other: "&aYou have been healed by admin {admin}!" + feed-self: "&aYour hunger has been restored!" + feed-other: "&aYou have fed player {player}!" + feed-by-other: "&aYou have been fed by admin {admin}!" + repair-hand-success: "&aItem in hand repaired!" + repair-all-success: "&aRepaired {count} items!" + repair-not-damaged: "&cThis item is not damaged!" + repair-no-item-in-hand: "&cYou don't have an item in your hand!" + repair-no-items: "&cNo repairable items in inventory!" + no-permission-repair-all: "&cYou don't have permission to repair all items!" + player-not-found: "&cPlayer not found: {player}" + no-permission-others: "&cYou don't have permission to heal others!" + +# Help command +help: + title: "&6========== &eEssentialsC Help &6==========" + version: "&7Plugin Version: &f{version}" + section-blocks: "&6Functional Block Commands:" + section-other: "&6Other Commands:" + footer: "&7Permissions required for each command" + + commands: + workbench: " &f/workbench &7- Open a workbench" + anvil: " &f/anvil &7- Open an anvil" + enchantingtable: " &f/enchantingtable &7- Open an enchanting table" + cartographytable: " &f/cartographytable &7- Open a cartography table" + grindstone: " &f/grindstone &7- Open a grindstone" + loom: " &f/loom &7- Open a loom" + smithingtable: " &f/smithingtable &7- Open a smithing table" + stonecutter: " &f/stonecutter &7- Open a stonecutter" + enderchest: " &f/enderchest &7- Open your ender chest" + hat: " &f/hat &7- Wear held item as a hat" + suicide: " &f/suicide &7- Commit suicide" + fly: " &f/fly &7- Toggle flight mode" + heal: " &f/heal &7- Restore health and hunger" + vanish: " &f/vanish &7- Toggle vanish mode" + seen: " &f/seen &7- View player information" + admin: " &f/admin &7- Open admin menu" + feed: " &f/feed &7- Restore hunger" + repair: " &f/repair &7- Repair hand or all items" diff --git a/src/main/resources/lang/zh_CN.yml b/src/main/resources/lang/zh_CN.yml new file mode 100644 index 0000000..8311471 --- /dev/null +++ b/src/main/resources/lang/zh_CN.yml @@ -0,0 +1,74 @@ +# Chinese Language File (zh_CN) +# 中文语言文件 + +# 命令消息 +messages: + no-permission: "&c你没有权限执行此命令!\n&7需要权限: {permission}" + player-only: "&c该命令只能由玩家执行!" + hat-success: "&a你现在将 {item} 戴在头上!" + hat-failed: "&c无法将物品戴在头上!" + hat-no-item: "&c你需要在手中持有物品!" + suicide-message: "&e{player} 自杀了!" + fly-enabled: "&a飞行模式已启用!" + fly-disabled: "&c飞行模式已禁用!" + vanish-enabled: "&a你已进入隐身模式!" + vanish-disabled: "&c你已退出隐身模式!" + seen-usage: "&c用法: /seen <玩家名>" + admin-menu-title: "&6EssentialsC 管理菜单" + admin-time-control: "&e时间控制" + admin-weather-control: "&e天气控制" + admin-heal-self: "&a治疗自己" + admin-feed-self: "&a喂饱自己" + admin-repair-hand: "&a修复手中物品" + admin-vanish: "&d隐身模式" + admin-reload: "&d重载插件" + admin-time-set: "&a时间已设置!" + admin-weather-set: "&a天气已设置!" + admin-heal-success: "&a已治疗!" + admin-feed-success: "&a已喂饱!" + admin-repair-success: "&a已修复!" + admin-reload-success: "&a配置已重载!" + anvil-opened: "&a已打开铁砧!" + enchantingtable-opened: "&a已打开附魔台!" + heal-self: "&a你的生命值和饱食度已补满!" + heal-other: "&a你已治疗了玩家 {player}!" + heal-by-other: "&a你被管理员 {admin} 治疗了!" + feed-self: "&a你的饱食度已补满!" + feed-other: "&a你已喂饱玩家 {player}!" + feed-by-other: "&a你被管理员 {admin} 喂饱了!" + repair-hand-success: "&a手中物品已修复!" + repair-all-success: "&a已修复 {count} 件物品!" + repair-not-damaged: "&c该物品没有损坏!" + repair-no-item-in-hand: "&c你手中没有物品!" + repair-no-items: "&c背包中没有可修复的物品!" + no-permission-repair-all: "&c你没有权限修复所有物品!" + player-not-found: "&c未找到玩家: {player}" + no-permission-others: "&c你没有权限治疗其他玩家!" + +# 帮助命令 +help: + title: "&6========== &eEssentialsC 帮助 &6==========" + version: "&7插件版本: &f{version}" + section-blocks: "&6功能方块命令:" + section-other: "&6其他功能命令:" + footer: "&7需要权限才能使用各个命令" + + commands: + workbench: " &f/workbench &7- 打开工作台" + anvil: " &f/anvil &7- 打开铁砧" + enchantingtable: " &f/enchantingtable &7- 打开附魔台" + cartographytable: " &f/cartographytable &7- 打开制图台" + grindstone: " &f/grindstone &7- 打开砂轮" + loom: " &f/loom &7- 打开织布机" + smithingtable: " &f/smithingtable &7- 打开锻造台" + stonecutter: " &f/stonecutter &7- 打开切石机" + enderchest: " &f/enderchest &7- 打开末影箱" + hat: " &f/hat &7- 将手中物品戴在头上" + suicide: " &f/suicide &7- 自杀" + fly: " &f/fly &7- 切换飞行模式" + heal: " &f/heal &7- 恢复生命值和饱食度" + vanish: " &f/vanish &7- 切换隐身模式" + seen: " &f/seen &7- 查看玩家信息" + admin: " &f/admin &7- 打开管理菜单" + feed: " &f/feed &7- 补满饱食度" + repair: " &f/repair &7- 修复手中或所有物品" diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml new file mode 100644 index 0000000..45fc986 --- /dev/null +++ b/src/main/resources/paper-plugin.yml @@ -0,0 +1,92 @@ +name: EssentialsC +description: A CMI-like essentials plugin for Paper servers +version: '${version}' + +main: cn.infstar.essentialsC.EssentialsC +api-version: '1.21' +load: POSTWORLD + +authors: [ Coldsmiles_7 ] +website: www.infstar.cn + +permissions: + essentialsc.command.workbench: + description: Allows use of /workbench command + default: op + essentialsc.command.anvil: + description: Allows use of /anvil command + default: op + essentialsc.command.enchantingtable: + description: Allows use of /enchantingtable command + default: op + essentialsc.command.cartographytable: + description: Allows use of /cartographytable command + default: op + essentialsc.command.grindstone: + description: Allows use of /grindstone command + default: op + essentialsc.command.loom: + description: Allows use of /loom command + default: op + essentialsc.command.smithingtable: + description: Allows use of /smithingtable command + default: op + essentialsc.command.stonecutter: + description: Allows use of /stonecutter command + default: op + essentialsc.command.enderchest: + description: Allows use of /enderchest command + default: op + essentialsc.command.hat: + description: Allows use of /hat command + default: op + essentialsc.command.suicide: + description: Allows use of /suicide command + default: op + essentialsc.command.fly: + description: Allows use of /fly command + default: op + essentialsc.command.heal: + description: Allows use of /heal command + default: op + essentialsc.command.vanish: + description: Allows use of /vanish command + default: op + essentialsc.command.seen: + description: Allows use of /seen command + default: op + essentialsc.command.admin: + description: Allows use of /admin command + default: op + essentialsc.command.feed: + description: Allows use of /feed command + default: op + essentialsc.command.repair: + description: Allows use of /repair command + default: op + essentialsc.command.help: + description: Allows use of /essentialsc help command + default: true + essentialsc.*: + description: All EssentialsC permissions + default: false + children: + essentialsc.command.workbench: true + essentialsc.command.anvil: true + essentialsc.command.enchantingtable: true + essentialsc.command.cartographytable: true + essentialsc.command.grindstone: true + essentialsc.command.loom: true + essentialsc.command.smithingtable: true + essentialsc.command.stonecutter: true + essentialsc.command.enderchest: true + essentialsc.command.hat: true + essentialsc.command.suicide: true + essentialsc.command.fly: true + essentialsc.command.heal: true + essentialsc.command.vanish: true + essentialsc.command.seen: true + essentialsc.command.admin: true + essentialsc.command.feed: true + essentialsc.command.repair: true + essentialsc.command.help: true