Noise caves and Aquifers
- Noise caves are a new way of generating caves, providing more natural variety. They can get really huge sometimes! Noise caves come in three flavors:
- Cheese caves: Like the holes in swiss cheese. These often form caverns of various size.
- Spaghetti caves: Long squiggly tunnels, sometimes wide like tagliatelle
- Noodle caves: Thinner, squigglier, and more claustrophobic variant of spaghetti caves
- No, they aren’t loud. The “noise” part of noise caves is a technical term and has nothing to do with sound.
- The old cave carvers and canyons still generate, combining with the noise caves to form interesting cave systems
- As with carvers, noise caves form cave entrances where they intersect the surface
- An aquifer is an area with local water level, independent of sea level
- Aquifers are used during world generation to generate bodies of water inside noise caves
- This sometimes results in large underground lakes
- They can also form inside mountains and on the surface
- Aquifers below y0 will sometimes be lava aquifers instead of water aquifers
- Magma Blocks sometimes generates at the bottom of underground bodies of water
- Underwater cave carvers and underwater canyons have been removed, since aquifers are used to generate water in caves instead
Sprinting
- Previously, any collision with a block would reduce sprinting to walking. Now, for very minor angles of collision with a block, players retain their sprint. For larger angles of collision, the old behavior is retained.
Upgrading of old worlds
- The transition between new and old terrain is less “cliffy”
- Will surface height blend? Yes.
- Will biomes blend? Yes.
- Will caves blend? Your mileage may vary.
- In old chunks, if there is any Bedrock at y=0, the sections below non-air blocks will be filled with new generation
- The old Bedrock between y=0 and y=4 in old chunks gets replaced with Deepslate
- A new Bedrock layer is placed at y=-64
World generation
- Generation range and build limits have been expanded by 64 blocks up and 64 blocks down, to a total range of 384 blocks
- Underground features, structures, and caves generate all the way down to y-64
- Exception: Diorite, Granite, Andesite, and Dirt will not generate below y0
- Tweaked size and positioning of Diorite, Andesite, and Granite generation
- Dripstone clusters can no longer be found in normal caves, only in Dripstone Caves biomes
- Starting from y8 and below, Deepslate gradually replaces all Stone
- Deepslate blobs no longer generate above y0
- The terrain shape and elevation varies dramatically, indepedently from biomes
- For example, forests and deserts could form up on a hill without needing a special biome just for that
- Less Diorite, Granite, and Andesite generates above y 60
- Strips of Gravel can generate in stony shores
- Swamp trees can grow in water 2 blocks deep (instead of just 1 block deep)
- Removed water lake features, aquifers provide local water levels
- A bunch of biome variants with simular features but different shapes have been merged into one, since the shape is controlled independently now
- Renamed some biomes
- Geodes now only generate up to height 30
Technical
- Added an accessibility option to stop the sky from flashing during thunderstorms
- Added fall_from_height and ride_entity_distance advancement triggers
- Changed nether_travel to match other similar triggers
- Added an option to specify the audio device used by the game
- Replaced light and barrier particles with block_marker
- Replaced the clientbound chunk update network packet with another one that additionally contains light update data
- The separate light update packet still exists and is sent when a light update happens without a chunk update
- New video setting called “Chunk Builder”
- Changed the prioritization order of the chunk rendering pipeline
- Unrendered chunk holes in the world should not appear anymore while flying fast with high render distance
- View distance now causes chunks to load cylindrically around players instead of in a square
- Added “Toggle Sprint” and “Toggle Sneak” to the Controls settings
- Moved Keybinds out to their own settings screen, accessible from Controls
- Information about the world generation noise is now displayed on the debug screen
- Added illageralt, rune-like font from Minecraft Dungeons (currently only usable via commands)
- Added startup option --jfrProfile and command jfr to start profiling with Java Flight Recorder as well as a few custom events
- Loot table functions set_contents and set_loot_table now require a type field with a valid block entity type
- Added new loot table function set_potion
- The maximum amount of background threads are increased
- Worlds last saved before Minecraft 1.2 (pre “Anvil”) can no longer be opened directly
- Data pack format has been increased to 8
- Resource pack format has been increased to 8
- --report option in data generator now creates reference files for the entirety of the worldgen, instead of just the biomes
- Removed length limits for scoreboard, score holder, and team names
- Standalone server.jar now bundles contains individual libraries instead of being flat archive
- Size limit for server resource packs has been increased to 250 MB
- Servers can now set property hide-online-players to true in order to not send a player list on status requests
- New setting called “Simulation Distance”
- Mob spawners can now override light checks for spawning
- Added telemetry for world loading
Advancements
Changed triggers
nether_travel
- entered condition is renamed to start_position
- exited has been removed since it was identical to player.location
New triggers
fall_from_height
- Triggered when a player lands after falling
- Conditions:
- player - a player for which this trigger runs
- start_position - a location predicate for the last position before the falling started
- distance - a predicate for the distance between start_position and the player
ride_entity_in_lava
- Triggered for every tick when a player rides in lava
- Conditions
- player - a player for which this trigger runs
- start_position - a position where the riding started (first tick on lava)
- distance - a predicate for the distance between start_position and the player
Chunk Builder Setting
- This setting determines if chunk sections are updated immediately during a single frame, or asynchronously using threads
- “Fully Blocking” corresponds to the previous way chunks were updated, which prevents potential visual gaps when blocks are destroyed
- “Threaded” will significantly reduce stutters when blocks are placed or destroyed (especially with light sources), however brief visual gaps may rarely occur
- “Semi Blocking” is the middle-option, and will only immediately update chunks that are deemed important, otherwise updates occur asynchronously using threads
Java 17
Minecraft now uses Java version 17. If you are using a default setup, the Launcher will download and install the correct version. If you are using a custom Java setup, or a third-party launcher, you will need to ensure that your Java installation is version 17 or above.
JFR Profiling
Custom events
All events are enabled when starting the profiling using either jfr start command or --jfrProfile startup flag.
If profiling is started through any other means for monitoring purposes, only the ServerTickTime, LoadWorld and NetworkSummary are included by default.
- minecraft.ServerTickTime: periodic event (1 second intervals) exposing average server tick times
- minecraft.NetworkSummary: periodic event (10 second intervals) reporting total packet sizes and counts per connection
- minecraft.PacketReceived | minecraft.PacketSent: network traffic
- minecraft.ChunkGeneration: time taken to generate individual chunk stages
- minecraft.LoadWorld: initial world loading duration
Overview
Java Flight Recorder (https://openjdk.java.net/jeps/328) is the internal JVM profiling tool bundled with the Java Runtime to analyze performance and runtime characteristics.
It’s a useful tool for exposing internal JVM performance metrics as well as custom metrics that can be monitored or analyzed using any stock Java profiler or monitoring agents.
Profiling lifecycle
A profiling run can be started using any of the following alternatives:
The run will then be stopped either by:
- --jfrProfile startup flag when starting a Minecraft server or client
- jfr start in-game command
- Regular Java CLI tools such as jcmd
- shutting down the JVM
- jfr stop in-game command
- jcmd CLI tool
Reports
A summary JSON report is written both to the log file and in the debug folder accompanied by a .jfr recording ready to be analyzed in i.e JMC https://github.com/openjdk/jmc or any other profiler tool supporting the format.
Loot tables
Changed functions
set_contents, set_loot_table
Added new mandatory field type. This type will be written into BlockEntityTag.id, to make sure that this tag can be correctly migrated between versions.
New functions
set_potion
- Sets the Potion tag on any item
Parameters:
Maximum amount of background threads increased
- Various background tasks including worldgen are executed on a background thread pool
- The default thread pool size equals the amount of available CPU threads, minus one
- The upper thread pool limit has been raised from 7 to 255, which should help higher-end machines with improved world-gen performance
- The upper limit can be overridden via the max.bg.threads Java system property, for example when running multiple servers on a single machine
Mob spawning
- Monster spawning limits are now per-player, rather than global for each dimension
Old world conversion
- Worlds last saved before Minecraft 1.2 (pre “Anvil”) now require conversion in a previous version of the game to be able to be opened
- We recommend that you upgrade your old version, 1.2 (pre “Anvil”) or older, to version 1.6.4 - worlds opened for the first time in later versions will have incorrect biome information
Particles
block_marker
- Renders with a texture declared in the particle slot for a model assigned to the configured block state
- Is summoned with same syntax as the block particle (i.e. block_marker wheat[age=2])
Resource Pack format
- minecraft/textures/gui/container/inventory.png now contains an extra sprite for a thin-layout version of the effect list in the inventory
Server bundling
- server.jar now bundles individual libraries instead of merging all the files into a single archive
- This change is meant to solve certain problems related to Java modules
- On startup, server.jar will unpack libraries into a directory configured by bundlerRepoDir (default: working directory)
- To run a different main class other than the server, use the bundlerMainClass property (for example java -DbundlerMainClass=net.minecraft.data.Main -jar server.jar --reports) or unpack the jar manually and use the contents of META-INF/classpath-joined for command line
- If bundlerMainClass is empty, the program will just validate and extract files, and will then exit
- Server classes are now signed
Simulation Distance Setting
- A new slider which is available under video settings
- Entities, blocks, and fluids will not be updated outside of simulation distance
- Allows higher render distance with less CPU load
- There’s also a new simulation-distance property in the dedicated server properties
Spawner data changes
Example:
SpawnData: {
entity: {
id: "minecraft:cow"
},
custom_spawn_rules: {
sky_light_limit: {min_inclusive: 10, max_inclusive: 15}
},
}
SpawnPotentials: [
{
data: {
custom_spawn_rules: {
block_light_limit: {min_inclusive: 0, max_inclusive: 15}
},
entity: {id: "minecraft:pig"},
},
weight: 2
},
{
data: {
custom_spawn_rules: {
block_light_limit: {min_inclusive: 5, max_inclusive: 10},
sky_light_limit: {min_inclusive: 10, max_inclusive: 15}
},
entity: {id: "minecraft:panda"}
},
weight: 1
}
]
- Spawners now support the custom_spawn_rules NBT in the SpawnData field and the SpawnPotentials list
- custom_spawn_rules currently may contain fields block_light_limit and sky_light_limit - both are integer ranges with fields min_inclusive and max_inclusive
- To make SpawnPotentials format similar to other weighted lists, structure was changed to {weight: <int>, data: <previous contents without 'Weight', 'Entity' renamed to 'entity'>}
- To accomodate that change, previous contents of SpawnData were moved to SpawnData.entity (making format of that field same as elements of SpawnPotentials.data)
Telemetry
In this release, we are re-introducing diagnostic tracking, which was part of Minecraft: Java Edition until 2018. We are bringing it back to better understand our players and to improve their experience. Specifically this information will help us prioritise various aspects of development and identify pain points. All data is treated according to GDPR and CCPA best practices and is used to develop a better-performing and generally more enjoyable Minecraft: Java Edition.
- At this point, the only implemented event is world load
World Load event
- Sent when loading singleplayer world or connecting to multiplayer server
- Contains following information:
- launcher identifier
- user identitifer (XUID)
- client session id (changes on restart)
- world session id (changes per world load, to be reused for later events)
- game version
- operating system name and version
- Java runtime version
- if client or server is modded (same information as on crash logs)
- server type (single player, Realms or other)
- game mode
World Data: Chunk Format
- Removed chunk’s Level and moved everything it contained up
- Chunk’s Level.Entities has moved to entities
- Chunk’s Level.TileEntities has moved to block_entities
- Chunk’s Level.TileTicks and Level.ToBeTicked have moved to block_ticks
- Chunk’s Level.LiquidTicks and Level.LiquidsToBeTicked have moved to fluid_ticks
- Chunk’s Level.Sections has moved to sections
- Chunk’s Level.Structures has moved to structures
- Chunk’s Level.Structures.Starts has moved to structures.starts
- Chunk’s Level.Sections[].BlockStates and Level.Sections[].Palette have moved to a container structure in sections[].block_states
- Chunk’s Level.Biomes are now paletted and live in a similar container structure in sections[].biomes
- Chunk’s Level.CarvingMasks[] is now long[] instead of byte[]
- 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
World Generation
- Bedrock layers now generate dependent on the world seed
- New random number generator for overworld generation
Fixed bugs in 1.18
Get the Release
To install the release, open up the Minecraft Launcher and click play!
Cross-platform server jar:
Report bugs here:
Want to give feedback?
Del denne historie