Changed all custom names (blocks, items, entities, block entities) from raw strings to JSON text components (which can be translated).
For example, /summon pig ~ ~ ~ {CustomName:"Reuben"} is now /summon pig ~ ~ ~ {CustomName:"\"Reuben\""} or /summon pig ~ ~ ~ {CustomName:"{\"text\":\"Reuben\"}"}
Blocks
Wherever a , optionally [] and optionally [] was required, it's now a single argument that looks like this:
stone
minecraft:redstone_wire[power=15,north=up,south=side]
minecraft:jukebox{RecordItem:{...}}
minecraft:furnace[facing=north]{BurnTime:200}
ID is required (though just as before, if namespace isn't set it defaults to minecraft.
States are inside [], comma-separated and must be properties/values supported by the blocks. They are optional.
minecraft:stone[doesntexist=purpleberry] is a syntax error, because stone doesn't have doesntexist.
minecraft:redstone_wire[power=tuesday] is a syntax error, because redstone_wire's power is a number between 0 and 15.
NBT tag is inside {}, and works just like players would expect. It's optional.
The Flattening
Numeric block metadata completely phased out in favor of block states.
Split, merged, created, deleted, and renamed a lot of blocks, blockstates and items.
Blocks and items previously differing because of damage value have gotten their own id, for example white_wool instead of wool:0
Damage has been moved to the tag tag and is only used by tools and armor; maps use a map tag.
The damage predicate has been reversed - 0.6 now means 60% durability remaining, not 60% broken
Files and commands no longer use data or set_data.
Structures do not run an upgrade path for this.
To update structures, load them all in 1.12, then update to 1.13 and save all structures again.
Changed translation files from .lang (key=value) to .json ("key": "value").
Now supports newlines.
1.14:JSON text components
Block variant {"nbt": path, "block": "coordinates"}, where coordinates field uses same format as /setblock.
Entity variant {"nbt": path, "entity": selector}, where selector field uses same format as /kill.
Additionally, if field interpret is present and set to true, contents of selected tags will be interpreted as chat components.
Works same as selector components:
If there are no elements, returns empty string.
If there are multiple elements, merges them with.
Chunk format
Biome information now is stored in sixty-four 4×4 arrays, allowing biomes to be changed based on height; previously, biome values corresponded to only the X and Z coordinates.
The Biomes array in the Level tag for each chunk now contains 1024 integers instead of 256. Each number in the array is the biome for a 4×4×4 volume in the chunk. These 4×4×4 volumes are arranged by Z, then X, then Y. That is, the first 4×4 values in the array are for the 16×16 chunk, at Y levels 0–3, the next 4×4 is for Y levels 4–7, etc.
The floating-point precision used for the location of where certain particles and entities appear has increased to 64-bit (double-precision), from 32-bit (single-precision).
1.16:
Items and entities no longer keep unknown attributes.
Attribute names now use resource locations.
Names of some attributes have been renamed to meet resource location requirements (i.e., lowercase separated by underscores instead of camelCase)
Block storage format
Block storage format in chunks has been slightly changed to speed up various tasks (rendering, pathfinding, world generation, etc.).
BlockStates in Sections elements no longer contain values stretching over multiple 64-bit fields.
If the number of bits per block is not power of two (i.e. single 64-bit value can't fill whole number of blockstates) some bits will not be used.
For example, if a single block state takes 5 bits, the highest 4 bits of every 64-bit field will be unused. That also means a slight increase in storage size (in case of 5 bits, from 320 to 342 64-bit fields).
Models
All "block states" files have improved spacing, and now define the namespace when referring to the model.
All model files now define the namespace when referring to a different model.
NBT tags
The Dimension NBT tag is now a resource location string instead of a number, which is used in player.dat.
Superflat
Removed structure settings from flat level preset strings as it was broken due to the addition of customizable worlds.
World save files
Region files are now opened in synchronous mode to increase prevent data loss and corruption after a crash
World save format
Saving level.dat now uses randomly-named temporary files (instead of using level.dat_new every time).
player/*.dat are now saved in a way similar to level.dat (including leaving .dat_old files).
1.17:
Added flowering azalea leaves and flowering azaleas to the flowers block and item tags. (If it happens to interfere with the generation of flowers)
Technical
Java requirement changed from version 8 to version 16.
1.18:Structures
Are now hardcoded into world generation.
Chunk format
Chunk’s Level.Sections[].BlockStates & Level.Sections[].Palette have moved to a container structure in Level.Sections[].block_states.
Chunk’s Level.Biomes are now paletted and live in a similar container structure in Level.Sections[].biomes.
Chunk’s Level.CarvingMasks[] is now long[] instead of byte[].
Removed chunk’s Level and moved everything it contained up.
Level.Entities has moved to entities.
Level.TileEntities has moved to block_entities.
Level.TileTicks and Level.ToBeTicked have moved to block_ticks.
Level.LiquidTicks and Level.LiquidsToBeTicked have moved to fluid_ticks.
Level.Sections has moved to sections.
Level.Structures has moved to structures.
Level.Structures.Starts has moved to structures.starts.
Level.Sections[].block_states has moved to sections[].block_states.
Level.Sections[].biomes has moved to sections[].biomes.
Added yPos the minimum section y position in the chunk.
Added below_zero_retrogen containing data to support below zero generation.
Added blending_data containing data to support blending new world generation with existing chunks.
Chunk render pipeline
Changed the prioritization order.
1.19:Custom world generation
The dimension folder is no longer present in the vanilla world generation reference pack, but dimension files still work like they used to inside a custom data pack.
There's a new file type that the data report generator can output in the biome_parameters folder, containing all the biome parameters for the default vanilla dimensions.
Custom dimensions no longer require a separate seed field, and in fact can no longer have a custom seed - the world seed is now always used for all dimensions.
Dimension types now have two new fields for controlling monster spawns.
monster_spawn_block_light_limit is an integer controlling the block light needed to prevent monster spawns.
monster_spawn_light_level is an int provider which is evaluated to find a value to compare the current overall brightness with to determine if a monster should be allowed to spawn.
Renamed the feature field in location predicates to structure.
What might be interesting regarding the update:
Source
1.13:
The Flattening
Numeric block metadata completely phased out in favor of block states.
Split, merged, created, deleted, and renamed a lot of blocks, blockstates and items.
Blocks and items previously differing because of damage value have gotten their own id, for example white_wool instead of wool:0
Damage has been moved to the tag tag and is only used by tools and armor; maps use a map tag.
The damage predicate has been reversed - 0.6 now means 60% durability remaining, not 60% broken
Files and commands no longer use data or set_data.
Structures do not run an upgrade path for this.
To update structures, load them all in 1.12, then update to 1.13 and save all structures again.
Changed translation files from .lang (key=value) to .json ("key": "value").
Now supports newlines.
1.14: JSON text components
Block variant {"nbt": path, "block": "coordinates"}, where coordinates field uses same format as /setblock.
Entity variant {"nbt": path, "entity": selector}, where selector field uses same format as /kill.
Additionally, if field interpret is present and set to true, contents of selected tags will be interpreted as chat components.
Works same as selector components:
Chunk format
Biome information now is stored in sixty-four 4×4 arrays, allowing biomes to be changed based on height; previously, biome values corresponded to only the X and Z coordinates.
The Biomes array in the Level tag for each chunk now contains 1024 integers instead of 256. Each number in the array is the biome for a 4×4×4 volume in the chunk. These 4×4×4 volumes are arranged by Z, then X, then Y. That is, the first 4×4 values in the array are for the 16×16 chunk, at Y levels 0–3, the next 4×4 is for Y levels 4–7, etc.
The floating-point precision used for the location of where certain particles and entities appear has increased to 64-bit (double-precision), from 32-bit (single-precision).
1.16:
Items and entities no longer keep unknown attributes.
Attribute names now use resource locations.
Names of some attributes have been renamed to meet resource location requirements (i.e., lowercase separated by underscores instead of camelCase)
Block storage format
Block storage format in chunks has been slightly changed to speed up various tasks (rendering, pathfinding, world generation, etc.).
BlockStates in Sections elements no longer contain values stretching over multiple 64-bit fields.
If the number of bits per block is not power of two (i.e. single 64-bit value can't fill whole number of blockstates) some bits will not be used.
For example, if a single block state takes 5 bits, the highest 4 bits of every 64-bit field will be unused. That also means a slight increase in storage size (in case of 5 bits, from 320 to 342 64-bit fields).
Models
All "block states" files have improved spacing, and now define the namespace when referring to the model.
All model files now define the namespace when referring to a different model.
NBT tags
Superflat
World save files
World save format
Saving level.dat now uses randomly-named temporary files (instead of using level.dat_new every time).
player/*.dat are now saved in a way similar to level.dat (including leaving .dat_old files).
1.17:
Technical
1.18: Structures
Chunk format
1.19: Custom world generation
The dimension folder is no longer present in the vanilla world generation reference pack, but dimension files still work like they used to inside a custom data pack.
There's a new file type that the data report generator can output in the biome_parameters folder, containing all the biome parameters for the default vanilla dimensions.
Custom dimensions no longer require a separate seed field, and in fact can no longer have a custom seed - the world seed is now always used for all dimensions.
Dimension types now have two new fields for controlling monster spawns.