LV. 23
GP 532

【心得】【先行版】Minecraft 1.14 外掛般的功能與它們的運用

樓主 貓狗喵 kevin22152
GP69 BP-

作者標示-非商業性

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

大家好,我是貓狗喵
我也懶得寫什麼介紹了,總之建議先摸懂 1.13 的 execute store 跟 data 再來看這篇文章

照慣例文字密集恐懼症者盡速撤離

目錄


  1. 重要外掛列表與簡介
  2. 新 nbt 路徑存取模式影響
  3. JSON nbt Component 應用
  4. data modify 應用
    • 動態生物仇恨設定
    • 套用玩家頭顱
    • 玩家專屬上鎖箱子
    • 附魔萃取 / Lore 編輯器
    • 死亡掉落物收集
    • 玩家物品拍賣
  5. 虛擬 nbt list 實現 index 索引
  6. 後記


重要外掛列表與簡介


  1. 弩弓 - 新增的遠距離武器,共有三種附魔:穿透、散射、快速裝填
    • 穿透的附魔等級+1即為可以穿透的怪物數量
    • 散射若強制與穿透一同附魔,三隻箭都能穿透一樣數量的敵人
    • 快速裝填每級減少裝填時間 0.25 秒,當 5 級時可以瞬間裝填,超過則無法裝填
  2. CustomModelData - 新的道具 nbt 標籤,類型為 int
    • 看起來是可以讓模型檔案依照該道具擁有的該標籤去決定顯示的樣子
    • 簡單來說就是不用再依靠 damage 去控制了 (還能不能用 damage 我沒研究)
    • 對 RPG 地圖來說是福音,完全不缺道具材質了
    • #類模組也不用犧牲木劍來做自訂道具材質了
    • #可以做好多種有耐久的弓跟鑽石蘋果了
  3. 生物也能加上 datapack 的 tag 了
    • 終於能自動把不死系跟一般生物分類了
  4. JSON 新增 nbt 這個 component
    • 格式如下 (path 就是 nbt 路徑,後面接 nbt 標籤的目標)
    • {"nbt": <path>, "block":"<x> <y> <z>", "interpret": <true/false>}
      • 範例格式:{"nbt":"Items[0]","block":"123 45 321"}
    • {"nbt": <path>, "entity": <selector>, "interpret": <true/false>}
      • 範例格式:{"nbt":"SelectedItem","entity":"@s"}
    • 最後的 interpret 看起來是:如果取得的 nbt 標籤也是 JSON 格式,要進行解析再顯示還是單純把該 JSON 格式字串顯示出來
  5. 方塊掉落物也寫進 loot table 了
    • loot table 這東西本身就是外掛,沒看過的可以參考這邊 (loot table 也有不少新增內容,不過看起來沒什麼特別強大的就不特別提了)
    • 方塊掉落對於使用的工具資料好像可以設定的滿詳細的,應該能有很多活用,但我目前沒想到
    • 搭配資源包製作自定義礦物更容易了
    • 生存地圖有了讓玩家取得某些自定義資源的新方式
    • 不過非方塊實體還是不能個別定義要套用哪個 loot table
  6. 新指令:drop
    • 看起來就是活用 loot table 的指令
    • 各種狀況條件跟取得模式都能設定,但是感覺活用性比較低
    • 主要應該算是方便操作用的指令而已
    • #簡單來說我懶得介紹啦,他格式寫得好複雜我也沒認真讀清楚
  7. execute if/unless 新增 data 這個選項
    • 後面接的內容跟 data 指令的 get 一樣
    • 如果 data 回傳的值不是 0 就視為 true
    • data get 如果取得的項目是 list 或 compound (不清楚是什麼可以看這裡),會回傳它的子項目的數量
  8. 新指令 Schedule
    • /schedule function <function path> <time(t/s/d)>
    • 在指定時間後一次性執行目標 function
    • 時間後面的單位可以指定為 tick/second/day
    • 一個 function 同時只能 schedule 延遲
    • 雖然只執行一次,但是只要在該 function 中 schedule 自己就可以無限循環了
    • 如果要當循環的話,建議把所有相同延遲的 function 集中在一個 function 內,然後像是 /schedule function loops:1sec 1s 這樣,比較直觀
    • #節省資源神器
  9. 新的 nbt 路徑存取模式
    • 存取 list 類型時的 iterator 現在可以輸入負值 (往後面數)
    • 如果不輸入任何東西,會回傳所有子項目
    • iterator 還可以輸入子項目的部分內容,系統會回傳所有符合該內容的子項目。因為是所有子項目,所以 execute store data modify 可以一次針對很多內容進行修改,但是如果是 data get 的話有複數內容就會報錯,無法讀取。
    • 當上述這種方式用於儲存內容進去的時候,如果該目標子項目不存在,會嘗試創建一個新目標並將內容儲存進去,但若新目標缺少該物件存在的基本要素,會被系統自動清除。(假設 Items[{Slot:0b}] 不存在,即使用 merge 寫入 {tag:{test:1}},因為缺少欄位存在基本要件:idCount,所以該資料會被系統自動清除)
  10. data 指令的新功能 - modify
    • 放在最後就是因為它是壓軸啦
    • 外掛中的大魔王
    • 好啦來講它的格式
    • /data modify <block/entity> <path> <operation> <source>
    • operation set, merge, append, prepend, insert before/after <index> 五種
      • set 就是直接把目標替換成我們指定的值
      • merge 只能針對 compound 物件修改,就跟 data merge 的功能一樣
      • append/prepend/insert 只能針對 list 物件修改,分別是把我們指定的值加在 list最後面/最前面/指定的位置,這邊 insert index 只能是數字
      • 因為這三個 list 類的 modify 功能,虛擬 nbt list 物件已經跟真的程式語言的 list 很接近,只差不能用變數作為 index 而已,用來儲存某些資料比起記分板相信是方便許多
    • source 有分兩種類型:value, from
      • value 就是我們直接輸入一個固定值給他,很直覺也很方便
      • from 就是這個外掛之所以能稱為大魔王的原因
      • from 後面可以接的是 <block/entity> <path>,也就是它可以把其他 nbt 資料直接搬過來,不管你怎麼想,反正我是跪了
  • 彩蛋(18w43c):Effect 的 nbt 資料中出現的新標籤 ShowIcon
    • 這東西目前都會跟 ShowParticles 同進退,應該就是右上角要不要顯示圖示
    • 既然這東西冒出來了,合理懷疑之後的 effect 指令會把 icon 顯示的選項獨立出來
    • 結果 1.14 正式版還是沒個影子


