深入浅出制作全自动Mud机器人-延时响应
Script脚本
1
帖子
1
发布者
13
浏览
-
延时响应是Mud解密中很常见的一个状态。
指当你发出指令后,游戏中的NPC或者场景会在一定时间后,或者断断续续的做出响应。
一般来说,延迟响应为了考虑到玩家的体验,服务器的响应需要进行特别复杂的处理,使用简单的匹配和Mode标记就可以处理。
之所以单独作为一个课题讨论,是因为延时响应的核心处理点是 失效管理。
普通解密,触发器一般是即用即关的,不需要考虑太多的意外状态,通过触发组就能很好的解决了。
而延时解密,因为要考虑到可能会有终止/意外/并行的情况,需要手动的对出发考虑失效和重复生效、计时器延时等状况,触发器组就很捉襟见肘了,一般需要更多的代码工具去进行管理。
我这里是通过自己的Task/Plan模块,将所有的触发/计时器/事件处理封装在一个Task对象内,并强制使用一个作用范围强制失效来解决这个问题的。
参考代码:
let baohuwait = 28 * 1000 let matcherKill = /^你对(.+)的(黑衣人|邪派高手|绝世高手)喝道:大胆狂徒,竟敢在这撒野!!/ //等待NPC出现的计划 let PlanProtect = new App.Plan( App.Positions["Quest"], (task) => { task.AddTrigger(matcherKill, (tri, result) => { 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 > 0) { task.AddTimer(wait, (timer) => { Note("准备迎敌") App.Send("halt") App.Core.Heal.TryTouch() $.RaiseStage("prepare") $.RaiseStage("baohu-ready") return true }).WithNoRepeat(true) } task.AddTimer(1100, () => { if (App.Core.Weapon.Touch) { if (($.Now() - Baohu.Data.Start) < baohuwait) { App.Send("halt") App.Core.Heal.TryTouch() $.RaiseStage("pause") $.RaiseStage("wait") } } return true }) task.AddTimer(3000, () => { let d = (($.Now() - Baohu.Data.Start) / 1000).toFixed(0) Note(`保护开始${d}秒`) return true }) task.AddTimer(60000, () => { App.Log("保护等待超时") return false }).WithName("timeout") $.RaiseStage("wait") }, (result) => { 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() } )可以看到,我使用了一个叫做PlanProtect的计划(task工厂),创建了一个基于Quest的封装,所有的触发和计时器都绑定在这个Task封装上,并在Quest发生变化时强制失效。
由于我一直认为Mud机器人是一个工程问题,难点在于可维护性和代码失控。所以,我认为,选用或者开发一个触发失效工具,是十分重要的,也应该是整个机器人的核心驱动逻辑之一。
-
J jarlyyn 被引用 于这个主题