作者taily (準農夫)
看板mud
標題[閒聊] 複製物儲存系統...
時間Sun Nov 20 00:58:52 2011
要儲存複製物品常見的小問題:
當clone /obj/sword.c
(假設此物件有效id是sword)
那麼call sword->set("name","frist")
再clone /obj/sword.c
再call sword->set("name","second")
如何才能將同一檔案設定儲存而不隨著斷線消失呢?
比較簡單的寫法就是在玩家身上增加一個變數作儲存與載入...
之後你只要寫"一個"武器/防具(等物件)檔案就可以了...
然後讓系統自行去隨機決定能力, 不用毎個武器防具都要寫~
例如: 小貓世界 無名劍, 每次去鑑定都可以得到不同能力值~
(不過它是不是這樣寫我就不曉得了)
另外若讓物件多個hear_beat()...
那麼就是可以裝載和餵食就可以進化的寵物~
(類似希望online的寵物eq)
假設檔名save_random.c
放在/feature/save_random.c
在/std/char.c增加下列這一行:
inherbit /feature/save_random.c;
/* save_random.c */
mapping save_eq;
static string *str=({});
void clean_up_value(){ save_eq = 0; }
void save_random_value()
{
int i,count;
object *all_inv;
string save_string;
all_inv = all_inventory();
save_eq = allocate_mapping(sizeof(all_inv));
for(i=0; i<sizeof(all_inv); i++){
if( !all_inv[i]->query_autoload() &&
!all_inv[i]->query_temp("save_random")
) continue;
save_string = explode(file_name(all_inv[i]), "#")[0];
while(!undefinedp(save_eq[save_string]))
save_string = base_name(all_inv[i]) + "#" + (++
count);
save_eq[save_string] = all_inv[i]->query_entire_dbase();
count = 0;
}
return;
}
void restore_random_value()
{
mixed save_value;
int i, count;
string load_string;
mapping map;
object *all_inv = all_inventory();
str = allocate(sizeof(all_inv));
if( !mapp(save_eq) || !save_eq ) return;
for(i=0; i<sizeof(all_inv); i++){
load_string = base_name(all_inv[i]);
while( member_array(load_string, str)!=-1 )
load_string = base_name(all_inv[i]) + "#" + (++
count);
str[i] = load_string;
count = 0;
}
for( i=0; i<sizeof(all_inv); i++ ){
if( undefinedp(map = save_eq[str[i]]) ) continue;
// 只允許某些可以載入
if( save_value = map["name"] )
all_inv[i]->set("name", save_value);
if( save_value = map["id"] )
all_inv[i]->set_id(save_value);
if( save_value = map["long"] )
all_inv[i]->set("long", save_value);
if( save_value = map["weapon_prop"] )
all_inv[i]->set("weapon_prop", save_value);
if( save_value = map["armor_prop"] )
all_inv[i]->set("armor_prop", save_value);
}
clean_up_value();
return;
}
其實也很簡單 主要是有沒有想到的問題...
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.67.116.160
推 kyoe:做一個 file 來 save & restore object data in file mapping 11/20 01:21
→ kyoe:adm/daemons/itemd.c -> save_item(object ob) -> 11/20 01:23
→ kyoe:itemd save_object("/data/itemd") 11/20 01:24
→ kyoe:adm/daemons/itemd.c -> restore_item(object ob) -> 11/20 01:24
→ kyoe:將存在itemd內的obj data copy 回obj就好了 11/20 01:25
這方法當年某wiz也是提過, 方法都是可以...
只是放在玩家物件上, 可以隨著玩家一起save~
推 QQmother:原po luka 0..0 11/20 02:41
→ laechan:參數設在玩家身上的缺點就是玩家拿到同檔名的新物品,帶著 11/20 08:18
→ laechan:它 quit 再 login, 該物就會變認主物 11/20 08:19
沒有這個問題拉~
我用個簡單的方法把它解決, L大您快速掃一下程式碼便知~
※ 編輯: taily 來自: 211.74.210.172 (11/20 17:04)
推 kyoe:嗯嗯..因我的itemd是配合virtuald使用的, 用另外的daemon比 11/20 18:33
→ kyoe:較方便 11/20 18:33
yes同意k大, 若要用virtuald另外儲存比較便利且快速...
※ 編輯: taily 來自: 211.74.209.223 (11/20 19:21)