Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,9 @@ jobs:
if-no-files-found: error
retention-days: 30
path: |
build/libs/Mineralogy-6.1.2.2601022.jar
build/libs/Mineralogy-6.1.2.2601022-sources.jar
build/libs/Mineralogy-6.1.2.2601022-javadoc.jar
build/libs/Mineralogy-6.1.4.2601022.jar
build/libs/Mineralogy-6.1.4.2601022-sources.jar
build/libs/Mineralogy-6.1.4.2601022-javadoc.jar
build/release/SHA256SUMS
CHANGELOG.txt
- name: Upload diagnostics on failure
Expand Down
25 changes: 25 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,28 @@
Mineralogy 6.1.4.2601022 for Minecraft 26.1.2 NeoForge

- Restored natural bat spawning on Mineralogy terrain through the additive
vanilla bats_spawnable_on block tag. Applies to existing worlds, preserves
normal light/height restrictions, and excludes crafted construction blocks.
Eligibility is independent of cobblestone equivalence.
- Added matching 37-member terrain-rock block/item tags and additive vanilla
sculk, dripstone and moss replacement interfaces, preserving existing members.
- Goats can spawn on natural rocks and break horns against harder raw rocks.
Soft materials and crafted blocks are excluded from horn breaking.
- Fixed dripstone water-pocket and large-column checks rejecting natural rock.
Roots and forest rocks recognise natural substrates; bare rock is still not
suitable for growing azalea trees.
- Added slab, stair, furnace, ore, storage and dyed-block classifications.
Double slabs remain full blocks, and disabled construction references are
optional. Normal cobblestone follows the existing setting.
- Rock-salt lamps retain the centre post on straight walls.
- Construction recipes and unlocks check that their items are registered;
loot tables follow the matching content settings. Enabled ingredients,
outputs, progression and normal drops are unchanged.
- Natural replacement is independent of cobblestone equivalence and excludes
crafted forms. Sculk/moss eligibility updates existing worlds; cave, root and
forest decoration improves in new chunks. No provider, config, registry,
texture or OreSpawn changes. Sulfur cubes are not present before 26.2.

Mineralogy 6.1.2.2601022 for Minecraft 26.1.2 NeoForge

- Ported the accepted NeoForge 1.21.11 product to Minecraft 26.1.2 and
Expand Down
21 changes: 20 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,32 @@ mineral ores and dusts, rock furnaces, drywall, rock-salt lighting, fertilizer,
and crude oil. OreSpawn 4 is the sole terrain, strata, ore, and deposit engine;
Mineralogy no longer installs a parallel world generator.

This branch builds Mineralogy `6.1.2.2601022` for NeoForge `26.1.2.94` and is built
This branch builds Mineralogy `6.1.4.2601022` for NeoForge `26.1.2.94` and is built
and tested against OreSpawn `4.0.16.2601022`. Its declared compatibility range is
OreSpawn `[4.0.6,5.0.0)`. Install both mods on clients and servers.

This is the NeoForge build. It is intentionally maintained separately from the
Forge 26.1.2 branch; use the jar that matches the loader in your modpack.

Mineralogy 6.1.4 restores sculk catalyst conversion, moss growth and dripstone
decoration on natural Mineralogy terrain. Goats can spawn on natural rocks and
break horns against harder raw rocks. Root and forest-rock decoration recognise
natural substrates, without making bare rock suitable for growing azalea trees.
Rock-salt lamps retain the centre post on straight walls.

These block and animal fixes work in existing worlds. Improved cave, root and
forest decoration needs newly generated chunks. Terrain eligibility is
independent of cobblestone equivalence; crafted blocks stay outside natural
replacement. Single/upright slabs and stairs join the vanilla aggregates;
separate double slabs remain full blocks. Construction tags, recipes, unlocks
and loot tables tolerate forms disabled by content settings. Enabled recipes
and drops are unchanged. Sulfur-cube compatibility is only for 26.2+.

