Snowygems

宝石配置

gems/ 目录下宝石的全部字段、Rewards 奖励函数、Require 适用范围写法与完整示例。

宝石配置

宝石定义放在 plugins/SnowyGems/gems/ 下,文件名任意,插件加载目录里所有 .yml文件名会成为 /sgem view 的分类名,所以建议按用途分文件。

一个最小可用的宝石:

生命宝石:                      # 宝石 ID,全局唯一,命令里用它
  Name: 生命宝石
  Require:
    - ARMOR                   # 只能镶嵌到盔甲上
  Display: "&c&l生命宝石"       # 物品显示名
  Tips:
    - "&7镶嵌后生命上限 +1"
  Material: REDSTONE
  SuccessTip: "&f生命上限&c&l+1"
  Rewards:
    - Attribute{name=health;operation=0;slot=auto;var=v+1;limit=5}
顶层的键(这里的 生命宝石)就是宝石 ID,必须全局唯一——即使在不同文件里也不能重名,后加载的会覆盖先加载的。

字段表

以下是插件实际会读取的全部字段,其余字段写了会被静默忽略。

字段类型说明
Name文本宝石内部名,不填则用 ID
Type文本不填=镶嵌类;PlayerGem=右键直接生效;RandomGem=开箱抽奖
Require列表可镶嵌到哪些物品上,OR 语义。见下文
Display文本宝石物品的显示名,支持 & 颜色码
Tips列表宝石物品的 lore
Texture文本头颅 base64 材质。填了会强制用 PLAYER_HEAD
Material文本不用头颅时的物品材质,默认 PAPER
Color文本皮革/药水染色,需配合 Material: POTION
Glow布尔是否附魔光效
Eat布尔true 则需要「饮用/食用」而非右键
Success整数成功率 1-100,默认 100
Embed整数镶嵌位权重
Gui列表限定只能在哪些界面使用
SuccessTip文本成功提示。填 none 则不发消息
RemoveTip文本拆卸提示
FailTip文本失败提示
Rewards列表真正干活的部分,见下文
Gems映射RandomGem 用:子宝石ID: 权重
Embed 目前不生效。 这个字段会被解析并存进配置对象,但代码里没有任何地方读取它做判断——也就是说它既不限制镶嵌数量,也不影响拆卸费用。示例配置里写 Embed: 1 只是占位习惯。如果你需要「一件装备最多镶几颗」的限制,当前版本做不到,别指望这个字段。

Require:宝石能镶到什么上

Require 是列表,命中任意一条即通过(OR 语义)。留空表示任何物品都行。

写法含义
分类关键字按物品类别匹配WEAPON TOOL ARMOR SWORD PICKAXE MACE SPEAR RANGED MELEE HELMET BOOTS
_后缀物品名以此结尾,任意材质_SWORD 匹配石剑/铁剑/钻石剑
前缀*物品名以此开头COPPER_* 匹配整套铜装备
精确物品名单一物品DIAMOND_SWORD
LORE:文本物品 lore 含指定文本LORE:传说
NOTHING / ALL / ANY无条件通过

分类关键字不是硬编码的清单,而是启动时读服务端注册表建的索引。所以 1.21.11 的矛会自动落进 WEAPON/MELEE/RANGED/SPEAR,铜盔甲会自动落进 ARMOR——你不需要改配置。完整清单用 /sgem compat all 查看。

Require:
  - WEAPON        # 任意武器
  - TOOL          # 或任意工具
  - SHIELD        # 或盾牌

Rewards:宝石实际做什么

Rewards 是列表,每行是一个函数调用,语法 函数名{参数1=值;参数2=值}

阶段标记

行尾可以加标记决定这条在什么时候执行:

标记含义
$onSuccess镶嵌成功时执行(默认,不写就是这个)
$onRemove拆卸时执行,常用来收取拆卸费
Rewards:
  - LoreAdd{lore=&6&l[&c&lBUFF&6&l] &b&l发光}
  - Point{amount=-1000} $onRemove      # 拆卸时扣 1000 点券

每条 Rewards 相互独立,其中一条没生效不会中断后面的条目。

函数清单

