Re: [閒聊] 煩啊! 副本

看板mud_sanc (Sanctuary - 聖殿)作者 (小太保)時間12年前 (2014/03/20 04:32), 編輯推噓1(103)
留言4則, 2人參與, 最新討論串5/5 (看更多)
睡不著。 ※ 引述《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 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 編輯: laechan 來自: 1.165.191.44 (03/20 04:57)

03/24 02:09, , 1F
寫一個副本系統真的很難orz
03/24 02:09, 1F

03/24 02:09, , 2F
當初在嘗試著做的時候,發現我實在對c 太不熟稔
03/24 02:09, 2F

03/24 02:09, , 3F
最後就放棄了.. 你加油!
03/24 02:09, 3F

03/24 07:36, , 4F
ok,3q!
03/24 07:36, 4F
文章代碼(AID): #1JAVxJ_4 (mud_sanc)
討論串 (同標題文章)
文章代碼(AID): #1JAVxJ_4 (mud_sanc)