Skip to content

强化脚本 ​

编辑器最终生成的也是 JavaScript。习惯手写时,在升级方案中填写 物品升级 和 物品预览 即可,完整 YAML 结构见 升级方案配置。

先选一个最接近需求的例子,再查下方的方法说明:普通成长看例一,概率淬炼看例二,换武器进阶看例三。

写在哪里 ​

yaml
你的方案ID:
  # 这里还需要物品匹配、经验公式等配置
  物品升级: |-
    // 正式强化时执行
    return true;
  物品预览: |-
    // 修改预览物品,展示成功后的效果
    return true;

脚本缩进到配置项下面,直接写代码和 return,不必再包一层函数。建议使用 var、普通函数等兼容写法。

文件保存到 plugins/RedmiItemEnhance/升级/你的文件.yml,执行 /rmenhance reload 后生效。需要一份能直接改用的完整配置,可以从 最小升级方案 开始。

只有返回布尔值 true 才算成功。 正常成功后插件自动加 1 级、经验归零;false、没有返回值或脚本报错都不会正常加级。不要写成字符串 'true'。

返回 false 时,当前等级的经验会填到本级要求;已经扣掉的材料、已经修改的属性不会自动撤销。因此先检查条件,再扣材料和修改物品。

脚本中可直接使用什么 ​

名称用途
item当前处理的物品;预览时是副本
player当前玩家
强化本插件的等级、经验、材料和进阶方法
物品RedmiAssyLib 的名称、Lore、附魔、NBT 方法
玩家、动作、工具RedmiAssyLib 提供的对应脚本方法
handle本次强化的信息,材料方法也需要传入它

这些名字由插件直接提供,照着写即可。比如 物品 是方法工具,item 是正在修改的那件装备。

常用等级写法:

javascript
var 强化前等级 = Number(handle.beforeLevel);
var 目标等级 = 强化前等级 + 1;
var 当前物品经验值 = Number(强化.获取当前经验值(item));
var 物品升级所需经验值 = Number(强化.获取升级所需经验(item, handle));

这是当前编辑器生成脚本使用的变量:强化前等级 是本次调用开始前的等级,目标等级 是本次要到达的等级。旧版编辑器中的 当前等级、强化后等级 已废弃;手写脚本如果确实需要读取物品当前等级,仍可调用 强化.获取等级(item),但不要再把旧变量用于新的编辑器配置。

例一:升级时攻击力 +2 ​

下面内容放入 物品升级。用于逐级升级的方案应同时配置正数经验公式。

javascript
var 强化前等级 = Number(handle.beforeLevel);
var 目标等级 = 强化前等级 + 1;
if (目标等级 > 10) return false;

var 攻击力 = 物品.物品数值获取(item, '攻击力', 0);
if (攻击力 == null) return false;

强化.设置物品数值(item, '攻击力', Number(攻击力) + 2, 0);
物品.修改物品名(item, '§f粗糙的剑 §6+' + 目标等级);
强化.刷新经验上限(item, 目标等级, handle);
return true;

物品要先有“攻击力”数值。读取失败会得到 null,应先判断,再转为 Number。上述代码只改物品数据,也可以复制到 物品预览 中展示相同变化。

例二:检查材料,按概率淬炼 ​

这是一个简化例子:需要 2 个红米淬炼石,成功率 75%,成功时攻击力 +2,失败不扣材料。把下面这些项写在同一个方案下,物品匹配等配置另行填写:

yaml
经验公式:
  '1-10': '0'
物品升级: |-
  var 强化前等级 = Number(handle.beforeLevel);
  var 目标等级 = 强化前等级 + 1;
  if (目标等级 > 10) return false;
  if (handle.enhanceInventory == null) return false;
  var 攻击力 = 物品.物品数值获取(item, '攻击力', 0);
  if (攻击力 == null) return false;
  if (强化.获取材料数量('[rm]淬炼石', handle) < 2) return false;
  if (!工具.获取成功率(0.75)) return false;

  强化.消耗材料('[rm]淬炼石', 2, handle);
  强化.设置物品数值(item, '攻击力', Number(攻击力) + 2, 0);
  return true;
物品预览: |-
  if (Number(强化.获取等级(item)) >= 10) return false;
  var 攻击力 = 物品.物品数值获取(item, '攻击力', 0);
  if (攻击力 == null) return false;
  强化.设置物品数值(item, '攻击力', Number(攻击力) + 2, 0);
  return true;

脚本里的 工具.获取成功率(0.75) 表示 75%;编辑器的成功率输入框则填写 75。

想让失败也扣材料,将 强化.消耗材料 移到概率判断前面即可;材料数量检查仍要放在消耗之前。

例三:换成精良的剑,从 0 级开始 ​

以下片段用于“粗糙的剑”当前 10 级的进阶阶段,要求目标等级 11 的经验公式设为 0,并已准备好精良的剑物品和方案。它与当前默认编辑器配置一样,按材料名称包含“魔晶石”进行手动匹配:

javascript
if (Number(强化.获取等级(item)) != 10) return false;
if (handle.enhanceInventory == null) return false;
if (强化.获取材料数量('[manual]', '魔晶石', '', handle) < 1) return false;

