作者laechan (小太保)
看板mud_sanc
标题[wizs] 今日发现的 bug
时间Thu Sep 17 12:08:23 2009
Heart beat in /d/ppl/highelf/west/3/mob/internet#302427 turned off.
执行时段错误: *Division by zero
程式: d/ppl/highelf/west/3/mob/hide.c:11
物件: /d/ppl/highelf/west/3/mob/hide#302578
/d/ppl/highelf/west/3/mob/internet#302427 "heart_beat" std/monster.c:116
/adm/daemons/mob_d "continue_attack" adm/daemons/mob_d.c:581
/adm/daemons/mob_d "execute_attack" adm/daemons/mob_d.c:656
/d/ppl/highelf/west/3/mob/internet#302427 "special_fun" d/ppl/highelf/west/3/mob
/internet.c:149
/d/ppl/highelf/west/3/mob/hide#302578 "create" d/ppl/highelf/west/3/mob/hide.c:1
1
我刚看了一下 internet 的档案,set_living_name 的部份尽量小写
,special 的设定部份最高设 9x 就好(也不要 99)。
void receive_damage(int damage)
{
if(damage < 60000 ) return 0;
::receive_damage(damage/9);
}
void 的宣告改用 return ; 即可。我刚看了一下 /std/mob/attack.c
,怪物原始的 receive_damage 是宣告为 int,自订的 receive_damage
最好也宣告为 int。即保留上面的 return 0,最底下加一行 return 1;
void clone_mob()
{
say(HIW"正当魔法阵光芒亮起到最高点之时, 魔法阵招唤出来了一些远古时代的恐龙, 朝꜊A攻了过来.\n"NOR);
clone_object (EM"mob")->move(environment(this_object()));
call_out("end_clone",6);
}
这 nobu 好像有提过若有用到 clone 的话最好宣告为 int 函数然後
return 1. (有用到 move, move_player 的必须这样做是确定的)
再来看 执行时段错误: *Division by zero 的部份
主要出现在 /d/ppl/highelf/west/3/mob/hide.c 第 11 行附近
inherit OBJECT ;
object ppl=this_player();
void create()
{
set("id",({"潜透击"}));
set("name",HIR"潜透击"NOR);
set("prevent_auc",1);
set("prevent_drop",1);
set("prevent_auc",1);
set("invis",100);
set("hide",(["time":40000/(int)ppl->query("stat/air")
,"dam":50000000/(int)ppl->query("stat/con")]));
}
会出现 *Division by zero 代表上面的 ppl 「不存在」
理论上如果这是在战斗中由怪物 Internet 的 special_fun 所呼
叫出来的时候,则 ppl 理论上会变成 Internet
this_player() 并不绝对是指玩家,而是指呼叫或载入该物件的
主体object 是谁,正常我们写在房间的 void init 函数因为呼
叫与使用自订指令的多半是玩家,所以才会很经常判断 this_player()
为玩家. 我是觉得可能该怪物并无设定 air 或 con 才会出现除
数为 0 的情况
我刚 data 了一下 Internet
stat : ([ "dex" : 7020, "str" : 7371, "fel" : 7020,
"int" : 7020, "mag" : 7371, "con" : 7020 ])
确定是没有 air 的,这里也可以顺便印证 this_player() 读到
的其实是 Internet。
执行时段错误: *Value being indexed is zero.
程式: d/ppl/highelf/west/3/mob/internet.c:169
物件: /d/ppl/highelf/west/3/mob/internet#295167
生物名: Internet
/d/ppl/highelf/west/3/mob/internet#295167 "heart_beat" std/monster.c:116
/adm/daemons/mob_d "continue_attack" adm/daemons/mob_d.c:581
/adm/daemons/mob_d "execute_attack" adm/daemons/mob_d.c:656
/d/ppl/highelf/west/3/mob/internet#295167 "special_fun" d/ppl/highelf/west/3/mob
/internet.c:169
Heart beat in /d/ppl/highelf/west/3/mob/internet#295167 turned off.
执行时段错误: *Illegal to move or destruct an object (/d/wiz/mob/lodao#4) defini
ng actions from a verb function which returns zero.
程式: (0):0
物件: 0
通常出现 Value being indexed is zero. 代表字串 or 物件 or
阵列本身为空的情况居多。
169 行附近的程式码如下...
ppl->set("ready_attack",2000);
ppl->set("block_command_msg","你还被击飞在半空中, 还没落地.\n");
ppl->set("block_command",5);
i=17+random(5);
ppl->move_to(ER+i);
}
break;
default :
if(sizeof(all_inventory(mob))&&random(2)) out(1);
else if((int)ppl->query("stat/dex")<2000+random(3000))
所以可能的原因是..
一、ppl 不见了
二、mob 不见了
以第二种情况为例你可以改用底下判断方式..
if(mob && sizeof(all_inventory(mob))&&random(2)) out(1);
else if(ppl && (int)ppl->query("stat/dex")<2000+random(3000))
或者..
if(!mob) return ; // 先一步判断底下要用到的 mob 是否存在
执行时段错误: *Bad argument 1 to call_other()
Expected: string or array or object Got: 0.
程式: d/ppl/highelf/west/3/mob/guard.c:51
物件: /d/ppl/highelf/west/3/mob/guard#271903
生物名: guard
/d/ppl/highelf/west/3/mob/guard#271903 "heart_beat" std/monster.c:116
/adm/daemons/mob_d "continue_attack" adm/daemons/mob_d.c:581
/adm/daemons/mob_d "execute_attack" adm/daemons/mob_d.c:656
/d/ppl/highelf/west/3/mob/guard#271903 "special_fun" d/ppl/highelf/west/3/mob/gu
ard.c:51
出现 *Bad argument 1 to call_other() 通常原因有两种..
1. 参数量给定不足
2. 参数型态给定错误
mob->shut(HIY"龙"HIR"*"HIY"操"HIR"*"HIY"翔"NOR,
400000+random(999),10000,
({"fire","physics"}),
ob,5+random(5));
我个人自己认为比较有可能出问题的在 ob 上面,也就是 ob 突
然消失的情况,因为你判断式是这麽写的...
void special_fun(object mob,object ppl)
{
foreach(object ob in query_attackers())
{
通常我们会避免这样子写,因为 query_attackers() 的结果确实
有可能会在其中藏了几个 0。如果你要像上面那样子写的时候要
加一行判断..
foreach(object ob in query_attackers())
{
if(!ob || (ob && !environment(ob))) continue; // 略掉这类的 ob
locals were: "执行时段错误: *Bad argument 1 to call_other()
Expected: string or array or object Got: 0.
程式: adm/daemons/room_d.c:60
物件: /adm/daemons/room_d
/g/tales/room/rooms287 "reset" u/n/nobu/king/kroom.c:487
/g/tales/room/rooms287 "reset" std/ob/room.c:42
/adm/daemons/room_d "reset" adm/daemons/room_d.c:60
/adm/daemons/room_d "CATCH" adm/daemons/room_d.c:60
这纯粹是 room_d.c 的问题,下午再看。已知它会造成 tales 国
在载入 rooms287 这个房间时出问题。
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.225.163.92
1F:→ HighElf :orz... 09/19 04:11