Re: [问题] 一堆问题

楼主: laechan (挥泪斩马云)   2014-03-25 09:32:37
※ 引述《justinj (黑旋风)》之铭言:
: 下午的时候..我做了一个ob->remove()的动作(应该有毁掉不该毁的东西)
: 部分玩家被迫quit..
: 请有遗失装备的找我补发(目前我只试opb的补发完...)
备份档在 /data/std/user.bak,为 324 早上的装备资料。
我大致说一下做法,你可以实做,但是要尽量先以自己没什么用途的
角色(有备份档,所以角色档坏掉也没关系)来实验。
首先最简单的做法,就是请玩家先到你的 workroom,然后你用 clean
指令清掉他的装备,然后你的 workroom 再写一个函数,加载玩家的
装备,比方..
mapping auto_load;
int reload_ppl_data(string names)
{
mixed tmps=({}),tmps2=({});
string tmp,tmp1,tmp2;
object ppl,ob;
int tt;
auto_load=([]);
if(!ppl=find_player(names))
{
write(names+" 不在线上喔.\n");
return 1;
}
if(file_exists("/data/std/user.bak/"+names[0..0]+"/"+names+".o"))
restore_object("/data/std/user.bak/"+names[0..0]+"/"+names);
return 1;
}
这时 auto_load 的资料就长得类似底下
> call here;reload_ppl_data;"hmml5"
auto_load=([
"/d/ppl/wide/virtue/eq/mikof#226" :([ "names" : "hmml5" ]),
"/d/ppl/ina/moon/eq/soul1#195" : ([ "names" : "hmml5" ]),
"/d/ppl/wide/virtue/eq/an-trail#214" : 0,
.
.
])
也就是说主 key 是 file_name (不是 base_name),其所带的资料一
样是 mapping 资料,其子 key 就是额外设定资料,所以 restore后
接着就这样写
tmps=keys(auto_load);
foreach(tmp in tmps)
{
sscanf(tmp,"%s#%s",tmp1,tt);
if(!file_exists(tmp1+".c")) continue;
ob=clone_object(tmp1);
if(auto_load[tmp1])
{
tmps2=keys(auto_load[tmp1]);
foreach(tmp2 in tmps2)
ob->set(tmp2,auto_load[tmp1][tmp2]);
}
ob->move(this_object());
}
则底下就是执行结果
> l
[/u/l/laechan/workroom ]
@@query_short
灰暗的天空下起了一阵的毛毛细雨,大地是朦朦胧胧的一片.
明显出口有: 无
净罪の神枪─梅基德‧蒂雅(Sacer Lancea ad Abstergere: Megiddo Tear)
撒旦内裤(Satan Underwear)
部落勋章(Medallion of the Horde)
两颗神之水晶球(God Crystal Ball)
∮传送卷轴∮(Transport Scroll)
五行之灵(spirit of five elements)
.
.
再请玩家 get all 即可。处理完一个玩家的装备问题后就 update here,
再抓下一位过来。当然你也不一定要用 call,比方用 add_action 写成指
令亦可,或是设定一些过滤条件、显示资讯等,很弹性。
那比较复杂的做法就是更动 /data/std/user 下的资料,直接以 user.bak
的 auto_load 资料,替换 user 的 auto_load 资料,它的风险就是有可
能写错档案、资料漏写等等。
这个我一般是在工作站下以 vi 的方法做,所以如果受影响的玩家不多,
我大多采取这种做法,要复原装备的玩家需 quit 直到我做完为止,平均
处理一位玩家约 20 秒,处理顺手后 10~15 秒。
Laechan

Links booklink

Contact Us: admin [ a t ] ucptt.com