Notice: Function _load_textdomain_just_in_time was called incorrectly. Translation loading for the ultimate-addons-for-gutenberg domain was triggered too early. This is usually an indicator for some code in the plugin or theme running too early. Translations should be loaded at the init action or later. Please see Debugging in WordPress for more information. (This message was added in version 6.7.0.) in /opt/bitnami/wordpress/wp-includes/functions.php on line 6114
Minecraft CMD - 八寶周的研究小屋

Category: Minecraft CMD

0. 前言


在遊戲中加入音訊不只帶動遊戲感,如果加上劇情對話還能帶來劇情張力並引導遊玩速度。

透過 /playsound,趕緊看看如何透過生成工具簡單達成以上的目的吧!

1. 重點


該指令是在地點觸發,不會隨著物體移動
音量的 volume 參數在 > 1.0 的情況去 x16 則代表是傳聲的距離,最小傳聲距離是 16 格
最小音量是指傳聲範圍之外的常態音量,而非範圍內的最小音量

2. 內容


2.1. 解說 – 指令的整體架構

關於 /playsound 的架構也不複雜,但最基本的情況下建議還是使用以下方式,因為在正常情況下我們是從某個地點或物體去發出聲音,所以 Selector 的設定相對重要。而如果製作的地圖中有版權音樂或音效,要讓直播者避開風險,通常建議放在 music 或 record 兩個相對較少人開啟的音軌。

Python
/playsound <聲音特效> <音軌> <SELECTOR>

而除此之外還有一系列的參數可以調整,首先 /playsound 該指令是在「位置」進行傳聲並非跟著物體移動,因此自由活動的情況下並不適合長篇的音檔。音高的部分在 Java 版能從 0.5 ~ 2.0,上下 1 則代表是八度音的距離,而提高同時會讓聲音變得急促,反之拉低會讓音訊延長。

而 volume 的設定從 0.0 ~ 1.0 是調整音量,但超出 1.0 後則會 x16 代表傳聲的距離,而傳聲的最小距離就是 16 格,而在傳聲範圍內離發聲地點越遠漸弱。末端的 minVolume 從 0.0 ~ 1.0 的數值實際上是在撥放範圍之外,玩家所能聽到的音量。所以假設 minVolume = 1.0 的時候,在超出撥放範圍外的音量反而比在圈內外圍還大聲。 這時候最好的限縮方式就是透過 Selector 搭配 distance 標籤進行塞選。

Python
/playsound <聲音特效> <音軌> <SELECTOR> <x> <y> <z> <音量/距離> <音高> <圈外音量>

2.2. 實作 – 為材質包導入自訂義的音檔

在影片中我們有稍微帶過以下這些可用的介面化工具

【音效】Stable Audio, Meta Audiobox

【語音】TTSMaker

那這邊額外補充幾個工具給具有 Python 經驗 + GPU 的朋友

【音效】AudioLDM2, Stable Audio Open

【語音】speecht5_tts

這次需要用到在 versions 檔案看不到的材質包屬性,首先將 .ogg 音檔放入到 sounds 資料夾目錄之中。

另外建立一份 sounds.json 並進行編輯,這份檔案才是實質標註音訊的設定。各位可以參考以下的格式達成最基礎的設定,最主要會要設定 Sound Event ( 識別字串 ) 以及 name ( 檔案路徑 ) 。關於 stream 的串流設定建議設為 true 避免讀取完整大檔導致的 lag 。

Python
{
    "識別字串": {
        "sounds": [
            {
                "name": "檔案路徑",
                "stream": true
            }
        ]
    },
    "speeches.opening": {
        "sounds": [
            {
                "name": "rpg:speeches/opening",
                "stream": true
            }
        ]
    }
}

完成之後來到我們的遊戲之中,裝上材質包,最好再按下 F3 + T 重整一下。此時我們輸入指令應該要能看到我們自訂義的音檔,並可以正常進行撥放。

2.3. 實作 – 將 MIDI 轉為音階盒樂曲

我們透過 Open Note Block Studio 去讀取 MIDI 並轉換成音階盒格式,導入的時候麻煩維持 1x 並記得勾選 Read Note Velocity 進行音量調整。

這邊提供範例使用的千本櫻 MIDI 音檔

完成讀取後,由於通常公開的 MIDI 都已經調整好設定了,我們就透過 File >> Export as datapack ,等待一段時間直到有個視窗彈出才算完成。

接著我們就能將 musicbox 這個資料夾移到我們自己的 Datapack 之中,此時記得將 load 與 tick 添加到 minecraft / tags 的兩份設定之中,最後記得若為 1.21 記得將 Namespace 底下的 functions 改為 function 該新的名稱。

完成後就能到遊戲 /reload 開始測試,我們主要操作就是 play (撥放), pause (暫停), stop (停止) 上述三種,各位能注意影片中的記分板數值。

3. 後話


快速複習下本篇內容,指令的架構與基礎,再來添加自己的音檔,最後轉換 MIDI 並轉為音階盒樂曲。

那下次我們終於要進入到 Ground Crafting,透過 execute 製作視覺化的合成效果。

4. 參考


[1] sounds.json 格式 — Minecraft Wiki
https://minecraft.wiki/w/Sounds.json

