level 2
另外 请教下, 那个 我用tomud ,但是他只要屏幕有刷新行数,就和输入命令的栏冲突
2015年02月13日 12点02分
2
level 2
但是我在 adm\simul_efun\item下面又发现个貌似是关于动态物品专门储存的文件
// 动态数据操作 by Wenwu
mapping actions;
// 存档
nomask varargs void auto_save_item(object ob, int sb)
{
string file_arg, ob_arg;
mixed *file;
object *inv;
int i;
ob_arg = "";
inv = all_inventory(ob);
if ( !stringp(ob->query("id")) ) return;
if ( !environment(ob) ) return;
if ( !playerp(ob) ) return;
if ( ob->query_temp("no_auto_items")) return;
file_arg = DATA_DIR + "item/" + ob->query("id") + "/";
if ( file_size(file_arg) != -2 )
mkdir(DATA_DIR + "item/" + ob->query("id"));
file = get_dir(file_arg, -1);
// 删除上次的档案
if ( sizeof(file) )
{
for (i = 0; i < sizeof(file); i++)
{
if ( file_size(file_arg + file[i][0]) != -1 )
rm(file_arg + file[i][0]);
}
}
if ( sizeof(inv) < 1 )
{
rmdir(DATA_DIR + "item/" + ob->query("id"));
return;
}
// 存档
for (i = 0; i < sizeof(inv); i++)
{
if( inv[i]->query("xyzx_ylfy_buy_sell") )
continue;
if ( inv[i]->query("xyzx_save_item") && inv[i]->query("owner_id") )
{
ob_arg += base_name(inv[i]) + ":" + i + "\n";
if( inv[i]->query("equipped"))
{
inv[i]->set_temp("save_temp_remove", 1);
if( !inv[i]->unequip() )
log_file("destruct", sprintf("Failed to unequip %s when destructed.\n",file_name(inv[i])));
}
inv[i]->save(file_arg + i);
if ( sb && inv[i]->query_temp("save_temp_remove") )
{
inv[i]->delete_temp("save_temp_remove");
if ( inv[i]->query("weapon_prop") )
inv[i]->wield();
else if ( inv[i]->query("armor_prop") )
inv[i]->wear();
}
}
}
if ( ob_arg != "" )
write_file(file_arg + "物品", ob_arg, 1);
else
rmdir(DATA_DIR + "item/" + ob->query("id"));
return;
}
// 取档
nomask void auto_restore_item(object ob)
{
string file_arg, ob_arg, *file_list, *ob_list;
mixed *file;
object obj;
int i;
if ( !stringp(ob->query("id")) ) return;
if ( !environment(ob) ) return;
if ( !playerp(ob) ) return;
file_arg = DATA_DIR + "item/" + ob->query("id") + "/";
if ( file_size(file_arg) != -2 )
return;
if ( file_size(file_arg + "物品") == -1 )
return;
file = get_dir(file_arg, -1);
if ( sizeof(file) < 2 )
return;
ob_arg = read_file(file_arg + "物品");
file_list = explode(ob_arg, "\n");
for (i = 0; i < sizeof(file_list); i++)
{
if ( strsrch(file_list[i], ":") != -1 )
{
ob_list = explode(file_list[i], ":");
if( sscanf(ob_list[0], "/d/npc/m_weapon/%*s") )
ob->set_temp("my_make_item", 1);
obj = new(ob_list[0]);
obj->restore(file_arg + ob_list[1]);
obj->set_name(obj->query("name"), ({obj->query("id")}));
actions = WEAPON_D->query_action_xyzx(obj);
obj->set("actions", actions);
obj->move(ob);
}
}
return;
}
// 删档
nomask void delete_item_data(object ob)
{
string file_arg, id;
mixed *file;
int i;
if ( !stringp(id = ob->query("id")) ) return;
if ( !playerp(ob) ) return;
file_arg = DATA_DIR + "item/" + id + "/";
if ( file_size(file_arg) != -2 ) return;
file = get_dir(file_arg, -1);
// 删除上次的档案
if ( sizeof(file) )
{
for (i = 0; i < sizeof(file); i++)
{
if ( file_size(file_arg + file[i][0]) != -1 )
rm(file_arg + file[i][0]);
}
}
rmdir(DATA_DIR + "item/" + id);
/**************以下为删除key文件*****************/
file_arg = DATAKEY_FILE + DATA_DIR + "item/" + id + "/";
if ( file_size(file_arg) != -2 ) return;
file = get_dir(file_arg, -1);
// 删除上次的档案
if ( sizeof(file) )
{
for (i = 0; i < sizeof(file); i++)
{
if ( file_size(file_arg + file[i][0]) != -1 )
rm(file_arg + file[i][0]);
}
}
rmdir(DATA_DIR + "item/" + id);
}
2015年02月18日 13点02分
6
测试一下存档的那段for循环里与ID记录有关的代码,是否会造成物品短ID丢失的问题
2015年02月19日 02点02分
回复 天洲_Alf :不懂,本人也没那么专业啊!本人也就算半个小白
2015年02月19日 12点02分
回复眉烟如黛:世上没有生而知之者,至少我还未曾见过。对自己有兴趣的事物付出努力,相信会有收获
2015年02月20日 00点02分