Effect amplifier is read/written as byte from NBT despite being stored as an integer
The bug
Effect amplifiers are read/written as byte (-128 to 127) from/to NBT instead of an integer (-2,147,483,648 to 2,147,483,647) which is how it is stored in memory. This causes a change is behavior when the effect is reloaded from NBT is the amplifier is above 127.
How to reproduce
- Give yourself jump boost with an amplifier higher than 127 using /effect
/effect give @s jump_boost 100 128
- Try to jump
→ You cannot jump (see alsoMC-90198) - Reopen the world
→ You now have jump boost with an amplifier of -128 when read (though will be considered 0 when an amplifier obtained via NBT is less than 0)
Code analysis
Based on 1.12 decompiled using MCP 9.40 PRE 1
The methods net.minecraft.potion.PotionEffect.readCustomPotionEffectFromNBT(NBTTagCompound) and net.minecraft.potion.PotionEffect.writeCustomPotionEffectToNBT(NBTTagCompound) reads/writes the amplifier as a byte, while it is stored in-memory as an integer.
2017-06-21, 07:25 PM
2024-02-07, 12:08 PM
2024-02-01, 02:16 PM
19
15
Minecraft 1.12 - 23w51b
Minecraft 1.12, Minecraft 1.12.1 Pre-Release 1, Minecraft 1.12.1, Minecraft 17w50a, Minecraft 1.13.2, Minecraft 19w04b, 1.16.4, 20w46a, 21w06a, 21w16a, 21w17a, 1.17, 1.17.1 Pre-release 2, 1.17.1, 21w44a, 1.18.1, 1.18.2, 1.19, 1.19.1 Pre-release 4, 1.19.2, 1.19.3, 23w03a, 1.19.4 Pre-release 2, 1.19.4, 1.20 Pre-release 6, 1.20.1, 1.20.4, 23w51b