duno 发表于 2009-5-31 15:34:14

请察看EnableTImers,DoAfter 是基于timer的

muxiao 发表于 2009-5-31 15:36:21

我一直开着timer的.

duno 发表于 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)

muxiao 发表于 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,挂起,不执行了.

ddid 发表于 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 编辑 ]

muxiao 发表于 2009-5-31 16:05:38

有道理,我还没想明白.插件下载地址.http://www.pkuxkx.com/forum/viewthread.php?tid=4543&highlight=js,那个老大发的.

duno 发表于 2009-5-31 16:10:47

在递归过程中,全局变量 temp_thread_path 被覆盖了,需要对不同的 thread 区分句柄

duno 发表于 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," .+")));
    elseif nil~=string.find(v,"#wa") then--&acute;&brvbar;&Agrave;í&micro;&Egrave;&acute;&yacute;
   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 then
   exec_alias (alias_table, s)
   coroutine.yield ()
    elseif nil~=string.find(v,"#%d+ ") then
   world.Send(do_table..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);
end


[ 本帖最后由 duno 于 2009-5-31 04:36 PM 编辑 ]

ddid 发表于 2009-5-31 16:35:59

这下行了,LUA的两大特点table和coroutine,全显示出来了……

duno 发表于 2009-5-31 16:43:04

俺的想法,一次性把这些东西转格式成mush用的,存下来
这种运行时解释zmud路径的方法比较繁琐
而且用thread机制完全为了迎合zmud的#wa,非常没必要,没有啥并发性,用thread有点多此一举
Execute 的执行可以设置 delay参数,基本不会发送指令太快,服务器不响应
页: 1 2 [3] 4 5 6
查看完整版本: 请教这个mush的alias问题