- 版权类型
- 原创
- 插件中文名称
- 航式面板
- 插件英文名称
- HangProfile
- 原帖地址
- #
- 支持的核心(服务端)
- Spigot
- Paper
- Folia
- Purpur
- PufferFish
- SpongeVanilla
- Leaves
- 其他核心
- 语言支持
- 中文(简体)
- 适配版本(Java)
- 最新版本
- 26.x
- 1.21
- 1.20
- 1.19
- 1.18
- 1.17
- 1.16
- 1.15
- 1.14
- 1.13
- 1.12
- 1.11
- 1.10
- 1.9
- 1.8
[MD]
# HangProfile - 玩家信息面板插件
   
> **Hang系列插件 - 蹲下右键身边的玩家,当场看清他的装备、血量与坐标**
---
## 📖 插件简介
**HangProfile** 是一款**玩家信息面板**插件。蹲下右键任意玩家即可弹出他的信息面板:头颅换成他的皮肤,头盔到靴子连附魔和耐久一起原样展示,主手副手同样在列,再配上血量、等级、坐标、金钱、Ping。也可以用 `/hp <玩家>` 隔着地图查看。
面板布局**完全写在配置里**:头颅位、六个装备位、按钮任意增删,槽位、物品、名称、描述、点击动作全部可改,改完 `/hangprofile reload` 就生效,不用重启。物品名支持 PlaceholderAPI 变量,也支持 CraftEngine 自定义物品,同一个格子能按被查看者的身份显示不同图标。
> 🎯 适用于生存服、RPG 服、PvP 服等需要快速查看他人信息的服务器
---
## 🎮 玩法说明
1. 玩家**蹲下右键**另一个玩家,信息面板立刻打开
2. 面板中央是对方的**头颅**,皮肤自动换成被查看者
3. 左右两侧按配置摆出**头盔 / 胸甲 / 护腿 / 靴子 / 主手 / 副手**,附魔与耐久原样保留,空位显示占位玻璃板
4. 描述里给出**血量、等级、坐标、金钱、Ping**,金钱需要 Vault + 经济插件
5. 点击下方按钮可**加好友 / 请求传送 / 私聊 / 请求交易**,按钮内容与命令都能改
6. 也可以用 `/hp <玩家>` **隔着地图**打开,不必贴身
被查看者持有 `hangprofile.exempt` 时会被拦下,但管理员无视这条限制。隐身玩家(Vanish 类插件走的 `hidePlayer`)对查看者一律视为不在线,连 Tab 补全都不出现,免得命令变成隐身探测器。Citizens 这类 NPC 虽然也是 Player 实体,但没有真实玩家数据,直接放行不干扰它自己的商店与任务交互。
---
## ✨ 功能特性
### 查看方式
- 👆 **蹲下右键** — 是否需要蹲下可关,关掉就是直接右键。两个 interact 事件都接:Bukkit 的 HandlerList 不是继承式的,只注册父事件会在 INTERACT_AT 被别的插件消耗时表现为「右键毫无反应」
- ⌨️ **命令查看** — `/hp <玩家>` 隔空查看,可单独关闭;`allow-self` 允许查看自己,这是蹲下右键做不到的事
- ⏱️ **共用冷却** — 右键与命令共用同一份冷却记录,玩家无法交替使用两种方式绕过频率限制;命令拼错、玩家不在线这类失败不消耗冷却
- 📏 **距离限制** — 命令查看可限制最远格数,跨世界先比对世界 UID 再算距离,避免 `distanceSquared` 直接抛异常
### 面板内容
- 🎽 **六个装备位** — 头盔 / 胸甲 / 护腿 / 靴子 / 主手 / 副手,含附魔与耐久原样展示,槽位填 `-1` 即不展示
- 🧤 **副手自动降级** — 1.8 没有副手概念,该槽位显示占位物品而不是报错
- 👤 **头颅换皮肤** — 头颅自动换成被查看者的皮肤,非头颅物品自动跳过;拿贴图写死的装饰性头颅当图标时可用 `use-target-skin: false` 关掉
- 🔒 **只读保护** — 点击与拖拽一律取消,shift 点击往面板里塞东西同样拦下
### 按钮与外观
- 🎛️ **按钮任意增删** — 槽位、物品、名称、描述、动作全在 `gui.yml`,加按钮不用改代码
- ⚡ **四种点击动作** — `COMMAND` 以控制台或查看者身份执行命令 / `MESSAGE` 发消息 / `CLOSE` 关闭面板 / `NONE` 纯展示;命令会先关面板再延迟一 tick 执行,避免与容器状态打架
- 🧱 **背景填充** — 空槽位用玻璃板填满,物品与名称可改
- ✂️ **标题自动裁剪** — 1.8~1.12 的容器标题上限 32 字符,超出会让客户端收到畸形数据包,插件按版本自动裁剪并去掉末尾残留的半个颜色代码
### 变量与集成
- 🔤 **9 个内置变量** — `%target%` `%viewer%` `%health%` `%max_health%` `%level%` `%world%` `%x%` `%y%` `%z%` `%ping%` `%money%`,均以被查看者为对象
- 🧩 **PlaceholderAPI** — 装了就自动启用,反射调用,面板里任何文本都能写第三方变量
- 💰 **Vault 经济** — `%money%` 走 Vault,取不到显示 `N/A`;经济插件可能比本插件晚注册服务,所以每次取不到都会重试而不是启动时放弃一次就永久关闭
- 🎨 **CraftEngine 物品** — `material: ce:命名空间:物品id` 直接调用它的自定义物品,前缀后整段原样交给 CraftEngine 解析
- 🖼️ **物品名可用变量** — `material: "%myplugin_vip_icon%"` 让不同玩家看到不同图标;不含变量的物品名只在启动时解析一次,含变量的每次开面板重新解析
### 执行与管理
- 📜 **打开面板执行命令** — 右键与命令两条路径共用同一份列表,可按**控制台 / 查看者 / 被查看者**三种身份执行,每条命令的延迟可单独配
- 🛡️ **免被查看权限** — `hangprofile.exempt` 让玩家不被他人查看,管理员无视此限制
- 👻 **隐身兼容** — 对查看者不可见的玩家一律视为不在线,Tab 补全里也不出现
- 🤖 **NPC 兼容** — Citizens 这类 NPC 直接放行,不吃掉它自己的交互事件
- 📍 **报错带行号** — 物品名写错、`executor` 填错时,控制台警告直接指出是哪个文件第几行,照着改即可
- 🔄 **热重载** — `/hangprofile reload` 重载全部配置
- 🧵 **Folia 支持** — 按全局 / 实体两类调度器分派:控制台命令走 `GlobalRegionScheduler`,玩家相关操作走 `EntityScheduler`;命令路径先跳目标区域读数据、再跳回查看者区域开界面
- 📊 **启动自检横幅** — 服务端核心、物品体系、按钮数、装备位数、触发方式、PlaceholderAPI / Vault / CraftEngine / Folia 接入状态一次列清
---
## 📋 指令列表
| 指令 | 说明 | 权限 |
|------|------|------|
| `/hangprofile` | 查看插件信息与可用用法 | 无 |
| `/hangprofile view <玩家>` | 打开该玩家的信息面板 | `hangprofile.command` |
| `/hangprofile <玩家>` | 同上,`view` 的简写 | `hangprofile.command` |
| `/hangprofile reload` | 重载全部配置文件 | `hangprofile.admin` |
> 💡 命令别名:`/hp`、`/hangp`,例如 `/hp Steve`
>
> 玩家名支持 Tab 补全,精确匹配优先、其次前缀匹配。隐身玩家与 NPC 不参与补全。
>
> 子命令拼错(如 `/hp reloa`)会走简写路径,除「玩家不在线」外还会补一行正确用法。
---
## 🔑 权限节点
| 权限 | 说明 | 默认 |
|------|------|------|
| `hangprofile.use` | 允许蹲下右键查看玩家信息面板 | 所有玩家 |
| `hangprofile.command` | 允许用 `/hangprofile view <玩家>` 命令查看 | 所有玩家 |
| `hangprofile.exempt` | 持有者不会被其他人查看(管理员除外) | 关闭 |
| `hangprofile.admin` | 允许重载配置,并可无视 `hangprofile.exempt` | OP |
面板默认显示被查看者的坐标,PvP / 生存服若不希望玩家隔空查坐标,把 `hangprofile.command` 收回给管理员即可,普通玩家仍可蹲下右键查看。
---
## ⚙️ 配置文件
配置分三个文件,各管一件事:`config.yml` 管触发与冷却,`messages.yml` 管全部提示消息,`gui.yml` 管面板外观。
### 触发方式与冷却(config.yml)
```yaml
settings:
trigger:
# 是否需要蹲下才能触发 (防止误触,日常右键交互不受影响)
sneak: true
# 是否启用右键触发 (关闭则禁用蹲下右键查看功能)
right-click: true
command:
enabled: true
# 是否允许用命令查看自己的面板 (蹲下右键做不到这件事,只能靠命令)
allow-self: true
# 命令查看的最大距离(方块),-1 表示不限制
#
# 注意: gui.yml 的 info.lore 默认会显示目标的坐标,而命令不像右键那样需要
# 贴身,若不限距离,任何玩家都能随时查到全服任意玩家的坐标。
max-distance: -1
# 查看冷却(毫秒) - 防止频繁右键/命令刷屏打开面板
cooldown: 1000
# 被查看时是否提示对方 (开启后对方会知道有人在看他)
notify-target: false
```
### 打开面板时执行命令(config.yml)
右键与命令两条路径共用同一份列表,每条命令三个字段:
```yaml
settings:
open-commands:
enabled: false
# 默认延迟(tick) - 列表里没单独写 delay-ticks 的条目用这个值,最小 1
default-delay-ticks: 1
list:
- executor: console
command: "tell %viewer% 你正在查看 %target% 的信息面板"
# 以查看者身份执行,等同于他自己敲这条命令
#- executor: viewer
# command: "me 看了一眼 %target%"
# 单独指定延迟 - 面板打开 2 秒后才执行,不受 default-delay-ticks 影响
#- executor: console
# command: "tell %viewer% 这是 2 秒后发的"
# delay-ticks: 40
```
`executor` 三个取值:`console` 控制台执行(权限等同 OP)、`viewer` 以查看者身份执行、`target` 以被查看者身份执行,后两者受其自身权限限制。
两条容错规则不一样,是故意的:`executor` **写错会跳过整条命令**并报出行号,绝不退回 `console`——悄悄按控制台执行等于把一条玩家命令提权成 OP 命令;`delay-ticks` 写坏了只**退回默认值并警告**,填 0 或负数按 1 处理,延迟填错顶多是时机不对。
命令里再开一个 GUI 会覆盖掉本面板,想让玩家先看清面板就把这条的 `delay-ticks` 调大(如 `40` = 2 秒)。
### 面板与装备槽位(gui.yml)
```yaml
gui:
# 支持 %target% %viewer% 变量,会随目标玩家变化
title: "&8%target% &7的信息面板"
rows: 6 # 1-6 行,对应 9/18/27/36/45/54 格
info:
enabled: true
slot: 4
material: PLAYER_HEAD
# 是否把这个头颅的皮肤换成「被查看玩家」的。非头颅物品自动跳过。
# 唯一需要关掉的场景: 拿一个贴图写死的装饰性头颅当图标
use-target-skin: true
name: "&e%target%"
lore:
- "&7生命: &c%health%&7/&c%max_health%"
- "&7等级: &a%level%"
- "&7坐标: &f%world% %x%, %y%, %z%"
- "&7金钱: &6%money%"
- "&7Ping: &f%ping%ms"
equipment:
helmet: 10
chestplate: 19
leggings: 28
boots: 37
main-hand: 22
off-hand: 24 # 1.8 没有副手概念,该槽位会显示为占位物品
empty-material: LIGHT_GRAY_STAINED_GLASS_PANE
empty-name: "&7空"
```
变量含义:`%target%` 被查看者名字,`%viewer%` 查看者名字,`%health%` / `%max_health%` 当前与最大生命,`%level%` 等级,`%world%` 所在世界,`%x%` `%y%` `%z%` 整数坐标,`%ping%` 延迟(取不到显示 `-1`),`%money%` 金钱(需 Vault + 经济插件,取不到显示 `N/A`)。除 `%viewer%` 外全部以被查看者为对象,PlaceholderAPI 变量同理。
### 按钮(gui.yml)
槽位冲突时按钮会覆盖装备,建议把按钮放在装备槽位之外:
```yaml
buttons:
add-friend:
slot: 40
material: EMERALD
name: "&a添加好友"
lore:
- "&7点击向 &e%target% &7发送好友请求"
action:
type: COMMAND
console: false # true 则以控制台身份执行
command: "friend add %target%"
msg:
slot: 42
material: PAPER
name: "&d私聊"
action:
type: MESSAGE
message: "&7请在聊天框输入: &f/msg %target% <内容>"
close:
slot: 49
material: RED_STAINED_GLASS_PANE
name: "&c关闭面板"
action:
type: CLOSE
```
### 物品名的三种写法
1.13 的扁平化改动重命名了大量物品并去掉了 data 值,插件内置双向映射,新旧写法都认:
```text
现代写法 (1.13+) 老写法 (1.8~1.12) 数字 ID (仅 1.8~1.12)
PLAYER_HEAD SKULL_ITEM:3 397:3
LIGHT_BLUE_STAINED_GLASS_PANE STAINED_GLASS_PANE:3 160:3
RED_STAINED_GLASS_PANE STAINED_GLASS_PANE:14 -
```
也就是说在 1.8 服务端写 `PLAYER_HEAD` 能用,在 1.21 服务端写 `SKULL_ITEM:3` 也能用。1.13 起数字 ID 被从 API 里彻底移除,届时写 `397:3` 会回退成 `STONE`,所以建议用名字写法,升级服务端后配置不用改。物品名写错时控制台警告一次并回退为 `STONE`,不会导致插件报错。
### CraftEngine 自定义物品(gui.yml)
装了 CraftEngine 就能用 `ce:` 前缀调用它的物品,写法 `ce:命名空间:物品id`,`craftengine:` 是等价的长写法。下面把**原配置**和**CE 展示配置**摆在一起对比 —— 面板结构一模一样,只换了物品名与槽位排布。
**原配置(插件自带的 gui.yml)** —— 全用原版物品,头颅在顶部正中,装备竖排在左侧:
```yaml
gui:
title: "&8%target% &7的信息面板"
rows: 6
info:
enabled: true
slot: 4
material: PLAYER_HEAD
use-target-skin: true
name: "&e%target%"
lore:
- ""
- "&7生命: &c%health%&7/&c%max_health%"
- "&7等级: &a%level%"
- "&7坐标: &f%world% %x%, %y%, %z%"
- "&7金钱: &6%money%"
- "&7Ping: &f%ping%ms"
- ""
- "&8左键按钮可执行对应操作"
equipment:
helmet: 10
chestplate: 19
leggings: 28
boots: 37
main-hand: 22
off-hand: 24
empty-material: LIGHT_GRAY_STAINED_GLASS_PANE
empty-name: "&7空"
buttons:
add-friend:
slot: 40
material: EMERALD
name: "&a添加好友"
lore:
- "&7点击向 &e%target% &7发送好友请求"
action:
type: COMMAND
console: false
command: "friend add %target%"
tpa:
slot: 41
material: COMPASS
name: "&b请求传送"
lore:
- "&7点击向 &e%target% &7发送 TPA 请求"
action:
type: COMMAND
console: false
command: "tpa %target%"
msg:
slot: 42
material: PAPER
name: "&d私聊"
lore:
- "&7点击查看私聊提示"
action:
type: MESSAGE
message: "&7请在聊天框输入: &f/msg %target% <内容>"
trade:
slot: 43
material: GOLD_INGOT
name: "&6请求交易"
lore:
- "&7点击向 &e%target% &7发起交易请求"
action:
type: COMMAND
console: false
command: "trade %target%"
close:
slot: 49
material: RED_STAINED_GLASS_PANE
name: "&c关闭面板"
lore:
- "&7关闭当前信息面板"
action:
type: CLOSE
fill:
enabled: true
material: LIGHT_BLUE_STAINED_GLASS_PANE
name: " "
```
**CE 展示配置** —— 头颅换成 CE 的放大头颅 `gui_head_size_4`,四个功能按钮横排一行,再用三个透明贴图物品当无边框展示位:
```yaml
gui:
title: "&8%target% &7的信息面板"
rows: 6
info:
enabled: true
slot: 1
material: ce:default:gui_head_size_4
name: "&e%target%"
lore:
- ""
- "&7生命: &c%health%&7/&c%max_health%"
- "&7等级: &a%level%"
- "&7坐标: &f%world% %x%, %y%, %z%"
- "&7金钱: &6%money%"
- "&7Ping: &f%ping%ms"
equipment:
helmet: 27
chestplate: 28
leggings: 29
boots: 30
main-hand: 9
off-hand: 12
empty-material: LIGHT_GRAY_STAINED_GLASS_PANE
empty-name: "&7空"
buttons:
add-friend:
slot: 14
material: EMERALD
name: "&a添加好友"
lore:
- "&7点击向 &e%target% &7发送好友请求"
action:
type: COMMAND
console: false
command: "friend add %target%"
tpa:
slot: 15
material: COMPASS
name: "&b请求传送"
lore:
- "&7点击向 &e%target% &7发送 TPA 请求"
action:
type: COMMAND
console: false
command: "tpa %target%"
msg:
slot: 16
material: PAPER
name: "&d私聊"
lore:
- "&7点击查看私聊提示"
action:
type: MESSAGE
message: "&7请在聊天框输入: &f/msg %target% <内容>"
trade:
slot: 17
material: GOLD_INGOT
name: "&6请求交易"
lore:
- "&7点击向 &e%target% &7发起交易请求"
action:
type: COMMAND
console: false
command: "trade %target%"
close:
slot: 49
material: RED_STAINED_GLASS_PANE
name: "&c关闭面板"
lore:
- "&7关闭当前信息面板"
action:
type: CLOSE
# 透明贴图展示位 - 只显示文字,没有物品边框
info:
slot: 2
material: ce:hangzong:air
name: "&e%target%"
lore:
- ""
- "&7生命: &c%health%&7/&c%max_health%"
- "&7等级: &a%level%"
- "&7坐标: &f%world% %x%, %y%, %z%"
- "&7金钱: &6%money%"
- "&7Ping: &f%ping%ms"
info2:
slot: 10
material: ce:hangzong:air
name: "&e%target%"
lore:
- ""
- "&7生命: &c%health%&7/&c%max_health%"
- "&7等级: &a%level%"
- "&7坐标: &f%world% %x%, %y%, %z%"
- "&7金钱: &6%money%"
- "&7Ping: &f%ping%ms"
info3:
slot: 11
material: ce:hangzong:air
name: "&e%target%"
lore:
- ""
- "&7生命: &c%health%&7/&c%max_health%"
- "&7等级: &a%level%"
- "&7坐标: &f%world% %x%, %y%, %z%"
- "&7金钱: &6%money%"
- "&7Ping: &f%ping%ms"
fill:
enabled: true
material: LIGHT_BLUE_STAINED_GLASS_PANE
name: " "
```
两份配置的差异只在三处:`info.material` 从 `PLAYER_HEAD` 换成 `ce:default:gui_head_size_4`;装备与按钮的 `slot` 重排;末尾多了三个 `ce:hangzong:air` 展示位。其余字段完全一致 —— 换 CE 物品不需要改插件、不需要改别的配置项,只改 `material` 一行。
> ⚠️ 上面的 `ce:hangzong:air` 是**透明贴图**物品,需要配套的 CraftEngine 资源包才会生效,插件本身不附带。**需要这份透明贴图配置请加交流Q群 361919269 获取。**
>
> 没装 CraftEngine 或 id 不存在时会回退为 `STONE` 并在控制台说明原因和行号,不影响面板其余部分。
>
> CraftEngine 通常比本插件晚启用,所以 `ce:` 物品不做启动预热,首次用到时才解析——启动横幅显示「CraftEngine 未检测到」不一定代表真没装。
[ATTACH]144355[/ATTACH][ATTACH]144356[/ATTACH]
`gui_head_size_*` 这类放大头颅可以放心开着 `use-target-skin`:CE 自定义的是**模型**(`minecraft:item_model` 组件),皮肤走的是另一个组件(`minecraft:profile`),两者互不干扰,换皮肤不会把放大模型弄坏。若开着却仍显示查看者自己的头,原因在 CE 那边的物品配置——它的 `client_bound_data.profile` 是发包时才生效的,会盖掉服务端设的皮肤,而其中的 `<arg:player...>` 指向收包的人。把该物品配置里的 `client_bound_data.profile` 那一行删掉即可。
---
## 📦 安装
1. 把 jar 放进 `plugins` 目录,重启服务端
2. 首次启动会生成 `config.yml`、`messages.yml`、`gui.yml`
3. 按需改完执行 `/hangprofile reload`
前置全部可选:`PlaceholderAPI`(第三方变量)、`Vault` + 经济插件(`%money%`)、`CraftEngine`(`ce:` 自定义物品),都不装也能正常使用。
---
*by hangzong(航总) | Hang 系列插件 | 技术支持V: hang060217 | 交流Q群: 361919269*
[/MD]
Q群361919269 禁广 有报错或者问题或有想添加的功能可以跟我说
Q群361919269 禁广 有报错或者问题或有想添加的功能可以跟我说