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 @@ -148,9 +148,9 @@ jobs:
if-no-files-found: error
retention-days: 30
path: |
build/libs/Mineralogy-6.1.2.120011.jar
build/libs/Mineralogy-6.1.2.120011-sources.jar
build/libs/Mineralogy-6.1.2.120011-javadoc.jar
build/libs/Mineralogy-6.1.4.120011.jar
build/libs/Mineralogy-6.1.4.120011-sources.jar
build/libs/Mineralogy-6.1.4.120011-javadoc.jar
build/release/SHA256SUMS
CHANGELOG.txt

Expand Down
16 changes: 16 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
Mineralogy 6.1.4.120011 for Minecraft 1.20.1 Forge

- Sculk can spread across natural Mineralogy terrain. Goats can spawn on it,
and the harder raw rocks can break their horns. These changes also work in
existing worlds; polished and crafted rocks are not natural terrain.
- Moss, dripstone, azalea roots and forest rocks recognise natural terrain in
newly generated chunks. Fixed two dripstone checks without changing general
base-stone tags or ore hosts. Bare rock is still not soil for growing trees.
- Single slabs, stairs and walls join 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 and loot references.
Recipes, IDs, configs, providers, migrations, textures and the released
OreSpawn dependency are unchanged. There are no sulfur cubes on this target.

Mineralogy 6.1.2.120011 for Minecraft 1.20.1

- 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.120011` for Forge `47.4.10` and is built
This branch builds Mineralogy `6.1.4.120011` for Forge `47.4.10` and is built
and tested against OreSpawn `4.0.16.120011`. Its declared compatibility range is
OreSpawn `[4.0.6,5.0.0)`. Install both mods on clients and servers.

Mineralogy 6.1.4 lets sculk spread and goats spawn on natural Mineralogy terrain.
The harder raw rocks can break goat horns. Moss, dripstone, azalea roots and
forest rocks recognise natural terrain, while polished and crafted blocks stay
out of these natural replacement rules. Bare rock is still not tree soil.
These interactions work in existing worlds; naturally generated decoration
improves in new chunks. Slabs, stairs, walls, raw rocks, ores and storage blocks
also have the matching vanilla and Forge classifications. Rock-salt lamps keep
the wall post beneath them, and disabled construction forms load safely.
Recipes, IDs, configs, providers, migrations, textures and OreSpawn 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 @@ -573,7 +573,7 @@ tasks.register('verifyReleaseConfiguration') {
description = 'Verifies the exact Mineralogy 1.20.1 release identity.'
dependsOn tasks.named('verifyMavenizerCompatibilityFixture')
doLast {
if (project.mod_version != '6.1.2.120011'
if (project.mod_version != '6.1.4.120011'
|| project.mod_group != expectedMavenGroup
|| project.minecraft_version != '1.20.1'
|| project.forge_version != '47.4.10'
Expand All @@ -588,7 +588,7 @@ tasks.register('verifyReleaseDependencies') {
group = 'verification'
description = 'Resolves and verifies the exact released OreSpawn dependency.'
doLast {
if (project.mod_version != '6.1.2.120011'
if (project.mod_version != '6.1.4.120011'
|| project.minecraft_version != project.mc_version
|| project.mc_version != '1.20.1'
|| project.loader_name != 'forge'
Expand Down Expand Up @@ -1227,7 +1227,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.120011"')) {
if (eclipseMetadata.contains('${') || !eclipseMetadata.contains('version="6.1.4.120011"')) {
throw new GradleException('Eclipse output contains unresolved or invalid Mineralogy version metadata')
}
}
Expand All @@ -1254,3 +1254,6 @@ tasks.named('check') {
dependsOn tasks.named('compileMiningIntegrationFixture')
dependsOn tasks.named('verifyMiningIntegrationFixtureIsolation')
}

apply from: 'gradle/verify-terrain-compatibility.gradle'
apply from: 'gradle/terrain-compatibility-probe.gradle'
17 changes: 17 additions & 0 deletions docs/DEVELOPER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,23 @@ 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 stone tags

`mineralogy:terrain_rocks` contains this target's 32 provider outputs and five
retained legacy identities. Its block and item tags are separate. Additive
consumer tags cover sculk, moss, dripstone, azalea roots and goat spawning; horn
breaking has a narrower raw-rock whitelist. Crafted forms are not terrain.
Forge's common stone, ore and storage aggregates and vanilla shape tags are
kept separate from world-generation hosts. Normal cobblestone follows the
existing configurable root policy, including unconditional chert and pumice.

Two exact-count JavaScript transformers replace only the proven direct
base-stone checks in dripstone water pockets and large columns. Forge 47's
Gson loot loader needs a separate scoped hook: an explicitly guarded Mineralogy
construction table keeps its original pools when its item is registered and
loads as an empty table otherwise. Other namespaces and unguarded tables are
untouched. No general base-stone or ore-host tag is broadened.

## Packaged Provider

The schema-4, revision-3 provider is at:
Expand Down
10 changes: 10 additions & 0 deletions docs/PLAYER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,16 @@ Mineralogy 6 needs Minecraft 1.20.1, Forge 47.4.10, and OreSpawn
Install matching Mineralogy and OreSpawn jars on both clients and servers. Do
not open a world containing Mineralogy blocks without Mineralogy installed.

## Natural stone interactions

Sculk catalysts and moss can spread over natural Mineralogy rocks. Goats can
spawn on that terrain, and harder raw rocks can break their horns. Polished
blocks, bricks and other construction forms stay outside these natural rules.
Azalea roots, forest rocks and dripstone recognise natural rocks in new chunks;
bare rock is still not soil for growing an azalea tree. These rules do not depend
on the cobblestone-equivalence setting. Rock-salt lamps retain the post beneath
them when placed on a wall.

## Creating Or Upgrading A World

Open **OreSpawn World Generation** while creating a world. **Recommended
Expand Down
44 changes: 35 additions & 9 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.20.1 Forge release is therefore:

```text
6.1.2.120011
6.1.4.120011
```

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.120011`, not `1.20.1-6.1.2.120011`. The Target already makes tags unique
`6.1.4.120011`, not `1.20.1-6.1.4.120011`. The Target already makes tags unique
across Minecraft versions and loaders.

## Reading the target component
Expand Down Expand Up @@ -54,7 +54,7 @@ minor digits, and all remaining digits for the Minecraft major version.
| 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.1 | Forge | `120011` | `6.1.4.120011` |
| 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 @@ -68,6 +68,32 @@ 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 target builds share the 6.1.4 terrain 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 version | NeoForge version |
| --- | --- | --- |
| 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 |

These builds are being released separately for each Minecraft version and loader.
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 @@ -92,7 +118,7 @@ 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.120011 -> 6.2.0.120011
6.1.4.120011 -> 6.2.0.120011
6.2.4.120011 -> 7.0.0.120011
```

Expand Down Expand Up @@ -120,7 +146,7 @@ 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.19.4 / Forge / Mineralogy 6.1.2.119041
Minecraft 1.20.1 / Forge / Mineralogy 6.1.2.120011
Minecraft 1.20.1 / Forge / Mineralogy 6.1.4.120011
```

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

Expand All @@ -166,7 +192,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.120011`.
branch, published metadata and artifacts therefore use `6.1.4.120011`.

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.120011
mod_version=6.1.4.120011
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