新 nbt 路徑存取模式影響


如果還有人記得我之前 PO 的尋找道具欄位 index 的文章,我在這邊鄭重地跟大家說

「binary search 已死,有事燒紙」

現在只要用 Inventory[{Slot:目標欄位}] 就可以抓出目標欄位來存取了,雖然之前那篇文章的方法可以用變數指定我要取得哪個欄位,但是那個效率跟這個完全不同等級啊!而且現在這個方式只要寫個 40 個 if 的 function 就也能透過變數來存取特定欄位了

#狗才慢慢找,汪!


JSON nbt Component 應用


廣播系統

簡單來說就是讓玩家自己輸入特定內容,然後用 titletellraw 顯示出來的功能

其實很久以前就有想過怎麼設計廣播系統最好,但是以前要抓玩家輸入的內容,唯一的方式就是命名,而不論命名生怪蛋還是命名牌,都必須消耗一個等級。然後 minecraft 又一直沒有判斷使用鐵砧的方式,所以都克服不了這個問題

然而現在 JSON 格式新增了 nbt 這個 component,也就是說不用再侷限於將生物改名的這種文字輸入。那除了命名之外,玩家能輸入進遊戲的內容是什麼呢?

最簡單,也最方便的東西就是:

只要給玩家一本書和羽毛筆,讓玩家自己把內容寫在書的第一頁,還能把書名當成標題
而且書本還能有另一個重要的用途,那就是可以抓到玩家的名字這個字串 (後面會用到)

