[wizs] 今日發現的 bug
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
→
09/19 04:11, , 1F
09/19 04:11, 1F
mud_sanc 近期熱門文章
PTT遊戲區 即時熱門文章
18
25
4
12
10
12
-17
30
29
36