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
  •  
  •  
  •  
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@ jobs:
if-no-files-found: error
retention-days: 30
path: |
build/libs/Mineralogy-6.1.2.118021.jar
build/libs/Mineralogy-6.1.2.118021-sources.jar
build/libs/Mineralogy-6.1.2.118021-javadoc.jar
build/libs/Mineralogy-6.1.4.118021.jar
build/libs/Mineralogy-6.1.4.118021-sources.jar
build/libs/Mineralogy-6.1.4.118021-javadoc.jar
build/release/SHA256SUMS
CHANGELOG.txt

Expand Down
14 changes: 14 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
Mineralogy 6.1.4.118021 for Minecraft 1.18.2 Forge

- Moss, dripstone, azalea roots and forest rocks recognise natural Mineralogy
terrain in newly generated chunks. Two narrow dripstone checks are fixed
without changing general base-stone tags or ore hosts. Bare rock is not soil
for growing azalea trees. Goats can spawn on the rocks in existing worlds too.
- Single slabs, stairs and walls have the matching vanilla classifications.
Raw rocks, ores and storage blocks join Forge's common tags. Normal cobblestone
follows the same option as the root tag, with chert and pumice always valid.
- Rock-salt lamps keep a wall post beneath them, like a vanilla torch.
- Disabled construction forms no longer leave missing tag or loot references.
Recipes, IDs, configs, providers, migrations, textures and OreSpawn are
unchanged. Sculk, horn breaking and sulfur cubes are not part of this target.

Mineralogy 6.1.2.118021 for Minecraft 1.18.2

- Updated all pickaxe and harvest-tier tags to the supported optional
Expand Down
12 changes: 11 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,20 @@ 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.118021` for Forge `40.3.0` and is built
This branch builds Mineralogy `6.1.4.118021` for Forge `40.3.0` and is built
and tested against OreSpawn `4.0.10.118021`. Its declared compatibility range is
OreSpawn `[4.0.6,5.0.0)`. Install both mods on clients and servers.

Mineralogy 6.1.4 lets moss, dripstone, azalea roots and forest rocks recognise
natural Mineralogy terrain. Goats can spawn on it too. Polished and crafted
blocks stay outside these natural rules, and bare rock is still not tree soil.
Goat spawning works in existing worlds; natural decoration improves in newly
generated chunks. Slabs, stairs, walls, raw rocks, ores and storage blocks have
the matching vanilla and Forge classifications. Rock-salt lamps keep the wall
post beneath them, and disabled construction forms no longer leave missing
tag or loot references. Recipes, IDs, configs, providers, migrations, textures
and the released OreSpawn dependency are unchanged.

## Configuration and help

Mineralogy's content and recipe switches remain in
Expand Down
9 changes: 6 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -418,7 +418,7 @@ tasks.register('verifyReleaseConfiguration') {
description = 'Verifies the exact Mineralogy 1.18.2 release identity.'
dependsOn tasks.named('verifyMavenizerCompatibilityFixture')
doLast {
if (project.mod_version != '6.1.2.118021'
if (project.mod_version != '6.1.4.118021'
|| project.mod_group != expectedMavenGroup
|| project.minecraft_version != '1.18.2'
|| project.forge_version != '40.3.0'
Expand All @@ -433,7 +433,7 @@ tasks.register('verifyReleaseDependencies') {
group = 'verification'
description = 'Resolves and verifies the exact released OreSpawn dependency.'
doLast {
if (project.mod_version != '6.1.2.118021'
if (project.mod_version != '6.1.4.118021'
|| project.minecraft_version != project.mc_version
|| project.mc_version != '1.18.2'
|| project.loader_name != 'forge'
Expand Down Expand Up @@ -1047,7 +1047,7 @@ tasks.register('verifyEclipseProductionClasspath') {
throw new GradleException('Eclipse output contains stale or unexpanded mods.toml metadata')
}
String eclipseMetadata = eclipseModsToml.getText('UTF-8')
if (eclipseMetadata.contains('${') || !eclipseMetadata.contains('version="6.1.2.118021"')) {
if (eclipseMetadata.contains('${') || !eclipseMetadata.contains('version="6.1.4.118021"')) {
throw new GradleException('Eclipse output contains unresolved or invalid Mineralogy version metadata')
}
}
Expand All @@ -1073,3 +1073,6 @@ tasks.named('check') {
dependsOn tasks.named('compileMiningIntegrationFixture')
dependsOn tasks.named('verifyMiningIntegrationFixtureIsolation')
}

apply from: 'gradle/terrain-compatibility-probe.gradle'
apply from: 'gradle/verify-terrain-compatibility.gradle'
16 changes: 16 additions & 0 deletions docs/DEVELOPER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,22 @@ Mineralogy requires OreSpawn `[4.0.6,5.0.0)`. Reusable worldgen integrations
belong in `zone.moddev.mc.orespawn.api` or an OreSpawn provider rather than
Mineralogy internals.

## Natural-rock compatibility

The additive block/item `mineralogy:terrain_rocks` tags follow the 32 provider
outputs and five retained aliases. Cave/root and goat-spawn consumers use
this natural-only interface; polished and crafted forms are excluded. Dedicated
dripstone helpers accept native base stone or this terrain tag without adding
rocks to global base-stone or ore-host tags. Common stone excludes sandstone.
Single/upright slabs, stairs and walls join their vanilla aggregates; separate
double-slab blocks do not. Normal cobblestone follows the root option, retaining
unrelated members and unconditional chert/pumice after reload.

Forge 40 predates loot loading-condition codecs. The scoped loader hook empties
only explicitly guarded Mineralogy construction pools whose item is absent;
registered items and other mods' tables keep their payloads. Sculk, horn-breaking,
bat and sulfur-cube tags are not available on this Minecraft target.

## Packaged Provider

The schema-4, revision-3 provider is at:
Expand Down
6 changes: 6 additions & 0 deletions docs/PLAYER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ not open a world containing Mineralogy blocks without Mineralogy installed.

## Creating Or Upgrading A World

Natural Mineralogy rocks now work with moss, dripstone, azalea roots and
forest rocks, and goats can spawn on them. Crafted blocks remain outside
these rules. Goat spawning works in existing worlds after updating;
natural cave and surface decoration improves in newly generated chunks.
Rock-salt lamps also keep the post on straight walls, like a vanilla torch.

Open **OreSpawn World Generation** while creating a world. **Recommended
Defaults** selects Mineralogy's Sky/geome Stable Layers profile. Use **Help &
Guide** for OreSpawn's explanation of geology, formations, geomes, ores, and
Expand Down
49 changes: 38 additions & 11 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 1.18.2 Forge release is therefore:

```text
6.1.2.118021
6.1.4.118021
```

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.118021`, not `1.18.2-6.1.2.118021`. The Target already makes tags unique
`6.1.4.118021`, not `1.18.2-6.1.4.118021`. The Target already makes tags unique
across Minecraft versions and loaders.

