Re: [建议] 成就系统

楼主: laechan (挥泪斩马云)   2024-10-30 20:00:22
最近偶尔会发生玩家资料档、天空城之家的档案、以及 times_check
资料档的遗失事件,这些共通点都是会去 call save_object 函数,
目前怀疑成就系统在呼叫这个的时候,没有设 CD 时间,导致玩家在
执行某些成就的更新动作时,可能会产生问题。
可能而已,目前还在假设阶段,但 CD 时间是必要的,这部份可参考
一些用时间控制的写法,例如在主物件中假设玩家下某指令去呼叫该
物件的某函数时
int save_room()
{
save_object(base_name(this_object()));
return 1;
}
int 某函数()
{
int t=time();
object ppl=this_player();
if(ppl->query_temp("time_record/呼叫某函数CD时间")>t)
return notify_fail("你要等一下喔。\n");
// 然后才允许执行该函数原本的东西
.
.
// 然后设定比方 CD 时间两秒
ppl->set_temp("time_record/呼叫某函数CD时间",t+2);
// 然后才做 save_object
save_room();
return 1;
}
凡会频繁呼叫到 save_room 的东西都尽可能这样做,因为每
一次写档(读档也是,但 sanc 比较少有频繁读档的情况)都需
要时间。
例如,目前已知有使用更新成就的 ai 指令,该指令及相关指
令请尽可能加上 CD 时间至少 2 秒。
例子:
/u/l/laechan/skycastle/room/skyroom.c
int wit_xxx(string str)
{
int n,t;
object ppl;
if(!str || str=="")
return notify_fail("提领挪布币语法: wit 数目.\n"+
"你的家目前共存有 "+data["nobu_money"]+" 挪布币.\n"+
"请注意,领出后的挪布币无法再存入家中.\n");
ppl=this_player();
t=time();
// 利用玩家 temp data 区的 time_record 字段来储存
if(ppl->query_temp("time_record/wit_nobu_money")>t)
return notify_fail("wit: 你要等一下喔.\n");
// 从家拿出东西=buy
int buy(string str1)
{
// 在 玩家的天空城之家本身储存这个参数(当成他的家的全域参数)
if(query("action_time")>time())
{
write(HIR"你要等一下才能再做这个动作唷!\n"NOR);
return 1;
}
Laechan

Links booklink

Contact Us: admin [ a t ] ucptt.com