作者laechan (小太保)
看板mud_sanc
标题Re: [wizs] 使用问题及其它效果问题...
时间Tue Aug 17 22:10:03 2010
※ 引述《justinj (闇冥)》之铭言:
: 问题3..例如..中迟缓的这段时间(120sec)内
: 玩家按enter(或test)後5秒内不能动...5秒後此指令执行,且可以再次按
: 这样经过24次後..此效果结束....
玩家「只」按 enter 吗?我假设你设定 120 sec 内最多
只允许玩家下 24 次指令,而且间隔至少 5 秒。
int cmd_hook(string str)
{
object ppl=this_player();
int t=time();
string verbs=query_verb();
if(!verbs || verbs=="")
return 1;
if(query("can_cmds"))
{
delete("can_cmds");
return 0; // 执行原先的效果
}
if(query("cant_cmd")>t)
ppl->receive(""); // 不管下什麽指令都传回空字串
// 这里也可以设定提示讯息告知无法下指令
else
{
set("cant_cmd",5+t);
call_out("delay_cmds",5,ppl,query_verb()+" "+str);
}
return 1;
}
int delay_cmds(object ppl,string cmds)
{
if(ppl)
{
set("can_cmds",1);
// 玩家在 force_me 的瞬间又会 call cmd_hook
// 这时 cmd_hook 会判断到有 query("can_cmds")
ppl->force_me(cmds);
}
return 1;
}
这样玩家只要在能被允许下指令的时候「下了一个指令」..
一、这个指令 5 秒後才会有作用。
二、这 5 秒内他无法下其它的指令。
:
: 问题1..玩家跑到某房间时add_action()增加指令,remove_action()移除指令
: 这2个只能玩家本身去触发吗?
add_action() 最常被写在 void init() 函数中的原因,
在於 init() 函数通常都是由玩家去呼叫的。
例如进入一个有喷水池可 drink 的房间...
玩家→呼叫房间的 init()→再呼叫到 add_action()
这时就相当於玩家为「呼叫主体」。
void add_action( string | function fun, string | string
*cmd, int flag );
无回传值 add_action( 字串 或 函数 fun, 字串 或 字串
*cmd, 整数 flag );
由上可知它无法模拟「由他人呼叫,然後让目标玩家可下
什麽指令」的情况,这是因为玩家能下什麽指令,是储存
在玩家本身的物件资料中的,那个资料只有玩家自己能动
所以,同样的,例如有一行..
call_out("ooxx",5,......)
这个 call_out 「同样也是由玩家本身」去 call 的,所
以当 5 秒後 ooxx 函数执行时..
int ooxx()
{
write("test.\n");
this_player() 就会看到 "test" 讯息的原因就在这里。
呼叫主体的概念最常被用在「攻击的反击」上,因为当怪
物对玩家施展攻击时如下..
mob->shut(ppl) ->check_combat(mob,ppl)
->check_counter(mob,ppl)->
ppl->shut(mob)
这一连串的动作通通都是由 mob->shut(ppl) 开始的,因
此到 ppl->shut(mob) 时,实际上并不是 ppl->shut(mob)
而是 mob->shut(mob) 变成 mob 自己杀自己。
这就是独孤、反击、炽光障壁初期 bug 的由来。
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.117.3.82