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

Expand Down
21 changes: 21 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,24 @@
Mineralogy 6.1.4.116051 for Minecraft 1.16.5 Forge

- Natural rocks now join the common stone tags used by forest-rock placement.
Crafted rocks and sandstone stay outside that contribution. Existing ore
and storage tags are connected to their common aggregates.
- Classified single/upright slabs, stairs and walls without treating the
separate double-slab blocks as slabs. Config-dependent construction entries
are optional, so disabling those blocks does not break tag loading. Loot
tables for disabled construction items load without unknown-item errors;
enabled drops are unchanged.
- Normal cobblestone follows the existing configurable cobblestone policy,
including reloads. Vanilla and other mods' members survive, and chert and
pumice remain unconditional equivalents.
- Rock-salt lamps retain straight-wall posts like vanilla torches.
- Fixed stale rock-furnace block-entity state on lit/unlit transitions while
keeping orientation, inventory, fuel and cooking progress.
- Existing worlds gain the block-behaviour fixes on update. Forest decoration
changes need new chunks. Recipes, registry IDs, configs, providers, ore
hosts and textures are unchanged. Later moss, dripstone, sculk, goat and
sulfur-cube systems do not exist on this target.

Mineralogy 6.1.0.116051 for Minecraft 1.16.5

- Delegated terrain, strata, ore, and covered fluid-deposit generation to the
Expand Down
18 changes: 17 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,26 @@ 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.0.116051` for Forge `36.2.34` and is built
This branch builds Mineralogy `6.1.4.116051` for Forge `36.2.34` and is built
and tested against OreSpawn `4.0.9.116051`. Its declared compatibility range is
OreSpawn `[4.0.6,5.0.0)`. Install both mods on clients and servers.

## Changes in 6.1.4

Natural Mineralogy rocks now work with Minecraft 1.16's forest-rock placement
and common stone tags. Slabs, stairs and walls are classified consistently,
and construction tags and loot no longer require blocks that have been disabled
in the config. Chert and pumice remain cobblestone equivalents regardless of
the cobblestone option; the normal-cobblestone tag follows the same policy.

Rock-salt lamps keep the post beneath them on straight walls. Rock furnaces
also refresh their retained block entity when lighting or cooling, preserving
contents, fuel, progress and facing without a stale-state warning.

Block behaviour changes apply to existing worlds. Forest decoration changes
apply to newly generated chunks. Moss, dripstone, sculk, goats and sulfur
cubes are not part of Minecraft 1.16, so their later-version fixes do not apply.

## Configuration and help

Mineralogy's content and recipe switches remain in
Expand Down
7 changes: 5 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,7 @@ tasks.register('verifyReleaseConfiguration') {
group = 'verification'
description = 'Verifies the exact Mineralogy 1.16 release identity.'
doLast {
if (project.mod_version != '6.1.0.116051'
if (project.mod_version != '6.1.4.116051'
|| project.mod_group != expectedMavenGroup
|| project.minecraft_version != '1.16.5'
|| project.forge_version != '36.2.34'
Expand All @@ -351,7 +351,7 @@ tasks.register('verifyReleaseDependencies') {
group = 'verification'
description = 'Resolves and verifies the exact released OreSpawn dependency.'
doLast {
if (project.mod_version != '6.1.0.116051'
if (project.mod_version != '6.1.4.116051'
|| project.minecraft_version != project.mc_version
|| project.mc_version != '1.16.5'
|| project.loader_name != 'forge'
Expand Down Expand Up @@ -897,3 +897,6 @@ tasks.named('check') {
dependsOn tasks.named('verifyReleaseDependencies')
dependsOn tasks.named('verifyMavenCoordinates')
}

apply from: 'gradle/terrain-compatibility-probe.gradle'
apply from: 'gradle/verify-terrain-compatibility.gradle'
27 changes: 27 additions & 0 deletions docs/DEVELOPER_GUIDE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,32 @@
# Mineralogy Developer Guide

## Terrain and construction tags

`mineralogy:terrain_rocks` contains the 32 provider outputs and four retained
legacy aliases on this target: 36 block and item identities. `raw_stones`
excludes native sandstone and contributes to `forge:stone`. It never includes
polished or crafted forms. Minecraft's forest-rock placement uses that common
block tag; no world generator or global ore-host tag is changed.

Single/upright slabs, stairs and walls join the matching block/item aggregates.
Separate double-slab blocks stay outside slab tags. Config-dependent forms
use optional objects inside `values`, not a top-level `optional` array.
Normal cobblestone follows the existing root policy after load and reload,
preserving unrelated members and unconditional chert/pumice.
Forge 36 has only a native root cobblestone tag, so the added normal category
starts with vanilla cobblestone and does not import mossy or infested members.

Forge 36 resolves loot item IDs before checking conditions. A single verified
`ForgeHooks.loadLootTable` hook empties only explicitly marked Mineralogy
construction pools whose item is unregistered. Registered drops and unrelated
tables are untouched; the transformer rejects a changed target signature.

Rock furnaces retain their tile entity during state changes. Forge 36 has a
lazy state cache rather than a setter: clear it, read the new world state,
then validate and reattach the retained entity. Keep the inventory guard in
`try/finally`. Mining still uses this target's harvest properties; do not
invent the mining tags introduced in Minecraft 1.17.

## Responsibility Split

| Mineralogy owns | OreSpawn owns |
Expand Down
13 changes: 13 additions & 0 deletions docs/PLAYER_GUIDE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,18 @@
# Mineralogy Player Guide

## Minecraft 1.16 compatibility fixes in 6.1.4

Natural rocks can now support Minecraft's forest-rock decoration. Rock-salt
lamps keep straight-wall posts, and rock furnaces retain their contents and
state correctly when lighting or cooling. These block fixes work in existing
worlds; decoration changes apply only to new chunks.

Slabs, stairs and walls are classified consistently. Disabling construction
does not leave required tag references to blocks that are no longer registered.
The normal-cobblestone tag follows the cobblestone option, with chert and pumice
always accepted. No later-version sculk, cave, goat or sulfur-cube behaviour
is added to Minecraft 1.16.

## Installing

Mineralogy 6 needs Minecraft 1.16.5, Forge 36.2.34, and OreSpawn
Expand Down
64 changes: 46 additions & 18 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.0`
means major generation 6, minor release 1, and bug revision 0.
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.16.5 Forge release is therefore:

