LV. 17
GP 219

【心得】Loot Table 簡介與應用

樓主 貓狗喵 kevin22152
GP28 BP-

作者標示-非商業性

本授權條款允許使用者重製、散布、傳輸以及修改著作,但不得為商業目的之使用。使用時必須按照著作人指定的方式表彰其姓名。

大家好,我是貓狗喵
首先恭喜各位學測考生擺脫學測噩夢了!亞加等你神與魔法師的遊戲w

今天要介紹的是Loot Table (大家會不會看到貓狗的教學文就有文字恐懼症?)
關於Loot Table這塊在板上的應用可以說是幾乎為零
但這在RPGCTM打怪地圖是非常強大的一個工具
此外甚至可以應用在一些機關設計上

首先先要了解什麼是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資料夾中可以看到三個資料夾與一個emptyjson檔案
只要在實體的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"即可

-------------------------------------------------------------------------------------------------------------------------------

由於範例網站的範例好像不太好理解,這裡整理一下完整的寫法
很多內容是可以自由增加或刪減的,並非全部都需寫出來
若要複製請記得刪除綠色註解文字

  1. {  
  2.     "pools": [ //類似骨幹的東西,所有內容都寫在這個裡面  
  3.         { //暫時命名為括號A  
  4.             "rolls": 1, //決定括號A內的東西會被選擇多少次(與下面的rolls擇一使用)  
  5.             "rolls": { //決定括號A內的東西會被選擇多少次,由最大最小值隨機決定次數  
  6.                 "min": 1,  
  7.                 "max": 1  
  8.             },  
  9.             "entries": [ //列出括號A內所有可能掉落的物品  
  10.                 {  
  11.                     "type": "[item|loot_table]", //決定類型為道具的id或loot_table的路徑  
  12.                     "name": "[ID|LootTable]", //道具的id或loot_table的路徑  
  13.                     "weight": 1, //選到的機率,所有此entries內的道具的weight相加為分母  
  14.                     "quality": 1.0, //決定有掠奪附魔對weight的改變程度,詳見上方WIKI連結  
  15.                     "functions": [ //存放各種nbt與數量等資料的地方  
  16.                         {  
  17.                             "function": "enchant_randomly", //功能的名稱,此為隨機附魔  
  18.                             "enchantments": [ //從下面清單中隨機選擇一個附魔,若省略此標籤則會隨機選擇一個可自然附上的附魔  
  19.                                 "minecraft:looting",  
  20.                                 "minecraft:depth_strider",  
  21.                                 "minecraft:sharpness"  
  22.                             ]  
  23.                         },  
  24.                         {  
  25.                             "function": "enchant_with_levels", //功能的名稱,此為指定等級(一般附魔時玩家等級)的隨機附魔  
  26.                             "treasure": true, //有沒有可能附上無法用附魔台獲得的附魔,預設為false  
  27.                             "levels": 30, //決定附魔時玩家的等級,與下方的levels擇一使用  
  28.                             "levels": { //決定附魔時玩家的等級,由最大最小值隨機決定等級  
  29.                                 "min": 25,  
  30.                                 "max": 30  
  31.                             }  
  32.                         },  
  33.                         {  
  34.                             "function": "set_nbt" //功能的名稱,此為設定nbt標籤  
  35.                             "tag": "{display:{Name:\"Test\"}}" //道具的nbt標籤,記得使用json格式(在"與\前面加上\)  
  36.                         },  
  37.                         {  
  38.                             "function": "set_data" //功能的名稱,此為設定非工具類(沒有耐久度)道具damage值  
  39.                             "data": 1, //決定道具的damage值,與下方的data擇一使用  
  40.                             "data": { //決定道具的damage值,由最大最小值隨機決定damage值  
  41.                                 "min": 1,  
  42.                                 "max": 1  
  43.                             }  
  44.                         },  
  45.                         {  
  46.                             "function": "set_damage" //功能的名稱,此為設定工具類(有耐久度)道具耐久度剩餘比例(1為無損耗)  
  47.                             "damage": 1, //決定道具的damage值,與下方的damage擇一使用  
  48.                             "damage": { //決定道具的damage值,由最大最小值隨機決定damage值  
  49.                                 "min": 1,  
  50.                                 "max": 1  
  51.                             }  
  52.                         },  
  53.                         {  
  54.                             "function": "set_count" //功能的名稱,此為設定道具數量  
  55.                             "count": 1, //決定道具的數量,與下方的count擇一使用  
  56.                             "count": { //決定道具的數量,由最大最小值隨機決定數量  
  57.                                 "min": 1,  
  58.                                 "max": 1  
  59.                             }  
  60.                         },  
  61.                         {  
  62.                             "function": "looting_enchant", //功能的名稱,此為使用掠奪武器擊殺時可以額外獲得的道具數量  
  63.                             "count": 1, //決定每級掠奪附魔可以多額外獲得多少道具  
  64.                             "limit": 5 //決定能獲得道具總數量的上限  
  65.                         },  
  66.                         {  
  67.                             "function": "furnace_smelt", //功能的名稱,此功能會嘗試將道具更改為熔爐燒過的道具  
  68.                             "conditions": [ //該function執行的條件,下面會有完整的介紹,這邊做的判定是在燃燒狀態死亡  
  69.                                 {  
  70.                                     "condition": "entity_properties",  
  71.                                     "entity": "this",  
  72.                                     "properties": {  
  73.                                         "on_fire": true  
  74.                                     }  
  75.                                 }  
  76.                             ]  
  77.                         },  
  78.                         {  
  79.                             "function": "set_attributes", //功能的名稱,此為設定attribute資料  
  80.                             "modifiers": [ //把所有attribute寫在這裡面就對了  
  81.                                 {  
  82.                                     "attribute": "generic.maxHealth", //attribute的名稱  
  83.                                     "name": "More Health", //取的名字(不是很重要)  
  84.                                     "amount": { //由最大最小值隨機決定能力值的數值  
  85.                                         "min": 2,  
  86.                                         "max": 4  
  87.                                     },  
  88.                                 "operation": "addition", //操作類型,"addition"/"multiply base"/"multiply total" 分別對應類型0/1/2  
  89.                                     "slot": [ //attribute會生效的裝備欄位  
  90.                                         "mainhand",  
  91.                                         "offhand"  
  92.                                     ],  
  93.                                     "id": "00000000-0000-0001-0000-000000000001" //UUID,若沒有特殊需要盡量省略  
  94.                                 }  
  95.                             ]  
  96.                         }  
  97.                     ],  
  98.                     "conditions": [ //該entry被選擇的條件,下面會有完整的介紹  
  99.                     ]  
  100.                 }  
  101.             ],  
  102.             "conditions": [ //整個Loot Table執行的條件  
  103.                 {  
  104.                     "condition": "random_chance", //條件名稱,此為隨機決定執行的機率  
  105.                     "chance": 1.0 //決定機率,最大值為1  
  106.                 },  
  107.                 {  
  108.                     "condition": "random_chance_with_looting", //條件名稱,此為隨機執行的機率,會受掠奪附魔影響  
  109.                     "chance": 0.5, //決定機率,最大值為1  
  110.                     "looting_multiplier": 0.1 //決定每級掠奪附魔可以增加多少機率  
  111.                 },  
  112.                 {  
  113.                     "condition": "killed_by_player", //條件名稱,此為決定是否為玩家擊殺,若未使用則無論是否玩家擊殺均會執行  
  114.                     "inverse": true //反轉,設為true則非玩家擊殺才會執行  
  115.                 },  
  116.                 {  
  117.                     "condition": "entity_properties", //條件名稱,此為判斷擊殺事件相關者的狀態  
  118.                     "entity": "this", //判斷的對象,this為被擊殺的實體,killer為擊殺該實體的實體,killer_player為擊殺該實體的玩家  
  119.                     "properties": { //判斷的狀態,目前似乎只有著火可以判斷  
  120.                         "minecraft:on_fire": true //判斷對象是否需要著火才會執行  
  121.                     }  
  122.                 },  
  123.                 {  
  124.                     "condition": "entity_scores", //條件名稱,此為判斷擊殺事件相關者的記分板分數  
  125.                     "entity": "this",  
  126.                     "scores": { //將判斷的記分版與分數寫在裡面  
  127.                         "test": 1, //若判斷對象的test記分板分數為該值則會執行,與下方的記分板擇一使用  
  128.                         "test": { //若判斷對象的test記分板分數在最大與最小值的區間內則會執行  
  129.                             "min": 1,  
  130.                             "max": 1  
  131.                         }  
  132.                     }  
  133.                 }  
  134.             ]  
  135.         }  
  136.     ]  
  137. }  
