feat: 实现 ProtocolLib 自定义标题
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册所有监听器
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user