北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
12
返回列表 发新帖
楼主: wendaokoujin

Muder 完整教程

[复制链接]
 楼主| 发表于 昨天 09:26 AM | 显示全部楼层
yuxia 发表于 2026-1-9 09:16 AM
感谢大佬分享教程。
我是新手,正在用muder享受游戏,有个比较初级的问题请教下:
我点击脚本图标,选择“玩 ...

[color=rgba(0, 0, 0, 0.56)]我在 edge版本 143.0.3650.96 (正式版本) (64 位)试了一下,没有发现问题了,你刷新一下页面,然后等5秒钟再打开这个这个添加分组试试。


如果还有问题,可以按ctrl+shift+i 打开开发者模式,看看控制台有没有报错,把报错信息截图发给我看看

北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 昨天 09:34 AM | 显示全部楼层
感谢大佬的回复,特别是提供的操作截图太清楚了,我刚按着自己试了下,已经可以创建分组了!
之前是为啥没反应我也没搞清楚,万分感谢!
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 昨天 01:22 PM | 显示全部楼层
本帖最后由 wendaokoujin 于 2026-1-9 01:24 PM 编辑

触发器和别名的本质是一样的:别名是玩家手动输入触发,触发器是游戏文本(含正则)触发,两者都可以执行一串指令或一个函数。

例 5:只要看到钱,都自动捡起来,| 是“或”的意思。

/两白银(Silver)|两黄金(Gold)|银票(Cash)/:  'get cash;get gold;get silver;'

例 6:系统推送 fullme 的时候,会自动打开 fullme 的窗口,所以需要快速关闭;玩家输入 cf 可以手动触发,也可以由条件自动触发。

/获得了答问如流许可,|为找到闯王宝藏的线索/: 'cf'
'cf': function () { sys.closeFullme() }

例 7:战斗中,如果敌人快晕倒了会尝试吸内力。正则拆出两个部分:中文名与气血百分比。[\u4e00-\u9fa5]+ 表示中文,\d 表示数字;arg[1] 是敌人名字,与 sys.name(玩家名)比较;若不是自己且 arg[2] <= 0,则调用 my.suckneili这个是自定义的一个函数,不用关心细节。

/『([\u4e00-\u9fa5]+).*?气血:(\d+)%/: function (arg) {
    if (arg[1] && arg[1] != sys.name) {
        if (arg[2] <= 0) {
            my.suckneili(true)
        }
    }
}

1.2 同步函数和异步函数

比喻:

  • 同步:像排队办事,前一个没办完,后一个不能开始。
  • 异步:像取号办事,拿到号后可以先做别的,等叫号再继续。

游戏里也是如此:有的函数立刻完成(同步),有的要等事件结束(异步)。不知道谁会“等”,行走、战斗步骤就可能搅在一起。

示例:回城存钱别名 home

'home': function () {
    sys.send('xy 扬州;')
    sys.send('n;w;cun all gold')
}

两行几乎同时发出,行走还没到扬州就开始往北/西,行动会乱。

尝试加 await

'home': async function () {
    await sys.send('xy 扬州;')
    sys.send('n;w;cun all gold')
}

仍然不行,因为 sys.send 是同步的,发完指令就结束,不会等你真的到扬州。

权宜之计:傻等

'home': async function () {
    sys.send('xy 扬州;')
    await sys.sleep(30) // 等 30 秒
    sys.send('n;w;cun all gold')
}

缺点:可能等太久(浪费),也可能等不够(还没到就走)。

推荐:用真正异步的函数

'home': async function () {
    await sys.xy('扬州')   // 到达扬州后才继续
    sys.send('n;w;cun all gold')
}

sys.xy 会等待真正到达目的地再往下执行。

小结(非开发背景也能记住):

  • 看函数是否需要“等结果”。要等的当异步,不等的当同步。
  • 等待异步结果用 await,前提是函数本身支持等待。
  • 不确定是否异步时,查 README 或实测;不确定就用 sys.sleep 兜底,但时间要留余量。
  • 用了 await,当前函数必须加 async 修饰。
  • 后面章节还有大量异步示例,可结合自身场景套用。

