作者laechan (打死不投馬冏,李系咩安抓)
看板mud_sanc
標題Re: [wiz]init
時間Thu Jun 21 06:58:34 2007
※ 引述《HighElf (高等妖精)》之銘言:
: 當我在void init()裡面寫到偵測this_player()
: 可是當this_object()是mob時也會被判斷為是this_player()
: 例如在地下湖裡面偵測有無戴氧氣罩的程式段
先有個概念,this_object() 跟 this_player() 都是函數,它們
都會傳回一個東西。
this_object() : 傳回程式本體物件
(也就是如果在怪物檔案物件裡面使用 this_object()
通常就是傳回怪物自己)
this_player() : 呼叫該物件該程式的物件
所以如果在房間裡面自訂 init 函數時,則...
this_object() : 傳回房間本身
this_player() : 傳回觸發到該 init 函數的物件
因為不只是玩家,連怪物進入該房間時都會呼叫 init 函數,在這
情況下,自然 this_player() 有可能是怪物。
: void init()
: {
: mixed cm;
: object ob;
: string rac;
: object me=this_player();
這個 me 就是任何觸發到 init 的物件。
: rac=me->query("race");
: if(me->query("npc")) return 0; //玩家沒有npc的參數
你這樣寫是不對的,因為你的 init 宣告為 void,void 就是
「無傳回值」,一個函數宣告為 void,在 return 時就不能
return 任何東西,你只能 return ;
if(me->query("npc")) return ;
再來的話,要判斷一個物件是不是玩家的最好方法是...
if(!userp(me)) return ;
若 me 是玩家,userp(me) 的傳回值就是 1,if(!userp(me))
就是說如果傳回的值不是 1(me 不是玩家) 的情況。
這樣的判斷比較嚴謹。
: if(rac=="elf") return 0;
: cm = all_inventory(me);
: foreach(ob in cm)
: if(ob->query("oxygenitem")) return 0;
: call_out("check",1,this_player());
: }
: 照理來說 mob 應該不會經過 check 階段
: 但是實際上 mob就是會被 check ,因而移除掉
: 所以就必須要多加一行 if(me->query("npc")) return 0;
: 是不是init函數出錯了呢?
大致上你的寫法應該沒錯,你可以把怪物的 race 設成 elf,
就可以知道了。
最後,程式做一下最佳化較好,
: rac=me->query("race");
: if(me->query("npc")) return 0; //玩家沒有npc的參數
: if(rac=="elf") return 0;
這三行的理想順序是...
: if(me->query("npc")) return 0; //玩家沒有npc的參數
: rac=me->query("race");
: if(rac=="elf") return 0;
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.231.214.226