[wizs] 今日發現的 bug

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間16年前 (2009/09/17 12:08), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串1/1
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
orz...
09/19 04:11, 1F
文章代碼(AID): #1AiROvaW (mud_sanc)
文章代碼(AID): #1AiROvaW (mud_sanc)