簡單把對應的 nbt 路徑寫進 tellraw 跟 title 中,就可以輕鬆達成效果
由於書本內頁的內容也是 JSON 格式,記得讀取的時候要加上 interpret 這個標籤




data modify 應用


  • 動態生物仇恨設定
非動態的生物仇恨設定很久以前就出現了,透過召喚雪球或雞蛋帶有指定 UUID 來攻擊目標,嘗試將目標仇恨值轉移到指定的 UUID 上,但是 UUID 是事前就先寫死的,沒辦法在執行時才指定目標。
動態生物仇恨設定則可以在執行階段才指定 @p 之類作為仇恨的目標

1.13 出現 execute store 的時候我就很想做這個東西了,但是礙於用 data get 取得的數值會暫存為 int 類型,沒辦法完整儲存 UUID 這種 long 的數值,所以只能作罷。然而現在 data modify 跳過了暫存數值這個限制,可以直接把項目搬移到新的目標位置,所以終於可以實現動態生物仇恨設定了

執行的概念很簡單,讓要轉移仇恨的目標召喚一個雪球,然後將指定仇恨目標的 UUIDLeastUUIDMost 分別設定給該雪球的 owner.L 以及 owner.M 就完成了

  • 套用玩家頭顱
這東西概念上更簡單了,只要把玩家的名字寫入頭顱的 SkullOwner 就行了
問題來了,玩家的名字並沒有寫在 nbt 標籤當中,要怎麼取得玩家的名字?還記得上面說書還有一個重要功能嗎,就是用書來取得玩家的名字

至於要怎麼讓玩家心甘情願寫一本書......
開場給玩家要求寫簽名檔,不然不給開始遊戲好了

有了這個功能,終於可以做出真正的鏡子了呢
#這裡是哪裡?我是誰?

  • 玩家專屬上鎖箱子
嘛,概念其實跟上一個應用一樣,反正玩家名字不會重複,只要把箱子的 Lock 標籤設定成玩家的名字,然後給玩家命名成自己名字的道具就行了

不過這個功能其實相對不太實用,因為這種東西的特性是可以無限擴充,無論多少玩家都能自動生成屬於自己的箱子,但這種箱子通常應該是會集中在一個小區域內的,這時候無限擴充性就被區域內能放置的箱子數量限制了
要比較實用的話大概就是用在生存類的地圖,讓玩家可以隨時隨地召喚或收起箱子,又不用擔心朋友搶你東西之類的

  • 附魔萃取 / Lore 編輯器
附魔萃取應該算是滿知名的模組功能,可以把附魔萃取存到書本上
我當初在類模組就很想做了,不過當初沒有這麼強大的功能只好作罷。到了 1.13 出現了 execute store,我想說終於可以實現了。結果附魔的 id 活生生從數字被改成字串,我了個去

不過現在 data modify 出來,終於可以實現以前的夢想了
執行概念是讓玩家把指定道具放在指定欄位,然後把要萃取附魔的道具 Enchantments 存到書本的 StoredEnchantments 中,再把道具上的 Enchantments 清除並把書本改成附魔書就完成了

設計時可以自己決定是要把所有附魔一次萃取出來還是一個一個萃取,並且可以加上一些判定條件,像是指定欄位的道具必須存在附魔,以及後面放的必須是普通的書之類的
然後能夠從裝備萃取附魔,同理也能強制把附魔書上的附魔加在道具上,這樣就能讓玩家獲得同時有散射穿透的弩弓了呢!因為概念是一樣的,這部分我就不詳細介紹了

