消耗条件与变量
本页讲技能放出去之前要付出的代价,以及能不能放的前置条件,最后是怎么把数据透传给 MythicMobs 和按等级成长。四块内容:
| 块 | 字段 | 作用 |
|---|---|---|
| 💧 资源消耗 | resource.<键> | 扣法力之类的资源池 |
| 🩸 生命 / 饥饿消耗 | cost.health / cost.hunger | 血祭流派,扣原版血量 / 饥饿 |
| ✅ 声明式条件 | conditions | 一组「满足才放」的判定 |
| 📦 变量 & 等级 | variables / levels | 传给 MM、按等级缩放 |
🖼️ [图片占位] 一次施放的门控顺序图(资源 → 血祭 → 条件 → 放出) · 建议
assets/cost-gate-flow.png
💧 资源消耗 resource.<键>
最常见的就是法力 mana:
resource:
mana: 15 # 放出成功时扣 15 点法力,不够则拦下并提示⚠️ 重要:
mana等资源池将来归 QinhClass(QC)管,现在是临时占位。 QS 现在通过自己的PlayerSkillProfile扣费缝临时管这个数(吟唱扣费也复用同一条缝,不另造池子)。 等 QC 接管时只改这一处,你现在写的resource.mana不用动。
资源的初始值 / 上限在 config.yml 的 resources.* 段:
config.yml 键 | 默认 | 含义 |
|---|---|---|
resources.default_mana | 100.0 | 玩家初始法力 |
resources.max_mana | 100.0 | 法力上限 |
🩸 生命 / 饥饿消耗(血祭)
cost.health 和 cost.hunger 扣的是原版属性,不是上面的法力池。血祭流派(用血量当资源)就靠它。
| 字段 | 单位 / 规则 |
|---|---|
cost.health | 扣血量,半心 = 1。血量 ≤ 此值时无法施放;扣完保底 0.5(不会扣死自己) |
cost.hunger | 扣饥饿值 |
cost:
health: 4.0 # 扣 2 颗心;血量≤4 时放不出来,扣后至少留 0.5
hunger: 2 # 扣 1 格饥饿💡 血祭技能可以完全不写
resource段——纯靠血量当代价。下面就是一个纯血祭例子。
完整示例:血祭技能(纯扣血,不吃法力)
id: blood_nova
display: "&4血祭新星"
meta:
category: combat
type: active
rank: rare
trigger:
primary: SHIFT_RIGHT_CLICK
state:
required: IDLE
graph:
entry: blood_nova
execution:
mythic_skill: blood_nova
type: active
max_level: 1
cooldown:
base: 5000
# 纯血祭:没有 resource 段,只扣血和饥饿
cost:
health: 6.0 # 扣 3 颗心(血量≤6 时放不出)
hunger: 3 # 顺带扣 1.5 格饥饿
variables:
element: blood # 传给 MM,<skill.var.element> = blood✅ 声明式条件 conditions
conditions 是一组字符串列表,全部满足才能放。简单的「能不能放」用它就够了,不用写脚本。
conditions:
- "player_level:>=5" # 等级 ≥ 5
- "player_health_pct:>=50" # 血量百分比 ≥ 50
- "player_in_world:world" # 在主世界语法规则
- 写法
键:值,值可带比较符:>=<===!=><=(不写比较符默认=)。 - 列表空 = 无限制(谁都能放)。
- 未知键恒为真——配错了键名不会把技能锁死,只是那条不起作用。
条件键全表
| 键 | 取值 / 说明 |
|---|---|
player_level | 玩家等级 |
player_health | 血量绝对值 |
player_health_pct | 血量百分比(0–100) |
player_food | 饥饿值 |
player_in_world | 世界名 |
player_has_permission | 权限节点 |
player_gamemode | SURVIVAL / CREATIVE / ADVENTURE / SPECTATOR |
player_sneaking | 布尔(true/false/1/yes) |
player_sprinting | 布尔 |
player_on_fire | 布尔 |
player_on_ground | 布尔 |
player_y | Y 坐标 |
has_target | 是否有目标(被动目标 / 准星目标) |
target_type | 目标实体类型,如 ZOMBIE |
target_distance | 与目标距离 |
完整示例:多条件技能(只在特定情况下能放)
id: execute_strike
display: "&c处决斩"
meta:
category: combat
type: active
trigger:
primary: LEFT_CLICK
state:
required: IDLE
graph:
entry: execute_strike
execution:
mythic_skill: execute_strike
type: active
cooldown:
base: 4000
target: NEAREST # 自动锁最近的目标
conditions:
- "player_level:>=10" # 10 级才解锁这套打法
- "player_sneaking:true" # 必须潜行(蓄势处决)
- "has_target:true" # 必须有目标
- "target_type:ZOMBIE" # 只对僵尸
- "target_distance:<=4" # 4 格内(贴脸)
- "player_gamemode:SURVIVAL" # 创造模式不让用任一条不满足,QS 就拦下并给出对应提示,不扣任何资源。
想要更复杂的判断(多个值组合、调用外部数据)请用脚本
pre_js,见 脚本。
📦 变量 variables(透传 MM)
variables.<键> 把任意值透传给 MM 技能,MM 那侧用 <skill.var.键> 读。
variables:
element: fire # MM 里 <skill.var.element> 读到 "fire"
power: "2.5"除了你写的,QS 还自动注入这些变量(MM 都用 <skill.var.键> 读):
| 自动变量 | 含义 |
|---|---|
mode | 触发模式 |
source | 触发来源 |
slot | 技能槽位(命令桥等无槽位时为 -1) |
playerName | 玩家名(MM 侧是 playerName,没有 player) |
origin | 固定为 QinhSkills |
logicOnly | 固定为 true(标记仅逻辑层调用) |
toggle_state | 开关技能状态 on/off(仅 toggle 技能) |
⚠️ 两处容易搞错(已对照源码核对):
- 你写的
variables:/levels.params:键,在 MM 里是原样、不带前缀——variables.element→<skill.var.element>,levels.params.power→<skill.var.power>。(脚本ctx里才带var_前缀,两套别混。)- MM 侧拿不到
player和level:玩家名用<skill.var.playerName>;技能等级不会注入 MM(它只在脚本ctx.get("level")里有)。想在 MM 按等级缩放数值,请用levels.params:传一个参数(如power)再用<skill.var.power>读。
MM 接收变量的完整说明(含
@Target/@Trigger)见 对接 MythicMobs。
📈 等级成长 levels.N
levels.<等级>.{cooldown_ms, resource, params} 让技能按玩家该技能的等级(1 到 max_level)覆盖数值。
cooldown_ms:该等级的冷却。resource:该等级的资源消耗。params:该等级的参数,也透传给 MM(MM 用<skill.var.power>读)。
合并规则(SkillParamResolver):等级里有就用等级的值,没有就用顶层默认——所以你只需在 levels 里写「随等级变化」的那几项。
完整示例:冷却递减 + power 递增
id: fire_lance
display: "&c烈焰长矛"
meta:
category: combat
type: active
trigger:
primary: RIGHT_CLICK
state:
required: IDLE
graph:
entry: fire_lance
execution:
mythic_skill: fire_lance
type: active
max_level: 3
# 顶层默认(没在 levels 里覆盖的等级 / 字段就用这些)
cooldown:
base: 5000
resource:
mana: 20
variables:
element: fire
levels:
1:
cooldown_ms: 5000 # 1 级:5 秒冷却
resource: { mana: 20 } # 扣 20 法力
params: { power: "1.0" } # power=1.0 → MM 用 <skill.var.power> 缩放伤害
2:
cooldown_ms: 4000 # 2 级:冷却降到 4 秒
resource: { mana: 18 }
params: { power: "1.5" } # 伤害更高
3:
cooldown_ms: 3000 # 3 级:冷却 3 秒(最强)
resource: { mana: 15 } # 消耗反而更低
params: { power: "2.2" }MM 那侧用 <skill.var.power> 乘进伤害公式即可,QS 会按玩家等级把对应的 power 喂过去。
设玩家等级:
/qs level <技能> <等级> [玩家],见 命令与权限。
🔗 这些值在脚本里怎么读
如果你写了 pre_js/post_js 脚本,上面这些变量都能用 ctx.get(键) 读到,注意前缀:
| 来源 | 在脚本里的键 |
|---|---|
variables.<键>(技能变量) | 加 var_ 前缀,如 ctx.get("var_element") |
levels.params.<键>(等级参数) | 加 param_ 前缀,如 ctx.get("param_power") |
| 自动变量(mode/source/level…) | 直接读,如 ctx.get("level") |
脚本详见 脚本。
📚 继续阅读
- 脚本 —
conditions表达不了的复杂逻辑用 JS - 冷却充能GCD与冲突 — 冷却 / 充能 / GCD / 冲突组
- 配置文件 —
resources.*法力上限等全局配置 - 对接 MythicMobs — MM 怎么读
<skill.var.*>