Skip to content

消耗条件与变量

上一页:施法模式与吟唱 · 下一页:脚本


本页讲技能放出去之前要付出的代价,以及能不能放的前置条件,最后是怎么把数据透传给 MythicMobs按等级成长。四块内容:

字段作用
💧 资源消耗resource.<键>扣法力之类的资源池
🩸 生命 / 饥饿消耗cost.health / cost.hunger血祭流派,扣原版血量 / 饥饿
✅ 声明式条件conditions一组「满足才放」的判定
📦 变量 & 等级variables / levels传给 MM、按等级缩放

🖼️ [图片占位] 一次施放的门控顺序图(资源 → 血祭 → 条件 → 放出) · 建议 assets/cost-gate-flow.png


💧 资源消耗 resource.<键>

最常见的就是法力 mana

yaml
resource:
  mana: 15        # 放出成功时扣 15 点法力,不够则拦下并提示

⚠️ 重要:mana 等资源池将来归 QinhClass(QC)管,现在是临时占位。 QS 现在通过自己的 PlayerSkillProfile 扣费缝临时管这个数(吟唱扣费也复用同一条缝,不另造池子)。 等 QC 接管时只改这一处,你现在写的 resource.mana 不用动。

资源的初始值 / 上限在 config.ymlresources.* 段:

config.yml默认含义
resources.default_mana100.0玩家初始法力
resources.max_mana100.0法力上限

🩸 生命 / 饥饿消耗(血祭)

cost.healthcost.hunger 扣的是原版属性,不是上面的法力池。血祭流派(用血量当资源)就靠它。

字段单位 / 规则
cost.health扣血量,半心 = 1。血量 ≤ 此值时无法施放;扣完保底 0.5(不会扣死自己)
cost.hunger扣饥饿值
yaml
cost:
  health: 4.0      # 扣 2 颗心;血量≤4 时放不出来,扣后至少留 0.5
  hunger: 2        # 扣 1 格饥饿

💡 血祭技能可以完全不写 resource——纯靠血量当代价。下面就是一个纯血祭例子。

完整示例:血祭技能(纯扣血,不吃法力)

yaml
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 是一组字符串列表,全部满足才能放。简单的「能不能放」用它就够了,不用写脚本。

yaml
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_gamemodeSURVIVAL / CREATIVE / ADVENTURE / SPECTATOR
player_sneaking布尔(true/false/1/yes
player_sprinting布尔
player_on_fire布尔
player_on_ground布尔
player_yY 坐标
has_target是否有目标(被动目标 / 准星目标)
target_type目标实体类型,如 ZOMBIE
target_distance与目标距离

完整示例:多条件技能(只在特定情况下能放)

yaml
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.键> 读。

yaml
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 技能)

⚠️ 两处容易搞错(已对照源码核对):

  1. 你写的 variables: / levels.params: 键,在 MM 里是原样、不带前缀——variables.element<skill.var.element>levels.params.power<skill.var.power>。(脚本 ctx 里才带 var_ 前缀,两套别混。)
  2. MM 侧拿不到 playerlevel:玩家名用 <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 递增

yaml
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")

脚本详见 脚本


📚 继续阅读