另外就是 Lore 編輯器的功能,這東西是我看到的影片裡面的內容,詳見下方影片 5:59
概念上跟附魔萃取很類似,所以一起在這邊提出來。個人認為是滿方便的一個功能
(這部影片在簡介 18w43a 的內容,有些部分比我這篇文章詳細,有興趣可以看完)

  • 死亡掉落物收集
這東西應該也滿多人研究過的,不過普遍脫離不了召喚漏斗,然後把道具集中在漏斗上面。不過這做法最大的缺點就是漏斗傳輸速度很慢,掉落物數量一多就要很久才能收集完,而且通常體積都有點大

現在 data modify 出來之後,就不用再慢慢用漏斗收集物品了,可以直接把道具資料儲存起來。那問題來了,儲存在哪邊是最方便的?直覺來講就是箱子了。但是箱子有一個問題,箱子的欄位最多只有 27 格,但玩家身上最多有 41 個欄位,用箱子儲存 27 格道具之後,剩下的道具就寫不進去了。

那有什麼東西是可以儲存道具資料,而且沒有數量上限的呢?有一個,那就是村民交易

只要召喚一隻村民,把掉落物寫進村民販賣的物品,交易上限一次,收購的東西設定成很廉價的道具,玩家就能輕鬆找這個村民把自己的道具拿回來了,不要的東西還可以隨他去,蒸蚌
一些相關的設定都是很有彈性的,像是要不要給村民無敵再用其他方式刪除他,或是在交易第一頁設定成複製收購物品之類的方便設定,就看各自使用時的需求了

那有沒有其他方式可以達成我們要的效果,我覺得翻頁翻得心很累。
有!只是相對就比較複雜
上面提過虛擬 nbt 已經是儲存資料非常方便的功能了,我們把它搬出來用

現在不要召喚村民了,我們召喚盔甲架,頭上戴一個可愛的箱子,並且不讓玩家拿下來或放東西上去 (如果等被拿到玩家身上再處理,會有很多修改玩家 nbt 的限制)。因為是盔甲架所以不太需要擔心怪物攻擊的問題。記得虛擬 nbt 只能寫在道具類的 tag 中,所以我們就把它寫在頭上的箱子裡吧
跟把資料寫進村民交易的動作差不多,只是現在是把掉落物資料寫進盔甲架頭上箱子的虛擬 nbt 裡,這裡就取名叫 DeathCollecting 吧,類型設定為 list
把資料全部寫進去以後,要怎麼讓玩家拿回來才是重點。首先玩家想拿回掉落物就會把盔甲架打掉,打掉以後箱子就會掉出來。我們要在箱子被玩家撿走之前把道具「還原」出來,就像附魔可以萃取也可以反過來嵌入,道具資料可以存進虛擬標籤,也可以被還原成一般道具
還原的方式其實很簡單,只要依序召喚道具,把虛擬標籤中的資料寫入那個道具中,再把虛擬標籤內的資料移除,直到虛擬標籤被清空後清掉那個箱子道具即可

如何,雖然製作上多一道手續,但是對玩家來說是不是方便的多了?

  • 玩家物品拍賣
不知道還有沒有人記得我之前發過一篇關於 UUID 文章
沒錯又是我

在那篇文章中我有提到讓玩家看道具詳細資料的方式,原理是利用玩家死亡時會看到擊殺者使用武器的詳細訊息。但是每次玩家要看都必須要把玩家幹掉一次,細思極恐。
而且每個拍賣欄位都必須召喚一個實體來對應 UUID (當然現在也可以用上面提到的動態生物仇恨轉移來節省實體數量,但是還是免不了要殺人,柯南都想來這邊拍一集了),管理上非常不方便

