|
楼主 |
发表于 2008-1-7 11:53:41
|
显示全部楼层
利用mushclient的DoAfter和mud的tell指令实现延时功能 by boost@pkuxkx
利用mushclient的DoAfter和mud的tell指令实现延时功能
不懂lua,所以只好自己想法写个延时功能
说明一下,这个功能并不是为了实现在一串指令中插入n个延时,而是实现在服务器端的真正延时,主要思想是延时之前tell 自己一个特定字符串,收到tell的消息后开始延时,延时结束再tell自己一个特定字符串,然后开始延时后的工作,这样能确保lag的时候延时是正常的
如果想在一串指令中插入n个延时,需要自己实现speedwalk,mushclient自带的不好用
首先要求在game中保存一个变量myid,代表自己的id
以下是trigger部分,用于捕捉tell消息
enabled="y"
keep_evaluating="y"
match="^(?:> )?([^\(]+)\(([^\)]+)\)告诉你:(.*)$"
regexp="y"
send_to="12"
sequence="1"
>
chatLog("%1","%2","%3")
可以匹配如下模式
> 中文名(id)告诉你:消息内容
例如
> 双核(doublecore)告诉你:test
脚本部分
var robot_chat_prefix = world.CreateGUID(); //每次加载脚本生成一个guid,作为消息头,防止误触发
robot_chat_prefix = robot_chat_prefix.replace(/\-/g,"");
robot_chat_prefix = robot_chat_prefix.substr(0,23);
function chatLog(cname,ename,msg)
{
if(ename == GetPluginVariable("","myid")) //判断是否为自己tell自己
{
if(msg.substr(0,23) == robot_chat_prefix) //判断消息头是否为guid,只有以guid开头的消息才会触发相应的函数
{ //函数名为robot_+消息名,自己实现,通过fire_robot发出
return do_robot_action(msg.substr(23));
}
//其它判断
}
}
function do_robot_action(msg)
{
return eval("robot_"+msg)(); //由于做了guid保护,因此该函数一定存在
}
function fire_robot(msg)
{
send("tell "+GetPluginVariable("","myid")+ " "+robot_chat_prefix+msg); //添加GUID消息头
}
function fire_robot_after(time,msg)
{
DoAfter(time,"tell "+GetPluginVariable("","myid")+ " "+robot_chat_prefix+msg); //同上,增加延时
}
这些函数只能提供给脚本内部使用,不能插入命令行中,例如要暂停5秒后调用函数robot_other_thing()
可以这么写 fire_robot_after(5,"other_thing");
如果这么写DoAfterSpecial(5,"robot_other_thing()",12)也能延时,但是只是客户端延时
稍微扩充一下可以写出任意条件延时,当然这个任意条件需要自己实现
下面举例说明,例如在快速行走中会遇到挡路npc,当然是自己实现的快速行走,mush自带的不是很好用
假设快速行走路径为 n, kill liu mang, e
这里的任意条件为 “liu mang被杀死”
可以这么写
send("n");
fire_robot("check_kill_start");
上面这一行会触发函数robot_check_kill_start()
function robot_check_kill_start()
{
EnableTrigger("check_kill_trigger",1); //打开检查是否有叫杀的trigger,叫杀时将某个变量赋值
kill_flag = false; //假设该变量为kill_flag,注意设成全局,初始设成false,有叫杀后在叫杀trigger中设为true
send("kill liu mang"); //想办法获取到要杀的对象-liu mang,或者指令-kill liu mang
fire_robot("check_kill_stop"); //立即触发函数robot_check_kill_stop()
}
function robot_check_kill_stop()
{
EnableTrigger("check_kill_trigger",0); //关闭检查是否有叫杀的trigger
if(kill_flag) //有叫杀,表示该npc没有被杀死,2s后继续杀
{
fire_robot_after(2,"check_kill_start"); //2s后重新检查
}
else
{
//该npc已被杀死,可以继续行走
}
}
欢迎交流:) |
|