北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 昨天 02:17 PM | 显示全部楼层

1.3 更多异步函数示例

包括别名和触发器,以下列出更多示例并分析解释。

例 8:

'jingong': async function (arg) {
    sys.send('give 1 gold to qian')
    await sys.sleep(2)
    sys.send('ask qian about 进宫')
},

说明:北京先给钱老板钱,再等 2 秒,最后询问“进宫”,他会给你一个牌子,你就可以进宫不会被阻拦。

例 9:

'lianshow': async function () {
    sys.send('n;e;up;enter;')
    sys.send('bei none;bei xingxiu-duzhang;')
    await sys.try('sleep', '你一觉醒来,精神抖擞地活动了几下手脚。', 60)
    sys.send('lian show')
},

说明:从扬州城中心,自动走到店里睡觉,醒来自动 lian showsys.try 是系统提供的函数,后续会再讲用法。

例 10:

/在(.*)欺男霸女,为恶一方,你快去清理门户吧。/: async function (arg) {
    sys.send("s;sw;sw;s;s;s;up;out")
    await my.waitToRoom('中央广场')
    let temps = arg[1].split('的')
    await sys.xy(temps[0])
    await my.map.gpsInCity(null, temps[1])
    let result = await my.findByEnglishname(sys.id + ' ', 'fuzzy')
    if (result) {
        sys.send('fk ' + result)
        await my.waitToCombatEnd()
        sys.send('home')
    } else {
        sys.warn('未找到目标人物:' + sys.id)
    }
}

说明:接到“清理门户”任务后,自动回中央广场、定位目标城市与地点,找到人则开打并等战斗结束,再回家;找不到则提示。这里用到了地图相关的函数,和根据名称模糊查询的函数。

例 11:

'tunaall': async function () {
  while (true) {
    sys.send('auto_food_water');
    let max_jingli = sys.status().max_jingli;
    let jingli = sys.status().jingli;
    if (jingli >= (max_jingli * 2 - 20)) {
      await sys.try("tuna 10", '你吐纳完毕,睁开双眼,站了起来。', 10);
    } else {
      sys.send('e2')
      await sys.try("tuna max", '你吐纳完毕,睁开双眼,站了起来。', 60, ['你现在精力接近圆满状态。', '你现在精严重不足,无法满足吐纳最小要求']);
    }
    await sys.sleep(1);
  }
}

说明:循环吐纳脚本,先补给,再看精力高低选择 10 级或最大吐纳,遇到提示自动跳出等待,适合挂机恢复。一个函数可以实现无限吐纳。

例 12:

liandugo: async function () {
    await sys.xy('星宿');
    sys.send('sheshui')
    await sys.sleep(3)
    sys.send('w;l jingji lin')
    await sys.sleep(2)
    sys.send('southwest;southeast;west;southwest;southeast;westdown')
    await sys.sleep(2)
    sys.send('north;northdown;north;north;juan zhulian;north;east;north;east;north;north;north;east')
    await sys.sleep(5)
    my.liandu();
    sys.send('xian')
}

说明:自动跑星宿路线做“练毒”流程,按步骤走图、涉水、穿行毒林并调用自定义 my.liandu()

例 13:

tuocoin: async function () {
    sys.send('n;w;qu 100 coin')
    await sys.sleep(1)
    sys.send('e;s;')
    await sys.sleep(1)
    await sys.xy('代州')
    await my.map.gpsInCity(null, '佛光寺')
    sys.send('tou coin')
    await sys.sleep(1)
    sys.send('home')
}

说明:自动取 100 枚铜币,传送到代州佛光寺投币祈福增加幸运值,再回家(扬州),途中适当等待防止卡步。


北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 昨天 03:06 PM | 显示全部楼层
认真学习了大佬的各种例子,感觉还是不太能理解(没学过编程),能够将某个简单的例子补充一张填入到Muder中的截图?

