<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[深入浅出制作全自动Mud机器人-延时响应]]></title><description><![CDATA[<p dir="auto">延时响应是Mud解密中很常见的一个状态。</p>
<p dir="auto">指当你发出指令后，游戏中的NPC或者场景会在一定时间后，或者断断续续的做出响应。</p>
<p dir="auto">一般来说，延迟响应为了考虑到玩家的体验，服务器的响应需要进行特别复杂的处理，使用简单的匹配和Mode标记就可以处理。</p>
<p dir="auto">之所以单独作为一个课题讨论，是因为延时响应的核心处理点是 失效管理。</p>
<p dir="auto">普通解密，触发器一般是即用即关的，不需要考虑太多的意外状态，通过触发组就能很好的解决了。</p>
<p dir="auto">而延时解密，因为要考虑到可能会有终止/意外/并行的情况，需要手动的对出发考虑失效和重复生效、计时器延时等状况，触发器组就很捉襟见肘了，一般需要更多的代码工具去进行管理。</p>
<p dir="auto">我这里是通过自己的Task/Plan模块，将所有的触发/计时器/事件处理封装在一个Task对象内，并强制使用一个作用范围强制失效来解决这个问题的。</p>
<p dir="auto">参考代码：</p>
<pre><code class="language-Javascript">    let baohuwait = 28 * 1000
    let matcherKill = /^你对(.+)的(黑衣人|邪派高手|绝世高手)喝道:大胆狂徒,竟敢在这撒野！！/
    //等待NPC出现的计划
    let PlanProtect = new App.Plan(
        App.Positions["Quest"],
        (task) =&gt; {
            task.AddTrigger(matcherKill, (tri, result) =&gt; {
                if (result[1] != App.Data.Player.Score.名字) {
                    return true;
                }
                App.Send("halt")
                let id
                switch (result[2]) {
                    case "黑衣人":
                        id = "heiyi ren"
                        break
                    case "邪派高手":
                        id = "xiepai gaoshou"
                        break
                    case "绝世高手":
                        id = "jueshi gaoshou"
                        break
                }
                Baohu.Data.ID = id
                Baohu.Data.Type = result[2]
            }).WithName("ok")
            let wait = Baohu.Data.Start + baohuwait - $.Now()
            if (wait &gt; 0) {
                task.AddTimer(wait, (timer) =&gt; {
                    Note("准备迎敌")
                    App.Send("halt")
                    App.Core.Heal.TryTouch()
                    $.RaiseStage("prepare")
                    $.RaiseStage("baohu-ready")
                    return true
                }).WithNoRepeat(true)
            }
            task.AddTimer(1100, () =&gt; {
                if (App.Core.Weapon.Touch) {
                    if (($.Now() - Baohu.Data.Start) &lt; baohuwait) {
                        App.Send("halt")
                        App.Core.Heal.TryTouch()
                        $.RaiseStage("pause")
                        $.RaiseStage("wait")
                    }
                }
                return true
            })
            task.AddTimer(3000, () =&gt; {
                let d = (($.Now() - Baohu.Data.Start) / 1000).toFixed(0)
                Note(`保护开始${d}秒`)
                return true
            })
            task.AddTimer(60000, () =&gt; {
                App.Log("保护等待超时")
                return false
            }).WithName("timeout")
            $.RaiseStage("wait")
        },
        (result) =&gt; {
            if (result.Name == "ok") {
                $.PushCommands(
                    $.CounterAttack(`${GetVariable("id")}'s ${Baohu.Data.ID}`, App.NewCombat("baohu").WithTags(`baohu-${Baohu.Data.Type}`).WithPlan(PlanCombat)),
                    $.Function(Baohu.Finish),
                )
                $.Next()
                return
            }
            App.Send("halt")
            App.Log(`保护NPC${Baohu.Data.NPC.ID}失败`)
            Baohu.Fail()
        }
    )

</code></pre>
<p dir="auto"><a href="https://github.com/hellclient-scripts/hongchenjs/blob/main/script/src/quests/baohu/baohu.js" target="_blank" rel="noopener noreferrer nofollow ugc">代码地址</a></p>
<p dir="auto">可以看到，我使用了一个叫做PlanProtect的计划(task工厂),创建了一个基于Quest的封装，所有的触发和计时器都绑定在这个Task封装上，并在Quest发生变化时强制失效。</p>
<p dir="auto"><a href="https://forum.hellclient.com/topic/20/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%E5%88%B6%E4%BD%9C%E5%85%A8%E8%87%AA%E5%8A%A8mud%E6%9C%BA%E5%99%A8%E4%BA%BA-%E9%A2%84%E6%9C%9F%E7%AE%A1%E7%90%86">预期管理工具Plan/Task的详细介绍</a></p>
<p dir="auto">由于我一直认为Mud机器人是一个工程问题，难点在于可维护性和代码失控。所以，我认为，选用或者开发一个触发失效工具，是十分重要的，也应该是整个机器人的核心驱动逻辑之一。</p>
]]></description><link>https://forum.hellclient.com/topic/49/深入浅出制作全自动mud机器人-延时响应</link><generator>RSS for Node</generator><lastBuildDate>Mon, 25 May 2026 04:39:42 GMT</lastBuildDate><atom:link href="https://forum.hellclient.com/topic/49.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 08 May 2026 01:55:24 GMT</pubDate><ttl>60</ttl></channel></rss>