弄了一個下午,比想像中還累w

這邊再附上一個簡單的範例
假如我想設定一個Loot Table,有10%機率掉落腐肉、20%機率掉落火藥,不受掠奪影響
那內容會長成這樣
  1. {
  2.     "pools": [
  3.         {
  4.             "rolls": 1,
  5.             "entries": [
  6.                 {
  7.                     "type": "item",
  8.                     "name": "minecraft:rotten_flesh",
  9.                     "weight": 1,
  10.                     "quality": 0,
  11.                     "functions": [
  12.                         {  
  13.                             "function": "set_count",
  14.                             "count": 1
  15.                         }
  16.                     ]
  17.                 }
  18.             ],
  19.             "conditions": [
  20.                 {
  21.                     "condition": "random_chance",
  22.                     "chance": 0.1
  23.                 }
  24.             ]
  25.         },
  26.         {
  27.             "rolls": 1,
  28.             "entries": [
  29.                 {
  30.                     "type": "item",
  31.                     "name": "minecraft:gunpowder",
  32.                     "weight": 1,
  33.                     "quality": 0,
  34.                     "functions": [
  35.                         {  
  36.                             "function": "set_count",
  37.                             "count": 1
  38.                         }
  39.                     ]
  40.                 }
  41.             ],
  42.             "conditions": [
  43.                 {
  44.                     "condition": "random_chance",
  45.                     "chance": 0.2
  46.                 }
  47.             ]
  48.         }
  49.     ]
  50. }
大概研究一下應該就可以理解架構的方式了(我已經想不出其他解說的方法了@w@)

-------------------------------------------------------------------------------------------------------------------------------

題外話
最近在板上發現大家使用指令機關製作地圖的成分開始提高,這是一件好事
不過個人對於防作弊的改gamemode設計一直抱著反對的態度
主要是因為真的想作弊的絕對不是改gamemode可以防止的(不管你怎麼做我都能改回創造)
對於那些會去改gamemode作弊的玩家,他們是破壞自己的遊戲體驗(總有人會開外掛)
那不是作者需要去處理的狀況

我個人認為不要改gamemode是比較好的
對伺服主來說這樣比較容易管理
對玩家來說遇到BUG不用砍掉地圖重玩
對想學習機關或針對機關給予優化建議的玩家來說也比較方便

以上是一些個人的看法,沒有絕對的對錯


話說小坤要不要做Loot Table的插件


最後祝大家新年快樂~
28
-
未登入的勇者,要加入討論嗎?
板務人員:

1320 筆精華,10/21 更新
一個月內新增 12
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】