[2] playsound — Minecraft Wiki
https://minecraft.wiki/w/Commands/playsound

  • MC 煉金工藝 – 粒子效果與旋轉法陣

    MC 煉金工藝 – 粒子效果與旋轉法陣

    0. 前言


    無論是在冒險地圖中製作生動的場景,或是為技能設計絢麗的動畫,/particle 指令都能派上用場。透過粒子效果可以大大提升遊戲的沉浸感,讓你的創意在遊戲中得以充分展現。

    那我們這篇我們會進行 particle 的基礎知識到進階設定,順帶簡單實作,馬上就來看看吧!

    1. 重點


    delta 用於指定粒子效果的範圍,並受 count 影響進行排列
    delta 在 count = 0 時通常用來指定 Motion
    force 不僅是增加視野距離,還可強迫在 Minimal 設定之下顯現粒子

    2. 內容


    2.1. 完整解析

    2.1.1. 粒子效果的特性

    在遊戲中粒子效果是以 2D Sprites 形式呈現,因此無論玩家如何移動它們總是面向玩家。而在短暫的動畫過程中可能會變換大小和旋轉,並去循環 Sprite 動畫。

    多數粒子是可以穿過牆面的,而部分粒子(ex: 煙霧)則與實心方塊碰撞,並在蜘蛛網中會被減速,但它們並不受其他實體的影響。

    另對於遊戲機制有影響的粒子效果基本還會顯現在 Minimal 設定之下。

    Sprite

    Sprite 是電腦圖形和遊戲的術語,指整合到場景或環境中的 2D 圖像或動畫。通常由多張不同動作的圖片組成循環動畫,避免遊戲角色在螢幕平移的滑稽情況,且可透過越多的禎數提供流暢的動態感。至今仍大量運用在 Platform, 2D RPG 等平面遊戲,到了 3D 則多都改由骨架進行控制。

    圖片來源: Sunny Land on itch.io
    2.1.2. 粒子效果的生成

    簡單認識粒子的特性後,我們就能夠進一步開始透過指令進行更好的調整囉。

    那由於涉及視覺設定上的觀感設定,我自己基本不會使用最基本的語法,能調整的太少了。

    Python
    /particle <particle_name> ~ ~ ~

    那另外一種較詳細的寫法中,我們能夠進一步調整粒子的數量, 呈現範圍, 速度, 視野距離, 強制顯示, 可看見者,相對有非常多的調整。

    Python
    /particle <particle_name> ~ ~ ~ <delta> <speed> <count> [force|normal] [viewers]

    在座標後方各位千萬別依照 Hint 乖乖地輸入座標。

    這個 delta 區塊主要用來表示要呈現粒子效果的區域,而其中心區域就是我們前面指定的座標。而這邊的數值被放大了 8 倍,所以想要呈現在一格之中我們則要設置為 .125 .125 .125,而後方的 count 除了影響數覺效果外還能用來辨別例外。

    接著先跳過來看 count 也就是粒子的總數,最高可到 32 bit 但前提是你的電腦承受的住。正如我們在 RPG 地圖 Boss Fight 難免遇到粒子效果造成的當機攻勢,生成越多粒子往往對玩家是種負擔。

    而粒子會在 delta 的範圍內隨機擺放,以下為從左到右的指令範例。可以發現即使再多的粒子在同個地點也沒有多少用處,而在 delta 的直徑範圍內除了縮放外還能針對樣式做調整。

    Python
    /particle flame ~ ~3 ~ 0 0 0 0 100 normal
    Python
    /particle flame ~ ~3 ~ .125 .125 .125 0 100 normal
    Python
    /particle flame ~ ~3 ~ .125 .5 .125 0 100 normal

    但在 count = 0 的時候不是沒有粒子,在此時的 delta 則等同於 Motion 設定,配合 speed 從隨機擴散變為直線射出粒子。

    針對音階符與 entity_effect 則用來決定粒子的顏色,色彩數值由 delta x speed 進行計算。

    那 speed 概念正如其名代表粒子的移動速度,但其活性視粒子效果反而不同。在下方的範例中分別是速度 0 與 0.05 來呈現火焰,可以看到在 0.05 的狀況下火焰就已經明顯向外擴散。

    但也不是說速度越高一定越糟,有些比較遲鈍或會下墜的粒子效果反而要到 1 才會變平常所見的樣貌。

    另外當然也有完全不受影響的案例。

    後方兩項都是選填的針對玩家的顯示設定,本身的預設值分別為 normal 與 @a ,但我自己習慣上還是加上 normal 提醒自己這邊還有參數可以設定。

    在 Minecraft Wiki 之中雖然只寫到 normal 與 force 用於顯示於 32 或 512 格之距離。

    但 force 還可強制在 minimal 設定下也看到效果,適合針對地圖製作中必要的元素避免影響遊戲。

    最後尾端的設定則常用於遊戲分組的時候,比如殺手或間諜能夠獨立看到特殊的機關進一步幹些壞事。以下範例以 tag = viewer 進行呈現。

    Python
    /particle flame ~ ~3 ~ .125 .5 .125 0 1 normal @a[tag=viewer]

    2.2. 實作體驗 – 旋轉法陣

    2.2.1. 活用工具

    首先到 GitHub 下載【該工具】,麻煩注意系統需求的部分,各位可能還要額外安裝 .NETCore 3.1 才能執行。

    接著我們能夠到【該網站】下載圖檔,習慣性按下 Preview,接著依照以下設定。

    簡單講解下齁,我們首先設為相對座標,這樣法陣才能夠進行旋轉。而為了放在地面則設為 Z-X 。接著將法陣對齊中心,並取消 Autosize 直接設置直徑為 4 。

    接著開啟 More Settings 調整粒子效果,那範例這我使用的是附魔文字的 enchant,並且將顯示設定改為 normal,就可以輸出 mcfunction 。

    接著到專案目錄進入 functions 目錄之中,複製與檔名相同的檔案。

    2.2.2. 指令測試

    接著貼到我們的 Datapack 之中做成 function 在遊戲中進行使用。那方便起見我們就偷懶用下指令方塊進行測試。

    我們首先準備一個 Repeat 指令方塊,讓盔甲座持續的旋轉。

    Python
    execute as @e[type=minecraft:armor_stand] at @s run tp @s ~ ~ ~ ~6 ~

    接著在後方接個 Chain 指令方塊,在盔甲座底下秀出魔法陣。

    Python
    execute as @e[type=minecraft:armor_stand] at @s run function |YOUR_FUNCTION|

    大功告成!會旋轉的法陣就是如此簡單,對於地圖擺設或技能特效都十分實用。

    3. 後話


    靈活運用這些粒子效果,你可以創造出極具視覺衝擊力的場景,並將你的想法具象化為動態效果,讓你的 Minecraft 創作更上一層樓。

    那由於篇幅關係,我們將 /playsound 拆出額外進行解說,另外也有準備額外實作進行音樂的添加,各位可以期待一下。

    4. 參考


    [1] Commands / particle — Minecraft Wiki
    https://minecraft.fandom.com/wiki/Commands/particle

    [2] Image Particle Generator – by Legitmoose
    https://www.youtube.com/watch?v=1DjAt-WuJFA

    5. 額外


    [1] Animated Particle Plotter – by Cloud Wolf
    https://www.youtube.com/watch?v=YFDo5Inn7x8

  • MC 煉金工藝 – Floor Crafting 合成站

    MC 煉金工藝 – Floor Crafting 合成站

    0. 前言


    在上回我們透過合成台配方進行客製化物品的生成,但礙於目前的架構限制,沒法使用特殊道具作為素材,因此我們必須透過 Floor Crafting 達成此目標,順便做出視覺效果。

    另外我們要避免隨便丟在地上的物品意外合成,勢必需要設定專用的合成站。那我們今天這一篇我們會進行 execute 的基礎使用與介紹。

    1. 重點


    execute 可以視作為篩選後的結果,相對 Selector 能進行更精細的篩選。
    execute 的 as 會回傳物體並能從中取得其資訊,然而 at 只回傳座標位置
    tp 本身不會消除動量

    修正資訊(Jul. 30, 2024)

    🙏感謝 [巴哈姆特] 貓狗貓 提供以下關於修正資訊

    透過 function 進行 tp 與 storage 測試後,tp 在 tick 瞬間是會消除 Motion 的,但為何物體會前移仍不明。

    2. 內容


    2.1. execute 基礎篇

    關於 execute … run 我們能視作篩選後的結果,當滿足 subcommand 的篩選條件後,執行 run 之後的相應動作。那其中最常用分別為 as 與 at 這兩個,那我們就來看看他們的用途吧。

    2.1.1. as

    首先講述到的 as 我們能看做 “當” 的概念,比如下方的指令方塊內容代表「當 entity 型態為 item (掉落物) 的時候執行 tp 到指令方塊的上一格」。

    Python
    execute as @e[type=item] run tp ~ ~1 ~

    那麼丟些道具並拉下拉桿後,物體就該被傳送到方塊上方,代表有偵測到這些物件。

    2.1.2. at

    那 at 的概念則是相當於 “在” 的概念,那像下方 Repeat 指令方塊的內容則表示「在 item (掉落物) 的位置顯現粒子效果」。

    Python
    execute at @e[type=item] run particle flame ~ ~ ~ 0.125 0.125 0.125 0 10

    當我按下拉桿後,當我丟出物體就該持續有粒子效果跟著物體移動。

    2.1.3. as 與 at 的區別

    在後方的 Repeat 指令方塊中我寫了較為詳細的語法,透過 as 搭配 at 進行組合。前後文效果是一樣的。

    Python
    execute as @e[type=item] at @s run particle flame ~ ~ ~ 0.125 0.125 0.125 0 10

    但我們直接用 at 不是運行好好的嗎?那切割點在於 as 是回傳物體與其資訊,然 at 只回傳座標資訊,假若用 at 直接銜接其他 subcommand 可能無法正常運作。便宜偷懶是可以用 at,但有牽扯到其他判斷式時就建議採用詳細的寫法避免後續出現問題又可能拉長 debug 的時間。

    2.1.4. if / unless

    我們另外看到經常使用的 if 肯定的判斷式,那其相對的就是 unless 作為否定的判斷式。他們可以銜接的包括生態環境(biome), 方塊類別(block/blocks), 物體資訊(data)。

    另外其他的包括境界的判斷 (dimension), 物體(entity), 方法是否執行成功(function), 玩家包包檢查(items)。

    最後兩個比較例外少用的指定座標是否有被世界加載(loaded), 關於 Datapack 的數值比對(predicate)。

    2.1.5. align

    講到對齊我們會使用的便是 align 方法,那有 xyz 三軸嘛,他的組合數就是 C3 取一 + C3 取二 + C3 取三,等同於 2^3 – 1 共 7 個組合。

    JavaScript
    x y z xy xz yz xyz

    那我們可以假設說當我們 align xyz 時,我們就在那單個方塊的 0, 0, 0 座標上,因此若 x 與 z 設為 ~0.5 代表在地面的正中心,另外加上 y 為 ~0.5 就是該方塊的正中心點。

    2.1.6. as 與 at 的驗證

    這邊我們回頭為 as 與 at 做個證明,順便用上一些我們剛介紹的判斷架構。透過 Repeat 指令方塊,可以看到下方我們先使用 at 嘗試去對齊 xyz,而當掉落物下方的方塊為含水大鍋就會停止物體並取消重力。

    但在下方的測試中並沒有跳出指令方塊的回饋也沒有讓物體滯空。

    Python
    execute at @e[type=item] align xyz if block ~ ~-1 ~ water_cauldron run data merge entity @s {Motion:[0.0,0.0,0.0], NoGravity:1b}

    這時我們把指令修改一下為複合的準確型態。這時我們重新嘗試就能看到指令方塊的執行回饋,並且明顯看到物體神奇的浮在空中。

    Python
    execute as @e[type=item] at @s align xyz if block ~ ~-1 ~ water_cauldron run data merge entity @s {Motion:[0.0,0.0,0.0], NoGravity:1b}

    2.2. Datapack 的 function 架構

    這似乎是我們首次提到 function 目錄,那事實上有幾個特殊的目錄是沒有寫入在 versions 的版本執行檔,必須去到 Minecraft Wiki 進行查詢。

    那我們首先必須講到的就是 minecraft/tags/function 內部的兩個 JSON 檔案,其中可以透過陣列的方式選定要執行那些動作。而 load.json 所代表的是加載資源包時執行的動作,而 tick.json 所代表是遊戲每 tick (1 sec = 20 tick)去執行的動作。

    Python
    {
        "values": [
            "BRANCH:PATH/OF/MCFUNCTION"
        ]
    }

    那相應他們的名稱,我個人的命名習慣在最頂層就有 load(建立計分板, 隊伍等等), tick(需要隨時偵測的內容), unload(相對於 load 讓玩家可以安全卸載資源包)。那當然後面細分時可能就會有更多目錄與特殊的 mcfunction 。

    基礎三個方法個人採用階層式的方法,當我有要移除任何階層時相對好管理減少到處呼叫的問題,另外就是同一種分類的 function 都寫在一塊容易管理。

    另外這些寫好的 mcfunction 實際上都能夠在遊戲中透過 /function 這個指令來直接進行呼叫。

    2.3. 坩鍋實作

    我們接著進入到今日的實作部分,當然在一點修改下也適用於判斷其他方塊,各位可以自行發揮。

    2.3.1. tp 動量驗證

    那在我們直接執行正解之前先來做個關於 tp 的實驗,我們在 Datapack 確認每 tick 觸發後,先只測試將物品傳送到鍋的中心而沒有動量消除的部分。

    我們回到遊戲通過 /reload 加載後丟點東西到含水大鍋上方可以看到物品有確實被吸入,但當我們抽乾之後卻會發現物品不在中心而是壁面。但我們不是設定 x 與 z 的 .5 了嗎?原因在於 tp 不會消除物體動量。

    Python
    # Teleport item into water cauldron
    execute as @e[type=item] at @s align xyz if block ~ ~-1 ~ water_cauldron run tp @s ~.5 ~-.5 ~.5

    我們快速做個驗證,跟朋友一起玩過的可能就體驗過,當我們從高空墜落一段時間後,即使 /tp 到地面玩家身邊,那瞬間還是會摔死的,主要就在於動量沒被消除,玩家還是以其速度撞向地面。

    2.3.2. 視覺效果

    我們接著加上前面測試的方法來消除動量與重力。完成修改後回到遊戲進行 /reload,接著丟點東西嘗試一下。那由於我有使用 NoGravity 將物品浮空在鍋內中間,掉落物自然上下起伏的動畫剛好能讓玩家看到自己放了那些素材進去。

    Python
    #
    # When item flying across water cauldron, teleport item into it
    #
    
    # Detect if item flying across water cauldron then freeze it
    execute as @e[type=item] at @s align xyz if block ~ ~-1 ~ water_cauldron run data merge entity @s {Motion:[0.0,0.0,0.0], NoGravity:1b}
    # Teleport item into water cauldron
    execute as @e[type=item] at @s align xyz if block ~ ~-1 ~ water_cauldron run tp @s ~.5 ~-.5 ~.5

    3. 後話


    但若我們只是將素材丟入坩鍋是否還是太過無趣,我們下期就要介紹 /particle 與 /playsound 來給予視覺與聽覺的效果。那我們就下期再會啦。

    4. 參考


    [1] Datapack – Minecraft Wiki
    https://minecraft.wiki/w/Data_pack

    [2] Execute – Minecraft Wiki
    https://minecraft.wiki/w/Commands/execute

  • MC 煉金工藝 – 自訂義配方

    MC 煉金工藝 – 自訂義配方

    0. 前言


    在生存當中你是否曾覺得某些道具取得麻煩?是否曾妄想過能夠合成特殊道具?

    這些事情也能透過 Datapack 進行擴增,接著就來看看如何取代以及擴增物品的合成配方吧!

    1. 重點


    利用指令道具在 minecraft/recipe 目錄下的覆蓋配方是最基本的禁用方式
    在 1.20.5 後配方可以透過 components 增加物品標籤建立客製化物品

    版本變動

    在 1.21 許多目錄的 s 都被移除了,並增加了許多過往沒有的架構,請先觀察欲開發版本 jar 檔案

    2. 內容


    2.1. 配方架構

    老樣子先講解架構,我們進入版本的 JAR 執行檔,進入 data >> minecraft >> recipe,這個目錄底下是遊戲中所有的原本合成配方。

    那關於合成方式設有兩種型態: shapelessshaped,代表就是是否需要擺為特定形狀。

    這邊另外拿兩份檔案進行範例解說。

    2.1.1. 相思木按鈕 acacia_button
    JavaScript
    {
      "type": "minecraft:crafting_shapeless",
      "category": "redstone",
      "group": "wooden_button",
      "ingredients": [
        {
          "item": "minecraft:acacia_planks"
        }
      ],
      "result": {
        "count": 1,
        "id": "minecraft:acacia_button"
      }
    }

    可以看到 shapeless 所對應的是 ingredients 只管要有那些素材而不論位置。那我挑選木造按鈕的原因在於它有 group 標籤,而 group 的概念在於相同配方架構下,可能因為不同木材不同顏色而有變化。

    2.1.2. 釀造台 brewing_stand
    JavaScript
    {
      "type": "minecraft:crafting_shaped",
      "category": "misc",
      "key": {
        "#": {
          "tag": "minecraft:stone_crafting_materials"
        },
        "B": {
          "item": "minecraft:blaze_rod"
        }
      },
      "pattern": [
        " B ",
        "###"
      ],
      "result": {
        "count": 1,
        "id": "minecraft:brewing_stand"
      }
    }

    相對釀造台就是 shaped,那對照的是 pattern 與 key,其中 key 代表 pattern 內相對位置的素材條件。另外 pattern 不一定要擺滿九宮格,比如原版的樣式是兩行,所以我們在合成上可以是一二行或二三行。

    剛才提到 group 的概念在於相同配方架構下。而 category 則代表物品合成出來後該歸在哪一類,最直觀的就是創造模式下能看到的物品分頁。尾端的 result 則對應合成結果與數量,那這是原版的情況,我們後續會再加上 components 創建自訂義物品的配方。

    那雖然今天主軸都在合成台的配方上,還是多介紹下其他合成站的狀態。那在下方沒有 count 標記就代表沒法更動結果數量,但都可以加上 components 。

    但根據 Minecraft Wiki 現在還有個致命缺點,就是只支援結果能設定 NBT Tag,也就是說我們沒法將客製化物品做為合成素材使用,因此這範疇還是要仰賴 Floor Crafting 達成。

    2.1.3. 燒製型配方

    包括熔爐, 高爐, 營火, 煙燻爐都是燒製的範疇,讀取的都是 ingredient,並配有給予玩家的經驗與燒製時長的設定。

    2.1.4. 切石機配方

    同樣也是讀取單個 ingredient,但輸出可以多設定數量,且能單個素材產出多個結果。

    2.1.5. 鍛造台配方

    我們知道在 1.20 系列更新我們多出了鍛造模板,而鍛造台呢也就是針對三個欄位讀取去合成結果。

    2.2. 配方增減

    我們接著就來實作看看如何覆蓋以及增加物品的合成方式吧。

    2.2.1. 覆蓋配方

    覆蓋原版配方可用來調整物品取得難度或禁止生存手段合成物品。那在這個案例中我將會以禁止釀造台為實作,後續我們的藥水將透過大鍋搭配 Floor Crafting 形成更好的視覺效果。

    那我們偷個懶用這個視覺化的網站幫忙編寫,在上方選用合成配方後,稍微往下滑記得先選取你的遊戲版本,接著參照版本 JAR 內的規格在 Output Recipe 取名為 brewing_stand,接著我們往上勾選 “Exactly where placed (準確放哪)” 。

    我們首先搜尋 brewing 並找到釀造台放到結果欄位,接著從右側的素材中搜尋 barrier 這只能靠指令拿到的物品並拖拉進合成表之中。那接著我們要簡略的第二層保險,避免用戶意外在遊戲內發現配方,我們多拉幾個屏障並且不規則的放入。

    接著你可以選用是否要設第三層保險,比如我就多搜尋 knowledge 把其中一個屏障改為知識之書。

    完成之後滑到最底層,點選 Download JSON,並且將這放檔案放到 Datapack 的 minecraft/recipe 中。返回遊戲之中首先輸入 /reload,將著嘗試看看原版的合成配方是否已被取代。

    2.2.2. 增添配方

    相對的有減少我們就來操作增加,我們刷新網站並命名配方,那由於我們是超出原版的內容,只要確保檔名在目錄內沒有重複就能隨便亂取,比如我打 testing123 。那我們這次改用 shapeless 進行示範,我們將結果設為麵包(bread)素材設為一綑小麥(wheat),完成之後就進行輸出。

    接著將 JSON 放到 Datapack 的其他分支,比如我的在 course/recipe 之中,這時我們就有原版的 bread 與我們的 testing123 兩個配方。我們回到遊戲 /reload 後進行測試,測試原版的新增的兩種合成方式。

    當然放到 minecraft/recipe 因為檔名沒相衝也可以使用,但建在分支的優點就在於方便跟著更動並且能使用原版物件的名稱。比如我今天突然將整個分支移到其他 Datapack,我不用另外再搬動合成配方。

    2.3. 合成客製化物品

    接著我們就要進行 components 的調整,那我們所使用的網站可以對合成表上的物件右建刪除或設定 custom_data,但由於該網站能改動的部分很少,因此還是以編譯器直接進行修改。

    我們就拿過往製作的材質包來練習,再度刷新清空合成表後我們合成蜂蜜瓶,為求簡單選個 shapeless,拿個空瓶 bottle 跟紅石 redstone dust,我們命名為 932230 後輸出 JSON,並將其複製到分支的 recipe。

    JavaScript
    {
        "type": "minecraft:crafting_shapeless",
        "ingredients": [
            {
                "item": "minecraft:redstone"
            },
            {
                "item": "minecraft:glass_bottle"
            }
        ],
        "result": {
            "id": "minecraft:honey_bottle",
            "count": 1,
            "components": {
                "minecraft:custom_model_data": 932230,
                "minecraft:custom_name": "\"Healing Potion\""
            }
        }
    }

    上述範例看到最底層的 components,這個是在 1.20.5 才加入的 NBT 架構,因此你可以到參考資料找下我過往整理的「1.20.5 物品常用標籤」或官方的「Snapshot 更新誌」。

    那我們上面範例就練習到 Custom Model Data 與物品名稱的設定,完成之後就能進到遊戲實驗啦,阿別忘記先載入過往練習的材質包,應該要能看到之前設定的樣式。

    注意事項

    若有裝光影的話 objmc 的 3D 模型基本上是會壞的,可以嘗試換成 2D 的圖樣進行

    3. 後話


    目前客製化藥水的合成只是作為範例,我所希望的是透過 Floor Crafting 在大鍋中更有視覺化的進行釀造,這也是前面封禁釀造台的主因。

    那麼下回我們就會透過辨識物品底下的方塊或物體設定特製的合成台,先讓物品準確的落在中心點。

    4. 參考


    [1] Minecraft 1.20.5 物品參數更新 — 八寶周的研究小屋
    https://babaochou2420.com/2024/06/14/minecraft-1-20-5-item_cmd_update/

    [2] 官方 Snapshot 更新誌
    https://www.minecraft.net/en-us/article/minecraft-snapshot-24w09a

    [3] Recipe — Minecraft Wiki
    https://minecraft.wiki/w/Recipe

  • MC 煉金工藝 – 3D 自訂義物品

    MC 煉金工藝 – 3D 自訂義物品

    0. 前言


    2D 模型感覺不夠看,但想製作 3D 模型又好麻煩?

    這期我們使用 AI 模型告別 Blockbench,快速將 2D 轉成 3D 並匯入 Minecraft 世界。

    1. 重點


    Tripo AI 採 token 制度按操作收費
    objmc 針對模組環境仍有些嚴重問題

    修正資訊(Jul. 21, 2024)

    🙏感謝 [巴哈姆特] 貓狗貓 提供以下關於 objmc 部分的修正資訊

    1. 由於 objmc 是修改 core shader 後達成的效果,因此與光影相關的模組基本都會出現看不見的問題
    2. 透過結果 JSON 的 elements 能發現其都非常微小 (0.000001),才是 Blockbench 無法看到的主因
    3. 關於結果 PNG 的藍色區塊代表是 uv 資訊而不是套皮的素材。

    2. 內容


    2.1. Minecraft 的 JSON 模型格式

    透過 JSON 建立方塊與素材算是 Minecraft 特有的樣式,那我們主要有三個區塊,textures 讀取不同的素材進行配色,elements 調整 cube 的位置組成模型,display 調整拿在手上丟在地上的模型樣貌。

    2.2. 材質包製作

    我們先進到上次建立的材質包之中並準備好開發環境,接著就從生成模型先開始吧。

    2.2.1. Tripo AI — 2D 轉 3D

    講到 Minecraft 講到建模很多人大概先想到 Blockbench, 但我身為 3D 建模白癡,我決定使用 AI 模型進行處理,那我所使用的是 Tripo AI 這個 2D 轉 3D 的服務。

    該公司先前有與 Stable Diffusion 合作發布概念性模型,但成效差上許多,若你真不想花費 token 可以嘗試看看。這邊提供文章連結,裡面附有模型下載的地方。

    這邊先付上我這邊生成的 OBJ 模型,各位不想註冊不想花錢的可以到此連結下載素材

    生成與檔案下載都會花費 token,而剛註冊會給 600 的免費額度,大概可以做 20 個左右。我們上傳我們上次準備的去背圖片進行嘗試吧。

    這種生成方式有兩種缺陷,首先在於模型只能靠一個面去推敲,但出來的結果還可以接受。第二在於由於是 material 鋪上 mesh 的方式,因此我們若想對模型進行更動稍有挑戰性。

    等待生成完成後可以轉一轉把玩一下,再來點選右上的拓展按鈕進到主檢視器。

    關於 Stylize 那邊的像素化我們可以忽略它,先前在測試發現畫質損失嚴重並只能匯出 glb 格式。

    我們只要記得右下的匯出選擇最普遍的 obj 並交錢下載模型,下載成功後我們找個地方先解壓縮出來。

    2.2.2. objmc — OBJ 轉 JSON

    我們到 GitHub 找到 objmc 這個專案,並透過 git clone 指令複製到本地。完成後就請執行 objmc.py 開啟 GUI 介面準備進行操作。

    PowerShell
    git clone https://github.com/Godlander/objmc.git

    這個專案的特點就在於轉換 OBJ,這是 Blockbench 覺得太過麻煩直接表明拒絕開發的功能。而這個工具根本成為了 3D 建模者的福音,可以將 Polish 3D Model 直接轉為 Minecraft 的 JSON 格式。

    那介面上看到可以讀取多個 OBJ 但那是針對動畫的生成,我們不用用到那麼複雜。但你有興趣能研究 Blockbench 的 Obj Animation Exporter 插件,其就是透過動畫分偵切割新的 Obj 出來。

    那我們就是讀取剛剛的單個 OBJ 模型 + 它的圖片素材,順便先設定輸出時名稱與素材路徑。

    那轉換出來的這個格式與方塊也是完全相通的,但我們還是先將目光集中在道具之上。

    2.2.2. 引入模型

    看到 Terminal 顯示 Complete 完成生成後,將剛剛的 JSON 與 png 貼到我們的材質包之中。而 [蜂蜜瓶] 記得要將 override 的地方從 2d_ 改為 3d_ 。

    完成之後我們在回到 Minecraft 進行 F3 + T 重整,可以看到模型有點偏移。這邊強烈否對使用 Blockbench 讀取 JSON,原因在於從 mesh 轉換因而有超多的 cube,直接加載瞬間讓我電腦當機,而第二在於素材圖片的大小過大,Blockbench 偵測不到因而呈現隱形的物件。所以要修改還是推薦從 Maya, Blender 進行修改後重新給 objmc 進行轉檔。

    3. 後話


    透過 2D 轉 3D 雖有侷限性但大大增加製作的效率,那希望這兩篇可以幫助到各位。

    也別忘記可以留言或按讚讓我知道,這教學對於各位非常實用。

    4. 參考


    [1] objmc
    https://github.com/Godlander/objmc

    [2] Tripo SR (開源概念模型)
    https://stability.ai/news/triposr-3d-generation

  • MC 煉金工藝 – 2D 自訂義物品

    MC 煉金工藝 – 2D 自訂義物品

    0. 前言


    你是否好奇過為何有些地圖如此真實,冒險地圖如何做出特出的道具模型?這些東西都離不開材質包。

    材質包不僅僅改變遊戲觀感,還可以製作超出原版的客製化內容。

    那具體如何製作就看後續的教學吧,我們此篇會先以加入 2D 圖像進行展示。

    1. 重點


    原版的物品 model 能在 versions 中的版本執行檔中找到
    作為物品圖片素材不用同樣採 16×16 但建議為正方形

    2. 內容


    2.1. 材質包的架構

    我們進到 Minecraft 資料夾之中,首先看到 versions 並選擇某版本的 JAR 檔進行檢視。這份檔案不僅僅包含材質,還涉及遊戲的運作邏輯,但我們今天只看 assets 資料夾。

    材質包的基本架構與 assets 幾乎一致,而要覆蓋原版內容就要放在 minecraft 目錄中。

    我們所常用的會是 models (模型) 與 textures (材質) 。

    內部共通的基礎有 block (方塊) 與 item (道具) 兩種。

    那我們進入到 item 會看到很多的檔案,那由於我們主題是煉金我研究後選用[蜂蜜瓶]進行製作 ,我們先看看它的樣貌。必要會有 parent (分類) 以及 textures (材質),但要注意的是不同物質可能會有更多層的 textures,比如藥水就有兩層,而頭顱則還有個 template 進行判斷處理。

    2.2. 材質包製作

    我們進到 Minecraft 資料夾找到 resourcepacks,內部可以讀取的形式為 zip 或資料夾,那我們就先建立一個新的資料夾叫 alchemica-course 。

    我們首先建立個檔案叫 pack.mcmeta,這是讓 Minecraft 找到版本與敘述。也能另外加上方形的 pack.png 做為封面圖片。

    JavaScript
    {
      "pack": {
        "pack_format": 34,
        "description": "Course pack divided from my project -- Alchemica"
      }
    }

    2.2.1. 原版覆蓋

    接著我們模仿 versions 的執行檔架構進行增建,並將我們剛用到的蜂蜜瓶複製到專案之中的 models 。接著將 textures 的 layer0 改為 item/potions/932230 。

    你可以在這邊下載此素材圖片,或者命名一個 PNG 並丟到 textures 內的 item/potions 路徑。

    完成之後我們先刷新 Minecraft,載入材質包後找下 [蜂蜜瓶],可以看到圖像變了。

    但這樣有個很嚴重的問題就是我們取代了整個物件,其他人要使用正常的東西都沒辦法,因此我們要進一步進行調整來匹配。

    2.2.2. 模型匹配

    我們回到蜂蜜瓶的 JSON, 首先記得改回原本的圖樣。

    接著我們加上 override 並透過 CustomModelData 進行區分,匹配到不同的物件模型。

    JavaScript
    {
        "parent": "minecraft:item/generated",
        "textures": {
            "layer0": "minecraft:item/honey_bottle"
        },
        "overrides": [
            {
                "predicate": {
                    "custom_model_data": 932230
                },
                "model": "potions/2d_932230"
            }
        ]
    }

    而關於 2d_932230 這個 model, 其實長的跟一般的 header 一模一樣。

    JavaScript
    {
        "parent": "item/generated",
        "textures": {
            "layer0": "item/potions/932230"
        }
    }

    完成後我們進到 Minecraft,按下 F3 + T 進行材質包的刷新,此時手上的蜂蜜瓶應該變回原樣。我們接著輸入以下指令取得特定的屬性物品。

    JavaScript
    /give @s minecraft:honey_bottle[minecraft:custom_model_data=932230]

    此時可以看到兩瓶都是蜂蜜但材質與物件都分開了,透過這種方式可以造出無限可能。

    3. 後話


    但有些人可能覺得這藥水就是圖片在那邊浮空旋轉,我們就能透過 3D 建模的方式進行加強。

    但我自己是 3D 建模白癡,所以我採用 AI 模型協助生成,不太會操作且想省時間的千萬別錯過喔。

    4. 參考


    [1] Pack Format — Minecraft Wiki
    https://minecraft.wiki/w/Pack_format

  • Minecraft 1.20.5 物品參數更新

    Minecraft 1.20.5 物品參數更新

    0. 前言


    在許久沒碰觸電玩,近期回歸時發現從 1.20.1 已然到 1.20.6,而在 snapshot-24w09a (1.20.5) 時 MOJANG 針對物品格式做了全新調整,徹底改變了既有的操作。

    而又過短短的三周間 1.21 出來了,各大指令生成器也大概支援 1.20.5 的功能了,但還是讓我們透過 /give 指令大概了解新的格式究竟如何吧。

    1. 重點


    客製化道具敘述與樣貌會是製作大型地圖的基本功
    可以限制最大耐久度 max_damage 令武具一敲就斷,但建議附加 damage 讓道具顯示耐久條
    屬性變更對於地圖製作是密不可分,尤其關於自訂義道具
    搭配 effect 之效果格式製作客製化藥水還能自行設定時效
    善用冒險模式可防止玩家惡意破壞地圖破關
    盾牌的像素較差,要注意旗幟圖像變樣
    scale 放大或縮小並不會影響生物的移動速度

    2. 內容


    2.1. 附魔效果

    物品的直接附魔都是透過 enchantments 參數,其結構為:

    JavaScript
    {
    
      // 附魔項目與強度調整
    
      levels: {附魔_1”:強度,附魔_2”:強度}, 
    
      // 是否顯示附魔效果於資訊
    
      show_in_tooltip: true/false
    
    }

    而對於喜歡整人的朋友,擊退棒棒肯定是不可少的好夥伴

    JavaScript
    /give @p minecraft:stick[minecraft:enchantments={levels:{"minecraft:knockback":255}}

    我們再升級透過 enchantment_glint_override 不顯示附魔光輝,在外觀上就是單純的木棒

    JavaScript
    /give @p minecraft:stick[minecraft:enchantments={levels:{"minecraft:knockback":255}}, minecraft:enchantment_glint_override=false

    而對於地圖製作者,則可能聽過 StoredEnchantments,製作道具加強的素材,其附魔的結構也是相同的

    兩個的差異在於能否在鐵砧上使用,而預設情況前者為青色後者為黃色,這邊範例以 “保護 II”。而不同於原版的附魔書,StoredEnchantments 能夠融入任何素材。因此在地圖製作中由於無法限制玩家,其實很難用到該功能。

    而過於 Overpowered 的武器其修復成本往往會顯示 “Too Expensive”,我們則能透過 repair_cost=經驗等級 給予或限制用戶修復道具的可能

    2.2. 物品介紹

    在地圖製作中,製作特殊道具的情況更加普遍,此時重要的便是物品的介紹文字。

    物品名稱則以 custom_name 進行設定,以下示範幾種命名方式

    — 拒絕特殊字元

    JavaScript
    /give @p minecraft:iron_sword[minecraft:custom_name=Claymore]

    — 支援特殊字元

    JavaScript
    /give @p minecraft:iron_sword[minecraft:custom_name="\"Shiny Claymore\""]

    — 附帶特效文字

    要讓文字帶有特效與色彩就要依靠 text component,然而其格式編譯很長很麻煩,可以使用 https://minecraft.tools/en/tellraw.php 這份工具幫忙生成

    JavaScript
    /give @p minecraft:iron_sword[minecraft:custom_name='{"text":"Shiny Claymore","bold":true,"italic":true,"strikethrough":true,"underlined":true,"color":"yellow"}']

    而敘述 lore 的格式是相同的,只是要多包在 [ ] 之中。

    而在預設中 Minecraft 會顯示許多礙眼的資訊,圖中範例是 [5. 藥水效果] 的範例二,透過 hide_additional_tooltip={} 將效果進行隱藏。

    2.3. 耐久設定

    在劇情地圖中極具特殊性的道具要麼不會受損或壞得很快。

    若要讓物品不消耗耐久,我們則能添加 unbreakable,奇怪的格式是當你輸入這串時 MOJANG 就預設你要不壞,只需要設定是否顯示在道具資訊即可

    JavaScript
    /give @p minecraft:iron_sword[minecraft:unbreakable={show_in_tooltip:true/false}]

    而要生成一敲就爆的道具,我們只要將 damage 設為 9999,這種的道具是可以正常維修的

    JavaScript
    /give @p minecraft:iron_sword[minecraft:damage=9999]

    但今天我們設計了把秒殺劍,用戶肯定會不斷修復該道具,此時我們就能利用 max_damage 條件設置最大耐久為 1 強迫只能使用一次,或者你能創造比獄髓更耐用的工具

    JavaScript
    /give @p minecraft:iron_sword[minecraft:damage=9999, minecraft:max_damage=1]

    範例本身耐久已經見底,因此是無法維修的

    而直接使用 max_damage=1 的缺點則是缺少耐久條提示使用者,資訊尚未更新就被敲爆了

    JavaScript
    /give @p minecraft:iron_sword[minecraft:max_damage=1]

    2.4. 客製模型

    對於地圖材質包與客製物品 CustomModelData 一直以來是不可或缺的角色。在材質包能透過 override 改變許多樣態,而物品偵測相對 display:Name(且在現版本已無法使用)簡易許多。

    關於材質包中的簡單應用可參考 【此篇文章】,自製模型可參考 【英文影片】

    接著我們寫個敏捷護符,當用戶放在副手觸發,首先我們拿根羽毛作為代表,你可以自由修改 CustomModelData

    JavaScript
    /give @p minecraft:feather[minecraft:custom_name="\"Wind Charm\"", minecraft:lore=["\"You felt there's strong wind behind you.\""], minecraft:custom_model_data=2420001]

    這邊我們使用指令方塊 Repeat | Always Active

    JavaScript
    /execute as @a if items entity @s weapon.offhand *[minecraft:custom_model_data=2420001] run effect give @s minecraft:speed 1 5 false

    接著讓我們來測試效果

    2.5. 屬性變更

    一直以來物品的屬性變更是極具重要的方法,其不只能設定武器的傷害,或者提供 % 加成,甚至限制物品要裝備特定位置才會觸發設定的效果。

    這邊搬出有提供生成 /give 指令的網站 Gamer Geeks,目前也更新到 1.20.5 了,我們進入到 Attributes 分頁,必須說新的格式實在是長的有些噁心。

    關於 operation 分為三種, additive 直接加上指定數值,add_multiplied_base 是將增加幾倍給物品數值,而 add_multiplied_total 則是增加幾倍玩家總和數值。

    而在這網站目前缺少的便是前陣子炒熱的 scale,用來調整生物的大小。不過變成巨人走路的距離也沒有改變實在有點智障 … 

    JavaScript
    /give @a iron_chestplate[attribute_modifiers={modifiers:[{type:"generic.scale",amount:10,slot:chest,operation:add_multiplied_base,name:"generic.armor",uuid:[I;-124514,39357,205617,-78714]}]}]

    2.6. 藥水效果

    藥水作為冒險地圖最簡單的效果賦予方式,同時能強迫用戶考量使用時間,然而不靠指令沒有其他方法取得多狀態的藥水,因此也算常用的部分。

    我們不採用只能產出原版藥水的 potion ,統一使用 custom_contents 結合 effect 製作與定時,另外可以透過 custom_color 搭配 RGB 碼進行配色。

    範例 1: 兼具立即恢復 II 與 10s 回復效果 I
    JavaScript
    /give @p minecraft:potion[potion_contents={custom_effects:[{id:"minecraft:instant_health",amplifier:1,duration:1}, {id:"minecraft:regeneration", amplifier:0, duration:200}],custom_color:12257822}]

    範例 2: 瞬間回滿使用者血量但會造成噁心的副作用
    JavaScript
    /give @p minecraft:potion[potion_contents={custom_effects:[{id:"minecraft:instant_health",amplifier:255,duration:1}, {id:"minecraft:nausea", amplifier:0, duration:200}],custom_color:12257822}]

    而該參數能套用在 3 種藥水型態與藥效箭矢上,而前面在 [2. 物品介紹] 也提到如何隱藏藥水資訊

    2.7. 物品堆疊

    前面我們示範的藥水其預設不可堆疊的特性總是佔滿玩家的背包,我們便能透過 max_stack_size 進行設定

    JavaScript
    /give @p minecraft:potion[potion_contents={custom_effects:[{id:"minecraft:instant_health",amplifier:1,duration:1}]}, minecraft:max_stack_size=64]

    那要注意的是 max_stack_size 之間是不可混用的,即使比較小的 size 32 也是無法放入 size 64

    2.8. 冒險模式

    在多數情況我們並不希望玩家透過破壞地圖的手段跳過辛苦設計的關卡,尤其是解謎地圖更需要透過冒險模式與設定好的道具進行破關。

    那首先我們設計一把限制用來破牆的破舊石鎬

    JavaScript
    /give @p minecraft:stone_pickaxe[minecraft:can_break={blocks:'minecraft:cracked_stone_bricks'}]

    但地圖並不只有破壞,還常尋找門的鑰匙,而此時限制擺放位置能避免用戶無法回收導致卡關。

    JavaScript
    /give @p minecraft:light_weighted_pressure_plate[minecraft:can_place_on={blocks:'minecraft:iron_block'}]

    有更進階的需求,可以依靠以下方式,限制有向方塊的判斷

    JavaScript
    {predicates:{blocks:'minecraft:furnace',state:{facing:'north'}}

    2.9. 地圖範本

    在生存模式中你是否有過經驗,意外弄丟地圖導致無法複製?如果你記得編號就能夠利用以下介紹的指令將其拿回。但通常在生存中我們頂多再跑一趟建個新的地圖,從來沒人關心地圖編號。

    然而地圖製作者則可能需要給與特定地區的冒險地圖,因此需要紀錄特定的編號,作為任務道具或依此讓商人進行販售。此時就會用到 map_id 的參數。

    這邊順便介紹一個古早的工具 MC Map Item Tool ,你可以透過該工具將圖片轉成地圖檔,你只要接著將檔案更新到 .minecraft >> saves >> |地圖名稱| >> data 之中。那要注意如果是覆蓋舊的地圖且玩家在遊戲之中,拿起舊的地圖會讓暫存檔覆蓋掉我們剛上傳的新檔,請離開存檔後重新進入。

    那此時我要拿出生成好的地圖,切記要使用 filled_map 而不是空白的 map 喔。

    JavaScript
    /give @p minecraft:filled_map[minecraft:map_id=0]

    (圖片來源: 明日方舟頭像 3 by QuAn_ — pixiv

    而在通常我們所拿到的地圖會是黑色的字樣,此時能夠透過 map_color 與 RGB 碼進行調整。

    JavaScript
    /give @p minecraft:filled_map[minecraft:map_color=16711680]

    而實際上還有 map_decorations 用來在世界的指定座標加上標示(ex: 旗幟),但太麻煩了還不如編輯圖片並轉檔,還能夠自訂義任何想要的標籤。

    2.10. 旗幟製作

    在原版之中製作旗幟用織布機是非常簡單,但如果今天我們想要設計一個旗手(Standard Bearer)的職業,增強範圍內的友軍力量,此時就會牽涉到許多只能靠指令生成的部分,而旗幟就必須在過程中同時生成。

    各位可以找到如 Minecraft Banner Gallery 該網站尋找設計,但目前生成的指令大多還是舊版的縮寫模式,但目前需要使用設計的全名,各位需要依照該 Minecraft Wiki 中的 Resource Name 對照圖案進行設計。

    想想段考前我還必須撬開 .jar 檔 … 廢話不多說我們開始吧,指令順序與製作的工序是一樣的,此次範例我挑選該較簡單的旗幟

    我們複製指令下來先找個好用的編輯器修改圖樣與顏色的參數,順道將 Pattern 與 Color 改成小寫,刪除 Patterens: 與其 { } ,最後將 BlockEntityTag 改為更簡單的 banner_patterns 參數。

    JavaScript
    /give @p minecraft:white_banner[minecraft:banner_patterns=[{color:"black",pattern:"straight_cross"},{color:"white",pattern:"straight_cross"},{color:"black",pattern:"flower"},{color:"white",pattern:"flower"}]]

    那接著我們若想弄出一個蝦趴的盾牌,我們同樣要依靠 banner_patterns 設定圖樣,但此時我們知道盾牌是無法染色的,因此我們需要依靠 base_color 設定底色。

    但由於盾牌會縮小旗幟圖樣,直接用同樣辦法製作會拿到個白色盾牌,為了展示我刪除剛才的圖樣設定的最後道工序,將指令改成以下樣貌。

    JavaScript
    /give @p minecraft:shield[minecraft:base_color="white", minecraft:banner_patterns=[{color:"black",pattern:"straight_cross"},{color:"white",pattern:"straight_cross"},{color:"black",pattern:"flower"}]]

    2.11. 玩家頭顱

    依靠玩家頭顱設計裝飾或 NPC 也是常見的手法,而我們再也不用依賴長到天邊的 UUID,可以直接依靠玩家的名稱來取得頭顱了。

    JavaScript
    /give @p minecraft:player_head[profile={name:'CavalryHill'}]

    這邊再先推薦個網站 Minecraft Heads,上面有多樣的選擇可以使用還附帶搜尋功能。逛過各位能發現上面並沒有公開用戶名稱,但這個網站更新很快已經有提供 1.20.6 的程式碼了。以下取站上的一顆蘋果為案例。

    可以看到其多加了 properties: [{name:”textures”, value: “|TEXTURE VALUE|”}] 之架構,如果 datapack 需要自行客製化成就的時候還大概了解如何找起。

    JavaScript
    /give @p minecraft:player_head[minecraft:custom_name='{"text":"Apple","color":"gold","underlined":true,"bold":true,"italic":false}',minecraft:lore=['{"text":"Custom Head ID: 60982","color":"gray","italic":false}','{"text":"www.minecraft-heads.com","color":"blue","italic":false}'],profile={id:[I;661117833,194662243,-1247430837,-551990915],properties:[{name:"textures",value:"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjU0YTA5YzhlMzZjYzA5M2UzNzUzMjg3YTVjYWM0YjM3ZTU2NTRjYTUxOGM2NTgyYWI5OWNhYTk1MTM0NTk1ZSJ9fX0="}]}] 1

    2.12. 煙火設計

    說起來有些雞肋,再鞘翅出現的年代沒多少人注目煙火這過往奢侈的玩意兒。

    設計的方式是類似的,但 firework_explosion 是針對煙火球,而 fireworks 是針對做好的煙火。

    除了客製化結合許多設計之外,我要講的是 fireworks 的 flight_duration 參數,目前測試最大值是 159,其代表煙火飛升到爆炸的秒數,同時代表能給予鞘翅的驅動時長。在最大值之下飛過 1000 的高度都還綽綽有餘,但也代表不太適合作為跑圖的工具,因為 power 太強只能仰賴 crash landing 進行迫降 … 

    關於煙火的效果與 shape 參數可參考此篇 Minecraft Wiki 視覺化理解。

    JavaScript
    /give @p minecraft:firework_rocket[minecraft:fireworks={explosions:[{shape:'large_ball',colors:[16711680],has_trail:true}],flight_duration:2}]

    3. 後話


    在過程中我決定跳過許多功能,比如上膛的弩箭與不可撿取的功能,界伏盒與皮帶的內容物,磁石指針,要嘛是有點雞肋,要麼是結構簡單卻長。

    還是希望我所篩選下來的功能都能滿足多數,若覺得有缺少的也歡迎另做詢問。

    4. 參考


    [1] Snapshot Report
    https://www.minecraft.net/en-us/article/minecraft-snapshot-24w09a