函数作用示例
Attribute属性加成,可叠加可回退Attribute{name=health;operation=0;slot=auto;var=v+1;limit=5}
Enchant附魔增删Enchant{name=unbreaking;limit=7}
LoreAdd加一行 loreLoreAdd{lore=&b强化装备;mode=after}
LoreVar加带数字的 lore,可叠加LoreVar{lore=&b等级 ;var=v+1;format=%.0f;limit=v<=4;mode=last}
LoreReplace替换 loreLoreReplace{old=普通;new=稀有}
Name改物品显示名Name{name=&6传说之剑}
Unbreakable设为无限耐久Unbreakable
Durability修复耐久Durability{amount=1000}
ItemFlag添加隐藏标记ItemFlag{HIDE_ENCHANTS}
Point增减点券Point{amount=500}
Money增减金币(需 Vault)Money{amount=1000}
MaxHealth玩家永久生命上限MaxHealth{amount=1;limit=30}
ExpLevel给经验等级ExpLevel{amount=50}
ItemGive给予其他宝石ItemGive{gem=碎片;amount=10}
ItemTake扣除其他宝石ItemTake{GEM:碎片=10}
SkillToNBT隐藏/显示技能 loreSkillToNBT
Conditional条件奖励Conditional{condition=$LORE:等级:$>=3;reward=Enchant{name=sharpness}}
Empty占位,什么都不做Empty
Empty 的用途:宝石本身不改装备,纯靠 Tips 里写的 BUFF 标记生效(拿在手里或穿在身上就有效果)。见 FunctionGem.yml 里的「巨无霸汉堡」。

Attribute 详解

这是最常用也最容易写错的函数。

Attribute{name=health;operation=0;slot=auto;var=v+1;limit=5}
参数说明
name属性名,支持简写/现代键/旧常量名三种写法
operation0=直接加数值,1=按基础值百分比加,2=按最终值百分比乘
slot生效槽位,见下表
var计算表达式,v 是当前已叠加的值
limit能叠加到的极限值

slot 可选值:head chest legs feet hand off_hand any_hand(任意手持)armor(任意盔甲位)any(任意位置,放背包里也生效)auto(按物品类型自动推断,推荐)。

limit 必须和 var 方向同号。 limit 是「能加到的极限值」而不是「加多少次」。写 var=v-0.1 却配 limit=0.3,第一次镶嵌算出 -0.1 会被夹回 0.3 上限内——实际表现是宝石永远不生效,且没有任何报错。减法要配负 limit:

# 对:缩小体型,最多缩到 -0.3
- Attribute{name=scale;operation=0;slot=any;var=v-0.1;limit=-0.3}
# 错:limit 是正数,宝石永远不生效
- Attribute{name=scale;operation=0;slot=any;var=v-0.1;limit=0.3}

常用属性简写:

简写实际属性备注
health最大生命
damage攻击力
armor / toughness护甲 / 护甲韧性
move / speed移动速度
attack_speed攻击速度
kbr击退抗性
luck幸运
scale / size体型1.20.5+
block_reach方块交互距离1.20.5+
attack_reach / entity_reach实体交互距离1.20.5+
water_mining水下挖掘速度1.21.2+
mining_efficiency挖掘效率1.21.2+
jump跳跃力1.20.5+
gravity重力1.20.5+
absorption吸收上限1.20.5+
safe_fall安全落地距离1.20.5+

旧版 Bukkit 常量名(如 GENERIC_MAX_HEALTH)与现代注册表键(如 max_healthminecraft:scale)也都能直接写。完整清单见多版本兼容

表达式语法

varlimitamount 等参数支持简单表达式:

语法说明
算术v+1 v*2 v-0.01v 是当前已叠加的值
比较v<=4结果为 1 或 0
三元v<2?2:3条件成立取前者
随机1000+9000*$RANDOM()$RANDOM() 是 0~1 随机数

多等级宝石常用三元实现「只能从低级升到高级」:

# 生命恢复 II:当前小于 2 就设为 2,否则设为 3
- LoreVar{lore=&b生命恢复 ;var=v<2?2:3;format=%.0f;limit=v<=2;mode=last}

LoreAdd / LoreVar 的 mode 与 locator

参数说明
mode=after插入到定位行之后(默认)
mode=before插入到定位行之前
mode=line追加到定位行同一行末尾
mode=last(LoreVar)放在末尾
locator=文本定位行,不填则用最后一行
limit=数字最多加几行(LoreAdd)
force=true忽略 limit 强制添加

