Re: [閒聊] 分散式儲存
這裡順便聊一下 vroom 會產生的一個問題,以及一個
簡易的暫時解決方案,比方 002.c 這個房間,假設它
被載入(生成)了,那麼一般 mud 要找到該已載入房間
的簡易做法如下..
if(room=find_object(__DIR__+"002"))
它的意思就是,如果 002 已經被載入了,就令 room
等於「該已被載入的房間」;若 002 沒有被載入,就
載入它、然後令 002 等於「這個新載入的房間」。
那麼,虛擬物件的部份,一個最大的問題就是,我們如
何知道一個虛擬物件已經被載入呢?
最簡單的做法就是在載入虛擬物件時,替它標上「識別
」,例如「玩家」實際上也算是廣義的虛擬物件,則要
找到「已被載入的玩家 laechan」就可以用這種做法..
if(user=find_player("laechan"))
也就是說,find_player 是一個已經被寫好、專門用來
找已被載入玩家的函數。
那同理亦可假設有一個 find_vobject 的函數也是用來
做這種事的,則以 find_player 為例,它的依據是以
「玩家ID」做為識別,則 find_vobject 同樣也應該標
示一個東西來做為識別。
那麼,假設說,你不知道系統是否有內建找尋虛擬物件
的函數時,該怎麼做呢? 只要自訂函數來處理即可
比方我們自訂找家族根據地的函數 find_groom,則其內
容可以這樣寫..
// names 為族長ID
object find_groom(string names)
{
object* obs=([]);
object ob;
// 令 obs = mud 全物件
obs=objects();
foreach(ob in obs)
if(ob && ob->check_leader_names(names))
return ob;
ob=new("/inherit/vroom");
ob->restore_room("/group_data/"+names);
return ob;
}
則當我們做如下判斷時
if(vroom=find_groom(names))
當 objects() 裡面有存在該 vroom 時,就回傳該已載
入的 vroom; 若不存在的話,就 new 出一個新的東西並
return 它。
基本原則就是若該虛擬物件存在,就要呼叫已存在的;
虛擬物件不存在時,才 new 出來用。
LAechan
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.117.106.224
討論串 (同標題文章)