北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 5331|回复: 0

关于mushclient触发不执行的处理

[复制链接]
发表于 2017-1-8 12:03:15 | 显示全部楼层 |阅读模式
有些朋友写了mushclient的触发器后,发现有些会执行,有些偶尔不会执行。
什么原因呢?通常情况下是被拦截了,就是原先调试通过了,后来突然发现不执行了。

注意触发器选项中有个保持有效性这个选项,这个选项,不选意味着,执行到我这个触发器,如果匹配了,处理后就终止了,后续就不再处理了,如果不匹配,再后续处理看看。
如果是勾选上的,那么即便是匹配触发了,也不会终止后续的处理。
所以要保证触发不会被拦截,那么一般会选择上这个保持有效性选项。
当然,这这样一来,mushclient程序负荷加重了,每一条语句都需要匹配所有的后续触发器直到终止。
所以,如果是自己用的机器,当你很清楚明白这个语句,在今后的处理中,都在这一个触发器处理中完成所有情况处理,那么可以选择不在保持有效性。

还有一种用脚本的情况,就是wait.regexp的选项配置问题,也是类似的。
简便粗暴一点可以直接修改wait.lua中的regexp函数
-- ----------------------------------------------------------
-- wait.regexp: we call this to wait for a trigger with a regexp
-- ----------------------------------------------------------
function regexp (regexp, timeout, flags)
  local id = "wait_trigger_" .. GetUniqueNumber ()
  threads [id] = assert (coroutine.running (), "Must be in coroutine")
            
  check (AddTriggerEx (id, regexp,
            "-- added by wait.regexp",  
            bit.bor (flags or 0, -- user-supplied extra flags, like omit from output
                     trigger_flag.Enabled,
                                         trigger_flag.KeepEvaluating,  --<<--加上这个选项
                     trigger_flag.RegularExpression,
                     trigger_flag.Temporary,
                     trigger_flag.Replace,
                     trigger_flag.OneShot),
            custom_colour.NoChange,
            0, "",  -- wildcard number, sound file name
            "wait.trigger_resume",
            12, 50))  -- send to script (in case we have to delete the timer)   <<--注意可以把wait.regexp的触发优先级调整到50,一般直接脚本的处理在逻辑上会更优先一点,避免被界面配置的触发器拦截不触发的问题,否则不得不去调试哪个触发器导致未触发再去界面勾选,保持有效性的选项。

  -- if timeout specified, also add a timer
  if timeout and timeout > 0 then
    local hours, minutes, seconds = convert_seconds (timeout)

    -- if timer fires, it deletes this trigger
    check (AddTimer (id, hours, minutes, seconds,
                   "DeleteTrigger ('" .. id .. "')",
                   bit.bor (timer_flag.Enabled,
                            timer_flag.OneShot,
                            timer_flag.Temporary,
                            timer_flag.ActiveWhenClosed,
                            timer_flag.Replace),
                   "wait.timer_resume"))

    check (SetTimerOption (id, "send_to", "12"))  -- send to script

    -- if trigger fires, it should delete the timer we just added
    check (SetTriggerOption (id, "send", "DeleteTimer ('" .. id .. "')"))  

  end -- if having a timeout

  return coroutine.yield ()  -- return line, wildcards
end -- function regexp
------------------------------------------------------------------------------------------
优雅一点,可以重新定义一下regexp函数
wait.oldregexp=wait.regexp
wait.regexp=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

北大侠客行MUD,中国最好的MUD

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-28 07:20 AM , Processed in 0.009300 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表