插件分析

这是一个聊天组件插件,不是数据库插件

从源码看,MythicShowItems 的核心目标很单一:拦截带有 [wp] / [bb] 的聊天消息,把它们改造成带悬浮、点击和 GUI 查看能力的组件化消息。

它不做复杂经济系统,也不依赖 MySQL、Vault、PlaceholderAPI 之类的前置插件。整个插件围绕“玩家在聊天里晒装备和晒背包”展开:[wp] 负责展示主手物品,[bb] 负责生成一份临时背包快照,其他玩家点击后即可查看。

插件内部主要由五部分组成:聊天监听、背包快照缓存、只读背包 GUI、定时提醒任务、颜色文本解析。也就是说,它的卖点不是“功能大而全”,而是“展示体验直接、交互清晰、接入成本低”。

一句话总结:MythicShowItems 把普通聊天里的“发张装备图”变成了原生聊天交互,玩家不需要命令教学,直接打字就能展示。

源码层面的功能拆分

聊天关键字替换

监听聊天消息,只要检测到 [wp][bb],就取消原消息并重新广播一个可交互版本。

手持物品悬浮展示

读取玩家主手物品并挂载 Adventure 悬浮事件,其他玩家把鼠标移上去就能看物品详情。

背包快照查看

把玩家当前背包内容复制到内存快照里,点击聊天组件后执行 /msi view UUID 打开只读 GUI。

消息样式与提醒配置

支持传统 & 颜色码、十六进制颜色和 MiniMessage,提醒间隔和快照过期时间也能在配置里调整。

主要功能

  • [wp] 展示主手物品:玩家在聊天中输入关键字后,消息会替换为可悬浮查看的物品组件。
  • [bb] 展示背包快照:点击聊天中的背包组件即可打开快照 GUI,适合晒战利品、装备搭配或交易确认。
  • 快照自动过期:背包快照只保存在内存中,默认 10 分钟后失效,避免无上限堆积。
  • 只读 GUI 保护:背包快照界面会拦截点击和拖拽,防止玩家从展示 GUI 中拿走物品。
  • 权限分离[wp][bb] 和查看背包 GUI 分别有独立权限节点,方便分组授权。
  • 消息完全可配置:聊天展示格式、悬浮提示、提醒文案、过期提示和 GUI 标题都能自定义。
  • 定时全服提醒:当服务器有在线玩家时,插件会按配置间隔广播展示功能提示。
  • 轻量无前置:源码依赖只有 Paper API,本身不要求数据库或第三方基础插件。

命令列表

主命令:/msi

命令说明权限
/msi view <uuid>打开指定背包快照的查看 GUImythicshow.view

正常使用时,玩家通常不需要手动输入这个命令。点击聊天中的 [bb] 展示组件,插件会自动帮玩家执行对应的查看命令。

权限节点

权限说明默认
mythicshow.use.wp允许在聊天中使用 [wp] 展示主手物品True
mythicshow.use.bb允许在聊天中使用 [bb] 展示背包快照True
mythicshow.view允许查看别人分享出来的背包快照 GUITrue

虽然默认都为 true,但如果你的服务器有分组聊天、游客组或特殊世界限制,仍建议在权限插件里显式控制这些节点。

使用教程

安装插件

MythicShowItems.jar 放进 plugins 文件夹,启动服务器后会自动生成 config.yml

按需修改提示文案

你可以自定义展示格式、GUI 标题、提醒消息和无权限提示,适配自己服务器的聊天风格。

配置权限组

mythicshow.use.wpmythicshow.use.bbmythicshow.view 分配给对应玩家组。

让玩家直接在聊天中使用

玩家输入带有 [wp][bb] 的消息即可触发展示,不需要额外学习复杂命令。

聊天关键字说明

[wp] 物品展示

展示玩家当前主手物品。鼠标悬浮可查看完整物品详情,如果主手为空,会发送失败提示。

[bb] 背包展示

展示玩家当前背包快照。点击组件后可打开只读 GUI,适合晒掉落、配装和交易确认。

聊天示例

Textchat-example.txt
看看我刚打出来的武器 [wp]
今天副本毕业了,背包给你们看 [bb]
我主手是这个 [wp],整套掉落在这 [bb]

源码中的占位替换逻辑支持同一条消息里同时出现 [wp][bb],所以一行里混用也是可行的。

