Re: [闲聊] 烦啊! 副本

楼主: laechan (挥泪斩马云)   2014-03-20 04:32:16
睡不着。
※ 引述《laechan (小太保)》之铭言:
: 01、用 weather_d.c 定时呼叫 /adm/daemons/instance_rooms.c
目前一个大问题是,如何清掉已经无用的副本区域,例如说某副本
实际上已经结束攻略了玩家也都退出了,然后假设在退出的当下没
有清干净,它就会残留在内存中。
然后目前的 weather_d.c,可针对这一部份的物件做清理的动作,
前提就是“必须先知道它是可被清理的”。
那所谓可被清理与不可被清理,关键就在于 instance_rooms.c 是
否有登录 ppl_instance[ppl_name][files]。
> da here
instance_files :"/u/l/laechan/area/whitetile/room/083"
instance_player :"laechan"
所以它的清理方式如下
foreach(ob in obs)
if(ob->query("instance_player") && ob->query("instance_files"))
if(!ppl_instance[ob->query("instance_player")][ob->query("instance_files")])
ob->remove();
当然上面是简化版的,还要判断一些东西,不过概念大概是这样。
那么理论上,在做 del 时就不需先做清理的动作,因为系统会自
动清。不过 del 的清理比起系统的清理,loading 较小,所以这
部份会保留。最重要的是出口的消除,或人员的移动,后者受限于
权限问题可能较难办到,会倾向采前者。
最后就是,这些 clean 的动作会写成一个函数,再以底下的方式
定时呼叫
catch(clean_instance_rooms());
: 08、副本与 quest 的连结(我一直没有想做的fu)
这个理论上一行就解决:
副本物件->create_instance("开启者id",({他的同伴们}));
在 quest 脚本里面大概是这样写的,以 001 为例
find_object_or_load("/std/new_ob/instance/laechan/001")->
create_instance(ppl->query("name"),({ppl的队友们}));
不过实际上,还得判断队友是不是跟队长在同一格,所以会采取的
做法就是修改 party_d.c,增加读取副本队友的函数。
那么假设有两种情况,队长 a 及队员 b c 一起进入 a 所创造的
副本了
一、a 中途脱团
则只要 a 不去接新副本,b c 可以打到副本结束。
二、b c 中途脱团
则 a 没差还是可以打完副本,b 跟 c 则可以去创造新的副
本。
这里就产生一种必要的判断:
if(ppl_instance[ppl->query("name")])
return notify_fail("你还不可以加入其它人的副本喔!\n");
这是针对二的部份,假设 b 中途脱团去创新的副本,则 b 就不
应该在自己的副本还在的时候,又跑回去 a 的团。
这里也预告会有玩家可使用的副本指令 instance 的出现,例如
说 instance join 就是加入某玩家的副本这类的,那么前提自然
是该玩家有 instance invite 你。
然后会实现的做法就是有 invite 跟没有 invite 的差异,以及
相关的纪录档、人数判断等等,这部份则保证可以比幻想的副本
做法弹性更大。
Laechan

Links booklink

Contact Us: admin [ a t ] ucptt.com