跳到主要内容

战利品与进度条件

除数据包注册表之外,MiXianTu 还注册了一小批原版类型,让内容包可以在普通的战利品表、战利品修饰器和进度中读取并改变玩家的修炼状态。它们以 "type": "mxt:..." 的形式写在普通的原版 JSON 里,没有特殊的文件布局。

文件位置​

种类使用位置
进度准则data/<namespace>/advancement/<path>.json 中的 criteria 段
战利品函数与战利品条件data/<namespace>/loot_table/<path>.json,或任何接受原版战利品函数与条件的 JSON,例如方块或实体战利品表以及战利品修饰器

进度准则​

四种准则形状相同:一个可选的 definition 过滤器,加上标准的原版玩家谓词。准则写在 criteria 段的 trigger 里,conditions 就是下面两个字段。

准则触发时机definition 的取值
mxt:breakthrough一次突破成功所达到的境界阶段
saturn:ability一次施法提交完成该技能
mxt:alchemy一批炼丹完成该配方
mxt:tribulation一次天劫成功完成该天劫
字段类型默认说明
player原版玩家谓词无作用于获得该进度的玩家
definitionIdentifier无只对该定义触发;省略时任何定义都会触发该准则

saturn:ability 只认施法:开关类技能按下时的付款另有自己的路径,不触发;引导技能在起手那一下触发一次,之后的脉冲不算。

{
"criteria": {
"foundation": {
"trigger": "mxt:breakthrough",
"conditions": {
"definition": "example:foundation"
}
}
},
"requirements": [["foundation"]]
}

战利品条件​

战利品条件使用原版的 "condition" 分派键:{"condition": "mxt:has_ability", ...}。

条件为真的情形必填字段
mxt:has_ability该实体已被授予此技能ability
mxt:has_curse该实体带有查询所接受的诅咒—
mxt:realm该实体达到过该境界,任意资源链均可realm
mxt:has_spirit_root该实体拥有该灵根spirit_root
mxt:has_element该实体启用的灵根命名的元素中有一个出现在 elements 里elements
mxt:has_physique该实体拥有该体质physique
mxt:technique该实体学过所列出的功法—
mxt:js一个服务端脚本回调返回 trueid

每个条件都有的那个字段:

字段类型默认说明
entity实体选择this检查战利品上下文中的哪个实体:this、attacker、direct_attacker、attacking_player、target_entity 或 interacting_entity

当所选实体不在战利品上下文中时,该条件为假。

mxt:has_curse 的四个过滤字段全部可选,写了的必须对同一个诅咒实例同时成立;一个也不写就只问「身上有没有诅咒」。tags 里的多个标签是「同时带这些标签」,要「任一」请用 mxt:or 包起来。stacks 与 remaining_ticks 是带 min / max 的区间对象(两端都可省略,闭区间),其中 remaining_ticks 对永不过期的诅咒视为无穷大——它答得出下界,永远答不出上界。

字段类型默认说明
curse诅咒条目无只认这一条诅咒
tags标签数组[]诅咒必须带上的全部标签
stacks区间无层数区间
remaining_ticks区间无剩余时长区间,单位刻

mxt:has_spirit_root 的 spirit_root 字段接受条目、# 标签或它们的数组,所以「任意火属灵根」写一条标签即可。mxt:has_element 问的是更粗的那一层——「是不是火属修士」:elements 是一个元素引用列表,每一项可以是一个元素或一个 # 标签,之后新加的同类灵根无需改动战利品表,elements 至少写一项(空数组在加载期被拒绝)。

mxt:technique 的两个字段与同名实体条件同形:

字段类型默认说明
techniques条目或标签数组[]要问的功法;空表问的是「学过任意一门」
matchany / allanyall 要求列表里每一项都学过;all 配空表在加载期被拒

它读的是身体持有的授予账本,不是当前包里的定义;功法没有「启用/停用」开关,学过就是学过。

{
"conditions": [
{"condition": "mxt:has_spirit_root", "spirit_root": "example:fire_root"},
{"condition": "mxt:realm", "realm": "example:foundation"}
]
}

mxt:js 接受一个用 MxtLoot.condition(...) 注册的 id,以及一个可选的 params 对象。与内置条件不同,它没有 entity 字段:回调收到完整的原版战利品上下文,由它自己决定读取哪个实体。回调缺失时条件为假,回调抛异常时也为假,两者都会记一条日志。

{"condition": "saturn:js", "id": "example:first_clear", "params": {"dungeon": "example:fire_temple"}}

战利品函数​

战利品函数使用原版的 "function" 分派键:{"function": "mxt:grant_ability", ...}。每个函数也都接受原版的 conditions 字段。

函数效果
mxt:grant_ability授予实体一个持久技能来源,并刷新它的事件规则订阅
mxt:set_artifact_owner把掉落出的法器归属给某个实体,然后运行该法器的 claim_action
mxt:apply_curse对某个实体施加一个诅咒,以 mxt:loot 作为施加来源
mxt:js用服务端脚本返回的内容替换生成的物品栈

mxt:grant_ability​

字段类型默认说明
abilityIdentifier必填要授予的技能
entity实体选择this接受该技能的实体
sourceIdentifiermxt:loot随授予一起记录的来源 id,以便按来源撤销该技能
{
"function": "mxt:grant_ability",
"ability": "example:fire_manual",
"source": "example:fire_temple"
}

mxt:set_artifact_owner​

字段类型默认说明
entity实体选择this成为该法器拥有者的实体

如果该物品栈已经属于另一个拥有者,则什么也不会发生:掉落物保持原样,claim_action 也不会运行。

归属写成功时,claim_action 会跑一遍——和长按认主付的是同一份代价、跑的是同一套效果(认主的代价就是这条行为的默认值),因为两条路走同一段认主结算。但这条路上不判 claim_condition:那道条件是长按手势自己的门槛,战利品表已经用自己的判断指名了主人。

{
"function": "mxt:set_artifact_owner"
}

mxt:apply_curse​

字段类型默认说明
curseIdentifier必填要施加的诅咒
stacksInteger 1..2561施加多少层该诅咒
entity实体选择this接受该诅咒的实体
{
"function": "mxt:apply_curse",
"curse": "example:blood_oath",
"stacks": 2
}

mxt:js​

字段类型默认说明
idString必填用 MxtLoot.function(...) 注册的回调 ID
paramsObject{}传给回调的任意 JSON
{
"function": "saturn:js",
"id": "example:bless",
"params": {"multiplier": 3}
}

回调收到生成的物品栈和战利品上下文,并返回要保留的物品栈:原样返回入参表示不动掉落物,返回新的物品栈表示替换它,返回 null 表示保留原物品。回调缺失或执行失败时,物品栈保持不变,并记录一条日志。

综合示例​

一个只对已经拥有对应灵根的玩家掉落一本手册的箱子:

{
"type": "minecraft:chest",
"pools": [
{
"rolls": 1,
"entries": [
{"type": "minecraft:item", "name": "minecraft:book"}
],
"conditions": [
{"condition": "mxt:has_spirit_root", "spirit_root": "example:fire_root"}
],
"functions": [
{"function": "mxt:grant_ability", "ability": "example:fire_manual"}
]
}
]
}