使用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等。
execute指令的接收資料使用的格式是integer,這導致非常多小數點資料在傳入的時候都會損失其精度,也因此才會衍伸出使用分離型的方式來儲存小數,不過這種方式也確實想對有限
int所能表示的值域大小是32bit,也就是2^32個數字,
而double可以表示2^53位數,這也意味著我們只能有效搬運前32位元的小數,之後的小數就不會這麼容易搬運了