diff --git a/pom.xml b/pom.xml index 294eacb..5e04a93 100644 --- a/pom.xml +++ b/pom.xml @@ -90,6 +90,11 @@ papermc-repo https://repo.papermc.io/repository/maven-public/ + + + dmulloy2-repo + https://repo.dmulloy2.net/repository/public/ + @@ -99,5 +104,13 @@ 1.21.11-R0.1-SNAPSHOT provided + + + + net.dmulloy2 + ProtocolLib + 5.4.0 + provided + diff --git a/src/main/java/cn/infstar/essentialsC/EssentialsC.java b/src/main/java/cn/infstar/essentialsC/EssentialsC.java index 2ba929c..18a4a0e 100644 --- a/src/main/java/cn/infstar/essentialsC/EssentialsC.java +++ b/src/main/java/cn/infstar/essentialsC/EssentialsC.java @@ -1,6 +1,7 @@ package cn.infstar.essentialsC; import cn.infstar.essentialsC.commands.*; +import cn.infstar.essentialsC.listeners.InventoryTitleListener; import cn.infstar.essentialsC.listeners.ShulkerBoxListener; import org.bukkit.Bukkit; import org.bukkit.command.Command; @@ -12,12 +13,24 @@ import java.lang.reflect.Field; public final class EssentialsC extends JavaPlugin { private static LangManager langManager; + private static InventoryTitleListener inventoryTitleListener; @Override public void onEnable() { // 初始化语言管理器 langManager = new LangManager(this); + // 检查 ProtocolLib 是否可用 + boolean protocolLibAvailable = checkProtocolLib(); + + // 如果 ProtocolLib 可用,注册 InventoryTitleListener + if (protocolLibAvailable) { + inventoryTitleListener = new InventoryTitleListener(this); + getLogger().info("ProtocolLib 已检测到,启用自定义标题功能!"); + } else { + getLogger().warning("ProtocolLib 未检测到,将使用默认标题。"); + } + // 注册监听器 registerListeners(); @@ -30,6 +43,10 @@ public final class EssentialsC extends JavaPlugin { @Override public void onDisable() { + // 清理 InventoryTitleListener + if (inventoryTitleListener != null) { + inventoryTitleListener.cleanup(); + } getLogger().info("EssentialsC 插件已禁用!"); } @@ -40,6 +57,20 @@ public final class EssentialsC extends JavaPlugin { return langManager; } + /** + * 获取 InventoryTitleListener 实例 + */ + public static InventoryTitleListener getInventoryTitleListener() { + return inventoryTitleListener; + } + + /** + * 检查 ProtocolLib 是否可用 + */ + private boolean checkProtocolLib() { + return Bukkit.getPluginManager().isPluginEnabled("ProtocolLib"); + } + /** * 注册所有监听器 */ diff --git a/src/main/java/cn/infstar/essentialsC/commands/EnderChestCommand.java b/src/main/java/cn/infstar/essentialsC/commands/EnderChestCommand.java index 099e644..cfa424b 100644 --- a/src/main/java/cn/infstar/essentialsC/commands/EnderChestCommand.java +++ b/src/main/java/cn/infstar/essentialsC/commands/EnderChestCommand.java @@ -1,8 +1,12 @@ package cn.infstar.essentialsC.commands; import cn.infstar.essentialsC.EssentialsC; +import cn.infstar.essentialsC.listeners.InventoryTitleListener; import org.bukkit.entity.Player; +/** + * 末影箱命令 - 使用 ProtocolLib 实现自定义标题 + */ public class EnderChestCommand extends BaseCommand { public EnderChestCommand() { @@ -11,18 +15,15 @@ public class EnderChestCommand extends BaseCommand { @Override protected boolean execute(Player player, String[] args) { - EssentialsC plugin = EssentialsC.getInstance(); + InventoryTitleListener titleListener = EssentialsC.getInventoryTitleListener(); - // 如果启用了 ProtocolLib,使用自定义标题 - if (plugin.isProtocolLibEnabled()) { - // 从配置读取标题 - String title = plugin.getConfig().getString("enderchest.title", "&5随身末影箱"); - - // 标记下一个打开的 inventory 需要修改标题 - plugin.getInventoryTitleListener().markForTitleChange(player, title); + // 如果 ProtocolLib 可用,设置自定义标题 + if (titleListener != null) { + String title = "&5随身末影箱"; + titleListener.markForTitleChange(player, title); } - // 直接打开玩家的末影箱(参考 EssentialsX 实现) + // 打开末影箱 player.openInventory(player.getEnderChest()); return true; } diff --git a/src/main/java/cn/infstar/essentialsC/listeners/ShulkerBoxListener.java b/src/main/java/cn/infstar/essentialsC/listeners/ShulkerBoxListener.java index 23c2c13..0f923d1 100644 --- a/src/main/java/cn/infstar/essentialsC/listeners/ShulkerBoxListener.java +++ b/src/main/java/cn/infstar/essentialsC/listeners/ShulkerBoxListener.java @@ -208,16 +208,22 @@ public class ShulkerBoxListener implements Listener { // 使用配置文件中的默认标题 String defaultTitle = plugin.getConfig().getString("shulkerbox.default-title", ""); if (defaultTitle != null && !defaultTitle.isEmpty()) { - // 转换颜色代码 & -> § - title = defaultTitle.replace('&', '§'); + title = defaultTitle; } else { - // 如果配置为空,使用 "Shulker Box"(客户端会自动翻译) - title = "Shulker Box"; + title = "&e潜影盒"; } } + // 如果 ProtocolLib 可用,标记需要修改标题 + InventoryTitleListener titleListener = EssentialsC.getInventoryTitleListener(); + if (titleListener != null) { + titleListener.markForTitleChange(player, title); + } + // 创建一个新的 inventory(基于潜影盒的内容) - Inventory inventory = Bukkit.createInventory(null, 27, title); + // 注意:如果使用 ProtocolLib,标题会被拦截修改,这里用临时标题 + String inventoryTitle = titleListener != null ? "Opening..." : title.replace('&', '§'); + Inventory inventory = Bukkit.createInventory(null, 27, inventoryTitle); // 复制潜影盒的内容到新 inventory ItemStack[] contents = shulkerBoxBlock.getInventory().getContents(); diff --git a/src/main/resources/paper-plugin.yml b/src/main/resources/paper-plugin.yml index 4e29c7a..b3969e7 100644 --- a/src/main/resources/paper-plugin.yml +++ b/src/main/resources/paper-plugin.yml @@ -6,6 +6,14 @@ main: cn.infstar.essentialsC.EssentialsC api-version: '1.21' load: POSTWORLD +# ProtocolLib 依赖(可选) +dependencies: + server: + ProtocolLib: + load: BEFORE + required: false + join-classpath: true + authors: [ Coldsmiles_7 ] website: www.infstar.cn