三种宝石类型

镶嵌类(默认)

不写 Type 即是。玩家在镶嵌台里把宝石和装备放在一起,点确认生效。

PlayerGem:右键直接生效

作用于玩家自己,不需要目标装备。用于兑换券、饮品。

蛇胆:
  Name: 蛇胆
  Type: PlayerGem
  Display: "&c&l蛇胆"
  Tips:
    - "&7饮用后永久增加&c1&7点生命"
  Material: "POTION"
  Color: "MAROON"
  Eat: true                    # 需要「喝」的动作,不是右键
  SuccessTip: "&f生命上限永久&c&l+1"
  Rewards:
    - MaxHealth{amount=1;limit=30} $onSuccess
PlayerGem 不能用作用于物品的奖励AttributeEnchantLoreAddUnbreakable 等),因为这类宝石没有目标物品。写了会在日志里报「本次操作没有目标物品」并跳过。它只能用 MaxHealthExpLevelPointMoneyItemGiveItemTake

RandomGem:开箱抽奖

右键后按权重抽一个子宝石当场生效。权重是相对值,不需要凑成 100。

新版宝石礼包:
  Name: 新版宝石礼包
  Type: RandomGem
  Display: "&e&l新版宝石礼包"
  Tips:
    - "&7右键开启,随机获得一颗宝石"
  Material: CHEST
  Glow: true
  SuccessTip: "none"           # none = 不发默认消息,由子宝石自己提示
  Gems:
    缩小宝石: 20
    延伸之瞳: 15
    密度宝石: 3
    战锤大师宝石: 1

子宝石必须是已存在的宝石 ID,可以来自任何 gems/ 文件。


BUFF 类宝石:与技能定义配对

BUFF 宝石的原理是:往装备 lore 里写一行标记,BUFF 引擎每秒扫描装备,命中标记就施加对应效果。

两边必须成对配置

发光药水:
  Name: 发光药水
  Require:
    - WEAPON
    - ARMOR
  Display: "&e&l发光药水"
  Tips:
    - "&7镶嵌后获得发光效果"
  SuccessTip: "&f装备添加&e&l发光&fBUFF"
  Rewards:
    - LoreAdd{lore=&6&l[&c&lBUFF&6&l] &b&l发光}   # ← 这里
    - Point{amount=-1000} $onRemove
两边文本不一致是最常见的坑:宝石镶嵌上了、lore 也写了,但没有任何效果,且不报错。匹配时会去掉颜色码并 trim,所以颜色写法的小差异不影响,但文字必须一样。

可叠加等级的 BUFF 用 LoreVar 写数字,BUFF 定义那边用 $LORE:标记?默认值$ 读回来:

Rewards:
  - LoreVar{lore=&6&l[&c&lBUFF&6&l] &b&l抗性提升 ;var=v+1;format=%.0f;limit=v<=1;mode=last}

$LORE: 里的标记要写去掉颜色码的形式。


完整示例:新版本内容宝石

gems/ModernGem.yml 里有 27 颗覆盖新版本内容的示例宝石,可直接抄改:

缩小宝石:
  Name: 缩小宝石
  Require:
    - ARMOR
  Display: "&d&l缩小宝石"
  Tips:
    - "&7穿戴后体型缩小 &d10%"
    - "&8需要 1.20.5+ 服务端"
  Material: AMETHYST_SHARD
  Glow: true
  SuccessTip: "&f体型&d&l-10%"
  Rewards:
    - Attribute{name=scale;operation=0;slot=any;var=v-0.1;limit=-0.3}

低版本服务端上这些宝石会被自动跳过并在控制台说明,不影响其他宝石。


验证配置

改完配置后:

  1. /sgem reload 重载
  2. 看控制台。如果有写错的条目,插件会报「配置自检发现 N 处写错的条目」
  3. /sgem compat all 查看自检明细,包括「当前版本不支持所以跳过」和「写错了」两类

自检会区分这两类:版本不支持是正常状态(同一份配置发到不同版本的子服),只记 Debug 日志;名字拼错、函数不存在则任何版本都不会生效,会明确报出来。想让写错的条目更醒目,把 config.ymlCompat.OnMissingFeature 改成 warnstrict

Copyright © 2026