Hacker News

Minecraft: Java Edition now uses SDL3

Happy Snapshot Tues... Thursday? Yes, you read that right! As we've entered peak vacation season here in Sweden, snapshots might not come out on their usual schedule.

In today's snapshot we have switched the library used for window management, input and platform integration from GLFW to SDL3. We have also added new item components for custom furnace fuels, as well as several technical changes for signs, world generation and loot tables.

Happy mining!

Known Issues

  • Exclusive fullscreen mode on Windows may cause the game to crash in certain situations, especially when using multiple monitors
  • Entering Exclusive fullscreen mode crashes the game on Wayland

New Features

  • Players in spectator mode can now interact with portals to teleport

Changes

Minor Tweaks to Blocks, Items and Entities

  • Armadillos no longer try to roll up when submerged in liquids

UI

  • Removed the Raw Input mouse setting
  • Mouse input now always uses relative mouse mode while playing in-game
  • Key bindings now use physical keys instead of keyboard-layout-specific key codes
  • Borderless Fullscreen is now the default fullscreen mode
  • Switching between Borderless and Exclusive Fullscreen no longer requires restarting the game
  • Exclusive fullscreen mode on macOS is no longer supported
  • The minimum window size is now 320 by 240 pixels
  • On macOS, holding a key while entering text now displays the native accent and candidate popup
  • On Linux systems, the game will now use and prefer Wayland natively if available

Debug Overlay

  • The debug overlay now supports a separate GUI scale than the rest of the game
  • This is customizable through the Debug Options screen, F3 + F6
  • The default scale is "Auto", which tries to stay at a higher resolution than normal
  • Another option is "Unchanged", which matches your regular GUI scale
  • The rest of the options work the same as in the normal "GUI Scale", controlling the scale directly
  • Added a player_speed debug entry that displays the speed of the player in blocks per tick
  • The debug overlay now shows the display refresh rate

Creative Inventory

  • Reordered mineral item and block ordering to have non-tiered ingredients up first, then tiered ingredients that craft into equipment last
    • Ingredients
      • Non-tiered minerals
      • Unrefined tiered minerals
      • Refined tiered minerals
      • Nuggets
      • Ingots
    • Building Blocks
      • Non-tiered mineral blocks and variants
      • Refined tiered mineral blocks and variants
      • Copper block family
  • Copper Blocks continue to be pushed to the end of the order in Building Blocks since they have a large list of content
  • Ingredients
  • Improved ordering of Natural Blocks tab so that all inner ordering of group content sequentially progresses from Overworld -> Nether -> End to stay consistent with other tabs

Technical Changes

  • The Data Pack version is now 111.0
  • The Resource Pack version is now 92.0

Loot Table Types

Loot table types that have a dedicated registry now support registry element and tag references. This means that the majority of fields of such types that previously accepted single elements will now accept either a namespaced ID or an inline value, while fields that previously accepted lists can now accept an inline value, a single namespaced ID, a list of namespaced IDs, a list of inline values, or a hash-prefixed tag ID.

Affected types:

  • minecraft:advancement
  • minecraft:item_modifier
  • minecraft:loot_table
  • minecraft:number_provider
  • minecraft:predicate
  • minecraft:recipe
  • minecraft:slot_source

Existing reference types for predicates, item modifiers and slot sources are now obsolete and have been removed.

Windowing and Input Backend

  • Minecraft now uses SDL3 instead of GLFW for window management, input and platform integration
  • Keyboard input now uses SDL scancodes for physical key positions and SDL keycodes for layout-dependent text editing shortcuts

Data Pack Version 111.0

  • Signs no longer automatically execute click events in custom text

Commands

Changes to spreadplayers

  • Whether a block is safe to spread a player to is now controlled by the #entities_can_teleport_to block tag

Environment Attributes

Added minecraft:gameplay/natural_mob_spawns

Defines mob spawns in an Environment Attribute Source. During worldgen placement, only Dimensions and Biomes will apply this Environment Attribute.

