一个关于鬼魂回到阳间的BUG!
作者:llm 发表时间:2001年7月31日 15:51
--------------------------------------------------------------------------------
其实应该是一个很明显的BUG,但不知为何最近才突然发现,想想,应该不少MUD里都会有。现提出来,希望如果有的话快快修改掉,已经改掉的,也可介绍介绍经验。
在MUD里会有很多延时后将玩家再move到目的地的代码,比如这个:
......
tell_object(ob, BLU "你在海上航行了很久很久.......\n" NOR ) ;
call_out("home", 10 , ob );
return 1 ;
}
void home( object ob )
{
tell_object(ob , "大船终于抵达了中原的一个繁华城市。你走下船来。\n" ) ;
ob->move ("/d/city2/haigang") ;
}
假设一个玩家上了船,设定10秒后呼叫home()到达海港。刚上船就来了PKer或者这个玩家毒发身亡。于是这个玩家的object就执行正常的die()函数,处理后被move到鬼门关,在那里等白无常给他还阳是要一点时间的,就在这时,前面call_out的home()时间到了,于是这个玩家就立即被move到city2/haogang.当然此时的玩家已经是鬼魂了。于是他便处于隐身状态了。
这个BUG的修改应该很简单,在文件里home()里判断一下就行了。但关键是这样的程序会很多,而且以后还会有新巫师写出来。应该找一个从根本上解决的办法。
作者:doing 发表时间:2001年7月31日 19:31
--------------------------------------------------------------------------------
这几乎是不可解决的。
我建议修改所有相关的代码,也不会有多少。
当然,如果你非要另找办法,也可以采用类似的办法:当 die 的时候把所在 room 的
call_out 清除。这个方法有一个缺陷。也可以在 move 的时候判断一下调用者是否时
room,如果是,则判断调用者是否在这个 room,否则不予 move。
但是这么做都不如直接修改得好。
何况上面那段程序还有一个错误:在定时器启动的时候没有判断 ob 是否是合法的。
作者:darks 发表时间:2001年8月1日 08:52
--------------------------------------------------------------------------------
我对die()的处理可能和别人不一样
我改了这个
if( this_object()->is_ghost() ){
inv = all_inventory(this_object());
inv -= ({ 0 });
i = sizeof(inv);
while(i--) inv[i]->move(environment());
set("gin", 1); set("eff_gin", 1);
set("kee", 1); set("eff_kee", 1);
set("sen", 1); set("eff_sen", 1);
real_death();
return;
}
if( userp(this_object()) ) {
set("gin", 1); set("eff_gin", 1);
set("kee", 1); set("eff_kee", 1);
set("sen", 1); set("eff_sen", 1);
ghost = 1;
this_object()->save();
remove_call_out("real_death");
call_out("real_death", 10 + (int) this_object()->query_con());
}else destruct(this_object());
下面这个是真正的死亡函数
void real_death()
{
if (!this_object()->is_ghost())
return;
if (!userp(this_object())){
message_vision("$N渐渐的虚化,消失了...\n",this_object());
destruct(this_object());
return;
}
message_vision("突然一阵烟雾袭来,将$N卷走了...\n",this_object());
message("system", HIR "\n烟雾中出现牛头马面,二话不说,将枷锁镣铐往你头上一套....\n" NOR,this_object());
message("system", HIR "\n你的眼前一黑,接著什麽也不知道了....\n\n" NOR,this_object());
this_object()->move(DEATH_ROOM);
DEATH_ROOM->start_death(this_object());
尊重作者 转载请注明出处52mud.com