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--´¦ÀíµÈ´ý
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参数,基本不会发送指令太快,服务器不响应