推 hlead :soga..了解了.. 07/28 21:50
hlead 你可以參考。
※ 引述《hlead (希多)》之銘言:
/std/mob/living.c
varargs int shut(string msg,int damage,int chance,mixed kinds,object tar,
int times)
{
if(!times) times=1;
if(!kinds)
MOB_D->shut(me, msg, damage, chance, ({"dam","physics"}), tar,times);
else if(stringp(kinds))
MOB_D->shut(me, msg, damage, chance, ({kinds,"physics"}), tar,times);
else
MOB_D->shut(me, msg, damage, chance, kinds, tar,times);
上面簡單的說,怪物呼叫 shut 時會傳六個參數
mob->shut(殺傷敘述,傷害,命中,種類陣列,對象,連擊數);
連擊數就是上面的 times, 若沒有給 times 就自動設成 1。
然後 mob 的 shut 會呼叫 MOB_D 的 shut,並傳七個參數給它。
MOB_D->shut(把自己傳過去,殺傷敘述,傷害,命中,種類陣列,對象,連擊數);
: /adm/daemons/mob_d.c的某段函式:
: int shut(object me,string msg,int damage,int chance,
: mixed kinds,object tar,int times)
所以這裡會看到七個參數。
: {
: SHUT_D->shut_tar(me,tar,msg,damage,chance,kinds,times);
然後 MOB_D 的 shut 又會把七個參數傳給 SHUT_D
: return 1;
: }
: 以前是
: SHUT_D->shut_tar(me,tar,msg,damage,chance,kinds,1);
1 有可能是刻意改的(然後忘記改回). 刻意的原因通常是因為系統
發生莫名奇妙的 lag 狀況, 為控制損害程度就先把怪物的連擊數
先改成 1。
(通常是不得已的情況才會這樣改, 而且通常也改了別的東西)
: user_d.c的則是
: SHUT_D->shut_tar(me,tar,msg,damage,chance,kind);
: 可是他莫名的是有效的...所以蠻好奇原因的...
你要先看 user.c, user.c 沒有定義 shut 時就去 /std/user 裡
面再找 shut
> grep -n shut *.c
[/std/user/attack.c]
126:varargs int shut(string msg,int damage,int chance,
在 attack.c 裡頭是這樣寫的..
if(!kinds)
SHUT_D->shut_tar(me,tar,msg,damage,chance,({"dam","physics"}),times);
else if(stringp(kinds))
SHUT_D->shut_tar(me,tar,msg,damage,chance,({kinds,"physics"}),times);
else
SHUT_D->shut_tar(me,tar,msg,damage,chance,kinds,times);
上面簡單的說就是在 attack.c 直接就 call SHUT_D。
user.c 跟 user_d.c 的差別,一般來說可以用一種例子來做說明
,玩家物件基本上是 /std/user.c,所以如果某函數寫在 user.c
裡頭,則如果你修改了該函數的內容,你的更動並無法「即時」反
映,要嘛 shutdown,不然就是請玩家 quit(allquit 指令就是這
樣子來的),玩家 relogin 後才能套用更新後的函數。
但如果你這樣子寫...
int xxx()
{
USER_D->xxx();
return 1;
}
也就是說把 xxx 這個函數的本體寫在 user_d.c 的話,這樣你改
了 user_d.c 的 xxx 函數、然後 update user_d.c,這樣寫在
user.c 的 xxx 函數就會去呼叫「已更新的 xxx 函數」,這樣就
能達到即時更新的目的。
但是如果過了一段時間,你確定 xxx 函數不會再被更改、或者它
並不需要很頻繁地更動,而 xxx 函數卻經常 user 本身呼叫時,
最好就把 xxx 函數挪回 user.c 中,improve_skill 函數就有做
挪回,improve_skill 函數原先是寫在 user2_d.c 中。
Laechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.117.3.82