作者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
1F:推 kyoe:做一个 file 来 save & restore object data in file mapping 11/20 01:21
2F:→ kyoe:adm/daemons/itemd.c -> save_item(object ob) -> 11/20 01:23
3F:→ kyoe:itemd save_object("/data/itemd") 11/20 01:24
4F:→ kyoe:adm/daemons/itemd.c -> restore_item(object ob) -> 11/20 01:24
5F:→ kyoe:将存在itemd内的obj data copy 回obj就好了 11/20 01:25
这方法当年某wiz也是提过, 方法都是可以...
只是放在玩家物件上, 可以随着玩家一起save~
6F:推 QQmother:原po luka 0..0 11/20 02:41
7F:→ laechan:参数设在玩家身上的缺点就是玩家拿到同档名的新物品,带着 11/20 08:18
8F:→ laechan:它 quit 再 login, 该物就会变认主物 11/20 08:19
没有这个问题拉~
我用个简单的方法把它解决, L大您快速扫一下程式码便知~
※ 编辑: taily 来自: 211.74.210.172 (11/20 17:04)
9F:推 kyoe:嗯嗯..因我的itemd是配合virtuald使用的, 用另外的daemon比 11/20 18:33
10F:→ kyoe:较方便 11/20 18:33
yes同意k大, 若要用virtuald另外储存比较便利且快速...
※ 编辑: taily 来自: 211.74.209.223 (11/20 19:21)