Snowygems

排错与调试

「宝石点了没反应」的系统排查路径、调试日志用法、以及全部已知的配置陷阱。

排错与调试

宝石类插件最难排查的问题是静默失效:镶嵌成功了,也没报错,但装备上什么都没变。本页按「先看什么、再看什么」的顺序整理排查路径。


排查三步

跑配置自检

/sgem reload
/sgem compat all

自检会列出所有「写错的条目」(含拼写建议)和「当前版本不支持所以跳过的条目」。大部分问题在这一步就能定位。

开对应的 debug tag

/sgem debug Reward,GemManager      # 镶嵌相关
/sgem debug Skill,SkillExec        # 技能相关
/sgem debug Menu,Workbench         # 菜单相关
/sgem debug Buff                   # 常驻 BUFF

日志会打印每一步的判定过程和结果,包括「为什么这条没生效」。

看完关掉

/sgem debug all      # 恢复输出全部 tag
/sgem debug          # 切换总开关

日志量很大,排查完记得关。


debug tag 清单

/sgem debug <tag>[,<tag>] 可只看指定范围。

tag覆盖范围
Registry配置文件加载(宝石/菜单/技能)
Compat版本兼容层:注册表快照、物品分类、能力探测
Command/sgem 各子命令
Menu工作台菜单的点击/拖拽/关闭/镶嵌
Workbench菜单的打开与图标渲染
Embed内置镶嵌台的放入/校验/镶嵌
GUI/sgem view/sgem inspect 面板
GemUse右键/食用直接使用宝石
Protect宝石防放置保护
GemManager镶嵌/拆除/给予的核心逻辑
ItemFactory宝石物品构建与 NBT 读写
Reward奖励函数执行
Skill技能触发判定
SkillExec技能函数执行
BuffBUFF 定时引擎
Points点券账户
MoneyVault 经济
PlayerPointsPlayerPoints 对接过程

也可以在 config.yml 里持久化:

Debug: true
DebugTags: [Reward, GemManager]
BUFF 引擎每秒跑一次,Buff tag 会疯狂刷屏。插件对重复内容做了去重(同样的内容不重复输出),但换个装备或换个玩家就会再打一次。排查完立刻关掉。

静默失效的常见原因

按遇到频率排序。

1. Attribute 的 limit 与 var 方向不同号

症状:属性宝石镶嵌「成功」,提示也发了,但装备属性没变。

limit 是「能加到的极限值」,不是「加多少次」。减法必须配负 limit:

# 错:第一次算出 -0.1,被 coerce 夹回 0.3 以内,等于没变化
- Attribute{name=scale;operation=0;slot=any;var=v-0.1;limit=0.3}
# 对
- Attribute{name=scale;operation=0;slot=any;var=v-0.1;limit=-0.3}

排查/sgem debug Reward,日志会打印 Attribute(scale) 未生效: 已叠加值=0.0 已达上限或无变化(limit=0.3)

2. BUFF 宝石与 BUFF 定义的标记不一致

症状:BUFF 宝石镶嵌成功,装备 lore 上也有那行字,但没有任何效果。

宝石 LoreAdd{lore=...} 写的文本必须和 BUFF 定义的 Lore: 一致(去色后比较)。

排查/sgem debug Buff,如果日志里从来没有「命中 BUFF 定义」,就是标记对不上。

3. 技能行漏写触发标记

症状:技能完全不触发。

# 错:没有 ~onUse,永远不会被触发
- Blink{distance=32} @Forward
# 对
- Blink{distance=32} ~onUse @Forward

排查:配置自检会直接报「这一行没有写触发标记,永远不会被触发」。

4. 技能定义没写 Lore

症状:装备拿在手里,技能不触发。

技能靠装备 lore 文本绑定。Lore 留空的定义不会被任何装备触发(只能作为 Switch 的目标形态或被 Reward{} 嵌套调用)。

5. PlayerGem 用了作用于物品的奖励

症状:右键饮用/使用后,提示发了但没效果。

PlayerGem 没有目标物品,不能用 AttributeEnchantLoreAddUnbreakable 等。只能用 MaxHealthExpLevelPointMoneyItemGiveItemTake

排查/sgem debug Reward,日志会打印「本次操作没有目标物品」。

6. 用了当前版本不存在的内容

症状:某些宝石在 A 服正常,在 B 服无效。

排查/sgem compat 对比两个服的能力清单。这属于正常行为,不是 bug。

7. $LORE: 引用的标记与自身 Lore 不一致

症状:可叠加等级的 BUFF 等级永远是 1,不涨。