强化.消耗材料('[manual]', '魔晶石', '', 1, handle);
强化.转移物品数据(player, item, '精良的剑');
强化.修改物品方案(item, '精良的剑');
强化.修改物品等级(item, 0, handle);
强化.修改物品经验(item, 0, handle);
handle.skipAutoLevel = true;
return true;

转移物品数据 的第三个参数是 不带 [rm] 前缀的红米物品 ID。它会覆盖材质、数量、NBT 等物品数据,不会自动保留原属性。

修改物品方案 填的是强化方案 ID。handle.skipAutoLevel = true 用来跳过这次自动加级,否则返回成功后会从刚设置的 0 级变成 1 级。

这个阶段的预览只需要操作副本,不要复制扣材料语句:

javascript
if (Number(强化.获取等级(item)) != 10) return false;
强化.转移物品数据(player, item, '精良的剑');
强化.修改物品方案(item, '精良的剑');
强化.修改物品等级(item, 0, handle);
强化.修改物品经验(item, 0, handle);
handle.skipAutoLevel = true;
return true;

这些片段只负责 10 级进阶阶段;组合进完整方案时,前 10 级的成长逻辑也要保留。

名称匹配是“包含”关系,因此示例包中的“下级魔晶石”可以通过。若要限制为某个确切的红米物品,可以改用 [rm]下级魔晶石;这属于自定义匹配方式。

强化专用方法 ​

读取等级、经验和计算数值 ​

javascript
强化.获取等级(item);
强化.获取当前经验值(item);
强化.获取升级所需经验(item, handle);
强化.计算数值('{level}*2+10', 目标等级);

前两项返回当前等级、当前经验。获取升级所需经验 返回下一目标等级要求的经验;没有对应配置时可能为 null。计算数值 用传入的等级替换 {level},返回公式结果。

修改等级、经验和经验显示 ​

javascript
强化.修改物品等级(item, 5, handle);
强化.修改物品经验(item, 0, handle);
强化.刷新经验上限(item, 5, handle);

前两项直接设置数据,不会补执行之前等级的属性脚本。如果本次要停在手动设置的等级,另外写 handle.skipAutoLevel = true。

刷新经验上限 的第二个参数是 刷新后物品所在的当前等级。传 5 就读取升到 6 级的经验要求;只改已有经验 Lore 的上限,不修改实际等级或经验。

设置数值与增加区间数值 ​

javascript
强化.设置物品数值(item, '暴击几率', 3.5, 1);
强化.增加物品数值(item, '攻击力', 2, 4, 0);

第一行将“暴击几率”后的数值设为 3.5。第二行用于 攻击力: 10-20 这样的双数值区间,将其改为 12-24。

最后一个参数是小数位数,范围 0–6。这两个方法返回修改的 Lore 行号,找不到对应数值返回 -1。单个数值的增长,可以像例一一样先读取,再设置。

材料与方案切换 ​

javascript
强化.获取材料数量('[rm]淬炼石', handle);
强化.消耗材料('[rm]淬炼石', 2, handle);
强化.修改物品方案(item, '精良的剑');
强化.转移物品数据(player, item, '精良的剑');

材料 ID 支持 [rm]、[ni]、[mm],读取和消耗的都是 强化界面材料槽。条件方块“检查强化材料”还支持第四种来源“手动匹配”:选择该来源后不填写物品 ID,改填 Name 包含文本、Lore 包含文本,至少填写一个;两项都填写时必须同时满足。编辑器生成的脚本形式如下:

javascript
强化.获取材料数量('[manual]', '经验石', '提供经验', handle);
强化.消耗材料('[manual]', '经验石', '提供经验', 2, handle);

Name 是物品显示名称的包含匹配,Lore 是任意一行的包含匹配。材料不够时,“消耗材料”不会消耗,也不会替你返回失败,所以必须先检查数量。

击杀或指令触发的升级没有强化界面,不能直接使用界面材料方法。单独切换方案不会清零等级、经验,也不会更换物品模板。

常用物品方法 ​

写法效果
物品.修改物品名(item, '§a精良的剑')修改名称
物品.物品数值获取(item, '攻击力', 0)读取标识后的数值,最后一项是小数精度,0 为整数
物品.替换Lore(item, '旧文本', '新文本')替换匹配的 Lore 文本
物品.替换Lore(item, 0, '§7新的第一行')替换整行,行号从 0 开始
物品.插入Lore(item, 1, '§7新增的一行')在指定位置插入 Lore
物品.设置附魔(item, 'FIRE_ASPECT', 1)设置附魔,名称按服务端版本选择

完整通用方法可查 物品方法、玩家方法、动作方法、工具方法。

预览要单独处理 ​

物品预览 中可以改预览副本的名称、Lore、附魔,或把副本换成进阶模板;不要扣材料、扣货币、发奖励、执行指令或再次抽取成功率。item 虽然是副本,但 player 和强化界面的材料仍是真实数据。

没有填写物品预览时,当前插件会尝试使用物品升级脚本预览。 如果正式脚本有扣材料等操作,务必提供单独的预览,避免只是查看结果就触发实际消耗。

报错时先看控制台给出的方案、等级和脚本错误,再检查物品 ID、Lore 标识及方法参数。