最近想想好像該來開個(gè)工具箱系列,放一些資料包的實(shí)際應(yīng)用。
以前寫那些都偏理論,沒有用根本沒有用。
前提知識
自訂進(jìn)度檔案 (wiki)
自訂函數(shù)檔案 (wiki)
計(jì)分板基礎(chǔ)操作 (wiki)
※ 這是內(nèi)容比較完整的英文wiki連結(jié),有語言選單能自己調(diào)成中文。
簡介
遊戲中偶爾會設(shè)計(jì)收集類的成就。
像是原版的「獲得鑽石」(鑽石!)、「馴服所有種類的貓」(貓科全書)。
或是做迷宮地圖的人會想放類似「收集3種寶石」的成就。
獲得一種物品
原版「獲得鑽石」這樣的基本款。
關(guān)鍵是設(shè)定inventory_changed條件,偵測玩家背包中有沒有指定物品。
實(shí)在不會的話,可以去拆原版的「鑽石!」進(jìn)度檔來參考。
所有指定種類的物品
例如「收集3種寶石」,而且寶石剛好有3種,也就是需要全拿的成就。
一般而言,收集類成就的機(jī)制會是圖鑑制度的「曾經(jīng)分別取得過每種物品」。
但是也有少數(shù)時(shí)候會想要「所有物品同時(shí)放在背包裡」。
兩個(gè)機(jī)制各自有適合的場合,設(shè)計(jì)的時(shí)候可以思考看看哪一個(gè)比較合理。
◆ 「所有物品同時(shí)在背包裡」
和單一物品的設(shè)定很像,只要微調(diào)conditions中的items清單,列舉每一個(gè)物品就完成了。
注意事項(xiàng) |
是 "conditions": { "items": [ 這個(gè)清單 ] } 而不是 "conditions": { "items": [ { "items": [ 這個(gè)清單 ] } ] } |
◆ 「曾經(jīng)分別取得過」
需要為每一個(gè)物品分別設(shè)定一個(gè)條件。
條件的概念類似「隱藏的小成就」,當(dāng)所有小成就解鎖之後,玩家就會解鎖進(jìn)度。
條件的設(shè)定寫在criteria,幫每一個(gè)物品各自設(shè)定一個(gè)inventory_changed條件。
這些條件的ID可以隨便取,但為了幾個(gè)月後修改檔案的自己著想,建議用有意義的詞,像是每個(gè)成就道具的名字。
進(jìn)度檔的requirements會決定條件之間的關(guān)係,可以完全不設(shè)定,讓遊戲用預(yù)設(shè)的「每一個(gè)條件都要完成」。
注意事項(xiàng) |
「完全不設(shè)定」的意思是requirements不存在, 而不是像這樣的空清單: "requirements": [] |
補(bǔ)充資料 |
「完成所有條件」也可以明確指定,例如: "requirements": [ ["diamond"], ["emerald"], ["ruby"] ] |
部分指定種類的物品
例如「收集3種寶石」,但寶石有5種,也就是只要拿一部分就能解的成就。
有兩種不同的方法可以做到,一般來說會用計(jì)分板輔助,不過也存在用單一進(jìn)度檔寫的方法。
◆ 計(jì)分板輔助的進(jìn)度
上面說過進(jìn)度條件的概念類似「隱藏的小成就」。
這裡要把這些「隱藏的小成就」實(shí)際寫出來,從條件變成一整批獨(dú)立的進(jìn)度檔。
原本的進(jìn)度剩下單純的顯示作用,只需要設(shè)定一個(gè)impossible條件留給指令觸發(fā)。
每一個(gè)隱藏進(jìn)度負(fù)責(zé)偵測一種物品,所以會回歸到「鑽石!」那種基礎(chǔ)的設(shè)定。
隱藏進(jìn)度不需要對玩家展示,所以不設(shè)定display資料。
接著,把每一個(gè)隱藏進(jìn)度的rewards設(shè)定成同一個(gè)指令函數(shù)。
進(jìn)度獎勵函數(shù)負(fù)責(zé)把玩家的收集分?jǐn)?shù)加1,並且在收集分?jǐn)?shù)達(dá)標(biāo)後,用advancement指令觸發(fā)顯示用的主要進(jìn)度。
在進(jìn)度獎勵函數(shù)中,可以用@s指定獲得進(jìn)度的玩家,所以加分和給予主進(jìn)度都很容易達(dá)成。
補(bǔ)充資料 |
參考答案: scoreboard players add @s gem_collection 1 execute if score @s gem_collection matches 3.. \ run advancement grant @s only custom:collect_3_gems 後兩行是分行語法,避免一條指令看起來太寬,對執(zhí)行沒有影響。 從1.20.2開始有這個(gè)語法,可以善加利用。 |
◆ 用單一進(jìn)度檔硬凹
進(jìn)度的requrements是兩層清單,外層執(zhí)行And邏輯,內(nèi)層執(zhí)行Or邏輯。
例如[[A], [B, C]]代表「一定要達(dá)成A,且B和C要達(dá)成至少一個(gè)」。
5選3要寫在這個(gè)結(jié)構(gòu)內(nèi),比較方便的思考方式是先列舉不符進(jìn)度條件的狀況,也就是「至少有3個(gè)還沒拿到」。
列舉的結(jié)果會是「外層Or、內(nèi)層And」的結(jié)構(gòu),像是:
「沒有A、B和C」或「沒有A、B和D」或…
這就是答案了,直接把這個(gè)組合原狀填進(jìn)requirements裡面。
補(bǔ)充資料 |
5選3會讓人混淆(剛好排除掉的數(shù)量也是3), 所以下面是5選4的條件設(shè)定範(fàn)例。 "requirements": [ ["onyx", "pearl"], ["onyx", "topaz"], ["onyx", "sapphire"], ["onyx", "ruby"], ["pearl", "topaz"], ["pearl", "sapphire"], ["pearl", "ruby"], ["topaz", "sapphire"], ["topaz", "ruby"], ["sapphire", "ruby"] ] 不太好看,也不算很好維護(hù)。 沒有什麼特殊堅(jiān)持的話,拜託改用計(jì)分板。 |
原理是把不符條件反轉(zhuǎn)成符合條件,然後用笛摩根定理調(diào)整條件邏輯。
無法理解原理也沒關(guān)係,總之這麼做有用。
修理一下計(jì)分板輔助進(jìn)度
讓And邏輯在requirements外層是有理由的。
遊戲內(nèi)會顯示進(jìn)度的完成度,例如「貓科全書 (0/11)」,偵測的就是這堆And條件的完成度。
但是上面「收集部分物品」的兩種做法都沒有正確顯示完成度。
排除掉沒救的單檔案版本,有計(jì)分板輔助的版本應(yīng)該要補(bǔ)上完成度才對。
做法是把唯一一個(gè)impossible條件改成「用數(shù)字編號的很多個(gè)impossible條件」,像是c_1、c_2等。
然後在加分之後,用function macro給予對應(yīng)的條件。
補(bǔ)充資料 |
實(shí)際寫起來會像是這樣: execute store result storage custom:gem_count progress int 1 \ run scoreboard players add @s gem_collection 1 function custom:gem_advancement with storage custom:gem_count 被呼叫的檔案: $advancement grant @s only custom:collect_3_gems c_$(progress) 會有分?jǐn)?shù)破表導(dǎo)致找不到條件的情況,不過沒關(guān)係,那行指令執(zhí)行失敗不會怎樣。 |