抗性提升:
  Lore: "&6&l[&c&lBUFF&6&l] &b&l抗性提升 "
  Skills:
    # $LORE: 里必须写去色后的形式,且和上面 Lore 一致
    - Potion{type=resistance;level=$LORE:[BUFF] 抗性提升?1$} ~onTimer

8. 改了配置没重载

只有 lang.yml 是热重载的(保存即生效)。config.ymlgems/skills/gui/ 都需要 /sgem reload


不生效但不是 bug 的情况

这几种「没变化」是插件的有意设计,避免玩家白吃宝石:

场景行为
属性已达 limit视为未生效,宝石不消耗
附魔已经是目标等级视为未生效
level=0 但物品本来就没这个附魔视为未生效
耐久已满还用修复宝石视为未生效
生命已满还用治疗技能返回 false

日志里会明确写「视为未生效」,不用怀疑是坏了。


已知的不生效字段

以下字段会被解析,但代码里没有任何地方读取它们做判断——写了不起作用

位置字段说明
宝石配置Embed不限制镶嵌数量,也不影响拆卸。示例里写 Embed: 1 只是占位
菜单配置Page没有翻页功能
菜单配置Locations没有「在世界坐标放置工作台」的功能

菜单类型里的 PAGE_PREVPAGE_NEXTPAGE_TIP 同理——它们和 TIP 的行为完全一样(纯装饰),是为将来的翻页功能预留的名字。


报错日志怎么读

「配置自检发现 N 处写错的条目」

后面跟着 [文件.yml -> 宝石ID] 函数{参数} -> 原因。想看完整明细:

  • /sgem compat all
  • 或把 config.ymlCompat.OnMissingFeature 改成 warn

「配置中有 N 处内容当前版本不支持,已跳过」

正常提示,不是错误。想看是哪些,用 /sgem compat all

「未注册的技能函数: XXX —— 你是不是想写: YYY?」

函数名拼错了,按建议改。全部函数用 /sgem skills 查。

「Require 条目 'XXX' 既不是当前版本的物品名,也不是可用的分类关键字」

分类关键字拼错。可用分类清单在同一条日志的括号里,也可用 /sgem compat all 查看。

「附魔 XXX 不在当前版本的注册表中」

用现代命名空间 ID(小写下划线,如 unbreakingsharpness),或确认这个附魔需要更高版本。


数据存在哪里

排查数据丢失问题时可能需要:

数据位置
宝石身份标记物品 NBT:SnowyGemsGemIdSnowyGemsGemType
装备上已镶嵌的宝石列表物品 NBT
属性叠加值物品 NBT:SnowyGemsAttr_<属性名>
LoreVar 的数值物品 NBT:SnowyGemsLoreVar_<哈希>
附魔切换记住的等级物品 PDC:snowygems:ench_<附魔键>
形态切换状态物品 PDC:snowygems:switch_mode
属性修饰符身份NamespacedKey("snowygems", "attr_<属性名>")
内置点券plugins/SnowyGems/data/points.yml

数据全在物品身上,不在数据库里。这意味着:物品被其他插件重建(某些「物品修复」「跨服同步」插件会丢 NBT)、放进展示框、或者被合成消耗,宝石数据就没了。

插件已经拦截了「把宝石当方块放置」和「把宝石塞进展示框」两种最常见的丢失场景(Protect tag),但无法拦住所有第三方插件的行为。


性能问题

症状:在线人数多时 TPS 下降。

BUFF 引擎每秒对每个在线玩家扫 6 个物品槽 × 所有带 Lore 的技能定义。定义数量大(几百个)叠加高在线人数会有可观开销。

排查与缓解:

  1. /sgem reload 后看控制台的「已加载 N 个技能/BUFF 定义,带 Lore 标记可触发的共 M 个」——M 才是每秒参与扫描的数量
  2. 删掉不用的 BUFF 定义,别留着
  3. 一次性效果用事件触发标记(~onUse 等),不要用 ~onTimer
  4. 避免 Repeat 配很短的 interval 用在高频触发的技能上

求助时请提供

如果自己排查不出来,提供这些信息能大幅加快定位:

  1. /sgem compat all 的完整输出
  2. 开对应 tag 后完整操作一次的日志(不要只截结尾)
  3. 相关宝石/技能的配置片段
  4. 服务端版本与实现(Paper/Leaves/Purpur + 具体版本号)
只贴异常堆栈的尾部通常看不出问题。要贴 logs/latest.log 里带 Caused by: 的完整段落。
Copyright © 2026