我自己试着做了个触发器,当精神=最大精神时触发,学习读书3次(见下图),但没反应,不知道是哪里出了问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 昨天 03:56 PM | 显示全部楼层
yuxia 发表于 2026-1-9 03:06 PM
认真学习了大佬的各种例子,感觉还是不太能理解(没学过编程),能够将某个简单的例子补充一张填入到Muder ...

不是这样的,触发条件放上面,触发后的命令放下面


触发器就是我们看到的所有内容都是从服务器上返回的,我们根据返回的文本内容来触发动作,触发条件可以是一个字符串,也可以是一个正则表达式
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 昨天 06:28 PM | 显示全部楼层
本帖最后由 wendaokoujin 于 2026-1-9 09:12 PM 编辑

2. 系统函数介绍

Muder 提供了很多系统函数,sys 对象里都是系统相关的函数和变量。还有一个 com 对象和 my 对象后面也会提到。

2.1 系统变量(无需调用,直接读取)

2.1.1 `sys.id`:玩家 ID 示例:

sys.info(`我的ID是:${sys.id}`);

2.1.2 `sys.name`:玩家中文名称 示例:

sys.info(`你好,${sys.name}`);

2.2 系统函数(常用 API 与示例)

2.2.1 `sys.send`:发送指令给 Mud 服务器,这是最常见的函数

sys.send("look");

2.2.2 `sys.batch`:批量顺序执行命令,间隔秒数

await sys.batch(["look", "east"], 2);

说明:执行 look 指令后等待 2 秒再执行 east 指令,适合执行批量指令,比如边走路边检破烂,不过每个指令之间的时间是固定的。

2.2.3 `sys.repeat`:重复执行命令

sys.repeat("look", 3);

2.2.4 `sys.info` / `sys.warn` / `sys.error`:在界面打印信息/警告/错误

sys.info("hello");
sys.warn("This is a warning.");
sys.error("error: hello");

2.2.5 `sys.log`:首页左边的日志区域追加内容,

sys.log("hello", "green");

说明:第二个参数可以是颜色,方便区分不同日志

2.2.6 `sys.note`:记事本区域覆盖内容

sys.note("hello", "green");

说明:可以让 AI 把第一个参数转成 h5 格式,带各种颜色的文本。

2.2.7 `sys.timer`:界面定时器(索引 1-5)

sys.timer(1, "FULLME", 15 * 60, true, "ss");

说明:第一个参数是索引,第二个是显示的文字,第三个是时间 15*60 表示 15 分钟,第四个参数为 true 是表示倒计时,否则表示正计时,最后一个参数是时间的格式,ss 表示显示秒。这个示例就是用来执行 fullme 后,重新开始倒计时 15 分钟计时。

2.2.8 `sys.closeFullme`:关闭 fullme 窗口

sys.closeFullme();

2.2.9 `sys.delay` / `sys.undelay`:延迟执行与取消

const id = sys.delay(2, "look"); //过2秒后再执行look,有时候可以替代await sys.sleep(2)
sys.undelay(id); //取消延时执行

2.2.10 `sys.tick` / `sys.untick`:循环定时与清除

const tid = sys.tick(5, "look"); //每隔5秒执行一次look
sys.untick(tid); //取消循环

2.2.11 `sys.sleep`:异步等待秒数

await sys.sleep(2); //这个函数用的很多

2.2.12 `sys.alias` / `sys.unalias`:别名管理

sys.alias("k", "killall");
sys.unalias("k"); //取消别名

2.2.13 `sys.action` / `sys.unaction`:文本/正则触发器

const aid = sys.action("id1", "看到了", function () {
  sys.send("hi");
});
sys.unaction(aid);

说明:很多情况触发器不希望一直生效,是希望在特定的情况下生效,然后过一会让它再失效。

2.2.14 `sys.actionOnce`:仅触发一次

