活了沒幾個版本的指令方塊邪教廢了。
Function macro是23w31a (1.20.2)的新東西。
基本上就是之前做的拼接指令,但比較快。
在function檔案內用$開頭標記這行是macro,然後用$(variable)把變數替換進來。
例如
$damage @p $(value)
呼叫這個function的時候,用NBT的格式傳參數
function f {value: 3}
或是指定NBT資料來源
function f with storage name path
(跟data get一樣,也可以with block或with entity)
變數只能是普通的名稱,不能用.指定路徑,所以參數都要放在最上層。
function macro是超純的字串拼接,如果給{value: 3.0d},上面那個macro拼湊出來的指令就會變成
damage @p 3.0d
然後執行失敗。
所以小數要事先取substring [0, -1)轉成字串再傳。
更:Mojang發現這個很麻煩,現在會幫忙刪掉字尾了。
甚至離譜一點,macro寫成
$$(command)
也沒問題,參數傳一條完整的指令就會動了。
聽說有人測試,即使macro比普通的function指令慢,也還是比以前的execute if指令樹快。
所以是個能用的新科技。
列舉幾個應用方式
用變數值當指令參數(例如damage)
可翻譯的tellraw遊戲劇情
用類似story.dialogue24_$(counter)的翻譯字串ID搭配計分板算句數,可維護性會比較高
仿伺服器的sidebar用法
包括動態標題、用分數排序假玩家名
更:謝謝Mojang,現在有score display可以做排序顯示了
剩下的小事,某些QOL更新把我的隨機數資料包報廢了,可疑的燉湯走入歷史。