Technical Changes
- Improved performance of the light engine
- The data pack version is now 15, accounting for sign data format, item display orientation and advancement changes
- Removed update_1_20 feature flag and built-in datapack - features are no longer experimental
- Added a return command
- Tweaked display entity interpolation
- Added a capped rule structure processor that limits the number of replaced blocks for a structure piece to a configured maximum
- Configuring block entity fields in a rule processor rule is now delegated to a referenced block_entity_modifier instead of the previously fixed output_nbt configuration
- Random sequences for loot tables are now deterministic
- Added a reference loot table function
- Loot table condition/predicate changes:
- Renamed alternative to any_of
- Added all_of
- Advancement trigger changes:
- Added recipe_crafted
- Changed format of placed_block, item_used_on_block and allay_drop_item_on_block triggers
- Ingredients in array form are now also allowed in smithing_trim and smithing_transform recipes on fields template, base and addition
- Those fields also allow empty arrays, which signalize that slot needs to be left empty
- Added new damage types: outside_border and generic_kill
- Game events have changed vibration frequency and some have been removed
- The resource pack version is now 15, accounting for the font and credits update
- Updated the sprite layout of minecraft.png
- Removed the overriding minecraft.png from the Programmer Art resource pack
- Updated the sprite layout of invite_icon.png
- legacy_unicode glyph provider has been removed
- Bitmaps used by uniform font have been removed
- uniform font has been updated to use Unifont 15.0.06
- That changes shape of multiple characters, while also adding support for new ones
- Combining characters no longer include circle overlayed over them (so M◌̆ now renders as M ̆)
- Added second level of organization of entries in credits.json on top of titles, called disciplines
- Font textures are included in debug texture dump (F3 + S)
- Added new font glyph providers: unihex and reference, removed legacy_unicode
- Added support for Quick Play
- Removed the server & port commandline arguments as their functionality has been replaced by Quick Play
- Updates to telemetry
- Changed encoding of server.properties to UTF-8
- Added validation for symbolic links in world saves
Light Engine
The light engine is responsible for calculating the brightness of each block in the world.Light is calculated during world generation as well as updated when a block is changed in the world.Behavior of the light engine has not been changed.
- The performance of calculating light has been improved
- Reduces one source of lag spikes when crossing chunk borders
- Improves FPS in situations when a lot of light updates occur
- Improves how quickly chunks can be generated
Commands
return
The return command can be used to control execution flow inside functions and change their return value. Effects:
- Remaining separate top-level commands in the currently executing function (if any) are skipped
- The result value of the function command that triggered the function is changed from the number of commands executed to value
- The result value of the return command is also value
Syntax:
return <value>
Parameters:
- value: An integer return value
data
- string data sources now accept negative boundaries, which are interpreted as index counted from the end of the string
Display Entity
Interpolation Changes
- Previous values are always discarded if interpolation_duration is 0
- Made sure that render properties are applied at the same time (so block_state is applied at the same time as transformation, i.e. at the next tick after receiving an update)
- Display entities are not rendered until their initial data is received. That means display entities might not be shown on the first tick.
- Note: due to how the game handles updates, changes to entities made after summoning might be delivered to clients within a later tick
Rendering Changes
- item_display items have been rotated 180 degrees around the Y axis to better match the transformation that is applied when rendering items on an Armor Stand head and in Item Frames
- For reference, the order of transformations applied to model (starting from innermost) is item_transform, rotate Y 180, transformation field, entity orientation (billboard option + Rotation field + Pos field)
Structure post-processors
Capped post-processor
- A capped post-processor has been added which can limit how many blocks a delegated post-processor randomly transform in a structure
- This can be used to configure a structure piece to have an exact amount of specific blocks, instead of using random distribution
- The capped post-processor has following required parameters:
- delegate A post-processor which performs the actual block transformation
- limit Maximum amount of blocks that the delegated post-processor can transform
- The blocks inside a structure are all randomly passed to the delegated post-processor until it has transformed the limited amount
- Either constant or random number generator sampled during post-processing
Rule post-processor block entity configuration
- Previously a rule could specify an optional fixed output_nbt which would be added to the processed output block entity
- This field has now been changed to reference a block_entity_modifier
- Existing block_entity_modifier's are:
- passthrough Retains existing fields on the block entity
- This is the default if no block_entity_modifier is specified
- append_static Similar to previous output_nbt this provides fixed fields to add to the block entity
- A minor change is that this modifier appends configured fields to the processed block instead of replacing existing fields
- clear Removes any existing fields on the block entity
- append_loot Appends a loot table and seed to the block entity through required parameter:
- loot_table Referenced loot table to add to block entity as LootTable field
- Field LootTableSeed is also added to the block entity using random seeded by block position
Loot Tables
Random Sequences
The game now uses named random sequences to deterministically produce loot for loot tables. Each random sequence produces a unique sequence based on the world seed and sequence ID, which means a loot table will produce the same results when ran with the same parameters in the same world.
The ID of the random sequence to use for a loot table is specified in a new optional field called random_sequence. If no sequence name is given, loot is drawn using a non-deterministic random source.
reference
New function reference allows functions to call sub-functions (similar to reference condition).
Fields:
- name - location of function to call
any_of/all_of
- Loot condition alternative has been renamed to any_of
- Added new loot condition all_of that passes only when all sub-conditions pass
- Has the same syntax as any_of
Advancements
New Triggers
recipe_crafted
- Triggered when crafting a recipe
- Conditions:
- recipe_id - the resource location of the recipe crafted
- ingredients - an array of predicates for the item stacks used in the recipe
- A single item stack can only be used to fulfill one predicate
- Each predicate needs to be fulfilled to trigger the advancement. This allows for separation between recipes that have same identifier but use different ingredients.
- This field is optional. When not provided, or left empty, only the recipe_id will dictate the success of the trigger
Changed Triggers
- All fields in placed_block, item_used_on_block and allay_drop_item_on_block have been collapsed into a single location field
- The new location is similar to the player field - it is a list of loot conditions/predicates
- All conditions in this list must match for a trigger to run
- Conditions are evaluated in a new loot context called advancement_location. It has access to:
- Player as this entity
- Position of the placed block
- Block state of the placed/interacted block
- Held/used item as "tool"
- Migration guide:
- Contents of old location field should be migrated to location_check condition
- Contents of item field should be migrated to match_tool condition
- Contents of block + state fields should be migrated to block_state_property condition
Example (from make_a_sign_glow advancement):
Before:
{
"conditions": {
"item": {
"items": [
"minecraft:glow_ink_sac"
]
},
"location": {
"block": {
"tag": "minecraft:all_signs"
}
}
},
"trigger": "minecraft:item_used_on_block"
}
After:
{
"conditions": {
"location": [
{
"condition": "minecraft:match_tool",
"predicate": {
"items": [
"minecraft:glow_ink_sac"
]
}
},
{
"condition": "minecraft:location_check",
"predicate": {
"block": {
"tag": "minecraft:all_signs"
}
}
}
]
},
"trigger": "minecraft:item_used_on_block"
}
Damage Types
- Players outside the world border are now hurt by the damage type outside_border instead of in_wall
- Forcibly removing an entity using the /kill command now uses damage type generic_kill instead of out_of_world
Tags
Block Tags
- Removed replaceable_plants since it was only used as a subset of the blocks for the tag above, and not as universally
- Added replaceable_by_trees to better express blocks that are replaced when the tree grows through them
- Added replaceable with all the blocks that can be replaced
- This tag only represents the internal state of the game, changing this tag does not make blocks replaceable
- Added sword_efficient to represent blocks that are broken 50% faster by a sword than normal
- Added maintains_farmland to represent which blocks will not cause farmland to be converted into dirt due to drying out when placed on top of it
- Added combination_step_sound_blocks that controls which blocks produce a combination of step sounds
- Added enchantment_power_provider to control which blocks increase the level of an Enchantment Table
- Added enchantment_power_transmitter to control which blocks are allowed between an Enchantment Table and a Bookshelf (or other Power Transmitter)
- Added vibration_resonators to control which blocks transmit vibration signals when placed next to Sculk Sensors
- Added trail_ruins_replaceable for blocks that Trail Ruins can replace when generating
- Added sniffer_diggable_block to control which blocks Sniffers can dig
- Added sniffer_egg_hatch_boost to that control on which blocks Sniffer Eggs hatch twice as fast
- Added ceiling_hanging_signs
- Added wall_hanging_signs
- Added all_hanging_signs
- Added stone_buttons block tag
- Added cherry_logs block tag
- Added bamboo_blocks block tag
Item Tags
- Added villager_plantable_seeds to represent which kind of seeds Villagers can farm
- Added noteblock_top_instruments to control which blocks can be placed on top of Note Blocks without sneaking
- Added breaks_decorated_pots to control which tools can break Decorated Pots
- Added decorated_pot_ingredients
- Added decorated_pot_sherds
- Added sniffer_food
- Added trimmable_armor
- Added trim_materials
- Added trim_templates
- Added stone_buttons item tag
- Added cherry_logs item tag
- Added bamboo_blocks item tag
Biome Tags
- Added has_structure/trail_ruins
Game Events
- Removed piston_contract game event in favor of block_deactivate
- Removed piston_extend and dispense_fail game events in favor of block_activate
- Many game events have new vibration frequencies:
- 1: step, swim, flap
- 2: projectile_land, hit_ground, splash
- 3: item_interact_finish, projectile_shoot, instrument_play
- 4: entity_roar, entity_shake, elytra_glide
- 5: entity_dismount, equip
- 6: entity_mount, entity_interact, shear
- 7: entity_damage
- 8: drink, eat
- 9: container_close, block_close, block_deactivate, block_detach
- 10: container_open, block_open, block_activate, block_attach, prime_fuse, note_block_play
- 11: block_change
- 12: block_destroy, fluid_pickup
- 13: block_place, fluid_place
- 14: entity_place, lightning_strike, teleport
- 15: entity_die, explode
Fonts
New unihex Glyph Provider
- New glyph provider for reading Unifont HEX files
- HEX format describes font glyphs using a bitmap
- The height of every glyph is 16 pixels
- The width of glyph can be 8, 16, 24 or 32 pixels
- Every line is made of two hexadecimal numbers separated by :
- The first value describes a codepoint - it must have 4, 5 or 6 hex digits
- The second value describes the glyph as a stream of bits, line by line
- When rendering, empty columns on left and right side of glyphs are removed
- Custom glyph widths can be set with size_overrides
- This provider requires two fields:
- hex_file - path to ZIP archive containing one or more *.hex files (files in archive with different extensions are ignored)
- size_overrides - list of codepoint ranges that should have width different from auto-detected (based on empty space in glyph). Fields:
- from, to - start and end of codepoint range (inclusive)
- left, right - integers describing the position of the left-most and right-most columns of the glyph in range
- Any bits in columns outside of this range will be discarded
New reference Glyph Provider
- New glyph provider that can be used to include providers from other fonts
- Providers are guaranteed to be loaded only once, no matter how many times they are included
- Provider has one field id, that describes another font to be included in the currently loaded one
- Inclusion is performed after all fonts are loaded, so it will include all providers for a given font defined in all datapacks
Removed legacy_unicode Glyph Provider
- The legacy_unicode glyph provider has been removed
- This functionality has been replaced by the unihex provider
Quick Play
- Added support for four new command line arguments that allow the game to be launched directly into a world
- quickPlayPath takes a specified path for logging (relative to the run directory)
- If a path is provided the following will be logged upon joining a world:
- type: is either singleplayer, multiplayer, or realms
- identifier: represents the world you want to join
- For singleplayer, the folder name of the world
- For multiplayer, the IP address of the server
- For realms, the Realms ID
- port: represents the server port and is only logged for multiplayer
- name: The name of the world
- gamemode: The gamemode of the world
- lastPlayedTime: The time you joined the world
- Example:
- --quickPlayPath "quickPlay/log.json" will resolve into .minecraft/quickPlay/log.json
- quickPlaySingleplayer, quickPlayMultiplayer and quickPlayRealms all take their respective identifier
- If one of these arguments is provided, the game will try to launch directly into the given world
- Examples:
- --quickPlaySingleplayer "New World"
- --quickPlayMultiplayer "localhost:25565"
- --quickPlayRealms "1234"
Telemetry
All Events
- Added new property: launcher_name
- This is set based on the minecraft.launcher.brand system property
- This will help us troubleshoot game launch related bugs more effectively, as we will be able to see whether the issue originated in the Minecraft launcher or a third-party program
Updated Required Events
- world_loaded
- Added new property: realms_map_content
- When loading into a Realms Map Content world (Minigame), the world_loaded event will receive the name of that map
- This is to help us understand how Java Realms players interact with Java Realms adventure or minimap content
New Optional Events
- advancement_made
- This event is triggered when a player completes an advancement, and allows us to see the advancement ID and the time when the advancement was completed
- This helps us as a studio understand player progress and limits, which informs our game design
- game_load_times
- This event is triggered when the game client is loaded
- Includes the time it took for the client to load
- This is so that we can work on improving and reducing the time it takes to load the game client
server.properties
- File is now read in UTF-8 initially, with previous encoding (ISO 8859-1/Latin 1) as a fallback
- File is now written with UTF-8 encoding
Symbolic Link Validation
To improve safety, the game will now detect symbolic links used inside world directory. For a detailed explanation, check our help article.
- If the target of a symbolic link is not on the user-configured allow-list, the game will not proceed with loading the world
- Note: the world directory itself can still be linked
- The list of allowed symbolic link targets is stored in file allowed_symlinks.txt in the client or server top directory
- The file consists of entries (one per line) with following formats allowed:
- Lines starting with # are comments and are ignored
- [type]pattern, where type can be glob, regex or prefix
- prefix matches start of path with given pattern (so for /test paths /test, /test/ and /test/foo.txt would match)
- regex matches regular expression against whole path
- glob uses OS-specific path matching mechanism (for example *.txt would usually match files with txt extension)
- Note: paths will use OS-specific separators
- pattern, which uses default prefix type
Fixed bugs in 1.20
Around 250 bugs were fixed in this release. View the list on the issue tracker.
Get the Release
To install the Release, open up the Minecraft Launcher and click play! Make sure your Launcher is set to the "Latest Release” option.
Cross-platform server jar:
Report bugs here:
Want to give feedback?
Compartilhe esta história