## Reading the target component
Expand All @@ -52,7 +52,8 @@ minor digits, and all remaining digits for the Minecraft major version.
| 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.18.2 | Forge | `118021` | `6.1.4.118021` |
| 1.19.4 | Forge | `119041` | `6.1.4.119041` |
| 1.20.6 | Forge | `120061` | `6.1.2.120061` |
| 1.21.11 | Forge | `121111` | `6.1.2.121111` |
| 26.2 | Forge | `2602001` | `6.0.0.2602001` |
Expand All @@ -66,6 +67,31 @@ 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 targets share the 6.1.4 stone compatibility fixes.
This is a release-target matrix, not a claim that every release is published.
NeoForge 26.3 retains its existing 6.1.3 compatibility correction.

| Minecraft | Forge target | NeoForge target |
| --- | --- | --- |
| 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 |

Sulfur cubes receive only the 31 raw Mineralogy items on 26.2 and 26.3, not
polished or brick forms. Earlier targets carry only the interfaces they support.
Forge 1.13.2–1.15.2 are deferred until their later 6.1 ports. Native-texture
synchronization remains a separate campaign.

## Major version

The **Major** number changes for a fundamental or breaking new generation of
Expand All @@ -90,8 +116,8 @@ When Major changes, Minor and Bug reset to zero. When Minor changes, Bug resets
to zero. The target for the actual build is then appended:

```text
6.1.2.118021 -> 6.2.0.118021
6.2.4.118021 -> 7.0.0.118021
6.1.4.119041 -> 6.2.0.119041
6.2.4.119041 -> 7.0.0.119041
```