Natural bats can spawn above Mineralogy terrain under Minecraft's normal dark,
below-surface conditions. The additive bat tag applies to existing worlds and
is independent of cobblestone equivalence; crafted construction blocks remain
excluded.

## Configuration and help

Mineralogy's content and recipe switches remain in
Expand Down
17 changes: 11 additions & 6 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,7 @@ tasks.register('verifyReleaseConfiguration') {
group = 'verification'
description = 'Verifies the exact Mineralogy 26.1.2 NeoForge release identity.'
doLast {
if (project.mod_version != '6.1.2.2601022'
if (project.mod_version != '6.1.4.2601022'
|| project.mod_group != expectedMavenGroup
|| project.minecraft_version != '26.1.2'
|| project.neo_version != '26.1.2.94') {
Expand All @@ -475,7 +475,7 @@ tasks.register('verifyReleaseDependencies') {
group = 'verification'
description = 'Resolves and verifies the exact released OreSpawn dependency.'
doLast {
if (project.mod_version != '6.1.2.2601022'
if (project.mod_version != '6.1.4.2601022'
|| project.minecraft_version != project.mc_version
|| project.mc_version != '26.1.2'
|| project.loader_name != 'neoforge'
Expand Down Expand Up @@ -792,8 +792,10 @@ tasks.register('verifyReleaseArtifacts') {
"data/mineralogy/advancement/recipes/${bridge.name}.json")))
if (recipe.type != 'minecraft:crafting_shapeless' || recipe.ingredients?.size() != 1 ||
recipe.ingredients[0] != bridge.source || recipe.result?.id != bridge.result ||
recipe.result?.count != 1 || recipe.containsKey('neoforge:conditions') ||
advancement.containsKey('neoforge:conditions') ||
recipe.result?.count != 1 ||
recipe['neoforge:conditions'] != [[type: 'neoforge:registered', registry: 'minecraft:item',
value: bridge.source.startsWith('mineralogy:') ? bridge.source : bridge.result]] ||
advancement['neoforge:conditions'] != recipe['neoforge:conditions'] ||
advancement.criteria?.has_rock?.conditions?.items?.getAt(0)?.items != bridge.source) {
throw new GradleException("Invalid native/Mineralogy slab conversion: ${bridge.name}")
}
Expand Down Expand Up @@ -855,8 +857,8 @@ tasks.register('verifyReleaseArtifacts') {
}
slabOverrides.each { recipe ->
def data = new JsonSlurper().parse(zip.getInputStream(zip.getEntry("data/minecraft/recipe/${recipe}.json")))
if (data.containsKey('neoforge:conditions')) {
throw new GradleException("Guaranteed Mineralogy slab override must be unconditional: ${recipe}")
if (data['neoforge:conditions'] != [[type: 'neoforge:registered', registry: 'minecraft:item', value: data.result?.id]]) {
throw new GradleException("Invalid optional Mineralogy slab guard: ${recipe}")
}
if (recipe.endsWith('_stonecutting')) {
if (!(data.result instanceof Map) || data.result.id == null
Expand Down Expand Up @@ -1140,3 +1142,6 @@ tasks.named('check') {
dependsOn tasks.named('verifyOilCompatibilityFixtureIsolation')
dependsOn tasks.named('compileRecipeIntegrationFixture')
}

apply from: 'gradle/verify-terrain-compatibility.gradle'
apply from: 'gradle/terrain-compatibility-probe.gradle'
20 changes: 20 additions & 0 deletions docs/DEVELOPER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,26 @@ Inspect complete client/server logs and test the reobfuscated jar with released
OreSpawn in a launcher-like NeoForge installation. The normal jar packages this
guide under `META-INF/mineralogy/docs/`.

## Terrain Compatibility

The isolated terrain generator maintains additive block/item interfaces without
rewriting recipe payloads or provider data. Natural terrain has 37 identities;
common stone excludes sandstone and crafted forms. Sulfur-cube resources do
not exist on this target. Optional construction entries use objects inside
`values`; separate double slabs are not classified as vanilla slabs.

Required Mixins extend only the dripstone water-pocket and large-column
containment checks. Each verifies exactly one native base-stone field access.
Do not broaden global base-stone or ore-host tags. Roots and forest rocks use
dedicated substrate tags; bare rock remains outside azalea-growing soil.

Canonical `c:` classifications cover raw stone, furnace workstations, ores,
storage blocks and dyed drywall. Cobblestone policy preserves third-party
members and unconditional chert/pumice across initial loading and reloads.
Native recipe/advancement conditions guard missing construction items; loot
uses the existing construction flags and their registration prerequisites.
Enabled payloads remain unchanged. Keep validation probes outside release jars.

The complete release version is `Major.Minor.Bug.Target`; see
[Mineralogy Versioning](VERSIONS.md). This branch validates target `2601022`
for Minecraft 26.1.2 NeoForge and does not append CI build numbers.
17 changes: 17 additions & 0 deletions docs/PLAYER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,23 @@ from loading. Let the game or server stop normally after the upgrade so
converted chunks can be saved. A complete copied world test is strongly
recommended before upgrading the original.

## Natural Stone Compatibility

Natural Mineralogy rocks support sculk spread after an XP-producing mob dies,
moss growth, dripstone decoration and bats under Minecraft's normal light and
height rules. Goats can spawn on natural rocks; harder raw rocks can break their
horns. Soft rocks and crafted construction blocks cannot break horns.

These behaviour changes apply to existing worlds after updating. Root, forest
rock and cave decoration improves in newly generated chunks. Bare rocks still
cannot grow azalea trees. The natural rules do not depend on cobblestone
equivalence, and this Minecraft version has no sulfur cubes.

Single and upright slabs, stairs and walls have their normal classifications;
separate double slabs remain full blocks. Rock-salt lamps keep the centre post
when placed on straight walls. Disabling construction content also skips its
recipes, unlocks and loot tables; enabled recipes and normal drops are unchanged.

## What Mineralogy Adds

- Sedimentary, metamorphic, intrusive igneous, and volcanic igneous rocks.
Expand Down
85 changes: 59 additions & 26 deletions docs/VERSIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ exact Minecraft/loader target are both visible in one number.
Major.Minor.Bug.Target
```

The first three components are the **functional version**. Mineralogy `6.1.2`
means major generation 6, minor release 1, and bug revision 2.
The first three components are the **functional version**. Mineralogy `6.1.4`
means major generation 6, minor release 1, and bug revision 4.

The fourth component identifies the target build. The complete version for
this Minecraft 26.1.2 NeoForge release is therefore:

```text
6.1.2.2601022
6.1.4.2601022
```

This expanded numeric form is compatible with Maven version ordering, but it
Expand All @@ -25,7 +25,7 @@ components.

The release tag is exactly the complete four-component version, with no
redundant Minecraft-version prefix. For this branch the tag is therefore
`6.1.2.2601022`, not `26.1.2-6.1.2.2601022`. The Target already makes tags unique
`6.1.4.2601022`, not `26.1.2-6.1.4.2601022`. The Target already makes tags unique
across Minecraft versions and loaders.

## Reading the target component
Expand All @@ -50,30 +50,57 @@ minor digits, and all remaining digits for the Minecraft major version.
| 1.12.2 | Forge | `112021` | `6.0.1.112021` |
| 1.14.4 | Forge | `114041` | `6.0.1.114041` |
| 1.15.2 | Forge | `115021` | `6.0.1.115021` |
| 1.16.5 | Forge | `116051` | `6.1.0.116051` |
| 1.17.1 | Forge | `117011` | `6.1.0.117011` |
| 1.18.2 | Forge | `118021` | `6.1.2.118021` |
| 1.19.4 | Forge | `119041` | `6.1.2.119041` |
| 1.20.1 | Forge | `120011` | `6.1.2.120011` |
| 1.20.6 | Forge | `120061` | `6.1.2.120061` |
| 1.20.6 | NeoForge | `120062` | `6.1.2.120062` |
| 1.21.1 | Forge | `121011` | `6.1.2.121011` |
| 1.21.1 | NeoForge | `121012` | `6.1.2.121012` |
| 1.21.11 | Forge | `121111` | `6.1.2.121111` |
| 1.21.11 | NeoForge | `121112` | `6.1.2.121112` |
| 26.1.2 | Forge | `2601021` | `6.1.2.2601021` |
| 26.1.2 | NeoForge | `2601022` | `6.1.2.2601022` |
| 26.2 | Forge | `2602001` | `6.0.0.2602001` |
| 26.2 | NeoForge | `2602002` | `6.0.0.2602002` |

The 26.1.2 NeoForge row records this branch's current release. The other rows illustrate
target encoding or earlier releases; they do not claim that later Minecraft
targets already contain the same functional changes.
| 1.16.5 | Forge | `116051` | `6.1.4.116051` |
| 1.17.1 | Forge | `117011` | `6.1.4.117011` |
| 1.18.2 | Forge | `118021` | `6.1.4.118021` |
| 1.19.4 | Forge | `119041` | `6.1.4.119041` |
| 1.20.1 | Forge | `120011` | `6.1.4.120011` |
| 1.20.6 | Forge | `120061` | `6.1.4.120061` |
| 1.20.6 | NeoForge | `120062` | `6.1.4.120062` |
| 1.21.1 | Forge | `121011` | `6.1.4.121011` |
| 1.21.1 | NeoForge | `121012` | `6.1.4.121012` |
| 1.21.11 | Forge | `121111` | `6.1.4.121111` |
| 1.21.11 | NeoForge | `121112` | `6.1.4.121112` |
| 26.1.2 | Forge | `2601021` | `6.1.4.2601021` |
| 26.1.2 | NeoForge | `2601022` | `6.1.4.2601022` |
| 26.2 | Forge | `2602001` | `6.1.4.2602001` |
| 26.2 | NeoForge | `2602002` | `6.1.4.2602002` |
| 26.3 | Forge | `2603001` | `6.1.4.2603001` |
| 26.3 | NeoForge | `2603002` | `6.1.4.2603002` |

The 6.1.4 rows identify the builds in the terrain-compatibility release campaign.
Availability for each Minecraft version and loader is shown on CurseForge.
Older examples illustrate target encoding; Forge 1.13–1.15 remain outside this
campaign.

Historical Mineralogy releases may also have four numeric components that used
the last number as an ordinary build sequence. The target policy applies to
new releases and does not reinterpret an old file's version.


## Vanilla stone compatibility campaign

The following builds share the 6.1.4 additive terrain compatibility fixes.
Use the file for your exact Minecraft version and loader. NeoForge 26.3 also
retains its existing 6.1.3 compatibility correction.

| Minecraft | Forge build | NeoForge build |
| --- | --- | --- |
| 1.16.5 | 6.1.4.116051 | Not in scope |
| 1.17.1 | 6.1.4.117011 | Not in scope |
| 1.18.2 | 6.1.4.118021 | Not in scope |
| 1.19.4 | 6.1.4.119041 | Not in scope |
| 1.20.1 | 6.1.4.120011 | Not in scope |
| 1.20.6 | 6.1.4.120061 | 6.1.4.120062 |
| 1.21.1 | 6.1.4.121011 | 6.1.4.121012 |
| 1.21.11 | 6.1.4.121111 | 6.1.4.121112 |
| 26.1.2 | 6.1.4.2601021 | 6.1.4.2601022 |
| 26.2 | 6.1.4.2602001 | 6.1.4.2602002 |
| 26.3 | 6.1.4.2603001 | 6.1.4.2603002 |

Each target uses its own native compatibility interfaces. Native-texture
synchronization remains a separate campaign.

## Major version

The **Major** number changes for a fundamental or breaking new generation of
Expand Down Expand Up @@ -130,7 +157,7 @@ Minecraft 1.20.1 / Forge / Mineralogy 6.1.2.120011
Minecraft 1.20.6 / Forge / Mineralogy 6.1.2.120061
Minecraft 1.21.1 / NeoForge / Mineralogy 6.1.2.121012
Minecraft 1.21.11 / NeoForge / Mineralogy 6.1.2.121112
Minecraft 26.1.2 / NeoForge / Mineralogy 6.1.2.2601022
Minecraft 26.1.2 / NeoForge / Mineralogy 6.1.4.2601022
```

Minecraft and loader APIs may require different internal code without changing
Expand Down Expand Up @@ -163,7 +190,7 @@ particular jar can load on the current game.

Mineralogy 6 also requires OreSpawn `[4.0.6,5.0.0)`. OreSpawn uses the same
target calculation, so the matching Minecraft 26.1.2 NeoForge release used for
this candidate is `4.0.16.2601022`. The dependency range deliberately describes the supported
this build is `4.0.16.2601022`. The dependency range deliberately describes the supported
functional OreSpawn generation; NeoForge still prevents jars for another
Minecraft target from loading together.

Expand All @@ -173,10 +200,16 @@ feature generation, not the exact jar.

## Builds and release notes

This 6.1.4 release also repairs natural bat substrate eligibility.
Minecraft introduced the bats_spawnable_on block tag in 1.21.2; the compatibility
interface belongs only on 1.21.2-and-later targets. Earlier Minecraft targets
remain unchanged. The additive block tag reuses natural terrain membership,
not the broad base_stone_overworld tag, and preserves vanilla spawn restrictions.

The Gradle build reads the complete version from `mod_version`, verifies that
it has four numeric components, and checks that its Target matches the declared
Minecraft version and NeoForge loader. CI build numbers are not appended. For this
branch, published metadata and artifacts therefore use `6.1.2.2601022`.
branch, published metadata and artifacts therefore use `6.1.4.2601022`.

Every release note should state:

Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ org.gradle.caching=true
org.gradle.parallel=false
neogradle.subsystems.decompiler.enabled=true

mod_version=6.1.2.2601022
mod_version=6.1.4.2601022
mod_group=zone.moddev.mc.mineralogy
mod_group_id=zone.moddev.mc.mineralogy
mod_id=mineralogy
Expand Down
23 changes: 23 additions & 0 deletions gradle/terrain-compatibility-probe.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
def probeClasses = layout.buildDirectory.dir('terrain-compatibility-fixture/classes')
tasks.register('compileTerrainCompatibilityProbe', JavaCompile) {
dependsOn tasks.named('classes'), tasks.named('compileRecipeIntegrationFixture')
source fileTree('src/terrainCompatibilityTest/java')
classpath = files(sourceSets.main.output, sourceSets.main.compileClasspath, layout.buildDirectory.dir('recipe-integration-fixture/classes'))
destinationDirectory = probeClasses
javaCompiler = javaToolchains.compilerFor {
languageVersion = JavaLanguageVersion.of(Integer.parseInt(project.java_version))
vendor = JvmVendorSpec.ADOPTIUM
}
options.encoding = 'UTF-8'
options.release = Integer.parseInt(project.java_version)
}
tasks.register('terrainCompatibilityProbeJar', Jar) {
dependsOn tasks.named('compileTerrainCompatibilityProbe')
archiveFileName = 'terraincompatibilityprobe.jar'
destinationDirectory = layout.buildDirectory.dir('terrain-compatibility-fixture')
from probeClasses
from 'src/terrainCompatibilityTest/resources'
from(layout.buildDirectory.dir('recipe-integration-fixture/classes')) { include 'zone/moddev/mc/mineralogy/fixture/RecipeIntegrationAssertions*.class' }
from('src/test/resources') { include 'tag-compatibility-contract.json', 'construction-resource-contract.json' }
}
tasks.named('check') { dependsOn tasks.named('compileTerrainCompatibilityProbe') }
Loading
Loading