背景:
阅读文章

鬼魂回到阳间的bug

[日期:2007-05-06] 来源:  作者: [字体: ]

一个关于鬼魂回到阳间的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

收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容      
本文评论   [发表评论]   全部评论 (0)
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论