diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 98e8a90b..9cc3d644 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -172,7 +172,7 @@ jobs: set -euo pipefail bundle="$RUNNER_TEMP/release-input" mkdir -p "$bundle" - cp build/libs/ModernMetals-2.5.1.110021{,-sources,-javadoc}.jar "$bundle/" + cp build/libs/ModernMetals-2.5.2.110021{,-sources,-javadoc}.jar "$bundle/" cp build/release/SHA256SUMS CHANGELOG.txt "$bundle/" ./gradlew verifyPreparedReleaseArtifacts verifyMavenCoordinates \ -PpreparedReleaseDir="$bundle" \ @@ -205,9 +205,9 @@ jobs: if-no-files-found: error retention-days: 30 path: | - build/libs/ModernMetals-2.5.1.110021.jar - build/libs/ModernMetals-2.5.1.110021-sources.jar - build/libs/ModernMetals-2.5.1.110021-javadoc.jar + build/libs/ModernMetals-2.5.2.110021.jar + build/libs/ModernMetals-2.5.2.110021-sources.jar + build/libs/ModernMetals-2.5.2.110021-javadoc.jar build/release/SHA256SUMS CHANGELOG.txt diff --git a/CHANGELOG.txt b/CHANGELOG.txt index bf93bcb5..2c21ddb3 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,8 @@ +2.5.2.110021 for 1.10.2 + +Requires Base Metals 2.6.0.110021 and OreSpawn 4.1.6.110021 or compatible updates. +This picks up the latest Base Metals and OreSpawn fixes for 1.10.2. + 2.5.1.110021 for 1.10.2 This brings the 1.10.2 branch up to date. Use Java 8, Forge 12.18.3.2511 or later for 1.10.2, Base Metals 2.5.1.110021 and MMD OreSpawn 4.1.2.110021. diff --git a/README.md b/README.md index 3a8967a0..80126b65 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,16 @@ Modern Metals adds industrial metals and alloys to Base Metals, with ores, building blocks, tools, armour and molten metals. This branch is for Minecraft -**1.10.2**, version **2.5.1.110021**. +**1.10.2**, version **2.5.2.110021**. ## Installation Use Java **8** and Forge **12.18.3.2511 or newer for Minecraft 1.10.2**. Put these three jars in `mods/` on both the client and server: -- Modern Metals `2.5.1.110021`. -- [Base Metals 2.5.1.110021](https://www.curseforge.com/minecraft/mc-mods/base-metals/files/9280029), supported range `[2.5.1.110021,2.6.0)`. -- [MMD OreSpawn 4.1.2.110021](https://www.curseforge.com/minecraft/mc-mods/mmd-orespawn/files/9276430), supported range `[4.1.2.110021,5.0.0)`. +- Modern Metals `2.5.2.110021`. +- [Base Metals 2.6.0.110021](https://www.curseforge.com/minecraft/mc-mods/base-metals/files/9524447), supported range `[2.6.0.110021,2.7.0)`. +- [MMD OreSpawn 4.1.6.110021](https://www.curseforge.com/minecraft/mc-mods/mmd-orespawn/files/9518063), supported range `[4.1.6.110021,5.0.0)`. Remove older copies first. Use the normal mod jars rather than the sources, Javadocs or development jars. This version uses Base Metals' shared library, so diff --git a/docs/BUILDING.md b/docs/BUILDING.md index 192e2827..57bc3607 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -22,7 +22,7 @@ another location. Original jars stay unchanged; development copies are remapped and stripped of invalid signatures. No floating mod versions, JCenter or `mavenLocal()` are used. A normal build never publishes. -`build/libs/ModernMetals-2.5.1.110021.jar` is the installed jar. Sources/Javadocs +`build/libs/ModernMetals-2.5.2.110021.jar` is the installed jar. Sources/Javadocs are separate. Test probes are isolated from all release archives. ## Eclipse diff --git a/gradle.properties b/gradle.properties index e1c377cc..bebdea0e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ mappings_version=29-1.10.2 mod_id=modernmetals mod_group=zone.moddev.mc.modernmetals -mod_version=2.5.1.110021 +mod_version=2.5.2.110021 mod_artifact=ModernMetals loader_name=forge loader_code=1 @@ -26,8 +26,8 @@ curseforge_project_id=244357 cf_requirements=mmd-orespawn,base-metals orespawn_curse_project_id=245586 coreplugin=zone.moddev.mc.modernmetals.compat.ModernMetalsLoadingPlugin -orespawn_version=4.1.2.110021 -orespawn_version_range=[4.1.2.110021,5.0.0) +orespawn_version=4.1.6.110021 +orespawn_version_range=[4.1.6.110021,5.0.0) -basemetals_version=2.5.1.110021 -basemetals_version_range=[2.5.1.110021,2.6.0) +basemetals_version=2.6.0.110021 +basemetals_version_range=[2.6.0.110021,2.7.0) diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 4228676b..56df6cde 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -40,14 +40,14 @@ tasks.register('verifyReleaseDependencies') { doLast { def artifacts = configurations.legacyModArtifacts.resolvedConfiguration.resolvedArtifacts def orespawn = specs.find { it.id == 'orespawn' } - if (orespawn.coordinate != 'curse.maven:mmd-orespawn-245586:9276430' - || orespawn.sha256 != '4D4975421FEEBF17505056306D06B0344D7A4553B6275885D7C5C5065B0348A6') { - throw new GradleException('Use the verified OreSpawn 4.1.2.110021 release.') + if (orespawn.coordinate != 'curse.maven:mmd-orespawn-245586:9518063' + || orespawn.sha256 != '05DB7CBFAADC815D6A713DACDFB9F0647BCED49CCFC357FB2FF010E95BD1379F') { + throw new GradleException('Use the verified OreSpawn 4.1.6.110021 release.') } def basemetals = specs.find { it.id == 'basemetals' } - if (basemetals.coordinate != 'curse.maven:base-metals-240967:9280029' - || basemetals.sha256 != '8BB1823592DCD558D17C4848AE917266FE7197B754CA628297DF837CFB3D20A3') { - throw new GradleException('Use the verified Base Metals 2.5.1.110021 release.') + if (basemetals.coordinate != 'curse.maven:base-metals-240967:9524447' + || basemetals.sha256 != '9CA948215549C4A3D30D76339932ED489FB7D2C73A71A5F4F8F68456B8BC276B') { + throw new GradleException('Use the verified Base Metals 2.6.0.110021 release.') } specs.each { spec -> def parts = spec.coordinate.split(':') diff --git a/gradle/dependencies.json b/gradle/dependencies.json index 5003a4c9..0a8dc444 100644 --- a/gradle/dependencies.json +++ b/gradle/dependencies.json @@ -1,15 +1,15 @@ [ { "id": "basemetals", - "coordinate": "curse.maven:base-metals-240967:9280029", - "sha256": "8BB1823592DCD558D17C4848AE917266FE7197B754CA628297DF837CFB3D20A3", + "coordinate": "curse.maven:base-metals-240967:9524447", + "sha256": "9CA948215549C4A3D30D76339932ED489FB7D2C73A71A5F4F8F68456B8BC276B", "repository": "https://www.cursemaven.com", "runtime": true }, { "id": "orespawn", - "coordinate": "curse.maven:mmd-orespawn-245586:9276430", - "sha256": "4D4975421FEEBF17505056306D06B0344D7A4553B6275885D7C5C5065B0348A6", + "coordinate": "curse.maven:mmd-orespawn-245586:9518063", + "sha256": "05DB7CBFAADC815D6A713DACDFB9F0647BCED49CCFC357FB2FF010E95BD1379F", "repository": "https://www.cursemaven.com", "runtime": true }, diff --git a/gradle/release/artifacts.gradle b/gradle/release/artifacts.gradle index 275dc105..a5d2c4e2 100644 --- a/gradle/release/artifacts.gradle +++ b/gradle/release/artifacts.gradle @@ -38,7 +38,7 @@ tasks.register('verifyReleaseConfiguration') { group = 'verification' dependsOn tasks.named('verifyJava8Toolchain') doLast { - if (project.group != 'zone.moddev.mc.modernmetals' || project.version != '2.5.1.110021' + if (project.group != 'zone.moddev.mc.modernmetals' || project.version != '2.5.2.110021' || project.minecraft_version != '1.10.2' || project.forge_version != '12.18.3.2511' || project.mappings_channel != 'stable' || project.mappings_version != '29-1.10.2') { throw new GradleException('Modern Metals target, mappings or Maven identity changed.') @@ -47,13 +47,15 @@ tasks.register('verifyReleaseConfiguration') { if (!source.contains('VERSION = "' + project.version + '"') || !source.contains('MODID = "modernmetals"')) { throw new GradleException('The mod identity differs from the build metadata.') } - if (project.orespawn_version != '4.1.2.110021' - || project.orespawn_version_range != '[4.1.2.110021,5.0.0)' + if (project.orespawn_version != '4.1.6.110021' + || project.orespawn_version_range != '[4.1.6.110021,5.0.0)' || !source.contains('required-after:orespawn@' + project.orespawn_version_range) || !source.contains('required-after:Forge@[12.18.3.2511,)')) { throw new GradleException('The OreSpawn or Forge runtime requirement changed.') } - if (!source.contains('required-after:basemetals@[2.5.1.110021,2.6.0)')) { + if (project.basemetals_version != '2.6.0.110021' + || project.basemetals_version_range != '[2.6.0.110021,2.7.0)' + || !source.contains('required-after:basemetals@' + project.basemetals_version_range)) { throw new GradleException('The published Base Metals runtime requirement changed.') } } diff --git a/src/main/java/zone/moddev/mc/modernmetals/ModernMetals.java b/src/main/java/zone/moddev/mc/modernmetals/ModernMetals.java index 5e014ba1..66e5393e 100644 --- a/src/main/java/zone/moddev/mc/modernmetals/ModernMetals.java +++ b/src/main/java/zone/moddev/mc/modernmetals/ModernMetals.java @@ -27,7 +27,7 @@ modid = ModernMetals.MODID, name = ModernMetals.NAME, version = ModernMetals.VERSION, - dependencies = "required-after:Forge@[12.18.3.2511,);required-after:basemetals@[2.5.1.110021,2.6.0);required-after:orespawn@[4.1.2.110021,5.0.0);after:tconstruct;after:IC2;after:cofhcore;after:thermalexpansion;after:Mekanism;before:buildingbricks", + dependencies = "required-after:Forge@[12.18.3.2511,);required-after:basemetals@[2.6.0.110021,2.7.0);required-after:orespawn@[4.1.6.110021,5.0.0);after:tconstruct;after:IC2;after:cofhcore;after:thermalexpansion;after:Mekanism;before:buildingbricks", acceptedMinecraftVersions = "[1.10.2]", guiFactory = "zone.moddev.mc.modernmetals.client.ModernMetalsGuiFactory", updateJSON = ModernMetals.UPDATEJSON) @@ -47,7 +47,7 @@ public class ModernMetals { * increased whenever a change is made that has the potential to break * compatibility with other mods that depend on this one. */ - public static final String VERSION = "2.5.1.110021"; + public static final String VERSION = "2.5.2.110021"; public static final String UPDATEJSON = "https://raw.githubusercontent.com/MinecraftModDevelopmentMods/ModernMetals/master-1.10.2/update.json"; diff --git a/tools/validation/legacy110/README.md b/tools/validation/legacy110/README.md index 20bc1477..585f1e7a 100644 --- a/tools/validation/legacy110/README.md +++ b/tools/validation/legacy110/README.md @@ -30,7 +30,7 @@ and confirms that imports/reloads do not rewrite it. scrolling, Escape/Done, saved restart-required switches, unchanged live registries, baked models, creative tabs, achievement labels and integrated-world fresh/reload checks. -`packagedForgeRuntimeTest` runs 16 world scenarios plus four dependency rejection +`packagedForgeRuntimeTest` runs 18 world scenarios plus six dependency rejection cases. See [BUILDING](../../../docs/BUILDING.md) for setup. The server template contains Forge 1.10.2-12.18.3.2511, vanilla server and libraries, without mods, configuration or worlds. Do not point a test at an active installation. @@ -85,7 +85,7 @@ prompt to remove missing blocks or items. The source worlds are fingerprinted. ## Limits and separately owned defects -Public Base Metals 2.5.1.110021 catches errors in its own optional IC2/Mekanism +The previous Base Metals 2.5.1.110021 release caught errors in its own optional IC2/Mekanism plugins: IC2 recipe registration runs before its input factory is ready, and the shared Mekanism helper references the absent `sulphuricAcid` gas. Modern Metals registers its own processing later and uses Mekanism's direct recipe API. Passing diff --git a/tools/validation/legacy110/check_content_modes.py b/tools/validation/legacy110/check_content_modes.py index ac993c20..a11612a9 100644 --- a/tools/validation/legacy110/check_content_modes.py +++ b/tools/validation/legacy110/check_content_modes.py @@ -11,7 +11,7 @@ def main(): args.output.mkdir(parents=True,exist_ok=False) specs=json.loads((ROOT/'gradle/dependencies.json').read_text()) jars=[dependency(s) for s in specs if s.get('runtime')] - jars += [ROOT/'build/libs/ModernMetals-2.5.1.110021.jar',ROOT/'build/test-mods/modernmetals-probe-packaged.jar'] + jars += [ROOT/'build/libs/ModernMetals-2.5.2.110021.jar',ROOT/'build/test-mods/modernmetals-probe-packaged.jar'] cases=[('default-with-base-low',None,'low_fantasy',False), ('modern-low','low_fantasy','high_fantasy',True), ('modern-high-with-base-low','high_fantasy','low_fantasy',False), diff --git a/tools/validation/legacy110/dependency_requirements.py b/tools/validation/legacy110/dependency_requirements.py index 388487f3..635ec5ca 100644 --- a/tools/validation/legacy110/dependency_requirements.py +++ b/tools/validation/legacy110/dependency_requirements.py @@ -7,7 +7,9 @@ OLD = { 'base':('base-metals-240967','2323100','f919cef794c73f02758bbd967346dba0b53f6383153c7e29bd79f211cda8c319'), - 'os':('mmd-orespawn-245586','2533153','d964148c20175e16ccefab02ae43a181a50dc08a1d636a77e59cfe8c8ea8d41a') + 'previous_base':('base-metals-240967','9280029','8bb1823592dcd558d17c4848ae917266fe7197b754ca628297df837cfb3d20a3'), + 'os':('mmd-orespawn-245586','2533153','d964148c20175e16ccefab02ae43a181a50dc08a1d636a77e59cfe8c8ea8d41a'), + 'previous_os':('mmd-orespawn-245586','9276430','4d4975421feebf17505056306d06b0344d7a4553b6275885d7c5c5065b0348a6') } def verify(java,template,output,base,orespawn,modern): @@ -19,21 +21,26 @@ def verify(java,template,output,base,orespawn,modern): with urllib.request.urlopen(request,timeout=45) as response:target.write_bytes(response.read()) assert hashlib.sha256(target.read_bytes()).hexdigest()==expected,'Public fixture checksum mismatch' old[key]=target - scenarios={ - 'missing-base':([orespawn,modern],'basemetals','2.5.1.110021'), - 'old-base':([old['base'],orespawn,modern],'basemetals','2.5.1.110021'), - 'missing-orespawn':([base,modern],'orespawn','4.1.2.110021'), - 'old-orespawn':([base,old['os'],modern],'orespawn','4.1.2.110021') + modern_owner = 'modernmetals (Modern Metals)' + base_owner = 'basemetals (Base Metals)' + # Forge checks Base Metals first. Both mods require the same OreSpawn minimum. + scenarios = { + 'missing-base': ([orespawn, modern], modern_owner, 'basemetals', '2.6.0.110021'), + 'old-base': ([old['base'], orespawn, modern], modern_owner, 'basemetals', '2.6.0.110021'), + 'previous-base': ([old['previous_base'], orespawn, modern], modern_owner, 'basemetals', '2.6.0.110021'), + 'missing-orespawn': ([base, modern], base_owner, 'orespawn', '4.1.6.110021'), + 'old-orespawn': ([base, old['os'], modern], base_owner, 'orespawn', '4.1.6.110021'), + 'previous-orespawn': ([base, old['previous_os'], modern], base_owner, 'orespawn', '4.1.6.110021'), } result={} - for name,(jars,modid,version) in scenarios.items(): + for name, (jars, owner, modid, version) in scenarios.items(): target=output/name;prepare(target,template,jars) log=target/'rejection-console.log' with log.open('wb') as stream: subprocess.run([str(java),'-Xmx1G','-jar',FORGE,'nogui'],cwd=target,stdout=stream,stderr=subprocess.STDOUT,timeout=90) text=log.read_text(errors='replace') - assert ('MissingModsException' in text or 'Missing mandatory dependencies' in text) and modid in text and version in text,log + assert f'MissingModsException: Mod {owner} requires [{modid}@[{version},' in text, log assert not (target/'world/level.dat').exists(),'Incompatible dependencies reached world loading' - result[name]={'rejected_before_world':True,'required_mod':modid,'minimum':version} + result[name]={'rejected_before_world':True,'requirement_owner':owner,'required_mod':modid,'minimum':version} print(name,'PASS',flush=True) write_json(output/'dependency-requirements.json',result) diff --git a/tools/validation/legacy110/run_packaged_client.py b/tools/validation/legacy110/run_packaged_client.py index ad7b48ff..33b39bf9 100644 --- a/tools/validation/legacy110/run_packaged_client.py +++ b/tools/validation/legacy110/run_packaged_client.py @@ -94,7 +94,7 @@ def main(): parser.add_argument('--remote-port',type=int,help='Connect to a disposable server on loopback.') parser.add_argument('--expected-disconnect',help='Expected text in a pre-world disconnect.') parser.add_argument('--low-fantasy',action='store_true',help='Start the remote client in Low Fantasy.') - parser.add_argument('--mod-jar',type=Path,default=ROOT/'build/libs/ModernMetals-2.5.1.110021.jar') + parser.add_argument('--mod-jar',type=Path,default=ROOT/'build/libs/ModernMetals-2.5.2.110021.jar') args=parser.parse_args() if args.phase=='first':args.output.mkdir(parents=True,exist_ok=False) assert hashlib.sha256(args.installer.read_bytes()).hexdigest().upper()=='664393C5A924B8F06CFB953903ABCF9FE5E99ECBE6AF8C7EA217339C766E519C' diff --git a/tools/validation/legacy110/run_packaged_suite.py b/tools/validation/legacy110/run_packaged_suite.py index f75e8bfe..bd64b138 100644 --- a/tools/validation/legacy110/run_packaged_suite.py +++ b/tools/validation/legacy110/run_packaged_suite.py @@ -22,7 +22,7 @@ def main(): args.output.mkdir(parents=True,exist_ok=False) specs=json.loads((ROOT/'gradle/dependencies.json').read_text()) jars=[dependency(s,args.mirror) for s in specs if s.get('runtime')] - jars += [ROOT/'build/libs/ModernMetals-2.5.1.110021.jar',ROOT/'build/test-mods/modernmetals-probe-packaged.jar'] + jars += [ROOT/'build/libs/ModernMetals-2.5.2.110021.jar',ROOT/'build/test-mods/modernmetals-probe-packaged.jar'] native=json.loads((ROOT/'build/reports/native-provider.json').read_text()) stock=json.loads((ROOT/'tools/validation/legacy110/fixtures/orespawn3-modernmetals.json').read_text()) @@ -169,7 +169,7 @@ def check(target,expected=None,properties=None,sample=False,saved=False): check(disabled_materials_optional,properties={'modern.disabled':'boron,beryllium,thorium,titanium'}) from dependency_requirements import verify verify(args.java,args.template,args.output,dependency(next(s for s in specs if s['id']=='basemetals'),args.mirror), - dependency(next(s for s in specs if s['id']=='orespawn'),args.mirror),ROOT/'build/libs/ModernMetals-2.5.1.110021.jar') + dependency(next(s for s in specs if s['id']=='orespawn'),args.mirror),ROOT/'build/libs/ModernMetals-2.5.2.110021.jar') assert fingerprint(fresh/'world')==before,'A source fixture world changed' write_json(args.output/'qualification.json',{'passed':True,'scenarios':18,'source_world_unchanged':True}) print('MODERN_METALS_PACKAGED_SUITE_PASS',flush=True) diff --git a/tools/validation/legacy110/run_runtime_checks.py b/tools/validation/legacy110/run_runtime_checks.py index 3ab1ac22..35c9ac84 100644 --- a/tools/validation/legacy110/run_runtime_checks.py +++ b/tools/validation/legacy110/run_runtime_checks.py @@ -82,7 +82,7 @@ def main(): if 'mekanism' in selected: selected.add('mcmultipart') jars = [dependency(s,args.mirror) for s in specs if s.get('runtime') or s['id'] in selected] - jars += [ROOT/'build/libs/ModernMetals-2.5.1.110021.jar', ROOT/'build/test-mods/modernmetals-probe-packaged.jar'] + jars += [ROOT/'build/libs/ModernMetals-2.5.2.110021.jar', ROOT/'build/test-mods/modernmetals-probe-packaged.jar'] prepare(args.output, args.template, jars) if args.baseline: run(args.java,args.output,'first',{'modern.baseline':'true'},expect_failure=True) diff --git a/tools/validation/legacy110/runtime-probe/review/modern/ModernMetalsProbe.java b/tools/validation/legacy110/runtime-probe/review/modern/ModernMetalsProbe.java index 6ac9595b..8791c816 100644 --- a/tools/validation/legacy110/runtime-probe/review/modern/ModernMetalsProbe.java +++ b/tools/validation/legacy110/runtime-probe/review/modern/ModernMetalsProbe.java @@ -73,7 +73,7 @@ public static void run(final MinecraftServer server) throws Exception { final JsonArray failures = new JsonArray(); final Set disabled = new HashSet<>(Arrays.asList(System.getProperty("modern.disabled", "").split(","))); final JsonObject catalog = new JsonObject(); - check("2.5.1.110021".equals(Loader.instance().getIndexedModList().get("modernmetals").getVersion()), "mod version", failures); + check("2.5.2.110021".equals(Loader.instance().getIndexedModList().get("modernmetals").getVersion()), "mod version", failures); for (final String name : MATERIALS) { final MMDMaterial material = Materials.getMaterialByName(name); if (disabled.contains(name)) {