wendaokoujin 发表于 2025-7-9 07:24:22

新客户端 Muder 机器人入门使用二

本帖最后由 wendaokoujin 于 2025-7-9 07:25 AM 编辑

data/attachment/forum/fb648f731dbc3caec710573af37f96bf.png
<h2>漂流任务脚本说明(JavaScript 机器人,片段解析和分享)</h2>

<p>以下是漂流任务的 <strong>机器人脚本片段</strong>,使用 JavaScript 编写,运行于支持脚本自动化的客户端。脚本通过自动识别战斗结果与任务状态,执行划船、返航、交付任务等操作。</p>

<p><strong>注意:</strong>本脚本仅为功能片段分享,旨在介绍 JS 脚本的结构与控制流程,<span style="color:red;">不包含全部自动化代码,以遵守使用规范和防止违规。</span></p>

<hr>

<h3>一、触发机制说明</h3>

<ul>
<li>每次漂流“漂流一里”后,基本都会触发一次战斗。</li>
<li>每次战斗结束时,会根据sys.isfighting()为条件触发一个函数,会输出固定提示语 <code>“自动战斗结束!”</code>。</li>
<li>如下代码:</li>
</ul>

<pre><code>sys.test('自动战斗结束!')</code></pre>

<p>当检测到战斗结束提示时,会触发一次 <code>async function()</code>,判断是否需要执行漂流流程。</p>

<hr>

<h3>二、漂流参数设置</h3>

<p>在进入副本前,通过一个别名命令设置漂流参数,例如:</p>

<pre><code>plset 十七 north 三</code></pre>

<p>此命令将设置以下三个变量,并把值写到屏幕左边的记事:</p>
<ul>
<li><code>
    com.vars.pl_count = arg    com.vars.pl_direct = arg
    com.vars.pl_huacount = arg
    sys.note('漂流:'+com.vars.pl_count+'-'+com.vars.pl_direct+'-'+com.vars.pl_huacount,'lightblue')</code></li>
</ul>

<p>漂流到第 <code>pl_count </code> 里时,脚本会执行“停下”(ting)操作,并设置:</p>

<pre><code>com.vars.pl_tingflag = true</code></pre>

<p>只有在此标志为 <code>true</code> 时,后续主流程才会被真正执行。</p>

<hr>

<h3>三、关于 async/await 简要说明</h3>

<p><code>async</code> 和 <code>await</code> 是 JavaScript 中用于“异步编程”的关键字,非常适合处理游戏中需要等待的操作(例如:等待战斗、延迟、网络响应等)。</p>

<ul>
<li><strong>async</strong>:用于声明一个异步函数,表示里面可以使用 <code>await</code>。</li>
<li><strong>await</strong>:表示“等待”某个操作完成,比如 <code>await sys.sleep(5)</code> 表示等待 5 秒再继续。</li>
</ul>

<p>使用 async/await 可以让脚本代码看起来像是顺序执行,但实际上能在后台异步处理,不会卡住程序或漏掉消息。</p>

<p>例如:</p>
<pre><code>async function example() {
    console.log("开始执行");
    await sys.sleep(5);
    console.log("等待5秒后继续");
}
</code></pre>

<p>在 MUD 脚本中,这种结构非常适合等待系统消息、冷却时间、或重试任务。</p>

<hr>

<h3>四、脚本执行逻辑(功能片段)</h3>

<pre><code>async function() {
    if (com.vars.pl_tingflag) {
      com.vars.pl_tingflag = false;
      await sys.sleep(10);

      let is_fighting = sys.isfighting();
      if (is_fighting) {
            return;
      }

      await sys.sleep(5);
      let huacmd = 'hua ' + com.vars.pl_direct;
      let huaflag = '划出了' + com.vars.pl_huacount + '里了';

      sys.send(huacmd);
      await sys.sleep(20);
      await sys.retry(huacmd, huaflag, 8, 30);

      await sys.sleep(3);
      sys.send('xiamao');

      await sys.sleep(3);
      await sys.retry('dalao', '也许你可以返航了。可以使用hua back命令', 4, 30);

      await sys.sleep(5);
      sys.send('hua back');

      await sys.sleep(1);
      sys.send('leave');

      await sys.sleep(6);
      sys.send('give ren xiang');

      await sys.sleep(5);
      sys.send('plb');
    }
}
</code></pre>

<hr>
<h3>五、关于 sys.retry 的简要说明</h3>

<p><code>sys.retry(命令, 匹配提示, 下次执行等待的时间, 尝试次数)</code> 是漂流任务脚本中的一个常用函数,用于:</p>

<ul>
<li><strong>发送一个命令</strong>(如 <code>hua north</code>);</li>
<li><strong>监听是否出现预期的输出提示</strong>(如 <code>划出了17里了</code>);</li>
<li><strong>每二次重试等待的指定秒数</strong>。</li><li><strong>如未匹配成功,自动重发</strong>命令,最多重试指定次数;</li>
</ul>

<p>示例:</p>
<pre><code>await sys.retry('hua north', '划出了17里了', 8, 30)</code></pre>

<p>含义:</p>
<ul>
<li>发送 <code>hua north</code> 命令</li>
<li>等待是否出现 <code>划出了17里了</code></li>
<li>若未出现,则等待8秒再次hua north</li>
<li>最多重试30次</li>
</ul>

<p><strong>常见用途:</strong>用于网络不稳定或游戏延迟时,确保操作成功被执行。例如:</p>
<ul>
<li>划船到指定距离</li>
<li>等待系统提示“可以返航了”</li>
<li>进入副本成功等</li>
</ul>

<p><strong>建议:</strong>搭配 <code>await</code> 使用,避免逻辑错乱或提前继续执行后续操作。</p>

<hr>

<h3>六、逻辑流程图解</h3>

<ol>
<li>战斗结束检测:监听 <code>自动战斗结束!</code> 提示</li>
<li>判断是否为最终一里:是否已设置 <code>pl_tingflag = true</code></li>
<li>如果是 → 开始执行划船流程</li>
<li>划出目标距离 → 停船 → 确认可返航</li>
<li>执行返航 → 上岸 → 交付漂流瓶</li>
</ol>

<hr>

<h3>七、说明与建议</h3>

<ul>
<li>该脚本采用异步函数结构,确保等待每步完成再继续。</li>
<li>使用 <code>sys.retry()</code> 方法,增强指令执行的稳定性。</li>
<li>可扩展日志记录、异常捕获等机制,增强容错与调试能力。</li>
<li>推荐使用类似 <code>plset</code> 的别名命令进行参数管理,简化控制。</li>
</ul>

<hr>

<p><strong>结语:</strong>通过 JS 自动化脚本在 MUD 游戏中可实现高度可控的任务流程管理。本文所展示仅为一个片段与思路,希望对其他 JS 脚本开发者有所启发。</p>


页: [1]
查看完整版本: 新客户端 Muder 机器人入门使用二