Technical Changes
- The resource pack version is now 18
- The data pack version is now 18
- History of used commands is now saved and accessible across worlds
- Optimized networking to improve the experience on low bandwidth connections
- Added support for multi-version packs
- Changed network protocol to allow for more data-driven content in the future
- Added new log-ips option to server.properties
- Added validation for symbolic links in datapacks and resource packs
- When hitboxes are displayed through F3+B, entities that have a passenger will display the passenger's attachment point
- The charts on the debug screen can now be toggled with F3+1 (pie chart) and F3+2 (FPS and TPS) instead of holding Shift or Alt while opening the screen
- Pressing F3+3 will now show charts for ping and received network traffic on the debug screen
- The LWJGL library has been upgraded to version 3.3.2
- The default Java version shipped with the game has been upgraded to Microsoft OpenJDK 17.0.8
Command History
- The last 50 commands that you sent in chat will be remembered across game sessions
- You can access the command and chat history by pressing up or down arrows in the chat
- Regular chat is only persisted within the same game session (leaving a server or world clears them)
- Recent commands are stored in command_history.txt in the game folder
Network optimizations
- Gameplay packets are now packed into bigger TCP packets to reduce overhead from TCP headers, significantly reducing network usage
- Chunks are not sent over the network to the client in one big continuous batch anymore
- Chunks are instead sent in smaller batches depending on the available bandwidth, meaning that:
- Clients with extremely low-bandwidth connections will not time out while loading the world
- Clients with low-bandwidth connections can interact with the world while some chunks are still loading
- Only chunks within the client's render distance are now sent
Multi-version Packs
New features have been added to datapacks and resource packs to allow creation of packs that are compatible with multiple versions of game.
Pack Metadata
- Pack metadata now includes an optional field supported_formats which describes a range for pack formats that this pack supports
- Examples: 16, [16,17], {"min_inclusive": 16, "max_inclusive": 17}
- pack_format field is still required and its format remains unchanged, to allow older game versions to read pack data
- If supported_formats is present, it must contain the value declared in pack_format
- Note: since this new information is ignored by older versions of the game, they will always see a "normal", single-version pack, without any extended compatibility
Overlays
- Packs can now contain overlay directories ("overlays")
- Overlays are sub-packs applied over the "normal" contents of a pack
- These directories have the same layout as the top-level pack, including the assets and data directories
- Overlays can be applied if they support the client's pack format
- Overlays can add and replace files, but not remove them
- For example, if the overlay foo is applied, the file foo/assets/minecraft/textures/bar.png will replace the contents of assets/minecraft/textures/bar.png
- pack.mcmeta and pack.png are ignored in overlay directories
- New section called overlays have been added to pack metadata
- It contains an entries field, containing a list of overlays
- Every overlay entry has two fields:
- formats - range of supported formats
- directory - overlay directory (allowed characters: a-z, 0-9, _ and -)
- Order of application: overlays are stacked from the bottom to top of the list
- For example, if a pack has two overlays: "entries": [{"directory":"A", ...}, {"directory":"B", ...}], the game will first look in B, then A and then in the top pack directory
Symbolic Link Validation
To improve safety, the game will now also detect symbolic links used inside data- and resource packs.
- This feature expands on symbolic link validation in worlds added in the previous release
- The game will now warn users if a pack added via drag and drop contains disallowed symbolic links
- Packs containing disallowed symbolic links will not be visible in UI and commands
- Additionally, directories and files that are not recognized as packs will no longer be copied via drag and drop
- For a detailed explanation, see this help article
Network Protocol
As part of ongoing work towards more data-driven features, the network protocol has been changed to include a new configuration phase.
- Configuration phase automatically starts after login phase (i.e. after client account has been verified) and lasts until the player joins the world (play phase)
- Clients can stay in configuration phase indefinitely - it's up to the server to release it to the world
- Servers can also request clients to re-enter the configuration phase after it has entered the play phase
- Other players will see such clients as disconnected
- Users in configuration phase will not be visible on the player list
- Actions allowed in configuration phase (moved from play phase):
- Configuration of data-driven registries
- Configuration of enabled features
- Actions shared between configuration and play phases:
- Application of server resource packs
- Update of tags
- Exchange of custom packets
- Ping and keep-alive packets
- Sending of client options
- The server will now negotiate resource packs in the configuration phase
- This means that the player will no longer be in the world when answering prompts and reloading resources
Secure Chat
- Clients will no longer disconnect themselves when receiving an invalid chat message
- A placeholder message will instead be shown in chat
server.properties
- New option: log-ips (default true)
- When set to false, will prevent player IPs from being included in the log when players join the game
Telemetry
- Added a button to the Telemetry Data Collection Screen that links to the Microsoft Privacy Statement
Resource Pack Version 16
- The process of upgrading your pack can be assisted by using this automated Slicer tool
- All textures containing multiple sprites in a sheet for GUI have been split into individual sprites under textures/gui/sprites (automated by the Slicer tool)
- All textures in the realms namespace have been moved into the minecraft namespace (automated by the Slicer tool)
- villager2.png has been renamed to villager.png (automated by the Slicer tool)
- icon/trial_available and realm_status/expires_soon GUI sprites are animated with .mcmeta declarations instead of individual sprites (automated by the Slicer tool)
- The Bundle tooltip background is now drawn as a nine-sliced sprite
- The icons for the Accessibility, Language, Realms News buttons have been split from their underlying button texture
- The Realms Invite button is now drawn as an overlay on the normal button texture
- The highlighted texture state for this button has been removed
- The highlighted states for Realms invitation number icons have been removed
- The exclamation marks on the notification\more.png have been removed
GUI Sprite Sheet
- Sprites used in GUI drawing have been split into individual sprite files instead of larger sprite sheets
- For example, widgets/button.png and widgets/button_highlighted.png have been split from widgets.png
- Each sprite can now be individually overriden by a resource pack instead of replacing the entire sheet
- Sprites are loaded into the gui atlas from the textures/gui/sprites directory
GUI Sprite .mcmeta
- Any sprite used in the GUI can now be animated using .mcmeta files, similar to other atlases
- icon/trial_available and realm_status/expires_soon are now animated this way
- Sprites in the gui atlas can now configure scaling behavior through a new gui section in .mcmeta files
- For example, button textures must be scaled based on how big the button should be
- The gui section in .mcmeta contains one scaling field:
- type: one of: stretch (default), tile, or nine_slice
- When stretch, the sprite will be stretched across the desired space
- No additional fields need to be defined
- When tile, the sprite will be repeated across the desired space, starting from the top-left
- width: number of pixels for this sprite to cover on-screen across its width
- height: number of pixels for this sprite to cover on-screen across its height
- When nine_slice, the sprite will be sliced into 4 corners, 4 edges, and 1 center slice, which will be tiled across the desired space
- width: number of pixels for this sprite to cover on-screen across its width
- height: number of pixels for this sprite to cover on-screen across its height
- border: the size in pixels that the border slices should cover on-screen, one of:
- Constant integer for uniform border size on all sides
- Object containing left, top, right, and bottom
Resource Pack Version 17
- The text field background is now a nine-sliced sprite at widget/text_field and widget/text_field_highlighted
- The scroll bar in lists and text fields is now a nine-sliced sprite at widget/scroller
Resource Pack Version 18
- The map_icons.png texture now contains new icons
Data Pack Version 16
- Gamerule randomTickSpeed now affects the rate of accumulation of Snow and Ice the same way it affects crops and other blocks affected by random ticking
- Added a random command
- Added support for function macros
- Changed Display entities' post-teleport interpolation
- Added new attribute generic.max_absorption
- Renamed belowName value in display slot argument in scoreboard command to below_name
- Game event changes
- New tags
Commands
random
A new command for randomizing values and controlling random sequences. The value and roll forms can be used to draw a random value. In the case of roll, the resulting value is also shown in chat for all players.
Syntax:
random value|roll <range> [<sequenceId>]
random reset *|<sequenceId> [<seed>] [<includeWorldSeed>] [<includeSequenceId>]
Parameters:
- range: A range of values to randomize between, inclusively
- For instance, 1..6 is a regular D6 roll
- sequenceId: The name of a random sequence to sample or reset
- seed: A seed to use for the random sequence after reset
- includeWorldSeed: A boolean [default: true] specifying whether to include the world seed when seeding the sequence
- false means the sequence will evaluate to the same regardless of which world the command is run in
- includeSequenceId: A boolean [default: true] specifying whether to include the sequence ID when seeding the sequence
- false means all sequences will evaluate to the same regardless of which name they have
By default, all sequences are seeded as 0, true, true. Using * instead of a sequence ID resets all sequences and sets the default parameters.
If no seed is specified, the sequence resets to the default parameters.
Note that random value|roll <range> used without a sequence id is available to non-operator players.
Functions
- A single backslash \ as the last non-whitespace character of a line now allows a command to be continued on the next line
- Leading and trailing whitespace of the following line are stripped before appending
Macros
Functions can now contain macro lines, making them Function Macros.
- Any line beginning with $ (as the first non-space character) marks a macro line
- A macro line also contains one or more substitutions in the form of $(variable)
- When calling a function macro a compound with data for all argument variables must be provided
Calling Function Macros
The function command has new forms:
function <id> <compound>function <id> with <data source> [<path>]
New Arguments:
- compound: A data compound, enclosed in {}
- data source: A data source specification, like what could already be used for data get
- path: An NBT path specification
Notes:
- The data source and path must specify a compound data entry
- The compound must contain one entry for each variable used in the macro
- More data may be present in the compound and if so is ignored
- Calling a non-macro function with a data compound is silently ignored
- When a macro is called, the values provided are substituted in place of the variable specifications and the resulting commands are executed
- Any syntax errors in the lines resulting from variable substitution result in the entire function call being skipped
Performance Considerations
Using a macro means commands must be re-evaulated after variable substitution. This has an extra cost compared to running pre-parsed functions.
Regular commands (non-macro lines) are still pre-parsed. Only commands with variable substitutions in them are parsed when a macro is called and the game will attempt to cache the result of a certain parameter set being used in a call.
This makes repeated calls with the same parameter set cheaper than new calls with different parameters, but an overhead still remains compared to regular functions. Note that only the values references by macro as parameters are included in this cache, so any extra data in the provided compound is ignored.
Display Entity Interpolation
- Display entities now start updating their client-side position and rotation on the first tick after an update
- In previous versions, updates were applied in the same tick, causing uneven motion
- The new behavior is similar to Armor Stands, mobs and players
- On the server, position and rotation are still updated immediately
- The duration of this interpolation is controlled by the field teleport_duration
- 0 means that updates are applied immediately
- 1 means that the Display Entity will move from current position to the updated one over one tick
- Higher values spread the movement over multiple ticks
- Please note that this value is clamped to avoid glitches due to periodic position updates
- The new value will apply only to position and rotation changes made after it changed
- That means any current movement will continue unchanged
- Note: behavior while riding remains unchanged from previous versions
Attributes
- Added new attribute generic.max_absorption
- generic.max_absorption acts similar to generic.max_health, but instead of being the upper bound for Health, it is the upper bound for AbsorptionAmount
- The mob effect absorption increases generic.max_absorption as well as fills the AbsorptionAmount to the max when applied
Game Events
- entity_roar and entity_shake game events have been removed and replaced with entity_action game event
Tags
- Added no_knockback damage type tag which causes knockback to not be caused by the damage itself
- Used in Vanilla for damage that is caused by events, such as explosions, which apply knockback separately
- Added non_controlling_rider to represent entities that don't override their vehicles movement control
- Added concrete_powder block tag for Concrete Powder blocks
- Added camel_sand_step_sound_blocks block tag for blocks that produce entity.camel.step_sand sound
Data Pack Version 17
- Changed mob effect storage on items, entities and block entities
- Added decal field to armor trim patterns (default: false)
- If true, the pattern texture will be masked based on the underlying armor
Mob effect storage changes
- The game no longer uses numeric values when storing mob effects to a world (so, for example, 4 becomes minecraft:mining_fatigue)
- Various mob effect fields have been renamed for consistency with new structures
Mob Effect Instance
This structure is used in many places, so its changes are described separately.
- Id -> id, also changed from number to string id
- Ambient -> ambient
- Amplifier -> amplifier
- Duration -> duration
- ShowParticles -> show_particles
- ShowIcon -> show_icon
- HiddenEffect -> hidden_effect, also since it's mob effect instance, changes apply recursively
- FactorCalculationData -> factor_calculation_data
Items
potion, lingering_potion, splash_potion, tipped_arrow
- CustomPotionEffects -> custom_potion_effects, contents tranformed as a list of mob effect instances
suspicous_stew
- Effects -> effects, for each entry:
- EffectId -> id, also changed from number to string id
- EffectDuration -> duration
Entities
mooshroom
- Removed EffectId and EffectDuration
- Added stew_effects with the same format as suspicious_stew.effects tag (i.e. list of effect id and duration)
area_effect_cloud
- Effects -> effects, contents tranformed as a list of mob effect instances
arrow
- CustomPotionEffects -> custom_potion_effects, contents tranformed as a list of mob effect instances
Players, Armor Stands and mobs
- ActiveEffects -> active_effects, contents tranformed as a list of mob effect instances
Block Entities
beacon
- Primary -> primary_effect, also changed from number to string id
- Secondary -> secondary_effect, also changed from number to string id
Loot Tables
- Added sequence loot function
- Contains 1 field:
- functions: an array of sub-functions to run in sequence
- Can also be declared as an inline array without a type
- This matches the existing behavior where loot function JSON files can be declared as an array of composite functions
- all_of predicates in loot tables can now be declared implicitly as an inline array without a type
- This similarly matches the existing behavior where loot predicate JSON files can be declared as an array of sub-predicates
- Block or fluid state property matchers in loot conditions no longer accept non-string values
- Any number or boolean value in a property matcher must be quoted
Data Pack Version 18
This data pack version removes the execute if function and return run functionality that existed for a time during the development of this version. Flaws with those commands (see bugs MC-264595, MC-264699 and MC-264710) require some substantial changes to fix, which we do not want to make close to a release.
These commands will instead be reintroduced early in the next snapshot series when we can take the time to iterate on and test them together with pack makers.
- Removed execute if|unless function command form
- Removed return run command form
- Numbers used as macro arguments are now always inserted without suffixes, regardless of numeric type
- Added game rule enderPearlsVanishOnDeath, controlling whether thrown Ender Pearls vanish when the player that threw them dies (default true, which matches the existing behavior in previous versions)
- Added damage type tag always_kills_armor_stands for damage types that should always fully kill an Armor Stand
Share this story