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