feat: 实现 ProtocolLib 自定义标题

This commit is contained in:
Coldsmile_7
2026-04-15 03:07:25 +08:00
parent cc07647551
commit 6452226151
5 changed files with 73 additions and 14 deletions

View File

@@ -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");
}
/**
* 注册所有监听器
*/

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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