工作机制

阶段源码行为
聊天监听监听 AsyncChatEvent,发现消息含有 [wp][bb] 后取消原聊天事件。
主线程处理把物品和背包读取切回主线程,避免异步线程直接访问 Bukkit 物品 API。
[wp] 生成读取主手物品,展示名优先取物品自定义名,否则回退到材质名,并附加悬浮物品详情。
[bb] 生成把当前背包内容克隆后缓存到内存 ConcurrentHashMap,生成一个点击执行 /msi view UUID 的组件。
GUI 打开点击后打开 36 格只读 GUI:前三行显示主背包,最后一行显示快捷栏。
过期清理快照默认 10 分钟过期,并且后台每 5 分钟异步清理一次失效快照。
交互保护快照 GUI 使用专用 InventoryHolder 标识,点击和拖拽事件都会被取消。

当前实现细节:背包 GUI 只展示 36 个常规背包槽位和快捷栏,不包含护甲栏与副手栏。如果你卖点里要写“完整背包”,建议描述成“背包与快捷栏展示”更准确。

聊天格式兼容性要实测

插件会取消原聊天事件并自行广播一条新的消息,所以如果你的服务器同时用了深度改写聊天格式的插件,最好联调测试一次,确认最终显示是否符合预期。

配置文件

插件配置位于 plugins/MythicShowItems/config.yml。首次启动会自动生成,主要分成 messagessettings 两部分。

核心配置示例

YAMLconfig.yml
messages:
  wp-format: "&8» &6✦ &e%item_name% &7(悬浮查看)"
  bb-format: "&8» &a✦ &f%player_name%的背包 &7(点击查看)"
  bb-gui-title: "&8%player_name% 的背包"

settings:
  reminder-interval: 30
  snapshot-expire-minutes: 10

配置项说明

配置项说明
messages.wp-empty主手没有物品时发给玩家的失败提示,支持多行列表。
messages.wp-format[wp] 在聊天中替换后的显示格式,支持 %item_name%
messages.bb-format[bb] 在聊天中替换后的显示格式,支持 %player_name%
messages.bb-hover鼠标悬浮到背包展示组件时显示的提示内容。
messages.bb-gui-title背包查看 GUI 标题,支持玩家名占位。
messages.reminder定时全服提醒内容,在线玩家存在时才会广播。
messages.snapshot-expired快照已过期时发送给查看者的提示。
messages.no-permission权限不足时的提示内容。
settings.reminder-interval提醒广播间隔,单位分钟,默认 30。
settings.snapshot-expire-minutes背包快照过期时间,单位分钟,默认 10。

支持三种颜色写法

源码中的 ColorUtil 同时支持传统 &a 颜色码、十六进制颜色 &#RRGGBB,以及 MiniMessage 标签,因此你可以把聊天风格做得比默认配置更精细。

技术信息

项目信息
插件名称MythicShowItems
当前版本1.0
目标核心Paper 1.20.1
API 版本1.20
Java 版本17+
依赖仅 Paper API,无 Vault / MySQL / PlaceholderAPI 硬依赖
聊天实现Paper AsyncChatEvent + Adventure Component
快照存储内存缓存(ConcurrentHashMap
GUI 类型36 格只读背包查看界面
清理策略快照过期检查 + 每 5 分钟异步清理一次

常见问题

因为背包展示不是永久保存到数据库,而是暂存在内存里。默认 10 分钟后失效,过期后就无法再查看。你可以在 settings.snapshot-expire-minutes 中调整。
不需要。根据 Maven 配置和源码,硬依赖只有 Paper API,本体就是一个轻量聊天展示插件。
不能。插件专门监听了点击和拖拽事件,只要这个 GUI 的 Holder 是快照 Holder,就会取消交互。
当前实现不会显示。查看 GUI 只映射了前三行主背包和最后一行快捷栏,所以页面文案也建议写成“背包快照”而不是“全装备面板”。
因为它会取消原始聊天并重新广播一条 Adventure 消息,如果你的服务器还有高级聊天前缀、频道插件或审计插件,最好实际测试一下显示顺序与格式结果。

如果你的服务器很重视“晒装备”“掉落展示”“交易验货”这类社交互动,MythicShowItems 属于非常低成本、见效很快的一类小功能插件。