👽 wsmud_Raid 2.3.x 自定义工作流程开发指南




  • 更新记录

    最新更新信息,请前往 更新日志区 查看。


    2.3.0

    新增预置方法 (:cd <param>)(:status <param>)

    2.2.2

    新增静默等待语句 @await。

    2.2.1

    新增预置变量:(:id)(:day)(:date)(:hour)(:minute)(:second)

    2.2.0

    新增了子流程语法。


    简介

    使用 wsmud_Raid 2.x.x 可以简便地自定义一个流程

    相较于 1.x.x 只支持 if 语句,2.x.x 支持 [if][else if][else][while][continue][break] 等更多的控制语句。

    wsmud_Raid 2.1.x 中提供的几乎所有的副本的都是通过类似于下方的 (困难移花宫的) 流程实现的:

    不要怕,这个流程扫一眼即可,下面会拣其中的几个典型语句解释。

    <---
    [if] (:hpPer)<0.8
        @liaoshang
    --->
    jh fb 22 start1;cr huashan/yihua/shandao
    go south[7]
    go south[7]
    @kill 花月奴
    go south;go south
    @kill 移花宫女弟子,移花宫女弟子
    go south
    @kill 移花宫女弟子,移花宫女弟子
    [if] (_DungeonWaitSkillCD) == 打开
        @cd
    go southeast
    @kill 涟星
    [if] (_DungeonWaitSkillCD) == 打开
        @cd
    go northwest;go southwest
    @kill 邀月
    look hua
    @tip 你数了下大概有($number)朵花
    go southeast
    look bed;pushstart bed;pushleft bed[(number)]
    pushright bed[8]
    go down;fire;go west
    @kill 花无缺
    look xia;open xia
    
    复制上方代码

    下面先拿其中一条语句来简单看看:

    <---
    [if] (:hpPer)<0.8
        @liaoshang
    --->
    
    复制上方代码
    • <------> 包围起来的语句是守护语句,它不会立即执行,但是当在其下方的每一条语句执行完毕时,都会执行该条守护语句;
    • [if] (:hpPer)<0.8 是一个条件控制,只有满足该条件才会执行后面语句;
    • 上面条件控制中 (:hpPer) 是使用了一个预置变量,表示角色的气血剩余百分比;
    • @liaoshang 是一条**@语句**,它会执行疗伤直至角色气血回满 (,才会执行接下来的语句)。

    所以这条语句就实现了角色每次行动后,都会检查气血是否少于 80%;若是,就会自动疗伤,直至回满气血后才会执行接下来的语句。

    再来看另外几条语句:

    look hua
    @tip 你数了下大概有($number)朵花
    ...
    pushleft bed[(number)]
    
    复制上方代码
    • @tip 你数了下大概有($number)朵花 中我们等待获取包含 ”你数了下大概有?朵花“ 的系统提示,并创建了一个名为 number 的变量来保存花朵数目 (假设为 3);
    • pushleft bed[(number)] 中我们使用了上面创建的变量 number,所以语句会变成 pushleft bed[3]
    • pushleft bed[3] 等价于 pushleft bed;pushleft bed;pushleft bed,即向左推动床 3 次。

    于是,就这样,我们实现了观察左侧 Boss 房间的花朵数,并推动床相应次数的需求。

    欢迎使用 wsmud_Raid 自定义流程功能编写你自己需要的流程。

    如果想要了解更多,请向下阅读。



  • 1. 系统指令 和 $指令

    $指令 是 wsmud_pluginss 提供的便捷组合指令;大多数 $指令 是由多条系统指令组合而成的。

    多条系统指令 (及 $指令) 可用 ; 连接成为一条语句,一条语句中的系统指令会同时执行。

    例如:

    $to 扬州城-武庙;liaoshang
    
    复制上方代码

    注意:同时执行太多系统指令可能会导致服务器拒绝执行,建议控制同时执行的系统指令条数。

    $指令 的使用参见 wsmud_pluginss 主页

    简写多条重复系统指令

    可以在系统指令后跟随 [数字],表示该语句重复的次数,例如:

    go west[3];go north
    go west;go west;go west;go north
    
    复制上方代码

    上述的两条语句是等价的。

    2. id 占位符

    可以使用形如 {物品名称} 的方式指代 NPC 或物品 id,执行时会自动进行替换,例如:

    select {r崔莺莺};ask {r崔莺莺} about 东厢
    
    复制上方代码

    id 占位符的格式如下:

    {<位置><关键字><品质><是否为精确查找><获取数量>}<可为 null 否>

    除了关键字外,其他均为可选参数,下面来介绍这些可选参数:

    位置

    • r: room 房间内

    • b: bag 包裹内

    • d: dialog 最近打开的列表面板内(目前支持仓库列表和商人列表)

      执行打开列表面板的系统命令后,需要调用 @dialog 以等待列表面板的确实打开,之后再使用 id 占位符。

    如果未指定位置:

    • 也未指定品质,则会按照房间内、包裹内、列表面板内的顺序查找
    • 但指定了品质,则会按照包裹内、列表面板内的顺序查找

    品质

    对于物品,可以指定品质:

    • g:green 绿色
    • b:blue 蓝色
    • y:yellow 黄色
    • p:purple 紫色
    • o: orange 橙色
    • r:red 红色

    如果物品名称是从系统提示中截取的,则已包含品质信息可直接使用:

    @tip 你从平一指购买了一枚($pill)。
    use {b(pill)}
    
    复制上方代码

    建议指代物品时指定其品质。

    是否为精确查找

    默认使用模糊查找,即目标 NPC 或物品名称包含 {} 中给出的关键字即可。

    添加 % 表示进行精确查找,物品名称必须完全吻合 {} 中给出的关键字。例如,下面语句中的前者就是精确查找:

    select {r财主女儿 崔莺莺%};ask {r崔莺莺} about 东厢
    
    复制上方代码

    获取数量

    如果希望获取数量而非 id,则可通过添加 # 标明。例如,将武道残页保存到仓库:

    [if] {b武道残页o%}? != null
        store {b武道残页o%#} {b武道残页o%}
    
    复制上方代码

    可为 null 否

    默认会持续等待,直到找到该 NPC 或物品。

    为什么要如此设置?例如:
    go west
    ok {r丫鬟}
    go west 后的房间信息需要等待服务器返回,{r丫鬟} 会持续等到房间信息(包含房间内的 NPC 信息)返回,以便获取丫鬟的 id。

    如果允许找不到,则需要添加 ?,未找到则为 null

    [if] {b蒙古g}? != null
        fenjie {b蒙古g}?
    
    复制上方代码

    3. 变量使用

    定义、赋值变量

    可以使用形如 ($变量名)=初始值 的语句定义一个变量并初始化,或修改已存在变量的值,例如:

    ($number)=3
    
    复制上方代码

    请使用 大小写字母、数字、_ (下划线) 组成变量名。

    不要定义 _ 开头的变量,Raid 自身使用此类变量名。

    有些 @语句 (下文会介绍) 也可以定义变量。

    使用变量

    在随后的语句中均可以 (变量名) 形式使用之前定义的变量,例如:

    go west[(number)]
    
    复制上方代码

    变量的作用范围

    • 若变量名开头大写则表示是全局变量,将会持久化保存;

      即,在一个流程中定义的全局变量,可以在另外一个流程中使用;在一个流程中修改某个全局变量的值,其他流程运行时将会使用该全局变量的这个新值。

    • 若变量名开头小写则只能在流程的当前执行过程中使用;

    算术运算

    支持右侧为算数运算表达式例如:($number)=(number)+1

    算术运算符:+-*/%

    预置变量

    wsmud_raid 预置了以下变量,可以直接使用:

    变量 含义
    :id 角色 id
    :hp 角色当前气血值
    :maxHp 角色当前最大气血值
    :hpPer 角色当前气血剩余百分比 0-1
    :mp 角色当前内力值
    :maxMp 角色当前最大内力值
    :mpPer 角色当前内力剩余百分比 0-1
    :living 角色是否活着 true,false
    :state 角色状态 发呆,疗伤,打坐,挖矿,工作,练习,学习
    :combating 角色是否在战斗中 true,false
    :free 角色是否自由的(无忙乱等状态) true,false
    :room 角色当前所在房间名称 如:扬州城-广场
    :path 角色当前所在房间路径 如:yz/guangchang
    :eq0 角色装备的武器 id
    :eq1 角色装备的衣服 id
    :eq2 角色装备的鞋 id
    :eq3 角色装备的头部 id
    :eq4 角色装备的披风 id
    :eq5 角色装备的戒指 id
    :eq6 角色装备的项链 id
    :eq7 角色装备的饰品 id
    :eq8 角色装备的护腕 id
    :eq9 角色装备的腰带 id
    :eq10 角色装备的暗器 id
    :kf_quan 角色装备的拳脚技能 sid
    :kf_nei 角色装备的内功技能 sid
    :kf_zhao 角色装备的招架技能 sid
    :kf_qing 角色装备的轻功技能 sid
    :kf_jian 角色装备的剑法技能 sid
    :kf_dao 角色装备的刀法技能 sid
    :kf_gun 角色装备的棍法技能 sid
    :kf_bian 角色装备的鞭法技能 sid
    :kf_an 角色装备的暗器技能 sid
    :day 当前星期几 1-7
    :date 当前日期 1-31
    :hour 当前小时 0-23
    :minute 当前分钟 0-59
    :second 当前秒 0-59

    4. 条件控制

    [if][else if][else] 三个语句进行控制。

    满足条件后执行的语句必须在其下方一行,且前面包含至少一个空格(建议 2 或 4 个,且整个代码保持一致)。

    ($open)=没开
    look men;open men;go east
    @tip 你不会撬锁|钥匙($open)了秘门
    [if] (open) == 打开
        go east;ok {r丫鬟}
        go west;go south;go south
        go north;go north;go west
    [else]
        go west
    
    复制上方代码

    比较运算符

    ==!=><>=<=

    逻辑运算符

    ||、且 &&、非 !

    5. 循环控制

    [while][continue][break] 三个语句进行控制。

    ($number)=0
    [while] (number) < 10
        go north
        [if] (:room)==扬州城-广场
            [break]
        ($number) = (number) + 1
    
    复制上方代码


  • Raid API

    1. @语句

    很多系统指令 (如疗伤: liaoshang) 执行后需要一定时间才会结束;后续指令需要等待其运行结束再调用才能正常运行。

    为此,可以设置等待时间,也可以采取各种手段来判断指令是否结束,以便执行后续指令。

    @语句 以 @ 开头,是 wsmud_raid 提供的便捷语句。

    它包含了判断指令是否结束的逻辑,直至指令执行结束才会执行它后续的语句。

    目前,提供以下 @语句,后续会根据需求添加 (如有需求可在下方跟帖):

    1). @kill 敌人名字1,敌人名字2,...

    直至杀死指定名字、数量的敌人,该语句执行完毕。

    @kill 管家,家丁,家丁
    
    复制上方代码

    默认使用模糊查找,若在敌人名字后面添加 % 表示进行精确查找,敌人名字必须完全吻合指定的名字。

    @kill 日月神教前辈长老 曲洋%,曲非烟
    
    复制上方代码

    亦可找到 ”日月神教前辈长老 曲洋” 和 “古灵精怪 曲非烟“ 并进行击杀。

    2). @until 条件

    等待,直到条件满足,该语句执行完毕。

    @until (:room)==扬州城-广场
    go north
    
    复制上方代码

    3). @cd

    等待所有技能冷却结束,该语句执行完毕。

    此外,可以等待指定技能的 cd,或等待除了指定技能外其他技能的 cd。

    使用技能的 sid 指定技能,多个技能用 , 连接。

    1. 等待指定技能的 cd

      // 等待 缠字诀 和 三阴毒爪 的 cd
      @cd sword.chan,unarmed.san
      
      复制上方代码
    2. 等待除了指定技能外其他技能的 cd

      // 等待除了 真武除邪 和 一气化三清 以外所有技能的 cd
      @cd ^force.chu,force.san
      
      复制上方代码

    4). @liaoshang

    就地疗伤,直至气血回满,该语句执行完毕。

    5). @dazuo

    就地打坐,直至内力回满,该语句执行完毕。

    10). @renew

    前往武庙回复自身气血和内力,直至完成,该语句执行完毕。

    7). @eq 装备id1,装备id2

    穿戴指定装备,直至成功,该语句执行完毕。

    备注:因为装备穿戴存在冷却 cd,所以直接调用 eq 装备id 未必能够穿戴成功。

    8). @tip 关键文字

    直至出现包含 关键文字 的系统提示,该语句执行完毕。

    该语句中,可以截取部分信息、定义变量并用截取部分初始化,例如:

    @tip 你数了下大概有($number)朵花
    
    复制上方代码

    备注:@tip 语句的上一条(非守护)语句 刚刚被执行的时刻起产生的系统提示,才在被搜索的范围内。

    另外,@tip 后面允许多个条件,请用 | 分隔,例如:@tip 你不会撬锁|钥匙($open)了秘门

    9). @tidyBag

    整理背包,直至完成,该语句执行完毕。

    10). @cleanBag

    使用游戏自带的清理包裹功能,直至完成,该语句执行完毕。

    11). @shimen

    当 wsmud_pluginss 中打开师门自动放弃时,可使用该语句做师门任务,直至完成,该语句执行完毕。

    12). @dialog

    执行打开列表面板的系统命令后,需要调用此命令以等待列表面板的确实打开,之后再使用 id 占位符。

    // 打开当铺老板售卖列表
    select {r唐楠};list {r唐楠}
    @dialog
    buy 1 {d引气丹g} from {r唐楠}
    
    复制上方代码

    13). @print

    打印后面的内容,例如:

    @print Hello World!

    14). @call

    调用其他的流程,格式为:@call 流程名称 参数0,参数1,...

    例如:

    @call 武道塔 74,85

    在名为“武道塔”的流程中,可以用 (arg0)(arg1) 来使用 @call 传来的参数,如上调用则:(arg0) 的值为 74,(arg1) 的值为 85。

    使用 @call 会自动忽略被调用流程的 #语句。如何兼容两种模式可以参考本版块的已发布代码。

    目前 @call 不支持嵌套调用,即被调用的流程中不能含有 @call 语句,后续视需求决定是否支持。

    2. 守护语句

    守护语句当前不会立即执行;在其之后的每一条语句 (除了守护语句) 执行完毕,都会执行该条守护语句。

    使用 <------> 包裹语句,即声明语句为守护语句。

    例如,下面的语句会使得之后的每条语句执行后都会检查血量,若少于 80% 则进行疗伤。

    <---
    [if] (:hpPer)<0.8
        @liaoshang
    --->
    
    复制上方代码

    3. #语句

    使用#语句可以弹出参数配置界面,用户可以输入流程运行需要的参数。例如:

    #select ($cleanWay) = 背包清理方案,不清理|售卖|存仓及售卖,存仓及售卖
    #input ($repeat) = 重复次数,1
    #config
    
    复制上方代码

    将会弹出如下界面:

    1). #input

    格式为 #input ($<变量名>)=<说明文字>,<默认值>

    2). #select

    格式为 #select ($<变量名>)=<说明文字>,<选项1|选项2|选项3|...>,<默认值>

    3). #config

    弹出参数配置界面。

    4. 辅助语句

    1) <-stopSSAuto 和 stopSSAuto->

    停止 ss 的自动 Boss 和 婚宴;恢复 ss 的自动 Boss 和 婚宴。

    2) <-recordGains 和 recordGains->

    开始、结束记录战利品获得。

    <-recordGains
    @kill 黄药师
    $getall
    recordGains->
    
    复制上方代码

    4. 注释

    // 开头的行即为注释:

    // 我是一个注释,不会被执行
    
    复制上方代码


  • 子流程

    从版本 2.2.0 开始支持子流程了!

    举例如下:

    <===
    ($weapon) = (:eq0)
    [while] true
        [if] (:eq0) != (weapon)
            @eq (weapon)
        @wait 500
    ===>
    
    复制上方代码

    使用说明:

    1. 子流程代码需要使用 ===>===> 包裹来声明。

    2. 在流程的任意处均可声明子流程:

      [if] {r大坏蛋}? != null
          <===
          ($weapon) = (:eq0)
          [while] true
              [if] (:eq0) != (weapon)
                  @eq (weapon)
              @wait 500
          ===>
          @kill 大坏蛋
      
      复制上方代码
    3. 子流程会在声明处自动开始运行。

    4. 主流程暂停、继续运行、停止时,所有子流程会执行同样操作。

    5. 暂时无法单独停止某个子流程的运行,后续如有需求可以添加此功能。

    6. 子流程内的(非全局)变量是独立于主流程的,即子流程无法直接使用主流程内的(非全局)变量。

      如果希望在子流程中使用主流程中的某个值,或反过来希望在主流程中使用子流程中的某个值,请使用全局变量传递值。

    7. 暂时不支持在被调用流程中使用子流程,后续版本会完善。

    注意!如果你的子流程中包含发送系统指令,那么请注意控制发送系统指令的总体频度,否则可能会引发系统制裁导致流程异常。


登录后回复