跳转至内容
  • 欢迎
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
品牌标识

Hellclient 社区

  1. 主页
  2. Script脚本
  3. 深入浅出制作全自动Mud机器人-延时响应

深入浅出制作全自动Mud机器人-延时响应

已定时 已固定 已锁定 已移动 Script脚本
全自动
1 帖子 1 发布者 13 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • jarlyynJ 离线
    jarlyynJ 离线
    jarlyyn
    编写于 最后由 jarlyyn 编辑
    #1

    延时响应是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发生变化时强制失效。

    预期管理工具Plan/Task的详细介绍

    由于我一直认为Mud机器人是一个工程问题,难点在于可维护性和代码失控。所以,我认为,选用或者开发一个触发失效工具,是十分重要的,也应该是整个机器人的核心驱动逻辑之一。

    1 条回复 最后回复
    • jarlyynJ jarlyyn 被引用 于这个主题
    回复
    • 在新帖中回复
    登录后回复
    • 从旧到新
    • 从新到旧
    • 最多赞同


    • 登录

    • 没有帐号? 注册

    • 登录或注册以进行搜索。
    Powered by Herbrhythm.
    • 第一个帖子
      最后一个帖子
    0
    • 欢迎
    • 版块
    • 最新
    • 标签
    • 热门
    • 用户
    • 群组