Skip to content

Update dependency net.minestom:minestom to v2026.10.05-26.2 - #6

Merged
NonSwag merged 1 commit into
mainfrom
renovate/net.minestom-minestom-2026.x
Oct 5, 2026
Merged

NonSwag merged 1 commit into
mainfrom
renovate/net.minestom-minestom-2026.x

Conversation

@renovate

@renovate renovate Bot commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Confidence
net.minestom:minestom 2026.09.12-26.2 → 2026.10.05-26.2 age confidence

Warning

Some dependencies could not be looked up. Check the warning logs for more information.


Release Notes

minestom/minestom (net.minestom:minestom)

v2026.10.05-26.2

Compare Source

This is a breaking release. APIs that were deprecated for removal are gone, ServerFlag is replaced by the new ServerProperties API, and registry keys are created with RegistryKey.of and TagKey.of. Several packets were fixed to match the protocol, which changes some packet constructors and accessors. Every breaking change has a before and after example in the migration section at the bottom.

This release also continues the registry work from 26.2. Instances, packet buffers, and component serializers can use registries other than those of the running server process, which makes Minestom easier to use in tests and without a server process at all.

This is not the last breaking release of this cycle before 26.3, it is just a checkpoint for some of the work already completed.

26.3

26.3 is still being worked on. If you require 26.3 early, you can use the published snapshot located within Minestom/Minestom#3369.

Registries

Registries are a core part of this changeset so far, they will continue to be larger changeset until registry v3 is merged.

