Compare commits

1 Commits

Author SHA1 Message Date
Coldsmile_7
6452226151 feat: 实现 ProtocolLib 自定义标题 2026-04-15 03:07:25 +08:00
5 changed files with 73 additions and 14 deletions

13
pom.xml
View File

@@ -90,6 +90,11 @@
<id>papermc-repo</id> <id>papermc-repo</id>
<url>https://repo.papermc.io/repository/maven-public/</url> <url>https://repo.papermc.io/repository/maven-public/</url>
</repository> </repository>
<!-- ProtocolLib 仓库 -->
<repository>
<id>dmulloy2-repo</id>
<url>https://repo.dmulloy2.net/repository/public/</url>
</repository>
</repositories> </repositories>
<dependencies> <dependencies>
@@ -99,5 +104,13 @@
<version>1.21.11-R0.1-SNAPSHOT</version> <version>1.21.11-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- ProtocolLib 依赖 (5.4.0+ 迁移到 Maven Central) -->
<dependency>
<groupId>net.dmulloy2</groupId>
<artifactId>ProtocolLib</artifactId>
<version>5.4.0</version>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@@ -1,6 +1,7 @@
package cn.infstar.essentialsC; package cn.infstar.essentialsC;
import cn.infstar.essentialsC.commands.*; import cn.infstar.essentialsC.commands.*;
import cn.infstar.essentialsC.listeners.InventoryTitleListener;
import cn.infstar.essentialsC.listeners.ShulkerBoxListener; import cn.infstar.essentialsC.listeners.ShulkerBoxListener;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@@ -12,12 +13,24 @@ import java.lang.reflect.Field;
public final class EssentialsC extends JavaPlugin { public final class EssentialsC extends JavaPlugin {
private static LangManager langManager; private static LangManager langManager;
private static InventoryTitleListener inventoryTitleListener;
@Override @Override
public void onEnable() { public void onEnable() {
// 初始化语言管理器 // 初始化语言管理器
langManager = new LangManager(this); langManager = new LangManager(this);
// 检查 ProtocolLib 是否可用
boolean protocolLibAvailable = checkProtocolLib();
// 如果 ProtocolLib 可用,注册 InventoryTitleListener
if (protocolLibAvailable) {
inventoryTitleListener = new InventoryTitleListener(this);
getLogger().info("ProtocolLib 已检测到,启用自定义标题功能!");
} else {
getLogger().warning("ProtocolLib 未检测到,将使用默认标题。");
}
// 注册监听器 // 注册监听器
registerListeners(); registerListeners();
@@ -30,6 +43,10 @@ public final class EssentialsC extends JavaPlugin {
@Override @Override
public void onDisable() { public void onDisable() {
// 清理 InventoryTitleListener
if (inventoryTitleListener != null) {
inventoryTitleListener.cleanup();
}
getLogger().info("EssentialsC 插件已禁用!"); getLogger().info("EssentialsC 插件已禁用!");
} }
@@ -40,6 +57,20 @@ public final class EssentialsC extends JavaPlugin {
return langManager; 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; package cn.infstar.essentialsC.commands;
import cn.infstar.essentialsC.EssentialsC; import cn.infstar.essentialsC.EssentialsC;
import cn.infstar.essentialsC.listeners.InventoryTitleListener;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
/**
* 末影箱命令 - 使用 ProtocolLib 实现自定义标题
*/
public class EnderChestCommand extends BaseCommand { public class EnderChestCommand extends BaseCommand {
public EnderChestCommand() { public EnderChestCommand() {
@@ -11,18 +15,15 @@ public class EnderChestCommand extends BaseCommand {
@Override @Override
protected boolean execute(Player player, String[] args) { protected boolean execute(Player player, String[] args) {
EssentialsC plugin = EssentialsC.getInstance(); InventoryTitleListener titleListener = EssentialsC.getInventoryTitleListener();
// 如果启用了 ProtocolLib,使用自定义标题 // 如果 ProtocolLib 可用,设置自定义标题
if (plugin.isProtocolLibEnabled()) { if (titleListener != null) {
// 从配置读取标题 String title = "&5随身末影箱";
String title = plugin.getConfig().getString("enderchest.title", "&5随身末影箱"); titleListener.markForTitleChange(player, title);
// 标记下一个打开的 inventory 需要修改标题
plugin.getInventoryTitleListener().markForTitleChange(player, title);
} }
// 直接打开玩家的末影箱(参考 EssentialsX 实现) // 打开末影箱
player.openInventory(player.getEnderChest()); player.openInventory(player.getEnderChest());
return true; return true;
} }

View File

@@ -208,16 +208,22 @@ public class ShulkerBoxListener implements Listener {
// 使用配置文件中的默认标题 // 使用配置文件中的默认标题
String defaultTitle = plugin.getConfig().getString("shulkerbox.default-title", ""); String defaultTitle = plugin.getConfig().getString("shulkerbox.default-title", "");
if (defaultTitle != null && !defaultTitle.isEmpty()) { if (defaultTitle != null && !defaultTitle.isEmpty()) {
// 转换颜色代码 & -> § title = defaultTitle;
title = defaultTitle.replace('&', '§');
} else { } else {
// 如果配置为空,使用 "Shulker Box"(客户端会自动翻译) title = "&e潜影盒";
title = "Shulker Box";
} }
} }
// 如果 ProtocolLib 可用,标记需要修改标题
InventoryTitleListener titleListener = EssentialsC.getInventoryTitleListener();
if (titleListener != null) {
titleListener.markForTitleChange(player, title);
}
// 创建一个新的 inventory基于潜影盒的内容 // 创建一个新的 inventory基于潜影盒的内容
Inventory inventory = Bukkit.createInventory(null, 27, title); // 注意:如果使用 ProtocolLib标题会被拦截修改这里用临时标题
String inventoryTitle = titleListener != null ? "Opening..." : title.replace('&', '§');
Inventory inventory = Bukkit.createInventory(null, 27, inventoryTitle);
// 复制潜影盒的内容到新 inventory // 复制潜影盒的内容到新 inventory
ItemStack[] contents = shulkerBoxBlock.getInventory().getContents(); ItemStack[] contents = shulkerBoxBlock.getInventory().getContents();

View File

@@ -6,6 +6,14 @@ main: cn.infstar.essentialsC.EssentialsC
api-version: '1.21' api-version: '1.21'
load: POSTWORLD load: POSTWORLD
# ProtocolLib 依赖(可选)
dependencies:
server:
ProtocolLib:
load: BEFORE
required: false
join-classpath: true
authors: [ Coldsmiles_7 ] authors: [ Coldsmiles_7 ]
website: www.infstar.cn website: www.infstar.cn