Skip to content

[1.18.2] Geome ID fallback drops biome-dictionary weights for dynamic biomes #262

Closed

Description

@SkyBlade1978

Summary

OreSpawn 4.0.10.118021 bakes exact biomes plus biome_dictionary contributions into its identity-keyed geome table, but the stable-ID fallback used for dynamic world-registry biome instances is built from exact biome rules only. In an integrated CakeWorld world, a custom biome tagged COLD receives its exact geome rule but not the COLD dictionary contribution.

Environment

  • Minecraft 1.18.2
  • Forge 40.3.0
  • OreSpawn 4.0.10.118021
  • CurseForge/Maven artifact: curse.maven:mmd-orespawn-245586:8750114
  • OreSpawn source tag: 4.0.10.118021 (ccfe01a207a66d5c66342c3d534237a1540b9a78)
  • Integrated test mod: CakeWorld
  • Fixed world seed: 5059928472718672684

Minimal provider rule

Define cakeworld:peppermint_fold and cakeworld:rock_candy_uplift as valid geomes, register cakeworld:marshmallow_peaks as a custom biome, and add its biome key to BiomeDictionary.Type.COLD. The relevant provider rules are:

"biomes": {
  "cakeworld:marshmallow_peaks": {
    "cakeworld:peppermint_fold": 6.0,
    "cakeworld:rock_candy_uplift": 14.0
  }
},
"biome_dictionary": {
  "COLD": {
    "cakeworld:peppermint_fold": 8.0
  }
}

Generate enough Marshmallow Peaks columns to observe the stable-layer geome selection, then repeat against the same saved world.

Expected

Exact-biome and biome-dictionary rules are additive regardless of whether lookup succeeds through the Biome identity table or the stable biome ID fallback. With the current merge behavior and the default starting weight of 1.0, the two relevant fallback weights should both be 15.0 before any applicable heuristic:

  • Peppermint Fold: 1 + 6 + 8 = 15
  • Rock-Candy Uplift: 1 + 14 = 15

A stable-layer sample should therefore contain both geomes, and fresh/reload classification should agree.

Actual

At fixed seed 5059928472718672684, the integrated audit sampled 211 Marshmallow Peaks columns:

Biome ID/dictionary geome audit: marshmallow_peaks={cakeworld:rock_candy_uplift=211}
COLD Marshmallow Peaks produced no Peppermint Fold columns

The same result occurred on fresh generation and same-save reload. The exact biome rule is visible, but the dictionary contribution is absent.

Suspected source seam

The current source appears to make the two baked lookup paths inconsistent:

This is consistent with a biome supplied by the dynamic world registry missing the identity lookup and falling back to an exact-only identifier profile.

Suggested regression test

Extend the identifier fallback bake so it applies the same exact plus dictionary rules as the identity path, then force BakedGeomeConfig to use the ID fallback (empty identity map) for a known COLD biome. Assert that the fallback array matches the identity-baked array, including the dictionary contribution.

The existing GeomeTransitionTest.configuredBiomeWeightsWorkWithoutAForgeBiomeRegistryEntry covers exact ID rules only, so it does not catch this case.

Acceptance criteria

  • Stable-ID fallback includes all applicable biome_dictionary contributions as well as exact biome rules.
  • Exact and dictionary contributions retain the current additive semantics.
  • Dynamic-registry custom biomes and Forge-registry biome objects produce the same baked weights for the same key.
  • No registry lookup, config read, string construction, or allocation is added to the column-generation hot path; resolve this while baking.
  • The integrated fixed-seed fresh-world and same-save reload audits both observe Peppermint Fold and Rock-Candy Uplift in Marshmallow Peaks.

Integrated test command

From the CakeWorld 1.18.2 checkout, resolve the released CurseForge artifact and run:

$env:JAVA_HOME='C:\Users\johnb\.jdks\jdk-17.0.1'
$env:Path="$env:JAVA_HOME\bin;$env:Path"
$env:GRADLE_USER_HOME='D:\CakeWorld\.gradle-verify-cache'
.\gradlew.bat runGameTestServer --no-daemon `
  -PcakeworldFreshWorldgenRuntime=true `
  -PcakeworldFreshWorldgenRunDirectory=run-fresh-worldgen-os410-cursemaven-r10

Use an empty run directory for the fresh-world pass, then run the same command unchanged for the same-save reload pass. The focused test is biomeidanddictionarygeomerulesarebakedandobserved.

Activity

  1. SkyBlade1978 commented on Aug 29, 2026

    @SkyBlade1978
    ContributorAuthor

    Verified fixed in the local 4.0.12 candidate, including integrated fresh-world and same-save reload behavior.

    Candidate:

    • branch: feature/1.18.2-4.0.12-geology-sampler
    • commit: 7c82ecc
    • JAR: OreSpawn-4.0.12.118021.jar
    • SHA-256: 0478D611A96020DAAE794B72E64EFD677B49A5B63BCB6179330D63317B16D6A6

    Focused CakeWorld regression:

    • namespace: cakeworld_geome_dictionary
    • seed: 5059928472718672684
    • exact Marshmallow Peaks rule plus COLD dictionary contribution
    • fresh: Peppermint Fold 118, Rock-Candy Uplift 95
    • same-save reload: Peppermint Fold 118, Rock-Candy Uplift 95
    • one required test passed in each run

    This turns the former 211/0 one-sided result into a stable two-geome distribution and confirms that the world-owned saved profile retains the additive dictionary contribution. I have not closed the issue because merge/release state is for the OreSpawn maintainer to decide.

  2. SkyBlade1978 commented on Sep 9, 2026

    @SkyBlade1978
    ContributorAuthor

    Closing as completed. The reported 1.18.2 dynamic-biome weighting defect was fixed in the 4.0.11 implementation and is included in 4.0.16.118021 via #270. Exact biome-ID and dictionary/tag contributions are merged into the stable key table during baking, with the 15/15 fresh/reload regression retained.

    The repair is now merged on every dynamic-registry Forge and NeoForge target. Older static-registry targets were explicitly audited as not applicable.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions