北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
楼主: muxiao

请教这个mush的alias问题

[复制链接]
发表于 2009-5-31 15:34:14 | 显示全部楼层
请察看EnableTImers,  DoAfter 是基于timer的
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2009-5-31 15:36:21 | 显示全部楼层
我一直开着timer的.
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-5-31 15:43:08 | 显示全部楼层
你试试 DoAfter (1, "say sth"),能否正常执行
俺这里wudang 正常
中央广场
    桃花岛善使 测试i(Ytest)
    江湖破烂王 毫毛(Hao mao)
    武当派道童 独孤青石(Duguqingshi)
    福威镖局少镖头 芸豆(Yundou)
    普通百姓 叹息(Sighs) <发呆四分钟>
    桃花岛女善使 一袭(Yixi)
    侠客行江湖风云录(Board) [ 179 张留言,179 张未读 ]
    新手礼品树(Gift tree)
> 测试i摆了个不丁不卯步,运足了气一声断喝:老子又回来了!
测试i往北离开。
do 5 s
南大街
    流氓(Liu mang)
南大街
    少林弟子 托钵僧(Tuobo seng)
南大街
南门
    二位官兵(Guan bing)
    武将(Wu jiang)
青石大道
>
do 4 s
青石大道
青石大道
青石大道
青石大道
>
sw
w
w
nw
do 3 w
wu
官道
> 官道
> 官道
> 黄土路
> 黄土路
黄土路
    二只野兔(Ye tu)
武当山门
    江湖破烂王 毫毛(Hao mao)
    进香客(Jinxiang ke)
> 石阶
> 独孤青石身穿青色道袍走了过来。
独孤青石往北边离开。
do 3 nu
w
do 2 nu
石阶
石阶
遇真宫
    进香客(Jinxiang ke)
> 小吃店
    武当派道童 独孤青石(Duguqingshi)
    店小二(Xiao er)
> 石阶
好汉坡
>
do 2 eu
do 2 nu

石阶
玄武门
> 凌霄宫
    武当派道长 知客道长(Zhike daozhang)
武当广场
    九斤正盘膝坐在地下修炼内力。
    普通百姓 阿提夫(Akif)
    二位武当派小道士 道童(Daotong)
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2009-5-31 15:49:07 | 显示全部楼层
wudang 是正常的,taoyuan就只到wudang,后面的就不发送了.
taoyuan="wudang;#wa 1000;ed;e;e;ed;sd;ed;sd;ed;e;e"

解释wudang,执行wudang,后面#wa 1000,挂起,不执行了.
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-5-31 15:54:43 | 显示全部楼层
问题的原因,据我分析如下(与coroutine无关)

因为taoyuan数组中包含字符串wudang,而wudang本身又是另一个数组,且两个数组都有相应的alias匹配,

而赋值的时候,最后匹配的是wudang,所以wudang就被执行了……

以上的情况只出想在像taoyuan这样的alias中,因为wudang在taoyuan的alias中处在行首,而像taoyuanb这样的alias就没有这个问题,因为wudangb处在taoyuanb的行尾。

现在想到的办法就是去改数据,即,找到taoyuan的数组行,把wudang替换为wudang的真实数据,但这只是临时的办法……

[ 本帖最后由 ddid 于 2009-5-31 04:01 PM 编辑 ]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2009-5-31 16:05:38 | 显示全部楼层
有道理,我还没想明白.插件下载地址.http://www.pkuxkx.net/forum/viewthread.php?tid=4543&highlight=js,那个老大发的.
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-5-31 16:10:47 | 显示全部楼层
在递归过程中,全局变量 temp_thread_path 被覆盖了,需要对不同的 thread 区分句柄
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-5-31 16:31:48 | 显示全部楼层
问题
1)thread 句柄为全局,递归过程中会相互覆盖
2)递归过程中起的多个thread 存在竞争冒险,从某一thread递归进入其他thread时,需yield当前,并在递归thread结束后重新resume (以callback识别)
修改前
function exec_alias(s)
temp_thread_path=coroutine.create(function (s)
   local p_temp = Split(s,";");
   for i,v in ipairs(p_temp) do
    if nil~=string.find(v,"#%d+ ") then
     world.Send(do_table[string.sub(v,string.find(v,"#%d+ "))]..string.sub(v,string.find(v," .+")));
    elseif nil~=string.find(v,"#wa") then  --´¦ÀíµÈ´ý
     world.DoAfterSpecial(string.sub(v,string.find(v,"%d+")) / 2000,"coroutine.resume(temp_thread_path);",12);
     coroutine.yield();
    else
     world.Send(v);
    end
   end
end)
coroutine.resume(temp_thread_path,s);
end

修改后
temp_thread_path = {}
function exec_alias(s, callback)
temp_thread_path=coroutine.create(function (s)
   local p_temp = Split(s,";");
   for i,v in ipairs(p_temp) do
    if alias_table[v] then
     exec_alias (alias_table[v], s)
     coroutine.yield ()
    elseif nil~=string.find(v,"#%d+ ") then
     world.Send(do_table[string.sub(v,string.find(v,"#%d+ "))]..string.sub(v,string.find(v," .+")));
    elseif nil~=string.find(v,"#wa") then  
     world.DoAfterSpecial(string.sub(v,string.find(v,"%d+")) / 2000,"resume_coroutine(\""..s.."\")",12);
     coroutine.yield();
    else
     world.Send(v);
    end
   end
   if callback then
    resume_coroutine (callback)
   end

end)
coroutine.resume(temp_thread_path,s);
end
function resume_coroutine (thread_name)
    Note ("resume_coroutine : ", thread_name)
    coroutine.resume(temp_thread_path[thread_name]);
end

[ 本帖最后由 duno 于 2009-5-31 04:36 PM 编辑 ]
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-5-31 16:35:59 | 显示全部楼层
这下行了,LUA的两大特点table和coroutine,全显示出来了……
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2009-5-31 16:43:04 | 显示全部楼层
俺的想法,一次性把这些东西转格式成mush用的,存下来
这种运行时解释zmud路径的方法比较繁琐
而且用thread机制完全为了迎合zmud的#wa,非常没必要,没有啥并发性,用thread有点多此一举
Execute 的执行可以设置 delay参数,基本不会发送指令太快,服务器不响应
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 06:09 PM , Processed in 0.008852 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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