## Bug version
Expand All @@ -116,7 +142,8 @@ Minecraft 1.12.2 / Forge / Mineralogy 6.0.1.112021
Minecraft 1.14.4 / Forge / Mineralogy 6.0.1.114041
Minecraft 1.15.2 / Forge / Mineralogy 6.0.1.115021
Minecraft 1.17.1 / Forge / Mineralogy 6.1.0.117011
Minecraft 1.18.2 / Forge / Mineralogy 6.1.2.118021
Minecraft 1.18.2 / Forge / Mineralogy 6.1.4.118021
Minecraft 1.19.4 / Forge / Mineralogy 6.1.4.119041
```

Minecraft and loader APIs may require different internal code without changing
Expand Down Expand Up @@ -149,8 +176,8 @@ 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 1.18.2 Forge release used for
this candidate is `4.0.10.118021`. The dependency range deliberately describes the supported
functional OreSpawn generation; Forge still prevents jars for another
this release is `4.0.10.118021`. The dependency range deliberately describes
the supported functional OreSpawn generation; Forge still prevents jars for another
Minecraft target from loading together.

Pack maintainers should record the complete four-component versions in pack
Expand All @@ -162,7 +189,7 @@ feature generation, not the exact jar.
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 Forge loader. CI build numbers are not appended. For this
branch, published metadata and artifacts therefore use `6.1.2.118021`.
branch, published metadata and artifacts therefore use `6.1.4.118021`.

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
net.minecraftforge.gradle.merge-source-sets=false

mod_version=6.1.2.118021
mod_version=6.1.4.118021
mod_group=zone.moddev.mc.mineralogy

# Release metadata consumed by the generic dispatcher.
Expand Down
74 changes: 74 additions & 0 deletions gradle/terrain-compatibility-probe.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// Assertions are compiled separately and included only in the isolated probe.
tasks.register('compileRecipeIntegrationFixture', JavaCompile) {
dependsOn tasks.named('classes')
source fileTree('src/recipeIntegrationTest/java')
classpath = files(sourceSets.main.output, sourceSets.main.compileClasspath)
destinationDirectory = layout.buildDirectory.dir('recipe-integration-fixture/classes')
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)
}
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'), tasks.named('generateTerrainCompatibilityReflectionMap')
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' }
from layout.buildDirectory.dir('terrain-compatibility-fixture/reflection')
}

// The production loader uses SRG members. Reflection strings are not bytecode
// references, so seal their aliases from this exact target's official mappings.
tasks.register('generateTerrainCompatibilityReflectionMap') {
inputs.file(minecraft.dependency.toSrgFile)
def destination = layout.buildDirectory.file('terrain-compatibility-fixture/reflection/terrain-reflection.properties')
outputs.file(destination)
doLast {
def aliases = new TreeMap<String, Set<String>>()
String owner = null
def mapping = inputs.files.singleFile
new java.util.zip.GZIPInputStream(new FileInputStream(mapping)).withCloseable { stream ->
stream.newReader('UTF-8').eachLine { line ->
if (!line.startsWith('\t')) {
def columns = line.split(' ')
if (columns.length == 2) owner = columns[1].replace('/', '.')
} else if (owner != null && !line.startsWith('\t\t')) {
def columns = line.trim().split(' ')
if (columns.length >= 2) {
String key = owner + '.' + columns[0]
aliases.computeIfAbsent(key) { new TreeSet<String>() }.add(columns[-1])
}
}
}
}
if (aliases.isEmpty()) throw new GradleException('Missing pinned reflection aliases')
def output = destination.get().asFile
output.parentFile.mkdirs()
output.setText(aliases.collect { key, names -> key + '=' + names.join(',') }.join('\n') + '\n', 'UTF-8')
}
}

def packagedTerrainCompatibilityProbe = renamer.classes(tasks.named('terrainCompatibilityProbeJar', Jar)) {
map.from minecraft.dependency.toSrgFile
output = layout.buildDirectory.file('terrain-compatibility-fixture/terraincompatibilityprobe-reobf.jar')
}
tasks.register('packagedTerrainCompatibilityProbeJar') { dependsOn packagedTerrainCompatibilityProbe }
tasks.named('check') { dependsOn tasks.named('compileTerrainCompatibilityProbe') }
Loading
Loading