Skip to content

Update to Minecraft 26.3 - #1738

Merged
rubensworks merged 7 commits into
master-26from
claude/minecraft-26-3-update-xr1cny
Sep 20, 2026
Merged

rubensworks merged 7 commits into
master-26from
claude/minecraft-26-3-update-xr1cny

Conversation

@rubensworks

@rubensworks rubensworks commented Sep 20, 2026

Copy link
Copy Markdown
Member

Updates IntegratedDynamics from 26.2 to 26.3. ./gradlew build passes 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) and commoncapabilities_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 slim artifact, 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 compat shadow entry in build.gradle is 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 bumps integrateddynamicscompat_version and restores the dependency.

Only that one entry is commented out: the other shadowed dependencies (re2j, netty) are unaffected, and the slim artifact the compat needs is unchanged. Verified on a build with no secrets.properties overrides, which is what CI does: build passes, 1001 game tests pass, the jar contains 0 integrateddynamicscompat classes 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

  • NeoForge 26.2.0.6-beta26.3.0.7-beta, NeoForge ModDev 2.0.1412.0.147.

Input

org.lwjgl.glfw is gone. Key codes now come from InputConstants, which carries SDL scancodes rather than GLFW key codes, and InputConstants.Type.KEYSYM became Type.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_C is an SDL scancode (6) and would never match a codepoint, so that one compares against 'C' directly.

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 block-dependent now — a blast furnace burns the same item faster — so there is no longer a single context-free answer.

FuelHelpers builds that context two ways:

  • the Coal Generator resolves against itself, which is exact;
  • the burn_time operator has no block in scope, so it resolves as a plain vanilla furnace would, matching what the operator returned before.

can_burn is now a plain COOKING_FUEL presence 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.COMPOSTABLES became the COMPOSTABLE data component. The old 0.3 and 0.65 chances map exactly onto compostable/low and compostable/medium (Menril Berries therefore match vanilla apples). This also drops neoforge/data_maps/item/compostables.json, since that data map no longer exists.
  • ItemAbilities.AXE_STRIP is gone; axe stripping is a BlockTransformer now. The two BlockToolModificationEvent handlers are replaced by NeoForge's strippables data map, which copies shared properties exactly as the handlers did by hand. Verified in a client: a Menril Log with axis=x strips to a stripped log still at axis=x.

Worldgen

Feature, ConfiguredFeature and FeatureConfiguration were merged, which touches both code and data:

  • TreeConfigurationTreeFeature; configured_feature/ files move to worldgen/feature/ with their config block inlined.
  • TreeGrower takes WeightedLists and a shortest tree type instead of Optionals.
  • State provider types were renamed: simple_state_provider is an inline {"id": …}, weighted_state_providerweighted, rule_based_state_providerrule_based. The below-trunk rule is identical to vanilla's minecraft:soil_beneath_tree, so it references that.
  • The random_offset placement modifier became offset with separate x/y/z providers.

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

  • 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, so the body is unchanged.
  • IClientBlockExtensions#addHitEffects takes a BlockPos and Direction instead of a HitResult.
  • PoseStack#mulPose(Quaternionf)rotateDegrees(Axis, float).
  • BakedQuad.MaterialInfo gained item glint render types and takes a nullable shade Direction instead of a shade boolean. CableModelBase builds it through MaterialInfo.of so the derived item render types stay consistent; Transparency.NONE maps to the ChunkSectionLayer.SOLID it used before.
  • FaceBakery.bakeQuad likewise takes a nullable shade Direction.
  • PushReaction.DESTROYPOPPED.
  • EnderMan was renamed Enderman, so the access transformer follows.

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 entirely, so the wrench condition reads ORIGIN optionally and null-checks it, as vanilla's own conditions now do.
  • Serialized block values in advancements use the block state NBT key id rather than Name.

Other

  • Player#drop and Inventory#placeItemBackInInventory take a Prediction. All three call sites are explicitly server-side, so they pass SERVER_ONLY, matching vanilla's container code.
  • 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. testItemStackDataKeys now 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 InputConstants migration 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

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

Copy link
Copy Markdown
Member Author

CI is red, and will stay red until IntegratedDynamics-Compat is ported to 26.3.

Both CI and Fuzzing fail at Gradle configuration time, after 19s, before anything is compiled:

> Could not resolve all dependencies for configuration ':shadow'.
   > Could not find org.cyclops.integrateddynamicscompat:integrateddynamicscompat-26.3-neoforge:1.0.0-202.

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 shadowed into the jar), so no build can get past configuration. cyclopscore-26.3 and commoncapabilities-26.3 are unpublished for the same reason and will surface next once this one resolves.

The change itself is verified locally against those three built from source: ./gradlew build passes, all 1001 game tests pass, and a 26.3 dev client exercised the cable models, the Coal Generator's fuel path, axe stripping, tree growth and the Logic Programmer's keyboard handling.

Not re-running: a re-run cannot make a missing artifact appear.


Generated by Claude Code

Copy link
Copy Markdown
Member Author

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 (integrateddynamicscompat-26.3-neoforge:1.0.0-DEV), so the :shadow resolution failure above is resolved once that merges and publishes.

Remaining blockers for this PR are then just the usual three, shared with the rest of the 26.3 set: cyclopscore-26.3, commoncapabilities-26.3, and now integrateddynamicscompat-26.3.


Generated by Claude Code

rubensworks and others added 3 commits September 20, 2026 11:16
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
@coveralls

coveralls commented Sep 20, 2026

Copy link
Copy Markdown

Coverage Status

coverage: 56.93% (-0.03%) from 56.964% — claude/minecraft-26-3-update-xr1cny into master-26

Comment thread src/main/java/org/cyclops/integrateddynamics/core/helper/FuelHelpers.java Outdated
rubensworks and others added 3 commits September 20, 2026 12:05
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
@rubensworks
rubensworks merged commit c8f35e9 into master-26 Sep 20, 2026
8 checks passed
@rubensworks
rubensworks deleted the claude/minecraft-26-3-update-xr1cny branch September 20, 2026 12:59
rubensworks added a commit to CyclopsMC/IntegratedDynamics-Compat that referenced this pull request Sep 20, 2026
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
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.

3 participants