(1) using item's modifiers to get attribute

為什麼要用此方法

使用item來處理的話會有很多好處,
包含可以直接使用datapack下提供的item_modifiers來快速

例如使用此json檔直接取得stack中末兩位的數值放入物品的attribute中,用於計算其加法

[ { "function": "minecraft:set_attributes", "modifiers": [ { "attribute": "minecraft:generic.movement_speed", "name": "add", "amount": 0, "operation": "addition", "slot": "feet" }, { "attribute": "minecraft:generic.movement_speed", "name": "add", "amount": 0, "operation": "addition", "slot": "feet" } ] }, { "function": "minecraft:copy_nbt", "source": { "type": "minecraft:storage", "source": "minecraft:calc" }, "ops": [ { "source": "stack[-2]", "target": "AttributeModifiers[0].Amount", "op": "replace" }, { "source": "stack[-1]", "target": "AttributeModifiers[1].Amount", "op": "replace" } ] } ]

問題點

修改實體身上的物品之AttributeModifiers標籤,並不能使attribute的變化立刻生效,必須等待1-tick完成變更

替代解法

保留使用item_modifiers的方式來產生需要的modifiers,
最後在合併的時候將物品裡的AttributeModifiers合併至實體的Modifiers下,
在合併過程會自動去除不必要的資訊,如Slot、AttributeName等,
可以免去一些中間的繁瑣過程,如設定UUID、將數值放入Amount等。


(2) Precision on transition of execute command

問題點

execute指令的接收資料使用的格式是integer,這導致非常多小數點資料在傳入的時候都會損失其精度,也因此才會衍伸出使用分離型的方式來儲存小數,不過這種方式也確實想對有限

int所能表示的值域大小是32bit,也就是2^32個數字,
而double可以表示2^53位數,這也意味著我們只能有效搬運前32位元的小數,之後的小數就不會這麼容易搬運了