diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 56463034f..7a165df7c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -141,9 +141,11 @@ jobs: ./gradlew "${gradle_args[@]}" first="$RUNNER_TEMP/basemetals-first" mkdir -p "$first" - cp build/libs/BaseMetals-3.0.2.113021.jar "$first/" - cp build/libs/BaseMetals-3.0.2.113021-sources.jar "$first/" - cp build/libs/BaseMetals-3.0.2.113021-javadoc.jar "$first/" + version="$(sed -n 's/^mod_version=//p' gradle.properties)" + echo "CI_RELEASE_VERSION=$version" >> "$GITHUB_ENV" + for classifier in '' -sources -javadoc; do + cp "build/libs/BaseMetals-$version$classifier.jar" "$first/" + done cp build/release/SHA256SUMS "$first/" - name: Rebuild and prove byte-identical archives @@ -159,9 +161,10 @@ jobs: -Dorg.gradle.java.installations.auto-download=false ) ./gradlew "${gradle_args[@]}" - cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.0.2.113021.jar" build/libs/BaseMetals-3.0.2.113021.jar - cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.0.2.113021-sources.jar" build/libs/BaseMetals-3.0.2.113021-sources.jar - cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-3.0.2.113021-javadoc.jar" build/libs/BaseMetals-3.0.2.113021-javadoc.jar + for classifier in '' -sources -javadoc; do + cmp "$RUNNER_TEMP/basemetals-first/BaseMetals-$CI_RELEASE_VERSION$classifier.jar" \ + "build/libs/BaseMetals-$CI_RELEASE_VERSION$classifier.jar" + done cmp "$RUNNER_TEMP/basemetals-first/SHA256SUMS" build/release/SHA256SUMS - name: Run exact-OreSpawn dedicated-server probe @@ -185,9 +188,7 @@ jobs: if-no-files-found: error retention-days: 30 path: | - build/libs/BaseMetals-3.0.2.113021.jar - build/libs/BaseMetals-3.0.2.113021-sources.jar - build/libs/BaseMetals-3.0.2.113021-javadoc.jar + build/libs/*.jar build/release/SHA256SUMS CHANGELOG.txt diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 7ac889a5c..2f6d9c011 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,23 @@ +3.0.3.113021 for Minecraft 1.13.2 + +- Widen the gap between ore overlays and their host blocks to stop the textures flickering. +- Review metal mining levels independently of the legacy hardness score, including soft metals and Invar. +- Separate solid-metal and ore requirements, and document all material choices. +- Use the normal hammer mining speed for ores and storage blocks from other mods. +- Use OreSpawn 4.1.7 for the latest world generation and saved-profile fixes. +- Fix a startup hang with other fluid-adding mods, without disabling parallel loading. +- Allow iron and gold blends to replace matching dust in steel, invar and + electrum recipes, including mixed dust and blend inputs. +- Register the legacy save hook after parallel mod loading, avoiding a startup race + that could crash world loading or saving with other Metals mods. +- Reveal furnace recipes when you collect their ingredients. +- Recover coal from dust through the coal-block recipe. Coal powders no longer + burn directly, matching the standalone Modern Metals processing route. +- Discover recipes from saved inventories on login and after a data pack reload, + and restore earned recipes when changing back to an eligible Fantasy Level. +- Give the quartz trapdoor a four-quartz diamond pattern so its recipe can be + distinguished from vanilla's quartz block recipe. + Base Metals 3.0.2.113021 - Fix an error converting leaves when you open a 1.10.2 or 1.12.2 world in diff --git a/README.md b/README.md index 99384da12..528a3cd60 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ shields, bows, crossbows, arrows, and bolts. The mod also includes Crack Hammers, scythes, metal anvils, the human detector, villager trades, advancements, and extra loot to find in chests. -This is the Minecraft 1.13.2 version, `3.0.1.113021`, adapted from the 1.18.2 +This is the Minecraft 1.13.2 version, `3.0.3.113021`, adapted from the 1.18.2 port. It keeps the historical `basemetals` block and item IDs, but no longer needs MMDLib or Additional Loot Tables. OreSpawn places the ores, and Base Metals supplies the metals and their recipes. @@ -22,14 +22,32 @@ Metals supplies the metals and their recipes. - Minecraft `1.13.2` - Forge `25.0.223` - Java 8 -- OreSpawn `[4.1.0.113021,5.0.0)` on both client and server +- OreSpawn `[4.1.7.113021,5.0.0)` on both client and server -Put `BaseMetals-3.0.1.113021.jar` and OreSpawn `4.1.0.113021` (or a later +Put `BaseMetals-3.0.3.113021.jar` and OreSpawn `4.1.7.113021` (or a later compatible OreSpawn 4 build for 1.13.2) in the `mods` directory. MMDLib and Additional Loot Tables are not dependencies. Mineralogy is optional. ## Materials and gameplay +Collecting an ingredient reveals the recipes that use it in the crafting or +furnace book. Saved inventories are checked when joining a world and after a +data pack reload. The changelog lists the processing, mining and ore overlay +fixes in this release. + +Ore overlays use the wider gap from the legacy branches to prevent flickering +against their host textures, including resource pack replacements. + +Coal dust and small coal dust need processing before use as fuel. Nine dust +make a coal block, which can be crafted back into nine coal. + +Iron blends can replace iron dust in steel and invar. Gold blends can replace +gold dust in electrum. You can mix whole blends and matching dust in the same +recipe, with the usual output quantities. + +The quartz trapdoor uses four quartz in a diamond pattern in the crafting +table. A square of four quartz makes the vanilla quartz block. + Base Metals provides 22 materials: - Natural and industrial metals: Antimony, Bismuth, Copper, Lead, Mercury, @@ -41,12 +59,20 @@ Not every material has every form. Recipes use Forge tags, so compatible ores, ingots, powders, plates, rods, gears and other components from different mods can be used together. +[The mining-level audit](docs/MINING_LEVELS.md) lists every material's tool, +solid-block and ore requirements, with the evidence and gameplay assumptions. +Iron and steel remain the reference for ordinary engineering tools; rarity +and scratch hardness alone do not grant a higher mining tier. +New smith offers also follow the reviewed tiers through the existing pricing formula. + Notable mechanics include: - Crack Hammers crush ores and other supported blocks as you mine them. They can also crush dropped items by using the hammer on the block beneath them; sneaking processes as much of a stack as the hammer's remaining durability allows. + The hammer must meet the block's mining level. Ores and storage blocks from + other mods use normal hammer mining speed through the shared Forge block tags. - Supported ore powders can be smelted into ingots, and alloy blends provide the historical furnace-based alloying route. - Scythes harvest plants in a horizontal 3x3 area. They work with enchantments @@ -183,7 +209,7 @@ builds, CodeQL, wrapper validation, and Eclipse classpath isolation. Test probes and historical fixtures are excluded from the published JAR. Development and CI use the published -[OreSpawn 4.1.0.113021 release](https://www.curseforge.com/minecraft/mc-mods/mmd-orespawn/files/9035885) +[OreSpawn 4.1.7.113021 release](https://www.curseforge.com/minecraft/mc-mods/mmd-orespawn/files/9611746) from CurseMaven. The build checks its exact file ID and SHA-256 before release auditing and packaged tests; no local OreSpawn build is needed. diff --git a/build.gradle b/build.gradle index d6050c4c6..ea363b97c 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,7 @@ import groovy.xml.XmlSlurper import java.security.MessageDigest import java.util.jar.Manifest import java.util.zip.ZipFile +import org.apache.tools.ant.filters.FixCrLfFilter plugins { id 'java' @@ -62,15 +63,29 @@ tasks.withType(Test).configureEach { workingDir = project.projectDir } tasks.withType(Javadoc).configureEach { + inputs.property('releaseJavadocFormat', 'UTF-8 sorted sources 1') + setSource(files(project.providers.provider { + project.sourceSets.main.allJava.files.sort { project.relativePath(it).replace('\\', '/') } + })) failOnError = false options.encoding = 'UTF-8' options.addStringOption('Xdoclint:none', '-quiet') + options.addStringOption('docencoding', 'UTF-8') + options.addStringOption('charset', 'UTF-8') options.addBooleanOption('notimestamp', true) } tasks.withType(AbstractArchiveTask).configureEach { + inputs.property('releaseArchiveTextFormat', 'UTF-8 LF no empty directories 1') preserveFileTimestamps = false reproducibleFileOrder = true + includeEmptyDirs = false + filesMatching(['**/*.java', '**/*.json', '**/*.html', '**/*.css', '**/*.js', + '**/*.lang', '**/*.mcmeta', '**/*.md', '**/*.txt', '**/*.xml', + '**/*.properties', '**/*.cfg', '**/*.info', '**/package-list', '**/element-list']) { + filter(FixCrLfFilter, eol: FixCrLfFilter.CrLf.newInstance('lf')) + } } +tasks.withType(Jar).configureEach { filteringCharset = 'UTF-8' } sourceSets { // Build-only model generator; not part of the mod jar. @@ -88,6 +103,12 @@ sourceSets { dependencies { testImplementation sourceSets.modelGenerator.output } +tasks.withType(ProcessResources).configureEach { + if (name in ['processIntegrationTestResources', 'processClientIntegrationTestResources']) { + inputs.property('probeTargetVersion', project.mod_version) + filesMatching('META-INF/mods.toml') { expand(mod_version: project.mod_version) } + } +} configurations { orespawnRelease integrationTestImplementation.extendsFrom implementation @@ -531,7 +552,7 @@ tasks.register('verifyReleaseConfiguration') { loaderCode: project.loader_code.toString(), javaVersion: project.java_version.toString(), gradleJavaVersion: project.gradle_java_version.toString(), curseForgeProjectId: project.curseforge_project_id.toString()] - def expected = [modVersion: '3.0.2.113021', modGroup: expectedMavenGroup, + def expected = [modVersion: '3.0.3.113021', modGroup: expectedMavenGroup, minecraftVersion: '1.13.2', forgeVersion: '25.0.223', forgeInstallerSha256: 'D46CB326E7DC32695084090C8169BB57F32F1C23B801DDB35A336F252E381191', mappingChannel: 'snapshot', mappingVersion: '20180921-1.13', @@ -544,8 +565,8 @@ tasks.register('verifyReleaseConfiguration') { tasks.register('verifyReleaseDependencies') { group = 'verification' doLast { - def expected = [version: '4.1.0.113021', curseProjectId: '245586', curseFileId: '9035885', - sha256: '66C9CC5F8BE8F08F3DD5FA26EBEA79B52972B2FB86CB4DADBEEBC29AC01D3435'] + def expected = [version: '4.1.7.113021', curseProjectId: '245586', curseFileId: '9611746', + sha256: 'E65DCCA0623A20111C40779CB0FE2078E98C618FAA68F79C9A28E1E53C63957E'] if (configuredOreSpawnIdentity != expected) { throw new GradleException("Unexpected OreSpawn identity: ${configuredOreSpawnIdentity}") } @@ -560,7 +581,7 @@ tasks.register('verifyReleaseDependencies') { if (metadataEntry == null) throw new GradleException('OreSpawn mod metadata is missing') String metadata = zip.getInputStream(metadataEntry).getText('UTF-8') if (!metadata.contains('modId="orespawn"') - || !metadata.contains('version="4.1.0.113021"') + || !metadata.contains('version="4.1.7.113021"') || !metadata.contains('versionRange="[1.13.2]"') || zip.getEntry('zone/moddev/mc/orespawn/api/OreSpawnApi.class') == null) { throw new GradleException('Expected the published Minecraft 1.13.2 OreSpawn 4.1 release and public API') @@ -621,7 +642,7 @@ tasks.register('verifyReleaseArtifacts') { } String modsToml = zip.getInputStream(zip.getEntry('META-INF/mods.toml')).getText('UTF-8') if (modsToml.contains('${') || !modsToml.contains("version=\"${project.mod_version}\"") - || !modsToml.contains('versionRange="[4.1.0.113021,5.0.0)"')) { + || !modsToml.contains('versionRange="[4.1.7.113021,5.0.0)"')) { throw new GradleException('Release mods.toml contains unresolved or incompatible metadata') } def provider = new JsonSlurper().parse(zip.getInputStream( @@ -701,6 +722,13 @@ tasks.withType(PublishToMavenRepository).configureEach { ? tasks.named('verifyReleaseArtifacts') : tasks.named('verifyPreparedReleaseArtifacts')) } +def verifyFluidRegistration = tasks.register('verifyFluidRegistration', Exec) { + group = 'verification' + description = 'Checks that shared fluid registries are only written during sequential registration.' + commandLine 'node', '--test', 'tools/test_fluid_registration.js' +} +tasks.named('check') { dependsOn verifyFluidRegistration } + def verifyGeneratedData = tasks.register('verifyGeneratedData', Exec) { group = 'verification' description = 'Regenerates and proves that the committed Minecraft 1.13.2 resource projection is current.' @@ -1043,10 +1071,12 @@ def compileClientIntegrationTestMod = tasks.register('compileClientIntegrationTe } def clientIntegrationTestModJar = tasks.register('clientIntegrationTestModJar', Jar) { dependsOn compileClientIntegrationTestMod + inputs.property('probeTargetVersion', project.mod_version) archiveFileName = 'basemetalsclientprobe-deobf.jar' destinationDirectory = layout.buildDirectory.dir('client-integration-fixture') from clientIntegrationClasses from 'src/clientIntegrationTest/resources' + filesMatching('META-INF/mods.toml') { expand(mod_version: project.mod_version) } } def oreOverlayClientFixtures = layout.buildDirectory.dir('ore-overlay-client-fixtures') def generateOreOverlayClientFixtures = tasks.register('generateOreOverlayClientFixtures', JavaExec) { @@ -1301,3 +1331,5 @@ tasks.register('contentModeIntegrationTest', Exec) { if (providers.gradleProperty('contentModeCycleOnly').isPresent()) args '--cycle-only' } } + +apply from: 'gradle/normalize-javadoc-trees.gradle' diff --git a/docs/MIGRATION.md b/docs/MIGRATION.md index 0d284173b..050403c92 100644 --- a/docs/MIGRATION.md +++ b/docs/MIGRATION.md @@ -6,7 +6,7 @@ blocks cannot be reconstructed by Mojang's vanilla fixer alone, so Base Metals installs a narrowly scoped migration hook before Forge reads an old world. Always upgrade a copy and retain the original 1.10/1.12 world. Install Base -Metals `3.0.1.113021`, OreSpawn `4.1.0.113021`, and any other 1.13.2 mods needed +Metals `3.0.3.113021`, OreSpawn `4.1.7.113021`, and any other 1.13.2 mods needed by that world. Do not carry MMDLib, Additional Loot Tables, the OreSpawn 3 plugin, or Base Metals' old fallback generator into the new instance. diff --git a/docs/MINING_LEVELS.md b/docs/MINING_LEVELS.md new file mode 100644 index 000000000..f1ff9cf22 --- /dev/null +++ b/docs/MINING_LEVELS.md @@ -0,0 +1,128 @@ +# Reviewed mining levels for Minecraft 1.13.2 + +This audit covers all 21 Modern Metals and 22 Base Metals materials, plus the +vanilla iron/gold and non-metal tool references. It changes mining capability +and harvest requirements; the other legacy statistics remain separate. + +The numbers are an engineering-informed game policy, not measured physical +units or a unique scientific ranking. Tool geometry, purity, heat treatment, +fracture toughness and wear matter. There is no physical conversion from a +Mohs-style scratch-hardness number to a Minecraft harvest level. + +## Policy and assumptions + +- Tier 0 is the vanilla wood/gold class, tier 1 stone, tier 2 iron and tier 3 + diamond. Tier 4 remains a fictional-material capability. Bare hands do not + qualify as a pickaxe, even on a tier-0 solid metal block. +- Galvanized steel uses a steel core: galvanizing does not significantly change + steel's mechanical properties. Give it the same harvest capability as steel + and vanilla iron, tier 2. This does not claim zinc coating makes tool steel + harder. [Galvanizing evidence](https://galvanizeit.org/knowledgebase/article/mechanical-properties-of-galvanized-steel) +- Treat named steel, stainless steel, bronze, Invar, Nichrome and titanium as + useful engineering materials at tier 2. Exact grades are not specified by the + mod; this is a coarse capability class, not a hardness comparison between them. +- Soft metals stay in low-duty tiers. Hard but brittle standalone materials do + not inherit the properties of their carbides, binders, alloys or coatings. + Tungsten is not tungsten carbide, boron is not boron carbide/CBN, and pure + chromium is not chromium-alloyed tool steel. [Tool-material context](https://www.sandvik.coromant.com/en-gb/materials), + [tungsten and carbide distinction](https://periodic-table.rsc.org/element/74/tungsten) +- Solid metal and ore have separate requirements. These providers' ordinary + metal ores represent minerals dispersed in rock, so their baseline is a + stone-level pickaxe, tier 1. This is a host-rock gameplay rule, not a claim + that every ore mineral has the same hardness. It is independent of refined + metal properties. [USGS mineral/host distinctions](https://pubs.usgs.gov/bul/b1693/html/bull5n38.htm) +- Keep the existing fictional tool/block/active-ore tiers deliberately. There + is no physical evidence for Adamantine, Aquarium, Cold Iron, Mithril or + Starsteel as these mods define them. +- Existing alloy recipes are gameplay abstractions and retain their ingredients + and yields. In particular, the historical Al-Cu `aluminumbrass` recipe is not + the composition of commercial aluminum brass, and the galvanized-steel + recipe does not describe a literal 50-percent-zinc tool. The named product, + rather than fictional recipe mass fractions, determines the interpretation. +- Keep Fantasy Level availability and the Base Metals inheritance unchanged. + Elemental tools retained for High Fantasy are not recommendations for real + toolmaking. Base Gems' mineral progression is a separate policy. + +## Complete audit + +Columns show old -> reviewed tiers. Solid requirements apply to the storage +block and its registered solid forms. `—` means that form is not registered. +A dagger marks a retained historical alloy ore; it still does not generate. +Titanium ore stays disabled by default, with rutile processing available. + +### Modern Metals + +| Material | Tool | Solid | Ore | Scientific context and disposition | +| --- | ---: | ---: | ---: | --- | +| `aluminum` | 0 -> 0 | 0 -> 0 | 0 -> 1 | Soft elemental aluminium, not a strengthened aircraft alloy. [Source](https://periodic-table.rsc.org/element/13/aluminium) | +| `aluminumbrass` | 0 -> 1 | 0 -> 1 | — | Legacy Al-Cu blend, not commercial Cu-Zn-Al brass. Limited alloy tier; recipe retained. [Source](https://alloys.copper.org/alloy/C68700) | +| `beryllium` | 1 -> 1 | 1 -> 1 | 1 -> 1 | Elemental Be, not copper-beryllium tool alloy. No engineered alloy properties assumed. [Source](https://periodic-table.rsc.org/element/4/beryllium) | +| `boron` | 3 -> 1 | 2 -> 2 | 2 -> 1 | Elemental/metalloid form; not boron carbide or cubic boron nitride tooling. [Source](https://periodic-table.rsc.org/element/5/boron) | +| `cadmium` | 0 -> 0 | 0 -> 0 | 0 -> 1 | Low-duty elemental metal; no hardened alloy assumed. [Source](https://periodic-table.rsc.org/element/48/cadmium) | +| `chromium` | 3 -> 1 | 2 -> 2 | 2 -> 1 | Hard constituent for alloys and coatings; pure-metal hardness is not whole-tool toughness. [Source](https://periodic-table.rsc.org/element/24/chromium) | +| `galvanizedsteel` | 1 -> 2 | 1 -> 2 | 1 -> 1 † | Steel core with a protective zinc coating; same mining capability as steel. [Source](https://galvanizeit.org/knowledgebase/article/mechanical-properties-of-galvanized-steel) | +| `iridium` | 2 -> 1 | 1 -> 2 | 1 -> 1 | Hard, brittle element; no toughened alloy or composite grade assumed. [Source](https://pubchem.ncbi.nlm.nih.gov/element/77) | +| `magnesium` | 0 -> 0 | 0 -> 0 | 0 -> 1 | Light elemental metal, not a structural magnesium alloy. [Source](https://periodic-table.rsc.org/element/12/magnesium) | +| `manganese` | 1 -> 1 | 1 -> 1 | 1 -> 1 | Brittle elemental Mn, distinct from impact-resistant manganese steel. [Source](https://periodic-table.rsc.org/element/25/manganese) | +| `nichrome` | 2 -> 2 | 1 -> 2 | 1 -> 1 † | Ductile Ni-Cr engineering alloy; not a superhard carbide grade. [Source](https://www.kanthal.com/produkte-und-dienstleistungen/datasheets/materialdatenbl%C3%A4tter/band-flachdraht/nikrothal-80/) | +| `osmium` | 2 -> 1 | 2 -> 2 | 2 -> 1 | Hard, brittle element; density does not imply impact-tool performance. [Source](https://periodic-table.rsc.org/element/76/osmium) | +| `plutonium` | 1 -> 1 | 1 -> 1 | 1 -> 1 | Unspecified elemental/phase grade; conservative compatibility tier, no nuclear-property mining bonus. [Source](https://periodic-table.rsc.org/element/94/plutonium) | +| `rutile` | 2 -> 1 | 1 -> 2 | 1 -> 1 | Titanium dioxide feed mineral, not metallic titanium; retained High Fantasy tool is a compatibility abstraction. [Source](https://periodic-table.rsc.org/element/22/titanium) | +| `stainlesssteel` | 2 -> 2 | 1 -> 2 | 1 -> 1 † | Steel family; iron-tier capability without assuming a particular hardened stainless grade. [Source](https://periodic-table.rsc.org/element/24/chromium) | +| `tantalum` | 2 -> 1 | 1 -> 1 | 1 -> 1 | Corrosion-resistant elemental metal, not an engineered high-strength tantalum alloy. [Source](https://periodic-table.rsc.org/element/73/tantalum) | +| `thorium` | 1 -> 1 | 0 -> 1 | 0 -> 1 | Unspecified elemental grade; retained limited tool tier, no nuclear-property mining bonus. [Source](https://periodic-table.rsc.org/element/90/thorium) | +| `titanium` | 2 -> 2 | 1 -> 2 | 1 -> 1 | Strong engineering metal; iron-tier capability does not mean titanium-carbide tooling. [Source](https://periodic-table.rsc.org/element/22/titanium) | +| `tungsten` | 2 -> 1 | 2 -> 2 | 2 -> 1 | Unalloyed tungsten is not cemented WC-Co; room-temperature brittleness limits impact-tool interpretation. [Source](https://www.sciencedirect.com/science/article/pii/S0921509318306440) | +| `uranium` | 2 -> 1 | 1 -> 1 | 1 -> 1 | Unspecified elemental grade; limited tool tier, not a cutting-tool alloy. [Source](https://periodic-table.rsc.org/element/92/uranium) | +| `zirconium` | 1 -> 1 | 1 -> 1 | 1 -> 1 | Corrosion-resistant metal, not zirconia ceramic or a tool alloy. [Source](https://periodic-table.rsc.org/element/40/zirconium) | + +### Base Metals + +| Material | Tool | Solid | Ore | Scientific context and disposition | +| --- | ---: | ---: | ---: | --- | +| `adamantine` | 4 -> 4 | 3 -> 3 | 3 -> 3 | Fictional: preserve the established active-material rules; no scientific rating. | +| `antimony` | 0 -> 0 | 0 -> 0 | 0 -> 1 | Brittle elemental material, not an antimony-strengthened alloy. [Source](https://periodic-table.rsc.org/element/51/antimony) | +| `aquarium` | 1 -> 1 | 1 -> 1 | — | Fictional: preserve the established active-material rules; no scientific rating. | +| `bismuth` | 0 -> 0 | 0 -> 0 | 0 -> 1 | Brittle elemental material; no useful impact-tool alloy assumed. [Source](https://periodic-table.rsc.org/element/83/bismuth) | +| `brass` | 1 -> 1 | 1 -> 1 | — | Copper-zinc engineering alloy; distinguish it from pure copper. [Source](https://www.copper.org/applications/marine/cuni/alloys/pub-206-copper-alloys-for-marine-environments.pdf) | +| `bronze` | 2 -> 2 | 2 -> 2 | — | Copper-tin tool alloy; useful work-hardened tooling rather than a soft-metal average. [Source](https://periodic-table.rsc.org/element/29/copper) | +| `coldiron` | 2 -> 2 | 2 -> 2 | 2 -> 2 | Fictional: preserve the established active-material rules; no scientific rating. | +| `copper` | 1 -> 1 | 1 -> 1 | 1 -> 1 | Workable elemental copper; bronze remains the stronger tool progression. [Source](https://periodic-table.rsc.org/element/29/copper) | +| `cupronickel` | 2 -> 1 | 1 -> 1 | — | Copper-nickel corrosion-resistant alloy; no hardened steel or carbide grade assumed. [Source](https://www.copper.org/applications/marine/cuni/alloys/pub-206-copper-alloys-for-marine-environments.pdf) | +| `electrum` | 1 -> 0 | 1 -> 0 | — | Gold-silver alloy; precious-metal content does not imply a stronger mining tool. [Source](https://periodic-table.rsc.org/element/79/gold) | +| `invar` | 3 -> 2 | 2 -> 2 | — | Fe-Ni engineering alloy valued for low expansion; no diamond-level cutting grade. [Source](https://www.carpentertechnology.com/hubfs/7407324/Material%20Saftey%20Data%20Sheets/Invar%2036.pdf) | +| `lead` | 0 -> 0 | 0 -> 0 | 0 -> 1 | Soft elemental metal. [Source](https://periodic-table.rsc.org/element/82/lead) | +| `mercury` | — | — | 0 -> 1 | Liquid at room temperature; no equipment is registered. Ore is separately rock-hosted. [Source](https://periodic-table.rsc.org/element/80/mercury) | +| `mithril` | 3 -> 3 | 2 -> 2 | — | Fictional: preserve the established active-material rules; no scientific rating. | +| `nickel` | 1 -> 1 | 1 -> 1 | 1 -> 1 | Elemental nickel, distinct from nickel-based engineered alloys. [Source](https://periodic-table.rsc.org/element/28/nickel) | +| `pewter` | 0 -> 0 | 0 -> 0 | — | Soft tin-based alloy; no tool-steel properties assumed. [Source](https://periodic-table.rsc.org/element/50/tin) | +| `platinum` | 1 -> 0 | 0 -> 0 | 0 -> 1 | Precious elemental metal; corrosion resistance is not a hardened tool grade. [Source](https://periodic-table.rsc.org/element/78/platinum) | +| `silver` | 1 -> 0 | 1 -> 0 | 1 -> 1 | Soft precious elemental metal. [Source](https://periodic-table.rsc.org/element/47/silver) | +| `starsteel` | 3 -> 3 | 3 -> 3 | 3 -> 3 | Fictional: preserve the established active-material rules; no scientific rating. | +| `steel` | 2 -> 2 | 2 -> 2 | — | Generic steel tool baseline; no high-speed, carbide or specially heat-treated grade assumed. [Source](https://periodic-table.rsc.org/element/26/iron) | +| `tin` | 1 -> 0 | 0 -> 0 | 0 -> 1 | Soft, pliable elemental tin, distinct from bronze. [Source](https://periodic-table.rsc.org/element/50/tin) | +| `zinc` | 0 -> 0 | 0 -> 0 | 0 -> 1 | Elemental zinc, distinct from zinc-coated steel. [Source](https://periodic-table.rsc.org/element/30/zinc) | + +## Vanilla references and compatibility + +Vanilla-reference tool tiers remain wood/gold 0, stone 1, iron 2 and diamond 3. +Base Metals' emerald/obsidian/quartz and other legacy non-metal equipment keep +their existing rules. No vanilla block requirement is overridden. + +Mining tiers are explicit constructor data. `toolLevel()` supplies all material +tools; `requiredHarvestLevel()` supplies solid forms and +`requiredOreHarvestLevel()` supplies ores. The original constructor remains for +binary/source compatibility and legacy custom-material defaults. Registered +metal catalogues use the explicit constructor, avoiding accidental changes +when an unrelated hardness statistic is edited. + +Existing block/item names, stack NBT, damage, recipe quantities, ore placements +and generation switches retain their identities. A saved tool receives its +reviewed capability from its registered item; its NBT does not need conversion. + +Run each project's `check build` and Eclipse tasks. Modern Metals' lightweight +`verifyMiningLevels` checks all 21 profiles without adding test libraries to +production launches; Base Metals' tests cover all 22 profiles, constructor +validation and legacy compatibility. The isolated packaged mining probe checks +registered tools, all solid block states, ore requirements, saved stacks and +real survival harvesting, including galvanized-steel Jasper crushing. diff --git a/docs/VERSIONS.md b/docs/VERSIONS.md index fc0ab343a..2b1d67fcf 100644 --- a/docs/VERSIONS.md +++ b/docs/VERSIONS.md @@ -6,9 +6,9 @@ Java 8. The Gradle build itself runs on Java `17.0.1+12` and uses ForgeGradle 8 requirement of the released mod. Builds and tests use the published OreSpawn -`4.1.0.113021` release (CurseForge project `245586`, file `9035885`, SHA-256 -`66C9CC5F8BE8F08F3DD5FA26EBEA79B52972B2FB86CB4DADBEEBC29AC01D3435`). -At runtime, Base Metals requires OreSpawn `[4.1.0.113021,5.0.0)` for Minecraft 1.13.2. +`4.1.7.113021` release (CurseForge project `245586`, file `9611746`, SHA-256 +`E65DCCA0623A20111C40779CB0FE2078E98C618FAA68F79C9A28E1E53C63957E`). +At runtime, Base Metals requires OreSpawn `[4.1.7.113021,5.0.0)` for Minecraft 1.13.2. The configuration cog uses OreSpawn's public 4.1 client API. Builds download this file through CurseMaven. CI verifies the download and diff --git a/docs/WORLDGEN.md b/docs/WORLDGEN.md index b5fbbc91f..637a0748d 100644 --- a/docs/WORLDGEN.md +++ b/docs/WORLDGEN.md @@ -1,8 +1,8 @@ # OreSpawn world generation -Base Metals requires OreSpawn `[4.1.0.113021,5.0.0)` and packages provider +Base Metals requires OreSpawn `[4.1.7.113021,5.0.0)` and packages provider schema 3, revision 1 at `data/basemetals/orespawn/provider.json`. Builds and -tests use the published OreSpawn `4.1.0.113021` release. +tests use the published OreSpawn `4.1.7.113021` release. The provider declares ores only: it has no rocks, geomes, biome rules, terrain dimensions, formations, fluid deposits, vanilla suppression, or strata diff --git a/gradle.properties b/gradle.properties index 8b11d1725..87c840b61 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,10 +21,10 @@ gradle_java_version=17 curseforge_project_id=240967 # Pin the OreSpawn release we build and test against. -orespawn_version=4.1.0.113021 +orespawn_version=4.1.7.113021 orespawn_curse_project_id=245586 -orespawn_curse_file_id=9035885 -orespawn_sha256=66C9CC5F8BE8F08F3DD5FA26EBEA79B52972B2FB86CB4DADBEEBC29AC01D3435 +orespawn_curse_file_id=9611746 +orespawn_sha256=E65DCCA0623A20111C40779CB0FE2078E98C618FAA68F79C9A28E1E53C63957E # Versions accepted when players load the mod. forge_version_range=[25,) @@ -39,7 +39,7 @@ mcp_version=20190213.203750 mod_id=basemetals mod_name=Base Metals mod_license=LGPL-2.1 -mod_version=3.0.2.113021 +mod_version=3.0.3.113021 # Maven coordinates and credits. mod_group=zone.moddev.mc.basemetals diff --git a/gradle/normalize-javadoc-trees.gradle b/gradle/normalize-javadoc-trees.gradle new file mode 100644 index 000000000..13238bb28 --- /dev/null +++ b/gradle/normalize-javadoc-trees.gradle @@ -0,0 +1,16 @@ +// Java 8's doclet leaves enum siblings in platform-dependent order. +// Keep the full hierarchy while giving leaf-only sibling lists a stable order. +tasks.withType(Javadoc).configureEach { + inputs.property('javadocTreeOrder', 'lexical leaf siblings 1') + doLast { + fileTree(destinationDir) { include '**/*-tree.html' }.files.each { page -> + String original = page.getText('UTF-8') + String ordered = original.replaceAll( + /(