Update to Minecraft 26.3 - #1738
Conversation
Ports the mod from 26.2 to 26.3. The build, unit tests, and all 1001 game tests pass locally. Tooling: NeoForge 26.3.0.7-beta, NeoForge ModDev 2.0.147. Input: - org.lwjgl.glfw is gone; key codes now come from InputConstants, which carries SDL scancodes. InputConstants.Type.KEYSYM became Type.KEYBOARD. - The clipboard shortcut in ContainerScreenPartDisplay compared a typed codepoint against GLFW_KEY_C, which happened to equal 'C'. SDL scancodes do not, so it compares against 'C' directly. Blocks and rendering: - The block type MapCodec registry and Block#codec were removed, so the CODEC fields and codec() overrides are gone from twelve blocks. - NeoForge's canConnectRedstone was replaced by vanilla's shouldRedstoneWireConnectTo, which uses the same direction convention. - IClientBlockExtensions#addHitEffects takes a BlockPos and Direction instead of a HitResult. - PoseStack#mulPose(Quaternionf) became rotateDegrees(Axis, float). - BakedQuad.MaterialInfo gained item glint render types and takes a nullable shade Direction; CableModelBase builds it through MaterialInfo.of so the derived render types stay consistent. - FaceBakery.bakeQuad takes a nullable shade Direction instead of a boolean. - PushReaction.DESTROY became POPPED. - EnderMan was renamed Enderman, so the access transformer follows. Fuel: - FuelValues was replaced by the COOKING_FUEL data component, whose burn time is a ResolvableInt resolved against a CONTAINER_PROCESS loot context. Burn times are therefore block-dependent now: a blast furnace burns the same item faster. FuelHelpers builds that context, resolving against the Coal Generator itself where a block is known, and against a plain furnace for the burn_time operator, which has no block in scope. The can_burn operator is a plain COOKING_FUEL presence check. Data-driven vanilla systems: - ComposterBlock.COMPOSTABLES became the COMPOSTABLE data component. The old 0.3 and 0.65 chances map exactly onto compostable/low and compostable/medium. This also removes the neoforge compostables data map, which no longer exists. - ItemAbilities.AXE_STRIP is gone; axe stripping is now a BlockTransformer. The two BlockToolModificationEvent handlers are replaced by NeoForge's strippables data map, which copies shared properties exactly as they did. Loot and advancements: - ContextAwarePredicate was removed; criterion triggers hold Optional<Holder<LootItemCondition>> and serialize via LootItemCondition.CODEC. - LootItemConditionalFunction takes Optional<Holder<LootItemCondition>>. - LootContext#getOptionalParameter became getOptional, and getParameter is gone, so the wrench condition reads ORIGIN optionally. - Serialized block values in advancements use the block state NBT key 'id' rather than 'Name'. Worldgen: - Feature, ConfiguredFeature and FeatureConfiguration were merged, so TreeConfiguration became TreeFeature and configured_feature files move to worldgen/feature with their config inlined. - TreeGrower takes WeightedLists and a shortest tree type. - Block state providers were renamed (simple_state_provider is now an inline id, weighted_state_provider is weighted, rule_based_state_provider is rule_based), and the below-trunk rule matches vanilla's soil_beneath_tree. - The random_offset placement modifier became offset with separate x, y and z. Other: - Player#drop and Inventory#placeItemBackInInventory take a Prediction; these call sites are server-side, so they pass SERVER_ONLY. - LivingEntity#randomTeleport needs an avoidance tag. Liquid Chorus mirrors chorus fruit, so it uses CONSUMABLE_DOES_NOT_TELEPORT_TO. - An apple now carries 17 data components rather than 15: swing_animation split into attack_animation and interact_animation, and compostable and use_effects are new. The data keys test asserts all of them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V35MFZ7JSgoLe79J4d1uxf
|
CI is red, and will stay red until IntegratedDynamics-Compat is ported to 26.3. Both There is no fix to port here: that artifact does not exist at any version for 26.3, and the compat module is on the compile classpath (it is The change itself is verified locally against those three built from source: Not re-running: a re-run cannot make a missing artifact appear. Generated by Claude Code |
|
The compat side is now ported: CyclopsMC/IntegratedDynamics-Compat#44. With that branch published to a local maven, this PR builds clean against a genuine 26.3 compat jar ( Remaining blockers for this PR are then just the usual three, shared with the rest of the 26.3 set: Generated by Claude Code |
CyclopsMC/CyclopsCore#243 is merged, and its master-26 run published cyclopscore 1.30.0-1159, so the placeholder version and the note about building locally are no longer needed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V35MFZ7JSgoLe79J4d1uxf
CyclopsMC/CommonCapabilities#50 is merged and its master-26 run published commoncapabilities 2.11.8-398. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V35MFZ7JSgoLe79J4d1uxf
IntegratedDynamics-Compat compiles against this mod's slim artifact, and this mod shadows the compat jar, so neither can build for a new Minecraft version until the other is published. Commenting out the shadow lets this mod build and publish for 26.3 first; the compat can then build against it, and the TODO tracks restoring the dependency afterwards. Only the compat entry is commented out, so the other shadowed dependencies are unaffected and the slim artifact is unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V35MFZ7JSgoLe79J4d1uxf
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V35MFZ7JSgoLe79J4d1uxf
NeoForge 26.3 deprecated logoFile in favour of bannerFile and iconFile, and warns about it on every dev client launch. The logo is square, so iconFile is the fitting replacement. Only the NeoForge manifest changes: Forge 26.3 still only understands logoFile, so its mods.toml is left as is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V35MFZ7JSgoLe79J4d1uxf
A first release on a new Minecraft version is where the deferred API breaks can land. IPartType and IPartState: the 15 methods marked "make non-default in nextmajor" become abstract. PartStateBase already implemented all eight IPartState ones, so those only lose the interface default. Six of the seven IPartType bodies move into PartTypeAdapter, the documented default implementation, which already held onAspectVariablesChanged. Anything extending PartTypeAdapter or PartStateBase is unaffected; only direct implementors of the raw interfaces have to supply them now. GameTestsWrenchConfig proxies IPartType and relied on InvocationHandler#invokeDefault for snapshotConfig and applyConfig, which only works on default methods. It now calls PartConfigHelpers directly with the proxy as the part type, which is what those bodies did. OperatorBuilders: FLUIDSTACK_3 was built from ITEMSTACK. That gave OBJECT_FLUIDSTACK_WITH_DATA the itemstack kind, so it shared its unique name with OBJECT_ITEMSTACK_WITH_DATA. OperatorRegistry stores those in a plain map, so the fluid operator silently overwrote the item one, and the fluid operator showed the item stack translation while operator.integrateddynamics.fluidstack.withdata went unused. Both now have their own identifier. IIngredientChannelInsertPreConsumer: the deprecated three-argument insert is gone, so the four-argument one is the only method. Its test moves onto the current api, keeping the coverage of a pre-consumer that takes away without claiming. CableHelpers: the deprecated six-argument onCableRemoving is gone, all callers already passed the seventh argument. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V35MFZ7JSgoLe79J4d1uxf
CyclopsMC/IntegratedDynamics#1738 is merged, and its master-26 run published integrateddynamics 1.33.4-2151, so the placeholder version and the note about building locally are no longer needed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01V35MFZ7JSgoLe79J4d1uxf
Updates IntegratedDynamics from 26.2 to 26.3.
./gradlew buildpasses and all 1001 game tests pass locally, and a dev client was driven on 26.3 with clientdevbridge to exercise the behavioural changes.IntegratedDynamics-Compat is temporarily unshadowed
cyclopscore_version(1.30.0-1159) andcommoncapabilities_version(2.11.8-398) are the published 26.3 builds and resolve.IntegratedDynamics-Compat is the remaining problem, and it is circular: it compiles against this mod's
slimartifact, while this mod shadows the compat jar, so neither can build for a new Minecraft version until the other has published. To break it, the compatshadowentry inbuild.gradleis commented out with a TODO, so this mod builds and publishes for 26.3 first. CyclopsMC/IntegratedDynamics-Compat#44 can then build against it and publish, after which a follow-up bumpsintegrateddynamicscompat_versionand restores the dependency.Only that one entry is commented out: the other shadowed dependencies (re2j, netty) are unaffected, and the
slimartifact the compat needs is unchanged. Verified on a build with nosecrets.propertiesoverrides, which is what CI does:buildpasses, 1001 game tests pass, the jar contains 0integrateddynamicscompatclasses and the 447 re2j/netty classes it should.The interim 26.3 release therefore ships without the compat integrations until the follow-up lands.
Tooling
26.2.0.6-beta→26.3.0.7-beta, NeoForge ModDev2.0.141→2.0.147.Input
org.lwjgl.glfwis gone. Key codes now come fromInputConstants, which carries SDL scancodes rather than GLFW key codes, andInputConstants.Type.KEYSYMbecameType.KEYBOARD.One of these was not a mechanical swap: the Display Panel's copy shortcut compared a typed codepoint against
GLFW_KEY_C, which happened to equal'C'(67).InputConstants.KEY_Cis an SDL scancode (6) and would never match a codepoint, so that one compares against'C'directly.Fuel
FuelValueswas replaced by theCOOKING_FUELdata component, whose burn time is aResolvableIntresolved against aCONTAINER_PROCESSloot context. Burn times are block-dependent now — a blast furnace burns the same item faster — so there is no longer a single context-free answer.FuelHelpersbuilds that context two ways:burn_timeoperator has no block in scope, so it resolves as a plain vanilla furnace would, matching what the operator returned before.can_burnis now a plainCOOKING_FUELpresence check. Verified in a client: coal 1600, coal block 16000, lava bucket 20000, planks 300, diamond 0 — identical to the old values, and both paths agree.Data-driven vanilla systems
ComposterBlock.COMPOSTABLESbecame theCOMPOSTABLEdata component. The old0.3and0.65chances map exactly ontocompostable/lowandcompostable/medium(Menril Berries therefore match vanilla apples). This also dropsneoforge/data_maps/item/compostables.json, since that data map no longer exists.ItemAbilities.AXE_STRIPis gone; axe stripping is aBlockTransformernow. The twoBlockToolModificationEventhandlers are replaced by NeoForge'sstrippablesdata map, which copies shared properties exactly as the handlers did by hand. Verified in a client: a Menril Log withaxis=xstrips to a stripped log still ataxis=x.Worldgen
Feature,ConfiguredFeatureandFeatureConfigurationwere merged, which touches both code and data:TreeConfiguration→TreeFeature;configured_feature/files move toworldgen/feature/with theirconfigblock inlined.TreeGrowertakesWeightedLists and a shortest tree type instead ofOptionals.simple_state_provideris an inline{"id": …},weighted_state_provider→weighted,rule_based_state_provider→rule_based. The below-trunk rule is identical to vanilla'sminecraft:soil_beneath_tree, so it references that.random_offsetplacement modifier becameoffsetwith separatex/y/zproviders.Verified by growing a Menril tree from a sapling in a client: 27 logs and 77 leaves, rendering with the usual wide trunk and cyan canopy.
Blocks and rendering
MapCodecregistry andBlock#codecwere removed, so theCODECfields andcodec()overrides are gone from twelve blocks.canConnectRedstonewas replaced by vanilla'sshouldRedstoneWireConnectTo, which uses the same direction convention, so the body is unchanged.IClientBlockExtensions#addHitEffectstakes aBlockPosandDirectioninstead of aHitResult.PoseStack#mulPose(Quaternionf)→rotateDegrees(Axis, float).BakedQuad.MaterialInfogained item glint render types and takes a nullable shadeDirectioninstead of ashadeboolean.CableModelBasebuilds it throughMaterialInfo.ofso the derived item render types stay consistent;Transparency.NONEmaps to theChunkSectionLayer.SOLIDit used before.FaceBakery.bakeQuadlikewise takes a nullable shadeDirection.PushReaction.DESTROY→POPPED.EnderManwas renamedEnderman, so the access transformer follows.Loot and advancements
ContextAwarePredicatewas removed; criterion triggers holdOptional<Holder<LootItemCondition>>and serialize viaLootItemCondition.CODEC.LootItemConditionalFunctiontakesOptional<Holder<LootItemCondition>>.LootContext#getOptionalParameterbecamegetOptional, andgetParameteris gone entirely, so the wrench condition readsORIGINoptionally and null-checks it, as vanilla's own conditions now do.idrather thanName.Other
Player#dropandInventory#placeItemBackInInventorytake aPrediction. All three call sites are explicitly server-side, so they passSERVER_ONLY, matching vanilla's container code.LivingEntity#randomTeleportneeds an avoidance tag. Liquid Chorus mirrors chorus fruit, so it usesCONSUMABLE_DOES_NOT_TELEPORT_TO.swing_animationsplit intoattack_animationandinteract_animation, andcompostableanduse_effectsare new.testItemStackDataKeysnow asserts all 17 by name rather than the previous 13 of 15.Verified in a client
Cable models and connections, the Coal Generator burning coal and pushing 1340 FE through a cable network into an Energy Battery, axe stripping, composting components, tree growth, and the Logic Programmer GUI — including typing into the search field and arrow-key navigation, which is what the
InputConstantsmigration directly affects. No errors in the client log.Not verified
The other part and display renderers are compile-checked only; the cable model is the rendering path that was exercised in a running client.
🤖 Generated with Claude Code
https://claude.ai/code/session_01V35MFZ7JSgoLe79J4d1uxf
Generated by Claude Code
Generated by Claude Code