2011-12-03 | #1 |
高级会员
注册: 08年04月11日
来自: 盘丝洞
帖子: 311
声望力: 20
声望:
50
现金:29两梁山币
资产:1245两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0 |
鬼魂回到阳间的bug
一个关于鬼魂回到阳间的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()); } 以上转引自www.niub.net之mud制作讨论组 |
|