看板 mud 關於我們 聯絡資訊
這個是從神知裡頭的「驅魂警報器」的設計來的。 比方說玩家帶著警報器進入某房間,它會顯示.. * 警報器顯示 north 方向有主動怪! * 警報器顯示 east 方向有主動怪! 則以一般的想法來說,因為玩家進入一個物件時,會觸發 該物件的 init 函數,因此用寫在房間裡的 init 函數來 做是最簡單的,即房間用繼承物件這樣子訂.. void init() { bla bla... } 然後只要一般房間有自訂 void init 時就這樣做.. void init() { ::init(); bla bla... } 但問題就在於很多 wiz 寫房間時在 void init 裡面並沒 有做 ::init(); ... 假設是這種情況,為避免警報器因自訂 void init 失效, 而且基本上這種寫法也不是說很完美(只是很簡單),因此 應採取其它做法。 第二種一般常想到的方式就是透過 move_player() 的做法 ,當呼叫者為玩家時... int move_player(string files,string types) { . . // 當玩家身上有帶警報器時,就呼叫 ob 的 show_alarm // 函數來做警報訊息的顯示 if(ob=present("警報器 id",user)) ob->show_alarm(env); . . } 基本上它可以應付大部份的情況,缺點就是每 move_player 一次,就會做一次 if 的判斷,所以原則上若採取這種做法 ,應以減化判斷做為手段。 例如說,假設該警報器是頭飾,設計是 wear 時才會有作用 ,那麼在 wear_func 通常會加上底下這行.. user->set_temp("wearing_警報器",1); 然後在 remove_func 則加上移除的程式段,那麼判斷就可 簡化為.. if(user->query_temp("wearing_警報器")) user->show_alarm(env); 上面的意思就是說,警報器變成「純裝飾品」,實際上顯示 警告的 show_alarm 函數是寫在 user 物件裡頭的。 底下是 show_alarm 函數的實際程式碼 void show_alarm(object env) { string tmp="",ext; mixed exits; object ob,r; if(env->query("exits")) { exits=keys((mapping)env->query("exits")); foreach(ext in exits) if(!catch(r=find_object_or_load(env->query("exits/"+ext)))) foreach(ob in all_inventory(r)) if(ob->query("killer")>0) { tmp+=HIM"* 警報器顯示 "+ext+" 方向有主動怪!"NOR"\n"; break; } write(tmp); } } 這東西可以進一步寫成「BOSS就在你隔壁警報器」,或者是 「有玩家就在你隔壁警報器」。 Laechan@Sanc -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.61.157.53 laechan:轉錄至看板 mud_sanc 06/21 11:33
takomalu:「正妹就在你隔壁警報器」 06/23 05:13
QQmother:down方向有個臭喜憨沒gg 06/24 18:57
Searle:.. 06/25 18:42
belion:我記得是可以用trigger做出類似的效果 07/02 15:34
belion:以kk來說有 look 方向,可以看到該方向的mob or player 07/02 15:34
belion:以前打war的trigger檔有這類似功能XD 07/02 15:35