Format: object with fields:

  • spawns_by_category - map of spawn category to weighted list of spawn data
    • Spawn data format: object with fields:
      • type - entity type, the entity to spawn
      • count - int provider, amount to spawn
  • Spawn data format: object with fields:
    • spawn_costs - map of entity type to object with fields:
      • energy_budget - float, energy change allowed per spawn
      • charge - float, how much existing mobs will attract or repulse other charged mobs
    • spawns_by_category - map of spawn category to weighted list of spawn data

Available attribute modifiers:

  • overlay - For each mob category, overrides the lower layer's spawn settings with the higher layer's, unless the category is not included. Merges each layer's spawn costs together, overriding the lower layer's spawn costs with the higher layer's if both define the same entity type.
  • overlay - Default: Empty

Added minecraft:gameplay/creature_world_gen_spawn_probability

Sets the probability to run an iteration in which mobs defined to spawn in the creature mob category will spawn during world generation. Only Dimensions and Biomes will apply this Environment Attribute.

Format: float with range [0,1)
Default: 0.1

Changed minecraft:visual/ambient_particles

  • Now supports interpolation between Timeline keyframes (probabilities will be crossfaded)
  • Introduced support for new modifier: append
  • Unlike override which totally replaces the particle list, this modifier concatenates all elements with the layers below

Data Components

Added minecraft:cooking_fuel

Describes an item that can be used as fuel for a Furnace, Smoker or Blast Furnace.

Format: object with fields:

  • burn_time - namespaced ID pointing to an element of minecraft:number_provider registry representing the time, in ticks, for which this fuel will burn
  • speed_multiplier - namespaced ID pointing to an element of minecraft:number_provider registry representing the speed of the cooking/smelting

Added minecraft:brewing_fuel

Describes an item that can be used as fuel for a Brewing Stand.

Format: object with fields:

  • uses - namespaced ID pointing to an element of minecraft:number_provider registry representing the number of times this fuel will brew before being consumed
  • speed_multiplier - namespaced ID pointing to an element of minecraft:number_provider registry representing the speed of the brewing

Note: the #brewing_fuel item tag has been removed and will no longer function to register new brewing fuels.

Added minecraft:sign_text_front and minecraft:sign_text_back

Two identical components that represent text in front and back of a sign. Contents will be displayed in item tooltip.

The format is the same as front_text and back_text fields on minecraft:sign and minecraft:hanging_sign block entities, i.e.:

  • messages - a list of text components
  • filtered_messages - an optional list of text components, if omitted, it will be set to the same value as messages
    • messages and filtered_messages must have same entry count
  • color - optional dye color, default: black
  • has_glowing_text - optional boolean, default: false

Added minecraft:waxed

A marker for blocks with contents that are waxed. No fields.

Added minecraft:cushion/color

Applied to Cushion entities when they get placed using an item.

Format: one of 16 dye colors

Added minecraft:villager_food

Represents items that Villagers can eat. Villagers will pick up items with this component in addition to items in the #villager_picks_up tag.

Format: object with fields:

  • nutrition - positive integer, how much hunger the item satiates in the Villager once eaten

Added minecraft:mob_visibility

Represents the visibility percentage provided by an item with the appropriate minecraft:equippable component, modifying the range at which mobs are able to detect an entity.

Format: object with fields:

  • targeting_entity - an entity ID, a list of namespaced entity IDs, or a hash-prefixed entity tag to match
  • visibility - float (between 0.0 and 10.0), with 0.0 reducing the range at which mobs detects the entity to 2 blocks while 10.0 increases the detection range tenfold

While multiple items with this component stack, the maximum vision will still never exceed 10.0.

Block Entity Data