RegistryKey.of and TagKey.of are now the public way to create keys, replacing the internal unsafeOf methods (#​3401). A key is only a typed name. Its syntax is validated, but registry membership is not, so the same key can name an entry in one registry and nothing in another. Looking up a key that has no entry returns null, or -1 for IDs.

RegistryKey<Biome> moon = RegistryKey.of("minestom:moon");
TagKey<Block> soft = TagKey.of("minestom:soft");

Instances can be created with the registry context of your choice (#​3402). InstanceManager#createInstanceContainer has overloads that take Registries, and the Instance and InstanceContainer constructors without a registry context are deprecated.

InstanceContainer instance = instanceManager.createInstanceContainer(registries, DimensionType.OVERWORLD);

A number of places read the registries of the global server process instead of the registries they were given:

  • Copied and shared instances keep the registries and dimension name of their source instance (#​3392).
  • Players read dimension type IDs from the current server process instead of the first one (#​3394).
  • EnchantmentTableInventory looks up enchantment IDs in the registry it was created with (#​3391).
  • Item components in hover events are encoded with the buffer registries (#​3400), and maxLength checks measure typed NBT with them as well (#​3385).
  • Raw values decoded with different registry contexts compare equal (#​3390).
  • NbtComponentSerializer.nbt(Registries) serializes components without an initialized server process (#​3388).

Buffers from PacketVanilla.PACKET_POOL hold no registries until a write sets them (#​3396). Code that takes a buffer from the pool directly must set its registries before writing registry dependent types.

New and reset chunk sections fill their biome palette with the ID of Biome.PLAINS in the instance registries, instead of ID 0 (#​3370). Section#clear() is removed. Future release will change the ordering where id 0 is no longer Biome.PLAINS.

BuiltinRegistries.WORLDGEN_BIOME is removed in favor of BuiltinRegistries.BIOME (#​3368).

Server Properties

ServerProperties replaces ServerFlag, which is deprecated for removal (#​3354). Each setting is a ServerProperty initialized from the same system property as before, and read through get():

int tps = ServerProperties.SERVER_TICKS_PER_SECOND.get();

Properties are immutable by default, so reads still fold to a constant. Setting <name>.mutable=true lets that one property accept set() at runtime, and minestom.properties.mutable=true does the same for every property. This is mostly intended for tests. Some settings are only read during startup, so changing them later may have no effect. The ServerFlag constants hold the values from when the class was initialized and never see writes made through set().

Network error handling is configurable through new properties (#​3347). By default, socket IO errors and failed accepts are no longer reported to the exception manager, since they are mostly noise from scanners.

  • minestom.suppress-connection-io-errors and minestom.suppress-connection-accept-errors (both true) hide socket IO errors and failed accepts.
  • minestom.suppress-malformed-packet-error-level and minestom.suppress-misused-packet-error-level (both 0) skip reporting packets that fail to parse, or that throw in their listener, while the connection state ordinal is at or below the level. The default of 0 silences handshake errors.
  • minestom.reject-malformed-packet (true) disconnects a client that sends a packet that fails to parse.
  • minestom.reject-misused-packet (false) disconnects or kicks a client whose packet throws in its listener.
  • minestom.warn-packet-unread-bytes (true) toggles the warning for packets that were not fully read.

PacketListenerManager#processClientPacket no longer catches listener exceptions, so its callers handle them.

Networking

Several packets did not match the protocol (#​3382):

  • World border lerp and initialize packets carry their transition time in ticks, so WorldBorder.createLerpSizePacket and WorldBorder.createInitializePacket take ticks.
  • DebugChunkValuePacket takes the chunk x and z as separate ints.
  • DeleteChatPacket holds a packed signature, so it can delete a message by its signature cache index as well as by its full signature.
  • Debug hive and POI counts are written as VarInts, debug game event positions as doubles, and minecart lerp step rotations as packed floats.
  • Item templates write their component patch instead of every default component.
  • ClientChangeDifficultyPacket has no locked flag, the structure block seed is read as a VarLong, and ClientSetBeaconEffectPacket holds PotionEffect values.

DamageEventPacket takes a RegistryKey<DamageType> and nullable entity IDs instead of their encoded values (#​3395).

Entities only send their non-empty equipment slots, and send no equipment packet at all when every slot is empty (#​3249). EquipmentHandler#getEquipmentsPacket() returns null in that case.

Instance#setHashedSeed sets the seed clients use to blend grass, foliage, and water colors near biome borders (#​3302). It defaults to 0 and applies to players that enter the instance after the call.

Player#sendPackets and PlayerConnection#sendPackets accept Collection<? extends SendablePacket>, so a List<RegistryDataPacket> can be passed directly (#​3346).

NetworkBuffer

  • NetworkBuffer.IOView and NetworkBuffer#ioView() are removed with no replacement (#​3383).
  • NetworkBuffer.resizableBuffer takes a long size (#​3387).
  • The generic bounds of NetworkBuffer match those of Codec (#​3384). This is unlikely to affect you, but some code may need its generics adjusted, it should allow you fix some ugly casts.
  • NetworkBuffer is fully documented with Javadoc (#​3386).

Removed APIs

The map API in net.minestom.server.map and net.minestom.server.map.framebuffers are deleted, along with the minestom.map.rgbmapping and minestom.map.rgbreduction flags (#​3341). It had been unmaintained for a while and can be implemented entirely outside of Minestom. Minestom no longer requires the java.desktop module.

APIs deprecated for removal in earlier releases are removed (#​3393). This covers Block#isAir, isSolid, isLiquid, and isFluid, Material#isArmor and isBlock, Attribute#isSynced, the Block overloads of Tool#isCorrectForDrops and Tool#getSpeed, TagKey.hashCodec, and StaticProtocolObject#registry(). The typed registry() accessors on Block, EntityType, and the other static protocol objects remain deprecated for removal.

Several public static fields are now final and some return types are narrower (#​3304). ServerFlag.INSIDE_TEST, DataComponentPredicate.Damage.CODEC, and the FilteredText fields STRING_NETWORK_TYPE, STRING_CODEC, COMPONENT_NETWORK_TYPE, and COMPONENT_CODEC are final. Some return types are narrower: ConnectionManager#getOnlinePlayers() and getConfigPlayers() return Set<Player>, PlayerChatEvent#getRecipients() returns List<Player>, Weather#createWeatherPackets() returns List<SendablePacket>, and components() on SetSlotPacket, SetCursorItemPacket, SetPlayerInventorySlotPacket, and SlotDisplay.ItemStack returns List<Component>.

Other Changes

  • EaseFunction.CubicBezier pairs its control points correctly (#​3379). Curves where x1 differed from y1, or x2 from y2, sampled wrong values. CubicBezier is a record with value equality, and it rejects x1 or x2 outside 0 to 1.
  • ArgumentItemStack reports invalid item components as syntax errors instead of throwing (#​3389).
  • The net.minestom.server.item.predicate package is exported from the module (#​3373).
  • SLF4J was updated to 2.0.20 (#​3365, #​3380), and Logback to 1.6.5 (#​3397).

Migration

Registry keys are created with of (#​3401).

RegistryKey<Biome> moon = RegistryKey.unsafeOf("minestom:moon");
TagKey<Block> soft = TagKey.unsafeOf("minestom:soft");

⬇️

RegistryKey<Biome> moon = RegistryKey.of("minestom:moon");
TagKey<Block> soft = TagKey.of("minestom:soft");

Instance constructors take a registry context (#​3402). Pass MinecraftServer.getRegistries() to keep the current behavior, or create instances through InstanceManager instead.

new InstanceContainer(uuid, dimensionType);
new InstanceContainer(uuid, dimensionType, dimensionName);
new InstanceContainer(uuid, dimensionType, loader);
new InstanceContainer(uuid, dimensionType, loader, dimensionName);
super(uuid, dimensionType); // Instance subclass
super(uuid, dimensionType, dimensionName); // Instance subclass

⬇️

new InstanceContainer(registries, uuid, dimensionType);
new InstanceContainer(registries, uuid, dimensionType, null, dimensionName);
new InstanceContainer(registries, uuid, dimensionType, loader, dimensionType.key());
new InstanceContainer(registries, uuid, dimensionType, loader, dimensionName);
super(registries, uuid, dimensionType);
super(registries, uuid, dimensionType, dimensionName);

Server settings are read through ServerProperties (#​3354).

int tps = ServerFlag.SERVER_TICKS_PER_SECOND;

⬇️

int tps = ServerProperties.SERVER_TICKS_PER_SECOND.get();

INSIDE_TEST is now final, so set it through its system property (#​3304).

ServerFlag.INSIDE_TEST = true;

⬇️

-Dminestom.inside-test=true

World border packets take the transition time in ticks (#​3382).

border.createLerpSizePacket(targetDiameter, transitionMillis);
border.createInitializePacket(targetDiameter, remainingMillis);

⬇️

border.createLerpSizePacket(targetDiameter, transitionMillis / MinecraftServer.TICK_MS);
border.createInitializePacket(targetDiameter, remainingMillis / MinecraftServer.TICK_MS);

DebugChunkValuePacket takes the chunk x and z as separate ints (#​3382).

new DebugChunkValuePacket(chunkPos, update);

⬇️

new DebugChunkValuePacket(chunkX, chunkZ, update);

DeleteChatPacket.signature() returns a MessageSignature.Packed (#​3382). The DeleteChatPacket(MessageSignature) constructor works as before.

MessageSignature signature = deleteChatPacket.signature();

⬇️

// Null when the packet deletes by cache index
MessageSignature signature = deleteChatPacket.signature().fullSignature();

ClientChangeDifficultyPacket has no locked component (#​3382).

new ClientChangeDifficultyPacket(Difficulty.HARD, false);

⬇️

new ClientChangeDifficultyPacket(Difficulty.HARD);

Beacon effects are PotionEffect values (#​3382).

PotionType primary = beaconPacket.primaryEffect();

⬇️

PotionEffect primary = beaconPacket.primaryEffect();

DamageEventPacket takes a damage type key and plain entity IDs (#​3395).

new DamageEventPacket(5, registries.damageType().getId(DamageType.ARROW), 2 + 1, 3 + 1, VEC)

⬇️

new DamageEventPacket(5, DamageType.ARROW, 2, 3, VEC)

Pooled buffers need their registries set before writing (#​3396).

NetworkBuffer buffer = PacketVanilla.PACKET_POOL.get();
buffer.write(DamageType.NETWORK_TYPE, damageType);

⬇️

NetworkBuffer buffer = PacketVanilla.PACKET_POOL.get();
buffer.registries(registries);
buffer.write(DamageType.NETWORK_TYPE, damageType);

NetworkBuffer.resizableBuffer takes a long (#​3387). Most code only needs a recompile.

long size = 1L;
var buffer = NetworkBuffer.resizableBuffer((int) size);

⬇️

long size = 1L;
var buffer = NetworkBuffer.resizableBuffer(size);

Deprecated accessors are replaced by their short forms (#​3393).

block.isAir();
block.isSolid();
block.isLiquid();
block.isFluid();
material.isArmor();
material.isBlock();
attribute.isSynced();
tool.isCorrectForDrops(block);
tool.getSpeed(block);

⬇️

block.air();
block.solid();
block.liquid();
block.fluid();
material.armor();
material.block() != null;
attribute.synced();
tool.isCorrectForDrops(block.registryKey());
tool.getSpeed(block.registryKey());

The biome registry key alias is removed (#​3368).

BuiltinRegistries.WORLDGEN_BIOME

⬇️

BuiltinRegistries.BIOME

Section#clear() is removed (#​3370).

section.clear();

⬇️

section.blockPalette().fill(0);
section.biomePalette().fill(registries.biome().getId(Biome.PLAINS));

getEquipmentsPacket() returns null when every slot is empty (#​3249).

player.sendPacket(entity.getEquipmentsPacket());

⬇️

EntityEquipmentPacket packet = entity.getEquipmentsPacket();
if (packet != null) player.sendPacket(packet);

Player#sendDimension takes the hashed seed (#​3302).

@Override
protected void sendDimension(RegistryKey<DimensionType> dimensionType, String dimensionName) {

⬇️

@Override
protected void sendDimension(RegistryKey<DimensionType> dimensionType, String dimensionName, long hashedSeed) {

processClientPacket lets listener exceptions propagate (#​3347).

packetListenerManager.processClientPacket(packet, connection);

⬇️

try {
    packetListenerManager.processClientPacket(packet, connection);
} catch (Exception e) {
    MinecraftServer.getExceptionManager().handleException(e);
}

Custom PlayerConnection implementations override sendPackets with the wider bound (#​3346).

@Override
public void sendPackets(Collection<SendablePacket> packets) {

⬇️

@Override
public void sendPackets(Collection<? extends SendablePacket> packets) {

The map API, NetworkBuffer.IOView, and TagKey.hashCodec have no replacement. The narrower return types from #​3304 only need a recompile.

ABI compatibility report

The ABI checker found 62 binary compatibility violations compared with 2026.09.12-26.2. A single record or return type change can produce several entries in this count.

The report was generated with:

./gradlew checkBinaryCompatibility -PbaselineJarDir=<directory-containing-2026.09.12-26.2-jar>

Raw checker output:

Public/protected field removed or type changed: net/minestom/server/ServerFlag#MAP_RGB_MAPPING:Ljava/lang/String;
Public/protected field removed or type changed: net/minestom/server/ServerFlag#MAP_RGB_REDUCTION:I
Field made final: net/minestom/server/ServerFlag#INSIDE_TEST:Z
Public/protected method removed or signature changed: net/minestom/server/entity/EntityType#registry()Ljava/lang/Object;
Public/protected method removed or signature changed: net/minestom/server/entity/Player#sendDimension(Lnet/minestom/server/registry/RegistryKey;Ljava/lang/String;)V
Public/protected method removed or signature changed: net/minestom/server/entity/VillagerProfession#registry()Ljava/lang/Object;
Public/protected method removed or signature changed: net/minestom/server/entity/VillagerProfessionImpl#registry()Ljava/lang/Object;
Public/protected method removed or signature changed: net/minestom/server/entity/attribute/Attribute#isSynced()Z
Public/protected method removed or signature changed: net/minestom/server/entity/attribute/Attribute#registry()Ljava/lang/Object;
Public/protected method removed or signature changed: net/minestom/server/event/player/PlayerChatEvent#getRecipients()Ljava/util/Collection;
Public/protected method removed or signature changed: net/minestom/server/game/GameEvent#registry()Ljava/lang/Object;
Public/protected method removed or signature changed: net/minestom/server/instance/Section#clear()V
Public/protected method removed or signature changed: net/minestom/server/instance/Weather#createWeatherPackets()Ljava/util/Collection;
Public/protected method removed or signature changed: net/minestom/server/instance/block/Block#isAir()Z
Public/protected method removed or signature changed: net/minestom/server/instance/block/Block#isSolid()Z
Public/protected method removed or signature changed: net/minestom/server/instance/block/Block#isLiquid()Z
Public/protected method removed or signature changed: net/minestom/server/instance/block/Block#isFluid()Z
Public/protected method removed or signature changed: net/minestom/server/instance/block/Block#registry()Ljava/lang/Object;
Public/protected method removed or signature changed: net/minestom/server/instance/block/BlockSoundType#registry()Ljava/lang/Object;
Field made final: net/minestom/server/instance/block/predicate/DataComponentPredicate$Damage#CODEC:Lnet/minestom/server/codec/Codec;
Public/protected method removed or signature changed: net/minestom/server/instance/fluid/Fluid#registry()Ljava/lang/Object;
Public/protected method removed or signature changed: net/minestom/server/instance/gamerule/GameRule#registry()Ljava/lang/Object;
Public/protected method removed or signature changed: net/minestom/server/item/ItemStack#textComponents(Lnet/minestom/server/item/ItemStack;)Ljava/util/Collection;
Public/protected method removed or signature changed: net/minestom/server/item/Material#isBlock()Z
Public/protected method removed or signature changed: net/minestom/server/item/Material#isArmor()Z
Public/protected method removed or signature changed: net/minestom/server/item/Material#registry()Ljava/lang/Object;
Field made final: net/minestom/server/item/book/FilteredText#STRING_NETWORK_TYPE:Lnet/minestom/server/network/NetworkBuffer$Type;
Field made final: net/minestom/server/item/book/FilteredText#STRING_CODEC:Lnet/minestom/server/codec/Codec;
Field made final: net/minestom/server/item/book/FilteredText#COMPONENT_NETWORK_TYPE:Lnet/minestom/server/network/NetworkBuffer$Type;
Field made final: net/minestom/server/item/book/FilteredText#COMPONENT_CODEC:Lnet/minestom/server/codec/Codec;
Public/protected method removed or signature changed: net/minestom/server/item/component/Tool#isCorrectForDrops(Lnet/minestom/server/instance/block/Block;)Z
Public/protected method removed or signature changed: net/minestom/server/item/component/Tool#getSpeed(Lnet/minestom/server/instance/block/Block;)F
Class removed, made package-private or considered internal: net/minestom/server/map/Framebuffer
Class removed, made package-private or considered internal: net/minestom/server/map/LargeFramebuffer
Class removed, made package-private or considered internal: net/minestom/server/map/MapColors$ColorMappingStrategy
Class removed, made package-private or considered internal: net/minestom/server/map/MapColors$Multiplier
Class removed, made package-private or considered internal: net/minestom/server/map/MapColors$PreciseMapColor
Class removed, made package-private or considered internal: net/minestom/server/map/MapColors
Class removed, made package-private or considered internal: net/minestom/server/map/framebuffers/DirectFramebuffer
Class removed, made package-private or considered internal: net/minestom/server/map/framebuffers/Graphics2DFramebuffer
Class removed, made package-private or considered internal: net/minestom/server/map/framebuffers/LargeDirectFramebuffer
Class removed, made package-private or considered internal: net/minestom/server/map/framebuffers/LargeFramebufferDefaultView
Class removed, made package-private or considered internal: net/minestom/server/map/framebuffers/LargeGraphics2DFramebuffer
Public/protected method removed or signature changed: net/minestom/server/network/ConnectionManager#getOnlinePlayers()Ljava/util/Collection;
Public/protected method removed or signature changed: net/minestom/server/network/ConnectionManager#getConfigPlayers()Ljava/util/Collection;
Public/protected method removed or signature changed: net/minestom/server/network/NetworkBuffer#resizableBuffer(I)Lnet/minestom/server/network/NetworkBuffer;
Public/protected method removed or signature changed: net/minestom/server/network/packet/client/play/ClientChangeDifficultyPacket#<init>(Lnet/minestom/server/world/Difficulty;Z)V
Public/protected method removed or signature changed: net/minestom/server/network/packet/client/play/ClientChangeDifficultyPacket#locked()Z
Public/protected method removed or signature changed: net/minestom/server/network/packet/client/play/ClientSetBeaconEffectPacket#<init>(Lnet/minestom/server/potion/PotionType;Lnet/minestom/server/potion/PotionType;)V
Public/protected method removed or signature changed: net/minestom/server/network/packet/client/play/ClientSetBeaconEffectPacket#primaryEffect()Lnet/minestom/server/potion/PotionType;
Public/protected method removed or signature changed: net/minestom/server/network/packet/client/play/ClientSetBeaconEffectPacket#secondaryEffect()Lnet/minestom/server/potion/PotionType;
Public/protected method removed or signature changed: net/minestom/server/network/packet/server/play/DamageEventPacket#<init>(IIIILnet/minestom/server/coordinate/Point;)V
Public/protected method removed or signature changed: net/minestom/server/network/packet/server/play/DamageEventPacket#damageTypeId()I
Public/protected method removed or signature changed: net/minestom/server/network/packet/server/play/DamageEventPacket#sourceEntityId()I
Public/protected method removed or signature changed: net/minestom/server/network/packet/server/play/DamageEventPacket#sourceDirectId()I
Public/protected method removed or signature changed: net/minestom/server/network/packet/server/play/DebugChunkValuePacket#<init>(JLnet/minestom/server/network/debug/DebugSubscription$Update;)V
Public/protected method removed or signature changed: net/minestom/server/network/packet/server/play/DebugChunkValuePacket#chunkPos()J
Public/protected method removed or signature changed: net/minestom/server/network/packet/server/play/DeleteChatPacket#signature()Lnet/minestom/server/crypto/MessageSignature;
Public/protected method removed or signature changed: net/minestom/server/potion/PotionEffect#registry()Ljava/lang/Object;
Public/protected field removed or type changed: net/minestom/server/registry/BuiltinRegistries#WORLDGEN_BIOME:Lnet/minestom/server/registry/RegistryKey;
Public/protected method removed or signature changed: net/minestom/server/registry/StaticProtocolObject#registry()Ljava/lang/Object;
Public/protected method removed or signature changed: net/minestom/server/registry/TagKey#hashCodec(Lnet/minestom/server/registry/Registries$Selector;)Lnet/minestom/server/codec/Codec;

Full Changelog: Minestom/Minestom@2026.09.12-26.2...2026.10.04-26.2


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@NonSwag
NonSwag merged commit e51dbd8 into main Oct 5, 2026
1 check passed
@renovate
renovate Bot deleted the renovate/net.minestom-minestom-2026.x branch October 5, 2026 14:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant