新客户端 Muder 机器人入门使用
本帖最后由 wendaokoujin 于 2025-7-5 07:54 PM 编辑<div>在客户端编写脚本时,常见的方式主要有两种:</div>
<h3>1. <strong>代码文件编写方式(如 Paotin)</strong></h3>
<div>这种方式完全通过编写代码文件来实现机器人逻辑,并通过加载脚本文件来运行。例如:执行破阵任务时加载 <code>pz.tin</code>,剑心居任务则加载 <code>jxj.tin</code>。</div>
<li><strong>优点</strong>:
<ul>
<li>模块化程度高,便于针对不同场景分别维护;</li>
<li>可借助 VSCode 等 IDE 提供的自动补全、语法高亮、重构等开发工具,提升编写效率。</li>
</ul>
</li>
<li><strong>缺点</strong>:
<ul>
<li>对无开发经验的玩家上手门槛较高。</li>
</ul>
</li>
<h3>2. <strong>可视化设置方式</strong></h3>
<div>通过图形化界面将功能分为变量、别名、触发器等部分,用户可以分别进行设置。</div>
<ul>
<li><strong>优点</strong>:
<ul>
<li>上手门槛低;</li>
<li>别名和触发器已经能满足绝大多数(80%以上)的需求。</li>
</ul>
</li>
<li><strong>缺点</strong>:
<ul>
<li>缺乏模块化管理,难以组织复杂逻辑或复用功能。</li>
</ul>
</li>
</ul>
<hr>
<h3>Muder 的实现方式</h3>
<div>Muder 早期采用第一种方式(代码文件),当前则更倾向于第二种方式(可视化配置)。其脚本系统分为三个层级:</div>
<h4>1. <strong>系统分类</strong></h4>
<div>由客户端预置并维护的基础函数和变量,<strong>不建议用户修改</strong>。<br>
这些函数定义在 <code>wwwroot/scripts/sysfun.js</code> 文件中,同时在图形界面中也可查看说明。</div>
<ul>
<li><strong>示例函数</strong>:<code>sys.info('haha')</code>:在界面上打印文本</li>
<li><strong>示例变量</strong>:<code>sys.name</code>:当前玩家的中文名称</li>
</ul>
data/attachment/forum/eb6a5a6c15d3993bdfbd247191e05d16.png
<h4>2. <strong>通用分类</strong></h4>
<div>适用于所有角色共用的脚本逻辑。<br>
考虑到许多玩家拥有多个角色,而一些通用功能(如任务机器人)不需要重复编写,通用分类可以有效提升脚本复用率。</div>
<ul>
<li>可按模块(任务)进行组织管理,例如每个主流任务对应一个模块;</li>
<li>每个模块可包含独立的变量、函数、别名和触发器;</li>
<li>不同模块在界面上通过图标和颜色加以区分;</li>
<li>Muder 默认实现了一个“<strong>基础</strong>”模块,<strong>建议不要修改此模块</strong>,可作为参考模版创建自己的模块。</li>
</ul>
<ul>
<li><strong>示例函数</strong>:<code>com.xy_extend('恒山','hi')</code>:逍遥游走到恒山后,然后hi打个招呼</li>
<li><strong>示例变量,通常都放在vars下</strong>:<code>com.vars.xxx</code>:定义了一个变量在vars下,叫xxx</li>
</ul>
data/attachment/forum/312b3f6b0efeab904f164900fa25802d.png
<h4>3. <strong>玩家分类</strong></h4>
<div>专属于当前角色的脚本配置,组织方式与“通用分类”相同。和通用的区别是:通用前缀是 com. ,玩家分类的前缀是 my. </div>
<ul>
<li>每位玩家可以为特定角色设置个性化模块;</li>
<li>Muder 默认<strong>不提供任何模块</strong>,完全由玩家自行维护与扩展。</li>
</ul>
data/attachment/forum/661f73e79d02c6c65ea96fba9d5f0aa6.png
<h2>系统变量说明(vars)</h2>
<ul>
<li><strong>id</strong><br>描述:玩家ID<br>示例:<code>sys.id</code></li>
<li><strong>name</strong><br>描述:玩家名称<br>示例:<code>sys.name</code></li>
<li><strong>password</strong><br>描述:玩家密码<br>示例:<code>sys.password</code></li>
</ul>
<h2>系统函数说明(funs)</h2>
<ul>
<li><strong>send(cmd)</strong><br>描述:发送指令给Mud服务器<br>示例:<code>sys.send('ls')</code></li>
<li><strong>note(text, color)</strong><br>描述:记事本记事<br>示例:<code>sys.note('hello', 'green')</code></li>
<li><strong>timer(index, label, value, iscountdown, format)</strong><br>描述:设置不同的定时器到界面上<br>示例:<code>sys.timer(1, 'test', 100, true, 'ss')</code></li>
<li><strong>info(msg)</strong><br>描述:打印信息在界面上<br>示例:<code>sys.info('hello')</code></li>
<li><strong>error(msg)</strong><br>描述:打印错误信息在界面上<br>示例:<code>sys.error('error: hello')</code></li>
<li><strong>alias(name, command)</strong><br>描述:为命令设置别名<br>示例:<code>sys.alias('k', 'killall')</code></li>
<li><strong>action(id, pattern, func, isRaw)</strong><br>描述:注册文本或正则触发器<br>示例:<code>sys.action('id1','看到了', function(){ sys.send('hi'); })</code></li>
<li><strong>unalias(name)</strong><br>描述:移除指定命令别名<br>示例:<code>sys.unalias('go')</code></li>
<li><strong>unaction(id)</strong><br>描述:移除指定命令触发器<br>示例:<code>sys.unaction(id)</code></li>
<li><strong>enablealias(name)</strong><br>描述:启用指定命令别名<br>示例:<code>sys.enablealias('go')</code></li>
<li><strong>disablealias(name)</strong><br>描述:禁用指定命令别名<br>示例:<code>sys.disablealias('go')</code></li>
<li><strong>enableaction(id)</strong><br>描述:启用指定命令触发器<br>示例:<code>sys.enableaction(id)</code></li>
<li><strong>disableaction(id)</strong><br>描述:禁用指定命令触发器<br>示例:<code>sys.disableaction(id)</code></li>
<li><strong>random()</strong><br>描述:生成一个随机数<br>示例:<code>sys.random()</code></li>
<li><strong>onSend(id, callback)</strong><br>描述:注册发送指令前的回调<br>示例:<code>sys.onSend('id', function(cmd){})</code></li>
<li><strong>onReceive(id, callback, isRaw)</strong><br>描述:注册接收消息回调<br>示例:<code>sys.onReceive('id', function(msg){}, true)</code></li>
<li><strong>delay(seconds, commandOrFunc)</strong><br>描述:延迟执行命令或函数<br>示例:<code>sys.delay(2, 'look')</code></li>
<li><strong>undelay(timerId)</strong><br>描述:取消延迟执行<br>示例:<code>sys.undelay(timerId)</code></li>
<li><strong>tick(seconds, commandOrFunc)</strong><br>描述:定时循环执行<br>示例:<code>sys.tick(5, 'look')</code></li>
<li><strong>untick(timerId)</strong><br>描述:取消定时循环<br>示例:<code>sys.untick(timerId)</code></li>
<li><strong>sleep(seconds)</strong><br>描述:异步延迟<br>示例:<code>await sys.sleep(2)</code></li>
<li><strong>actionOnce(pattern, func, timeout)</strong><br>描述:只触发一次监听<br>示例:<code>sys.actionOnce('你得到了', () => sys.send('get all'), 30)</code></li>
<li><strong>batch(commands[], delaySec)</strong><br>描述:批量顺序执行命令<br>示例:<code>await sys.batch(['look', 'go east'], 1)</code></li>
<li><strong>reversePath(path)</strong><br>描述:反转路径字符串<br>示例:<code>sys.reversePath('w;w;s')</code></li>
<li><strong>find(name, desc, timeout)</strong><br>描述:查找房间内物品或NPC<br>示例:<code>await sys.find('小贩', '一个卖东西的小贩', 3)</code></li>
<li><strong>try(command, successText, timeout, failTexts[])</strong><br>描述:等待成功或失败文本<br>示例:<code>await sys.try('go east', '你到达了东门', 10, ['这里没有路'])</code></li>
<li><strong>retry(command, successText, interval, maxRetry)</strong><br>描述:重试直到成功或次数耗尽<br>示例:<code>await sys.retry('go east', '你到达了东门', 2, 5)</code></li>
<li><strong>test(text, isRaw)</strong><br>描述:模拟文本触发器<br>示例:<code>sys.test('看到了', false)</code></li>
<p>我们来看看触发器的基本使用方式,如下图所示:</p>
data/attachment/forum/a5428a8b67f67bd577d86ea01b9385f1.png
<p><strong>场景一:字符串触发</strong></p>
<p>这个图对应的触发条件就是字符串:</p>
<pre><code>您要将另一个连线中的相同人物赶出去</code></pre>
<p>对应触发的指令是:</p>
<pre><code>y</code></pre>
<p>也就是“确定赶出去相同人物”的确认操作。</p>
<hr>
<p><strong>场景二:正则表达式触发</strong></p>
data/attachment/forum/03e6a709cc689dda96ed92162691b5cc.png
<p>这个图对应的触发条件是一个<strong>正则表达式</strong>。</p>
<p>JavaScript 的正则表达式语法与其他语言基本类似:</p>
<ul>
<li>如果你用过其他客户端或语言的正则表达式语法</li>
<li>可以直接复制已有的表达式,让 AI 帮你转换成 JS 正则</li>
</ul>
<p>对应触发的操作是一个函数:</p>
<pre><code>function() {
// 触发时执行的代码
}</code></pre>
<p>或者异步版本:</p>
<pre><code>async function() {
// 可使用 await 的异步函数
}</code></pre>
<p>注意:函数必须以 <code>function</code> 或 <code>async function</code> 开头。</p>
<p><em>不了解 async 的概念?可以咨询 AI,获取更详细的解释和用法。</em></p>
<hr>
<p><strong>颜色模式选项(颜色匹配触发)</strong></p>
<p>在设置触发器时,有一个复选框:</p>
<pre><code>颜色模式
使用方式可以参考https://www.pkuxkx.net/forum/thread-50176-1-1.html
厉害 加油
页:
[1]