那現在我們有什麼方式可以讓玩家看到道具的資料呢?沒錯就是上面才剛提到的村民交易
玩家登錄商品只要把道具資料寫進村民交易內容,輕鬆又愜意。不過村民基本上僅限於查看商品資料用,畢竟玩家如果跟村民買東西,登錄商品的玩家是拿不到錢的 (如果你想做判定哪個商品賣出去,給對應玩家增加錢也是可以啦,但是超麻煩),因此把購買的動作獨立出來吧

看起來好像很簡單,不過如果要做成一個完整的、操作上沒有什麼問題的拍賣系統,還是需要處理很多細節的。像是玩家要知道自己要購買的物品是哪個編號商品下架時要怎麼取回等等
這些東西我就不一一細說了,畢竟每個人的需求可能有些不同,而且我都已經介紹這麼多了,工具都放在那裡,如果你真的想做出一些創新的東西,就試著思考怎麼運用吧


虛擬 nbt list 實現 index 索引


看完上面這麼多內容,你可能已經蠢蠢欲動想要動手做點什麼了。各種功能的概念製作上都滿容易的,最大的問題往往是如何讓「操作流程」是順暢、沒有問題的

那你可能會遇到一個很大的問題就是,你要讀取某個資料的時候,你可能會需要根據編號去存取 list 中特定位置的資料,但是上面也提過:list iterator 是沒辦法輸入變數的。這時候難道只能舉雙手投降嗎?NO!

我說過虛擬 nbt list 已經是很方便的資料儲存型態,它可以當成 stackqueue 來使用。這樣說你可能還沒什麼想法,不過!

「一個 list 不夠,不會用兩個嗎?」

只要開一個 temp list,當我們要讀取某個編號的項目的時候,依序把 list 的第一個項目搬到 temp list 的最後面,並把我們的編號變數減 1,直到編號變數歸 0 list 的第一個項目就是我們要存取的項目了。當執行完我們要的運算之後,再將 temp list 中的內容一口氣 prepend 到原本的 list 中就大功告成了

不過這個做法是不建議大量使用的,尤其是 list 中的項目數量非常多的時候,運算會消耗大量的資源,建議用在不會常常需要更新的資料中。至於如果確定項目數量不會超過特定值,也可以考慮直接把所有可能的狀況一次寫進去做一一對應就好,這樣也能用上面說的新 nbt 存取模式 [{指定編號}] 來存取內容,方便許多

如果你對這個東西可以做什麼還沒什麼概念的話,那想想上面說的套用玩家頭顱吧。如果你在多人的狀況下突然想要取得某個玩家的頭顱,你總不可能每次都要求玩家先寫一本書或隨身帶著自己的書才能繼續玩吧?那如果你只有一開始儲存玩家的名字,之後你要存取的時候該怎麼知道要存取哪個資料呢?

或是你也可以想想看是不是能做到讓每個玩家都有自己的雲端道具欄呢?以往資料儲存在記分板的時候,只要玩家離線就沒辦法更新他的資料,現在是不是能有解決方案呢?


後記


就像我文章後面的部分大量提出各種問題,指令的學習需要的不只是扎實的知識基礎,更重要的是怎麼善用各種工具組合出我們想要的效果,因此我這篇文章沒有把詳細一條一條指令範例打出來 (絕對不是因為我懶喔),只有自己想過得出來的結果才是自己的。

隨著一個一個更新,開放讓製作者能修改的內容越來越多,雖然功能越來越強大,但學習成本也越來越高。不知不覺我也玩指令玩了 5 年多了,有種自己已經老了的感覺呢。現在重心也漸漸從 minecraft 上轉移到其他地方了,研究就研究到這邊,至於怎麼讓這些新的功能發光發熱,就看各位能給它賦予什麼生命力了,期待各位精彩的表現!



最後還是附上我的影片中使用的地圖:載點
想不通或是想體驗看看就拿來玩玩看吧
69
-
未登入的勇者,要加入討論嗎?
板務人員:

1326 筆精華,昨天 更新
一個月內新增 11
歡迎加入共同維護。


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

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