From 92dfb4845017458253b70b574a9b86406dcfe515 Mon Sep 17 00:00:00 2001 From: JohnBraham Date: Sun, 15 Nov 2026 00:15:52 +0000 Subject: [PATCH] Bring Base Minerals to Minecraft 1.13.2 with the released Base Metals pin --- .github/workflows/ci.yml | 229 ++------------ .github/workflows/codeql-analysis.yml | 6 +- .github/workflows/deploy-release.yml | 289 +++++++++++------- .github/workflows/release-on-tag.yml | 79 +---- .github/workflows/validate-gradle-build.yml | 6 +- CHANGELOG.txt | 10 + README.md | 43 +-- build.gradle | 224 +++++++------- docs/BUILDING.md | 97 ++---- docs/KNOWN_ISSUES.md | 25 +- docs/ORE_GENERATION.md | 2 +- docs/RELEASING.md | 42 +-- docs/WORLD_UPGRADES.md | 27 ++ gradle.properties | 31 +- gradle/dependencies.json | 42 +-- gradle/normalize-javadoc-trees.gradle | 16 + gradle/ore-models.gradle | 4 +- gradle/release-113.gradle | 197 ++++++++++++ gradle/stage-legacy-dependencies.py | 47 +-- logs/debug.log | 0 logs/latest.log | 0 .../com/mcmoddev/alt/BaseMineralsALT.java | 8 - .../moddev/mc/baseminerals/BaseMinerals.java | 115 ++----- .../baseminerals/block/OverlayOreBlock.java | 20 -- .../client/BaseMineralsConfigScreen.java | 30 -- .../client/BaseMineralsGuiFactory.java | 18 -- .../client/MineralFluidRenderer.java | 54 ++++ .../compat/BaseMineralsLoadingPlugin.java | 19 -- .../compat/LegacyNamespaceTransformer.java | 89 ------ .../baseminerals/content/MineralContent.java | 125 ++++++++ .../content/MoltenMineralFluid.java | 67 ++++ .../mc/baseminerals/data/MaterialNames.java | 20 -- .../moddev/mc/baseminerals/init/Blocks.java | 63 ---- .../moddev/mc/baseminerals/init/Fluids.java | 36 --- .../mc/baseminerals/init/ItemGroups.java | 41 --- .../moddev/mc/baseminerals/init/Items.java | 87 ------ .../init/MaterialEnabledCondition.java | 17 -- .../mc/baseminerals/init/Materials.java | 134 -------- .../moddev/mc/baseminerals/init/Recipes.java | 46 --- .../mc/baseminerals/init/VillagerTrades.java | 22 -- .../integration/plugins/BMiDenseOres.java | 50 --- .../integration/plugins/BMiEnderIO.java | 44 --- .../integration/plugins/BMiMekanism.java | 55 ---- .../integration/plugins/BMiThaumcraft.java | 17 -- .../plugins/BMiThermalExpansion.java | 55 ---- .../plugins/BMiTinkersConstruct.java | 44 --- .../migration/LegacyWorldUpgrade.java | 212 +++++++++++++ .../mc/baseminerals/proxy/ClientProxy.java | 46 --- .../mc/baseminerals/proxy/CommonProxy.java | 40 --- .../mc/baseminerals/proxy/ServerProxy.java | 11 - .../recipe/SharedCrushingSerializer.java | 49 +++ .../mc/baseminerals/util/BMiConfig.java | 70 ----- .../mc/baseminerals/util/EventHandler.java | 57 ---- .../BaseMineralsWorldgenProvider.java | 6 +- .../META-INF/baseminerals-legacy-api.list | 20 -- src/main/resources/META-INF/coremods.json | 3 + src/main/resources/META-INF/mods.toml | 32 ++ .../baseminerals/blockstates/lithium.json | 12 +- .../blockstates/lithium_block.json | 6 +- .../baseminerals/blockstates/lithium_ore.json | 6 +- .../baseminerals/blockstates/niter_block.json | 6 +- .../baseminerals/blockstates/niter_ore.json | 6 +- .../blockstates/phosphorus_block.json | 6 +- .../blockstates/phosphorus_ore.json | 6 +- .../blockstates/potash_block.json | 6 +- .../baseminerals/blockstates/potash_ore.json | 6 +- .../baseminerals/blockstates/salt_block.json | 6 +- .../baseminerals/blockstates/salt_ore.json | 6 +- .../blockstates/saltpeter_block.json | 6 +- .../blockstates/saltpeter_ore.json | 6 +- .../baseminerals/blockstates/silicon.json | 12 +- .../blockstates/silicon_block.json | 6 +- .../blockstates/sulfur_block.json | 6 +- .../baseminerals/blockstates/sulfur_ore.json | 6 +- .../assets/baseminerals/lang/de_DE.lang | 127 -------- .../assets/baseminerals/lang/de_de.json | 40 +++ .../assets/baseminerals/lang/en_US.lang | 141 --------- .../assets/baseminerals/lang/en_us.json | 44 +++ .../assets/baseminerals/lang/ru_RU.lang | 129 -------- .../assets/baseminerals/lang/ru_ru.json | 41 +++ .../models/block/lithium_molten.json | 5 + .../models/block/silicon_molten.json | 5 + .../baseminerals/models/item/lithium.json | 6 + .../models/item/lithium_bucket.json | 6 + .../baseminerals/models/item/silicon.json | 6 + .../models/item/silicon_bucket.json | 6 + .../baseminerals/recipes/_factories.json | 5 - .../recipes/gunpowder_charcoal_potash.json | 37 --- .../recipes/gunpowder_charcoal_saltpeter.json | 37 --- .../recipes/gunpowder_coal_potash.json | 33 -- .../recipes/gunpowder_coal_saltpeter.json | 33 -- .../baseminerals/recipes/lithium_block.json | 37 --- .../recipes/lithium_block_powder.json | 31 -- .../baseminerals/recipes/lithium_powder.json | 37 --- .../recipes/lithium_smallpowder.json | 33 -- .../baseminerals/recipes/niter_block.json | 37 --- .../recipes/niter_block_powder.json | 31 -- .../baseminerals/recipes/niter_powder.json | 37 --- .../recipes/niter_smallpowder.json | 33 -- .../recipes/phosphorus_block.json | 37 --- .../recipes/phosphorus_block_powder.json | 31 -- .../recipes/phosphorus_powder.json | 37 --- .../recipes/phosphorus_smallpowder.json | 33 -- .../baseminerals/recipes/potash_block.json | 37 --- .../recipes/potash_block_powder.json | 31 -- .../baseminerals/recipes/potash_powder.json | 37 --- .../recipes/potash_smallpowder.json | 33 -- .../baseminerals/recipes/salt_block.json | 37 --- .../recipes/salt_block_powder.json | 31 -- .../baseminerals/recipes/salt_powder.json | 37 --- .../recipes/salt_smallpowder.json | 33 -- .../baseminerals/recipes/saltpeter_block.json | 37 --- .../recipes/saltpeter_block_powder.json | 31 -- .../recipes/saltpeter_powder.json | 37 --- .../recipes/saltpeter_smallpowder.json | 33 -- .../recipes/silicon_blend_sand_charcoal.json | 40 --- .../recipes/silicon_blend_sand_coal.json | 36 --- .../recipes/silicon_blend_smallblend.json | 37 --- .../baseminerals/recipes/silicon_block.json | 37 --- .../recipes/silicon_block_powder.json | 31 -- .../recipes/silicon_charcoal.json | 39 --- .../baseminerals/recipes/silicon_coal.json | 35 --- .../baseminerals/recipes/silicon_ingot.json | 37 --- .../baseminerals/recipes/silicon_nugget.json | 33 -- .../baseminerals/recipes/silicon_powder.json | 37 --- .../recipes/silicon_smallblend_blend.json | 33 -- .../recipes/silicon_smallpowder.json | 33 -- .../baseminerals/recipes/sulfur_block.json | 37 --- .../recipes/sulfur_block_powder.json | 31 -- .../baseminerals/recipes/sulfur_powder.json | 37 --- .../recipes/sulfur_smallpowder.json | 33 -- .../baseminerals_legacy_world_upgrade.js | 212 +++++++++++++ .../loot_tables/blocks/lithium_block.json | 14 + .../loot_tables/blocks/lithium_ore.json | 14 + .../loot_tables/blocks/niter_block.json | 14 + .../loot_tables/blocks/niter_ore.json | 14 + .../loot_tables/blocks/phosphorus_block.json | 14 + .../loot_tables/blocks/phosphorus_ore.json | 14 + .../loot_tables/blocks/potash_block.json | 14 + .../loot_tables/blocks/potash_ore.json | 14 + .../loot_tables/blocks/salt_block.json | 14 + .../loot_tables/blocks/salt_ore.json | 14 + .../loot_tables/blocks/saltpeter_block.json | 14 + .../loot_tables/blocks/saltpeter_ore.json | 14 + .../loot_tables/blocks/silicon_block.json | 14 + .../loot_tables/blocks/sulfur_block.json | 14 + .../loot_tables/blocks/sulfur_ore.json | 14 + .../recipes/gunpowder_charcoal_potash.json | 24 ++ .../recipes/gunpowder_charcoal_saltpeter.json | 24 ++ .../recipes/gunpowder_coal_potash.json | 24 ++ .../recipes/gunpowder_coal_saltpeter.json | 24 ++ .../baseminerals/recipes/lithium_block.json | 17 ++ .../recipes/lithium_block_powder.json | 13 + .../recipes/lithium_ore_crushing.json | 19 ++ .../baseminerals/recipes/lithium_powder.json | 17 ++ .../recipes/lithium_smallpowder.json | 13 + .../baseminerals/recipes/niter_block.json | 17 ++ .../recipes/niter_block_powder.json | 13 + .../recipes/niter_ore_crushing.json | 19 ++ .../baseminerals/recipes/niter_powder.json | 17 ++ .../recipes/niter_smallpowder.json | 13 + .../recipes/phosphorus_block.json | 17 ++ .../recipes/phosphorus_block_powder.json | 13 + .../recipes/phosphorus_ore_crushing.json | 19 ++ .../recipes/phosphorus_powder.json | 17 ++ .../recipes/phosphorus_smallpowder.json | 13 + .../baseminerals/recipes/potash_block.json | 17 ++ .../recipes/potash_block_powder.json | 13 + .../recipes/potash_ore_crushing.json | 19 ++ .../baseminerals/recipes/potash_powder.json | 17 ++ .../recipes/potash_smallpowder.json | 13 + .../data/baseminerals/recipes/salt_block.json | 17 ++ .../recipes/salt_block_powder.json | 13 + .../recipes/salt_ore_crushing.json | 19 ++ .../baseminerals/recipes/salt_powder.json | 17 ++ .../recipes/salt_smallpowder.json | 13 + .../baseminerals/recipes/saltpeter_block.json | 17 ++ .../recipes/saltpeter_block_powder.json | 13 + .../recipes/saltpeter_ore_crushing.json | 19 ++ .../recipes/saltpeter_powder.json | 17 ++ .../recipes/saltpeter_smallpowder.json | 13 + .../recipes/silicon_blend_sand_charcoal.json | 21 ++ .../recipes/silicon_blend_sand_coal.json | 21 ++ .../recipes/silicon_blend_smallblend.json | 17 ++ .../baseminerals/recipes/silicon_block.json | 17 ++ .../recipes/silicon_block_powder.json | 13 + .../recipes/silicon_charcoal.json | 20 ++ .../baseminerals/recipes/silicon_coal.json | 20 ++ .../baseminerals/recipes/silicon_ingot.json | 17 ++ .../baseminerals/recipes/silicon_nugget.json | 13 + .../baseminerals/recipes/silicon_powder.json | 17 ++ .../recipes/silicon_powder_smelting.json | 9 + .../recipes/silicon_smallblend_blend.json | 13 + .../recipes/silicon_smallpowder.json | 13 + .../baseminerals/recipes/sulfur_block.json | 17 ++ .../recipes/sulfur_block_powder.json | 13 + .../recipes/sulfur_ore_crushing.json | 19 ++ .../baseminerals/recipes/sulfur_powder.json | 17 ++ .../recipes/sulfur_smallpowder.json | 13 + .../data/forge/tags/blocks/ores/lithium.json | 6 + .../data/forge/tags/blocks/ores/niter.json | 6 + .../forge/tags/blocks/ores/phosphorus.json | 6 + .../data/forge/tags/blocks/ores/potash.json | 6 + .../data/forge/tags/blocks/ores/salt.json | 6 + .../forge/tags/blocks/ores/saltpeter.json | 6 + .../data/forge/tags/blocks/ores/sulfur.json | 6 + .../data/forge/tags/items/dusts/charcoal.json | 1 + .../data/forge/tags/items/dusts/coal.json | 1 + .../data/forge/tags/items/dusts/lithium.json | 6 + .../data/forge/tags/items/dusts/niter.json | 6 + .../forge/tags/items/dusts/phosphorus.json | 6 + .../data/forge/tags/items/dusts/potash.json | 6 + .../data/forge/tags/items/dusts/salt.json | 6 + .../forge/tags/items/dusts/saltpeter.json | 6 + .../data/forge/tags/items/dusts/silicon.json | 6 + .../data/forge/tags/items/dusts/sulfur.json | 6 + .../data/forge/tags/items/ingots/lithium.json | 6 + .../data/forge/tags/items/ingots/silicon.json | 6 + .../forge/tags/items/nuggets/lithium.json | 6 + .../forge/tags/items/nuggets/silicon.json | 6 + .../data/forge/tags/items/ores/lithium.json | 6 + .../data/forge/tags/items/ores/niter.json | 6 + .../forge/tags/items/ores/phosphorus.json | 6 + .../data/forge/tags/items/ores/potash.json | 6 + .../data/forge/tags/items/ores/salt.json | 6 + .../data/forge/tags/items/ores/saltpeter.json | 6 + .../data/forge/tags/items/ores/sulfur.json | 6 + .../tags/items/storage_blocks/lithium.json | 6 + .../tags/items/storage_blocks/niter.json | 6 + .../tags/items/storage_blocks/phosphorus.json | 6 + .../tags/items/storage_blocks/potash.json | 6 + .../forge/tags/items/storage_blocks/salt.json | 6 + .../tags/items/storage_blocks/saltpeter.json | 6 + .../tags/items/storage_blocks/silicon.json | 6 + .../tags/items/storage_blocks/sulfur.json | 6 + .../forge/tags/items/tiny_dusts/lithium.json | 6 + .../forge/tags/items/tiny_dusts/niter.json | 6 + .../tags/items/tiny_dusts/phosphorus.json | 6 + .../forge/tags/items/tiny_dusts/potash.json | 6 + .../forge/tags/items/tiny_dusts/salt.json | 6 + .../tags/items/tiny_dusts/saltpeter.json | 6 + .../forge/tags/items/tiny_dusts/silicon.json | 6 + .../forge/tags/items/tiny_dusts/sulfur.json | 6 + src/main/resources/mcmod.info | 16 - src/main/resources/pack.mcmeta | 6 +- .../mc/baseminerals/NativeProviderTests.java | 63 ---- .../LegacyNamespaceTransformerTests.java | 87 ------ .../migration/LegacyWorldUpgradeTest.java | 61 ++++ .../util/MaterialConfigurationTests.java | 54 ---- tools/test_fluid_registration.js | 18 ++ tools/validation/legacy113/requirements.txt | 1 + tools/validation/legacy113/run_forge.py | 102 +++++++ .../validation/legacy113/verify_generation.py | 41 +++ tools/validation/legacy113/verify_upgrade.py | 275 +++++++++++++++++ 254 files changed, 3518 insertions(+), 4189 deletions(-) create mode 100644 docs/WORLD_UPGRADES.md create mode 100644 gradle/normalize-javadoc-trees.gradle create mode 100644 gradle/release-113.gradle create mode 100644 logs/debug.log create mode 100644 logs/latest.log delete mode 100644 src/main/java/com/mcmoddev/alt/BaseMineralsALT.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/block/OverlayOreBlock.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/client/BaseMineralsConfigScreen.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/client/BaseMineralsGuiFactory.java create mode 100644 src/main/java/zone/moddev/mc/baseminerals/client/MineralFluidRenderer.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/compat/BaseMineralsLoadingPlugin.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/compat/LegacyNamespaceTransformer.java create mode 100644 src/main/java/zone/moddev/mc/baseminerals/content/MineralContent.java create mode 100644 src/main/java/zone/moddev/mc/baseminerals/content/MoltenMineralFluid.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/data/MaterialNames.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/init/Blocks.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/init/Fluids.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/init/ItemGroups.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/init/Items.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/init/MaterialEnabledCondition.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/init/Materials.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/init/Recipes.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/init/VillagerTrades.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiDenseOres.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiEnderIO.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiMekanism.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiThaumcraft.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiThermalExpansion.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiTinkersConstruct.java create mode 100644 src/main/java/zone/moddev/mc/baseminerals/migration/LegacyWorldUpgrade.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/proxy/ClientProxy.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/proxy/CommonProxy.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/proxy/ServerProxy.java create mode 100644 src/main/java/zone/moddev/mc/baseminerals/recipe/SharedCrushingSerializer.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/util/BMiConfig.java delete mode 100644 src/main/java/zone/moddev/mc/baseminerals/util/EventHandler.java delete mode 100644 src/main/resources/META-INF/baseminerals-legacy-api.list create mode 100644 src/main/resources/META-INF/coremods.json create mode 100644 src/main/resources/META-INF/mods.toml delete mode 100644 src/main/resources/assets/baseminerals/lang/de_DE.lang create mode 100644 src/main/resources/assets/baseminerals/lang/de_de.json delete mode 100644 src/main/resources/assets/baseminerals/lang/en_US.lang create mode 100644 src/main/resources/assets/baseminerals/lang/en_us.json delete mode 100644 src/main/resources/assets/baseminerals/lang/ru_RU.lang create mode 100644 src/main/resources/assets/baseminerals/lang/ru_ru.json create mode 100644 src/main/resources/assets/baseminerals/models/block/lithium_molten.json create mode 100644 src/main/resources/assets/baseminerals/models/block/silicon_molten.json create mode 100644 src/main/resources/assets/baseminerals/models/item/lithium.json create mode 100644 src/main/resources/assets/baseminerals/models/item/lithium_bucket.json create mode 100644 src/main/resources/assets/baseminerals/models/item/silicon.json create mode 100644 src/main/resources/assets/baseminerals/models/item/silicon_bucket.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/_factories.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/gunpowder_charcoal_potash.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/gunpowder_charcoal_saltpeter.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/gunpowder_coal_potash.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/gunpowder_coal_saltpeter.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/lithium_block.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/lithium_block_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/lithium_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/lithium_smallpowder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/niter_block.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/niter_block_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/niter_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/niter_smallpowder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/phosphorus_block.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/phosphorus_block_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/phosphorus_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/phosphorus_smallpowder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/potash_block.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/potash_block_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/potash_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/potash_smallpowder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/salt_block.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/salt_block_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/salt_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/salt_smallpowder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/saltpeter_block.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/saltpeter_block_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/saltpeter_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/saltpeter_smallpowder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_blend_sand_charcoal.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_blend_sand_coal.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_blend_smallblend.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_block.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_block_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_charcoal.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_coal.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_ingot.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_nugget.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_smallblend_blend.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/silicon_smallpowder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/sulfur_block.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/sulfur_block_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/sulfur_powder.json delete mode 100644 src/main/resources/assets/baseminerals/recipes/sulfur_smallpowder.json create mode 100644 src/main/resources/coremods/baseminerals_legacy_world_upgrade.js create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/lithium_block.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/lithium_ore.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/niter_block.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/niter_ore.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/phosphorus_block.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/phosphorus_ore.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/potash_block.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/potash_ore.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/salt_block.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/salt_ore.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/saltpeter_block.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/saltpeter_ore.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/silicon_block.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/sulfur_block.json create mode 100644 src/main/resources/data/baseminerals/loot_tables/blocks/sulfur_ore.json create mode 100644 src/main/resources/data/baseminerals/recipes/gunpowder_charcoal_potash.json create mode 100644 src/main/resources/data/baseminerals/recipes/gunpowder_charcoal_saltpeter.json create mode 100644 src/main/resources/data/baseminerals/recipes/gunpowder_coal_potash.json create mode 100644 src/main/resources/data/baseminerals/recipes/gunpowder_coal_saltpeter.json create mode 100644 src/main/resources/data/baseminerals/recipes/lithium_block.json create mode 100644 src/main/resources/data/baseminerals/recipes/lithium_block_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/lithium_ore_crushing.json create mode 100644 src/main/resources/data/baseminerals/recipes/lithium_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/lithium_smallpowder.json create mode 100644 src/main/resources/data/baseminerals/recipes/niter_block.json create mode 100644 src/main/resources/data/baseminerals/recipes/niter_block_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/niter_ore_crushing.json create mode 100644 src/main/resources/data/baseminerals/recipes/niter_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/niter_smallpowder.json create mode 100644 src/main/resources/data/baseminerals/recipes/phosphorus_block.json create mode 100644 src/main/resources/data/baseminerals/recipes/phosphorus_block_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/phosphorus_ore_crushing.json create mode 100644 src/main/resources/data/baseminerals/recipes/phosphorus_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/phosphorus_smallpowder.json create mode 100644 src/main/resources/data/baseminerals/recipes/potash_block.json create mode 100644 src/main/resources/data/baseminerals/recipes/potash_block_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/potash_ore_crushing.json create mode 100644 src/main/resources/data/baseminerals/recipes/potash_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/potash_smallpowder.json create mode 100644 src/main/resources/data/baseminerals/recipes/salt_block.json create mode 100644 src/main/resources/data/baseminerals/recipes/salt_block_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/salt_ore_crushing.json create mode 100644 src/main/resources/data/baseminerals/recipes/salt_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/salt_smallpowder.json create mode 100644 src/main/resources/data/baseminerals/recipes/saltpeter_block.json create mode 100644 src/main/resources/data/baseminerals/recipes/saltpeter_block_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/saltpeter_ore_crushing.json create mode 100644 src/main/resources/data/baseminerals/recipes/saltpeter_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/saltpeter_smallpowder.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_blend_sand_charcoal.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_blend_sand_coal.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_blend_smallblend.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_block.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_block_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_charcoal.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_coal.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_ingot.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_nugget.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_powder_smelting.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_smallblend_blend.json create mode 100644 src/main/resources/data/baseminerals/recipes/silicon_smallpowder.json create mode 100644 src/main/resources/data/baseminerals/recipes/sulfur_block.json create mode 100644 src/main/resources/data/baseminerals/recipes/sulfur_block_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/sulfur_ore_crushing.json create mode 100644 src/main/resources/data/baseminerals/recipes/sulfur_powder.json create mode 100644 src/main/resources/data/baseminerals/recipes/sulfur_smallpowder.json create mode 100644 src/main/resources/data/forge/tags/blocks/ores/lithium.json create mode 100644 src/main/resources/data/forge/tags/blocks/ores/niter.json create mode 100644 src/main/resources/data/forge/tags/blocks/ores/phosphorus.json create mode 100644 src/main/resources/data/forge/tags/blocks/ores/potash.json create mode 100644 src/main/resources/data/forge/tags/blocks/ores/salt.json create mode 100644 src/main/resources/data/forge/tags/blocks/ores/saltpeter.json create mode 100644 src/main/resources/data/forge/tags/blocks/ores/sulfur.json create mode 100644 src/main/resources/data/forge/tags/items/dusts/charcoal.json create mode 100644 src/main/resources/data/forge/tags/items/dusts/coal.json create mode 100644 src/main/resources/data/forge/tags/items/dusts/lithium.json create mode 100644 src/main/resources/data/forge/tags/items/dusts/niter.json create mode 100644 src/main/resources/data/forge/tags/items/dusts/phosphorus.json create mode 100644 src/main/resources/data/forge/tags/items/dusts/potash.json create mode 100644 src/main/resources/data/forge/tags/items/dusts/salt.json create mode 100644 src/main/resources/data/forge/tags/items/dusts/saltpeter.json create mode 100644 src/main/resources/data/forge/tags/items/dusts/silicon.json create mode 100644 src/main/resources/data/forge/tags/items/dusts/sulfur.json create mode 100644 src/main/resources/data/forge/tags/items/ingots/lithium.json create mode 100644 src/main/resources/data/forge/tags/items/ingots/silicon.json create mode 100644 src/main/resources/data/forge/tags/items/nuggets/lithium.json create mode 100644 src/main/resources/data/forge/tags/items/nuggets/silicon.json create mode 100644 src/main/resources/data/forge/tags/items/ores/lithium.json create mode 100644 src/main/resources/data/forge/tags/items/ores/niter.json create mode 100644 src/main/resources/data/forge/tags/items/ores/phosphorus.json create mode 100644 src/main/resources/data/forge/tags/items/ores/potash.json create mode 100644 src/main/resources/data/forge/tags/items/ores/salt.json create mode 100644 src/main/resources/data/forge/tags/items/ores/saltpeter.json create mode 100644 src/main/resources/data/forge/tags/items/ores/sulfur.json create mode 100644 src/main/resources/data/forge/tags/items/storage_blocks/lithium.json create mode 100644 src/main/resources/data/forge/tags/items/storage_blocks/niter.json create mode 100644 src/main/resources/data/forge/tags/items/storage_blocks/phosphorus.json create mode 100644 src/main/resources/data/forge/tags/items/storage_blocks/potash.json create mode 100644 src/main/resources/data/forge/tags/items/storage_blocks/salt.json create mode 100644 src/main/resources/data/forge/tags/items/storage_blocks/saltpeter.json create mode 100644 src/main/resources/data/forge/tags/items/storage_blocks/silicon.json create mode 100644 src/main/resources/data/forge/tags/items/storage_blocks/sulfur.json create mode 100644 src/main/resources/data/forge/tags/items/tiny_dusts/lithium.json create mode 100644 src/main/resources/data/forge/tags/items/tiny_dusts/niter.json create mode 100644 src/main/resources/data/forge/tags/items/tiny_dusts/phosphorus.json create mode 100644 src/main/resources/data/forge/tags/items/tiny_dusts/potash.json create mode 100644 src/main/resources/data/forge/tags/items/tiny_dusts/salt.json create mode 100644 src/main/resources/data/forge/tags/items/tiny_dusts/saltpeter.json create mode 100644 src/main/resources/data/forge/tags/items/tiny_dusts/silicon.json create mode 100644 src/main/resources/data/forge/tags/items/tiny_dusts/sulfur.json delete mode 100644 src/main/resources/mcmod.info delete mode 100644 src/test/java/zone/moddev/mc/baseminerals/NativeProviderTests.java delete mode 100644 src/test/java/zone/moddev/mc/baseminerals/compat/LegacyNamespaceTransformerTests.java create mode 100644 src/test/java/zone/moddev/mc/baseminerals/migration/LegacyWorldUpgradeTest.java delete mode 100644 src/test/java/zone/moddev/mc/baseminerals/util/MaterialConfigurationTests.java create mode 100644 tools/test_fluid_registration.js create mode 100644 tools/validation/legacy113/requirements.txt create mode 100644 tools/validation/legacy113/run_forge.py create mode 100644 tools/validation/legacy113/verify_generation.py create mode 100644 tools/validation/legacy113/verify_upgrade.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 09ea0df..bc85d08 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,252 +1,73 @@ -name: Base Minerals 1.12 CI +name: Base Minerals 1.13.2 CI on: push: - branches: - - master-1.12 - - 'feature/**' + branches: [master-1.13.2, 'feature/**'] pull_request: - branches: - - master-1.12 + branches: [master-1.13.2] permissions: contents: read concurrency: - group: baseminerals-1.12-${{ github.workflow }}-${{ github.ref }} + group: baseminerals-113-${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: - cold-forge-bootstrap: - name: Cold Forge bootstrap - runs-on: ubuntu-latest - timeout-minutes: 75 - - steps: - - name: Check out source - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - - - name: Install pinned Java 25 ForgeGradle Mavenizer runtime - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5 - with: - distribution: temurin - java-version: '25.0.3+9.0.LTS' - - - name: Install pinned Java 8 compilation toolchain - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5 - with: - distribution: temurin - java-version: '8.0.502+7' - - - name: Install pinned Java 17 Gradle runtime - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5 - with: - distribution: temurin - java-version: '17.0.1+12' - - - name: Stage checksum-verified legacy dependencies - id: dependencies - shell: bash - run: | - set -euo pipefail - mirror="$RUNNER_TEMP/legacy-dependency-mirror" - bash gradle/stage-legacy-dependencies.sh "$mirror" - echo "repository=$mirror" >> "$GITHUB_OUTPUT" - - - name: Bootstrap Forge from an empty cache - shell: bash - env: - GRADLE_USER_HOME: ${{ runner.temp }}/baseminerals-cold-gradle - run: | - set -euo pipefail - test ! -e .gradle - test ! -e "$GRADLE_USER_HOME" - mkdir -p "$GRADLE_USER_HOME" - chmod +x ./gradlew - gradle_args=( - classes verifyReleaseDependencies - -PlegacyDependencyVerificationRepository="${{ steps.dependencies.outputs.repository }}" - --no-daemon --no-build-cache --stacktrace --max-workers=2 - -Dorg.gradle.java.installations.paths="$JAVA_HOME,$JAVA_HOME_8_X64,$JAVA_HOME_25_X64" - -Dorg.gradle.java.installations.auto-detect=false - -Dorg.gradle.java.installations.auto-download=false - ) - ./gradlew "${gradle_args[@]}" - - - name: Verify same-cache bootstrap offline - shell: bash - env: - GRADLE_USER_HOME: ${{ runner.temp }}/baseminerals-cold-gradle - run: | - set -euo pipefail - gradle_args=( - classes verifyReleaseDependencies - -PlegacyDependencyVerificationRepository="${{ steps.dependencies.outputs.repository }}" - --rerun-tasks --offline --no-daemon --no-build-cache --stacktrace --max-workers=2 - -Dorg.gradle.java.installations.paths="$JAVA_HOME,$JAVA_HOME_8_X64,$JAVA_HOME_25_X64" - -Dorg.gradle.java.installations.auto-detect=false - -Dorg.gradle.java.installations.auto-download=false - ) - ./gradlew "${gradle_args[@]}" - build: name: Build, test, and audit runs-on: ubuntu-latest - timeout-minutes: 90 - + timeout-minutes: 35 steps: - name: Check out source uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - - - name: Install pinned Java 25 ForgeGradle Mavenizer runtime + - name: Validate the Gradle wrapper + uses: gradle/actions/wrapper-validation@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6 + - name: Install Java 25 for Mavenizer uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5 with: distribution: temurin java-version: '25.0.3+9.0.LTS' - - - name: Install pinned Java 8 compilation and runtime toolchain + - name: Install Java 8 for compilation uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5 with: distribution: temurin java-version: '8.0.502+7' - - - name: Install pinned Java 17 Gradle runtime + - name: Install Java 17 for Gradle uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5 with: distribution: temurin java-version: '17.0.1+12' - - name: Set up Gradle uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6 - - - name: Stage checksum-verified dependencies - id: dependencies - shell: bash - run: | - set -euo pipefail - mirror="$RUNNER_TEMP/legacy-dependency-mirror" - bash gradle/stage-legacy-dependencies.sh "$mirror" - echo "repository=$mirror" >> "$GITHUB_OUTPUT" - - - name: Prepare clean packaged Forge runtime - id: forge - shell: bash - run: | - set -euo pipefail - runtime="$RUNNER_TEMP/forge-1.12.2-2588-runtime" - bash gradle/prepare-packaged-forge-runtime.sh "$runtime" "$JAVA_HOME_8_X64/bin/java" - echo "runtime=$runtime" >> "$GITHUB_OUTPUT" - - - name: Install world-audit tools - uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6 - with: - python-version: '3.12' - - - name: Install pinned schema and workflow validators - run: python -m pip install -r tools/validation/requirements.txt - - - name: Build, test, audit, qualify runtimes, and generate Eclipse launches - shell: bash - run: | - set -euo pipefail - chmod +x ./gradlew - gradle_args=( - clean check build javadoc verifyReleaseDependencies verifyReleaseArtifacts - writeReleaseChecksums prepareEclipse verifyProjectResources packagedForgeRuntimeTest packagedSourcePolicyTest - -PpythonExecutable=python3 - -PpackagedForgeRuntimeOutput="$RUNNER_TEMP/baseminerals-packaged-checks" - -PpackagedSourcePolicyOutput="$RUNNER_TEMP/baseminerals-policy-checks" - -PreleaseBuild=true - -PlegacyDependencyVerificationRepository="${{ steps.dependencies.outputs.repository }}" - -PpackagedForgeRuntimeRoot="${{ steps.forge.outputs.runtime }}" - --no-daemon --stacktrace --max-workers=2 - -Dorg.gradle.java.installations.paths="$JAVA_HOME,$JAVA_HOME_8_X64,$JAVA_HOME_25_X64" - -Dorg.gradle.java.installations.auto-detect=false - -Dorg.gradle.java.installations.auto-download=false - ) - ./gradlew "${gradle_args[@]}" - cp build/release/SHA256SUMS "$RUNNER_TEMP/first-SHA256SUMS" - - - name: Verify the prepared release bundle - shell: bash + - name: Stage checksum-verified published dependencies + run: python3 gradle/stage-legacy-dependencies.py .gradle/legacy-dependencies + - name: Build, audit and generate Eclipse launches run: | - set -euo pipefail - bundle="$RUNNER_TEMP/release-input" - mkdir -p "$bundle" - cp build/libs/BaseMinerals-2.5.1.112021{,-sources,-javadoc}.jar "$bundle/" - cp build/release/SHA256SUMS CHANGELOG.txt "$bundle/" - ./gradlew verifyPreparedReleaseArtifacts verifyMavenCoordinates \ - -PpreparedReleaseDir="$bundle" \ - -PlegacyDependencyVerificationRepository="${{ steps.dependencies.outputs.repository }}" \ - -Dorg.gradle.java.installations.paths="$JAVA_HOME,$JAVA_HOME_8_X64,$JAVA_HOME_25_X64" \ + bash ./gradlew clean check build javadoc verify113ReleaseArtifacts write113ReleaseChecksums genEclipseRuns eclipse \ + -PreleaseBuild=true -PlegacyDependencyVerificationRepository="$PWD/.gradle/legacy-dependencies" \ + --no-daemon --stacktrace --max-workers=2 \ + "-Dorg.gradle.java.installations.paths=$JAVA_HOME,$JAVA_HOME_8_X64,$JAVA_HOME_25_X64" \ -Dorg.gradle.java.installations.auto-detect=false \ - -Dorg.gradle.java.installations.auto-download=false \ - --offline --no-daemon --stacktrace --max-workers=2 - - - name: Verify reproducible release archives - shell: bash - run: | - set -euo pipefail - gradle_args=( - clean build javadoc verifyReleaseArtifacts writeReleaseChecksums - -PreleaseBuild=true - -PlegacyDependencyVerificationRepository="${{ steps.dependencies.outputs.repository }}" - --offline --no-daemon --no-build-cache --stacktrace --max-workers=2 - -Dorg.gradle.java.installations.paths="$JAVA_HOME,$JAVA_HOME_8_X64,$JAVA_HOME_25_X64" - -Dorg.gradle.java.installations.auto-detect=false -Dorg.gradle.java.installations.auto-download=false - ) - ./gradlew "${gradle_args[@]}" - cmp "$RUNNER_TEMP/first-SHA256SUMS" build/release/SHA256SUMS - + - name: Stage the flat release bundle + run: | + mkdir -p build/release-bundle + cp build/libs/*.jar build/release/SHA256SUMS CHANGELOG.txt build/release-bundle/ - name: Upload audited release candidate uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: BaseMinerals-1.12.2-${{ github.sha }} + name: BaseMinerals-1.13.2-${{ github.sha }} if-no-files-found: error retention-days: 30 - path: | - build/libs/BaseMinerals-2.5.1.112021.jar - build/libs/BaseMinerals-2.5.1.112021-sources.jar - build/libs/BaseMinerals-2.5.1.112021-javadoc.jar - build/release/SHA256SUMS - CHANGELOG.txt - - - name: Upload bounded diagnostics on failure + path: build/release-bundle/ + - name: Retain failure diagnostics if: failure() uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: BaseMinerals-1.12.2-diagnostics-${{ github.sha }} + name: BaseMinerals-1.13.2-diagnostics-${{ github.sha }} if-no-files-found: ignore retention-days: 14 path: | build/test-results/** build/reports/** - ${{ runner.temp }}/baseminerals-packaged-checks/**/*-console.log - ${{ runner.temp }}/baseminerals-packaged-checks/**/logs/*.log - ${{ runner.temp }}/baseminerals-packaged-checks/**/crash-reports/*.txt - ${{ runner.temp }}/baseminerals-packaged-checks/**/*-minerals.json - ${{ runner.temp }}/baseminerals-packaged-checks/**/*-review.json - ${{ runner.temp }}/baseminerals-packaged-checks/**/*-launch.json - ${{ runner.temp }}/baseminerals-policy-checks/**/*-console.log - ${{ runner.temp }}/baseminerals-policy-checks/**/*-minerals.json - ${{ runner.temp }}/baseminerals-policy-checks/**/crash-reports/*.txt - build/problems/** - - - name: Upload generation qualification evidence - if: always() - uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 - with: - name: BaseMinerals-1.12.2-worldgen-${{ github.sha }} - if-no-files-found: ignore - retention-days: 30 - path: | - ${{ runner.temp }}/baseminerals-packaged-checks/results.json - ${{ runner.temp }}/baseminerals-packaged-checks/timings.json - ${{ runner.temp }}/baseminerals-packaged-checks/source-fixtures.json - ${{ runner.temp }}/baseminerals-packaged-checks/**/input-jars.json - ${{ runner.temp }}/baseminerals-packaged-checks/**/*-minerals.json - ${{ runner.temp }}/baseminerals-packaged-checks/**/*-console.log - ${{ runner.temp }}/baseminerals-policy-checks/results.json - ${{ runner.temp }}/baseminerals-policy-checks/**/*-minerals.json - ${{ runner.temp }}/baseminerals-policy-checks/**/*-console.log diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 3541471..cceb756 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -3,11 +3,11 @@ name: CodeQL on: push: branches: - - master-1.12 - - 'feature/**' + - master-1.13.2 + - feature/baseminerals-1.13.2 pull_request: branches: - - master-1.12 + - master-1.13.2 schedule: - cron: '47 7 * * 4' diff --git a/.github/workflows/deploy-release.yml b/.github/workflows/deploy-release.yml index d4d8215..1dd2676 100644 --- a/.github/workflows/deploy-release.yml +++ b/.github/workflows/deploy-release.yml @@ -1,28 +1,30 @@ -name: Release Base Minerals to CurseForge - -run-name: Base Minerals ${{ inputs.release_version }} CurseForge (${{ inputs.confirm_live_publication && 'publish' || 'check only' }}) +name: Release Base Minerals 1.13.2 +run-name: Base Minerals ${{ inputs.release_version }} (${{ inputs.confirm_live_publication && 'publish' || 'verify' }}) on: workflow_dispatch: inputs: release_version: - description: Base Minerals version ending in .110021, .111021 or .112021 + description: Four-part version for Minecraft 1.13.2 required: true type: string - release_sha: - description: Full merged commit SHA on the matching Minecraft branch + release_commit: + description: Full SHA of the checked MMD master-1.13.2 commit required: true type: string - ci_run_id: - description: Successful upstream push CI run for the matching branch + tested_jar_sha256: + description: SHA-256 of the qualified game jar required: true type: string - player_sha256: - description: SHA-256 of the tested player jar + curseforge_release_level: + description: CurseForge release level required: true - type: string + default: release + type: choice + options: [release, beta, alpha] confirm_live_publication: - description: Upload the verified player jar to CurseForge + description: Publish the verified CI files to Maven, CurseForge and GitHub + required: true default: false type: boolean @@ -31,126 +33,207 @@ permissions: contents: read concurrency: - group: baseminerals-curseforge-${{ inputs.release_version }} + group: baseminerals-release-113 cancel-in-progress: false jobs: - release: - name: Verify and release Base Minerals + qualify: + name: Verify merged CI candidate + if: github.repository == 'MinecraftModDevelopmentMods/BaseMinerals' && github.ref == 'refs/heads/master-1.13.2' runs-on: ubuntu-latest - timeout-minutes: 15 - + timeout-minutes: 10 + permissions: + actions: read + contents: write + outputs: + ci_run: ${{ steps.candidate.outputs.ci_run }} steps: - - name: Verify the merged source and CI run - id: target + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + ref: ${{ inputs.release_commit }} + fetch-depth: 0 + - name: Verify branch, version and successful merged CI + id: candidate env: GH_TOKEN: ${{ github.token }} RELEASE_VERSION: ${{ inputs.release_version }} - RELEASE_SHA: ${{ inputs.release_sha }} - CI_RUN_ID: ${{ inputs.ci_run_id }} - PLAYER_SHA256: ${{ inputs.player_sha256 }} - shell: bash + RELEASE_SHA: ${{ inputs.release_commit }} + TESTED_SHA: ${{ inputs.tested_jar_sha256 }} run: | set -euo pipefail - repo=MinecraftModDevelopmentMods/BaseMinerals - [[ "$GITHUB_REPOSITORY" == "$repo" && "$GITHUB_REF" == refs/heads/master-1.12 ]] - [[ "$RELEASE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.(110021|111021|112021)$ ]] - case "${RELEASE_VERSION##*.}" in - 110021) minecraft_version=1.10.2; branch=master-1.10.2 ;; - 111021) minecraft_version=1.11.2; branch=master-1.11.2 ;; - 112021) minecraft_version=1.12.2; branch=master-1.12 ;; - esac - [[ "$RELEASE_SHA" =~ ^[a-f0-9]{40}$ && "$PLAYER_SHA256" =~ ^[a-fA-F0-9]{64}$ && "$CI_RUN_ID" =~ ^[0-9]+$ ]] - - branch_sha="$(gh api "repos/$repo/branches/$branch" --jq .commit.sha)" - if [[ "$RELEASE_SHA" != "$branch_sha" ]]; then - echo "Expected the current upstream $branch SHA, found $branch_sha" >&2 - exit 1 - fi - gh api "repos/$repo/actions/runs/$CI_RUN_ID" | - jq -e --arg sha "$RELEASE_SHA" --arg repo "$repo" --arg branch "$branch" ' - .head_sha == $sha and .head_repository.full_name == $repo - and .head_branch == $branch and .event == "push" - and .status == "completed" and .conclusion == "success" - and .path == ".github/workflows/ci.yml"' >/dev/null - - properties="$(gh api "repos/$repo/contents/gradle.properties?ref=$RELEASE_SHA" --jq .content | base64 --decode)" - grep -Fx "mod_version=$RELEASE_VERSION" <<< "$properties" - grep -Fx "minecraft_version=$minecraft_version" <<< "$properties" - grep -Fx 'loader_name=forge' <<< "$properties" - grep -Fx 'curseforge_project_id=270972' <<< "$properties" - gh api "repos/$repo/contents/CHANGELOG.txt?ref=$RELEASE_SHA" --jq .content | - base64 --decode > "$RUNNER_TEMP/merged-changelog.txt" - { - echo "minecraft_version=$minecraft_version" - echo 'curseforge_dependencies<> "$GITHUB_OUTPUT" - - - name: Download the audited CI bundle - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 + [[ "$RELEASE_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.113021$ ]] + [[ "$RELEASE_SHA" =~ ^[[:xdigit:]]{40}$ ]] + [[ "$TESTED_SHA" =~ ^[[:xdigit:]]{64}$ ]] + test "$(git rev-parse HEAD)" = "$RELEASE_SHA" + test "$(gh api "repos/$GITHUB_REPOSITORY/branches/master-1.13.2" --jq .commit.sha)" = "$RELEASE_SHA" + grep -Fxq "mod_version=$RELEASE_VERSION" gradle.properties + grep -Fxq 'minecraft_version=1.13.2' gradle.properties + ci_run="$(gh api --method GET "repos/$GITHUB_REPOSITORY/actions/workflows/ci.yml/runs" \ + -f branch=master-1.13.2 -f head_sha="$RELEASE_SHA" -f event=push -f status=success \ + --jq '.workflow_runs[0].id // empty')" + test -n "$ci_run" + echo "ci_run=$ci_run" >> "$GITHUB_OUTPUT" + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 with: - name: BaseMinerals-${{ steps.target.outputs.minecraft_version }}-${{ inputs.release_sha }} - path: ${{ runner.temp }}/release-input + name: BaseMinerals-1.13.2-${{ inputs.release_commit }} + run-id: ${{ steps.candidate.outputs.ci_run }} github-token: ${{ github.token }} - run-id: ${{ inputs.ci_run_id }} - - - name: Verify the bundle and the tested player jar - id: bundle + path: ${{ runner.temp }}/release-input + - name: Verify sealed files and tested game jar + working-directory: ${{ runner.temp }}/release-input env: RELEASE_VERSION: ${{ inputs.release_version }} - PLAYER_SHA256: ${{ inputs.player_sha256 }} - CI_RUN_ID: ${{ inputs.ci_run_id }} - RELEASE_SHA: ${{ inputs.release_sha }} - shell: bash + TESTED_SHA: ${{ inputs.tested_jar_sha256 }} run: | set -euo pipefail - cd "$RUNNER_TEMP/release-input" - jar="BaseMinerals-$RELEASE_VERSION.jar" - cmp "$RUNNER_TEMP/merged-changelog.txt" CHANGELOG.txt - ( - cd build/libs - sha256sum --strict --check ../release/SHA256SUMS - printf '%s %s\n' "${PLAYER_SHA256,,}" "$jar" | sha256sum --strict --check - ) - echo "jar=$RUNNER_TEMP/release-input/build/libs/$jar" >> "$GITHUB_OUTPUT" - echo "Verified $jar from CI run $CI_RUN_ID at $RELEASE_SHA." >> "$GITHUB_STEP_SUMMARY" - - - name: Check CurseForge credential availability + python3 - "$RELEASE_VERSION" "$TESTED_SHA" <<'PY' + from pathlib import Path + import hashlib, sys + version, tested = sys.argv[1:] + names = [f'BaseMinerals-{version}{suffix}.jar' for suffix in ('', '-sources', '-javadoc')] + assert {p.name for p in Path('.').iterdir()} == set(names + ['SHA256SUMS', 'CHANGELOG.txt']) + actual = {name: hashlib.sha256(Path(name).read_bytes()).hexdigest() for name in names} + declared = dict((name, sha) for sha, name in (line.split(' ', 1) for line in Path('SHA256SUMS').read_text().splitlines())) + assert actual == declared + assert actual[names[0]] == tested.lower() + assert version in Path('CHANGELOG.txt').read_text().splitlines()[0] + PY + - name: Verify live publication credentials + if: inputs.confirm_live_publication env: CURSEFORGE_TOKEN: ${{ secrets.CURSEFORGE_TOKEN }} - CONFIRM_LIVE: ${{ inputs.confirm_live_publication }} - shell: bash + MAVEN_UPLOAD_URL: ${{ secrets.MAVEN_UPLOAD_URL }} + MAVEN_UPLOAD_USERNAME: ${{ secrets.MAVEN_UPLOAD_USERNAME }} + MAVEN_UPLOAD_PASSWORD: ${{ secrets.MAVEN_UPLOAD_PASSWORD }} run: | - if [[ -z "$CURSEFORGE_TOKEN" ]]; then - echo '::warning::CURSEFORGE_TOKEN is unavailable to Base Minerals.' - [[ "$CONFIRM_LIVE" == false ]] + set -euo pipefail + for name in CURSEFORGE_TOKEN MAVEN_UPLOAD_URL MAVEN_UPLOAD_USERNAME MAVEN_UPLOAD_PASSWORD; do + test -n "${!name}" || { echo "Configure $name for this repository" >&2; exit 1; } + done + [[ "$MAVEN_UPLOAD_URL" == https://* ]] + curl --fail --silent --show-error --max-time 30 \ + -H "X-Api-Token: $CURSEFORGE_TOKEN" https://minecraft.curseforge.com/api/game/versions >/dev/null + - name: Reserve the version for this commit + if: inputs.confirm_live_publication + env: + GH_TOKEN: ${{ github.token }} + RELEASE_VERSION: ${{ inputs.release_version }} + RELEASE_SHA: ${{ inputs.release_commit }} + run: | + set -euo pipefail + if existing="$(gh api "repos/$GITHUB_REPOSITORY/git/ref/tags/$RELEASE_VERSION" --jq .object.sha 2>/dev/null)"; then + test "$existing" = "$RELEASE_SHA" else - echo 'The CurseForge upload credential is available.' + gh api --method POST "repos/$GITHUB_REPOSITORY/git/refs" -f ref="refs/tags/$RELEASE_VERSION" -f sha="$RELEASE_SHA" >/dev/null fi - - name: Publish the tested jar to CurseForge - if: inputs.confirm_live_publication + publish_maven: + name: Publish MMD Maven + needs: qualify + if: inputs.confirm_live_publication + runs-on: ubuntu-latest + timeout-minutes: 25 + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + with: + ref: ${{ inputs.release_commit }} + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5 + with: + distribution: temurin + java-version: '25.0.3+9.0.LTS' + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5 + with: + distribution: temurin + java-version: '8.0.502+7' + - uses: actions/setup-java@b6effb05e454b25005698d916606bdc6ffcbf961 # v5 + with: + distribution: temurin + java-version: '17.0.1+12' + - uses: gradle/actions/setup-gradle@9c971963bec38e04b3d30dcc455b5382be2fdbfb # v6 + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 + with: + name: BaseMinerals-1.13.2-${{ inputs.release_commit }} + run-id: ${{ needs.qualify.outputs.ci_run }} + github-token: ${{ github.token }} + path: ${{ runner.temp }}/release-input + - name: Stage checksum-verified published dependencies + run: python3 gradle/stage-legacy-dependencies.py .gradle/legacy-dependencies + - name: Publish the sealed Maven jars + env: + MAVEN_UPLOAD_URL: ${{ secrets.MAVEN_UPLOAD_URL }} + MAVEN_UPLOAD_USERNAME: ${{ secrets.MAVEN_UPLOAD_USERNAME }} + MAVEN_UPLOAD_PASSWORD: ${{ secrets.MAVEN_UPLOAD_PASSWORD }} + run: | + bash ./gradlew publishMavenJavaPublicationToReleaseRepository \ + -PpreparedReleaseDir="${{ runner.temp }}/release-input" -PlegacyDependencyVerificationRepository="$PWD/.gradle/legacy-dependencies" \ + --no-daemon --stacktrace --max-workers=2 \ + "-Dorg.gradle.java.installations.paths=$JAVA_HOME,$JAVA_HOME_8_X64,$JAVA_HOME_25_X64" \ + -Dorg.gradle.java.installations.auto-detect=false -Dorg.gradle.java.installations.auto-download=false + + publish_curseforge: + name: Publish CurseForge + needs: [qualify, publish_maven] + if: inputs.confirm_live_publication + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 + with: + name: BaseMinerals-1.13.2-${{ inputs.release_commit }} + run-id: ${{ needs.qualify.outputs.ci_run }} + github-token: ${{ github.token }} + path: ${{ runner.temp }}/release-input + - name: Verify the sealed jars + working-directory: ${{ runner.temp }}/release-input + run: sha256sum --check --strict SHA256SUMS + - name: Publish Base Minerals uses: Kira-NT/mc-publish@52307b03863581dec6b652b83e597aec02ebb075 # v3.3.1 with: curseforge-token: ${{ secrets.CURSEFORGE_TOKEN }} - curseforge-id: 270972 - curseforge-dependencies: ${{ steps.target.outputs.curseforge_dependencies }} - name: Base Minerals ${{ inputs.release_version }} for Minecraft ${{ steps.target.outputs.minecraft_version }} (Forge) + curseforge-id: '270972' + name: Base Minerals ${{ inputs.release_version }} for Minecraft 1.13.2 (Forge) version: ${{ inputs.release_version }} - version-type: release + version-type: ${{ inputs.curseforge_release_level }} changelog-file: ${{ runner.temp }}/release-input/CHANGELOG.txt loaders: forge - game-versions: ${{ steps.target.outputs.minecraft_version }} + game-versions: '1.13.2' game-version-filter: none environment: client | server java: Java 8 + curseforge-dependencies: | + 245586(required) + 240967(optional) + 244357(optional) fail-mode: fail - files: ${{ steps.bundle.outputs.jar }} + files: | + ${{ runner.temp }}/release-input/BaseMinerals-${{ inputs.release_version }}.jar + ${{ runner.temp }}/release-input/BaseMinerals-${{ inputs.release_version }}-sources.jar + ${{ runner.temp }}/release-input/BaseMinerals-${{ inputs.release_version }}-javadoc.jar + + publish_github: + name: Publish GitHub Release + needs: [qualify, publish_curseforge] + if: inputs.confirm_live_publication + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + actions: read + contents: write + steps: + - uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8 + with: + name: BaseMinerals-1.13.2-${{ inputs.release_commit }} + run-id: ${{ needs.qualify.outputs.ci_run }} + github-token: ${{ github.token }} + path: ${{ runner.temp }}/release-input + - name: Create the GitHub release from the sealed files + working-directory: ${{ runner.temp }}/release-input + env: + GH_TOKEN: ${{ github.token }} + RELEASE_VERSION: ${{ inputs.release_version }} + run: | + set -euo pipefail + sha256sum --check --strict SHA256SUMS + gh release create "$RELEASE_VERSION" --repo "$GITHUB_REPOSITORY" --verify-tag \ + --title "Base Minerals $RELEASE_VERSION for Minecraft 1.13.2 (Forge)" \ + --notes-file CHANGELOG.txt "BaseMinerals-$RELEASE_VERSION"{,-sources,-javadoc}.jar SHA256SUMS diff --git a/.github/workflows/release-on-tag.yml b/.github/workflows/release-on-tag.yml index 2208bab..9085d64 100644 --- a/.github/workflows/release-on-tag.yml +++ b/.github/workflows/release-on-tag.yml @@ -1,81 +1,20 @@ -name: Start Base Minerals release from tag - +name: Validate Base Minerals 1.13.2 tag on: push: - tags: - - '*.*.*.*' - + tags: ['*.*.*.113021'] permissions: - actions: read contents: read - -concurrency: - group: baseminerals-release-starter-${{ github.ref_name }} - cancel-in-progress: false - + actions: read jobs: - validate-release-tag: - name: Validate tag for manual release confirmation + validate: if: github.repository == 'MinecraftModDevelopmentMods/BaseMinerals' runs-on: ubuntu-latest timeout-minutes: 10 - steps: - - name: Check out tagged source - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - with: - fetch-depth: 0 - - - name: Validate release tag, target metadata, and prior CI - env: - GH_TOKEN: ${{ github.token }} - shell: bash + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + - name: Check the tag against the release metadata run: | set -euo pipefail - - value() { sed -n "s/^$1=//p" gradle.properties; } - release_version="$(value mod_version)" - minecraft_version="$(value minecraft_version)" - loader_name="$(value loader_name)" - loader_code="$(value loader_code)" - - IFS=. read -r mc_major mc_minor mc_patch extra <<<"$minecraft_version" - mc_patch="${mc_patch:-0}" - if [[ -n "${extra:-}" || ! "$mc_major" =~ ^[0-9]+$ || ! "$mc_minor" =~ ^[0-9]+$ \ - || ! "$mc_patch" =~ ^[0-9]+$ || "$loader_name:$loader_code" != 'forge:1' ]]; then - echo "Invalid target metadata $minecraft_version/$loader_name/$loader_code" >&2 - exit 1 - fi - printf -v minor_padded '%02d' "$((10#$mc_minor))" - printf -v patch_padded '%02d' "$((10#$mc_patch))" - target_suffix="${mc_major}${minor_padded}${patch_padded}${loader_code}" - - if [[ ! "$release_version" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.${target_suffix}$ ]]; then - echo "mod_version $release_version does not match target $target_suffix" >&2 - exit 1 - fi - if [[ "$GITHUB_REF_NAME" != "$release_version" ]]; then - echo "Release tag must equal mod_version $release_version; found $GITHUB_REF_NAME" >&2 - exit 1 - fi - - successful_ci="$(gh api \ - "repos/$GITHUB_REPOSITORY/commits/$GITHUB_SHA/check-runs?per_page=100" \ - --jq '[.check_runs[] | select(.name == "Build, test, and audit" and .conclusion == "success")] | length')" - if [[ "$successful_ci" -lt 1 ]]; then - echo "The tagged commit has no successful Build, test, and audit check" >&2 - exit 1 - fi - - - name: Record the required manual publication step - shell: bash - run: | - { - echo "## Release candidate validated" - echo - echo "Tag \`$GITHUB_REF_NAME\` matches the selected target and has a successful Build, test, and audit check." - echo - echo "**Nothing has been published.**" - echo - echo "Follow docs/RELEASING.md to verify the release inputs before publication." - } >> "$GITHUB_STEP_SUMMARY" + test "$GITHUB_REF_NAME" = "$(sed -n 's/^mod_version=//p' gradle.properties)" + grep -Fxq 'minecraft_version=1.13.2' gradle.properties + echo 'Tag validated. Publication uses deploy-release.yml with explicit confirmation.' >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/validate-gradle-build.yml b/.github/workflows/validate-gradle-build.yml index cc6223d..81225e5 100644 --- a/.github/workflows/validate-gradle-build.yml +++ b/.github/workflows/validate-gradle-build.yml @@ -3,11 +3,11 @@ name: Validate Gradle Wrapper on: push: branches: - - master-1.12 - - 'feature/**' + - master-1.13.2 + - feature/baseminerals-1.13.2 pull_request: branches: - - master-1.12 + - master-1.13.2 permissions: contents: read diff --git a/CHANGELOG.txt b/CHANGELOG.txt index bf75a3f..b93b078 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,3 +1,13 @@ +2.5.1.113021 for Minecraft 1.13.2 + +- Bring the eight minerals and seven ore deposits across to Forge 25, without MMDLib. +- Convert old metadata to named block states and keep saved mineral blocks, fluids and buckets when upgrading a copied world. +- Share crushing recipes with Base Metals 3.0.3, or Modern Metals when Base Metals is absent. +- Keep KiriCattus's ore overlays on the active stone texture and use OreSpawn's native provider. +- Use OreSpawn 4.1.7 for the latest world generation and saved-profile fixes. +- Fix missing fluids and startup hangs with other fluid-adding mods during parallel loading. +- The old material settings screens and Tinkers integration are not available on 1.13.2. Ore generation is configured through OreSpawn. + 2.5.1.112021 for 1.12.2 This brings the 1.10 and 1.11 updates across to 1.12.2. Use Forge 14.23.5.2859 with MMDLib 1.0.0 RC3 and OreSpawn 4.1.6.112021. Base Metals is optional. I checked that its hammer works on the ores with Base Metals 2.6.2.112021 installed. diff --git a/README.md b/README.md index a4647e7..450d8f6 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,31 @@ # Base Minerals -Base Minerals adds lithium, niter, phosphorus, potash, salt, saltpeter, silicon -and sulfur. It provides powders, storage blocks and, for some materials, -ingots, blends and molten forms. Silicon is made from sand and coal or charcoal -dust. The seven ores use KiriCattus's overlays on Minecraft's stone texture. +Base Minerals adds lithium, niter, phosphorus, potash, salt, saltpeter, sulfur +and silicon. The seven ores use KiriCattus's overlays. OreSpawn handles +placement, including the saved rules and shared ore sources. -This branch targets Minecraft 1.12.2 and Forge 14.23.5.2859 or later. Install -MMDLib 1.0.0 RC3 and OreSpawn 4.1.6.112021 on the client and server. Base Metals -and Mineralogy are optional. Tinkers' Construct adds melting and casting for -lithium and silicon. +This branch targets Minecraft 1.13.2 and Forge 25.0.223. Install +[OreSpawn 4.1.7.113021](https://www.curseforge.com/minecraft/mc-mods/mmd-orespawn/files/9611746). +[Base Metals 3.0.3.113021](https://github.com/MinecraftModDevelopmentMods/BaseMetals/releases/tag/3.0.3.113021) +is optional in new worlds and supplies the Crack Hammer. Keep Base Metals +installed when upgrading a world that already contains its blocks or items. +Use 3.0.3.113021 or a later compatible 1.13.2 build when installing the two together. -The material and fluid settings in `config/BaseMinerals.cfg` require a full -restart. Open the same screen from Forge Mods or OreSpawn's Mods directory. -Configure ore placement and shared outputs in OreSpawn. Vanilla stone and its -variants are valid hosts. +Base Minerals shares its ore crushing recipes with Base Metals when installed. +If Base Metals is absent, Modern Metals crackhammers can crush the ores instead. -Registry names and the 1.12 config keys carry forward. OreSpawn preserves saved -profiles, imported rules and already generated chunks. If you are moving an -OreSpawn 1 setup from 1.10.2 or 1.11.2, import it there first and carry the -saved world profile forward. +## Upgrading a world -See [ore generation](docs/ORE_GENERATION.md), [building](docs/BUILDING.md) and -[verification](tools/validation/legacy112/README.md). +Copy the whole save folder before opening it on 1.13.2, including level.dat +and serverconfig. Start the copy with Forge, Base Minerals, OreSpawn and the +1.13.2 versions of any other mods whose content it uses. Check existing blocks +and inventories, save, then reopen the copy. + +Base Minerals reads the old Forge registry from the world and saves the +mineral ID mapping alongside it. Keep baseminerals-legacy-registry.dat with the +save because previously unloaded chunks may still use the old numeric IDs. +Placed molten lithium and silicon keep their fluid level. The old Forge filled +buckets become the matching named buckets. + +See [building](docs/BUILDING.md), [ore generation](docs/ORE_GENERATION.md), +[upgrade checks](docs/WORLD_UPGRADES.md) and [known limits](docs/KNOWN_ISSUES.md). diff --git a/build.gradle b/build.gradle index c71ec6e..4837a5d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,23 +1,18 @@ -import org.apache.tools.ant.filters.FixCrLfFilter +import groovy.json.JsonSlurper +import java.security.MessageDigest plugins { id 'java' id 'eclipse' - id 'idea' id 'maven-publish' id 'net.minecraftforge.renamer' version '1.1.5' id 'net.minecraftforge.gradle' version '7.0.34' } -group = project.mod_group -version = project.mod_version +group = 'zone.moddev.mc.baseminerals' +version = '2.5.1.113021' base.archivesName = 'BaseMinerals' -if (!(project.version ==~ /\d+\.\d+\.\d+\.112021/)) { - throw new GradleException('Use Major.Minor.Patch.112021 for Minecraft 1.12.2 on Forge.') -} - -// Gradle and Mavenizer use modern JDKs; the mod and game still use Java 8. java { toolchain.languageVersion = JavaLanguageVersion.of(8) withSourcesJar() @@ -25,157 +20,150 @@ java { } tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' - sourceCompatibility = targetCompatibility = '1.8' - options.compilerArgs.addAll(['-Xmaxerrs', '1000']) } -tasks.named('compileTestJava', JavaCompile) { options.compilerArgs.add('-proc:none') } -tasks.withType(Test).configureEach { useJUnitPlatform() } tasks.withType(Javadoc).configureEach { - 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 { preserveFileTimestamps = false reproducibleFileOrder = true - includeEmptyDirs = false - exclude '**/desktop.ini', '**/Thumbs.db', '**/.DS_Store' -} -// Mapped dependency bytes no longer match their original signatures. Keep the -// verified downloads intact and strip signatures only from renamed copies. -tasks.withType(net.minecraftforge.renamer.gradle.RenameJar).configureEach { - additionalArgs.addAll('--strip-sigs', 'ALL', '--disable-abstract-param') } -def textPatterns = ['cfg', 'css', 'html', 'info', 'java', 'js', 'json', 'lang', 'mcmeta', 'md', 'properties', 'txt', 'xml'] - .collect { "**/*.${it}".toString() } -def normalizeText = { details -> - details.filter(FixCrLfFilter, eol: FixCrLfFilter.CrLf.newInstance('lf'), - eof: FixCrLfFilter.AddAsisRemove.newInstance('asis')) -} - -def developmentOutput = layout.buildDirectory.dir('forge12-development/main') -def prepareDevelopmentMod = tasks.register('prepareDevelopmentMod', Sync) { - group = 'ide' - description = 'Merges production classes and processed resources for Forge 1.12 launches.' - dependsOn tasks.named('classes') - from tasks.named('compileJava', JavaCompile).flatMap { it.destinationDirectory } - from sourceSets.main.output.resourcesDir - into developmentOutput +def modClasses = layout.buildDirectory.dir('forge-run-mod-classes/main') +def stageRunClasses = tasks.register('stageRunClasses', Sync) { + from sourceSets.main.output + into modClasses } minecraft { - mappings channel: project.mappings_channel, version: project.mappings_version + mappings channel: 'snapshot', version: '20180921-1.13' if (gradle.startParameter.offline) mavenizerArguments.add('--offline') runs { configureEach { + mainClass = 'net.minecraftforge.userdev.LaunchTesting' workingDir.convention layout.projectDirectory.dir( providers.gradleProperty('baseMineralsRunDirectory').getOrElse('run')) - environment 'MC_VERSION', project.minecraft_version - environment 'MOD_CLASSES', developmentOutput.get().asFile.absolutePath - systemProperty 'fml.coreMods.load', project.coreplugin - systemProperty 'log4j.skipJansi', 'true' - systemProperty 'forge.logging.console.level', 'info' - systemProperty 'log4j.configurationFile', file('gradle/ide/log4j2.xml').toURI().toString() - if (providers.gradleProperty('baseMineralsLaunchProbePhase').isPresent()) { - systemProperty 'launch.phase', providers.gradleProperty('baseMineralsLaunchProbePhase').get() - } + mods { baseminerals { source sourceSets.main } } + environment 'target', name == 'client' ? 'fmluserdevclient' : 'fmluserdevserver' + environment 'MC_VERSION', '1.13.2' + environment 'MCP_VERSION', '20190213.203750' + environment 'MCP_MAPPINGS', 'snapshot_20180921-1.13' + environment 'FORGE_VERSION', '25.0.223' + environment 'FORGE_GROUP', 'net.minecraftforge' + def path = modClasses.get().asFile.absolutePath + environment 'MOD_CLASSES', "baseminerals%%${path}${File.pathSeparator}baseminerals%%${path}" } register('client') - register('server') { args 'nogui' } + register('server') { args '--nogui' } } } -tasks.matching { it.name in ['runClient', 'runServer'] }.configureEach { - dependsOn prepareDevelopmentMod - dependsOn 'prepareJava8Launcher' - doFirst { - Set splitOutputs = sourceSets.main.output.files.collect { it.canonicalFile } as Set - classpath = files(developmentOutput, tasks.named('prepareJava8Launcher'), classpath.filter { - !splitOutputs.contains(it.canonicalFile) && it.name != 'slime-launcher-0.2.2.jar' - }) - environment 'MC_VERSION', project.minecraft_version - environment 'MOD_CLASSES', developmentOutput.get().asFile.absolutePath - } -} - -def legacyMirror = file(providers.gradleProperty('legacyDependencyVerificationRepository') - .orElse(providers.gradleProperty('legacyDependencyRepository')) +def mirror = file(providers.gradleProperty('legacyDependencyVerificationRepository') .getOrElse('.gradle/legacy-dependencies')) -def legacyRepository = { String remote -> legacyMirror.isDirectory() ? legacyMirror.toURI() : uri(remote) } - repositories { minecraft.mavenizer(it) maven fg.forgeMaven maven fg.minecraftLibsMaven - maven { - name = 'VerifiedLegacyMirror' - url = legacyMirror.toURI() - metadataSources { artifact() } - } exclusiveContent { - forRepository { maven { url = legacyRepository('https://www.cursemaven.com'); metadataSources { artifact() } } } + forRepository { + maven { + url = mirror.isDirectory() ? mirror.toURI() : uri('https://www.cursemaven.com') + metadataSources { artifact() } + } + } filter { includeGroup 'curse.maven' } } exclusiveContent { - forRepository { maven { url = legacyRepository('https://chickenbones.net/maven/'); metadataSources { artifact() } } } - filter { includeGroup 'codechicken' } - } - exclusiveContent { - forRepository { maven { url = legacyRepository('https://dvs1.progwml6.com/files/maven/'); metadataSources { artifact() } } } - filter { includeGroup 'slimeknights'; includeGroup 'slimeknights.mantle'; includeGroup 'mezz.jei' } - } - exclusiveContent { - forRepository { maven { url = legacyRepository('https://maven.ic2.player.to/'); metadataSources { artifact() } } } - filter { includeGroup 'net.industrial-craft' } - } - exclusiveContent { - forRepository { maven { url = legacyRepository('https://maven.covers1624.net/'); metadataSources { artifact() } } } - filter { includeGroup 'cofh' } - } - exclusiveContent { - forRepository { maven { url = legacyRepository('https://maven.moddev.zone/releases'); metadataSources { artifact() } } } - filter { includeModule 'zone.moddev.mc.basemetals', 'BaseMetals'; includeModule 'zone.moddev.mc.orespawn', 'OreSpawn' } + forRepository { + maven { + name = 'PublishedBaseMetals' + url = mirror.isDirectory() ? mirror.toURI() : uri('https://maven.moddev.zone/releases') + metadataSources { artifact() } + } + } + filter { includeModule('zone.moddev.mc.basemetals', 'BaseMetals') } } mavenCentral() } -apply from: 'gradle/dependencies.gradle' -renamer.mappings.from minecraft.dependency.toSrgFile - -tasks.named('processResources', ProcessResources) { - filteringCharset = 'UTF-8' - exclude '**/desktop.ini', '**/Thumbs.db', '**/.DS_Store' - inputs.property 'version', project.version - inputs.property 'mcversion', project.minecraft_version - filesMatching('mcmod.info') { expand version: project.version, mcversion: project.minecraft_version } - filesMatching('assets/baseminerals/lang/*.lang') { details -> details.name = details.name.toLowerCase(Locale.ROOT) } - rename '(.+_at.cfg)', 'META-INF/$1' - filesMatching(textPatterns, normalizeText) +def specs = new JsonSlurper().parse(file('gradle/dependencies.json')) +configurations { + pinnedMods { canBeConsumed = false; transitive = false } } - +dependencies { + implementation minecraft.dependency('net.minecraftforge:forge:1.13.2-25.0.223') + specs.each { spec -> + pinnedMods spec.coordinate + if (spec.runtime) implementation renamer.dependency(spec.coordinate) + } + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.2' +} +renamer.mappings.from minecraft.dependency.toSrgFile tasks.named('jar', Jar) { archiveClassifier = 'deobf' destinationDirectory = layout.buildDirectory.dir('libs-dev') - manifest.attributes( - 'Implementation-Title': 'BaseMinerals', 'Implementation-Version': project.version, - 'Maven-Artifact': "${project.group}:BaseMinerals:${project.version}", - 'Built-On-Java': '8', 'Built-On': "${project.minecraft_version}-${project.forge_version}", - 'FMLCorePluginContainsFMLMod': 'true', 'FMLCorePlugin': project.coreplugin) -} -['sourcesJar', 'javadocJar'].each { name -> - tasks.named(name, Jar) { - filteringCharset = 'UTF-8' - filesMatching(textPatterns, normalizeText) +} +def playerJar = renamer.classes(tasks.named('jar', Jar)) { + map.from minecraft.dependency.toSrgFile + archiveClassifier = null + output = layout.buildDirectory.file("libs/BaseMinerals-${project.version}.jar") +} +tasks.named('assemble') { dependsOn playerJar } +publishing { + publications { + mavenJava(MavenPublication) { + artifactId = 'BaseMinerals' + artifact(playerJar) + artifact(tasks.named('sourcesJar')) + artifact(tasks.named('javadocJar')) + } + } +} + +tasks.register('verifyPinnedMods') { + group = 'verification' + inputs.files(configurations.pinnedMods) + doLast { + def artifacts = configurations.pinnedMods.resolvedConfiguration.resolvedArtifacts + specs.each { spec -> + def version = spec.coordinate.split(':')[2] + def archive = artifacts.find { it.moduleVersion.id.version == version }.file + def hash = MessageDigest.getInstance('SHA-256').digest(archive.bytes).encodeHex().toString() + if (!hash.equalsIgnoreCase(spec.sha256)) throw new GradleException("Wrong SHA-256 for ${spec.coordinate}") + } + } +} +tasks.named('compileJava') { dependsOn 'verifyPinnedMods' } +tasks.named('test') { useJUnitPlatform() } + +tasks.register('verifyFluidRegistration', Exec) { + group = 'verification' + description = 'Checks that fluid registration runs before blocks, outside parallel construction.' + commandLine 'node', '--test', 'tools/test_fluid_registration.js' +} +tasks.named('check') { dependsOn 'verifyFluidRegistration' } +['client', 'server'].each { run -> + tasks.matching { it.name == 'run' + run.capitalize() }.configureEach { + dependsOn stageRunClasses + doFirst { + File gameDir = minecraft.runs.named(run).get().workingDir.get().asFile + File mods = new File(gameDir, 'mods') + if (!mods.isDirectory() && !mods.mkdirs()) throw new GradleException("Could not create ${mods}") + } } } +tasks.named('eclipse') { dependsOn 'genEclipseRuns', stageRunClasses } + +tasks.named('processResources', ProcessResources) { + inputs.property 'version', project.version + filesMatching('META-INF/mods.toml') { expand(version: project.version) } +} -ext.baseMineralsBuild = [developmentOutput: developmentOutput].asImmutable() apply from: 'gradle/ore-models.gradle' -apply from: 'gradle/release/artifacts.gradle' -apply from: 'gradle/release/publishing.gradle' -apply from: 'gradle/verification/runtime.gradle' -apply from: 'gradle/ide/eclipse.gradle' + +apply from: 'gradle/release-113.gradle' + +apply from: 'gradle/normalize-javadoc-trees.gradle' diff --git a/docs/BUILDING.md b/docs/BUILDING.md index 79ca685..b40e05a 100644 --- a/docs/BUILDING.md +++ b/docs/BUILDING.md @@ -1,83 +1,26 @@ -# Building Base Minerals 1.12.2 +# Building Base Minerals 1.13.2 -Use Gradle 9.6.1, ForgeGradle 7.0.34, Renamer 1.1.5 and Foojay 1.0.0. Gradle runs -on Java 17 and Mavenizer uses Java 25. Compilation, bytecode and Minecraft use Java 8. -Forge is 14.23.5.2859 with stable-39 mappings. Release pins are Temurin 8u502-b07, -17.0.1+12 and 25.0.3+9-LTS. Install them or pass their homes with -`org.gradle.java.installations.paths`. Do not launch Gradle on Java 8. -On the command line use `-Dorg.gradle.java.installations.paths=` and -`-Dorg.gradle.java.installations.auto-detect=false` to keep offline runs on the -same physical JDK installations. Gradle 9 deprecates the older `-P` form. +Use Java 17 for Gradle, Java 25 for Forge's Mavenizer, and Java 8 for compilation +and Minecraft. The wrapper is Gradle 9.6.1 with ForgeGradle 7.0.34, Renamer 1.1.5, +Forge 25.0.223 and MCP snapshot 20180921-1.13. -The staging script downloads and verifies MMDLib, OreSpawn and the optional -compatibility jars using `gradle/dependencies.json`. The exact MMDLib pin is the -published 1.0.0 RC3 jar. Its embedded Forge metadata still reports `1.0.0-rc2`, -which is why that version appears in the runtime dependency range. -The mirror also supplies the checksum-pinned LegacyDev 0.2.3.1 used to bootstrap -Forge 1.12.2. +Select one Gradle cache for Eclipse and the terminal. Stage the checksum-pinned +public OreSpawn and Base Metals jars, then build with Java 17 as JAVA_HOME. +Base Metals is pinned to the published MMD Maven release 3.0.3.113021 and +checked by SHA-256. It remains optional when playing. -Select Java 17 with `JAVA_HOME` and `PATH`, then stage the dependencies and build. + python gradle/stage-legacy-dependencies.py + .\gradlew.bat check build genEclipseRuns eclipse "-PlegacyDependencyVerificationRepository=" -```powershell -$env:GRADLE_USER_HOME='' -$mirror = '' -python gradle/stage-legacy-dependencies.py $mirror -python -m pip install -r tools/validation/requirements.txt -.\gradlew.bat clean check build javadoc verifyReleaseArtifacts verifyProjectResources prepareEclipse "-PlegacyDependencyVerificationRepository=$mirror" -``` +On a configured machine, add --offline to rebuild from the same cache. +The reobfuscated player jar is build/libs/BaseMinerals-2.5.1.113021.jar. +Development output lives under build/libs-dev. Sources and Javadocs are separate. -Use `-PpythonExecutable=` if Python is not named `python3`. -`gradle/dependencies.json` pins production downloads and SHA-256. Staging creates -a verified Maven mirror. `-PlegacyDependencyVerificationRepository=` selects -its location. The build remaps development copies and strips invalid signatures -from those copies. No floating mod versions, JCenter or -`mavenLocal()` are used. A normal build never publishes. +Import the inner checkout as an Eclipse Gradle project. The generated client +and server launch files use the Java 8 game toolchain and staged mod output. +For a terminal launch, use runClient or runServer. Use the published Base Metals +jar with the packaged Forge profile when checking Crack Hammer integration. -`build/libs/BaseMinerals-2.5.1.112021.jar` is the installed jar. Sources/Javadocs -are separate. Test probes are isolated from all release archives. - -## Eclipse - -Run `prepareEclipse` and import the inner Git/Gradle project using Buildship. Use -Java 17 for Gradle, a Java 8 project JRE and one physical cache for Eclipse and the -terminal. The standard client and server profiles load Base Minerals, MMDLib and OreSpawn. -Base Metals and Tinkers are optional compatibility dependencies. Regenerate -profiles when dependency/toolchain locations change. FG7 uses `genEclipseRuns` and -`prepareEclipse`. - -Use `runClientWithBaseMetals` in Eclipse to test Base Metals tools against the -Base Minerals ores. It loads the pinned Base Metals jar and keeps its saves and -configuration under `run/with-base-metals`. - -Gradle launches merge production classes and processed resources into one mod -directory. Eclipse uses `bin/main`, with resources from `build/resources/main` so -metadata is not duplicated. `verifyEclipseProductionClasspath` checks isolation. -ForgeGradle's `source-sets-not-merged-for-eclipse` diagnostic refers to its own -automatic merge. This project merges production output explicitly and audits -the generated profiles, Buildship model and Java 8 Eclipse compiler. - -## Ore models - -`generateOreModels` writes the ore block models to `build/generated/ore-models`. -The normal build includes them in the game and sources jars. Blockstates and -inventory models use the existing model names. - -The seven ores use KiriCattus's transparent PNGs in -`src/main/resources/assets/baseminerals/textures/blocks/ore_overlays/`. The build -layers each PNG over Minecraft stone for the block and inventory models. -An ore with only a full texture in `textures/blocks/` uses that texture on a -single cube. To switch it to an overlay, put a PNG with the same name in -`ore_overlays/` and rebuild. - -## Verification - -`test` checks native declarations, configuration latching and namespace compatibility. -`verifyProjectResources` validates resources and the pinned engine schema. Packaged server checks require a clean Forge template: - -```text -gradlew packagedForgeRuntimeTest -PpackagedForgeRuntimeRoot= -PpackagedForgeRuntimeOutput= -gradlew packagedSourcePolicyTest -PpackagedForgeRuntimeRoot= -PpackagedSourcePolicyOutput= -``` - -The output directory must not already exist. See the validation README for exact -client commands, migration scenarios and limitations. +The test runners in tools/validation/legacy113 use an independently installed +Forge server template. Install requirements.txt from that directory for the +Anvil and NBT checks. diff --git a/docs/KNOWN_ISSUES.md b/docs/KNOWN_ISSUES.md index c3ba4a8..1fcf2bf 100644 --- a/docs/KNOWN_ISSUES.md +++ b/docs/KNOWN_ISSUES.md @@ -1,19 +1,12 @@ -# Known issues for Minecraft 1.12.2 +# Known limits for Minecraft 1.13.2 -## Moving an OreSpawn 1 configuration +The 1.12 material and molten-form switches in BaseMinerals.cfg and their settings +screens have not been ported. The 1.13 registries keep the old content available +for saved blocks and inventories. Use OreSpawn to change ore generation. +The 1.12 Tinkers' Construct integration does not carry over to Forge 25. -The 1.12.2 importer reads OreSpawn 2 and 3 configuration files. For an OreSpawn -1 configuration, use OreSpawn 4 on 1.10.2 or 1.11.2 to import it before -moving the world. Carry the resulting `serverconfig/orespawn-worldgen.json` -with the save. +OreSpawn 1 settings need to be imported on a supported older installation before +moving the world. Carry the resulting saved profile with the world. -[OreSpawn 4.1.6.112021](https://www.curseforge.com/minecraft/mc-mods/mmd-orespawn/files/9527784) -keeps the saved imported lithium rule. It backs up affected profiles before -removing an untouched duplicate. If the added rule or its source policy was -edited, OreSpawn preserves the edits and flags the rule for review. - -## MMDLib version in Forge - -The [published MMDLib 1.0.0 RC3 jar](https://www.curseforge.com/minecraft/mc-mods/mmdlib/files/9414723) -reports `1.0.0-rc2` in the Forge Mods list. Base Minerals builds and tests against -the exact RC3 download and accepts the version reported by its metadata. +An already-converted world whose numeric registry or original chunks were +discarded requires the original backup for lossless conversion. diff --git a/docs/ORE_GENERATION.md b/docs/ORE_GENERATION.md index e72e8d1..91444f5 100644 --- a/docs/ORE_GENERATION.md +++ b/docs/ORE_GENERATION.md @@ -31,7 +31,7 @@ The balance draws on [lithium pegmatites](https://www.usgs.gov/data/lithium-depo [evaporite potash](https://www.usgs.gov/publications/potash-a-global-overview-evaporate-related-potash-resources-including-spatial) and [sedimentary phosphate](https://pubs.usgs.gov/bul/b1693/html/bull74kl.htm). -Vanilla stone, including metadata variants, is eligible. Additional hosts are +New profiles allow stone and the six named granite, diorite and andesite variants, including polished forms. Additional hosts are intrusive igneous rocks for lithium, sedimentary rocks for nitrates, salt, potash and phosphorus, and sedimentary or volcanic rocks for sulfur. There are no hard biome restrictions. Rules cover ordinary dimensions except vanilla Nether/End. diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 52dc9db..23ca12f 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -1,22 +1,28 @@ -# Release preparation +# Releasing Base Minerals for Minecraft 1.13.2 -Normal builds never publish. Main, sources, Javadocs and SHA-256 form one audited -candidate. Gradle enforces Java 8 bytecode, deterministic archives, processed -metadata, dependency hashes and exclusion of tests, local context and shared -library copies. Prepared bundles contain exactly those three jars, `SHA256SUMS` -and `CHANGELOG.txt`. `verifyPreparedReleaseArtifacts` audits the prepared files. +Build with Java 17, Temurin 8u502-b07 for compilation and Java 25 for +Mavenizer. Run check, build, verify113ReleaseArtifacts, +write113ReleaseChecksums, genEclipseRuns and eclipse. Keep the packaged +gameplay and saved-world checks local, then complete manual testing. -CI has a cold bootstrap/offline rebuild, build/tests, resource/schema checks, -packaged server qualification, Eclipse generation and clean reproducibility check. -CodeQL/wrapper checks are separate. Actions use full commit hashes. +Open a PR from the fork to MMD's master-1.13.2. After merging, wait for the +successful push CI run and download BaseMinerals-1.13.2-. Compare +all three jars with the locally qualified bundle. The CI bundle contains +the player, sources and Javadoc jars, SHA256SUMS and CHANGELOG.txt. -The shared dispatcher on MMD's default branch, `master-1.12`, picks the branch -and CurseForge dependencies from the version. For 1.12.2, supply the -`Major.Minor.Patch.112021` version, full merged `master-1.12` SHA, successful -upstream push CI run ID and SHA-256 of the tested player jar. Run verification -with publication confirmation off before uploading. +Run deploy-release.yml on master-1.13.2 with the release version, full merged +commit and qualified game-jar SHA-256. Leave confirm_live_publication false +for verification. Set it true only when publication is authorised. The +workflow checks the branch tip, successful merged CI and bundle hashes, +then publishes those exact files to MMD Maven, CurseForge and GitHub. +It does not rebuild the jars during publication. -CurseForge project **270972** should list MMDLib **261744** and MMD OreSpawn -**245586** as required, with Base Metals **240967** optional. The workflow needs -access to `CURSEFORGE_TOKEN`. Check the public file and its download checksum -after upload. If an upload times out, check its status before trying again. +MMD needs CURSEFORGE_TOKEN, MAVEN_UPLOAD_URL, MAVEN_UPLOAD_USERNAME and +MAVEN_UPLOAD_PASSWORD as repository or shared organisation secrets. Maven +publication requires HTTPS and validates the prepared bundle again. + +Verify anonymous downloads and hashes on all three services, including the +CurseForge dependency metadata. If a publication job fails, preserve its +logs and retry only the failed job; do not duplicate an accepted upload. +Base Metals is optional and OreSpawn is required. Publish Base Metals first +and keep the compatibility pin on its public 1.13.2 release. diff --git a/docs/WORLD_UPGRADES.md b/docs/WORLD_UPGRADES.md new file mode 100644 index 0000000..b651ce1 --- /dev/null +++ b/docs/WORLD_UPGRADES.md @@ -0,0 +1,27 @@ +# Base Minerals 1.13.2 upgrade checks + +The older saves store a Forge registry snapshot alongside their numeric chunks. +Two saves may assign different numbers to the same mineral block. The upgrade +uses the registry in the save being opened, supplies named states only during +that chunk's flattening pass, and keeps the mapping for later reloads. +Ordinary mineral blocks have one state. The two molten blocks map the old +metadata nibble to the named level property. Existing item names carry forward, +and Forge's old universal buckets become named lithium and silicon buckets. + +The packaged test runner copies the source world and fingerprints every file. +It checks every original chunk after conversion and reload. It compares exact +mineral coordinates and states, chest inventory slots, stack sizes, custom +names, unrelated NBT tags and the saved OreSpawn mineral rules. A test chest +and placed blocks extend coverage to every item and block in the source +registry. The fixture also covers all 16 fluid levels for each registered +molten block. Each original chunk must use the flattened 1.13.2 format. + + python tools/validation/legacy113/verify_upgrade.py --java --runtime --source --output --mods [basemetals.jar] + +The default probe chunk is (64, 64). Supply --probe-chunk X Z to use a different +generated chunk outside the spawn area. Add --natural-open to check a normal +first open before converting the remaining chunks. Use verify_generation.py +with the same Java, template, output and mod arguments to census new ores. + +Keep the original world and its mod set together. Forge and any companion mods +own conversion of their own blocks, items and saved data. diff --git a/gradle.properties b/gradle.properties index 1426979..ddc1987 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,31 +4,6 @@ org.gradle.configuration-cache=false org.gradle.caching=true org.gradle.parallel=false net.minecraftforge.gradle.merge-source-sets=false - -minecraft_version=1.12.2 -forge_version=14.23.5.2859 -mappings_channel=stable -mappings_version=39-1.12 - -mod_id=baseminerals -mod_group=zone.moddev.mc.baseminerals -mod_version=2.5.1.112021 -mod_artifact=BaseMinerals -loader_name=forge -loader_code=1 -java_version=8 -java_toolchain_version=8.0.502+7 -java_setup_version=8.0.502+7 -gradle_java_version=17 -gradle_java_setup_version=17.0.1+12 -mavenizer_java_version=25.0.3+9 -curseforge_project_id=270972 -cf_requirements=mmd-orespawn,mmdlib -orespawn_curse_project_id=245586 -coreplugin=zone.moddev.mc.baseminerals.compat.BaseMineralsLoadingPlugin -orespawn_version=4.1.6.112021 -orespawn_version_range=[4.1.6.112021,5.0.0) - -mmdlib_version=1.0.0-rc2 -mmdlib_version_range=[1.0.0-rc2,2.0.0) -forge_installer_sha256=DBBA1CD1BF34A4B82148BAC50A6150F63FFCB2D5DC7D88A0508C27FDCFF15B76 +minecraft_version=1.13.2 +forge_version=25.0.223 +mod_version=2.5.1.113021 diff --git a/gradle/dependencies.json b/gradle/dependencies.json index 2e8033b..76b4d14 100644 --- a/gradle/dependencies.json +++ b/gradle/dependencies.json @@ -1,44 +1,16 @@ [ - { - "id": "mmdlib", - "coordinate": "curse.maven:mmdlib-261744:9414723", - "sha256": "B35CD5A4454B03D43744EE263BD92A4B718660557C360F961B65A6303A80F88C", - "repository": "https://www.cursemaven.com", - "runtime": true - }, { "id": "orespawn", - "coordinate": "curse.maven:mmd-orespawn-245586:9527784", - "sha256": "DA6B243317E3365371C397CC9A895D108312F3437FB1797FBB5E8241525EA75F", + "coordinate": "curse.maven:mmd-orespawn-245586:9611746", "repository": "https://www.cursemaven.com", - "runtime": true + "runtime": true, + "sha256": "E65DCCA0623A20111C40779CB0FE2078E98C618FAA68F79C9A28E1E53C63957E" }, { "id": "basemetals", - "coordinate": "curse.maven:base-metals-240967:9532211", - "sha256": "0CFD379FA059974E8DBA2AC743FF3E1E8E8183E48DA87BD63377E2EF0FB30312", - "repository": "https://www.cursemaven.com", - "runtime": false - }, - { - "id": "alt", - "coordinate": "curse.maven:additional-loot-tables-243157:2691613", - "repository": "https://www.cursemaven.com", - "sha256": "D5661DBF99859E8C9CF29704AB0FD4A132D062031A4023A0FF5E6F9D06ACE3E2", - "runtime": false - }, - { - "id": "mantle", - "coordinate": "curse.maven:tinkers-mantle-74924:2550550", - "repository": "https://www.cursemaven.com", - "sha256": "7758817445D55B65581A34A906EE01155C4598FDDF06E7D72944C840A1105184", - "runtime": false - }, - { - "id": "tconstruct", - "coordinate": "curse.maven:tinkers-construct-74072:2571785", - "repository": "https://www.cursemaven.com", - "sha256": "B1E21352C7BCEC95E33769308D9E70CC83E8F3A97C27FB94F4F0F55CE3CF96F2", - "runtime": false + "coordinate": "zone.moddev.mc.basemetals:BaseMetals:3.0.3.113021", + "repository": "https://maven.moddev.zone/releases", + "runtime": false, + "sha256": "88B9DB908249B9CD7E415F5577311ED03A22CF6BF17800688F67FC65F6BE2ECD" } ] diff --git a/gradle/normalize-javadoc-trees.gradle b/gradle/normalize-javadoc-trees.gradle new file mode 100644 index 0000000..13238bb --- /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( + /(
    \r?\n)((?:
  • [^\r\n]*<\/li>\r?\n){2,})(<\/ul>)/) { + all, opening, siblings, closing -> + opening + siblings.readLines().sort().join('\n') + '\n' + closing + } + if (ordered != original) page.setText(ordered, 'UTF-8') + } + } +} diff --git a/gradle/ore-models.gradle b/gradle/ore-models.gradle index 5f32362..6b92f3c 100644 --- a/gradle/ore-models.gradle +++ b/gradle/ore-models.gradle @@ -1,6 +1,6 @@ import groovy.json.JsonOutput -// Forge 1.12 predates Minecraft's data generator. Generate models during the build. +// Generate ore overlay models from the supplied textures. def assets = layout.projectDirectory.dir('src/main/resources/assets/baseminerals') def textures = assets.dir('textures/blocks') def solidTextures = fileTree(textures) { include '*_ore.png' } @@ -47,7 +47,7 @@ def generateOreModels = tasks.register('generateOreModels') { if (overlays.contains(name)) { writeModel(name, [ parent: 'baseminerals:block/ore_overlay', - textures: [particle: 'minecraft:blocks/stone', base: 'minecraft:blocks/stone', + textures: [particle: 'minecraft:block/stone', base: 'minecraft:block/stone', overlay: "baseminerals:blocks/ore_overlays/${name}"] ]) } else { diff --git a/gradle/release-113.gradle b/gradle/release-113.gradle new file mode 100644 index 0000000..ddfe894 --- /dev/null +++ b/gradle/release-113.gradle @@ -0,0 +1,197 @@ +import org.apache.tools.ant.filters.FixCrLfFilter +import java.security.MessageDigest +import java.util.jar.Manifest +import java.util.zip.ZipFile +import groovy.xml.XmlSlurper + +// Publish the same audited files that were built and tested by merged-source CI. +def archiveName = 'BaseMinerals' +def modId = 'baseminerals' +def expectedGroup = 'zone.moddev.mc.' + modId +def playerJar = tasks.named('renameJar') +def releaseNames = ['', '-sources', '-javadoc'].collect { "${archiveName}-${project.version}${it}.jar".toString() } +def preparedDirectory = providers.gradleProperty('preparedReleaseDir') +def textPatterns = ['cfg', 'css', 'html', 'info', 'java', 'js', 'json', 'lang', 'mcmeta', 'md', 'properties', 'txt', 'xml', 'toml', 'list'] + .collect { "**/*.${it}".toString() } + ['**/package-list', '**/element-list'] + +tasks.withType(AbstractArchiveTask).configureEach { + inputs.property('releaseArchiveTextFormat', 'UTF-8 LF 2') + preserveFileTimestamps = false + reproducibleFileOrder = true + includeEmptyDirs = false + exclude '**/desktop.ini', '**/Thumbs.db', '**/.DS_Store' + filesMatching(textPatterns) { + filter(FixCrLfFilter, eol: FixCrLfFilter.CrLf.newInstance('lf')) + } +} +tasks.withType(Jar).configureEach { filteringCharset = 'UTF-8' } +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('\\', '/') } + })) + options.addStringOption('docencoding', 'UTF-8') + options.addStringOption('charset', 'UTF-8') + options.addBooleanOption('notimestamp', true) +} +tasks.named('jar', Jar) { + manifest.attributes('Implementation-Title': archiveName, 'Implementation-Version': project.version, + 'Maven-Artifact': "${expectedGroup}:${archiveName}:${project.version}".toString(), + 'Build-Target': 'minecraft-1.13.2-forge-25.0.223-java-8') +} +tasks.named('assemble') { dependsOn playerJar, tasks.named('sourcesJar'), tasks.named('javadocJar') } + +def sha256 = { File file -> MessageDigest.getInstance('SHA-256').digest(file.bytes).encodeHex().toString() } +def audit = { File directory -> + if (project.group.toString() != expectedGroup || !(project.version.toString() ==~ /\d+\.\d+\.\d+\.113021/)) { + throw new GradleException('Wrong Maven or Minecraft release identity') + } + if (directory.listFiles().findAll { it.name.endsWith('.jar') }.collect { it.name }.sort() != releaseNames.sort(false)) { + throw new GradleException('The release directory must contain exactly the three current jars') + } + releaseNames.each { name -> + File file = new File(directory, name) + if (!file.isFile() || file.length() == 0) throw new GradleException("Missing ${name}") + new ZipFile(file).withCloseable { zip -> + zip.entries().each { entry -> + String path = entry.name.toLowerCase(Locale.ROOT) + if (path.contains('agent-notes') || path.contains('agents.md') || path.contains('.codex') + || path.startsWith('tools/') || path.startsWith('reference/') || path.contains('/testmod/') + || path.startsWith('com/mcmoddev/lib/') || path.startsWith('zone/moddev/mc/mmdlib/') + || path.startsWith('zone/moddev/mc/basemetals/') || path.startsWith('com/mcmoddev/orespawn/') + || path.startsWith('net/minecraft/') || path.startsWith('org/junit/')) { + throw new GradleException("Non-production entry in ${name}: ${entry.name}") + } + if (entry.name.endsWith('.class')) { + byte[] bytes = zip.getInputStream(entry).bytes + int major = ((bytes[6] & 255) << 8) | (bytes[7] & 255) + if (major != 52) throw new GradleException("Non-Java-8 class: ${entry.name}") + } + } + if (name == releaseNames[0]) { + def manifest = new Manifest(zip.getInputStream(zip.getEntry('META-INF/MANIFEST.MF'))).mainAttributes + if (manifest.getValue('Maven-Artifact') != "${expectedGroup}:${archiveName}:${project.version}") { + throw new GradleException('Wrong release manifest') + } + String metadata = zip.getInputStream(zip.getEntry('META-INF/mods.toml')).getText('UTF-8') + if (metadata.contains('${') || !metadata.contains('modId="' + modId + '"') + || !metadata.contains('version="' + project.version + '"') + || !metadata.contains('versionRange="[1.13.2]"') + || !metadata.contains('versionRange="[4.1.7.113021,5.0.0)"')) { + throw new GradleException('Wrong or unresolved release mod metadata') + } + } + } + } +} + +tasks.register('verify113ReleaseArtifacts') { + group = 'verification' + dependsOn tasks.named('assemble'), tasks.named('check') + doLast { audit(layout.buildDirectory.dir('libs').get().asFile) } +} +tasks.register('write113ReleaseChecksums') { + group = 'verification' + dependsOn tasks.named('verify113ReleaseArtifacts') + doLast { + File output = layout.buildDirectory.file('release/SHA256SUMS').get().asFile + output.parentFile.mkdirs() + output.setText(releaseNames.sort(false).collect { name -> + sha256(layout.buildDirectory.file('libs/' + name).get().asFile) + ' ' + name + }.join('\n') + '\n', 'UTF-8') + } +} +tasks.register('verify113PreparedReleaseArtifacts') { + group = 'verification' + doLast { + if (!preparedDirectory.isPresent()) throw new GradleException('preparedReleaseDir is required') + File directory = file(preparedDirectory.get()) + if (directory.listFiles().collect { it.name }.sort() != (releaseNames + ['SHA256SUMS', 'CHANGELOG.txt']).sort(false)) { + throw new GradleException('Unexpected prepared bundle contents') + } + audit(directory) + Map checksums = [:] + new File(directory, 'SHA256SUMS').readLines('UTF-8').each { line -> + def match = line =~ /^([0-9a-f]{64}) (.+)$/ + if (!match.matches()) throw new GradleException('Invalid prepared checksum entry') + if (checksums.containsKey(match[0][2])) throw new GradleException('Duplicate prepared checksum entry') + checksums[match[0][2]] = match[0][1] + } + if (checksums.keySet().sort() != releaseNames.sort(false)) throw new GradleException('Wrong prepared jar inventory') + checksums.each { name, hash -> + if (sha256(new File(directory, name)) != hash) throw new GradleException("Checksum mismatch: ${name}") + } + if (!new File(directory, 'CHANGELOG.txt').readLines('UTF-8')[0].contains(project.version.toString())) { + throw new GradleException('Prepared changelog belongs to another release') + } + } +} + +publishing { + publications { + mavenJava(MavenPublication) { + groupId = expectedGroup + artifactId = archiveName + version = project.version.toString() + setArtifacts([]) + if (preparedDirectory.isPresent()) { + artifact new File(preparedDirectory.get(), releaseNames[0]) + artifact(new File(preparedDirectory.get(), releaseNames[1])) { classifier = 'sources' } + artifact(new File(preparedDirectory.get(), releaseNames[2])) { classifier = 'javadoc' } + } else { + artifact playerJar + artifact tasks.named('sourcesJar') + artifact tasks.named('javadocJar') + } + pom { + name = 'Base Minerals' + description = 'Base Minerals for Minecraft 1.13.2, using Forge 25 and OreSpawn 4.' + url = 'https://github.com/MinecraftModDevelopmentMods/BaseMinerals' + licenses { + license { + name = 'GNU Lesser General Public License, Version 2.1' + url = 'https://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt' + } + } + } + pom.withXml { + def dependency = asNode().appendNode('dependencies').appendNode('dependency') + dependency.appendNode('groupId', 'zone.moddev.mc.basemetals') + dependency.appendNode('artifactId', 'BaseMetals') + dependency.appendNode('version', '3.0.3.113021') + dependency.appendNode('optional', 'true') + } + } + } + repositories { + maven { + name = 'release' + url = uri(providers.environmentVariable('MAVEN_UPLOAD_URL').getOrElse('https://invalid.invalid/missing-upload-url')) + credentials { + username = providers.environmentVariable('MAVEN_UPLOAD_USERNAME').getOrElse('') + password = providers.environmentVariable('MAVEN_UPLOAD_PASSWORD').getOrElse('') + } + } + } +} +tasks.register('verify113MavenCoordinates') { + dependsOn 'generatePomFileForMavenJavaPublication' + doLast { + def pom = new XmlSlurper(false, false).parse(layout.buildDirectory.file('publications/mavenJava/pom-default.xml').get().asFile) + if ([pom.groupId.text(), pom.artifactId.text(), pom.version.text()] != [expectedGroup, archiveName, project.version.toString()]) { + throw new GradleException('Wrong Maven publication coordinates') + } + } +} +tasks.withType(PublishToMavenRepository).configureEach { + dependsOn 'verify113MavenCoordinates' + dependsOn preparedDirectory.isPresent() ? 'verify113PreparedReleaseArtifacts' : 'verify113ReleaseArtifacts' + doFirst { + def url = providers.environmentVariable('MAVEN_UPLOAD_URL').getOrElse('') + if (!url.startsWith('https://') || url.startsWith('https://invalid.invalid') + || !providers.environmentVariable('MAVEN_UPLOAD_USERNAME').getOrElse('').trim() + || !providers.environmentVariable('MAVEN_UPLOAD_PASSWORD').getOrElse('').trim()) { + throw new GradleException('Configure the HTTPS Maven upload URL, username and password') + } + } +} diff --git a/gradle/stage-legacy-dependencies.py b/gradle/stage-legacy-dependencies.py index e7eb67d..5db851e 100644 --- a/gradle/stage-legacy-dependencies.py +++ b/gradle/stage-legacy-dependencies.py @@ -9,18 +9,9 @@ from pathlib import Path -LEGACYDEV_VERSION = "0.2.3.1" -LEGACYDEV_SHA256 = "5A906209C2DC429DCCD9AA4B208100D4E2E07A6B9FA1D8A48D436236F4F02642" -FORGE_RELEASES = ( - "https://maven.minecraftforge.net/releases", - "https://maven.minecraftforge.net", - "https://maven.creeperhost.net", -) - - -def download(relative, repositories): +def download(relative, repositories, download_url=None): for repository in repositories: - url = repository.rstrip("/") + "/" + relative.as_posix() + url = download_url or repository.rstrip("/") + "/" + relative.as_posix() request = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) for attempt in range(3): try: @@ -35,36 +26,6 @@ def download(relative, repositories): raise last_error -def stage_legacydev(destination, cache): - module = Path("net/minecraftforge/legacydev") - relative = module / LEGACYDEV_VERSION / f"legacydev-{LEGACYDEV_VERSION}-fatjar.jar" - target = destination / relative - cached = cache / "caches/minecraftforge/forgegradle/mavenizer/caches/maven/forge" / relative if cache else None - if target.is_file(): - data = target.read_bytes() - elif cached and cached.is_file(): - data = cached.read_bytes() - else: - data = download(relative, FORGE_RELEASES) - if hashlib.sha256(data).hexdigest().upper() != LEGACYDEV_SHA256: - raise ValueError(f"Checksum mismatch for LegacyDev {LEGACYDEV_VERSION}") - target.parent.mkdir(parents=True, exist_ok=True) - target.write_bytes(data) - target.with_suffix(".jar.sha1").write_text(hashlib.sha1(data).hexdigest(), encoding="ascii") - # Mavenizer follows the legacy userdev version range. Offer only the tested build. - (destination / module / "maven-metadata.xml").write_text(f""" - net.minecraftforge - legacydev - - {LEGACYDEV_VERSION} - {LEGACYDEV_VERSION} - {LEGACYDEV_VERSION} - - -""", encoding="utf-8") - print("legacydev", LEGACYDEV_SHA256, flush=True) - - def main(): parser = argparse.ArgumentParser() parser.add_argument("destination", type=Path) @@ -72,7 +33,7 @@ def main(): args = parser.parse_args() specs = json.loads(Path(__file__).with_name("dependencies.json").read_text(encoding="utf-8")) destination = args.destination.resolve() - stage_legacydev(destination, args.cache) + for spec in specs: group, artifact, version, *classifier = spec["coordinate"].split(":") @@ -86,7 +47,7 @@ def main(): if cached: data = cached[0].read_bytes() else: - data = download(relative, (spec["repository"],)) + data = download(relative, (spec["repository"],), spec.get("download_url")) if hashlib.sha256(data).hexdigest().upper() != spec["sha256"]: raise ValueError(f"Checksum mismatch: {spec['coordinate']}") target.write_bytes(data) diff --git a/logs/debug.log b/logs/debug.log new file mode 100644 index 0000000..e69de29 diff --git a/logs/latest.log b/logs/latest.log new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/mcmoddev/alt/BaseMineralsALT.java b/src/main/java/com/mcmoddev/alt/BaseMineralsALT.java deleted file mode 100644 index d33340f..0000000 --- a/src/main/java/com/mcmoddev/alt/BaseMineralsALT.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.mcmoddev.alt; - -import com.mcmoddev.alt.api.IALTPlugin; - -//@ALTPlugin(modid = BaseMinerals.MODID) -public class BaseMineralsALT implements IALTPlugin { - // Intentionally left blank -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/BaseMinerals.java b/src/main/java/zone/moddev/mc/baseminerals/BaseMinerals.java index cc71861..ec1ec95 100644 --- a/src/main/java/zone/moddev/mc/baseminerals/BaseMinerals.java +++ b/src/main/java/zone/moddev/mc/baseminerals/BaseMinerals.java @@ -1,91 +1,32 @@ package zone.moddev.mc.baseminerals; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import zone.moddev.mc.baseminerals.util.BMiConfig; -import zone.moddev.mc.baseminerals.proxy.CommonProxy; -import com.mcmoddev.lib.data.SharedStrings; - -import net.minecraftforge.common.MinecraftForge; +import net.minecraft.item.crafting.RecipeSerializers; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.DeferredWorkQueue; +import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.Mod.EventHandler; -import net.minecraftforge.fml.common.Mod.Instance; -import net.minecraftforge.fml.common.SidedProxy; -import net.minecraftforge.fml.common.event.FMLConstructionEvent; -import net.minecraftforge.fml.common.event.FMLFingerprintViolationEvent; -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; - -/** - * This is the entry point for this Mod. - * - * @author Jasmine Iwanek - * - */ -@Mod( - modid = BaseMinerals.MODID, - name = BaseMinerals.NAME, - version = BaseMinerals.VERSION, - dependencies = "required-after:forge@[14.23.5.2859,);required-after:mmdlib@[1.0.0-rc2,2.0.0);required-after:orespawn@[4.1.6.112021,5.0.0);after:basemetals;after:tconstruct;after:enderio;before:appliedenergistics2;before:buildingbricks", - acceptedMinecraftVersions = "[1.12.2]", - guiFactory = "zone.moddev.mc.baseminerals.client.BaseMineralsGuiFactory", - updateJSON = BaseMinerals.UPDATEJSON) -public class BaseMinerals { - - @Instance - public static BaseMinerals instance; - - /** ID of this Mod */ - public static final String MODID = "baseminerals"; - - /** Display name of this Mod */ - protected static final String NAME = "Base Minerals"; - - /** - * Version number, in Major.Minor.Build format. The minor number is - * 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.112021"; - - protected static final String UPDATEJSON = SharedStrings.UPDATE_JSON_URL + "BaseMinerals/master-1.12/update.json"; - - private static final String PROXY_BASE = "zone.moddev.mc.baseminerals.proxy."; - - @SidedProxy(clientSide = PROXY_BASE + SharedStrings.CLIENTPROXY, serverSide = PROXY_BASE - + SharedStrings.SERVERPROXY) - public static CommonProxy proxy; - - public static final Logger logger = LogManager.getFormatterLogger(BaseMinerals.MODID); - - @EventHandler - public void onFingerprintViolation(FMLFingerprintViolationEvent event) { - logger.warn(SharedStrings.INVALID_FINGERPRINT); - } - - @EventHandler - public static void constructing(FMLConstructionEvent event) { - BMiConfig.init(); - } - - @EventHandler - public static void preInit(FMLPreInitializationEvent event) { - proxy.preInit(event); - - MinecraftForge.EVENT_BUS.register(zone.moddev.mc.baseminerals.init.Items.class); - MinecraftForge.EVENT_BUS.register(zone.moddev.mc.baseminerals.init.Blocks.class); - } - - @EventHandler - public static void init(FMLInitializationEvent event) { - proxy.init(event); - } - - @EventHandler - public static void postInit(FMLPostInitializationEvent event) { - proxy.postInit(event); - } - +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import zone.moddev.mc.baseminerals.client.MineralFluidRenderer; +import zone.moddev.mc.baseminerals.recipe.SharedCrushingSerializer; +import zone.moddev.mc.baseminerals.worldgen.BaseMineralsWorldgenProvider; + +@Mod(BaseMinerals.MOD_ID) +public final class BaseMinerals { + public static final String MOD_ID = "baseminerals"; + + public BaseMinerals() { + DistExecutor.runWhenOn(Dist.CLIENT, () -> MineralFluidRenderer::register); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::enqueueProvider); + } + + private void setup(FMLCommonSetupEvent event) { + DeferredWorkQueue.runLater(() -> RecipeSerializers.register(new SharedCrushingSerializer())); + } + + private void enqueueProvider(InterModEnqueueEvent event) { + BaseMineralsWorldgenProvider.enqueue(); + } } diff --git a/src/main/java/zone/moddev/mc/baseminerals/block/OverlayOreBlock.java b/src/main/java/zone/moddev/mc/baseminerals/block/OverlayOreBlock.java deleted file mode 100644 index b77b9a7..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/block/OverlayOreBlock.java +++ /dev/null @@ -1,20 +0,0 @@ -package zone.moddev.mc.baseminerals.block; - -import com.mcmoddev.lib.block.BlockMMDOre; -import com.mcmoddev.lib.material.MMDMaterial; -import net.minecraft.util.BlockRenderLayer; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -/** Uses the shared ore behaviour with alpha testing for overlay models. */ -public final class OverlayOreBlock extends BlockMMDOre { - public OverlayOreBlock(MMDMaterial material) { - super(material); - } - - @Override - @SideOnly(Side.CLIENT) - public BlockRenderLayer getRenderLayer() { - return BlockRenderLayer.CUTOUT_MIPPED; - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/client/BaseMineralsConfigScreen.java b/src/main/java/zone/moddev/mc/baseminerals/client/BaseMineralsConfigScreen.java deleted file mode 100644 index e8dadcd..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/client/BaseMineralsConfigScreen.java +++ /dev/null @@ -1,30 +0,0 @@ -package zone.moddev.mc.baseminerals.client; - -import java.util.ArrayList; -import java.util.List; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.resources.I18n; -import net.minecraftforge.common.config.ConfigElement; -import net.minecraftforge.fml.client.config.GuiConfig; -import net.minecraftforge.fml.client.config.IConfigElement; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; -import zone.moddev.mc.baseminerals.BaseMinerals; -import zone.moddev.mc.baseminerals.util.BMiConfig; - -/** One parent-aware screen for Forge's mod list and OreSpawn's child-mod list. */ -@SideOnly(Side.CLIENT) -public final class BaseMineralsConfigScreen extends GuiConfig { - public BaseMineralsConfigScreen(final GuiScreen parent) { - super(parent, elements(), - BaseMinerals.MODID, false, true, I18n.format("config.baseminerals.title"), - I18n.format("config.baseminerals.description")); - } - private static List elements() { - final List elements = new ArrayList<>( - new ConfigElement(BMiConfig.getConfiguration().getCategory(BMiConfig.MATERIALS)).getChildElements()); - elements.addAll(new ConfigElement(BMiConfig.getConfiguration().getCategory(BMiConfig.FLUIDS)).getChildElements()); - elements.addAll(new ConfigElement(BMiConfig.getConfiguration().getCategory(BMiConfig.VANILLA)).getChildElements()); - return elements; - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/client/BaseMineralsGuiFactory.java b/src/main/java/zone/moddev/mc/baseminerals/client/BaseMineralsGuiFactory.java deleted file mode 100644 index 2f0045c..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/client/BaseMineralsGuiFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package zone.moddev.mc.baseminerals.client; - -import java.util.Collections; -import java.util.Set; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiScreen; -import net.minecraftforge.fml.client.IModGuiFactory; -import net.minecraftforge.fml.relauncher.Side; -import net.minecraftforge.fml.relauncher.SideOnly; - -/** Forge 1.12's configuration factory; never loaded by a dedicated server. */ -@SideOnly(Side.CLIENT) -public final class BaseMineralsGuiFactory implements IModGuiFactory { - @Override public void initialize(final Minecraft minecraft) { } - @Override public boolean hasConfigGui() { return true; } - @Override public GuiScreen createConfigGui(final GuiScreen parent) { return new BaseMineralsConfigScreen(parent); } - @Override public Set runtimeGuiCategories() { return Collections.emptySet(); } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/client/MineralFluidRenderer.java b/src/main/java/zone/moddev/mc/baseminerals/client/MineralFluidRenderer.java new file mode 100644 index 0000000..6d8264d --- /dev/null +++ b/src/main/java/zone/moddev/mc/baseminerals/client/MineralFluidRenderer.java @@ -0,0 +1,54 @@ +package zone.moddev.mc.baseminerals.client; + +import zone.moddev.mc.baseminerals.BaseMinerals; +import zone.moddev.mc.baseminerals.content.MineralContent; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.fluid.IFluidState; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.client.event.TextureStitchEvent; +import net.minecraftforge.common.MinecraftForge; + +/** Adds the fluid textures and colours that Forge 25 doesn't render on its own. */ +@OnlyIn(Dist.CLIENT) +public final class MineralFluidRenderer { + private static final ResourceLocation STILL = new ResourceLocation(BaseMinerals.MOD_ID, "blocks/molten_metal_still"); + private static final ResourceLocation FLOW = new ResourceLocation(BaseMinerals.MOD_ID, "blocks/molten_metal_flow"); + private static volatile TextureAtlasSprite[] sprites; + + private MineralFluidRenderer() {} + + public static void register() { + MinecraftForge.EVENT_BUS.addListener(MineralFluidRenderer::onTexturePre); + MinecraftForge.EVENT_BUS.addListener(MineralFluidRenderer::onTexturePost); + } + + private static void onTexturePre(TextureStitchEvent.Pre event) { + event.getMap().registerSprite(Minecraft.getInstance().getResourceManager(), STILL); + event.getMap().registerSprite(Minecraft.getInstance().getResourceManager(), FLOW); + } + + private static void onTexturePost(TextureStitchEvent.Post event) { + sprites = new TextureAtlasSprite[] { event.getMap().getSprite(STILL), event.getMap().getSprite(FLOW) }; + } + + public static boolean useOpaqueFluidPath(IFluidState state, boolean vanillaValue) { + return isOurs(state) || vanillaValue; + } + + public static TextureAtlasSprite[] overrideSprites(IFluidState state, TextureAtlasSprite[] vanillaSprites) { + TextureAtlasSprite[] current = sprites; + return isOurs(state) && current != null ? current : vanillaSprites; + } + + public static int overrideColor(IFluidState state, int vanillaColor) { + return isOurs(state) ? 0xC5C8C1 : vanillaColor; + } + + private static boolean isOurs(IFluidState state) { + return state != null && MineralContent.ownsFluid(state.getFluid()); + } +} diff --git a/src/main/java/zone/moddev/mc/baseminerals/compat/BaseMineralsLoadingPlugin.java b/src/main/java/zone/moddev/mc/baseminerals/compat/BaseMineralsLoadingPlugin.java deleted file mode 100644 index 8249f6e..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/compat/BaseMineralsLoadingPlugin.java +++ /dev/null @@ -1,19 +0,0 @@ -package zone.moddev.mc.baseminerals.compat; - -import java.util.Map; -import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; - -/** Relinks add-on class names and leaves MMDLib's shared API in its own jar. */ -@IFMLLoadingPlugin.Name("BaseMinerals") -@IFMLLoadingPlugin.MCVersion("1.12.2") -@IFMLLoadingPlugin.SortingIndex(1002) -@IFMLLoadingPlugin.TransformerExclusions("zone.moddev.mc.baseminerals.compat.") -public final class BaseMineralsLoadingPlugin implements IFMLLoadingPlugin { - @Override public String[] getASMTransformerClass() { - return new String[] { "zone.moddev.mc.baseminerals.compat.LegacyNamespaceTransformer" }; - } - @Override public String getModContainerClass() { return null; } - @Override public String getSetupClass() { return null; } - @Override public void injectData(final Map data) { } - @Override public String getAccessTransformerClass() { return null; } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/compat/LegacyNamespaceTransformer.java b/src/main/java/zone/moddev/mc/baseminerals/compat/LegacyNamespaceTransformer.java deleted file mode 100644 index 848c833..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/compat/LegacyNamespaceTransformer.java +++ /dev/null @@ -1,89 +0,0 @@ -package zone.moddev.mc.baseminerals.compat; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import net.minecraft.launchwrapper.IClassTransformer; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.commons.Remapper; -import org.objectweb.asm.commons.RemappingClassAdapter; - -/** Relinks existing MMD add-ons to the same classes and registries as Base Minerals. */ -public final class LegacyNamespaceTransformer implements IClassTransformer { - - private static final String OLD = "com/mcmoddev/baseminerals/"; - private static final String CURRENT = "zone/moddev/mc/baseminerals/"; - private static final Set EXPORTS = loadExports(); - - @Override - public byte[] transform(final String name, final String transformedName, final byte[] bytes) { - if (bytes == null || name == null || name.startsWith("zone.moddev.mc.baseminerals.") - || !(contains(bytes, OLD) || contains(bytes, OLD.replace('/', '.')))) { - return bytes; - } - - final ClassWriter output = new ClassWriter(0); - final Remapper names = new Remapper() { - @Override - public String map(final String internalName) { - return currentName(internalName); - } - - @Override - public Object mapValue(final Object value) { - if (value instanceof String) { - final String text = (String) value; - final String internal = text.replace('.', '/'); - final String mapped = currentName(internal); - if (mapped.equals(internal)) return value; - return text.indexOf('/') < 0 ? mapped.replace('/', '.') : mapped; - } - return super.mapValue(value); - } - }; - - new ClassReader(bytes).accept(new RemappingClassAdapter(output, names), 0); - return output.toByteArray(); - } - - private static String currentName(final String name) { - if (!name.startsWith(OLD)) return name; - - final String suffix = name.substring(OLD.length()); - final int nested = suffix.indexOf('$'); - final String owner = nested < 0 ? suffix : suffix.substring(0, nested); - return EXPORTS.contains(owner) ? CURRENT + suffix : name; - } - - private static Set loadExports() { - final Set result = new HashSet<>(); - final InputStream stream = LegacyNamespaceTransformer.class.getClassLoader() - .getResourceAsStream("META-INF/baseminerals-legacy-api.list"); - if (stream == null) throw new IllegalStateException("Missing Base Minerals API name list"); - - try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { - String line; - while ((line = reader.readLine()) != null) { - if (!line.isEmpty() && !line.startsWith("#")) result.add(line); - } - } catch (final IOException failure) { - throw new IllegalStateException("Cannot read Base Minerals API names", failure); - } - return Collections.unmodifiableSet(result); - } - - private static boolean contains(final byte[] bytes, final String text) { - for (int offset = 0; offset <= bytes.length - text.length(); offset++) { - int index = 0; - while (index < text.length() && bytes[offset + index] == text.charAt(index)) index++; - if (index == text.length()) return true; - } - return false; - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/content/MineralContent.java b/src/main/java/zone/moddev/mc/baseminerals/content/MineralContent.java new file mode 100644 index 0000000..f9aceac --- /dev/null +++ b/src/main/java/zone/moddev/mc/baseminerals/content/MineralContent.java @@ -0,0 +1,125 @@ +package zone.moddev.mc.baseminerals.content; + +import java.util.LinkedHashMap; +import java.util.Map; +import net.minecraft.block.Block; +import net.minecraft.block.BlockFlowingFluid; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.fluid.FlowingFluid; +import net.minecraft.fluid.Fluid; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemBucket; +import net.minecraft.item.ItemGroup; +import net.minecraft.item.ItemStack; +import net.minecraft.init.Items; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.registry.IRegistry; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.ToolType; +import net.minecraftforge.event.RegistryEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import zone.moddev.mc.baseminerals.BaseMinerals; + +/** Registry names are kept from the 1.10–1.12 builds. */ +@Mod.EventBusSubscriber(modid = BaseMinerals.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) +public final class MineralContent { + private static final String[] MATERIALS = { + "lithium", "niter", "phosphorus", "potash", "salt", "saltpeter", "silicon", "sulfur" + }; + private static final Map BLOCKS = new LinkedHashMap<>(); + private static final Map MOLTEN = new LinkedHashMap<>(); + private static final ItemGroup GROUP = new ItemGroup(BaseMinerals.MOD_ID) { + @Override public ItemStack createIcon() { return new ItemStack(BLOCKS.get("sulfur_ore")); } + }; + + private MineralContent() {} + + // Vanilla's fluid registries are shared, so use Forge's sequential block event. + private static void initializeFluids() { + for (String name : new String[] {"lithium", "silicon"}) { + Molten molten = new Molten(); + MOLTEN.put(name, molten); + molten.flowing = new MoltenMineralFluid.Flowing(molten); + molten.source = new MoltenMineralFluid.Source(molten); + IRegistry.field_212619_h.put(id("flowing_" + name), molten.flowing); + IRegistry.field_212619_h.put(id(name), molten.source); + for (Fluid fluid : new Fluid[] {molten.flowing, molten.source}) { + fluid.getStateContainer().getValidStates().forEach(Fluid.STATE_REGISTRY::add); + } + } + } + + @SubscribeEvent + public static void registerBlocks(RegistryEvent.Register event) { + initializeFluids(); + for (String name : MATERIALS) { + putBlock(event, name + "_block", new MineralBlock(false)); + if (!"silicon".equals(name)) putBlock(event, name + "_ore", new MineralBlock(true)); + } + MOLTEN.forEach((name, molten) -> { + molten.block = new BlockFlowingFluid(molten.source, Block.Properties.create(Material.LAVA) + .doesNotBlockMovement().hardnessAndResistance(100.0F).variableOpacity()) {}; + putBlock(event, name, molten.block); + }); + } + + private static void putBlock(RegistryEvent.Register event, String name, Block block) { + block.setRegistryName(id(name)); + BLOCKS.put(name, block); + event.getRegistry().register(block); + } + + @SubscribeEvent + public static void registerItems(RegistryEvent.Register event) { + BLOCKS.forEach((name, block) -> putItem(event, name, new ItemBlock(block, + MOLTEN.containsKey(name) ? new Item.Properties() : itemProperties()))); + for (String name : MATERIALS) { + putItem(event, name + "_powder", new Item(itemProperties())); + putItem(event, name + "_smallpowder", new Item(itemProperties())); + } + MOLTEN.forEach((name, molten) -> { + putItem(event, name + "_ingot", new Item(itemProperties())); + putItem(event, name + "_nugget", new Item(itemProperties())); + molten.bucket = new ItemBucket(molten.source, itemProperties().containerItem(Items.BUCKET).maxStackSize(1)); + putItem(event, name + "_bucket", molten.bucket); + }); + putItem(event, "silicon_blend", new Item(itemProperties())); + putItem(event, "silicon_smallblend", new Item(itemProperties())); + } + + private static void putItem(RegistryEvent.Register event, String name, Item item) { + event.getRegistry().register(item.setRegistryName(id(name))); + } + + private static Item.Properties itemProperties() { return new Item.Properties().group(GROUP); } + public static ResourceLocation id(String name) { return new ResourceLocation(BaseMinerals.MOD_ID, name); } + public static boolean ownsFluid(Fluid fluid) { return fluid instanceof MoltenMineralFluid; } + + static final class Molten { + FlowingFluid source; + FlowingFluid flowing; + BlockFlowingFluid block; + Item bucket; + } + + private static final class MineralBlock extends Block { + private final boolean ore; + + MineralBlock(boolean ore) { + super(Block.Properties.create(Material.ROCK).hardnessAndResistance(3.0F, 5.0F)); + this.ore = ore; + } + + @Override public ToolType getHarvestTool(IBlockState state) { return ToolType.PICKAXE; } + @Override public int getHarvestLevel(IBlockState state) { return 1; } + @Override @OnlyIn(Dist.CLIENT) + public BlockRenderLayer getRenderLayer() { + return ore ? BlockRenderLayer.CUTOUT_MIPPED : BlockRenderLayer.SOLID; + } + } +} diff --git a/src/main/java/zone/moddev/mc/baseminerals/content/MoltenMineralFluid.java b/src/main/java/zone/moddev/mc/baseminerals/content/MoltenMineralFluid.java new file mode 100644 index 0000000..9f61048 --- /dev/null +++ b/src/main/java/zone/moddev/mc/baseminerals/content/MoltenMineralFluid.java @@ -0,0 +1,67 @@ +package zone.moddev.mc.baseminerals.content; + +import net.minecraft.block.BlockFlowingFluid; +import net.minecraft.block.state.IBlockState; +import net.minecraft.fluid.FlowingFluid; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.IFluidState; +import net.minecraft.item.Item; +import net.minecraft.state.StateContainer; +import net.minecraft.util.BlockRenderLayer; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; +import net.minecraft.world.IWorldReaderBase; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +/** Common flow behaviour for the molten metals. */ +public abstract class MoltenMineralFluid extends FlowingFluid { + private final MineralContent.Molten content; + + protected MoltenMineralFluid(MineralContent.Molten content) { + this.content = content; + } + + + @Override public Fluid getFlowingFluid() { return content.flowing; } + @Override public Fluid getStillFluid() { return content.source; } + @Override public Item getFilledBucket() { return content.bucket; } + + @Override @OnlyIn(Dist.CLIENT) + public BlockRenderLayer getRenderLayer() { return BlockRenderLayer.TRANSLUCENT; } + @Override protected boolean canSourcesMultiply() { return false; } + @Override protected void beforeReplacingBlock(IWorld world, BlockPos pos, IBlockState state) { + state.dropBlockAsItem(world.getWorld(), pos, 0); + } + @Override public int getSlopeFindDistance(IWorldReaderBase world) { return 2; } + @Override public int getLevelDecreasePerBlock(IWorldReaderBase world) { return 2; } + @Override public int getTickRate(IWorldReaderBase world) { return 30; } + @Override protected float getExplosionResistance() { return 100.0F; } + @Override public boolean isEquivalentTo(Fluid fluid) { + return fluid == content.source || fluid == content.flowing; + } + @Override protected boolean canOtherFlowInto(IFluidState state, Fluid fluid, EnumFacing direction) { + return direction == EnumFacing.DOWN && !fluid.isEquivalentTo(this); + } + @Override public IBlockState getBlockState(IFluidState state) { + return content.block.getDefaultState() + .with(BlockFlowingFluid.LEVEL, Integer.valueOf(getLevelFromState(state))); + } + + public static final class Flowing extends MoltenMineralFluid { + public Flowing(MineralContent.Molten content) { super(content); } + @Override protected void fillStateContainer(StateContainer.Builder builder) { + super.fillStateContainer(builder); + builder.add(LEVEL_1_TO_8); + } + @Override public int getLevel(IFluidState state) { return state.get(LEVEL_1_TO_8); } + @Override public boolean isSource(IFluidState state) { return false; } + } + + public static final class Source extends MoltenMineralFluid { + public Source(MineralContent.Molten content) { super(content); } + @Override public int getLevel(IFluidState state) { return 8; } + @Override public boolean isSource(IFluidState state) { return true; } + } +} diff --git a/src/main/java/zone/moddev/mc/baseminerals/data/MaterialNames.java b/src/main/java/zone/moddev/mc/baseminerals/data/MaterialNames.java deleted file mode 100644 index 4f3d6c4..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/data/MaterialNames.java +++ /dev/null @@ -1,20 +0,0 @@ -package zone.moddev.mc.baseminerals.data; - -import com.mcmoddev.lib.data.SharedStrings; - -public final class MaterialNames { - - public static final String SULFUR = "sulfur"; - public static final String SILICON = "silicon"; - public static final String SALTPETER = "saltpeter"; - public static final String SALT = "salt"; - public static final String POTASH = "potash"; - public static final String NITER = "niter"; - public static final String PHOSPHORUS = "phosphorus"; - public static final String LITHIUM = "lithium"; - public static final String CHARCOAL = "charcoal"; // Vanilla - - private MaterialNames() { - throw new IllegalAccessError(SharedStrings.NOT_INSTANTIABLE); - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/init/Blocks.java b/src/main/java/zone/moddev/mc/baseminerals/init/Blocks.java deleted file mode 100644 index 66546ca..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/init/Blocks.java +++ /dev/null @@ -1,63 +0,0 @@ -package zone.moddev.mc.baseminerals.init; - -import java.util.Arrays; -import java.util.List; - -import zone.moddev.mc.baseminerals.BaseMinerals; -import zone.moddev.mc.baseminerals.data.MaterialNames; -import zone.moddev.mc.baseminerals.block.OverlayOreBlock; -import com.mcmoddev.lib.util.Oredicts; -import com.mcmoddev.lib.data.Names; -import com.mcmoddev.lib.data.SharedStrings; -import com.mcmoddev.lib.material.MMDMaterial; - -import net.minecraft.block.Block; -import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -/** - * This class initializes all blocks in Base Minerals. - * - * @author Jasmine Iwanek - * - */ -public class Blocks extends com.mcmoddev.lib.init.Blocks { - - protected Blocks() { - throw new IllegalAccessError(SharedStrings.NOT_INSTANTIABLE); - } - - /** - * - */ - public static void init() { - final List materials = Arrays.asList(MaterialNames.LITHIUM, MaterialNames.NITER, - MaterialNames.PHOSPHORUS, MaterialNames.POTASH, MaterialNames.SALT, MaterialNames.SALTPETER, - MaterialNames.SILICON, MaterialNames.SULFUR); - - materials.stream().filter(Materials::hasMaterial) - .filter(materialName -> !Materials.getMaterialByName(materialName).isEmpty()) - .forEach(materialName -> { - final MMDMaterial material = Materials.getMaterialByName(materialName); - - create(Names.BLOCK, material); - if (material.hasOre() && !material.hasBlock(Names.ORE) && isNameEnabled(Names.ORE)) { - final Block ore = addBlock(new OverlayOreBlock(material), Names.ORE, material, - ItemGroups.getTab(BaseMinerals.MODID, SharedStrings.TAB_BLOCKS)); - material.addNewBlock(Names.ORE.toString(), ore); - Oredicts.registerOre("ore" + material.getCapitalizedName(), ore); - } - }); - } - - @SubscribeEvent - public static void registerBlocks(RegistryEvent.Register event) { - for (MMDMaterial material : Materials.getMaterialsByMod(BaseMinerals.MODID)) { - for (Block block : material.getBlocks()) { - if (block.getRegistryName().getNamespace().equals(BaseMinerals.MODID)) { - event.getRegistry().register(block); - } - } - } - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/init/Fluids.java b/src/main/java/zone/moddev/mc/baseminerals/init/Fluids.java deleted file mode 100644 index 97aabc2..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/init/Fluids.java +++ /dev/null @@ -1,36 +0,0 @@ -package zone.moddev.mc.baseminerals.init; - -import java.util.Arrays; -import java.util.List; - -import zone.moddev.mc.baseminerals.data.MaterialNames; -import com.mcmoddev.lib.data.SharedStrings; -import com.mcmoddev.lib.util.Config.Options; - -/** - * This class initializes all fluids in Base Minerals. - * - * @author Jasmine Iwanek - * - */ -public class Fluids extends com.mcmoddev.lib.init.Fluids { - - private Fluids() { - throw new IllegalAccessError(SharedStrings.NOT_INSTANTIABLE); - } - - /** - * - */ - public static void init() { - - final List materials = Arrays.asList(MaterialNames.LITHIUM, MaterialNames.SILICON); - - materials.stream().filter(Materials::hasMaterial) - .filter(materialName -> !Materials.getMaterialByName(materialName).isEmpty()) - .filter(Options::isFluidEnabled).forEach(materialName -> { - addFluid(materialName, 2000, 10000, 330, 10); - addFluidBlock(materialName); - }); - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/init/ItemGroups.java b/src/main/java/zone/moddev/mc/baseminerals/init/ItemGroups.java deleted file mode 100644 index 8d41508..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/init/ItemGroups.java +++ /dev/null @@ -1,41 +0,0 @@ -package zone.moddev.mc.baseminerals.init; - -import com.mcmoddev.lib.init.Materials; -import zone.moddev.mc.baseminerals.BaseMinerals; -import com.mcmoddev.lib.data.Names; -import com.mcmoddev.lib.data.SharedStrings; -import com.mcmoddev.lib.material.MMDMaterial; - -/** - * This class initializes all item groups in Base Minerals. - * - * @author Jasmine Iwanek - * - */ -public class ItemGroups extends com.mcmoddev.lib.init.ItemGroups { - - private ItemGroups() { - throw new IllegalAccessError(SharedStrings.NOT_INSTANTIABLE); - } - - /** - * - */ - public static void init() { - // - } - - public static void setupIcons(String materialName) { - if (Materials.hasMaterial(materialName)) { - final MMDMaterial material = Materials.getMaterialByName(materialName); - - if (material.hasBlock(Names.BLOCK)) { - getTab(BaseMinerals.MODID,SharedStrings.TAB_BLOCKS).setTabIconItem(material.getBlock(Names.BLOCK)); - } - - if (material.hasItem(Names.POWDER)) { - getTab(BaseMinerals.MODID,SharedStrings.TAB_ITEMS).setTabIconItem(material.getItem(Names.POWDER)); - } - } - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/init/Items.java b/src/main/java/zone/moddev/mc/baseminerals/init/Items.java deleted file mode 100644 index cce6694..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/init/Items.java +++ /dev/null @@ -1,87 +0,0 @@ -package zone.moddev.mc.baseminerals.init; - -import java.util.Arrays; -import java.util.List; - - -import zone.moddev.mc.baseminerals.BaseMinerals; -import zone.moddev.mc.baseminerals.data.MaterialNames; -import com.mcmoddev.lib.data.Names; -import com.mcmoddev.lib.data.SharedStrings; -import com.mcmoddev.lib.init.Materials; -import com.mcmoddev.lib.material.MMDMaterial; -import com.mcmoddev.lib.util.Oredicts; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import net.minecraftforge.registries.IForgeRegistry; - -/** - * This class initializes all items in Base Minerals. - * - * @author Jasmine Iwanek - * - */ -public class Items extends com.mcmoddev.lib.init.Items { - - protected Items() { - throw new IllegalAccessError(SharedStrings.NOT_INSTANTIABLE); - } - - /** - * - */ - public static void init() { - final List materials = Arrays.asList(MaterialNames.LITHIUM, MaterialNames.NITER, - MaterialNames.PHOSPHORUS, MaterialNames.POTASH, MaterialNames.SALT, MaterialNames.SALTPETER, - MaterialNames.SILICON, MaterialNames.SULFUR); - - materials.stream().filter(Materials::hasMaterial) - .filter(materialName -> !Materials.getMaterialByName(materialName).isEmpty()) - .forEach(materialName -> { - final MMDMaterial material = Materials.getMaterialByName(materialName); - - create(Names.POWDER, material); - create(Names.SMALLPOWDER, material); - }); - - Arrays.asList(Names.INGOT, Names.NUGGET).stream() - .forEach( name -> - Arrays.asList(MaterialNames.LITHIUM, MaterialNames.SILICON).stream() - .filter(Materials::hasMaterial) - .forEach(material -> create(name, Materials.getMaterialByName(material))) - ); - - if (Materials.hasMaterial(MaterialNames.SILICON)) { - final MMDMaterial silicon = Materials.getMaterialByName(MaterialNames.SILICON); - create(Names.BLEND, silicon); - create(Names.SMALLBLEND, silicon); - } - } - - @SubscribeEvent - public static void registerItems(RegistryEvent.Register event) { - Materials.getMaterialsByMod(BaseMinerals.MODID).stream() - .forEach(mat -> regMyItems(event.getRegistry(), mat)); - - Oredicts.registerItemOreDictionaryEntries(); - Oredicts.registerBlockOreDictionaryEntries(); - } - - private static Item mapFunc(ItemStack itemStack) { - return itemStack.getItem(); - } - - private static boolean filterFunc(Item item) { - return item.getRegistryName().getNamespace().equals(BaseMinerals.MODID); - } - - private static void regMyItems(IForgeRegistry registry, MMDMaterial mat) { - mat.getItems().stream() - .map(Items::mapFunc) - .filter(Items::filterFunc) - .forEach(registry::register); - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/init/MaterialEnabledCondition.java b/src/main/java/zone/moddev/mc/baseminerals/init/MaterialEnabledCondition.java deleted file mode 100644 index 4388c30..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/init/MaterialEnabledCondition.java +++ /dev/null @@ -1,17 +0,0 @@ -package zone.moddev.mc.baseminerals.init; - -import com.google.gson.JsonObject; -import java.util.function.BooleanSupplier; -import net.minecraft.util.JsonUtils; -import net.minecraftforge.common.crafting.IConditionFactory; -import net.minecraftforge.common.crafting.JsonContext; -import zone.moddev.mc.baseminerals.util.BMiConfig; - -/** Uses the add-on's latched switches without changing another mod's materials. */ -public final class MaterialEnabledCondition implements IConditionFactory { - @Override - public BooleanSupplier parse(JsonContext context, JsonObject condition) { - String material = JsonUtils.getString(condition, "material"); - return () -> BMiConfig.isEnabled(material); - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/init/Materials.java b/src/main/java/zone/moddev/mc/baseminerals/init/Materials.java deleted file mode 100644 index 38e52f7..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/init/Materials.java +++ /dev/null @@ -1,134 +0,0 @@ -package zone.moddev.mc.baseminerals.init; - -import java.util.Arrays; -import java.util.List; - -import javax.annotation.Nonnull; - -import zone.moddev.mc.baseminerals.data.MaterialNames; -import com.mcmoddev.lib.data.SharedStrings; -import com.mcmoddev.lib.material.MMDMaterialType.MaterialType; -import com.mcmoddev.lib.util.Config.Options; - -/** - * This class initializes all of the materials in Base Minerals. - * - * @author Jasmine Iwanek - * - */ -public class Materials extends com.mcmoddev.lib.init.Materials { - - protected Materials() { - throw new IllegalAccessError(SharedStrings.NOT_INSTANTIABLE); - } - - /** - * - */ - public static void init() { - - final List materials = Arrays.asList(MaterialNames.LITHIUM, MaterialNames.NITER, - MaterialNames.PHOSPHORUS, MaterialNames.POTASH, MaterialNames.SALT, MaterialNames.SALTPETER, - MaterialNames.SULFUR); - - materials.stream().filter(Options::isMaterialEnabled).forEach(name -> createMaterial(name, getType(name), - getHardness(name), getStrength(name), getMagic(name), getColor(name))); - - if (Options.isMaterialEnabled(MaterialNames.SILICON)) { - final String name = MaterialNames.SILICON; - createAlloyMaterial(name, getType(name), getHardness(name), getStrength(name), getMagic(name), - getColor(name)); - } - } - - private static MaterialType getType(@Nonnull final String name) { - switch (name) { - case MaterialNames.LITHIUM: - case MaterialNames.SILICON: - return MaterialType.METAL; - case MaterialNames.NITER: - case MaterialNames.PHOSPHORUS: - case MaterialNames.POTASH: - case MaterialNames.SALT: - case MaterialNames.SALTPETER: - case MaterialNames.SULFUR: - return MaterialType.MINERAL; - default: - return MaterialType.MINERAL; - } - } - - private static int getColor(@Nonnull final String name) { - switch (name) { - case MaterialNames.LITHIUM: - return 0xFFC5C8C1; - case MaterialNames.NITER: - return 0xFF000000; - case MaterialNames.PHOSPHORUS: - return 0xFF000000; - case MaterialNames.POTASH: - return 0xFF000000; - case MaterialNames.SALT: - return 0xFF000000; - case MaterialNames.SALTPETER: - return 0xFF000000; - case MaterialNames.SILICON: - return 0xFFC5C8C1; - case MaterialNames.SULFUR: - return 0xFF000000; - default: - return 0xFF000000; - } - } - - private static double getMagic(@Nonnull final String name) { - switch (name) { - case MaterialNames.LITHIUM: - case MaterialNames.SILICON: - return 4.5d; - case MaterialNames.NITER: - case MaterialNames.PHOSPHORUS: - case MaterialNames.POTASH: - case MaterialNames.SALT: - case MaterialNames.SALTPETER: - case MaterialNames.SULFUR: - return 0d; - default: - return 1.0d; - } - } - - private static double getStrength(@Nonnull final String name) { - switch (name) { - case MaterialNames.LITHIUM: - case MaterialNames.SILICON: - return 8d; - case MaterialNames.NITER: - case MaterialNames.PHOSPHORUS: - case MaterialNames.POTASH: - case MaterialNames.SALT: - case MaterialNames.SALTPETER: - case MaterialNames.SULFUR: - return 2d; - default: - return 1.0d; - } - } - - private static double getHardness(@Nonnull final String name) { - switch (name) { - case MaterialNames.LITHIUM: - case MaterialNames.SILICON: - return 8d; - case MaterialNames.NITER: - case MaterialNames.PHOSPHORUS: - case MaterialNames.POTASH: - case MaterialNames.SALT: - case MaterialNames.SALTPETER: - case MaterialNames.SULFUR: - return 5d; - default: - return 1.0d; - } - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/init/Recipes.java b/src/main/java/zone/moddev/mc/baseminerals/init/Recipes.java deleted file mode 100644 index 17b60cd..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/init/Recipes.java +++ /dev/null @@ -1,46 +0,0 @@ -package zone.moddev.mc.baseminerals.init; - -import zone.moddev.mc.baseminerals.data.MaterialNames; -import com.mcmoddev.lib.data.Names; -import com.mcmoddev.lib.data.SharedStrings; -import com.mcmoddev.lib.material.MMDMaterial; - -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraftforge.fml.common.registry.GameRegistry; -import net.minecraftforge.oredict.OreDictionary; - -/** - * - * @author Jasmine Iwanek - * - */ -public class Recipes extends com.mcmoddev.lib.init.Recipes { - - private Recipes() { - throw new IllegalAccessError(SharedStrings.NOT_INSTANTIABLE); - } - - /** - * - */ - public static void init() { - initModSpecificRecipes(); - } - - private static void initModSpecificRecipes() { - if (Materials.hasMaterial(MaterialNames.SILICON)) { - - final MMDMaterial silicon = Materials.getMaterialByName(MaterialNames.SILICON); - if (silicon.hasItem(Names.INGOT)) { - OreDictionary.registerOre("itemSilicon", silicon.getItem(Names.INGOT)); - if (silicon.hasItem(Names.POWDER)) { - ItemStack powder = silicon.getItemStack(Names.POWDER); - if (FurnaceRecipes.instance().getSmeltingResult(powder).isEmpty()) { - GameRegistry.addSmelting(powder, silicon.getItemStack(Names.INGOT), 0); - } - } - } - } - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/init/VillagerTrades.java b/src/main/java/zone/moddev/mc/baseminerals/init/VillagerTrades.java deleted file mode 100644 index c5eb213..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/init/VillagerTrades.java +++ /dev/null @@ -1,22 +0,0 @@ -package zone.moddev.mc.baseminerals.init; - -import com.mcmoddev.lib.data.SharedStrings; - -/** - * - * @author Jasmine Iwanek - * - */ -public class VillagerTrades extends com.mcmoddev.lib.init.VillagerTrades { - - private VillagerTrades() { - throw new IllegalAccessError(SharedStrings.NOT_INSTANTIABLE); - } - - /** - * - */ - public static void init() { - registerCommonTrades(); - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiDenseOres.java b/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiDenseOres.java deleted file mode 100644 index f368510..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiDenseOres.java +++ /dev/null @@ -1,50 +0,0 @@ -package zone.moddev.mc.baseminerals.integration.plugins; - -import zone.moddev.mc.baseminerals.BaseMinerals; -import zone.moddev.mc.baseminerals.data.MaterialNames; -import com.mcmoddev.lib.util.Config.Options; -import com.mcmoddev.lib.init.Materials; -import com.mcmoddev.lib.integration.IIntegration; -import com.mcmoddev.lib.integration.MMDPlugin; -import com.mcmoddev.lib.util.Oredicts; - -@MMDPlugin(addonId = BaseMinerals.MODID, pluginId = BMiDenseOres.PLUGIN_MODID) -public class BMiDenseOres extends com.mcmoddev.lib.integration.plugins.DenseOres implements IIntegration { - - private static boolean initDone = false; - - @Override - public void init() { - if (initDone || !Options.isModEnabled(BMiDenseOres.PLUGIN_MODID)) { - return; - } - - registerOres(); - - initDone = true; - } - - /** - * Register all ores that are currently known by the materials registry - * - * @author Daniel Hazelton <dshadowwolf@gmail.com> - */ - private static void registerOres() { - final String[] baseNames = new String[] { - MaterialNames.LITHIUM, - MaterialNames.NITER, - MaterialNames.PHOSPHORUS, - MaterialNames.POTASH, - MaterialNames.SALT, - MaterialNames.SALTPETER, - MaterialNames.SULFUR - }; - - for (int i = 0; i < baseNames.length; i++) { - final String materialName = baseNames[i]; - if (Materials.hasMaterial(materialName)) { - registerOre(String.format("%s_%s", materialName, Oredicts.ORE), Oredicts.STONE, 0); - } - } - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiEnderIO.java b/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiEnderIO.java deleted file mode 100644 index 6a60499..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiEnderIO.java +++ /dev/null @@ -1,44 +0,0 @@ -package zone.moddev.mc.baseminerals.integration.plugins; - -import zone.moddev.mc.baseminerals.BaseMinerals; -import zone.moddev.mc.baseminerals.data.MaterialNames; -import com.mcmoddev.lib.integration.MMDPlugin; -import com.mcmoddev.lib.util.Config.Options; -import com.mcmoddev.lib.integration.IIntegration; - -/** - * - * @author Jasmine Iwanek - * - */ -@MMDPlugin(addonId = BaseMinerals.MODID, pluginId = BMiEnderIO.PLUGIN_MODID) -public class BMiEnderIO extends com.mcmoddev.lib.integration.plugins.EnderIO implements IIntegration { - - /** - * - */ - @Override - public void init() { - if (!Options.isModEnabled(PLUGIN_MODID)) { - return; - } - - final String[] baseNames = new String[] { - MaterialNames.LITHIUM, - MaterialNames.NITER, - MaterialNames.PHOSPHORUS, - MaterialNames.POTASH, - MaterialNames.SALT, - MaterialNames.SALTPETER, - // MaterialNames.SILICON, - MaterialNames.SULFUR - }; - - for (int i = 0; i < baseNames.length; i++) { - final String materialName = baseNames[i]; - if (Options.isMaterialEnabled(materialName)) { - addSagMillRecipe(materialName, 3600); - } - } - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiMekanism.java b/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiMekanism.java deleted file mode 100644 index 473b299..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiMekanism.java +++ /dev/null @@ -1,55 +0,0 @@ -package zone.moddev.mc.baseminerals.integration.plugins; - -import java.util.Arrays; - -import javax.annotation.Nonnull; - -import com.mcmoddev.lib.init.Materials; -import zone.moddev.mc.baseminerals.BaseMinerals; -import zone.moddev.mc.baseminerals.data.MaterialNames; -import com.mcmoddev.lib.integration.MMDPlugin; -import com.mcmoddev.lib.material.MMDMaterial; -import com.mcmoddev.lib.util.Config.Options; - -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -import com.mcmoddev.lib.data.Names; -import com.mcmoddev.lib.integration.IIntegration; - -@MMDPlugin(addonId = BaseMinerals.MODID, pluginId = BMiMekanism.PLUGIN_MODID) -public class BMiMekanism extends com.mcmoddev.lib.integration.plugins.Mekanism implements IIntegration { - - @Override - public void init() { - if (!Options.isModEnabled(PLUGIN_MODID)) { - return; - } - MinecraftForge.EVENT_BUS.register(this); - } - - private boolean doesNotHaveMaterial(@Nonnull final String name) { - return !Materials.hasMaterial(name); - } - - @SubscribeEvent - public void regCallback(RegistryEvent.Register event) { - Arrays.asList(MaterialNames.LITHIUM, MaterialNames.NITER, MaterialNames.PHOSPHORUS, - MaterialNames.POTASH, MaterialNames.SALT, MaterialNames.SALTPETER, MaterialNames.SULFUR) - .stream() - .filter(this::doesNotHaveMaterial) - .forEach(this::regMek); - } - - private void regMek(@Nonnull final String name) { - final MMDMaterial mat = Materials.getMaterialByName(name); - final ItemStack ore = mat.getBlockItemStack(Names.ORE); - final ItemStack powder = mat.getItemStack(Names.POWDER, 6); - - if ((!ore.isEmpty()) && (!powder.isEmpty())) - addEnrichmentChamberRecipe(ore, powder); - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiThaumcraft.java b/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiThaumcraft.java deleted file mode 100644 index ff2436b..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiThaumcraft.java +++ /dev/null @@ -1,17 +0,0 @@ -package zone.moddev.mc.baseminerals.integration.plugins; - -import zone.moddev.mc.baseminerals.BaseMinerals; -import com.mcmoddev.lib.integration.MMDPlugin; -import com.mcmoddev.lib.util.Config.Options; -import com.mcmoddev.lib.integration.IIntegration; - -@MMDPlugin(addonId = BaseMinerals.MODID, pluginId = BMiThaumcraft.PLUGIN_MODID) -public class BMiThaumcraft extends com.mcmoddev.lib.integration.plugins.Thaumcraft implements IIntegration { - - @Override - public void init() { - if (!Options.isModEnabled(PLUGIN_MODID)) { - return; - } - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiThermalExpansion.java b/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiThermalExpansion.java deleted file mode 100644 index 56506ec..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiThermalExpansion.java +++ /dev/null @@ -1,55 +0,0 @@ -package zone.moddev.mc.baseminerals.integration.plugins; - -import java.util.Arrays; - -import javax.annotation.Nonnull; - -import zone.moddev.mc.baseminerals.BaseMinerals; -import zone.moddev.mc.baseminerals.data.MaterialNames; -import com.mcmoddev.lib.data.Names; -import com.mcmoddev.lib.init.Materials; -import com.mcmoddev.lib.integration.IIntegration; -import com.mcmoddev.lib.integration.MMDPlugin; -import com.mcmoddev.lib.integration.plugins.ThermalExpansion; -import com.mcmoddev.lib.material.MMDMaterial; -import com.mcmoddev.lib.util.Config.Options; - -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.IRecipe; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -@MMDPlugin(addonId=BaseMinerals.MODID, pluginId=BMiThermalExpansion.PLUGIN_MODID, - versions = BMiThermalExpansion.PLUGIN_MODID+"@(,5.3.12.17];") -public class BMiThermalExpansion extends ThermalExpansion implements IIntegration { - @Override - public void init() { - if (!Options.isModEnabled(PLUGIN_MODID)) { - return; - } - MinecraftForge.EVENT_BUS.register(this); - } - - @SubscribeEvent - public void regShit(RegistryEvent.Register event) { - Arrays.asList(MaterialNames.LITHIUM, MaterialNames.NITER, MaterialNames.PHOSPHORUS, - MaterialNames.POTASH, MaterialNames.SALT, MaterialNames.SALTPETER, MaterialNames.SULFUR) - .stream() - .filter(this::doesNotHaveMaterial) - .forEach(this::regThermal); - } - - private boolean doesNotHaveMaterial(@Nonnull final String name) { - return !Materials.hasMaterial(name); - } - - private void regThermal(@Nonnull final String name) { - final MMDMaterial mat = Materials.getMaterialByName(name); - final ItemStack ore = mat.getBlockItemStack(Names.ORE); - final ItemStack powder = mat.getItemStack(Names.POWDER, 6); - - if ((!ore.isEmpty()) && (!powder.isEmpty())) - addPulverizerRecipe(4000, ore, powder); - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiTinkersConstruct.java b/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiTinkersConstruct.java deleted file mode 100644 index 5d520a2..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/integration/plugins/BMiTinkersConstruct.java +++ /dev/null @@ -1,44 +0,0 @@ -package zone.moddev.mc.baseminerals.integration.plugins; - -import java.util.Arrays; - -import zone.moddev.mc.baseminerals.BaseMinerals; -import zone.moddev.mc.baseminerals.data.MaterialNames; -import zone.moddev.mc.baseminerals.init.Materials; -import com.mcmoddev.lib.integration.MMDPlugin; -import com.mcmoddev.lib.integration.IIntegration; -import com.mcmoddev.lib.material.MMDMaterial; -import com.mcmoddev.lib.util.Config.Options; - -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.fml.common.event.FMLInterModComms; - -/** - * - * @author Jasmine Iwanek - * - */ -@MMDPlugin(addonId = BaseMinerals.MODID, pluginId = BMiTinkersConstruct.PLUGIN_MODID) -public class BMiTinkersConstruct extends com.mcmoddev.lib.integration.plugins.TinkersConstruct implements IIntegration { - - @Override - public void init() { - if (!Options.isModEnabled(PLUGIN_MODID)) { - return; - } - - Arrays.asList(MaterialNames.LITHIUM, MaterialNames.SILICON).forEach(this::doIMC); - } - - private void doIMC(String materialName) { - final MMDMaterial material = Materials.getMaterialByName(materialName); - if(material.isEmpty() || material.getFluid() == null) return; - - // create NBT for the IMC - NBTTagCompound tag = new NBTTagCompound(); - tag.setString("fluid", material.getFluid().getName()); - tag.setString("ore", material.getCapitalizedName()); - tag.setBoolean("toolforge", false); - FMLInterModComms.sendMessage(PLUGIN_MODID, "integrateSmeltery", tag); - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/migration/LegacyWorldUpgrade.java b/src/main/java/zone/moddev/mc/baseminerals/migration/LegacyWorldUpgrade.java new file mode 100644 index 0000000..0bf1924 --- /dev/null +++ b/src/main/java/zone/moddev/mc/baseminerals/migration/LegacyWorldUpgrade.java @@ -0,0 +1,212 @@ +package zone.moddev.mc.baseminerals.migration; + +import com.mojang.datafixers.DSL.TypeReference; +import com.mojang.datafixers.DataFixer; +import com.mojang.datafixers.Dynamic; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import net.minecraft.block.Block; +import net.minecraft.block.BlockFlowingFluid; +import net.minecraft.block.state.IBlockState; +import net.minecraft.nbt.CompressedStreamTools; +import net.minecraft.nbt.INBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTUtil; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.datafix.fixes.BlockStateFlatteningMap; +import net.minecraft.world.chunk.storage.AnvilChunkLoader; +import net.minecraft.world.storage.SaveHandler; +import net.minecraftforge.registries.ForgeRegistries; + +/** Supplies only this world's mineral states during the numeric chunk conversion. */ +public final class LegacyWorldUpgrade { + private static final Logger LOGGER = LogManager.getLogger("baseminerals"); + private static final String SNAPSHOT = "baseminerals-legacy-registry.dat"; + private static final String PRESERVE = "BaseMineralsLegacyPreserveChunk"; + private static final ThreadLocal[]>> ACTIVE = new ThreadLocal<>(); + private static final Map[]>> WORLDS = new ConcurrentHashMap<>(); + private static final Map DISCOVERED = new ConcurrentHashMap<>(); + + private LegacyWorldUpgrade() {} + + public static void prepareWorld(NBTTagCompound root, File file, SaveHandler handler) { + migrateItems(root.getCompound("Data").getCompound("Player")); + if (Boolean.getBoolean("baseminerals.debugUpgrade")) { + LOGGER.info("World read {} active={} dataVersion={} root={}", file, handler != null, + root.getCompound("Data").getInt("DataVersion"), root.keySet()); + } + NBTTagList minerals = mineralIds(root); + if (minerals.isEmpty()) return; + try { + Path directory = file.getCanonicalFile().getParentFile().toPath(); + // Force Upgrade reads WorldInfo without a SaveHandler and can rewrite level.dat + // before the upgrade thread sees its first chunk. Remember the original read. + DISCOVERED.put(directory, minerals); + if (handler != null) persistRegistry(directory, minerals); + } catch (IOException e) { + throw new IllegalStateException("Could not preserve the old Base Minerals registry from " + file, e); + } + } + + private static NBTTagList mineralIds(NBTTagCompound root) { + NBTTagList ids = root.getCompound("FML").getCompound("Registries") + .getCompound("minecraft:blocks").getList("ids", 10); + NBTTagList minerals = new NBTTagList(); + for (int i = 0; i < ids.size(); i++) { + NBTTagCompound id = ids.getCompound(i); + if (id.getString("K").startsWith("baseminerals:")) minerals.add(id.copy()); + } + if (Boolean.getBoolean("baseminerals.debugUpgrade")) { + LOGGER.info("Registry scan {} block IDs, {} mineral IDs (root {})", ids.size(), minerals.size(), root.keySet()); + } + return minerals; + } + + private static synchronized Map[]> persistRegistry(Path directory, NBTTagList minerals) + throws IOException { + Path snapshot = directory.resolve(SNAPSHOT); + NBTTagCompound registry = new NBTTagCompound(); + registry.setTag("Blocks", minerals); + Map[]> states = bake(minerals); + if (Files.isRegularFile(snapshot)) { + if (!registry.equals(CompressedStreamTools.readCompressed(Files.newInputStream(snapshot)))) { + throw new IllegalStateException("Conflicting Base Minerals registry in " + directory); + } + } else { + Path temporary = Files.createTempFile(directory, "baseminerals-registry-", ".tmp"); + try { + CompressedStreamTools.writeCompressed(registry, Files.newOutputStream(temporary)); + Files.move(temporary, snapshot, StandardCopyOption.ATOMIC_MOVE); + } finally { + Files.deleteIfExists(temporary); + } + LOGGER.info("Saved {} legacy Base Minerals block IDs in {}", minerals.size(), snapshot); + } + WORLDS.put(directory, states); + return states; + } + + public static NBTTagCompound fixChunk(DataFixer fixer, TypeReference type, NBTTagCompound chunk, + int fromVersion, int toVersion, AnvilChunkLoader loader) { + migrateItems(chunk.getCompound("Level")); + Map[]> states = statesFor(loader.chunkSaveLocation); + if (states.isEmpty()) return NBTUtil.update(fixer, type, chunk, fromVersion, toVersion); + NBTTagCompound level = chunk.getCompound("Level"); + level.setBoolean("TerrainPopulated", true); + level.setBoolean("LightPopulated", true); + level.setBoolean(PRESERVE, true); + Map[]> previous = ACTIVE.get(); + ACTIVE.set(states); + try { + return NBTUtil.update(fixer, type, chunk, fromVersion, toVersion); + } finally { + if (previous == null) ACTIVE.remove(); + else ACTIVE.set(previous); + } + } + + public static NBTTagCompound finishChunk(DataFixer fixer, TypeReference type, NBTTagCompound chunk, int version) { + NBTTagCompound fixed = NBTUtil.update(fixer, type, chunk, version); + NBTTagCompound level = fixed.getCompound("Level"); + if (level.getBoolean(PRESERVE)) { + level.setString("Status", "postprocessed"); + level.removeTag(PRESERVE); + } + return fixed; + } + + public static Dynamic mineralState(int packedId) { + Map[]> states = ACTIVE.get(); + if (states == null) return null; + Dynamic[] entries = states.get(packedId >>> 4); + return entries == null ? null : entries[packedId & 15]; + } + + private static Map[]> statesFor(File chunkDirectory) { + try { + for (Path directory = chunkDirectory.getCanonicalFile().toPath(); directory != null; + directory = directory.getParent()) { + Map[]> known = WORLDS.get(directory); + if (known != null) return known; + Path snapshot = directory.resolve(SNAPSHOT); + if (Files.isRegularFile(snapshot)) { + return WORLDS.computeIfAbsent(directory, ignored -> { + try { + NBTTagCompound data = CompressedStreamTools.readCompressed(Files.newInputStream(snapshot)); + return bake(data.getList("Blocks", 10)); + } catch (IOException e) { + throw new IllegalStateException("Could not read " + snapshot, e); + } + }); + } + Path level = directory.resolve("level.dat"); + if (Files.isRegularFile(level)) { + NBTTagList minerals = DISCOVERED.get(directory); + if (minerals == null) { + minerals = mineralIds(CompressedStreamTools.readCompressed(Files.newInputStream(level))); + } + if (!minerals.isEmpty()) return persistRegistry(directory, minerals); + return WORLDS.computeIfAbsent(directory, ignored -> Collections.emptyMap()); + } + } + return Collections.emptyMap(); + } catch (IOException e) { + throw new IllegalStateException("Could not locate the world for " + chunkDirectory, e); + } + } + + private static Map[]> bake(NBTTagList ids) { + Map[]> result = new HashMap<>(); + for (int i = 0; i < ids.size(); i++) { + NBTTagCompound id = ids.getCompound(i); + ResourceLocation name = new ResourceLocation(id.getString("K")); + int numeric = id.getInt("V"); + if (!"baseminerals".equals(name.getNamespace()) || numeric < 1 || numeric > 4095 + || result.containsKey(numeric) || !ForgeRegistries.BLOCKS.containsKey(name)) { + throw new IllegalStateException("No unambiguous Base Minerals state for " + name + " (" + numeric + ")"); + } + Block block = ForgeRegistries.BLOCKS.getValue(name); + Dynamic[] entries = new Dynamic[16]; + for (int meta = 0; meta < entries.length; meta++) { + IBlockState state = block.getDefaultState(); + if (block instanceof BlockFlowingFluid) state = state.with(BlockFlowingFluid.LEVEL, meta); + entries[meta] = BlockStateFlatteningMap.makeDynamic(NBTUtil.writeBlockState(state).toString()); + } + result.put(numeric, entries); + } + return Collections.unmodifiableMap(result); + } + + public static void migrateItems(INBTBase value) { + if (value instanceof NBTTagCompound) { + NBTTagCompound compound = (NBTTagCompound) value; + if ("forge:bucketfilled".equals(compound.getString("id")) && compound.contains("Count", 99) + && compound.contains("tag", 10)) { + NBTTagCompound tag = compound.getCompound("tag"); + String fluid = tag.getString("FluidName"); + if (fluid.startsWith("baseminerals:")) fluid = fluid.substring("baseminerals:".length()); + if ("lithium".equals(fluid) || "silicon".equals(fluid)) { + compound.setString("id", "baseminerals:" + fluid + "_bucket"); + tag.removeTag("FluidName"); + tag.removeTag("Amount"); + if (tag.isEmpty()) compound.removeTag("tag"); + } + } + for (String key : new ArrayList<>(compound.keySet())) migrateItems(compound.getTag(key)); + } else if (value instanceof NBTTagList) { + NBTTagList list = (NBTTagList) value; + for (int i = 0; i < list.size(); i++) migrateItems(list.get(i)); + } + } +} diff --git a/src/main/java/zone/moddev/mc/baseminerals/proxy/ClientProxy.java b/src/main/java/zone/moddev/mc/baseminerals/proxy/ClientProxy.java deleted file mode 100644 index 861b164..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/proxy/ClientProxy.java +++ /dev/null @@ -1,46 +0,0 @@ -package zone.moddev.mc.baseminerals.proxy; - -import com.mcmoddev.lib.client.registrations.RegistrationHelper; -import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.ModelRegistryEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import zone.moddev.mc.baseminerals.BaseMinerals; -import zone.moddev.mc.baseminerals.client.BaseMineralsConfigScreen; -import zone.moddev.mc.baseminerals.init.Blocks; -import zone.moddev.mc.baseminerals.init.Fluids; -import zone.moddev.mc.baseminerals.init.Items; -import zone.moddev.mc.orespawn.api.client.WorldSettingsExtensionRegistry; - -public class ClientProxy extends CommonProxy { - @Override - public void preInit(FMLPreInitializationEvent event) { - super.preInit(event); - MinecraftForge.EVENT_BUS.register(this); - } - - @Override - public void init(FMLInitializationEvent event) { - super.init(event); - WorldSettingsExtensionRegistry.registerConfigScreen(BaseMinerals.MODID, BaseMineralsConfigScreen::new); - } - - @SubscribeEvent - public void modelRegistry(ModelRegistryEvent event) { - Items.getItemRegistry().forEach((name, item) -> { - if (owned(item.getRegistryName())) RegistrationHelper.registerItemRender(name); - }); - Blocks.getBlockRegistry().forEach((name, block) -> { - if (owned(block.getRegistryName())) RegistrationHelper.registerBlockRender(name); - }); - Fluids.getFluidBlockRegistry().forEach((name, block) -> { - if (owned(block.getRegistryName())) RegistrationHelper.registerFluidRender(name); - }); - } - - private static boolean owned(ResourceLocation name) { - return name != null && BaseMinerals.MODID.equals(name.getNamespace()); - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/proxy/CommonProxy.java b/src/main/java/zone/moddev/mc/baseminerals/proxy/CommonProxy.java deleted file mode 100644 index 59beadb..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/proxy/CommonProxy.java +++ /dev/null @@ -1,40 +0,0 @@ -package zone.moddev.mc.baseminerals.proxy; - - -import zone.moddev.mc.baseminerals.data.MaterialNames; -import zone.moddev.mc.baseminerals.init.ItemGroups; -import zone.moddev.mc.baseminerals.init.Recipes; -import zone.moddev.mc.baseminerals.init.VillagerTrades; -import zone.moddev.mc.baseminerals.util.BMiConfig; -import zone.moddev.mc.baseminerals.worldgen.BaseMineralsWorldgenProvider; - -import net.minecraftforge.fml.common.event.FMLInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; -import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; - -/** - * Base Minerals Common Proxy - * - * @author Jasmine Iwanek - * - */ -public class CommonProxy { - - @SuppressWarnings("deprecation") - public void preInit(FMLPreInitializationEvent event) { - VillagerTrades.init(); - ItemGroups.init(); - } - - - public void init(FMLInitializationEvent event) { - BaseMineralsWorldgenProvider.enqueue(); - Recipes.init(); - - ItemGroups.setupIcons(MaterialNames.SILICON); - } - - public void postInit(FMLPostInitializationEvent event) { - BMiConfig.postInit(); - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/proxy/ServerProxy.java b/src/main/java/zone/moddev/mc/baseminerals/proxy/ServerProxy.java deleted file mode 100644 index ace93fa..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/proxy/ServerProxy.java +++ /dev/null @@ -1,11 +0,0 @@ -package zone.moddev.mc.baseminerals.proxy; - -/** - * Base Minerals Server Proxy - * - * @author Jasmine Iwanek - * - */ -public class ServerProxy extends CommonProxy { - // Nothing to see here people -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/recipe/SharedCrushingSerializer.java b/src/main/java/zone/moddev/mc/baseminerals/recipe/SharedCrushingSerializer.java new file mode 100644 index 0000000..2ba4e59 --- /dev/null +++ b/src/main/java/zone/moddev/mc/baseminerals/recipe/SharedCrushingSerializer.java @@ -0,0 +1,49 @@ +package zone.moddev.mc.baseminerals.recipe; + +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.IRecipeSerializer; +import net.minecraft.item.crafting.RecipeSerializers; +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.ModList; +import zone.moddev.mc.baseminerals.BaseMinerals; + +/** Selects a crushing type when data packs load. The selected type handles recipe sync. */ +public final class SharedCrushingSerializer implements IRecipeSerializer { + private static final ResourceLocation NAME = new ResourceLocation(BaseMinerals.MOD_ID, "shared_crushing"); + + @Override + public IRecipe read(ResourceLocation id, JsonObject json) { + ModList mods = ModList.get(); + String host; + if (mods.isLoaded("basemetals")) { + host = "basemetals"; + } else if (mods.isLoaded("modernmetals")) { + host = "modernmetals"; + } else { + throw new JsonSyntaxException(NAME + " requires Base Metals or Modern Metals"); + } + JsonObject shared = new JsonObject(); + shared.addProperty("type", host + ":crushing"); + shared.add("ingredient", json.get("ingredient")); + shared.add("result", json.get("result")); + return RecipeSerializers.deserialize(id, shared); + } + + @Override + public IRecipe read(ResourceLocation id, PacketBuffer buffer) { + throw new UnsupportedOperationException("Shared crushing uses the selected mod's serializer for sync"); + } + + @Override + public void write(PacketBuffer buffer, IRecipe recipe) { + throw new UnsupportedOperationException("Shared crushing uses the selected mod's serializer for sync"); + } + + @Override + public ResourceLocation getName() { + return NAME; + } +} diff --git a/src/main/java/zone/moddev/mc/baseminerals/util/BMiConfig.java b/src/main/java/zone/moddev/mc/baseminerals/util/BMiConfig.java deleted file mode 100644 index 559f571..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/util/BMiConfig.java +++ /dev/null @@ -1,70 +0,0 @@ -package zone.moddev.mc.baseminerals.util; - -import java.io.File; -import java.util.HashMap; -import java.util.Map; -import com.mcmoddev.lib.registry.CrusherRecipeRegistry; -import com.mcmoddev.lib.util.Config; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.config.Configuration; -import net.minecraftforge.common.config.Property; -import net.minecraftforge.fml.client.event.ConfigChangedEvent; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; -import zone.moddev.mc.baseminerals.BaseMinerals; -import zone.moddev.mc.baseminerals.data.MaterialNames; - -/** Saves requested settings and latches registration choices until restart. */ -public class BMiConfig extends Config { - public static final String MATERIALS = "Metals"; - public static final String VANILLA = "Vanilla"; - public static final String FLUIDS = "Fluids"; - private static final Map active = new HashMap<>(); - private static Configuration configuration; - - public static void init() { - if (configuration != null) return; - configuration = new Configuration(new File("config/BaseMinerals.cfg")); - load(configuration); - if (configuration.hasChanged()) configuration.save(); - MinecraftForge.EVENT_BUS.register(new BMiConfig()); - } - - static void load(Configuration value) { - for (String name : new String[]{MaterialNames.CHARCOAL, MaterialNames.LITHIUM, - MaterialNames.NITER, MaterialNames.PHOSPHORUS, MaterialNames.POTASH, MaterialNames.SALT, - MaterialNames.SALTPETER, MaterialNames.SILICON, MaterialNames.SULFUR}) { - String title = Character.toUpperCase(name.charAt(0)) + name.substring(1); - boolean charcoal = MaterialNames.CHARCOAL.equals(name); - Property material = value.get(charcoal ? VANILLA : MATERIALS, "Enable" + title, true); - material.setRequiresMcRestart(true); - material.setLanguageKey("config.baseminerals.enable_" + name); - boolean enabled = material.getBoolean(); - active.put(name, enabled); - if (!charcoal) Options.materialEnabled(name, enabled); - if (MaterialNames.LITHIUM.equals(name) || MaterialNames.SILICON.equals(name)) { - Property fluid = value.get(FLUIDS, "Enabled " + title, true); - fluid.setRequiresMcRestart(true); - fluid.setLanguageKey("config.baseminerals.fluid_" + name); - Options.fluidEnabled(name, enabled && fluid.getBoolean()); - } - } - } - - public static boolean isEnabled(String name) { - return Boolean.TRUE.equals(active.get(name)); - } - - public static Configuration getConfiguration() { - if (configuration == null) init(); - return configuration; - } - - @SubscribeEvent - public void onConfigChange(ConfigChangedEvent.OnConfigChangedEvent event) { - if (BaseMinerals.MODID.equals(event.getModID())) configuration.save(); - } - - public static void postInit() { - CrusherRecipeRegistry.getInstance().clearCache(); - } -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/util/EventHandler.java b/src/main/java/zone/moddev/mc/baseminerals/util/EventHandler.java deleted file mode 100644 index 5e94566..0000000 --- a/src/main/java/zone/moddev/mc/baseminerals/util/EventHandler.java +++ /dev/null @@ -1,57 +0,0 @@ -package zone.moddev.mc.baseminerals.util; - -import zone.moddev.mc.baseminerals.BaseMinerals; -import zone.moddev.mc.baseminerals.init.Blocks; -import zone.moddev.mc.baseminerals.init.Fluids; -import zone.moddev.mc.baseminerals.init.Items; -import zone.moddev.mc.baseminerals.init.Materials; -import com.mcmoddev.lib.events.*; - -import net.minecraftforge.event.RegistryEvent; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; - -import net.minecraft.block.Block; -import net.minecraft.item.Item; - -@EventBusSubscriber -public class EventHandler { - @SubscribeEvent - public static void mmdlibRegisterMaterials(MMDLibRegisterMaterials ev) { - Materials.init(); - } - - @SubscribeEvent - public static void mmdlibRegisterBlocks(MMDLibRegisterBlocks ev) { - Blocks.init(); - } - - @SubscribeEvent - public static void mmdlibRegisterItems(MMDLibRegisterItems ev) { - Items.init(); - } - - @SubscribeEvent - public static void mmdlibRegisterFluids(MMDLibRegisterFluids ev) { - Fluids.init(); - } - - @SubscribeEvent - public static void onRemapBlock(RegistryEvent.MissingMappings event) { - for (final RegistryEvent.MissingMappings.Mapping mapping : event.getAllMappings()) { - if (mapping.key.getNamespace().equals(BaseMinerals.MODID)) { - // dummy - } - } - } - - @SubscribeEvent - public static void onRemapItem(RegistryEvent.MissingMappings event) { - for (final RegistryEvent.MissingMappings.Mapping mapping : event.getAllMappings()) { - if (mapping.key.getNamespace().equals(BaseMinerals.MODID)) { - // dummy - } - } - } - -} diff --git a/src/main/java/zone/moddev/mc/baseminerals/worldgen/BaseMineralsWorldgenProvider.java b/src/main/java/zone/moddev/mc/baseminerals/worldgen/BaseMineralsWorldgenProvider.java index af72066..fcfc7dd 100644 --- a/src/main/java/zone/moddev/mc/baseminerals/worldgen/BaseMineralsWorldgenProvider.java +++ b/src/main/java/zone/moddev/mc/baseminerals/worldgen/BaseMineralsWorldgenProvider.java @@ -6,7 +6,7 @@ import java.util.function.Predicate; import java.util.function.Consumer; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.fml.common.registry.ForgeRegistries; +import net.minecraftforge.registries.ForgeRegistries; import zone.moddev.mc.orespawn.api.*; /** Declarations only: OreSpawn resolves, bakes and executes all placement. */ @@ -37,6 +37,10 @@ public static Optional build(Predicate avail p.yRange(rule.minY,rule.maxY).attempts(rule.frequency).quantityRange(rule.minQuantity,rule.maxQuantity) .pattern(rule.pattern).heightDistribution(rule.height).placementChannel(id("orespawn","standard")) .spread(rule.horizontal,rule.vertical).nodeSize(rule.node).hostBlock(id("minecraft","stone")); + for (String host : new String[] {"granite", "diorite", "andesite", + "polished_granite", "polished_diorite", "polished_andesite"}) { + p.hostBlock(id("minecraft", host)); + } // API major 1 exposes vein length through the standard pattern codec. if(rule.pattern==OrePattern.VEIN) { com.google.gson.JsonObject settings=new com.google.gson.JsonObject(); diff --git a/src/main/resources/META-INF/baseminerals-legacy-api.list b/src/main/resources/META-INF/baseminerals-legacy-api.list deleted file mode 100644 index d642ac0..0000000 --- a/src/main/resources/META-INF/baseminerals-legacy-api.list +++ /dev/null @@ -1,20 +0,0 @@ -BaseMinerals -data/MaterialNames -init/Blocks -init/Fluids -init/ItemGroups -init/Items -init/Materials -init/Recipes -init/VillagerTrades -integration/plugins/BMiDenseOres -integration/plugins/BMiEnderIO -integration/plugins/BMiMekanism -integration/plugins/BMiThaumcraft -integration/plugins/BMiThermalExpansion -integration/plugins/BMiTinkersConstruct -proxy/ClientProxy -proxy/CommonProxy -proxy/ServerProxy -util/BMiConfig -util/EventHandler diff --git a/src/main/resources/META-INF/coremods.json b/src/main/resources/META-INF/coremods.json new file mode 100644 index 0000000..d18bc56 --- /dev/null +++ b/src/main/resources/META-INF/coremods.json @@ -0,0 +1,3 @@ +{ + "baseminerals_legacy_world_upgrade": "coremods/baseminerals_legacy_world_upgrade.js" +} diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml new file mode 100644 index 0000000..de1c8f8 --- /dev/null +++ b/src/main/resources/META-INF/mods.toml @@ -0,0 +1,32 @@ +modLoader="javafml" +loaderVersion="[25,)" +license="LGPL-2.1" + +[[mods]] +modId="baseminerals" +version="${version}" +displayName="Base Minerals" +displayURL="https://www.curseforge.com/minecraft/mc-mods/base-minerals" +authors="DrCyano, jriwanek, dshadowwolf, SkyBlade1978, the MMD Team" +description="Adds mineral ores, blocks, powders, alloys and molten minerals." + +[[dependencies.baseminerals]] +modId="minecraft" +mandatory=true +versionRange="[1.13.2]" +ordering="NONE" +side="BOTH" + +[[dependencies.baseminerals]] +modId="orespawn" +mandatory=true +versionRange="[4.1.7.113021,5.0.0)" +ordering="AFTER" +side="BOTH" + +[[dependencies.baseminerals]] +modId="basemetals" +mandatory=false +versionRange="[3.0.3.113021,4.0.0)" +ordering="AFTER" +side="BOTH" diff --git a/src/main/resources/assets/baseminerals/blockstates/lithium.json b/src/main/resources/assets/baseminerals/blockstates/lithium.json index 702f4fe..c464917 100644 --- a/src/main/resources/assets/baseminerals/blockstates/lithium.json +++ b/src/main/resources/assets/baseminerals/blockstates/lithium.json @@ -1,9 +1,7 @@ { - "forge_marker": 1, - "variants": { - "fluid": { - "model": "forge:fluid", - "custom": { "fluid": "lithium" } - } + "variants": { + "": { + "model": "baseminerals:block/lithium_molten" } -} \ No newline at end of file + } +} diff --git a/src/main/resources/assets/baseminerals/blockstates/lithium_block.json b/src/main/resources/assets/baseminerals/blockstates/lithium_block.json index b8bbd69..7ae2b2e 100644 --- a/src/main/resources/assets/baseminerals/blockstates/lithium_block.json +++ b/src/main/resources/assets/baseminerals/blockstates/lithium_block.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:lithium_block" } + "variants": { + "": { + "model": "baseminerals:block/lithium_block" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/lithium_ore.json b/src/main/resources/assets/baseminerals/blockstates/lithium_ore.json index d8eb437..8090f6b 100644 --- a/src/main/resources/assets/baseminerals/blockstates/lithium_ore.json +++ b/src/main/resources/assets/baseminerals/blockstates/lithium_ore.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:lithium_ore" } + "variants": { + "": { + "model": "baseminerals:block/lithium_ore" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/niter_block.json b/src/main/resources/assets/baseminerals/blockstates/niter_block.json index 4c5a2e2..ea3a51c 100644 --- a/src/main/resources/assets/baseminerals/blockstates/niter_block.json +++ b/src/main/resources/assets/baseminerals/blockstates/niter_block.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:niter_block" } + "variants": { + "": { + "model": "baseminerals:block/niter_block" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/niter_ore.json b/src/main/resources/assets/baseminerals/blockstates/niter_ore.json index f16586b..4f6afcc 100644 --- a/src/main/resources/assets/baseminerals/blockstates/niter_ore.json +++ b/src/main/resources/assets/baseminerals/blockstates/niter_ore.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:niter_ore" } + "variants": { + "": { + "model": "baseminerals:block/niter_ore" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/phosphorus_block.json b/src/main/resources/assets/baseminerals/blockstates/phosphorus_block.json index 6dc3fe4..9de7d7b 100644 --- a/src/main/resources/assets/baseminerals/blockstates/phosphorus_block.json +++ b/src/main/resources/assets/baseminerals/blockstates/phosphorus_block.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:phosphorus_block" } + "variants": { + "": { + "model": "baseminerals:block/phosphorus_block" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/phosphorus_ore.json b/src/main/resources/assets/baseminerals/blockstates/phosphorus_ore.json index f1d27c3..75002a8 100644 --- a/src/main/resources/assets/baseminerals/blockstates/phosphorus_ore.json +++ b/src/main/resources/assets/baseminerals/blockstates/phosphorus_ore.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:phosphorus_ore" } + "variants": { + "": { + "model": "baseminerals:block/phosphorus_ore" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/potash_block.json b/src/main/resources/assets/baseminerals/blockstates/potash_block.json index eede4b7..a2eda0a 100644 --- a/src/main/resources/assets/baseminerals/blockstates/potash_block.json +++ b/src/main/resources/assets/baseminerals/blockstates/potash_block.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:potash_block" } + "variants": { + "": { + "model": "baseminerals:block/potash_block" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/potash_ore.json b/src/main/resources/assets/baseminerals/blockstates/potash_ore.json index fe7fb83..55c929c 100644 --- a/src/main/resources/assets/baseminerals/blockstates/potash_ore.json +++ b/src/main/resources/assets/baseminerals/blockstates/potash_ore.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:potash_ore" } + "variants": { + "": { + "model": "baseminerals:block/potash_ore" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/salt_block.json b/src/main/resources/assets/baseminerals/blockstates/salt_block.json index 39f66c5..7072fdc 100644 --- a/src/main/resources/assets/baseminerals/blockstates/salt_block.json +++ b/src/main/resources/assets/baseminerals/blockstates/salt_block.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:salt_block" } + "variants": { + "": { + "model": "baseminerals:block/salt_block" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/salt_ore.json b/src/main/resources/assets/baseminerals/blockstates/salt_ore.json index 984a9d0..3f3b580 100644 --- a/src/main/resources/assets/baseminerals/blockstates/salt_ore.json +++ b/src/main/resources/assets/baseminerals/blockstates/salt_ore.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:salt_ore" } + "variants": { + "": { + "model": "baseminerals:block/salt_ore" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/saltpeter_block.json b/src/main/resources/assets/baseminerals/blockstates/saltpeter_block.json index 992c828..0b1df37 100644 --- a/src/main/resources/assets/baseminerals/blockstates/saltpeter_block.json +++ b/src/main/resources/assets/baseminerals/blockstates/saltpeter_block.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:saltpeter_block" } + "variants": { + "": { + "model": "baseminerals:block/saltpeter_block" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/saltpeter_ore.json b/src/main/resources/assets/baseminerals/blockstates/saltpeter_ore.json index d850744..2c4139e 100644 --- a/src/main/resources/assets/baseminerals/blockstates/saltpeter_ore.json +++ b/src/main/resources/assets/baseminerals/blockstates/saltpeter_ore.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:saltpeter_ore" } + "variants": { + "": { + "model": "baseminerals:block/saltpeter_ore" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/silicon.json b/src/main/resources/assets/baseminerals/blockstates/silicon.json index 216cb61..0aca00d 100644 --- a/src/main/resources/assets/baseminerals/blockstates/silicon.json +++ b/src/main/resources/assets/baseminerals/blockstates/silicon.json @@ -1,9 +1,7 @@ { - "forge_marker": 1, - "variants": { - "fluid": { - "model": "forge:fluid", - "custom": { "fluid": "silicon" } - } + "variants": { + "": { + "model": "baseminerals:block/silicon_molten" } -} \ No newline at end of file + } +} diff --git a/src/main/resources/assets/baseminerals/blockstates/silicon_block.json b/src/main/resources/assets/baseminerals/blockstates/silicon_block.json index db6d70e..86dd169 100644 --- a/src/main/resources/assets/baseminerals/blockstates/silicon_block.json +++ b/src/main/resources/assets/baseminerals/blockstates/silicon_block.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:silicon_block" } + "variants": { + "": { + "model": "baseminerals:block/silicon_block" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/sulfur_block.json b/src/main/resources/assets/baseminerals/blockstates/sulfur_block.json index 636a2db..379fb04 100644 --- a/src/main/resources/assets/baseminerals/blockstates/sulfur_block.json +++ b/src/main/resources/assets/baseminerals/blockstates/sulfur_block.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:sulfur_block" } + "variants": { + "": { + "model": "baseminerals:block/sulfur_block" } + } } diff --git a/src/main/resources/assets/baseminerals/blockstates/sulfur_ore.json b/src/main/resources/assets/baseminerals/blockstates/sulfur_ore.json index fe02e71..c211157 100644 --- a/src/main/resources/assets/baseminerals/blockstates/sulfur_ore.json +++ b/src/main/resources/assets/baseminerals/blockstates/sulfur_ore.json @@ -1,5 +1,7 @@ { - "variants": { - "normal": { "model": "baseminerals:sulfur_ore" } + "variants": { + "": { + "model": "baseminerals:block/sulfur_ore" } + } } diff --git a/src/main/resources/assets/baseminerals/lang/de_DE.lang b/src/main/resources/assets/baseminerals/lang/de_DE.lang deleted file mode 100644 index 77ce05a..0000000 --- a/src/main/resources/assets/baseminerals/lang/de_DE.lang +++ /dev/null @@ -1,127 +0,0 @@ -itemGroup.baseminerals.blocks=Base Minerals Blöcke -itemGroup.baseminerals.combat=Base Minerals Combat -itemGroup.baseminerals.items=Base Minerals Gegenstände -itemGroup.baseminerals.tools=Base Minerals Werkzeuge -nei.baseminerals.recipehandler.crusher.name=Zerkleinerte Blöcke / Gegenstände - -item.baseminerals.charcoal_blend.name=Holzkohlegemisch -item.baseminerals.charcoal_block.name=Holzkohleblock -item.baseminerals.charcoal_ingot.name=Holzkohlebarren -item.baseminerals.charcoal_nugget.name=Holzkohlenugget -item.baseminerals.charcoal_ore.name=Holzkohleerz -item.baseminerals.charcoal_powder.name=Holzkohlepulver -item.baseminerals.charcoal_smallblend.name=Kleiner Holzkohlegemischhaufen -item.baseminerals.charcoal_smallpowder.name=Kleiner Holzkohlepulverhaufen - -item.baseminerals.lithium_blend.name=Lithiumgemisch -item.baseminerals.lithium_block.name=Lithiumblock -item.baseminerals.lithium_ingot.name=Lithiumbarren -item.baseminerals.lithium_nugget.name=Lithiumnugget -item.baseminerals.lithium_ore.name=Lithiumerz -item.baseminerals.lithium_powder.name=Lithiumpulver -item.baseminerals.lithium_smallblend.name=Kleiner Lithiumgemischhaufen -item.baseminerals.lithium_smallpowder.name=Kleiner Lithiumpulverhaufen - -item.baseminerals.niter_blend.name=Kalisalpetergemisch -item.baseminerals.niter_block.name=Kalisalpeterblock -item.baseminerals.niter_ingot.name=Kalisalpeterbarren -item.baseminerals.niter_nugget.name=Kalisalpeternugget -item.baseminerals.niter_ore.name=Kalisalpetererz -item.baseminerals.niter_powder.name=Kalisalpeterpulver -item.baseminerals.niter_smallblend.name=Kleiner Kalisalpetergemischhaufen -item.baseminerals.niter_smallpowder.name=Kleiner Kalisalpeterpulverhaufen - -item.baseminerals.potash_blend.name=Kalisalzgemisch -item.baseminerals.potash_block.name=Kalisalzblock -item.baseminerals.potash_ingot.name=Kalisalzbarren -item.baseminerals.potash_nugget.name=Kalisalznugget -item.baseminerals.potash_ore.name=Kalisalzerz -item.baseminerals.potash_powder.name=Kalisalzpulver -item.baseminerals.potash_smallblend.name=Kleiner Kalisalzgemischhaufen -item.baseminerals.potash_smallpowder.name=Kleiner Kalisalzpulverhaufen - -item.baseminerals.phosphorus_blend.name=Phosphorgemisch -item.baseminerals.phosphorus_block.name=Phosphorblock -item.baseminerals.phosphorus_ingot.name=Phosphorbarren -item.baseminerals.phosphorus_nugget.name=Phosphornugget -item.baseminerals.phosphorus_ore.name=Phosphorerz -item.baseminerals.phosphorus_powder.name=Phosphorpulver -item.baseminerals.phosphorus_smallblend.name=Kleiner Phosphorgemischhaufen -item.baseminerals.phosphorus_smallpowder.name=Kleiner Phosphorpulverhaufen - -item.baseminerals.salt_blend.name=Salzgemisch -item.baseminerals.salt_block.name=Salzblock -item.baseminerals.salt_ingot.name=Salzbarren -item.baseminerals.salt_nugget.name=Salznugget -item.baseminerals.salt_ore.name=Salzerz -item.baseminerals.salt_powder.name=Salzpulver -item.baseminerals.salt_smallblend.name=Kleiner Salzgemischhaufen -item.baseminerals.salt_smallpowder.name=Kleiner Salzpulverhaufen - -item.baseminerals.saltpeter_blend.name=Salpetergemisch -item.baseminerals.saltpeter_block.name=Salpeterblock -item.baseminerals.saltpeter_ingot.name=Salpeterbarren -item.baseminerals.saltpeter_nugget.name=Salpeternugget -item.baseminerals.saltpeter_ore.name=Salpetererz -item.baseminerals.saltpeter_powder.name=Salpeterpulver -item.baseminerals.saltpeter_smallblend.name=Kleiner Salpetergemischhaufen -item.baseminerals.saltpeter_smallpowder.name=Kleiner Salpeterpulverhaufen - -item.baseminerals.silicon_blend.name=Siliziumgemisch -item.baseminerals.silicon_block.name=Siliziumblock -item.baseminerals.silicon_ingot.name=Siliziumbarren -item.baseminerals.silicon_nugget.name=Siliziumnugget -item.baseminerals.silicon_ore.name=Siliziumerz -item.baseminerals.silicon_powder.name=Siliziumpulver -item.baseminerals.silicon_smallblend.name=Kleiner Siliziumgemischhaufen -item.baseminerals.silicon_smallpowder.name=Kleiner Siliziumpulverhaufen - -item.baseminerals.sulfur_blend.name=Schwefelgemisch -item.baseminerals.sulfur_block.name=Schwefelblock -item.baseminerals.sulfur_ingot.name=Schwefelbarren -item.baseminerals.sulfur_nugget.name=Schwefelnugget -item.baseminerals.sulfur_ore.name=Schwefelerz -item.baseminerals.sulfur_powder.name=Schwefelpulver -item.baseminerals.sulfur_smallblend.name=Kleiner Schwefelgemischhaufen -item.baseminerals.sulfur_smallpowder.name=Kleiner Schwefelpulverhaufen - -tile.baseminerals.charcoal_block.name=Holzkohleblock -tile.baseminerals.charcoal_ore.name=Holzkohleerz - -tile.baseminerals.lithium_block.name=Lithiumblock -tile.baseminerals.lithium_ore.name=Lithiumerz - -tile.baseminerals.niter_block.name=Gereinigter Salpeterblock -tile.baseminerals.niter_ore.name=Kalisalpetererz - -tile.baseminerals.phosphorus_block.name=Phosphorblock -tile.baseminerals.phosphorus_ore.name=Phosphorerz - -tile.baseminerals.potash_block.name=Kalisalzblock -tile.baseminerals.potash_ore.name=Kalisalzerz - -tile.baseminerals.salt_block.name=Salzblock -tile.baseminerals.salt_ore.name=Salzerz - -tile.baseminerals.saltpeter_block.name=Salpeterblock -tile.baseminerals.saltpeter_ore.name=Salpetererz - -tile.baseminerals.silicon_block.name=Siliziumblock -tile.baseminerals.silicon_ore.name=Siliziumerz - -tile.baseminerals.sulfur_block.name=Schwefelblock -tile.baseminerals.sulfur_ore.name=Schwefelerz - -tooltip.charcoal.tool=Nichts Besonderes - -tooltip.charcoal.armor=Nichts Besonderes - -achievement.charcoal_maker=Holzkohle -achievement.charcoal_maker.desc=Kombiniere ???pulver und ???pulver, um Holzkohle herzustellen - -fluid.baseminerals.lithium=Geschmolzenes Lithium -fluid.baseminerals.silicon=Geschmolzenes Silizium - -tile.baseminerals.lithium.name=Geschmolzenes Lithium -tile.baseminerals.lithium.name=Geschmolzenes Siliziumconfig.baseminerals.fluid_lithium=Flüssiges Lithium -config.baseminerals.fluid_silicon=Flüssiges Silizium diff --git a/src/main/resources/assets/baseminerals/lang/de_de.json b/src/main/resources/assets/baseminerals/lang/de_de.json new file mode 100644 index 0000000..dc6aa99 --- /dev/null +++ b/src/main/resources/assets/baseminerals/lang/de_de.json @@ -0,0 +1,40 @@ +{ + "block.baseminerals.lithium_block": "Lithiumblock", + "item.baseminerals.lithium_ingot": "Lithiumbarren", + "item.baseminerals.lithium_nugget": "Lithiumnugget", + "block.baseminerals.lithium_ore": "Lithiumerz", + "item.baseminerals.lithium_powder": "Lithiumpulver", + "item.baseminerals.lithium_smallpowder": "Kleiner Lithiumpulverhaufen", + "block.baseminerals.niter_block": "Gereinigter Salpeterblock", + "block.baseminerals.niter_ore": "Kalisalpetererz", + "item.baseminerals.niter_powder": "Kalisalpeterpulver", + "item.baseminerals.niter_smallpowder": "Kleiner Kalisalpeterpulverhaufen", + "block.baseminerals.potash_block": "Kalisalzblock", + "block.baseminerals.potash_ore": "Kalisalzerz", + "item.baseminerals.potash_powder": "Kalisalzpulver", + "item.baseminerals.potash_smallpowder": "Kleiner Kalisalzpulverhaufen", + "block.baseminerals.phosphorus_block": "Phosphorblock", + "block.baseminerals.phosphorus_ore": "Phosphorerz", + "item.baseminerals.phosphorus_powder": "Phosphorpulver", + "item.baseminerals.phosphorus_smallpowder": "Kleiner Phosphorpulverhaufen", + "block.baseminerals.salt_block": "Salzblock", + "block.baseminerals.salt_ore": "Salzerz", + "item.baseminerals.salt_powder": "Salzpulver", + "item.baseminerals.salt_smallpowder": "Kleiner Salzpulverhaufen", + "block.baseminerals.saltpeter_block": "Salpeterblock", + "block.baseminerals.saltpeter_ore": "Salpetererz", + "item.baseminerals.saltpeter_powder": "Salpeterpulver", + "item.baseminerals.saltpeter_smallpowder": "Kleiner Salpeterpulverhaufen", + "item.baseminerals.silicon_blend": "Siliziumgemisch", + "block.baseminerals.silicon_block": "Siliziumblock", + "item.baseminerals.silicon_ingot": "Siliziumbarren", + "item.baseminerals.silicon_nugget": "Siliziumnugget", + "item.baseminerals.silicon_powder": "Siliziumpulver", + "item.baseminerals.silicon_smallblend": "Kleiner Siliziumgemischhaufen", + "item.baseminerals.silicon_smallpowder": "Kleiner Siliziumpulverhaufen", + "block.baseminerals.sulfur_block": "Schwefelblock", + "block.baseminerals.sulfur_ore": "Schwefelerz", + "item.baseminerals.sulfur_powder": "Schwefelpulver", + "item.baseminerals.sulfur_smallpowder": "Kleiner Schwefelpulverhaufen", + "block.baseminerals.lithium": "Geschmolzenes Siliziumconfig.baseminerals.fluid_lithium=Flüssiges Lithium" +} diff --git a/src/main/resources/assets/baseminerals/lang/en_US.lang b/src/main/resources/assets/baseminerals/lang/en_US.lang deleted file mode 100644 index 5f599ed..0000000 --- a/src/main/resources/assets/baseminerals/lang/en_US.lang +++ /dev/null @@ -1,141 +0,0 @@ -itemGroup.baseminerals.blocks=Base Minerals Blocks -itemGroup.baseminerals.combat=Base Minerals Combat -itemGroup.baseminerals.items=Base Minerals Items -itemGroup.baseminerals.tools=Base Minerals Tools -nei.baseminerals.recipehandler.crusher.name=Crushed Blocks/Items - -item.baseminerals.charcoal_blend.name=Charcoal Blend -item.baseminerals.charcoal_block.name=Charcoal Block -item.baseminerals.charcoal_ingot.name=Charcoal Ingot -item.baseminerals.charcoal_nugget.name=Charcoal Nugget -item.baseminerals.charcoal_ore.name=Charcoal Ore -item.baseminerals.charcoal_powder.name=Powdered Charcoal -item.baseminerals.charcoal_smallblend.name=Small Pile of Charcoal Blend -item.baseminerals.charcoal_smallpowder.name=Small Pile of Powdered Charcoal - -item.baseminerals.lithium_blend.name=Lithium Blend -item.baseminerals.lithium_block.name=Lithium Block -item.baseminerals.lithium_ingot.name=Lithium Ingot -item.baseminerals.lithium_nugget.name=Lithium Nugget -item.baseminerals.lithium_ore.name=Lithium Ore -item.baseminerals.lithium_powder.name=Powdered Lithium -item.baseminerals.lithium_smallblend.name=Small Pile of Lithium Blend -item.baseminerals.lithium_smallpowder.name=Small Pile of Powdered Lithium - -item.baseminerals.niter_blend.name=Niter Blend -item.baseminerals.niter_block.name=Niter Block -item.baseminerals.niter_ingot.name=Niter Ingot -item.baseminerals.niter_nugget.name=Niter Nugget -item.baseminerals.niter_ore.name=Niter Ore -item.baseminerals.niter_powder.name=Powdered Niter -item.baseminerals.niter_smallblend.name=Small Pile of Niter Blend -item.baseminerals.niter_smallpowder.name=Small Pile of Powdered Niter - -item.baseminerals.potash_blend.name=Potash Blend -item.baseminerals.potash_block.name=Potash Block -item.baseminerals.potash_ingot.name=Potash Ingot -item.baseminerals.potash_nugget.name=Potash Nugget -item.baseminerals.potash_ore.name=Potash Ore -item.baseminerals.potash_powder.name=Powdered Potash -item.baseminerals.potash_smallblend.name=Small Pile of Potash Blend -item.baseminerals.potash_smallpowder.name=Small Pile of Powdered Potash - -item.baseminerals.phosphorus_blend.name=Phosphorus Blend -item.baseminerals.phosphorus_block.name=Phosphorus Block -item.baseminerals.phosphorus_ingot.name=Phosphorus Ingot -item.baseminerals.phosphorus_nugget.name=Phosphorus Nugget -item.baseminerals.phosphorus_ore.name=Phosphorus Ore -item.baseminerals.phosphorus_powder.name=Powdered Phosphorus -item.baseminerals.phosphorus_smallblend.name=Small Pile of Phosphorus Blend -item.baseminerals.phosphorus_smallpowder.name=Small Pile of Powdered Phosphorus - -item.baseminerals.salt_blend.name=Salt Blend -item.baseminerals.salt_block.name=Salt Block -item.baseminerals.salt_ingot.name=Salt Ingot -item.baseminerals.salt_nugget.name=Salt Nugget -item.baseminerals.salt_ore.name=Salt Ore -item.baseminerals.salt_powder.name=Powdered Salt -item.baseminerals.salt_smallblend.name=Small Pile of Salt Blend -item.baseminerals.salt_smallpowder.name=Small Pile of Powdered Salt - -item.baseminerals.saltpeter_blend.name=Saltpeter Blend -item.baseminerals.saltpeter_block.name=Saltpeter Block -item.baseminerals.saltpeter_ingot.name=Saltpeter Ingot -item.baseminerals.saltpeter_nugget.name=Saltpeter Nugget -item.baseminerals.saltpeter_ore.name=Saltpeter Ore -item.baseminerals.saltpeter_powder.name=Powdered Saltpeter -item.baseminerals.saltpeter_smallblend.name=Small Pile of Saltpeter Blend -item.baseminerals.saltpeter_smallpowder.name=Small Pile of Powdered Saltpeter - -item.baseminerals.silicon_blend.name=Silicon Blend -item.baseminerals.silicon_block.name=Silicon Block -item.baseminerals.silicon_ingot.name=Silicon Ingot -item.baseminerals.silicon_nugget.name=Silicon Nugget -item.baseminerals.silicon_ore.name=Silicon Ore -item.baseminerals.silicon_powder.name=Powdered Silicon -item.baseminerals.silicon_smallblend.name=Small Pile of Silicon Blend -item.baseminerals.silicon_smallpowder.name=Small Pile of Powdered Silicon - -item.baseminerals.sulfur_blend.name=Sulfur Blend -item.baseminerals.sulfur_block.name=Sulfur Block -item.baseminerals.sulfur_ingot.name=Sulfur Ingot -item.baseminerals.sulfur_nugget.name=Sulfur Nugget -item.baseminerals.sulfur_ore.name=Sulfur Ore -item.baseminerals.sulfur_powder.name=Powdered Sulfur -item.baseminerals.sulfur_smallblend.name=Small Pile of Sulfur Blend -item.baseminerals.sulfur_smallpowder.name=Small Pile of Powdered Sulfur - -tile.baseminerals.charcoal_block.name=Charcoal Block -tile.baseminerals.charcoal_ore.name=Charcoal Ore - -tile.baseminerals.lithium_block.name=Lithium Block -tile.baseminerals.lithium_ore.name=Lithium Ore - -tile.baseminerals.niter_block.name=Niter Block -tile.baseminerals.niter_ore.name=Niter Ore - -tile.baseminerals.phosphorus_block.name=Phosphorus Block -tile.baseminerals.phosphorus_ore.name=Phosphorus Ore - -tile.baseminerals.potash_block.name=Potash Block -tile.baseminerals.potash_ore.name=Potash Ore - -tile.baseminerals.salt_block.name=Salt Block -tile.baseminerals.salt_ore.name=Salt Ore - -tile.baseminerals.saltpeter_block.name=Saltpeter Block -tile.baseminerals.saltpeter_ore.name=Saltpeter Ore - -tile.baseminerals.silicon_block.name=Silicon Block -tile.baseminerals.silicon_ore.name=Silicon Ore -tile.baseminerals.silicon.name=Molten Silicon - -tile.baseminerals.sulfur_block.name=Sulfur Block -tile.baseminerals.sulfur_ore.name=Sulfur Ore - -tooltip.charcoal.tool=Nothing Special - -tooltip.charcoal.armor=Nothing Special - -achievement.charcoal_maker=Charcoal -achievement.charcoal_maker.desc=Combine powdered ??? and ??? to make ??? - -fluid.baseminerals.lithium=Molten Lithium -fluid.baseminerals.silicon=Molten Silicon - -tile.baseminerals.lithium.name=Molten Lithium -tile.baseminerals.lithium.name=Molten Silicon - -config.baseminerals.title=Base Minerals -config.baseminerals.description=Material switches take effect after restarting Minecraft. -config.baseminerals.enable_charcoal=Enable Charcoal -config.baseminerals.enable_lithium=Enable Lithium -config.baseminerals.enable_niter=Enable Niter -config.baseminerals.enable_phosphorus=Enable Phosphorus -config.baseminerals.enable_potash=Enable Potash -config.baseminerals.enable_salt=Enable Salt -config.baseminerals.enable_saltpeter=Enable Saltpeter -config.baseminerals.enable_silicon=Enable Silicon -config.baseminerals.enable_sulfur=Enable Sulfur -config.baseminerals.fluid_lithium=Lithium fluid -config.baseminerals.fluid_silicon=Silicon fluid diff --git a/src/main/resources/assets/baseminerals/lang/en_us.json b/src/main/resources/assets/baseminerals/lang/en_us.json new file mode 100644 index 0000000..0e2d7dc --- /dev/null +++ b/src/main/resources/assets/baseminerals/lang/en_us.json @@ -0,0 +1,44 @@ +{ + "block.baseminerals.lithium_block": "Lithium Block", + "item.baseminerals.lithium_ingot": "Lithium Ingot", + "item.baseminerals.lithium_nugget": "Lithium Nugget", + "block.baseminerals.lithium_ore": "Lithium Ore", + "item.baseminerals.lithium_powder": "Powdered Lithium", + "item.baseminerals.lithium_smallpowder": "Small Pile of Powdered Lithium", + "block.baseminerals.niter_block": "Niter Block", + "block.baseminerals.niter_ore": "Niter Ore", + "item.baseminerals.niter_powder": "Powdered Niter", + "item.baseminerals.niter_smallpowder": "Small Pile of Powdered Niter", + "block.baseminerals.potash_block": "Potash Block", + "block.baseminerals.potash_ore": "Potash Ore", + "item.baseminerals.potash_powder": "Powdered Potash", + "item.baseminerals.potash_smallpowder": "Small Pile of Powdered Potash", + "block.baseminerals.phosphorus_block": "Phosphorus Block", + "block.baseminerals.phosphorus_ore": "Phosphorus Ore", + "item.baseminerals.phosphorus_powder": "Powdered Phosphorus", + "item.baseminerals.phosphorus_smallpowder": "Small Pile of Powdered Phosphorus", + "block.baseminerals.salt_block": "Salt Block", + "block.baseminerals.salt_ore": "Salt Ore", + "item.baseminerals.salt_powder": "Powdered Salt", + "item.baseminerals.salt_smallpowder": "Small Pile of Powdered Salt", + "block.baseminerals.saltpeter_block": "Saltpeter Block", + "block.baseminerals.saltpeter_ore": "Saltpeter Ore", + "item.baseminerals.saltpeter_powder": "Powdered Saltpeter", + "item.baseminerals.saltpeter_smallpowder": "Small Pile of Powdered Saltpeter", + "item.baseminerals.silicon_blend": "Silicon Blend", + "block.baseminerals.silicon_block": "Silicon Block", + "item.baseminerals.silicon_ingot": "Silicon Ingot", + "item.baseminerals.silicon_nugget": "Silicon Nugget", + "item.baseminerals.silicon_powder": "Powdered Silicon", + "item.baseminerals.silicon_smallblend": "Small Pile of Silicon Blend", + "item.baseminerals.silicon_smallpowder": "Small Pile of Powdered Silicon", + "block.baseminerals.sulfur_block": "Sulfur Block", + "block.baseminerals.sulfur_ore": "Sulfur Ore", + "item.baseminerals.sulfur_powder": "Powdered Sulfur", + "item.baseminerals.sulfur_smallpowder": "Small Pile of Powdered Sulfur", + "block.baseminerals.silicon": "Molten Silicon", + "block.baseminerals.lithium": "Molten Lithium", + "item.baseminerals.lithium_bucket": "Molten Lithium Bucket", + "item.baseminerals.silicon_bucket": "Molten Silicon Bucket", + "itemGroup.baseminerals": "Base Minerals" +} diff --git a/src/main/resources/assets/baseminerals/lang/ru_RU.lang b/src/main/resources/assets/baseminerals/lang/ru_RU.lang deleted file mode 100644 index 13c0dcc..0000000 --- a/src/main/resources/assets/baseminerals/lang/ru_RU.lang +++ /dev/null @@ -1,129 +0,0 @@ -# Base Minerals 1.12-2.5.0-beta2.11 -# Translated by Grey Mamon (grey.mamon@gmail.com) 11.28.2017 - -itemGroup.baseminerals.items=Base Minerals Предметы -itemGroup.baseminerals.tools=Base Инструменты -itemGroup.baseminerals.blocks=Base Minerals Блоки -nei.baseminerals.recipehandler.crusher.name=Дроблённые Блоки/Предметы - -item.baseminerals.charcoal_blend.name=Измельчённый Древесный Уголь -item.baseminerals.charcoal_block.name=Блок Древесного Угля -item.baseminerals.charcoal_ingot.name=Слиток Древесного Угля -item.baseminerals.charcoal_nugget.name=Самородок Древесного Угля -item.baseminerals.charcoal_ore.name=Руда Древесного Угля -item.baseminerals.charcoal_powder.name=Пыль Древесного Угля -item.baseminerals.charcoal_smallblend.name=Маленькая Кучка Измельчённого Древесного Угля -item.baseminerals.charcoal_smallpowder.name=Маленькая Кучка Пыли Древесного Угля - -item.baseminerals.lithium_blend.name=Измельчённый Литий -item.baseminerals.lithium_block.name=Блок Лития -item.baseminerals.lithium_ingot.name=Слиток Лития -item.baseminerals.lithium_nugget.name=Самородок Лития -item.baseminerals.lithium_ore.name=Руда Лития -item.baseminerals.lithium_powder.name=Пыль Лития -item.baseminerals.lithium_smallblend.name=Маленькая Кучка Измельчённого Лития -item.baseminerals.lithium_smallpowder.name=Маленькая Кучка Пыли Лития - -item.baseminerals.niter_blend.name=Измельчённый Нитрат -item.baseminerals.niter_block.name=Блок Нитрата -item.baseminerals.niter_ingot.name=Слиток Нитрата -item.baseminerals.niter_nugget.name=Самородок Нитрата -item.baseminerals.niter_ore.name=Руда Нитрата -item.baseminerals.niter_powder.name=Пыль Нитрата -item.baseminerals.niter_smallblend.name=Маленькая Кучка Измельчённого Нитрата -item.baseminerals.niter_smallpowder.name=Маленькая Кучка Нитратной Пыли - -item.baseminerals.potash_blend.name=Измельчённый Калий -item.baseminerals.potash_block.name=Блок Калия -item.baseminerals.potash_ingot.name=Слиток Калия -item.baseminerals.potash_nugget.name=Самородок Калия -item.baseminerals.potash_ore.name=Руда Калия -item.baseminerals.potash_powder.name=Пыль Калия -item.baseminerals.potash_smallblend.name=Маленькая Кучка Измельчённого Калия -item.baseminerals.potash_smallpowder.name=Маленькая Кучка Пыли Калия - -item.baseminerals.phosphorus_blend.name=Измельчённый Фосфор -item.baseminerals.phosphorus_block.name=Блок Фосфора -item.baseminerals.phosphorus_ingot.name=Слиток Фосфора -item.baseminerals.phosphorus_nugget.name=Самородок Фосфора -item.baseminerals.phosphorus_ore.name=Руда Фосфора -item.baseminerals.phosphorus_powder.name=Пыль Фосфора -item.baseminerals.phosphorus_smallblend.name=Маленькая Кучка Измельчённого Фосфора -item.baseminerals.phosphorus_smallpowder.name=Маленькая Кучка Фосфорной Пыли - -item.baseminerals.salt_blend.name=Соль -item.baseminerals.salt_block.name=Каменная Соли -item.baseminerals.salt_ingot.name=Слиток Соли -item.baseminerals.salt_nugget.name=Самородок Соли -item.baseminerals.salt_ore.name=Руда Соли -item.baseminerals.salt_powder.name=Соляная Пыль -item.baseminerals.salt_smallblend.name=Маленькая Кучка Измельчённой Соли -item.baseminerals.salt_smallpowder.name=Маленькая Кучка Солёной Пыли - -item.baseminerals.saltpeter_blend.name=Измельчённая Селитра -item.baseminerals.saltpeter_block.name=Блок Селитры -item.baseminerals.saltpeter_ingot.name=Слиток Селитры -item.baseminerals.saltpeter_nugget.name=Самородок Селитры -item.baseminerals.saltpeter_ore.name=Руда Селитры -item.baseminerals.saltpeter_powder.name=Пыль Селитры -item.baseminerals.saltpeter_smallblend.name=Маленькая Кучка Измельчённой Селитры -item.baseminerals.saltpeter_smallpowder.name=Маленькая Кучка Пыли Селитры - -item.baseminerals.silicon_blend.name=Измельчённый Силикон -item.baseminerals.silicon_block.name=Блок Силикона -item.baseminerals.silicon_ingot.name=Слиток Силикона -item.baseminerals.silicon_nugget.name=Самородок Силикона -item.baseminerals.silicon_ore.name=Руда Силикона -item.baseminerals.silicon_powder.name=Пыль Силикона -item.baseminerals.silicon_smallblend.name=Маленькая Кучка Измельчённого Силикона -item.baseminerals.silicon_smallpowder.name=Маленькая Кучка Силиконовой Пыли - -item.baseminerals.sulfur_blend.name=Измельчённая Сера -item.baseminerals.sulfur_block.name=Блок Серы -item.baseminerals.sulfur_ingot.name=Слиток Серы -item.baseminerals.sulfur_nugget.name=Самородок Серы -item.baseminerals.sulfur_ore.name=Руда Серы -item.baseminerals.sulfur_powder.name=Пыль Серы -item.baseminerals.sulfur_smallblend.name=Маленькая Кучка Измельчённой Серы -item.baseminerals.sulfur_smallpowder.name=Маленькая Кучка Серной Пыли - -tile.baseminerals.charcoal_block.name=Блок Древесного Угля -tile.baseminerals.charcoal_ore.name= Руда Древесного Угля - -tile.baseminerals.lithium_block.name=Блок Лития -tile.baseminerals.lithium_ore.name=Руда Лития - -tile.baseminerals.niter_block.name=Блок Селитры -tile.baseminerals.niter_ore.name=Руда Селитры - -tile.baseminerals.phosphorus_block.name=Блок Фосфора -tile.baseminerals.phosphorus_ore.name=Руда Фосфора - -tile.baseminerals.potash_block.name=Блок Калия -tile.baseminerals.potash_ore.name=Руда Калия - -tile.baseminerals.salt_block.name=Блок Соли -tile.baseminerals.salt_ore.name=Руда Соли - -tile.baseminerals.saltpeter_block.name=Блок Селитры -tile.baseminerals.saltpeter_ore.name=Руда Селитры - -tile.baseminerals.silicon_block.name=Блок Силикона -tile.baseminerals.silicon_ore.name=Руда Силикона -tile.baseminerals.silicon.name=Расплавленный Силикон - -tile.baseminerals.sulfur_block.name=Блок Серы -tile.baseminerals.sulfur_ore.name=Руда Серы - -tooltip.charcoal.tool=Ничего Особенного - -tooltip.charcoal.armor=Ничего Особенного - -achievement.charcoal_maker=Древесный Уголь -achievement.charcoal_maker.desc=Объедините Пыль ??? и ??? чтобы создать ??? - -fluid.baseminerals.lithium=Расплавленный Литий -fluid.baseminerals.silicon=Расплавленный Силикон - -tile.baseminerals.lithium.name=Расплавленный Литий -tile.baseminerals.lithium.name=Расплавленный Силикон diff --git a/src/main/resources/assets/baseminerals/lang/ru_ru.json b/src/main/resources/assets/baseminerals/lang/ru_ru.json new file mode 100644 index 0000000..410a27f --- /dev/null +++ b/src/main/resources/assets/baseminerals/lang/ru_ru.json @@ -0,0 +1,41 @@ +{ + "block.baseminerals.lithium_block": "Блок Лития", + "item.baseminerals.lithium_ingot": "Слиток Лития", + "item.baseminerals.lithium_nugget": "Самородок Лития", + "block.baseminerals.lithium_ore": "Руда Лития", + "item.baseminerals.lithium_powder": "Пыль Лития", + "item.baseminerals.lithium_smallpowder": "Маленькая Кучка Пыли Лития", + "block.baseminerals.niter_block": "Блок Селитры", + "block.baseminerals.niter_ore": "Руда Селитры", + "item.baseminerals.niter_powder": "Пыль Нитрата", + "item.baseminerals.niter_smallpowder": "Маленькая Кучка Нитратной Пыли", + "block.baseminerals.potash_block": "Блок Калия", + "block.baseminerals.potash_ore": "Руда Калия", + "item.baseminerals.potash_powder": "Пыль Калия", + "item.baseminerals.potash_smallpowder": "Маленькая Кучка Пыли Калия", + "block.baseminerals.phosphorus_block": "Блок Фосфора", + "block.baseminerals.phosphorus_ore": "Руда Фосфора", + "item.baseminerals.phosphorus_powder": "Пыль Фосфора", + "item.baseminerals.phosphorus_smallpowder": "Маленькая Кучка Фосфорной Пыли", + "block.baseminerals.salt_block": "Блок Соли", + "block.baseminerals.salt_ore": "Руда Соли", + "item.baseminerals.salt_powder": "Соляная Пыль", + "item.baseminerals.salt_smallpowder": "Маленькая Кучка Солёной Пыли", + "block.baseminerals.saltpeter_block": "Блок Селитры", + "block.baseminerals.saltpeter_ore": "Руда Селитры", + "item.baseminerals.saltpeter_powder": "Пыль Селитры", + "item.baseminerals.saltpeter_smallpowder": "Маленькая Кучка Пыли Селитры", + "item.baseminerals.silicon_blend": "Измельчённый Силикон", + "block.baseminerals.silicon_block": "Блок Силикона", + "item.baseminerals.silicon_ingot": "Слиток Силикона", + "item.baseminerals.silicon_nugget": "Самородок Силикона", + "item.baseminerals.silicon_powder": "Пыль Силикона", + "item.baseminerals.silicon_smallblend": "Маленькая Кучка Измельчённого Силикона", + "item.baseminerals.silicon_smallpowder": "Маленькая Кучка Силиконовой Пыли", + "block.baseminerals.sulfur_block": "Блок Серы", + "block.baseminerals.sulfur_ore": "Руда Серы", + "item.baseminerals.sulfur_powder": "Пыль Серы", + "item.baseminerals.sulfur_smallpowder": "Маленькая Кучка Серной Пыли", + "block.baseminerals.silicon": "Расплавленный Силикон", + "block.baseminerals.lithium": "Расплавленный Силикон" +} diff --git a/src/main/resources/assets/baseminerals/models/block/lithium_molten.json b/src/main/resources/assets/baseminerals/models/block/lithium_molten.json new file mode 100644 index 0000000..294aa9c --- /dev/null +++ b/src/main/resources/assets/baseminerals/models/block/lithium_molten.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "baseminerals:blocks/molten_metal_still" + } +} diff --git a/src/main/resources/assets/baseminerals/models/block/silicon_molten.json b/src/main/resources/assets/baseminerals/models/block/silicon_molten.json new file mode 100644 index 0000000..294aa9c --- /dev/null +++ b/src/main/resources/assets/baseminerals/models/block/silicon_molten.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "baseminerals:blocks/molten_metal_still" + } +} diff --git a/src/main/resources/assets/baseminerals/models/item/lithium.json b/src/main/resources/assets/baseminerals/models/item/lithium.json new file mode 100644 index 0000000..a36bdad --- /dev/null +++ b/src/main/resources/assets/baseminerals/models/item/lithium.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "baseminerals:blocks/molten_metal_still" + } +} diff --git a/src/main/resources/assets/baseminerals/models/item/lithium_bucket.json b/src/main/resources/assets/baseminerals/models/item/lithium_bucket.json new file mode 100644 index 0000000..12449e6 --- /dev/null +++ b/src/main/resources/assets/baseminerals/models/item/lithium_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lava_bucket" + } +} diff --git a/src/main/resources/assets/baseminerals/models/item/silicon.json b/src/main/resources/assets/baseminerals/models/item/silicon.json new file mode 100644 index 0000000..a36bdad --- /dev/null +++ b/src/main/resources/assets/baseminerals/models/item/silicon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "baseminerals:blocks/molten_metal_still" + } +} diff --git a/src/main/resources/assets/baseminerals/models/item/silicon_bucket.json b/src/main/resources/assets/baseminerals/models/item/silicon_bucket.json new file mode 100644 index 0000000..12449e6 --- /dev/null +++ b/src/main/resources/assets/baseminerals/models/item/silicon_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lava_bucket" + } +} diff --git a/src/main/resources/assets/baseminerals/recipes/_factories.json b/src/main/resources/assets/baseminerals/recipes/_factories.json deleted file mode 100644 index f5cc434..0000000 --- a/src/main/resources/assets/baseminerals/recipes/_factories.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "conditions": { - "material_enabled": "zone.moddev.mc.baseminerals.init.MaterialEnabledCondition" - } -} diff --git a/src/main/resources/assets/baseminerals/recipes/gunpowder_charcoal_potash.json b/src/main/resources/assets/baseminerals/recipes/gunpowder_charcoal_potash.json deleted file mode 100644 index b6b5c5f..0000000 --- a/src/main/resources/assets/baseminerals/recipes/gunpowder_charcoal_potash.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustCharcoal" - }, - { - "type": "forge:ore_dict", - "ore": "dustSulfur" - }, - { - "type": "forge:ore_dict", - "ore": "dustPotash" - } - ], - "result": { - "type": "minecraft:item", - "item": "minecraft:gunpowder", - "count": 3 - }, - "group": "baseminerals_extra", - "conditions": [ - { - "type": "baseminerals:material_enabled", - "material": "sulfur" - }, - { - "type": "baseminerals:material_enabled", - "material": "potash" - }, - { - "type": "baseminerals:material_enabled", - "material": "charcoal" - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/gunpowder_charcoal_saltpeter.json b/src/main/resources/assets/baseminerals/recipes/gunpowder_charcoal_saltpeter.json deleted file mode 100644 index 937f026..0000000 --- a/src/main/resources/assets/baseminerals/recipes/gunpowder_charcoal_saltpeter.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustCharcoal" - }, - { - "type": "forge:ore_dict", - "ore": "dustSulfur" - }, - { - "type": "forge:ore_dict", - "ore": "dustSaltpeter" - } - ], - "result": { - "type": "minecraft:item", - "item": "minecraft:gunpowder", - "count": 3 - }, - "group": "baseminerals_extra", - "conditions": [ - { - "type": "baseminerals:material_enabled", - "material": "sulfur" - }, - { - "type": "baseminerals:material_enabled", - "material": "saltpeter" - }, - { - "type": "baseminerals:material_enabled", - "material": "charcoal" - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/gunpowder_coal_potash.json b/src/main/resources/assets/baseminerals/recipes/gunpowder_coal_potash.json deleted file mode 100644 index f0988e1..0000000 --- a/src/main/resources/assets/baseminerals/recipes/gunpowder_coal_potash.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustCoal" - }, - { - "type": "forge:ore_dict", - "ore": "dustSulfur" - }, - { - "type": "forge:ore_dict", - "ore": "dustPotash" - } - ], - "result": { - "type": "minecraft:item", - "item": "minecraft:gunpowder", - "count": 3 - }, - "group": "baseminerals_extra", - "conditions": [ - { - "type": "baseminerals:material_enabled", - "material": "sulfur" - }, - { - "type": "baseminerals:material_enabled", - "material": "potash" - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/gunpowder_coal_saltpeter.json b/src/main/resources/assets/baseminerals/recipes/gunpowder_coal_saltpeter.json deleted file mode 100644 index e719fe1..0000000 --- a/src/main/resources/assets/baseminerals/recipes/gunpowder_coal_saltpeter.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustCoal" - }, - { - "type": "forge:ore_dict", - "ore": "dustSulfur" - }, - { - "type": "forge:ore_dict", - "ore": "dustSaltpeter" - } - ], - "result": { - "type": "minecraft:item", - "item": "minecraft:gunpowder", - "count": 3 - }, - "group": "baseminerals_extra", - "conditions": [ - { - "type": "baseminerals:material_enabled", - "material": "sulfur" - }, - { - "type": "baseminerals:material_enabled", - "material": "saltpeter" - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/lithium_block.json b/src/main/resources/assets/baseminerals/recipes/lithium_block.json deleted file mode 100644 index efe40e6..0000000 --- a/src/main/resources/assets/baseminerals/recipes/lithium_block.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:lithium_block", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Lithium" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustLithium" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/lithium_block_powder.json b/src/main/resources/assets/baseminerals/recipes/lithium_block_powder.json deleted file mode 100644 index ee2e68e..0000000 --- a/src/main/resources/assets/baseminerals/recipes/lithium_block_powder.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "blockLithium" - } - ], - "result": { - "item": "baseminerals:lithium_powder", - "count": 9 - }, - "group": "basics", - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Lithium" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "basics" - } - ] - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/lithium_powder.json b/src/main/resources/assets/baseminerals/recipes/lithium_powder.json deleted file mode 100644 index f95c141..0000000 --- a/src/main/resources/assets/baseminerals/recipes/lithium_powder.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:lithium_powder", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Lithium" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustTinyLithium" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/lithium_smallpowder.json b/src/main/resources/assets/baseminerals/recipes/lithium_smallpowder.json deleted file mode 100644 index c7b1fbc..0000000 --- a/src/main/resources/assets/baseminerals/recipes/lithium_smallpowder.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:lithium_smallpowder", - "data": 0, - "count": 9 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Lithium" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "SmallDust" - } - ] - } - ], - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustLithium" - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/niter_block.json b/src/main/resources/assets/baseminerals/recipes/niter_block.json deleted file mode 100644 index c5bd00c..0000000 --- a/src/main/resources/assets/baseminerals/recipes/niter_block.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:niter_block", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Niter" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustNiter" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/niter_block_powder.json b/src/main/resources/assets/baseminerals/recipes/niter_block_powder.json deleted file mode 100644 index c11edea..0000000 --- a/src/main/resources/assets/baseminerals/recipes/niter_block_powder.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "blockNiter" - } - ], - "result": { - "item": "baseminerals:niter_powder", - "count": 9 - }, - "group": "basics", - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Niter" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "basics" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/niter_powder.json b/src/main/resources/assets/baseminerals/recipes/niter_powder.json deleted file mode 100644 index 3f1af8e..0000000 --- a/src/main/resources/assets/baseminerals/recipes/niter_powder.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:niter_powder", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Niter" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustTinyNiter" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/niter_smallpowder.json b/src/main/resources/assets/baseminerals/recipes/niter_smallpowder.json deleted file mode 100644 index 4a3492e..0000000 --- a/src/main/resources/assets/baseminerals/recipes/niter_smallpowder.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:niter_smallpowder", - "data": 0, - "count": 9 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Niter" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "SmallDust" - } - ] - } - ], - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustNiter" - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/phosphorus_block.json b/src/main/resources/assets/baseminerals/recipes/phosphorus_block.json deleted file mode 100644 index 68f7016..0000000 --- a/src/main/resources/assets/baseminerals/recipes/phosphorus_block.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:phosphorus_block", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Phosphorus" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustPhosphorus" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/phosphorus_block_powder.json b/src/main/resources/assets/baseminerals/recipes/phosphorus_block_powder.json deleted file mode 100644 index 2dae657..0000000 --- a/src/main/resources/assets/baseminerals/recipes/phosphorus_block_powder.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "blockPhosphorus" - } - ], - "result": { - "item": "baseminerals:phosphorus_powder", - "count": 9 - }, - "group": "basics", - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Phosphorus" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "basics" - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/phosphorus_powder.json b/src/main/resources/assets/baseminerals/recipes/phosphorus_powder.json deleted file mode 100644 index 29f50ac..0000000 --- a/src/main/resources/assets/baseminerals/recipes/phosphorus_powder.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:phosphorus_powder", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Phosphorus" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustTinyPhosphorus" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/phosphorus_smallpowder.json b/src/main/resources/assets/baseminerals/recipes/phosphorus_smallpowder.json deleted file mode 100644 index d67c2c1..0000000 --- a/src/main/resources/assets/baseminerals/recipes/phosphorus_smallpowder.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:phosphorus_smallpowder", - "data": 0, - "count": 9 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Phosphorus" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "SmallDust" - } - ] - } - ], - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustPhosphorus" - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/potash_block.json b/src/main/resources/assets/baseminerals/recipes/potash_block.json deleted file mode 100644 index 816b894..0000000 --- a/src/main/resources/assets/baseminerals/recipes/potash_block.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:potash_block", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Potash" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustPotash" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/potash_block_powder.json b/src/main/resources/assets/baseminerals/recipes/potash_block_powder.json deleted file mode 100644 index 368c3e4..0000000 --- a/src/main/resources/assets/baseminerals/recipes/potash_block_powder.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "blockPotash" - } - ], - "result": { - "item": "baseminerals:potash_powder", - "count": 9 - }, - "group": "basics", - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Potash" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "basics" - } - ] - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/potash_powder.json b/src/main/resources/assets/baseminerals/recipes/potash_powder.json deleted file mode 100644 index 871ae16..0000000 --- a/src/main/resources/assets/baseminerals/recipes/potash_powder.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:potash_powder", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Potash" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustTinyPotash" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/potash_smallpowder.json b/src/main/resources/assets/baseminerals/recipes/potash_smallpowder.json deleted file mode 100644 index 0365136..0000000 --- a/src/main/resources/assets/baseminerals/recipes/potash_smallpowder.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:potash_smallpowder", - "data": 0, - "count": 9 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Potash" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "SmallDust" - } - ] - } - ], - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustPotash" - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/salt_block.json b/src/main/resources/assets/baseminerals/recipes/salt_block.json deleted file mode 100644 index ac7bb5d..0000000 --- a/src/main/resources/assets/baseminerals/recipes/salt_block.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:salt_block", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Salt" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustSalt" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/salt_block_powder.json b/src/main/resources/assets/baseminerals/recipes/salt_block_powder.json deleted file mode 100644 index a6dd7da..0000000 --- a/src/main/resources/assets/baseminerals/recipes/salt_block_powder.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "blockSalt" - } - ], - "result": { - "item": "baseminerals:salt_powder", - "count": 9 - }, - "group": "basics", - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Salt" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "basics" - } - ] - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/salt_powder.json b/src/main/resources/assets/baseminerals/recipes/salt_powder.json deleted file mode 100644 index 565fbdc..0000000 --- a/src/main/resources/assets/baseminerals/recipes/salt_powder.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:salt_powder", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Salt" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustTinySalt" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/salt_smallpowder.json b/src/main/resources/assets/baseminerals/recipes/salt_smallpowder.json deleted file mode 100644 index 0f7a180..0000000 --- a/src/main/resources/assets/baseminerals/recipes/salt_smallpowder.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:salt_smallpowder", - "data": 0, - "count": 9 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Salt" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "SmallDust" - } - ] - } - ], - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustSalt" - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/saltpeter_block.json b/src/main/resources/assets/baseminerals/recipes/saltpeter_block.json deleted file mode 100644 index 0455bbd..0000000 --- a/src/main/resources/assets/baseminerals/recipes/saltpeter_block.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:saltpeter_block", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Saltpeter" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustSaltpeter" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/saltpeter_block_powder.json b/src/main/resources/assets/baseminerals/recipes/saltpeter_block_powder.json deleted file mode 100644 index 709c239..0000000 --- a/src/main/resources/assets/baseminerals/recipes/saltpeter_block_powder.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "blockSaltpeter" - } - ], - "result": { - "item": "baseminerals:saltpeter_powder", - "count": 9 - }, - "group": "basics", - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Saltpeter" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "basics" - } - ] - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/saltpeter_powder.json b/src/main/resources/assets/baseminerals/recipes/saltpeter_powder.json deleted file mode 100644 index 1bd8171..0000000 --- a/src/main/resources/assets/baseminerals/recipes/saltpeter_powder.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:saltpeter_powder", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Saltpeter" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustTinySaltpeter" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/saltpeter_smallpowder.json b/src/main/resources/assets/baseminerals/recipes/saltpeter_smallpowder.json deleted file mode 100644 index 399ca40..0000000 --- a/src/main/resources/assets/baseminerals/recipes/saltpeter_smallpowder.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:saltpeter_smallpowder", - "data": 0, - "count": 9 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Saltpeter" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "SmallDust" - } - ] - } - ], - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustSaltpeter" - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_blend_sand_charcoal.json b/src/main/resources/assets/baseminerals/recipes/silicon_blend_sand_charcoal.json deleted file mode 100644 index 3b5296d..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_blend_sand_charcoal.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "sand" - }, - { - "type": "forge:ore_dict", - "ore": "dustCharcoal" - } - ], - "result": { - "type": "minecraft:item", - "item": "baseminerals:silicon_blend", - "count": 3 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - }, - { - "type": "baseminerals:material_enabled", - "material": "charcoal" - } - ], - "group": "baseminerals_extra" -} diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_blend_sand_coal.json b/src/main/resources/assets/baseminerals/recipes/silicon_blend_sand_coal.json deleted file mode 100644 index b5475ca..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_blend_sand_coal.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "sand" - }, - { - "type": "forge:ore_dict", - "ore": "dustCoal" - } - ], - "result": { - "type": "minecraft:item", - "item": "baseminerals:silicon_blend", - "count": 3 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "group": "baseminerals_extra" -} diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_blend_smallblend.json b/src/main/resources/assets/baseminerals/recipes/silicon_blend_smallblend.json deleted file mode 100644 index f869d92..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_blend_smallblend.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:silicon_blend", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "SmallDust" - } - ] - } - ], - "key": { - "x": { - "type": "minecraft:item", - "item": "baseminerals:silicon_smallblend" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_block.json b/src/main/resources/assets/baseminerals/recipes/silicon_block.json deleted file mode 100644 index 99dc962..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_block.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:silicon_block", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "ingotSilicon" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_block_powder.json b/src/main/resources/assets/baseminerals/recipes/silicon_block_powder.json deleted file mode 100644 index 0fef8dc..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_block_powder.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "blockSilicon" - } - ], - "result": { - "item": "baseminerals:silicon_powder", - "count": 9 - }, - "group": "basics", - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "basics" - } - ] - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_charcoal.json b/src/main/resources/assets/baseminerals/recipes/silicon_charcoal.json deleted file mode 100644 index 2333cea..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_charcoal.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustCharcoal" - }, - { - "type": "forge:ore_dict", - "ore": "sand" - } - ], - "result": { - "type": "minecraft:item", - "item": "baseminerals:silicon_blend" - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - }, - { - "type": "baseminerals:material_enabled", - "material": "charcoal" - } - ], - "group": "baseminerals_extra" -} diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_coal.json b/src/main/resources/assets/baseminerals/recipes/silicon_coal.json deleted file mode 100644 index 3765907..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_coal.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustCoal" - }, - { - "type": "forge:ore_dict", - "ore": "sand" - } - ], - "result": { - "type": "minecraft:item", - "item": "baseminerals:silicon_blend" - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "group": "baseminerals_extra" -} diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_ingot.json b/src/main/resources/assets/baseminerals/recipes/silicon_ingot.json deleted file mode 100644 index 2e8b03f..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_ingot.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:silicon_ingot", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "nuggetSilicon" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_nugget.json b/src/main/resources/assets/baseminerals/recipes/silicon_nugget.json deleted file mode 100644 index 347d772..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_nugget.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:silicon_nugget", - "data": 0, - "count": 9 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "ingotSilicon" - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_powder.json b/src/main/resources/assets/baseminerals/recipes/silicon_powder.json deleted file mode 100644 index bedc020..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_powder.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:silicon_powder", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustSmallSilicon" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_smallblend_blend.json b/src/main/resources/assets/baseminerals/recipes/silicon_smallblend_blend.json deleted file mode 100644 index 510bb89..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_smallblend_blend.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:silicon_smallblend", - "data": 0, - "count": 9 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "SmallDust" - } - ] - } - ], - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustSilicon" - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/baseminerals/recipes/silicon_smallpowder.json b/src/main/resources/assets/baseminerals/recipes/silicon_smallpowder.json deleted file mode 100644 index 3386d81..0000000 --- a/src/main/resources/assets/baseminerals/recipes/silicon_smallpowder.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:silicon_smallpowder", - "data": 0, - "count": 9 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Silicon" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "SmallDust" - } - ] - } - ], - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustSilicon" - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/sulfur_block.json b/src/main/resources/assets/baseminerals/recipes/sulfur_block.json deleted file mode 100644 index d52f1ab..0000000 --- a/src/main/resources/assets/baseminerals/recipes/sulfur_block.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:sulfur_block", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Sulfur" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustSulfur" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/sulfur_block_powder.json b/src/main/resources/assets/baseminerals/recipes/sulfur_block_powder.json deleted file mode 100644 index d0b5d6f..0000000 --- a/src/main/resources/assets/baseminerals/recipes/sulfur_block_powder.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "blockSulfur" - } - ], - "result": { - "item": "baseminerals:sulfur_powder", - "count": 9 - }, - "group": "basics", - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Sulfur" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "basics" - } - ] - } - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/sulfur_powder.json b/src/main/resources/assets/baseminerals/recipes/sulfur_powder.json deleted file mode 100644 index f8bc1bc..0000000 --- a/src/main/resources/assets/baseminerals/recipes/sulfur_powder.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "type": "forge:ore_shaped", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:sulfur_powder", - "data": 0 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Sulfur" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "Basics" - } - ] - } - ], - "key": { - "x": { - "type": "forge:ore_dict", - "ore": "dustTinySulfur" - } - }, - "pattern": [ - "xxx", - "xxx", - "xxx" - ] -} diff --git a/src/main/resources/assets/baseminerals/recipes/sulfur_smallpowder.json b/src/main/resources/assets/baseminerals/recipes/sulfur_smallpowder.json deleted file mode 100644 index 5d56b55..0000000 --- a/src/main/resources/assets/baseminerals/recipes/sulfur_smallpowder.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "type": "forge:ore_shapeless", - "group": "basics", - "result": { - "type": "minecraft:item", - "item": "baseminerals:sulfur_smallpowder", - "data": 0, - "count": 9 - }, - "conditions": [ - { - "type": "forge:and", - "values": [ - { - "type": "mmdlib:enabled", - "optionName": "material", - "optionValue": "Sulfur" - }, - { - "type": "mmdlib:enabled", - "optionName": "thing", - "optionValue": "SmallDust" - } - ] - } - ], - "ingredients": [ - { - "type": "forge:ore_dict", - "ore": "dustSulfur" - } - ] -} diff --git a/src/main/resources/coremods/baseminerals_legacy_world_upgrade.js b/src/main/resources/coremods/baseminerals_legacy_world_upgrade.js new file mode 100644 index 0000000..0d7ac05 --- /dev/null +++ b/src/main/resources/coremods/baseminerals_legacy_world_upgrade.js @@ -0,0 +1,212 @@ +var Opcodes = Java.type('org.objectweb.asm.Opcodes'); +var InsnNode = Java.type('org.objectweb.asm.tree.InsnNode'); +var InsnList = Java.type('org.objectweb.asm.tree.InsnList'); +var JumpInsnNode = Java.type('org.objectweb.asm.tree.JumpInsnNode'); +var LabelNode = Java.type('org.objectweb.asm.tree.LabelNode'); +var MethodInsnNode = Java.type('org.objectweb.asm.tree.MethodInsnNode'); +var VarInsnNode = Java.type('org.objectweb.asm.tree.VarInsnNode'); +var UPGRADE = 'zone/moddev/mc/baseminerals/migration/LegacyWorldUpgrade'; +var NBT = 'Lnet/minecraft/nbt/NBTTagCompound;'; +var FIX_ARGS = '(Lcom/mojang/datafixers/DataFixer;Lcom/mojang/datafixers/DSL$TypeReference;' + NBT; + +function call(name, descriptor) { + return new MethodInsnNode(Opcodes.INVOKESTATIC, UPGRADE, name, descriptor, false); +} + +function previousOpcode(insn) { + var previous = insn.getPrevious(); + while (previous !== null && previous.getOpcode() < 0) previous = previous.getPrevious(); + return previous; +} + +function isNbtRead(insn) { + var previous = previousOpcode(insn); + return insn.getOpcode() === Opcodes.ASTORE && previous !== null + && previous.getOpcode() === Opcodes.INVOKESTATIC + && previous.owner === 'net/minecraft/nbt/CompressedStreamTools' + && previous.desc.endsWith(')' + NBT); +} + +function initializeCoreMod() { + return { + 'baseminerals_forge25_leaves_fixer': { + 'target': { 'type': 'CLASS', 'name': 'net.minecraft.util.datafix.fixes.LeavesFix$Section' }, + 'transformer': function(classNode) { + var patched = false; + for (var i = 0; i < classNode.methods.size(); ++i) { + var method = classNode.methods.get(i); + if (method.desc !== '(Lcom/mojang/datafixers/Typed;)Lcom/mojang/datafixers/Typed;') continue; + for (var instruction = method.instructions.getFirst(); instruction !== null; + instruction = instruction.getNext()) { + // Some Forge installations already contain the corrected erased overload. + if (instruction.getOpcode() === Opcodes.INVOKEVIRTUAL + && instruction.owner === 'com/mojang/datafixers/Typed' && instruction.name === 'set' + && instruction.desc === '(Lcom/mojang/datafixers/OpticFinder;' + + 'Ljava/lang/Object;)Lcom/mojang/datafixers/Typed;') { + patched = true; + continue; + } + if (instruction.getOpcode() !== Opcodes.CHECKCAST + || instruction.desc !== 'com/mojang/datafixers/Typed') continue; + var call = instruction.getNext(); + while (call !== null && call.getOpcode() < 0) call = call.getNext(); + if (call === null || call.getOpcode() !== Opcodes.INVOKEVIRTUAL + || call.owner !== 'com/mojang/datafixers/Typed' || call.name !== 'set' + || call.desc !== '(Lcom/mojang/datafixers/OpticFinder;' + + 'Lcom/mojang/datafixers/Typed;)Lcom/mojang/datafixers/Typed;') continue; + method.instructions.remove(instruction); + call.desc = '(Lcom/mojang/datafixers/OpticFinder;' + + 'Ljava/lang/Object;)Lcom/mojang/datafixers/Typed;'; + patched = true; + break; + } + } + if (!patched) throw new Error('Base Minerals could not repair the Forge 25 leaves data fixer'); + return classNode; + } + }, + 'baseminerals_numeric_states': { + 'target': { 'type': 'CLASS', 'name': 'net.minecraft.util.datafix.fixes.BlockStateFlatteningMap' }, + 'transformer': function(node) { + var descriptor = '(I)Lcom/mojang/datafixers/Dynamic;'; + for (var i = 0; i < node.methods.size(); i++) { + var method = node.methods.get(i); + if (method.desc !== descriptor) continue; + var vanilla = new LabelNode(); + var prefix = new InsnList(); + prefix.add(new VarInsnNode(Opcodes.ILOAD, 0)); + prefix.add(call('mineralState', descriptor)); + prefix.add(new InsnNode(Opcodes.DUP)); + prefix.add(new JumpInsnNode(Opcodes.IFNULL, vanilla)); + prefix.add(new InsnNode(Opcodes.ARETURN)); + prefix.add(vanilla); + prefix.add(new InsnNode(Opcodes.POP)); + method.instructions.insert(prefix); + return node; + } + throw new Error('Base Minerals could not find the Forge 25 numeric state converter'); + } + }, + 'baseminerals_save_registry': { + 'target': { 'type': 'CLASS', 'name': 'net.minecraft.world.storage.SaveFormatOld' }, + 'transformer': function(node) { + var descriptor = '(Ljava/io/File;Lcom/mojang/datafixers/DataFixer;' + + 'Lnet/minecraft/world/storage/SaveHandler;)Lnet/minecraft/world/storage/WorldInfo;'; + for (var i = 0; i < node.methods.size(); i++) { + var method = node.methods.get(i); + if (method.desc !== descriptor) continue; + for (var insn = method.instructions.getFirst(); insn !== null; insn = insn.getNext()) { + if (!isNbtRead(insn)) continue; + var prepare = new InsnList(); + prepare.add(new VarInsnNode(Opcodes.ALOAD, insn.var)); + prepare.add(new VarInsnNode(Opcodes.ALOAD, 0)); + prepare.add(new VarInsnNode(Opcodes.ALOAD, 2)); + prepare.add(call('prepareWorld', '(' + NBT + + 'Ljava/io/File;Lnet/minecraft/world/storage/SaveHandler;)V')); + method.instructions.insert(insn, prepare); + return node; + } + } + throw new Error('Base Minerals could not find the Forge 25 world registry reader'); + } + }, + 'baseminerals_chunk_upgrade': { + 'target': { 'type': 'CLASS', 'name': 'net.minecraft.world.chunk.storage.AnvilChunkLoader' }, + 'transformer': function(node) { + var descriptor = '(Lnet/minecraft/world/dimension/DimensionType;' + + 'Lnet/minecraft/world/storage/WorldSavedDataStorage;II)' + NBT; + var patched = 0; + for (var i = 0; i < node.methods.size(); i++) { + var method = node.methods.get(i); + if (method.desc !== descriptor) continue; + for (var insn = method.instructions.getFirst(); insn !== null; ) { + var next = insn.getNext(); + if (insn.getOpcode() === Opcodes.INVOKESTATIC && insn.owner === 'net/minecraft/nbt/NBTUtil') { + if (insn.desc === FIX_ARGS + 'II)' + NBT) { + method.instructions.insertBefore(insn, new VarInsnNode(Opcodes.ALOAD, 0)); + method.instructions.set(insn, call('fixChunk', FIX_ARGS + + 'IILnet/minecraft/world/chunk/storage/AnvilChunkLoader;)' + NBT)); + patched++; + } else if (insn.desc === FIX_ARGS + 'I)' + NBT) { + method.instructions.set(insn, call('finishChunk', FIX_ARGS + 'I)' + NBT)); + patched++; + } + } + insn = next; + } + } + if (patched !== 2) throw new Error('Base Minerals could not wrap both Forge 25 chunk upgrades'); + return node; + } + }, + 'baseminerals_player_upgrade': { + 'target': { 'type': 'CLASS', 'name': 'net.minecraft.world.storage.SaveHandler' }, + 'transformer': function(node) { + var patched = 0; + for (var i = 0; i < node.methods.size(); i++) { + var method = node.methods.get(i); + for (var insn = method.instructions.getFirst(); insn !== null; insn = insn.getNext()) { + if (!isNbtRead(insn)) continue; + var prepare = new InsnList(); + prepare.add(new VarInsnNode(Opcodes.ALOAD, insn.var)); + prepare.add(call('migrateItems', '(Lnet/minecraft/nbt/INBTBase;)V')); + method.instructions.insert(insn, prepare); + patched++; + } + } + if (patched === 0) throw new Error('Base Minerals could not find the Forge 25 player data reader'); + return node; + } + }, + 'baseminerals_molten_mineral_renderer': { + 'target': { 'type': 'CLASS', 'name': 'net.minecraft.client.renderer.BlockFluidRenderer' }, + 'transformer': function(classNode) { + var descriptor = '(Lnet/minecraft/world/IWorldReader;Lnet/minecraft/util/math/BlockPos;' + + 'Lnet/minecraft/client/renderer/BufferBuilder;Lnet/minecraft/fluid/IFluidState;)Z'; + for (var i = 0; i < classNode.methods.size(); ++i) { + var method = classNode.methods.get(i); + if (method.desc !== descriptor) continue; + var flag = false, sprites = false, color = false; + for (var instruction = method.instructions.getFirst(); instruction !== null; + instruction = instruction.getNext()) { + if (!flag && instruction.getOpcode() === Opcodes.ISTORE && instruction.var === 5) { + var hookFlag = new InsnList(); + hookFlag.add(new VarInsnNode(Opcodes.ALOAD, 4)); + hookFlag.add(new VarInsnNode(Opcodes.ILOAD, 5)); + hookFlag.add(new MethodInsnNode(Opcodes.INVOKESTATIC, + 'zone/moddev/mc/baseminerals/client/MineralFluidRenderer', + 'useOpaqueFluidPath', '(Lnet/minecraft/fluid/IFluidState;Z)Z', false)); + hookFlag.add(new VarInsnNode(Opcodes.ISTORE, 5)); + method.instructions.insert(instruction, hookFlag); + flag = true; + } else if (!sprites && instruction.getOpcode() === Opcodes.ASTORE && instruction.var === 6) { + var hookSprites = new InsnList(); + hookSprites.add(new VarInsnNode(Opcodes.ALOAD, 4)); + hookSprites.add(new VarInsnNode(Opcodes.ALOAD, 6)); + hookSprites.add(new MethodInsnNode(Opcodes.INVOKESTATIC, + 'zone/moddev/mc/baseminerals/client/MineralFluidRenderer', + 'overrideSprites', + '(Lnet/minecraft/fluid/IFluidState;[Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;)' + + '[Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;', false)); + hookSprites.add(new VarInsnNode(Opcodes.ASTORE, 6)); + method.instructions.insert(instruction, hookSprites); + sprites = true; + } else if (!color && instruction.getOpcode() === Opcodes.ISTORE && instruction.var === 7) { + var hookColor = new InsnList(); + hookColor.add(new VarInsnNode(Opcodes.ALOAD, 4)); + hookColor.add(new VarInsnNode(Opcodes.ILOAD, 7)); + hookColor.add(new MethodInsnNode(Opcodes.INVOKESTATIC, + 'zone/moddev/mc/baseminerals/client/MineralFluidRenderer', + 'overrideColor', '(Lnet/minecraft/fluid/IFluidState;I)I', false)); + hookColor.add(new VarInsnNode(Opcodes.ISTORE, 7)); + method.instructions.insert(instruction, hookColor); + color = true; + } + } + if (!flag || !sprites || !color) throw new Error('Base Minerals could not patch the Forge 25 fluid renderer'); + } + return classNode; + } + } + }; +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/lithium_block.json b/src/main/resources/data/baseminerals/loot_tables/blocks/lithium_block.json new file mode 100644 index 0000000..f58fba8 --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/lithium_block.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:lithium_block" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/lithium_ore.json b/src/main/resources/data/baseminerals/loot_tables/blocks/lithium_ore.json new file mode 100644 index 0000000..657a550 --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/lithium_ore.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:lithium_ore" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/niter_block.json b/src/main/resources/data/baseminerals/loot_tables/blocks/niter_block.json new file mode 100644 index 0000000..0c7314d --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/niter_block.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:niter_block" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/niter_ore.json b/src/main/resources/data/baseminerals/loot_tables/blocks/niter_ore.json new file mode 100644 index 0000000..4539ab1 --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/niter_ore.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:niter_ore" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/phosphorus_block.json b/src/main/resources/data/baseminerals/loot_tables/blocks/phosphorus_block.json new file mode 100644 index 0000000..7cbca1b --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/phosphorus_block.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:phosphorus_block" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/phosphorus_ore.json b/src/main/resources/data/baseminerals/loot_tables/blocks/phosphorus_ore.json new file mode 100644 index 0000000..14e4fae --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/phosphorus_ore.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:phosphorus_ore" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/potash_block.json b/src/main/resources/data/baseminerals/loot_tables/blocks/potash_block.json new file mode 100644 index 0000000..2b62210 --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/potash_block.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:potash_block" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/potash_ore.json b/src/main/resources/data/baseminerals/loot_tables/blocks/potash_ore.json new file mode 100644 index 0000000..ac6bf33 --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/potash_ore.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:potash_ore" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/salt_block.json b/src/main/resources/data/baseminerals/loot_tables/blocks/salt_block.json new file mode 100644 index 0000000..abd3801 --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/salt_block.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:salt_block" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/salt_ore.json b/src/main/resources/data/baseminerals/loot_tables/blocks/salt_ore.json new file mode 100644 index 0000000..ee7e74f --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/salt_ore.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:salt_ore" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/saltpeter_block.json b/src/main/resources/data/baseminerals/loot_tables/blocks/saltpeter_block.json new file mode 100644 index 0000000..edeb7f0 --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/saltpeter_block.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:saltpeter_block" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/saltpeter_ore.json b/src/main/resources/data/baseminerals/loot_tables/blocks/saltpeter_ore.json new file mode 100644 index 0000000..539fa9a --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/saltpeter_ore.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:saltpeter_ore" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/silicon_block.json b/src/main/resources/data/baseminerals/loot_tables/blocks/silicon_block.json new file mode 100644 index 0000000..ce7b5ec --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/silicon_block.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:silicon_block" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/sulfur_block.json b/src/main/resources/data/baseminerals/loot_tables/blocks/sulfur_block.json new file mode 100644 index 0000000..e02b919 --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/sulfur_block.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:sulfur_block" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/loot_tables/blocks/sulfur_ore.json b/src/main/resources/data/baseminerals/loot_tables/blocks/sulfur_ore.json new file mode 100644 index 0000000..b515934 --- /dev/null +++ b/src/main/resources/data/baseminerals/loot_tables/blocks/sulfur_ore.json @@ -0,0 +1,14 @@ +{ + "pools": [ + { + "name": "block", + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "baseminerals:sulfur_ore" + } + ] + } + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/gunpowder_charcoal_potash.json b/src/main/resources/data/baseminerals/recipes/gunpowder_charcoal_potash.json new file mode 100644 index 0000000..51b02b9 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/gunpowder_charcoal_potash.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + [ + { + "tag": "forge:dusts/charcoal" + }, + { + "item": "minecraft:charcoal" + } + ], + { + "tag": "forge:dusts/sulfur" + }, + { + "tag": "forge:dusts/potash" + } + ], + "result": { + "item": "minecraft:gunpowder", + "count": 3 + }, + "group": "baseminerals_extra" +} diff --git a/src/main/resources/data/baseminerals/recipes/gunpowder_charcoal_saltpeter.json b/src/main/resources/data/baseminerals/recipes/gunpowder_charcoal_saltpeter.json new file mode 100644 index 0000000..02e190f --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/gunpowder_charcoal_saltpeter.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + [ + { + "tag": "forge:dusts/charcoal" + }, + { + "item": "minecraft:charcoal" + } + ], + { + "tag": "forge:dusts/sulfur" + }, + { + "tag": "forge:dusts/saltpeter" + } + ], + "result": { + "item": "minecraft:gunpowder", + "count": 3 + }, + "group": "baseminerals_extra" +} diff --git a/src/main/resources/data/baseminerals/recipes/gunpowder_coal_potash.json b/src/main/resources/data/baseminerals/recipes/gunpowder_coal_potash.json new file mode 100644 index 0000000..ea08c09 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/gunpowder_coal_potash.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + [ + { + "tag": "forge:dusts/coal" + }, + { + "item": "minecraft:coal" + } + ], + { + "tag": "forge:dusts/sulfur" + }, + { + "tag": "forge:dusts/potash" + } + ], + "result": { + "item": "minecraft:gunpowder", + "count": 3 + }, + "group": "baseminerals_extra" +} diff --git a/src/main/resources/data/baseminerals/recipes/gunpowder_coal_saltpeter.json b/src/main/resources/data/baseminerals/recipes/gunpowder_coal_saltpeter.json new file mode 100644 index 0000000..3e2e8f1 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/gunpowder_coal_saltpeter.json @@ -0,0 +1,24 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + [ + { + "tag": "forge:dusts/coal" + }, + { + "item": "minecraft:coal" + } + ], + { + "tag": "forge:dusts/sulfur" + }, + { + "tag": "forge:dusts/saltpeter" + } + ], + "result": { + "item": "minecraft:gunpowder", + "count": 3 + }, + "group": "baseminerals_extra" +} diff --git a/src/main/resources/data/baseminerals/recipes/lithium_block.json b/src/main/resources/data/baseminerals/recipes/lithium_block.json new file mode 100644 index 0000000..b393d54 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/lithium_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:lithium_block" + }, + "key": { + "x": { + "tag": "forge:dusts/lithium" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/lithium_block_powder.json b/src/main/resources/data/baseminerals/recipes/lithium_block_powder.json new file mode 100644 index 0000000..544a1b0 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/lithium_block_powder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "forge:storage_blocks/lithium" + } + ], + "result": { + "item": "baseminerals:lithium_powder", + "count": 9 + }, + "group": "basics" +} diff --git a/src/main/resources/data/baseminerals/recipes/lithium_ore_crushing.json b/src/main/resources/data/baseminerals/recipes/lithium_ore_crushing.json new file mode 100644 index 0000000..296fc77 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/lithium_ore_crushing.json @@ -0,0 +1,19 @@ +{ + "type": "baseminerals:shared_crushing", + "conditions": [ + { + "type": "forge:or", + "values": [ + { "type": "forge:mod_loaded", "modid": "basemetals" }, + { "type": "forge:mod_loaded", "modid": "modernmetals" } + ] + } + ], + "ingredient": { + "item": "baseminerals:lithium_ore" + }, + "result": { + "item": "baseminerals:lithium_powder", + "count": 2 + } +} diff --git a/src/main/resources/data/baseminerals/recipes/lithium_powder.json b/src/main/resources/data/baseminerals/recipes/lithium_powder.json new file mode 100644 index 0000000..ce94f9f --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/lithium_powder.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:lithium_powder" + }, + "key": { + "x": { + "tag": "forge:tiny_dusts/lithium" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/lithium_smallpowder.json b/src/main/resources/data/baseminerals/recipes/lithium_smallpowder.json new file mode 100644 index 0000000..85b5a17 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/lithium_smallpowder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "basics", + "result": { + "item": "baseminerals:lithium_smallpowder", + "count": 9 + }, + "ingredients": [ + { + "tag": "forge:dusts/lithium" + } + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/niter_block.json b/src/main/resources/data/baseminerals/recipes/niter_block.json new file mode 100644 index 0000000..657750c --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/niter_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:niter_block" + }, + "key": { + "x": { + "tag": "forge:dusts/niter" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/niter_block_powder.json b/src/main/resources/data/baseminerals/recipes/niter_block_powder.json new file mode 100644 index 0000000..1e7c794 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/niter_block_powder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "forge:storage_blocks/niter" + } + ], + "result": { + "item": "baseminerals:niter_powder", + "count": 9 + }, + "group": "basics" +} diff --git a/src/main/resources/data/baseminerals/recipes/niter_ore_crushing.json b/src/main/resources/data/baseminerals/recipes/niter_ore_crushing.json new file mode 100644 index 0000000..8d20577 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/niter_ore_crushing.json @@ -0,0 +1,19 @@ +{ + "type": "baseminerals:shared_crushing", + "conditions": [ + { + "type": "forge:or", + "values": [ + { "type": "forge:mod_loaded", "modid": "basemetals" }, + { "type": "forge:mod_loaded", "modid": "modernmetals" } + ] + } + ], + "ingredient": { + "item": "baseminerals:niter_ore" + }, + "result": { + "item": "baseminerals:niter_powder", + "count": 2 + } +} diff --git a/src/main/resources/data/baseminerals/recipes/niter_powder.json b/src/main/resources/data/baseminerals/recipes/niter_powder.json new file mode 100644 index 0000000..e255e52 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/niter_powder.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:niter_powder" + }, + "key": { + "x": { + "tag": "forge:tiny_dusts/niter" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/niter_smallpowder.json b/src/main/resources/data/baseminerals/recipes/niter_smallpowder.json new file mode 100644 index 0000000..c73d090 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/niter_smallpowder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "basics", + "result": { + "item": "baseminerals:niter_smallpowder", + "count": 9 + }, + "ingredients": [ + { + "tag": "forge:dusts/niter" + } + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/phosphorus_block.json b/src/main/resources/data/baseminerals/recipes/phosphorus_block.json new file mode 100644 index 0000000..b3b11a3 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/phosphorus_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:phosphorus_block" + }, + "key": { + "x": { + "tag": "forge:dusts/phosphorus" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/phosphorus_block_powder.json b/src/main/resources/data/baseminerals/recipes/phosphorus_block_powder.json new file mode 100644 index 0000000..ce10fea --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/phosphorus_block_powder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "forge:storage_blocks/phosphorus" + } + ], + "result": { + "item": "baseminerals:phosphorus_powder", + "count": 9 + }, + "group": "basics" +} diff --git a/src/main/resources/data/baseminerals/recipes/phosphorus_ore_crushing.json b/src/main/resources/data/baseminerals/recipes/phosphorus_ore_crushing.json new file mode 100644 index 0000000..c31a15e --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/phosphorus_ore_crushing.json @@ -0,0 +1,19 @@ +{ + "type": "baseminerals:shared_crushing", + "conditions": [ + { + "type": "forge:or", + "values": [ + { "type": "forge:mod_loaded", "modid": "basemetals" }, + { "type": "forge:mod_loaded", "modid": "modernmetals" } + ] + } + ], + "ingredient": { + "item": "baseminerals:phosphorus_ore" + }, + "result": { + "item": "baseminerals:phosphorus_powder", + "count": 2 + } +} diff --git a/src/main/resources/data/baseminerals/recipes/phosphorus_powder.json b/src/main/resources/data/baseminerals/recipes/phosphorus_powder.json new file mode 100644 index 0000000..b70e1ad --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/phosphorus_powder.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:phosphorus_powder" + }, + "key": { + "x": { + "tag": "forge:tiny_dusts/phosphorus" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/phosphorus_smallpowder.json b/src/main/resources/data/baseminerals/recipes/phosphorus_smallpowder.json new file mode 100644 index 0000000..75437e4 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/phosphorus_smallpowder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "basics", + "result": { + "item": "baseminerals:phosphorus_smallpowder", + "count": 9 + }, + "ingredients": [ + { + "tag": "forge:dusts/phosphorus" + } + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/potash_block.json b/src/main/resources/data/baseminerals/recipes/potash_block.json new file mode 100644 index 0000000..a0eed45 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/potash_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:potash_block" + }, + "key": { + "x": { + "tag": "forge:dusts/potash" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/potash_block_powder.json b/src/main/resources/data/baseminerals/recipes/potash_block_powder.json new file mode 100644 index 0000000..4590d0e --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/potash_block_powder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "forge:storage_blocks/potash" + } + ], + "result": { + "item": "baseminerals:potash_powder", + "count": 9 + }, + "group": "basics" +} diff --git a/src/main/resources/data/baseminerals/recipes/potash_ore_crushing.json b/src/main/resources/data/baseminerals/recipes/potash_ore_crushing.json new file mode 100644 index 0000000..c9664f0 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/potash_ore_crushing.json @@ -0,0 +1,19 @@ +{ + "type": "baseminerals:shared_crushing", + "conditions": [ + { + "type": "forge:or", + "values": [ + { "type": "forge:mod_loaded", "modid": "basemetals" }, + { "type": "forge:mod_loaded", "modid": "modernmetals" } + ] + } + ], + "ingredient": { + "item": "baseminerals:potash_ore" + }, + "result": { + "item": "baseminerals:potash_powder", + "count": 2 + } +} diff --git a/src/main/resources/data/baseminerals/recipes/potash_powder.json b/src/main/resources/data/baseminerals/recipes/potash_powder.json new file mode 100644 index 0000000..9e6a561 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/potash_powder.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:potash_powder" + }, + "key": { + "x": { + "tag": "forge:tiny_dusts/potash" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/potash_smallpowder.json b/src/main/resources/data/baseminerals/recipes/potash_smallpowder.json new file mode 100644 index 0000000..4655941 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/potash_smallpowder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "basics", + "result": { + "item": "baseminerals:potash_smallpowder", + "count": 9 + }, + "ingredients": [ + { + "tag": "forge:dusts/potash" + } + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/salt_block.json b/src/main/resources/data/baseminerals/recipes/salt_block.json new file mode 100644 index 0000000..164ae84 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/salt_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:salt_block" + }, + "key": { + "x": { + "tag": "forge:dusts/salt" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/salt_block_powder.json b/src/main/resources/data/baseminerals/recipes/salt_block_powder.json new file mode 100644 index 0000000..0d930a6 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/salt_block_powder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "forge:storage_blocks/salt" + } + ], + "result": { + "item": "baseminerals:salt_powder", + "count": 9 + }, + "group": "basics" +} diff --git a/src/main/resources/data/baseminerals/recipes/salt_ore_crushing.json b/src/main/resources/data/baseminerals/recipes/salt_ore_crushing.json new file mode 100644 index 0000000..1f12ec5 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/salt_ore_crushing.json @@ -0,0 +1,19 @@ +{ + "type": "baseminerals:shared_crushing", + "conditions": [ + { + "type": "forge:or", + "values": [ + { "type": "forge:mod_loaded", "modid": "basemetals" }, + { "type": "forge:mod_loaded", "modid": "modernmetals" } + ] + } + ], + "ingredient": { + "item": "baseminerals:salt_ore" + }, + "result": { + "item": "baseminerals:salt_powder", + "count": 2 + } +} diff --git a/src/main/resources/data/baseminerals/recipes/salt_powder.json b/src/main/resources/data/baseminerals/recipes/salt_powder.json new file mode 100644 index 0000000..4a5d648 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/salt_powder.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:salt_powder" + }, + "key": { + "x": { + "tag": "forge:tiny_dusts/salt" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/salt_smallpowder.json b/src/main/resources/data/baseminerals/recipes/salt_smallpowder.json new file mode 100644 index 0000000..387f022 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/salt_smallpowder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "basics", + "result": { + "item": "baseminerals:salt_smallpowder", + "count": 9 + }, + "ingredients": [ + { + "tag": "forge:dusts/salt" + } + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/saltpeter_block.json b/src/main/resources/data/baseminerals/recipes/saltpeter_block.json new file mode 100644 index 0000000..ce2a7bc --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/saltpeter_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:saltpeter_block" + }, + "key": { + "x": { + "tag": "forge:dusts/saltpeter" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/saltpeter_block_powder.json b/src/main/resources/data/baseminerals/recipes/saltpeter_block_powder.json new file mode 100644 index 0000000..57aab45 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/saltpeter_block_powder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "forge:storage_blocks/saltpeter" + } + ], + "result": { + "item": "baseminerals:saltpeter_powder", + "count": 9 + }, + "group": "basics" +} diff --git a/src/main/resources/data/baseminerals/recipes/saltpeter_ore_crushing.json b/src/main/resources/data/baseminerals/recipes/saltpeter_ore_crushing.json new file mode 100644 index 0000000..d76981a --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/saltpeter_ore_crushing.json @@ -0,0 +1,19 @@ +{ + "type": "baseminerals:shared_crushing", + "conditions": [ + { + "type": "forge:or", + "values": [ + { "type": "forge:mod_loaded", "modid": "basemetals" }, + { "type": "forge:mod_loaded", "modid": "modernmetals" } + ] + } + ], + "ingredient": { + "item": "baseminerals:saltpeter_ore" + }, + "result": { + "item": "baseminerals:saltpeter_powder", + "count": 2 + } +} diff --git a/src/main/resources/data/baseminerals/recipes/saltpeter_powder.json b/src/main/resources/data/baseminerals/recipes/saltpeter_powder.json new file mode 100644 index 0000000..a4c5e8d --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/saltpeter_powder.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:saltpeter_powder" + }, + "key": { + "x": { + "tag": "forge:tiny_dusts/saltpeter" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/saltpeter_smallpowder.json b/src/main/resources/data/baseminerals/recipes/saltpeter_smallpowder.json new file mode 100644 index 0000000..e07de53 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/saltpeter_smallpowder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "basics", + "result": { + "item": "baseminerals:saltpeter_smallpowder", + "count": 9 + }, + "ingredients": [ + { + "tag": "forge:dusts/saltpeter" + } + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_blend_sand_charcoal.json b/src/main/resources/data/baseminerals/recipes/silicon_blend_sand_charcoal.json new file mode 100644 index 0000000..3f91493 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_blend_sand_charcoal.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "minecraft:sand" + }, + [ + { + "tag": "forge:dusts/charcoal" + }, + { + "item": "minecraft:charcoal" + } + ] + ], + "result": { + "item": "baseminerals:silicon_blend", + "count": 3 + }, + "group": "baseminerals_extra" +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_blend_sand_coal.json b/src/main/resources/data/baseminerals/recipes/silicon_blend_sand_coal.json new file mode 100644 index 0000000..adf5613 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_blend_sand_coal.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "minecraft:sand" + }, + [ + { + "tag": "forge:dusts/coal" + }, + { + "item": "minecraft:coal" + } + ] + ], + "result": { + "item": "baseminerals:silicon_blend", + "count": 3 + }, + "group": "baseminerals_extra" +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_blend_smallblend.json b/src/main/resources/data/baseminerals/recipes/silicon_blend_smallblend.json new file mode 100644 index 0000000..806dac3 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_blend_smallblend.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:silicon_blend" + }, + "key": { + "x": { + "item": "baseminerals:silicon_smallblend" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_block.json b/src/main/resources/data/baseminerals/recipes/silicon_block.json new file mode 100644 index 0000000..032fc59 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:silicon_block" + }, + "key": { + "x": { + "tag": "forge:ingots/silicon" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_block_powder.json b/src/main/resources/data/baseminerals/recipes/silicon_block_powder.json new file mode 100644 index 0000000..b2a93a6 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_block_powder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "forge:storage_blocks/silicon" + } + ], + "result": { + "item": "baseminerals:silicon_powder", + "count": 9 + }, + "group": "basics" +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_charcoal.json b/src/main/resources/data/baseminerals/recipes/silicon_charcoal.json new file mode 100644 index 0000000..89c9936 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_charcoal.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + [ + { + "tag": "forge:dusts/charcoal" + }, + { + "item": "minecraft:charcoal" + } + ], + { + "tag": "minecraft:sand" + } + ], + "result": { + "item": "baseminerals:silicon_blend" + }, + "group": "baseminerals_extra" +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_coal.json b/src/main/resources/data/baseminerals/recipes/silicon_coal.json new file mode 100644 index 0000000..2b1735d --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_coal.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + [ + { + "tag": "forge:dusts/coal" + }, + { + "item": "minecraft:coal" + } + ], + { + "tag": "minecraft:sand" + } + ], + "result": { + "item": "baseminerals:silicon_blend" + }, + "group": "baseminerals_extra" +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_ingot.json b/src/main/resources/data/baseminerals/recipes/silicon_ingot.json new file mode 100644 index 0000000..777268d --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_ingot.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:silicon_ingot" + }, + "key": { + "x": { + "tag": "forge:nuggets/silicon" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_nugget.json b/src/main/resources/data/baseminerals/recipes/silicon_nugget.json new file mode 100644 index 0000000..8b8e26b --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_nugget.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "basics", + "result": { + "item": "baseminerals:silicon_nugget", + "count": 9 + }, + "ingredients": [ + { + "tag": "forge:ingots/silicon" + } + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_powder.json b/src/main/resources/data/baseminerals/recipes/silicon_powder.json new file mode 100644 index 0000000..f673c10 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_powder.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:silicon_powder" + }, + "key": { + "x": { + "tag": "forge:tiny_dusts/silicon" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_powder_smelting.json b/src/main/resources/data/baseminerals/recipes/silicon_powder_smelting.json new file mode 100644 index 0000000..879f1a8 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_powder_smelting.json @@ -0,0 +1,9 @@ +{ + "type": "minecraft:smelting", + "ingredient": { + "item": "baseminerals:silicon_powder" + }, + "result": "baseminerals:silicon_ingot", + "experience": 0, + "cookingtime": 200 +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_smallblend_blend.json b/src/main/resources/data/baseminerals/recipes/silicon_smallblend_blend.json new file mode 100644 index 0000000..8467804 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_smallblend_blend.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "basics", + "result": { + "item": "baseminerals:silicon_smallblend", + "count": 9 + }, + "ingredients": [ + { + "tag": "forge:dusts/silicon" + } + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/silicon_smallpowder.json b/src/main/resources/data/baseminerals/recipes/silicon_smallpowder.json new file mode 100644 index 0000000..2c94e9c --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/silicon_smallpowder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "basics", + "result": { + "item": "baseminerals:silicon_smallpowder", + "count": 9 + }, + "ingredients": [ + { + "tag": "forge:dusts/silicon" + } + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/sulfur_block.json b/src/main/resources/data/baseminerals/recipes/sulfur_block.json new file mode 100644 index 0000000..4a07b0d --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/sulfur_block.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:sulfur_block" + }, + "key": { + "x": { + "tag": "forge:dusts/sulfur" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/sulfur_block_powder.json b/src/main/resources/data/baseminerals/recipes/sulfur_block_powder.json new file mode 100644 index 0000000..a43321a --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/sulfur_block_powder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "ingredients": [ + { + "tag": "forge:storage_blocks/sulfur" + } + ], + "result": { + "item": "baseminerals:sulfur_powder", + "count": 9 + }, + "group": "basics" +} diff --git a/src/main/resources/data/baseminerals/recipes/sulfur_ore_crushing.json b/src/main/resources/data/baseminerals/recipes/sulfur_ore_crushing.json new file mode 100644 index 0000000..237f943 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/sulfur_ore_crushing.json @@ -0,0 +1,19 @@ +{ + "type": "baseminerals:shared_crushing", + "conditions": [ + { + "type": "forge:or", + "values": [ + { "type": "forge:mod_loaded", "modid": "basemetals" }, + { "type": "forge:mod_loaded", "modid": "modernmetals" } + ] + } + ], + "ingredient": { + "item": "baseminerals:sulfur_ore" + }, + "result": { + "item": "baseminerals:sulfur_powder", + "count": 2 + } +} diff --git a/src/main/resources/data/baseminerals/recipes/sulfur_powder.json b/src/main/resources/data/baseminerals/recipes/sulfur_powder.json new file mode 100644 index 0000000..4995919 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/sulfur_powder.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "group": "basics", + "result": { + "item": "baseminerals:sulfur_powder" + }, + "key": { + "x": { + "tag": "forge:tiny_dusts/sulfur" + } + }, + "pattern": [ + "xxx", + "xxx", + "xxx" + ] +} diff --git a/src/main/resources/data/baseminerals/recipes/sulfur_smallpowder.json b/src/main/resources/data/baseminerals/recipes/sulfur_smallpowder.json new file mode 100644 index 0000000..ccff174 --- /dev/null +++ b/src/main/resources/data/baseminerals/recipes/sulfur_smallpowder.json @@ -0,0 +1,13 @@ +{ + "type": "minecraft:crafting_shapeless", + "group": "basics", + "result": { + "item": "baseminerals:sulfur_smallpowder", + "count": 9 + }, + "ingredients": [ + { + "tag": "forge:dusts/sulfur" + } + ] +} diff --git a/src/main/resources/data/forge/tags/blocks/ores/lithium.json b/src/main/resources/data/forge/tags/blocks/ores/lithium.json new file mode 100644 index 0000000..d8db38b --- /dev/null +++ b/src/main/resources/data/forge/tags/blocks/ores/lithium.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:lithium_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/blocks/ores/niter.json b/src/main/resources/data/forge/tags/blocks/ores/niter.json new file mode 100644 index 0000000..5581fa3 --- /dev/null +++ b/src/main/resources/data/forge/tags/blocks/ores/niter.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:niter_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/blocks/ores/phosphorus.json b/src/main/resources/data/forge/tags/blocks/ores/phosphorus.json new file mode 100644 index 0000000..4462f4f --- /dev/null +++ b/src/main/resources/data/forge/tags/blocks/ores/phosphorus.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:phosphorus_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/blocks/ores/potash.json b/src/main/resources/data/forge/tags/blocks/ores/potash.json new file mode 100644 index 0000000..5cf6d5e --- /dev/null +++ b/src/main/resources/data/forge/tags/blocks/ores/potash.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:potash_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/blocks/ores/salt.json b/src/main/resources/data/forge/tags/blocks/ores/salt.json new file mode 100644 index 0000000..fe8293b --- /dev/null +++ b/src/main/resources/data/forge/tags/blocks/ores/salt.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:salt_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/blocks/ores/saltpeter.json b/src/main/resources/data/forge/tags/blocks/ores/saltpeter.json new file mode 100644 index 0000000..8a7fb6f --- /dev/null +++ b/src/main/resources/data/forge/tags/blocks/ores/saltpeter.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:saltpeter_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/blocks/ores/sulfur.json b/src/main/resources/data/forge/tags/blocks/ores/sulfur.json new file mode 100644 index 0000000..e8f90dd --- /dev/null +++ b/src/main/resources/data/forge/tags/blocks/ores/sulfur.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:sulfur_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/items/dusts/charcoal.json b/src/main/resources/data/forge/tags/items/dusts/charcoal.json new file mode 100644 index 0000000..19d088b --- /dev/null +++ b/src/main/resources/data/forge/tags/items/dusts/charcoal.json @@ -0,0 +1 @@ +{"replace":false,"values":[]} diff --git a/src/main/resources/data/forge/tags/items/dusts/coal.json b/src/main/resources/data/forge/tags/items/dusts/coal.json new file mode 100644 index 0000000..19d088b --- /dev/null +++ b/src/main/resources/data/forge/tags/items/dusts/coal.json @@ -0,0 +1 @@ +{"replace":false,"values":[]} diff --git a/src/main/resources/data/forge/tags/items/dusts/lithium.json b/src/main/resources/data/forge/tags/items/dusts/lithium.json new file mode 100644 index 0000000..4bc172d --- /dev/null +++ b/src/main/resources/data/forge/tags/items/dusts/lithium.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:lithium_powder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/dusts/niter.json b/src/main/resources/data/forge/tags/items/dusts/niter.json new file mode 100644 index 0000000..b80aaad --- /dev/null +++ b/src/main/resources/data/forge/tags/items/dusts/niter.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:niter_powder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/dusts/phosphorus.json b/src/main/resources/data/forge/tags/items/dusts/phosphorus.json new file mode 100644 index 0000000..5414042 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/dusts/phosphorus.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:phosphorus_powder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/dusts/potash.json b/src/main/resources/data/forge/tags/items/dusts/potash.json new file mode 100644 index 0000000..0788dab --- /dev/null +++ b/src/main/resources/data/forge/tags/items/dusts/potash.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:potash_powder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/dusts/salt.json b/src/main/resources/data/forge/tags/items/dusts/salt.json new file mode 100644 index 0000000..cdbc9bb --- /dev/null +++ b/src/main/resources/data/forge/tags/items/dusts/salt.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:salt_powder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/dusts/saltpeter.json b/src/main/resources/data/forge/tags/items/dusts/saltpeter.json new file mode 100644 index 0000000..3aaef8a --- /dev/null +++ b/src/main/resources/data/forge/tags/items/dusts/saltpeter.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:saltpeter_powder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/dusts/silicon.json b/src/main/resources/data/forge/tags/items/dusts/silicon.json new file mode 100644 index 0000000..29c016f --- /dev/null +++ b/src/main/resources/data/forge/tags/items/dusts/silicon.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:silicon_powder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/dusts/sulfur.json b/src/main/resources/data/forge/tags/items/dusts/sulfur.json new file mode 100644 index 0000000..459d88a --- /dev/null +++ b/src/main/resources/data/forge/tags/items/dusts/sulfur.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:sulfur_powder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/ingots/lithium.json b/src/main/resources/data/forge/tags/items/ingots/lithium.json new file mode 100644 index 0000000..1a057f6 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/ingots/lithium.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:lithium_ingot" + ] +} diff --git a/src/main/resources/data/forge/tags/items/ingots/silicon.json b/src/main/resources/data/forge/tags/items/ingots/silicon.json new file mode 100644 index 0000000..494b3f2 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/ingots/silicon.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:silicon_ingot" + ] +} diff --git a/src/main/resources/data/forge/tags/items/nuggets/lithium.json b/src/main/resources/data/forge/tags/items/nuggets/lithium.json new file mode 100644 index 0000000..9276cec --- /dev/null +++ b/src/main/resources/data/forge/tags/items/nuggets/lithium.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:lithium_nugget" + ] +} diff --git a/src/main/resources/data/forge/tags/items/nuggets/silicon.json b/src/main/resources/data/forge/tags/items/nuggets/silicon.json new file mode 100644 index 0000000..7db594b --- /dev/null +++ b/src/main/resources/data/forge/tags/items/nuggets/silicon.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:silicon_nugget" + ] +} diff --git a/src/main/resources/data/forge/tags/items/ores/lithium.json b/src/main/resources/data/forge/tags/items/ores/lithium.json new file mode 100644 index 0000000..d8db38b --- /dev/null +++ b/src/main/resources/data/forge/tags/items/ores/lithium.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:lithium_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/items/ores/niter.json b/src/main/resources/data/forge/tags/items/ores/niter.json new file mode 100644 index 0000000..5581fa3 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/ores/niter.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:niter_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/items/ores/phosphorus.json b/src/main/resources/data/forge/tags/items/ores/phosphorus.json new file mode 100644 index 0000000..4462f4f --- /dev/null +++ b/src/main/resources/data/forge/tags/items/ores/phosphorus.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:phosphorus_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/items/ores/potash.json b/src/main/resources/data/forge/tags/items/ores/potash.json new file mode 100644 index 0000000..5cf6d5e --- /dev/null +++ b/src/main/resources/data/forge/tags/items/ores/potash.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:potash_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/items/ores/salt.json b/src/main/resources/data/forge/tags/items/ores/salt.json new file mode 100644 index 0000000..fe8293b --- /dev/null +++ b/src/main/resources/data/forge/tags/items/ores/salt.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:salt_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/items/ores/saltpeter.json b/src/main/resources/data/forge/tags/items/ores/saltpeter.json new file mode 100644 index 0000000..8a7fb6f --- /dev/null +++ b/src/main/resources/data/forge/tags/items/ores/saltpeter.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:saltpeter_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/items/ores/sulfur.json b/src/main/resources/data/forge/tags/items/ores/sulfur.json new file mode 100644 index 0000000..e8f90dd --- /dev/null +++ b/src/main/resources/data/forge/tags/items/ores/sulfur.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:sulfur_ore" + ] +} diff --git a/src/main/resources/data/forge/tags/items/storage_blocks/lithium.json b/src/main/resources/data/forge/tags/items/storage_blocks/lithium.json new file mode 100644 index 0000000..f2b5ae6 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/storage_blocks/lithium.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:lithium_block" + ] +} diff --git a/src/main/resources/data/forge/tags/items/storage_blocks/niter.json b/src/main/resources/data/forge/tags/items/storage_blocks/niter.json new file mode 100644 index 0000000..b590901 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/storage_blocks/niter.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:niter_block" + ] +} diff --git a/src/main/resources/data/forge/tags/items/storage_blocks/phosphorus.json b/src/main/resources/data/forge/tags/items/storage_blocks/phosphorus.json new file mode 100644 index 0000000..e8e5be1 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/storage_blocks/phosphorus.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:phosphorus_block" + ] +} diff --git a/src/main/resources/data/forge/tags/items/storage_blocks/potash.json b/src/main/resources/data/forge/tags/items/storage_blocks/potash.json new file mode 100644 index 0000000..b904151 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/storage_blocks/potash.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:potash_block" + ] +} diff --git a/src/main/resources/data/forge/tags/items/storage_blocks/salt.json b/src/main/resources/data/forge/tags/items/storage_blocks/salt.json new file mode 100644 index 0000000..c5444fe --- /dev/null +++ b/src/main/resources/data/forge/tags/items/storage_blocks/salt.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:salt_block" + ] +} diff --git a/src/main/resources/data/forge/tags/items/storage_blocks/saltpeter.json b/src/main/resources/data/forge/tags/items/storage_blocks/saltpeter.json new file mode 100644 index 0000000..73a8cc6 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/storage_blocks/saltpeter.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:saltpeter_block" + ] +} diff --git a/src/main/resources/data/forge/tags/items/storage_blocks/silicon.json b/src/main/resources/data/forge/tags/items/storage_blocks/silicon.json new file mode 100644 index 0000000..271b4e1 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/storage_blocks/silicon.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:silicon_block" + ] +} diff --git a/src/main/resources/data/forge/tags/items/storage_blocks/sulfur.json b/src/main/resources/data/forge/tags/items/storage_blocks/sulfur.json new file mode 100644 index 0000000..58f2cdd --- /dev/null +++ b/src/main/resources/data/forge/tags/items/storage_blocks/sulfur.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:sulfur_block" + ] +} diff --git a/src/main/resources/data/forge/tags/items/tiny_dusts/lithium.json b/src/main/resources/data/forge/tags/items/tiny_dusts/lithium.json new file mode 100644 index 0000000..151aa0b --- /dev/null +++ b/src/main/resources/data/forge/tags/items/tiny_dusts/lithium.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:lithium_smallpowder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/tiny_dusts/niter.json b/src/main/resources/data/forge/tags/items/tiny_dusts/niter.json new file mode 100644 index 0000000..648f2cb --- /dev/null +++ b/src/main/resources/data/forge/tags/items/tiny_dusts/niter.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:niter_smallpowder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/tiny_dusts/phosphorus.json b/src/main/resources/data/forge/tags/items/tiny_dusts/phosphorus.json new file mode 100644 index 0000000..09dbf27 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/tiny_dusts/phosphorus.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:phosphorus_smallpowder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/tiny_dusts/potash.json b/src/main/resources/data/forge/tags/items/tiny_dusts/potash.json new file mode 100644 index 0000000..ffd9c7c --- /dev/null +++ b/src/main/resources/data/forge/tags/items/tiny_dusts/potash.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:potash_smallpowder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/tiny_dusts/salt.json b/src/main/resources/data/forge/tags/items/tiny_dusts/salt.json new file mode 100644 index 0000000..b531c3d --- /dev/null +++ b/src/main/resources/data/forge/tags/items/tiny_dusts/salt.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:salt_smallpowder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/tiny_dusts/saltpeter.json b/src/main/resources/data/forge/tags/items/tiny_dusts/saltpeter.json new file mode 100644 index 0000000..84a0eec --- /dev/null +++ b/src/main/resources/data/forge/tags/items/tiny_dusts/saltpeter.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:saltpeter_smallpowder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/tiny_dusts/silicon.json b/src/main/resources/data/forge/tags/items/tiny_dusts/silicon.json new file mode 100644 index 0000000..fb3e36e --- /dev/null +++ b/src/main/resources/data/forge/tags/items/tiny_dusts/silicon.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:silicon_smallpowder" + ] +} diff --git a/src/main/resources/data/forge/tags/items/tiny_dusts/sulfur.json b/src/main/resources/data/forge/tags/items/tiny_dusts/sulfur.json new file mode 100644 index 0000000..49d7535 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/tiny_dusts/sulfur.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "baseminerals:sulfur_smallpowder" + ] +} diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info deleted file mode 100644 index d66558f..0000000 --- a/src/main/resources/mcmod.info +++ /dev/null @@ -1,16 +0,0 @@ -[ -{ - "modid": "baseminerals", - "name": "Base Minerals", - "description": "Base Minerals Addon", - "version": "${version}", - "mcversion": "${mcversion}", - "url": "http://minecraft.curseforge.com/projects/base-minerals", - "updateUrl": "", - "authorList": ["cyb3rkat"], - "credits": "DrCyano (aka Cyanobacterium)", - "logoFile": "", - "screenshots": [], - "dependencies": [] -} -] diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 10939fa..9d92ddc 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { - "pack":{ - "pack_format":3, - "description":"Base Minerals" + "pack": { + "pack_format": 4, + "description": "Base Minerals" } } diff --git a/src/test/java/zone/moddev/mc/baseminerals/NativeProviderTests.java b/src/test/java/zone/moddev/mc/baseminerals/NativeProviderTests.java deleted file mode 100644 index 7713de2..0000000 --- a/src/test/java/zone/moddev/mc/baseminerals/NativeProviderTests.java +++ /dev/null @@ -1,63 +0,0 @@ -package zone.moddev.mc.baseminerals; - -import static org.junit.jupiter.api.Assertions.*; -import com.google.gson.*; -import java.nio.charset.StandardCharsets; -import java.nio.file.*; -import java.util.Optional; -import java.util.function.Predicate; -import net.minecraft.util.ResourceLocation; -import org.junit.jupiter.api.Test; -import zone.moddev.mc.orespawn.api.WorldgenProvider; - -class NativeProviderTests { - @SuppressWarnings("unchecked") - private Optional build(Predicate available) throws Exception { - return (Optional) Class.forName("zone.moddev.mc.baseminerals.worldgen.BaseMineralsWorldgenProvider") - .getMethod("build", Predicate.class).invoke(null, available); - } - @Test void implementsApprovedBalanceAndExportsSchema() throws Exception { - JsonObject provider = build(id -> true).get().toJson(); - Files.createDirectories(Paths.get("build/reports")); - Files.write(Paths.get("build/reports/native-provider.json"), (provider.toString()+"\n").getBytes(StandardCharsets.UTF_8)); - assertEquals(5,provider.get("schema_version").getAsInt()); - JsonObject ores=provider.getAsJsonObject("ores"); - assertEquals(7,ores.entrySet().size()); - String[] names={"lithium","niter","salt","sulfur","phosphorus","potash","saltpeter"}; - double[][] rules={{8,47,4,12,18},{16,63,5,8,16},{24,79,2.5,16,32},{4,31,3,12,18},{16,63,3,12,18},{8,47,2.5,12,24},{24,79,3.75,8,16}}; - int[][] shapes={{8,4,3},{4,2,3},{8,0,8},{4,2,4},{6,1,6},{6,0,6},{4,1,3}}; - String[] heights={"triangle","uniform","uniform","bottom_triangle","triangle","uniform","uniform"}; - for(int i=0;i false).isPresent()); - JsonObject ores=build(id -> !id.getPath().equals("lithium_ore")).get().toJson().getAsJsonObject("ores"); - assertEquals(6,ores.entrySet().size()); - assertFalse(ores.has("baseminerals:legacy/lithium_ore")); - } -} diff --git a/src/test/java/zone/moddev/mc/baseminerals/compat/LegacyNamespaceTransformerTests.java b/src/test/java/zone/moddev/mc/baseminerals/compat/LegacyNamespaceTransformerTests.java deleted file mode 100644 index 473938e..0000000 --- a/src/test/java/zone/moddev/mc/baseminerals/compat/LegacyNamespaceTransformerTests.java +++ /dev/null @@ -1,87 +0,0 @@ -package zone.moddev.mc.baseminerals.compat; - -import static org.junit.jupiter.api.Assertions.*; - -import org.junit.jupiter.api.Test; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; -import org.objectweb.asm.Type; -import org.objectweb.asm.tree.ClassNode; -import org.objectweb.asm.tree.FieldInsnNode; -import org.objectweb.asm.tree.FieldNode; -import org.objectweb.asm.tree.LdcInsnNode; -import org.objectweb.asm.tree.MethodNode; - -class LegacyNamespaceTransformerTests { - - @Test - void linksOldTypesFieldsInheritanceAndReflectionToCurrentClasses() { - final byte[] output = new LegacyNamespaceTransformer().transform("example.Consumer", null, fixture()); - final ClassNode type = new ClassNode(); - new ClassReader(output).accept(type, 0); - assertEquals("example/Consumer", type.name); - assertEquals("zone/moddev/mc/baseminerals/proxy/CommonProxy", type.superName); - assertEquals("Lzone/moddev/mc/baseminerals/BaseMinerals;", ((FieldNode) type.fields.get(0)).desc); - - final MethodNode method = (MethodNode) type.methods.get(0); - assertEquals("zone/moddev/mc/baseminerals/BaseMinerals", ((FieldInsnNode) method.instructions.get(0)).owner); - assertEquals("zone.moddev.mc.baseminerals.init.Materials", ((LdcInsnNode) method.instructions.get(2)).cst); - assertEquals(Type.getObjectType("zone/moddev/mc/baseminerals/util/BMiConfig$Options"), - ((LdcInsnNode) method.instructions.get(4)).cst); - assertEquals("other.mod/textures/ore.png", ((LdcInsnNode) method.instructions.get(6)).cst); - } - - @Test - void doesNotRelocateAddonOwnedClassesInsideTheHistoricalPackage() { - final ClassWriter source = new ClassWriter(0); - source.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "com/mcmoddev/baseminerals/addon/Extra", null, - "com/mcmoddev/baseminerals/proxy/CommonProxy", null); - source.visitEnd(); - - final ClassNode type = new ClassNode(); - new ClassReader(new LegacyNamespaceTransformer().transform("com.mcmoddev.baseminerals.addon.Extra", null, - source.toByteArray())).accept(type, 0); - assertEquals("com/mcmoddev/baseminerals/addon/Extra", type.name); - assertEquals("zone/moddev/mc/baseminerals/proxy/CommonProxy", type.superName); - } - - @Test - void leavesCanonicalClassesAndTheCyanoBridgeAlone() { - final LegacyNamespaceTransformer transformer = new LegacyNamespaceTransformer(); - final byte[] bytes = fixture(); - assertSame(bytes, transformer.transform("zone.moddev.mc.baseminerals.BaseMinerals", null, bytes)); - assertNull(transformer.transform("missing", "missing", null)); - - final ClassWriter source = new ClassWriter(0); - source.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "example/Golem", null, "java/lang/Object", null); - source.visitField(Opcodes.ACC_PUBLIC, "old", "Lcyano/baseminerals/init/Blocks;", null, null).visitEnd(); - source.visitEnd(); - final byte[] golem = source.toByteArray(); - assertSame(golem, transformer.transform("example.Golem", null, golem)); - } - - private static byte[] fixture() { - final ClassWriter type = new ClassWriter(0); - type.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "example/Consumer", null, - "com/mcmoddev/baseminerals/proxy/CommonProxy", null); - type.visitField(Opcodes.ACC_PUBLIC, "mod", "Lcom/mcmoddev/baseminerals/BaseMinerals;", null, null).visitEnd(); - - final MethodVisitor method = type.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "link", "()V", null, null); - method.visitCode(); - method.visitFieldInsn(Opcodes.GETSTATIC, "com/mcmoddev/baseminerals/BaseMinerals", "instance", "Lcom/mcmoddev/baseminerals/BaseMinerals;"); - method.visitInsn(Opcodes.POP); - method.visitLdcInsn("com.mcmoddev.baseminerals.init.Materials"); - method.visitInsn(Opcodes.POP); - method.visitLdcInsn(Type.getObjectType("com/mcmoddev/baseminerals/util/BMiConfig$Options")); - method.visitInsn(Opcodes.POP); - method.visitLdcInsn("other.mod/textures/ore.png"); - method.visitInsn(Opcodes.POP); - method.visitInsn(Opcodes.RETURN); - method.visitMaxs(1, 0); - method.visitEnd(); - type.visitEnd(); - return type.toByteArray(); - } -} diff --git a/src/test/java/zone/moddev/mc/baseminerals/migration/LegacyWorldUpgradeTest.java b/src/test/java/zone/moddev/mc/baseminerals/migration/LegacyWorldUpgradeTest.java new file mode 100644 index 0000000..da6a7dc --- /dev/null +++ b/src/test/java/zone/moddev/mc/baseminerals/migration/LegacyWorldUpgradeTest.java @@ -0,0 +1,61 @@ +package zone.moddev.mc.baseminerals.migration; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + +class LegacyWorldUpgradeTest { + @Test + void convertsNestedMineralBucketsAndKeepsTheRestOfTheStack() { + NBTTagCompound lithium = bucket("lithium"); + NBTTagCompound silicon = bucket("baseminerals:silicon"); + NBTTagList inventory = new NBTTagList(); + inventory.add(lithium); + inventory.add(silicon); + NBTTagCompound player = new NBTTagCompound(); + player.setTag("Inventory", inventory); + + LegacyWorldUpgrade.migrateItems(player); + NBTTagCompound afterFirstPass = player.copy(); + LegacyWorldUpgrade.migrateItems(player); + + assertEquals(afterFirstPass, player); + assertEquals("baseminerals:lithium_bucket", lithium.getString("id")); + assertEquals("baseminerals:silicon_bucket", silicon.getString("id")); + for (NBTTagCompound stack : new NBTTagCompound[] {lithium, silicon}) { + assertEquals(1, stack.getByte("Count")); + assertEquals("Keep me", stack.getCompound("tag").getString("Custom")); + assertFalse(stack.getCompound("tag").contains("FluidName", 8)); + assertFalse(stack.getCompound("tag").contains("Amount", 99)); + } + } + + @Test + void leavesOtherModsBucketsAndOrdinaryMineralItemsUntouched() { + NBTTagCompound copper = bucket("copper"); + NBTTagCompound original = copper.copy(); + LegacyWorldUpgrade.migrateItems(copper); + assertEquals(original, copper); + + NBTTagCompound powder = new NBTTagCompound(); + powder.setString("id", "baseminerals:lithium_powder"); + powder.setByte("Count", (byte) 3); + original = powder.copy(); + LegacyWorldUpgrade.migrateItems(powder); + assertEquals(original, powder); + } + + private static NBTTagCompound bucket(String fluid) { + NBTTagCompound stack = new NBTTagCompound(); + stack.setString("id", "forge:bucketfilled"); + stack.setByte("Count", (byte) 1); + NBTTagCompound tag = new NBTTagCompound(); + tag.setString("FluidName", fluid); + tag.setInt("Amount", 1000); + tag.setString("Custom", "Keep me"); + stack.setTag("tag", tag); + return stack; + } +} diff --git a/src/test/java/zone/moddev/mc/baseminerals/util/MaterialConfigurationTests.java b/src/test/java/zone/moddev/mc/baseminerals/util/MaterialConfigurationTests.java deleted file mode 100644 index 81bdb66..0000000 --- a/src/test/java/zone/moddev/mc/baseminerals/util/MaterialConfigurationTests.java +++ /dev/null @@ -1,54 +0,0 @@ -package zone.moddev.mc.baseminerals.util; - -import static org.junit.jupiter.api.Assertions.*; -import java.nio.file.Path; -import net.minecraftforge.common.config.Configuration; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.io.TempDir; - -class MaterialConfigurationTests { - @BeforeEach void freshSharedStartupState() throws Exception { - for(String key:new String[]{"materialEnabled","fluidEnabled"}) { - java.lang.reflect.Field field=com.mcmoddev.lib.util.Config.Options.class.getDeclaredField(key); - field.setAccessible(true);((java.util.Map)field.get(null)).clear(); - } - } - @Test void initializesMaterialAndFluidSwitchesTogether() { - Configuration config=new Configuration(); - BMiConfig.load(config); - for(String name:new String[]{"lithium","silicon"}) { - assertTrue(BMiConfig.isEnabled(name)); - assertTrue(com.mcmoddev.lib.util.Config.Options.isFluidEnabled(name)); - } - assertTrue(config.getCategory(BMiConfig.MATERIALS).get("EnableLithium").requiresMcRestart()); - } - @Test void disabledMaterialAlsoDisablesItsFluidAtStartup() { - Configuration config=new Configuration(); - config.get("Metals","EnableLithium",true).set(false); - BMiConfig.load(config); - assertFalse(BMiConfig.isEnabled("lithium")); - assertFalse(com.mcmoddev.lib.util.Config.Options.isFluidEnabled("lithium")); - } - @Test void charcoalSwitchDoesNotDisableBaseMetalsSharedMaterial() { - com.mcmoddev.lib.util.Config.Options.materialEnabled("charcoal",true); - Configuration config=new Configuration(); - config.get("Vanilla","EnableCharcoal",true).set(false); - BMiConfig.load(config); - assertFalse(BMiConfig.isEnabled("charcoal")); - assertTrue(com.mcmoddev.lib.util.Config.Options.isMaterialEnabled("charcoal")); - } - @Test void historicalFluidSwitchDoesNotDisableTheMaterial() { - Configuration config = new Configuration(); - config.get(BMiConfig.FLUIDS, "Enabled Lithium", true).set(false); - BMiConfig.load(config); - assertTrue(BMiConfig.isEnabled("lithium")); - assertFalse(com.mcmoddev.lib.util.Config.Options.isFluidEnabled("lithium")); - } - @Test void editingRequestedSwitchDoesNotChangeActiveRegistration() { - Configuration config=new Configuration(); - BMiConfig.load(config); - config.get("Metals","EnableSalt",true).set(false); - assertTrue(BMiConfig.isEnabled("salt")); - } -} diff --git a/tools/test_fluid_registration.js b/tools/test_fluid_registration.js new file mode 100644 index 0000000..9629bbb --- /dev/null +++ b/tools/test_fluid_registration.js @@ -0,0 +1,18 @@ +const assert = require('node:assert/strict'); +const test = require('node:test'); +const fs = require('node:fs'); +const path = require('node:path'); +const root = path.join(__dirname, '../src/main/java/zone/moddev/mc/baseminerals'); +const mod = fs.readFileSync(path.join(root, 'BaseMinerals.java'), 'utf8'); +const content = fs.readFileSync(path.join(root, 'content/MineralContent.java'), 'utf8'); + +test('parallel construction does not write the shared fluid registry', () => { + assert.ok(!/initializeFluids\s*\(/.test(mod)); +}); +test('the sequential block event binds fluids before creating blocks', () => { + assert.ok(/@SubscribeEvent\s+public static void registerBlocks\(RegistryEvent\.Register event\)\s*\{\s*initializeFluids\(\);/.test(content)); + assert.equal((content.match(/initializeFluids\(\);/g) || []).length, 1); +}); +test('fluid registration is private to its registry subscriber', () => { + assert.ok(/private static void initializeFluids\(\)/.test(content)); +}); diff --git a/tools/validation/legacy113/requirements.txt b/tools/validation/legacy113/requirements.txt new file mode 100644 index 0000000..96972e7 --- /dev/null +++ b/tools/validation/legacy113/requirements.txt @@ -0,0 +1 @@ +nbtlib==2.0.4 diff --git a/tools/validation/legacy113/run_forge.py b/tools/validation/legacy113/run_forge.py new file mode 100644 index 0000000..38092fe --- /dev/null +++ b/tools/validation/legacy113/run_forge.py @@ -0,0 +1,102 @@ +"""Start a packaged Forge world in a disposable directory and save it after boot.""" +import argparse +from pathlib import Path +import queue +import shutil +import subprocess +import threading +import time + +LAUNCHER = 'forge-1.13.2-25.0.223.jar' + + +def prepare(runtime, target, mods, source=None): + if source and target.resolve().is_relative_to(source.resolve()): + raise ValueError('Disposable output must be outside the source world') + target.mkdir(parents=True) + for name in (LAUNCHER, 'minecraft_server.1.13.2.jar'): + shutil.copy2(runtime / name, target / name) + shutil.copytree(runtime / 'libraries', target / 'libraries') + (target / 'mods').mkdir() + for mod in mods: + shutil.copy2(mod, target / 'mods' / mod.name) + if source: + shutil.copytree(source, target / 'world') + (target / 'eula.txt').write_text('eula=true\n') + (target / 'server.properties').write_text( + 'level-name=world\nlevel-seed=8675309\nonline-mode=false\nserver-ip=127.0.0.1\n' + 'server-port=0\nview-distance=3\nmax-tick-time=-1\n' + ) + + +def run(java, target, phase, upgrade=False): + command = [str(java), '-Xms256M', '-Xmx2G'] + if upgrade: + command.append('-Dbaseminerals.debugUpgrade=true') + command.extend(['-jar', LAUNCHER, 'nogui']) + if upgrade: + command.append('--forceUpgrade') + log = target / (phase + '-console.log') + messages = queue.Queue() + with log.open('w', encoding='utf-8') as stream: + process = subprocess.Popen(command, cwd=target, stdin=subprocess.PIPE, stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, encoding='utf-8', errors='replace') + + def collect(): + for line in process.stdout: + stream.write(line) + stream.flush() + messages.put(line) + messages.put(None) + + thread = threading.Thread(target=collect, daemon=True) + thread.start() + deadline = time.monotonic() + 480 + started = False + try: + while time.monotonic() < deadline: + try: + line = messages.get(timeout=1) + except queue.Empty: + continue + if line is None: + break + if 'Done (' in line and 'For help, type' in line: + started = True + process.stdin.write('stop\n') + process.stdin.flush() + break + if 'Encountered an unexpected exception' in line: + break + if not started: + raise RuntimeError(f'Forge never reached a playable world. See {log}') + if process.wait(timeout=120): + raise RuntimeError(f'Forge shutdown failed. See {log}') + finally: + if process.poll() is None: + process.kill() + process.wait() + thread.join(timeout=10) + text = log.read_text(encoding='utf-8') + failures = ('Encountered an unexpected exception', 'Error occurred applying transform of coremod', + "Couldn't read loot table baseminerals:", 'Parsing error loading recipe baseminerals:') + if any(failure in text for failure in failures): + raise RuntimeError(f'Forge reported a migration or resource error. See {log}') + print(f'{target.name} {phase} PASS', flush=True) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + for name in ('java', 'runtime', 'output'): + parser.add_argument('--' + name, required=True, type=Path) + parser.add_argument('--mods', required=True, type=Path, nargs='+') + parser.add_argument('--source', type=Path) + parser.add_argument('--force-upgrade', action='store_true') + args = parser.parse_args() + prepare(args.runtime, args.output, args.mods, args.source) + run(args.java, args.output, 'first', args.force_upgrade) + run(args.java, args.output, 'reload', args.force_upgrade) + + +if __name__ == '__main__': + main() diff --git a/tools/validation/legacy113/verify_generation.py b/tools/validation/legacy113/verify_generation.py new file mode 100644 index 0000000..5828763 --- /dev/null +++ b/tools/validation/legacy113/verify_generation.py @@ -0,0 +1,41 @@ +"""Census the new world after first boot and reload in packaged Forge.""" +import argparse +from collections import Counter +import json +from pathlib import Path + +from run_forge import prepare, run +from verify_upgrade import census + +HEIGHTS = { + 'lithium': (8, 47), 'niter': (16, 63), 'salt': (24, 79), 'sulfur': (4, 31), + 'phosphorus': (16, 63), 'potash': (8, 47), 'saltpeter': (24, 79), +} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + for name in ('java', 'runtime', 'output'): + parser.add_argument('--' + name, required=True, type=Path) + parser.add_argument('--mods', required=True, nargs='+', type=Path) + args = parser.parse_args() + prepare(args.runtime, args.output, args.mods) + world = args.output / 'world' + run(args.java, args.output, 'first') + chunks, blocks, _ = census(world, {}) + histograms = {f'baseminerals:{name}_ore': Counter() for name in HEIGHTS} + for (dimension, x, y, z), (name, props) in blocks.items(): + assert dimension == '.' and name in histograms, (dimension, x, y, z, name) + minimum, maximum = HEIGHTS[name.split(':')[1].removesuffix('_ore')] + assert minimum <= y <= maximum, (name, y) + histograms[name][y] += 1 + assert all(histograms.values()), 'One or more mineral ores did not generate' + run(args.java, args.output, 'reload') + assert census(world, {}, chunks)[1] == blocks, 'Mineral coordinates changed on reload' + summary = {'chunks': len(chunks), 'blocks': len(blocks), 'height_histograms': histograms} + (args.output / 'generation.json').write_text(json.dumps(summary, indent=2)) + print('Fresh generation and reload PASS', {k: sum(v.values()) for k, v in histograms.items()}) + + +if __name__ == '__main__': + main() diff --git a/tools/validation/legacy113/verify_upgrade.py b/tools/validation/legacy113/verify_upgrade.py new file mode 100644 index 0000000..22048a6 --- /dev/null +++ b/tools/validation/legacy113/verify_upgrade.py @@ -0,0 +1,275 @@ +"""Check mineral states and tagged inventories across the real Forge 1.13 upgrade.""" +import argparse +from collections import Counter +from hashlib import sha256 +from io import BytesIO +import json +from pathlib import Path +import struct +import zlib + +import nbtlib +from nbtlib import Byte, ByteArray, Compound, Int, List, Short, String +import numpy as np + +from run_forge import prepare, run + +MOD = 'baseminerals:' +SECTOR = 4096 +PROBE_CHUNK = (64, 64) + + +def digest(path): + return sha256(path.read_bytes()).hexdigest() + + +def fingerprint(world): + return {p.relative_to(world).as_posix(): digest(p) for p in sorted(world.rglob('*')) if p.is_file()} + + +def saved_mineral_rules(world): + path = world / 'serverconfig/orespawn-worldgen.json' + if not path.is_file(): + return {} + ores = json.loads(path.read_text(encoding='utf-8'))['ores'] + return {key: value for key, value in ores.items() if value.get('block', '').startswith(MOD)} + + +def legacy_registry(world, registry): + root = nbtlib.load(world / 'level.dat') + ids = root['FML']['Registries']['minecraft:' + registry]['ids'] + return {int(entry['V']): str(entry['K']) for entry in ids} + + +def chunk_data(region, slot): + offset = int.from_bytes(region[slot * 4:slot * 4 + 3], 'big') * SECTOR + length, compression = struct.unpack_from('>IB', region, offset) + if compression not in (1, 2): + raise ValueError(f'Unsupported region compression {compression}') + data = zlib.decompress(region[offset + 5:offset + 4 + length], 31 if compression == 1 else 15) + return nbtlib.File.parse(BytesIO(data)) + + +def nibble_array(tag): + raw = np.frombuffer(tag.tobytes(), dtype=np.uint8) + result = np.empty(len(raw) * 2, dtype=np.uint8) + result[::2] = raw & 15 + result[1::2] = raw >> 4 + return result + + +def legacy_section(section, ids): + blocks = np.frombuffer(section['Blocks'].tobytes(), dtype=np.uint8).astype(np.uint16) + if 'Add' in section: + blocks |= nibble_array(section['Add']).astype(np.uint16) << 8 + positions = np.flatnonzero(np.isin(blocks, list(ids))) + if not len(positions): + return + metadata = nibble_array(section['Data']) + for index in positions: + block = ids[int(blocks[index])] + properties = (('level', str(metadata[index])),) if block in (MOD + 'lithium', MOD + 'silicon') else () + yield int(index), block, properties + + +def flattened_section(section): + palette = section.get('Palette', []) + targets = {i: (str(entry['Name']), tuple(sorted((k, str(v)) for k, v in entry.get('Properties', {}).items()))) + for i, entry in enumerate(palette) if str(entry['Name']).startswith(MOD)} + if not targets: + return + bits = max(4, (len(palette) - 1).bit_length()) + words = [int(word) & ((1 << 64) - 1) for word in section.get('BlockStates', [])] + for index in range(4096): + start = index * bits + word, shift = divmod(start, 64) + value = words[word] >> shift if words else 0 + if shift + bits > 64 and words: + value |= words[word + 1] << (64 - shift) + state = targets.get(value & ((1 << bits) - 1)) + if state: + yield index, *state + + +def normalized_stack(stack, legacy): + name = str(stack['id']) + tag = stack.get('tag', Compound()).unpack() + if name == 'forge:bucketfilled': + fluid = tag.get('FluidName', '').removeprefix(MOD) + if fluid not in ('lithium', 'silicon'): + return None + name = MOD + fluid + '_bucket' + del tag['FluidName'], tag['Amount'] + if not name.startswith(MOD): + return None + display = tag.get('display', {}) + if 'Name' in display: + value = display['Name'] + display['Name'] = {'text': value} if legacy else json.loads(value) + return name, int(stack['Count']), tag + + +def census(world, ids, coverage=None, require_flattened=False): + chunks = set() + blocks = {} + chests = {} + for path in sorted(world.rglob('r.*.*.mca')): + dimension = path.parent.parent.relative_to(world).as_posix() + region = path.read_bytes() + for slot in range(1024): + if not region[slot * 4:slot * 4 + 3].strip(b'\0'): + continue + root = chunk_data(region, slot) + legacy = int(root.get('DataVersion', -1)) < 1451 + level = root['Level'] + cx, cz = int(level['xPos']), int(level['zPos']) + chunk = dimension, cx, cz + if coverage is not None and chunk not in coverage: + continue + if require_flattened: + assert int(root.get('DataVersion', -1)) >= 1631, f'Chunk did not reach 1.13.2: {chunk}' + chunks.add(chunk) + for section in level.get('Sections', []): + if 'Blocks' in section: + assert not require_flattened, f'Numeric block array survived in {chunk}' + states = legacy_section(section, ids) + else: + states = flattened_section(section) + for index, name, properties in states: + x, y, z = index & 15, (index >> 8) + int(section['Y']) * 16, (index >> 4) & 15 + blocks[dimension, 16 * cx + x, y, 16 * cz + z] = name, properties + for entity in level.get('TileEntities', []): + if 'Items' not in entity: + continue + items = {int(stack['Slot']): result for stack in entity['Items'] + if (result := normalized_stack(stack, legacy))} + if items: + chests[dimension, int(entity['x']), int(entity['y']), int(entity['z'])] = items + return chunks, blocks, chests + + +def signed(value): + return value if value < 128 else value - 256 + + +def set_nibble(array, index, value): + shift = (index & 1) * 4 + prior = int(array[index >> 1]) & 255 + array[index >> 1] = signed((prior & ~(15 << shift)) | value << shift) + + +def add_fixture(world, probe_chunk=PROBE_CHUNK): + cx, cz = probe_chunk + region_path = world / 'region' / f'r.{cx // 32}.{cz // 32}.mca' + slot = (cx & 31) + (cz & 31) * 32 + region = bytearray(region_path.read_bytes()) + chunk = chunk_data(region, slot) + level = chunk['Level'] + assert int(level['xPos']) == cx and int(level['zPos']) == cz + y = 224 + assert all(int(s['Y']) != y // 16 for s in level['Sections']) + section = Compound(Y=Byte(y // 16), Blocks=ByteArray([0] * 4096), + Data=ByteArray([0] * 2048), Add=ByteArray([0] * 2048), + BlockLight=ByteArray([0] * 2048), SkyLight=ByteArray([-1] * 2048)) + level['Sections'].append(section) + solids = sorted((name, id_) for id_, name in legacy_registry(world, 'blocks').items() if name.startswith(MOD)) + + def put(index, id_, meta=0): + section['Blocks'][index] = signed(id_ & 255) + set_nibble(section['Add'], index, id_ >> 8) + set_nibble(section['Data'], index, meta) + + for index, (name, id_) in enumerate(solids, 32): + put(index, id_) + fluid_ids = {name: id_ for name, id_ in solids if name in (MOD + 'lithium', MOD + 'silicon')} + for row, id_ in enumerate(fluid_ids.values(), 4): + for level_value in range(1, 16): + put(row * 16 + level_value, id_, level_value) + item_names = sorted(name for name in legacy_registry(world, 'items').values() if name.startswith(MOD)) + stacks = [Compound(id=String(name), Count=Byte(index % 3 + 1), Damage=Short(0), + tag=Compound(MigrationTest=String(name))) + for index, name in enumerate(item_names)] + for fluid in ('lithium', 'silicon'): + stacks.append(Compound(id=String('forge:bucketfilled'), Count=Byte(1), Damage=Short(0), + tag=Compound(FluidName=String(fluid), Amount=Int(1000), MigrationTest=String(fluid)))) + entities = List[Compound](level.get('TileEntities', [])) + level['TileEntities'] = entities + for index, start in enumerate(range(0, len(stacks), 27)): + chest_x, chest_z = index * 3 + 1, 8 + put(chest_z * 16 + chest_x, 54, 2) + inventory = List[Compound](stacks[start:start + 27]) + for slot_id, stack in enumerate(inventory): + stack['Slot'] = Byte(slot_id) + entities.append(Compound(id=String('minecraft:chest'), x=Int(cx * 16 + chest_x), + y=Int(y), z=Int(cz * 16 + chest_z), Items=inventory)) + raw = BytesIO() + chunk.write(raw) + compressed = zlib.compress(raw.getvalue()) + payload = struct.pack('>IB', len(compressed) + 1, 2) + compressed + sectors = (len(payload) + SECTOR - 1) // SECTOR + offset = len(region) // SECTOR + assert len(region) % SECTOR == 0 and sectors < 256 + region[slot * 4:slot * 4 + 4] = offset.to_bytes(3, 'big') + bytes([sectors]) + region.extend(payload.ljust(sectors * SECTOR, b'\0')) + region_path.write_bytes(region) + return len(solids), len(stacks) + + +def compare(before, after): + original_chunks, original_blocks, original_chests = before + chunks, blocks, chests = after + difference = {position: [original_blocks.get(position), blocks.get(position)] + for position in original_blocks.keys() | blocks.keys() + if original_blocks.get(position) != blocks.get(position)} + if difference: + preview = list(sorted(difference.items()))[:12] + raise AssertionError(f'{len(difference)} mineral coordinates or states changed. First changes {preview}') + assert original_chests == chests, 'Mineral chest items, counts or tags changed' + assert chunks == original_chunks, f'{len(original_chunks - chunks)} original chunks are missing' + return {'chunks': len(chunks), 'blocks': dict(sorted(Counter(b[0] for b in blocks.values()).items())), + 'chests': len(chests), 'stacks': sum(map(len, chests.values())), + 'coordinate_sha256': sha256(repr(sorted(blocks.items())).encode()).hexdigest()} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + for name in ('java', 'runtime', 'output', 'source'): + parser.add_argument('--' + name, required=True, type=Path) + parser.add_argument('--mods', required=True, nargs='+', type=Path) + parser.add_argument('--probe-chunk', nargs=2, type=int, default=PROBE_CHUNK) + parser.add_argument('--minimum-blocks', type=int, default=1000) + parser.add_argument('--natural-open', action='store_true', + help='Open normally before converting the remaining unloaded chunks') + args = parser.parse_args() + before_source = fingerprint(args.source) + prepare(args.runtime, args.output, args.mods, args.source) + target = args.output / 'world' + ids = {id_: name for id_, name in legacy_registry(target, 'blocks').items() if name.startswith(MOD)} + forms = add_fixture(target, args.probe_chunk) + before = census(target, ids) + rules = saved_mineral_rules(target) + assert len(before[1]) >= args.minimum_blocks and len(ids) > 0, 'No meaningful source mineral census' + source_manifest = {'source': str(args.source), 'fingerprint': before_source, 'registry': ids, + 'added_forms': forms, 'jars': {p.name: digest(p) for p in args.mods}} + (args.output / 'sources.json').write_text(json.dumps(source_manifest, indent=2)) + result = {} + try: + if args.natural_open: + run(args.java, args.output, 'natural-open') + result['natural-open'] = compare(before, census(target, ids, before[0])) + if rules: + assert saved_mineral_rules(target) == rules, 'Saved OreSpawn mineral rules changed' + for phase in ('first', 'reload'): + run(args.java, args.output, phase, upgrade=True) + result[phase] = compare(before, census(target, ids, before[0], require_flattened=True)) + if rules: + assert saved_mineral_rules(target) == rules, 'Saved OreSpawn mineral rules changed' + result[phase]['saved_rules'] = len(rules) + print(f"{phase} census PASS {result[phase]}", flush=True) + (args.output / 'results.json').write_text(json.dumps(result, indent=2)) + finally: + assert before_source == fingerprint(args.source), 'Source fixture changed' + + +if __name__ == '__main__': + main()