作者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