0. 前言
在許久沒碰觸電玩,近期回歸時發現從 1.20.1 已然到 1.20.6,而在 snapshot-24w09a (1.20.5) 時 MOJANG 針對物品格式做了全新調整,徹底改變了既有的操作。
而又過短短的三周間 1.21 出來了,各大指令生成器也大概支援 1.20.5 的功能了,但還是讓我們透過 /give 指令大概了解新的格式究竟如何吧。
1. 重點
可以限制最大耐久度 max_damage 令武具一敲就斷,但建議附加 damage 讓道具顯示耐久條
屬性變更對於地圖製作是密不可分,尤其關於自訂義道具
搭配 effect 之效果格式製作客製化藥水還能自行設定時效
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 Reporthttps://www.minecraft.net/en-us/article/minecraft-snapshot-24w09a