大家好,我是貓狗喵
首先恭喜各位學測考生擺脫學測噩夢了!亞加等你神與魔法師的遊戲w今天要介紹的是Loot Table (大家會不會看到貓狗的教學文就有文字恐懼症?)
關於Loot Table這塊在板上的應用可以說是幾乎為零
但這在RPG或CTM等打怪地圖是非常強大的一個工具
此外甚至可以應用在一些機關設計上
首先先要了解什麼是Loot Table
Loot Table是決定實體掉落物品或釣魚、寶箱等內容物的json格式檔案
從1.9版本開始可以使用
Loot Table可以在遊戲的壓縮檔中找到
將該版本的jar檔解壓縮,assets/minecraft 中就可以找到loot_tables資料夾
裡面就存放著各個loot table的檔案
關於Loot Table的資料在這裡其實已經很詳盡了
如果需要完整的範例可以在這裡找到,不過是英文的
所以這邊我就只簡單介紹一下比較重要的特色跟一點應用
-------------------------------------------------------------------------------------------------------------------------------
*Loot Table可以做到什麼?
修改實體原本的掉落物,完全換成不同的東西(例如殭屍可以不再掉腐肉改掉鑽石)
自定義無限多種掉落物列表,讓每種自定義生物有獨特的掉落物
完全套用所有道具的nbt標籤
高度自由設定的隨機性
*跟裝備掉落的差別?
※ Loot Table可以完全取代裝備掉落,只是設定比較麻煩 ※
裝備掉落最多只能設定6個(頭、身、腿、腳、左右手),而且會與裝飾用的裝備衝突欄位
然而Loot Table完全獨立設定,可以設定無限多種可能的掉落物、各自的機率
也可以透過比重的方式隨機掉落一種或多種道具(掉落A就不會掉落B)
使用裝備掉落時怪物本身的掉落物仍然存在,必須透過雜物商之類的手法處理掉
更大的困擾是某些自訂義怪物掉落原本的掉落物感覺很奇怪(戴著人頭的殭屍掉腐肉)
而Loot Table是完全取代該實體的掉落物,全部變成自己設定的掉落物列表
此外裝備掉落一定需要是玩家擊殺才會掉落,使用指令(kill, effect)或被其他生物打死,甚至是自己摔死都不會掉落道具
然而Loot Table不受影響(殭屍怎麼死都會掉腐肉),不過也可以設定一定要玩家擊殺才會掉落
Loot Table甚至可以設定有某些記分板分數的實體擊殺才會掉落、燃燒狀態死亡才會掉落、死亡的實體有某些記分板分數才會掉落、不是玩家擊殺才會掉落等等
裝備掉落不受掠奪、幸運等能力影響,但Loot Table可以設定,甚至可以設定影響的程度
裝備掉落的nbt資料是寫死的,所有素質都無法更動
而Loot Table可以達到隨機能力值、附魔(等級)的效果,讓每個玩家打到的道具素質都有差別
*如何使用Loot Table?
在loot_tables資料夾中可以看到三個資料夾與一個empty的json檔案
只要在實體的nbt標籤加上 DeathLootTable:"empty"
或是在寶箱的nbt標籤加上 LootTable:"empty"
就可以使該實體(寶箱)不會有任何掉落物
三個資料夾中存放的是不同類型的Loot Table,分別是寶箱、實體、釣魚三種
假如要套用苦力怕的掉落物,只要將上方的"empty"改成"entities/creeper"就行了
其他的掉落物可以從loot_tables資料夾找對應的檔案路徑,以此類推
若是要使用自訂義的掉落物,打開你的地圖的資料夾
找到data資料夾,將loot_tables資料夾丟進去
在loot_tables資料夾內建立一個資料夾叫做minecraft
之後把loot_tables資料夾內的東西丟進去就完成了
只要放有更改與新增的json檔案即可,沒放的會讀取預設的檔案
資料夾也可以自行新增,只要設定nbt時路徑正確即可
*Loot Table的應用
※關於自定義生物掉落物與寶箱是最基本的應用,所以這邊就只介紹機關設計相關的部分※
生物死亡判定
首先這篇文章主要是因嵐風在生物死亡判斷的文章中提到版上多數人不會使用Loot Table才寫的
因此第一個介紹的應用即是生物死亡判定,這個應用在類模組2.0中也有使用
某些時候必須判斷某生物(通常為BOSS)死亡,並接著觸發劇情之類的機關
若是用Loot Table設定好100%掉落的特殊道具,只要偵測到該道具就觸發機關並刪除道具
就可以達到生物死亡時觸發機關的效果,也可以同時判斷生物死亡位置
可回收怪物蛋
另一個應用是可回收的怪物蛋,這也是類模組2.0中使用的功能
1.9後怪物蛋可以自定義很多nbt標籤,包含DeathLootTable
若是使用裝備掉落的方式來回收怪物蛋,必須在怪物蛋的nbt中一層包著一層的設定
而且有回收的次數上限(你包幾層資料就能回收幾次)
但是使用Loot Table讀取外部json檔案就能無限回收怪物蛋
只要設定一個Loot Table,假設存放在custom資料夾並命名為RecycleEgg
接著設定該Loot Table掉落怪物蛋
且該怪物蛋生成的生物nbt設定 DeathLootTable:"custom/RecycleEgg"
就達到無限次數回收的效果了
若是想要限定回收次數也可以設定多個Loot Table檔案
假設限定回收三次就設定三個Loot Table,每個掉落的蛋對應不同的DeathLootTable
並且在最後一個怪物蛋的DeathLootTable設定為"empty"即可
-------------------------------------------------------------------------------------------------------------------------------
由於範例網站的範例好像不太好理解,這裡整理一下完整的寫法
很多內容是可以自由增加或刪減的,並非全部都需寫出來
若要複製請記得刪除綠色註解文字
- {
- "pools": [ //類似骨幹的東西,所有內容都寫在這個裡面
- { //暫時命名為括號A
- "rolls": 1, //決定括號A內的東西會被選擇多少次(與下面的rolls擇一使用)
- "rolls": { //決定括號A內的東西會被選擇多少次,由最大最小值隨機決定次數
- "min": 1,
- "max": 1
- },
- "entries": [ //列出括號A內所有可能掉落的物品
- {
- "type": "[item|loot_table]", //決定類型為道具的id或loot_table的路徑
- "name": "[ID|LootTable]", //道具的id或loot_table的路徑
- "weight": 1, //選到的機率,所有此entries內的道具的weight相加為分母
- "quality": 1.0, //決定有掠奪附魔對weight的改變程度,詳見上方WIKI連結
- "functions": [ //存放各種nbt與數量等資料的地方
- {
- "function": "enchant_randomly", //功能的名稱,此為隨機附魔
- "enchantments": [ //從下面清單中隨機選擇一個附魔,若省略此標籤則會隨機選擇一個可自然附上的附魔
- "minecraft:looting",
- "minecraft:depth_strider",
- "minecraft:sharpness"
- ]
- },
- {
- "function": "enchant_with_levels", //功能的名稱,此為指定等級(一般附魔時玩家等級)的隨機附魔
- "treasure": true, //有沒有可能附上無法用附魔台獲得的附魔,預設為false
- "levels": 30, //決定附魔時玩家的等級,與下方的levels擇一使用
- "levels": { //決定附魔時玩家的等級,由最大最小值隨機決定等級
- "min": 25,
- "max": 30
- }
- },
- {
- "function": "set_nbt" //功能的名稱,此為設定nbt標籤
- "tag": "{display:{Name:\"Test\"}}" //道具的nbt標籤,記得使用json格式(在"與\前面加上\)
- },
- {
- "function": "set_data" //功能的名稱,此為設定非工具類(沒有耐久度)道具damage值
- "data": 1, //決定道具的damage值,與下方的data擇一使用
- "data": { //決定道具的damage值,由最大最小值隨機決定damage值
- "min": 1,
- "max": 1
- }
- },
- {
- "function": "set_damage" //功能的名稱,此為設定工具類(有耐久度)道具耐久度剩餘比例(1為無損耗)
- "damage": 1, //決定道具的damage值,與下方的damage擇一使用
- "damage": { //決定道具的damage值,由最大最小值隨機決定damage值
- "min": 1,
- "max": 1
- }
- },
- {
- "function": "set_count" //功能的名稱,此為設定道具數量
- "count": 1, //決定道具的數量,與下方的count擇一使用
- "count": { //決定道具的數量,由最大最小值隨機決定數量
- "min": 1,
- "max": 1
- }
- },
- {
- "function": "looting_enchant", //功能的名稱,此為使用掠奪武器擊殺時可以額外獲得的道具數量
- "count": 1, //決定每級掠奪附魔可以多額外獲得多少道具
- "limit": 5 //決定能獲得道具總數量的上限
- },
- {
- "function": "furnace_smelt", //功能的名稱,此功能會嘗試將道具更改為熔爐燒過的道具
- "conditions": [ //該function執行的條件,下面會有完整的介紹,這邊做的判定是在燃燒狀態死亡
- {
- "condition": "entity_properties",
- "entity": "this",
- "properties": {
- "on_fire": true
- }
- }
- ]
- },
- {
- "function": "set_attributes", //功能的名稱,此為設定attribute資料
- "modifiers": [ //把所有attribute寫在這裡面就對了
- {
- "attribute": "generic.maxHealth", //attribute的名稱
- "name": "More Health", //取的名字(不是很重要)
- "amount": { //由最大最小值隨機決定能力值的數值
- "min": 2,
- "max": 4
- },
- "operation": "addition", //操作類型,"addition"/"multiply base"/"multiply total" 分別對應類型0/1/2
- "slot": [ //attribute會生效的裝備欄位
- "mainhand",
- "offhand"
- ],
- "id": "00000000-0000-0001-0000-000000000001" //UUID,若沒有特殊需要盡量省略
- }
- ]
- }
- ],
- "conditions": [ //該entry被選擇的條件,下面會有完整的介紹
- ]
- }
- ],
- "conditions": [ //整個Loot Table執行的條件
- {
- "condition": "random_chance", //條件名稱,此為隨機決定執行的機率
- "chance": 1.0 //決定機率,最大值為1
- },
- {
- "condition": "random_chance_with_looting", //條件名稱,此為隨機執行的機率,會受掠奪附魔影響
- "chance": 0.5, //決定機率,最大值為1
- "looting_multiplier": 0.1 //決定每級掠奪附魔可以增加多少機率
- },
- {
- "condition": "killed_by_player", //條件名稱,此為決定是否為玩家擊殺,若未使用則無論是否玩家擊殺均會執行
- "inverse": true //反轉,設為true則非玩家擊殺才會執行
- },
- {
- "condition": "entity_properties", //條件名稱,此為判斷擊殺事件相關者的狀態
- "entity": "this", //判斷的對象,this為被擊殺的實體,killer為擊殺該實體的實體,killer_player為擊殺該實體的玩家
- "properties": { //判斷的狀態,目前似乎只有著火可以判斷
- "minecraft:on_fire": true //判斷對象是否需要著火才會執行
- }
- },
- {
- "condition": "entity_scores", //條件名稱,此為判斷擊殺事件相關者的記分板分數
- "entity": "this",
- "scores": { //將判斷的記分版與分數寫在裡面
- "test": 1, //若判斷對象的test記分板分數為該值則會執行,與下方的記分板擇一使用
- "test": { //若判斷對象的test記分板分數在最大與最小值的區間內則會執行
- "min": 1,
- "max": 1
- }
- }
- }
- ]
- }
- ]
- }
這邊再附上一個簡單的範例
假如我想設定一個Loot Table,有10%機率掉落腐肉、20%機率掉落火藥,不受掠奪影響
那內容會長成這樣
- {
- "pools": [
- {
- "rolls": 1,
- "entries": [
- {
- "type": "item",
- "name": "minecraft:rotten_flesh",
- "weight": 1,
- "quality": 0,
- "functions": [
- {
- "function": "set_count",
- "count": 1
- }
- ]
- }
- ],
- "conditions": [
- {
- "condition": "random_chance",
- "chance": 0.1
- }
- ]
- },
- {
- "rolls": 1,
- "entries": [
- {
- "type": "item",
- "name": "minecraft:gunpowder",
- "weight": 1,
- "quality": 0,
- "functions": [
- {
- "function": "set_count",
- "count": 1
- }
- ]
- }
- ],
- "conditions": [
- {
- "condition": "random_chance",
- "chance": 0.2
- }
- ]
- }
- ]
- }
大概研究一下應該就可以理解架構的方式了(我已經想不出其他解說的方法了@w@)
-------------------------------------------------------------------------------------------------------------------------------
題外話
最近在板上發現大家使用指令機關製作地圖的成分開始提高,這是一件好事
不過個人對於防作弊的改gamemode設計一直抱著反對的態度
主要是因為真的想作弊的絕對不是改gamemode可以防止的(不管你怎麼做我都能改回創造)
對於那些會去改gamemode作弊的玩家,他們是破壞自己的遊戲體驗(總有人會開外掛)
那不是作者需要去處理的狀況
我個人認為不要改gamemode是比較好的
對伺服主來說這樣比較容易管理
對玩家來說遇到BUG不用砍掉地圖重玩
對想學習機關或針對機關給予優化建議的玩家來說也比較方便
以上是一些個人的看法,沒有絕對的對錯
最後祝大家新年快樂~