sys.actionOnce("id1", "官兵拦住你说道:站住,把", "unwield all");

说明:有的时候短时间内会触发多次,比如问 NPC 任务,其他人也在问 NPC 任务,可以通过这个函数来触发一次就不会被再次触发。然后过 5 秒或更长时间后又恢复触发。

2.2.15 `sys.test`:模拟文本触发器测试

sys.test("看到了", false);

说明:这个通常用于测试一个触发器是否生效,相当于模拟发送一段文本来触发自己写的触发器

2.2.16 `sys.xy`:逍遥游移动,`xy` 为异步可等待

sys.go("扬州"); //不等待,直接发送
await sys.xy("扬州"); //等待到达

2.2.17 `sys.reversePath`:反转路径字符串

sys.reversePath("w;w;s");

说明:这个函数用的也很多,用来反转路径,相当于走过去,然后再方向走回来。

2.2.18 `sys.loadMap` / `sys.listMaps`:加载与列出地图,都是异步函数

await sys.loadMap("扬州");
await sys.listMaps();

说明:本来想提供更多地图相关的函数,包括城市内、跨城市的快速行走和遍历,但是这些函数有很多特例,个性化太强,所以放弃了,只提供了最基础的函数。

2.2.19 `sys.try` / `sys.retry`:等待文本或重试直到成功

await sys.try("tuna 10", "你吐纳完毕,睁开双眼,站了起来。", 10);
await sys.retry("dalao", "也许你可以返航了。可以使用hua back命令", 4, 60);

说明:这 2 个函数用的很多, try 表示执行一个指令 `tuna 10`,就执行一次,执行完就开始等待,如果出现 `你吐纳完毕,睁开双眼,站了起来。`这个函数就执行结束,如果 10 秒钟还没出现这个文本,也结束,超时结束。 retry 差不多,只不过是执行多次,上面的示例就是每隔 4 秒执行一次`dalao`指令,总共执行 60 次,也就是 240 秒

2.2.20 `sys.find`:当前房间查找物品/NPC(带超时)

await sys.find("girl", "一个卖东西的小贩", 3);

说明:这个函数用于查询一个 NPC 或物品,通过 `look girl` 指令去看它,看它的描述有没有包含`一个卖东西的小贩`的内容,如果有,就返回 true 这个函数通常用于遍历的时候,一个个人来查询其特征。

2.2.21 状态查询:`sys.status()` / `sys.isbusy()` / `sys.isfighting()` / `sys.room()`

const st = sys.status();
if (sys.isfighting()) sys.send("yun heal");

说明:这些函数也经常用到,获取完整的状态,判断是否忙,判断是否在战斗中,当前所在房间的信息

2.2.22 发送/接收钩子:`sys.onSend` / `sys.offSend` / `sys.onReceive` / `sys.offReceive`

sys.onSend("id", function (cmd) {
  /* ... */
});
sys.offSend("id");
sys.onReceive(
  "id",
  function (msg) {
    /* ... */
  },
  true
);
sys.offReceive("id");

说明:这是最底层的基础函数,我们在高级篇里再讲

2.2.23 GMCP 处理:`sys.onGmcp` / `sys.offGmcp`

sys.onGmcp("char.vitals", function (data) {
  sys.info(data);
});
sys.offGmcp("char.vitals");

说明:这是最底层的基础函数,我们在高级篇里再讲

2.2.24 `sys.random`:生成随机数(时间戳+随机值)

const r = sys.random();

2.2.25 音频控制:`sys.playaudio` / `sys.stopaudio`

const audio = sys.playaudio("http://.../sound.wav", 0.5, true);
sys.stopaudio(audio);

2.3 com 和 my

com 和 my 对应 `通用` 和 `玩家` 页面 我们在通用界面上创建的变量会保存在 com.vars 下,在通用界面上创建的函数会保存在 com. 下,my也是同样的。com示例如下截图
通用变量
  
通用函数




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2026-1-10 10:16 AM , Processed in 0.015606 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表