```text
6.1.0.116051
6.1.4.116051
```

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.0.116051`, not `1.16.5-6.1.0.116051`. The Target already makes tags unique
`6.1.4.116051`, not `1.16.5-6.1.4.116051`. The Target already makes tags unique
across Minecraft versions and loaders.

## Reading the target component
Expand All @@ -50,21 +50,48 @@ 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.18.2 | Forge | `118021` | `6.0.0.118021` |
| 1.20.6 | Forge | `120061` | `6.0.0.120061` |
| 1.21.11 | Forge | `121111` | `6.0.0.121111` |
| 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.6 | Forge | `120061` | `6.1.2.120061` |
| 1.21.11 | Forge | `121111` | `6.1.2.121111` |
| 26.2 | Forge | `2602001` | `6.0.0.2602001` |
| 26.2 | NeoForge | `2602002` | `6.0.0.2602002` |

The 1.16.5 row records this branch's current release. The other rows illustrate
target encoding only; they do not claim that the 6.1.0 changes have already
been forward-ported.
The 1.16.5 row records this branch's release target. The other rows illustrate
target encoding or earlier releases; they do not claim that later Minecraft
targets already contain the same functional changes.

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 stone compatibility fixes.
This is a build matrix, not a claim that every release is published.
Each target carries only the interfaces supported by its Minecraft version.

| 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 |

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 @@ -89,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.0.116051 -> 6.2.0.116051
6.2.4.116051 -> 7.0.0.116051
6.1.4.119041 -> 6.2.0.119041
6.2.4.119041 -> 7.0.0.119041
```

## Bug version
Expand All @@ -114,8 +141,9 @@ Minecraft 1.10.2 / Forge / Mineralogy 6.0.0.110021
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.16.5 / Forge / Mineralogy 6.1.0.116051
Minecraft 1.18.2 / Forge / Mineralogy 6.0.0.118021
Minecraft 1.17.1 / Forge / Mineralogy 6.1.4.117011
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 @@ -147,8 +175,8 @@ excluding Mineralogy 7. Minecraft and loader metadata still decide whether a
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.16.5 Forge release is
`4.0.9.116051`. The dependency range deliberately describes the supported
target calculation, so the matching Minecraft 1.16.5 Forge release used for
this release is `4.0.9.116051`. The dependency range deliberately describes the supported
functional OreSpawn generation; Forge still prevents jars for another
Minecraft target from loading together.

Expand All @@ -161,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.0.116051`.
branch, published metadata and artifacts therefore use `6.1.4.116051`.

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.0.116051
mod_version=6.1.4.116051
mod_group=zone.moddev.mc.mineralogy

# Release metadata consumed by the generic dispatcher.
Expand Down
72 changes: 72 additions & 0 deletions gradle/terrain-compatibility-probe.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// 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'
}
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'
}
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