Changed minecraft:sign and minecraft:hanging_sign

  • By default, commands and other click events contained in Sign text are no longer executed when the block is clicked
  • Additionally, text components on newly placed Signs are no longer resolved by default
  • New boolean field called allow_op_features (defaults to false) has been added to restore previous behavior
  • Placed Signs and items with the minecraft:block_entity_data component containing Sign data stored in worlds saved before this version will have allow_op_features set to true
  • Any newly created Sign will need to have that field set explicitly
  • Changed the rules for opening the Sign edit screen after a block is placed:
    • Previously, the screen would open unless minecraft:block_entity_data was applied successfully
    • Now, the screen will open only if it could be opened normally by clicking the block (i.e. it's not waxed and only has editable text on the front side)
  • Signs will now accept and return the minecraft:sign_text_front, minecraft:sign_text_back and minecraft:waxed components

Changed minecraft:brewing_stand

The following fields are now stored as integers rather than shorts:

  • Changed the BrewTime field from a short to an integer, this is the amount of time that the current brewing process has taken so far
  • Changed the Fuel field from a byte to an integer, this is the amount of fuel remaining

The following new fields have been added:

  • Added the total_brew_time integer field, this is the total amount of time the current brewing process will take
  • Added the total_fuel integer field, this represents the amount of fuel that was added in the last refuel
  • Added the speed_multiplier float field, this will be used to speed up or slow down the next brewing process

Changed minecraft:furnace, minecraft:smoker and minecraft:blast_furnace

The following fields are now stored as integers rather than shorts:

  • Changed the cooking_time_spent field from a short to an integer, this is the amount of time that the current cooking process has taken so far
  • Changed the cooking_total_time field from a short to an integer, this is the total amount of time the current cooking process will take
  • Changed the lit_time_remaining field from a short to an integer, this is the amount of burn time remaining
  • Changed the lit_total_time field from a short to an integer, this is the total amount of burn time that was added in the last refuel

The following new fields have been added:

  • Added the speed_multiplier float field, this will be used to speed up or slow down the next brewing process

Advancements

Rewards

  • The loot sub-field in the rewards field now accepts an inline value, a single namespaced ID, a list of namespaced IDs, a list of inline values, or a hash-prefixed tag ID of a minecraft:loot_table type

Triggers

  • Multiple fields that accepted a list of loot conditions are now stricter:
    • Previous functionality of a list of conditions was equivalent to a single minecraft:all_of condition has been removed
    • Additionally, type field is mandatory (previously it defaulted to minecraft:entity_properties)
  • Some fields that previously accepted only inline loot conditions now also accept a namespaced ID of a minecraft:predicate
  • The player field, available on all triggers except minecraft:impossible, now accepts an inline value or a namespaced ID of a minecraft:predicate type
    • To avoid duplication, this field is not mentioned in entries below

Changed minecraft:any_block_use trigger

  • The location field now accepts an inline value or a namespaced ID of a minecraft:predicate type

Changed minecraft:bee_nest_destroyed

  • The block field has been renamed to blocks and now accepts a single namespaced ID, a list of namespaced IDs, or a hash-prefixed tag ID of a minecraft:block type
  • Added field state that matches block state properties (same format as minecraft:enter_block)

Changed minecraft:bred_animals trigger

  • child, parent, and partner fields now accept an inline value or a namespaced ID of a minecraft:predicate type

Changed minecraft:brewed_potion trigger

  • The potion field now accepts minecraft:potion_contents data component predicate

Changed minecraft:cured_zombie_villager trigger

  • villager and zombie fields now accept an inline value or a namespaced ID of a minecraft:predicate type

Changed minecraft:default_block_use trigger

  • The location field now accepts an inline value or a namespaced ID of a minecraft:predicate type

Changed minecraft:effects_changed trigger

  • The source field now accepts an inline value or a namespaced ID of a minecraft:predicate type

Changed minecraft:enter_block

  • The block field has been renamed to blocks and now accepts a single namespaced ID, a list of namespaced IDs, or a hash-prefixed tag ID of a minecraft:block type

Changed minecraft:fall_after_explosion trigger

  • The cause field now accepts an inline value or a namespaced ID of a minecraft:predicate type

Changed minecraft:fishing_rod_hooked trigger

  • The entity field now accepts an inline value or a namespaced ID of a minecraft:predicate type

Changed minecraft:placed_block trigger

  • The location field now accepts an inline value or a namespaced ID of a minecraft:predicate type

Changed minecraft:item_used_on_block trigger

  • The location field now accepts an inline value or a namespaced ID of a minecraft:predicate type

Changed minecraft:allay_drop_item_on_block trigger

  • The location field now accepts an inline value or a namespaced ID of a minecraft:predicate type

Comments

No comments yet. Start the discussion.