Migration Notes

Minecraft 26.3

These migration notes cover only the changes made to Balm APIs. For Minecraft and mod-loader specific migrations, check out their respective release announcements or primers.

Overview

The most notable change in Minecraft 26.3 is the switch from GLFW to SDL, as well as more things being migrated to use Data Components.

If you are currently doing magic number comparisons like event.button() == 0 or button == 1 to test for left/right mouse buttons, you must update to use the appropriate InputConstants field instead. The numeric values have changed due to the migration to SDL.

Version Catalog

⚠️ Known Issues

Breaking Changes

Removed BalmHooks#setBurnTime

Minecraft provides a Data Component CookingFuel now that you should use.

Removed BalmHooks#blockGrowFeature

This method was only used to fire an event on Forge. There is no direct replacement. If you have need for this, you can define a bi-directional event mapper or use a platform proxy.

Removed BalmCompostableRegistrar

Minecraft provides a Data Component Compostable now that you should use.

Removed BalmResourceReloadListenerRegistrar.VanillaKeys#advancements() and #recipes()

Recipes and Advancements appear to no longer use a resource reload listener.

Replaced BalmItemTags with ConventionalItemTags

Use ConventionalItemTags for conventional c: item tags. Most constants keep the same name, with the following exceptions:

  • BalmItemTags.DIAMONDS is now ConventionalItemTags.DIAMOND_GEMS.
  • BalmItemTags.EMERALDS is now ConventionalItemTags.EMERALD_GEMS.
  • BalmItemTags.DYE_TAGS is now ConventionalItemTags.COLOR_DYES and uses a ColorCollection<TagKey<Item>> instead of an array.
  • BalmItemTags.COOKING_OIL has no replacement, since it was not an official conventional tag.

Balm no longer ships the outdated c: tag data that previously populated these tags. Both Fabric and NeoForge already take care of that.

Removed BalmHooks#useFluidTank

This method has not been updated in years. There is no current equivalent in Balm; you would need to use a platform proxy to implement this logic yourself.

There are plans to bring the Transfer API to Balm, which would likely reintroduce an easier way to deal with fluid tank interactions.

BalmRegistrar#register now returns BalmHolderRegistration

The register methods on BalmRegistrar and BalmRegistrar.Scoped now return a BalmHolderRegistration<T> instead of a Holder<T> directly.

Use the appropriate conversion method for the type you need:

  • asHolder() returns the registered value as a Holder<T>.
  • asSupplier() returns it as a Supplier<T>.
  • asResourceKey() returns its ResourceKey<T>.

For example, code that stores the result as a holder must now call asHolder():

SPARK = spells.register("spark", id -> new ExampleSpell("Spark")).asHolder();