From 8000b83b7d57d66549886726b287bf0e60c85104 Mon Sep 17 00:00:00 2001 From: Pyritie Date: Sun, 20 Apr 2025 04:04:06 +0100 Subject: [PATCH 01/12] lowered greate ULS stress capacity again because it's really not that bad --- defaultconfigs/greate-server.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/defaultconfigs/greate-server.toml b/defaultconfigs/greate-server.toml index 912518982..570e2e47d 100644 --- a/defaultconfigs/greate-server.toml +++ b/defaultconfigs/greate-server.toml @@ -284,7 +284,7 @@ fanSpeedMultiplier = 0.75 #. #Configure the max stress a kinetic block of this tier can support. #Range: > -2147483648 - andesiteMaxCapacity = 32 + andesiteMaxCapacity = 16 #. #Settings related to steel tier machines From 8b3745f72f5ac4e45c19dc3356e5d1b359140587 Mon Sep 17 00:00:00 2001 From: Pyritie Date: Sun, 20 Apr 2025 13:34:41 +0100 Subject: [PATCH 02/12] Refactored ore recipes and moved them out of TFG-Core (#888) * refactored ore recipes and moved them out of TFG-Core. Also fixed the quern producing more output than the others, and added a workaround for the greate millstone bug * fixed VI centrifuging recipes and bulk washing recipes to be consistent with their LV versions --------- Signed-off-by: Pyritie --- kubejs/server_scripts/afc/recipes.js | 2 +- .../gregtech/recipes.materials.js | 871 +++++++++++------- .../server_scripts/tfc/recipes.materials.js | 5 - .../vintage_improvements/recipes.js | 55 +- 4 files changed, 531 insertions(+), 402 deletions(-) diff --git a/kubejs/server_scripts/afc/recipes.js b/kubejs/server_scripts/afc/recipes.js index 058a0b0f3..4be902fd8 100644 --- a/kubejs/server_scripts/afc/recipes.js +++ b/kubejs/server_scripts/afc/recipes.js @@ -177,7 +177,7 @@ const registerAFCRecipes = (event) => { .duration(300) .EUt(2) - event.replaceOutput({ id: 'gtceu:centrifuge/sticky_resin_separation' }, 'gtceu:raw_rubber_dust', 'gtceu:carbon_dust') + event.replaceOutput({ id: 'gtceu:centrifuge/sticky_resin_separation' }, 'gtceu:raw_rubber_dust', '3x gtceu:carbon_dust') //#endregion diff --git a/kubejs/server_scripts/gregtech/recipes.materials.js b/kubejs/server_scripts/gregtech/recipes.materials.js index 445ea350a..9ec0e6fba 100644 --- a/kubejs/server_scripts/gregtech/recipes.materials.js +++ b/kubejs/server_scripts/gregtech/recipes.materials.js @@ -4,10 +4,12 @@ function registerGTCEUMetalRecipes(event) { const makeToolRecipe = (toolType, headTagPrefix, extruderMold, cirucitMeta, material) => { const toolItem = ToolHelper.get(toolType, material) - if (toolItem.isEmpty()) return + if (toolItem.isEmpty()) + return const toolHeadItem = ChemicalHelper.get(headTagPrefix, material, 1) - if (toolHeadItem.isEmpty()) return + if (toolHeadItem.isEmpty()) + return event.recipes.tfc.advanced_shapeless_crafting( TFC.itemStackProvider.of(toolItem).copyForgingBonus().copyHeat(), @@ -19,10 +21,10 @@ function registerGTCEUMetalRecipes(event) { const processToolHead = (headTagPrefix, extruderMold, cirucitMeta, material) => { const toolHeadItem = ChemicalHelper.get(headTagPrefix, material, 1) - if (toolHeadItem.isEmpty()) return + if (toolHeadItem.isEmpty()) + return if (material.hasProperty(PropertyKey.INGOT)) { - const ingotItem = ChemicalHelper.get(TagPrefix.ingot, material, 1) if (ingotItem.isEmpty()) return @@ -120,8 +122,8 @@ function registerGTCEUMetalRecipes(event) { ).id(`gtceu:shaped/mortar_${material.getName()}`) } - const processIngot = (tagPrefix, material) => { - const ingotStack = ChemicalHelper.get(tagPrefix, material, 1) + const processIngot = (material) => { + const ingotStack = ChemicalHelper.get(TagPrefix.ingot, material, 1) if (material.hasFlag(MaterialFlags.GENERATE_PLATE) && material != GTMaterials.Wood @@ -161,30 +163,29 @@ function registerGTCEUMetalRecipes(event) { } } - const processPlate = (tagPrefix, material) => { - const item = ChemicalHelper.get(tagPrefix, material, 1) + const processPlate = (material) => { + const item = ChemicalHelper.get(TagPrefix.plate, material, 1) if (item.isEmpty()) return event.remove({ id: `gtceu:shaped/plate_${material.getName()}` }) } - const processPlateDouble = (tagPrefix, material) => { - const item = ChemicalHelper.get(tagPrefix, material, 1) + const processPlateDouble = (material) => { + const item = ChemicalHelper.get(TagPrefix.plateDouble, material, 1) if (item.isEmpty()) return event.remove({ id: `gtceu:shaped/plate_double_${material.getName()}` }) } - const processBlock = (tagPrefix, material) => { - const item = ChemicalHelper.get(tagPrefix, material, 1) + const processBlock = (material) => { + const item = ChemicalHelper.get(TagPrefix.block, material, 1) if (item.isEmpty()) return event.remove({ id: `gtceu:compressor/compress_${material.getName()}_to_block` }) } - const processFoil = (tagPrefix, material) => { - - const foilItem = ChemicalHelper.get(tagPrefix, material, 4) + const processFoil = (material) => { + const foilItem = ChemicalHelper.get(TagPrefix.foil, material, 4) const plateItem = ChemicalHelper.get(TagPrefix.plate, material, 1) if (plateItem != null && foilItem != null) { @@ -198,17 +199,17 @@ function registerGTCEUMetalRecipes(event) { } } - const processRodLong = (tagPrefix, material) => { - const item = ChemicalHelper.get(tagPrefix, material, 1) + const processRodLong = (material) => { + const item = ChemicalHelper.get(TagPrefix.rodLong, material, 1) if (item.isEmpty()) return event.remove({ id: `gtceu:shaped/stick_long_stick_${material.getName()}` }) } - const processIngotDouble = (tagPrefix, material) => { + const processIngotDouble = (material) => { if (!material.hasFlag(TFGMaterialFlags.GENERATE_DOUBLE_INGOTS)) return; - const doubleIngotStack = ChemicalHelper.get(tagPrefix, material, 1); + const doubleIngotStack = ChemicalHelper.get(TFGTagPrefix.ingotDouble, material, 1); if (material.hasProperty(PropertyKey.FLUID)) { event.recipes.gtceu.extractor(`tfg:extract_${material.getName()}_double_ingot`) @@ -245,10 +246,10 @@ function registerGTCEUMetalRecipes(event) { .circuit(3) } - const processSmallOre = (tagPrefix, material) => { + const processSmallOre = (material) => { if (!material.hasFlag(TFGMaterialFlags.HAS_SMALL_TFC_ORE)) return; - const smallOre = ChemicalHelper.get(tagPrefix, material, 1); + const smallOre = ChemicalHelper.get(TFGTagPrefix.oreSmall, material, 1); const smallDust = ChemicalHelper.get(TagPrefix.dustSmall, material, 1); event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_small_ore`) @@ -259,10 +260,10 @@ function registerGTCEUMetalRecipes(event) { .EUt(GTValues.VA[GTValues.ULV]) } - const processSmallNativeOre = (tagPrefix, material) => { + const processSmallNativeOre = (material) => { if (!material.hasFlag(TFGMaterialFlags.HAS_SMALL_NATIVE_TFC_ORE)) return; - const smallNativeOre = ChemicalHelper.get(tagPrefix, material, 1); + const smallNativeOre = ChemicalHelper.get(TFGTagPrefix.oreSmallNative, material, 1); const smallDust = ChemicalHelper.get(TagPrefix.dustSmall, material, 1); event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_small_native_ore`) @@ -273,55 +274,196 @@ function registerGTCEUMetalRecipes(event) { .EUt(GTValues.VA[GTValues.ULV]) } - const processPoorRawOre = (tagPrefix, material) => { - const poorOreItem = ChemicalHelper.get(tagPrefix, material, 2) - const crushedOreItem = ChemicalHelper.get(TagPrefix.crushed, material, Math.max(material.getProperty(PropertyKey.ORE).getOreMultiplier() / 2.0, 1)) + const processPoorRawOre = (material) => { + const poorOreItem = ChemicalHelper.get(TFGTagPrefix.poorRawOre, material, 1) + const crushedOreItem = ChemicalHelper.get(TagPrefix.crushed, material, 1) - if (poorOreItem != null && crushedOreItem != null) { + if (poorOreItem == null || crushedOreItem == null) + return; - event.recipes.tfc.quern(crushedOreItem, poorOreItem) - .id(`tfg:quern/${material.getName()}_crushed_ore_from_poor_raw_ore`) + const oreProperty = material.getProperty(PropertyKey.ORE) + const smeltingMaterial = oreProperty.getDirectSmeltResult() == null ? material : oreProperty.getDirectSmeltResult(); + const multiplier = oreProperty.getOreMultiplier(); - // TODO: Remove when Greate fixes its chanced output bug + let ingotItem = null; + if (smeltingMaterial.hasProperty(PropertyKey.INGOT)) + ingotItem = ChemicalHelper.get(TagPrefix.nugget, smeltingMaterial, 5) + else if (smeltingMaterial.hasProperty(PropertyKey.GEM)) + ingotItem = ChemicalHelper.get(TagPrefix.gemFlawed, smeltingMaterial, 1) + else + ingotItem = ChemicalHelper.get(TagPrefix.dustSmall, smeltingMaterial, 1) - event.shapeless(crushedOreItem, [poorOreItem, '#forge:tools/hammers']) - .id(`tfg:greate_workaround_crushed_${material.getName()}`) + ingotItem.setCount(ingotItem.getCount() * multiplier) + crushedOreItem.setCount(crushedOreItem.getCount() * multiplier) + + // Forge hammer + let hammerRecipe = event.recipes.gtceu.forge_hammer(`hammer_poor_raw_${material.getName()}_to_crushed_ore`) + .itemInputs(poorOreItem) + .category(GTRecipeCategories.ORE_FORGING) + .duration(10) + .EUt(16) + + if (material.hasProperty(PropertyKey.GEM) && !TagPrefix.gem.isIgnored(material)) + hammerRecipe.chancedOutput(ChemicalHelper.get(TagPrefix.gem, material, crushedOreItem.getCount()), 7500, 950) + else + hammerRecipe.chancedOutput(crushedOreItem, 7500, 950) + + // Macerator + let maceratorRecipe = event.recipes.gtceu.macerator(`macerate_poor_raw_${material.getName()}_ore_to_crushed_ore`) + .itemInputs(poorOreItem) + .category(GTRecipeCategories.ORE_CRUSHING) + .duration(400) + .EUt(2) + + if (multiplier > 1) { + maceratorRecipe.itemOutputs(crushedOreItem.copyWithCount(multiplier / 2)) + } + else { + // TODO: Change this when Greate fixes its bug + //maceratorRecipe.chancedOutput(crushedOreItem, 5000, 750) + maceratorRecipe.itemOutputs(ChemicalHelper.get(TagPrefix.dustSmall, material, 1)) + } + maceratorRecipe.chancedOutput(crushedOreItem.copyWithCount(1), 2500, 500) + .chancedOutput(crushedOreItem.copyWithCount(1), 1250, 250) + + // Quern + if (multiplier > 1) { + event.recipes.tfc.quern( + crushedOreItem.copyWithCount(multiplier / 2), + poorOreItem + ).id(`tfg:quern/${material.getName()}_crushed_ore_from_poor_raw_ore`) + } + else { + event.recipes.tfc.quern( + ChemicalHelper.get(TagPrefix.dustSmall, material, 1), + poorOreItem + ).id(`tfg:quern/${material.getName()}_crushed_ore_from_poor_raw_ore`) + } + + // Smelting + if (!material.hasProperty(PropertyKey.BLAST)) { + event.smelting(ingotItem, poorOreItem).id(`gtceu:smelting/smelt_poor_raw_${material.getName()}_ore_to_ingot`) } } - const processNormalRawOre = (tagPrefix, material) => { - const normalOreItem = ChemicalHelper.get(tagPrefix, material, 1) - const crushedOreItem = ChemicalHelper.get(TagPrefix.crushed, material, material.getProperty(PropertyKey.ORE).getOreMultiplier()) + const processNormalRawOre = (material) => { + const oreProperty = material.getProperty(PropertyKey.ORE) + const multiplier = oreProperty.getOreMultiplier(); + const normalOreItem = ChemicalHelper.get(TagPrefix.rawOre, material, 1) + const crushedOreItem = ChemicalHelper.get(TagPrefix.crushed, material, multiplier) - if (normalOreItem != null && crushedOreItem != null) { - event.recipes.tfc.quern(crushedOreItem, normalOreItem) - .id(`tfg:quern/${material.getName()}_crushed_ore_from_normal_raw_ore`) + if (normalOreItem == null || crushedOreItem == null) + return; + + const smeltingMaterial = oreProperty.getDirectSmeltResult() == null ? material : oreProperty.getDirectSmeltResult(); + + let ingotItem = null; + if (smeltingMaterial.hasProperty(PropertyKey.INGOT)) + ingotItem = ChemicalHelper.get(TagPrefix.ingot, smeltingMaterial, multiplier) + else if (smeltingMaterial.hasProperty(PropertyKey.GEM)) + ingotItem = ChemicalHelper.get(TagPrefix.gem, smeltingMaterial, multiplier) + else + ingotItem = ChemicalHelper.get(TagPrefix.dust, smeltingMaterial, multiplier) + + // Forge hammer + let hammerRecipe = event.recipes.gtceu.forge_hammer(`hammer_raw_${material.getName()}_to_crushed_ore`) + .itemInputs(normalOreItem) + .category(GTRecipeCategories.ORE_FORGING) + .duration(10) + .EUt(16) + + if (material.hasProperty(PropertyKey.GEM) && !TagPrefix.gem.isIgnored(material)) + hammerRecipe.itemOutputs(ChemicalHelper.get(TagPrefix.gem, material, crushedOreItem.getCount())) + else + hammerRecipe.itemOutputs(crushedOreItem) + + // Macerator + event.recipes.gtceu.macerator(`macerate_raw_${material.getName()}_ore_to_crushed_ore`) + .itemInputs(normalOreItem) + .itemOutputs(crushedOreItem) + .chancedOutput(crushedOreItem.copyWithCount(1), 5000, 500) + .chancedOutput(crushedOreItem.copyWithCount(1), 2500, 250) + .chancedOutput(crushedOreItem.copyWithCount(1), 1250, 250) + .category(GTRecipeCategories.ORE_CRUSHING) + .duration(400) + .EUt(2) + + // Quern + event.recipes.tfc.quern(crushedOreItem, normalOreItem) + .id(`tfg:quern/${material.getName()}_crushed_ore_from_normal_raw_ore`) + + // Smelting + if (!material.hasProperty(PropertyKey.BLAST)) { + event.smelting(ingotItem, normalOreItem).id(`gtceu:smelting/smelt_raw_${material.getName()}_ore_to_ingot`) } } - const processRichRawOre = (tagPrefix, material) => { - const richOreItem = ChemicalHelper.get(tagPrefix, material, 1) - const crushedOreItem = ChemicalHelper.get(TagPrefix.crushed, material, material.getProperty(PropertyKey.ORE).getOreMultiplier() * 2) + const processRichRawOre = (material) => { + const oreProperty = material.getProperty(PropertyKey.ORE) + const multiplier = oreProperty.getOreMultiplier() * 2; + const richOreItem = ChemicalHelper.get(TFGTagPrefix.richRawOre, material, 1) + const crushedOreItem = ChemicalHelper.get(TagPrefix.crushed, material, multiplier) - if (richOreItem != null && crushedOreItem != null) { - event.recipes.tfc.quern(crushedOreItem, richOreItem) - .id(`tfg:quern/${material.getName()}_crushed_ore_from_rich_raw_ore`) + if (richOreItem == null || crushedOreItem == null) + return; + + const smeltingMaterial = oreProperty.getDirectSmeltResult() == null ? material : oreProperty.getDirectSmeltResult(); + + let ingotItem = null; + if (smeltingMaterial.hasProperty(PropertyKey.INGOT)) + ingotItem = ChemicalHelper.get(TagPrefix.ingot, smeltingMaterial, multiplier) + else if (smeltingMaterial.hasProperty(PropertyKey.GEM)) + ingotItem = ChemicalHelper.get(TagPrefix.gem, smeltingMaterial, multiplier) + else + ingotItem = ChemicalHelper.get(TagPrefix.dust, smeltingMaterial, multiplier) + + // Forge hammer + let hammerRecipe = event.recipes.gtceu.forge_hammer(`hammer_rich_raw_${material.getName()}_to_crushed_ore`) + .itemInputs(richOreItem) + .category(GTRecipeCategories.ORE_FORGING) + .duration(10) + .EUt(16) + + if (material.hasProperty(PropertyKey.GEM) && !TagPrefix.gem.isIgnored(material)) + hammerRecipe.itemOutputs(ChemicalHelper.get(TagPrefix.gem, material, crushedOreItem.getCount())) + else + hammerRecipe.itemOutputs(crushedOreItem) + + // Macerator + event.recipes.gtceu.macerator(`macerate_rich_raw_${material.getName()}_ore_to_crushed_ore`) + .itemInputs(richOreItem) + .itemOutputs(crushedOreItem) + .chancedOutput(crushedOreItem.copyWithCount(1), 5000, 750) + .chancedOutput(crushedOreItem.copyWithCount(1), 2500, 500) + .chancedOutput(crushedOreItem.copyWithCount(1), 1250, 250) + .category(GTRecipeCategories.ORE_CRUSHING) + .duration(400) + .EUt(2) + + // Quern + event.recipes.tfc.quern(crushedOreItem, richOreItem) + .id(`tfg:quern/${material.getName()}_crushed_ore_from_rich_raw_ore`) + + // Smelting + if (!material.hasProperty(PropertyKey.BLAST)) { + event.smelting(ingotItem, richOreItem).id(`gtceu:smelting/smelt_rich_raw_${material.getName()}_ore_to_ingot`) } } - const processCrushedOre = (tagPrefix, material) => { - const crushedOreItem = ChemicalHelper.get(tagPrefix, material, 1) + const processCrushedOre = (material) => { + const crushedOreItem = ChemicalHelper.get(TagPrefix.crushed, material, 1) const pureOreItem = ChemicalHelper.get(TagPrefix.crushedPurified, material, 1) if (crushedOreItem != null && pureOreItem != null) { + // Bulk washing let byproductMaterial = material.getProperty(PropertyKey.ORE).getOreByProduct(0, material); const byproductItem = ChemicalHelper.get(TagPrefix.dust, byproductMaterial, 1) event.recipes.greate.splashing([pureOreItem, TieredOutputItem.of(byproductItem).withChance(0.333), 'gtceu:stone_dust'], crushedOreItem) .id(`tfg:splashing/${material.getName()}_purified_ore`) - // Дробленная руда -> Очищенная руда + // Dropping in water event.custom({ type: "ae2:transform", circumstance: { @@ -336,19 +478,29 @@ function registerGTCEUMetalRecipes(event) { } } - const processImpureDust = (tagPrefix, material) => { - const impureDustItem = ChemicalHelper.get(tagPrefix, material, 1) + const processImpureDust = (material) => { + const impureDustItem = ChemicalHelper.get(TagPrefix.dustImpure, material, 1) const dustItem = ChemicalHelper.get(TagPrefix.dust, material, 1) if (impureDustItem != null && dustItem != null) { - let byproductMaterial = material.getProperty(PropertyKey.ORE).getOreByProduct(0, material); - const byproductItem = ChemicalHelper.get(TagPrefix.dust, byproductMaterial, 1) - - event.recipes.greate.splashing([dustItem, TieredOutputItem.of(byproductItem).withChance(0.333), 'gtceu:stone_dust'], impureDustItem) + // Bulk washing + event.recipes.greate.splashing(dustItem, impureDustItem) .id(`tfg:splashing/${material.getName()}_dust_from_impure`) - // Грязная пыль -> Пыль + // Centrifuging + let byproductMaterial = material.getProperty(PropertyKey.ORE).getOreByProduct(0, material); + let byproductItem = ChemicalHelper.get(TagPrefix.dust, byproductMaterial, 1).toJson() + byproductItem.add("chance", 0.111); + + event.custom({ + type: 'vintageimprovements:centrifugation', + ingredients: [impureDustItem], + results: [dustItem, byproductItem], + processingTime: material.getMass() * 6 * global.VINTAGE_IMPROVEMENTS_DURATION_MULTIPLIER + }).id(`tfg:vi/centrifuge/${material.getName()}_dust_from_impure`) + + // Dropping in water event.custom({ type: "ae2:transform", circumstance: { @@ -363,19 +515,29 @@ function registerGTCEUMetalRecipes(event) { } } - const processPureDust = (tagPrefix, material) => { - const pureDust = ChemicalHelper.get(tagPrefix, material, 1) + const processPureDust = (material) => { + const pureDust = ChemicalHelper.get(TagPrefix.dustPure, material, 1) const dustItem = ChemicalHelper.get(TagPrefix.dust, material, 1) if (pureDust != null && dustItem != null) { - let byproductMaterial = material.getProperty(PropertyKey.ORE).getOreByProduct(0, material); - const byproductItem = ChemicalHelper.get(TagPrefix.dust, byproductMaterial, 1) - - event.recipes.greate.splashing([dustItem, TieredOutputItem.of(byproductItem).withChance(0.333), 'gtceu:stone_dust'], pureDust) + // Bulk washing + event.recipes.greate.splashing(dustItem, pureDust) .id(`tfg:splashing/${material.getName()}_dust_from_pure`) - // Очищенная пыль -> Пыль + // Centrifuging + let byproductMaterial = material.getProperty(PropertyKey.ORE).getOreByProduct(1, material); + let byproductItem = ChemicalHelper.get(TagPrefix.dust, byproductMaterial, 1).toJson() + byproductItem.add("chance", 0.111); + + event.custom({ + type: 'vintageimprovements:centrifugation', + ingredients: [pureDust], + results: [dustItem, byproductItem], + processingTime: material.getMass() * 6 * global.VINTAGE_IMPROVEMENTS_DURATION_MULTIPLIER + }).id(`tfg:vi/centrifuge/${material.getName()}_dust_from_pure`) + + // Dropping in water event.custom({ type: "ae2:transform", circumstance: { @@ -390,18 +552,290 @@ function registerGTCEUMetalRecipes(event) { } } + const processGems = (material) => { + let gem = ChemicalHelper.get(TagPrefix.gem, material, 1); + let chipped = ChemicalHelper.get(TagPrefix.gemChipped, material, 1) + let smallDust = ChemicalHelper.get(TagPrefix.dustSmall, material, 1) + + event.recipes.tfc.damage_inputs_shapeless_crafting(event.recipes.minecraft.crafting_shapeless( + `gtceu:${material.getName()}_bud_indicator`, [gem, '#tfc:chisels'])) + .id(`shapeless/${material.getName()}_bud_indicator`) + + event.shaped(smallDust, + [ 'A', 'B' ], + { A: chipped, B: '#forge:tools/mortars'}) + .id(`shapeless/mortar_chipped_${material.getName()}`) + } + + const processAnvil = (material) => { + const anvilStack = ChemicalHelper.get(TFGTagPrefix.anvil, material, 1) + if (anvilStack == null) + return; + + event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_anvil`) + .itemInputs(anvilStack) + .itemOutputs(ChemicalHelper.get(TagPrefix.dust, material, 14)) + .duration(material.getMass() * 32) + .category(GTRecipeCategories.MACERATOR_RECYCLING) + .EUt(GTValues.VA[GTValues.LV]) + + event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_anvil`) + .itemInputs(anvilStack) + .itemOutputs(ChemicalHelper.get(TagPrefix.ingot, material, 14)) + .duration(material.getMass() * 32) + .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.extractor(`tfg:extract_${material.getName()}_anvil`) + .itemInputs(anvilStack) + .outputFluids(Fluid.of(material.getFluid(), 14 * 144)) + .duration(material.getMass() * 32) + .category(GTRecipeCategories.EXTRACTOR_RECYCLING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.alloy_smelter(`tfg:cast_${material.getName()}_anvil`) + .itemInputs(ChemicalHelper.get(TagPrefix.ingot, material, 14)) + .notConsumable('gtceu:anvil_casting_mold') + .itemOutputs(anvilStack) + .duration(material.getMass() * 32) + .EUt(GTValues.VA[GTValues.ULV]) + .category(GTRecipeCategories.INGOT_MOLDING) + + event.recipes.gtceu.fluid_solidifier(`tfg:solidify_${material.getName()}_anvil`) + .inputFluids(Fluid.of(material.getFluid(), 14 * 144)) + .notConsumable('gtceu:anvil_casting_mold') + .itemOutputs(anvilStack) + .duration(material.getMass() * 32) + .EUt(GTValues.VA[GTValues.ULV]) + } + + const processLamp = (material) => { + const finishedLampStack = ChemicalHelper.get(TFGTagPrefix.lamp, material, 1) + if (finishedLampStack == null) + return; + + const materialDustStack = ChemicalHelper.get(TagPrefix.dust, material, 1) + const materialIngotStack = ChemicalHelper.get(TagPrefix.ingot, material, 1) + const glassDustStack = ChemicalHelper.get(TagPrefix.dust, GTMaterials.Glass, 4) + const unfinishedLampStack = ChemicalHelper.get(TFGTagPrefix.lampUnfinished, material, 1) + + event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_lamp`) + .itemInputs(finishedLampStack) + .itemOutputs([materialDustStack, glassDustStack]) + .duration(material.getMass() * 8) + .category(GTRecipeCategories.MACERATOR_RECYCLING) + .EUt(GTValues.VA[GTValues.LV]) + + event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_lamp`) + .itemInputs(finishedLampStack) + .itemOutputs([materialIngotStack, glassDustStack]) + .duration(material.getMass() * 8) + .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.assembler(`tfg:${material.getName()}_lamp`) + .itemInputs("tfc:lamp_glass", unfinishedLampStack) + .itemOutputs(finishedLampStack) + .duration(material.getMass() * 7) + .circuit(12) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.assembler(`tfg:${material.getName()}_lamp_from_liquid`) + .itemInputs(unfinishedLampStack) + .inputFluids(Fluid.of(GTMaterials.Glass.getFluid(), 576)) + .itemOutputs(finishedLampStack) + .duration(material.getMass() * 7) + .circuit(13) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_unfinished_lamp`) + .itemInputs(unfinishedLampStack) + .itemOutputs(materialDustStack) + .duration(material.getMass() * 8) + .category(GTRecipeCategories.MACERATOR_RECYCLING) + .EUt(GTValues.VA[GTValues.LV]) + + event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_unfinished_lamp`) + .itemInputs(unfinishedLampStack) + .itemOutputs([materialIngotStack, glassDustStack]) + .duration(material.getMass() * 8) + .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.extractor(`tfg:extract_${material.getName()}_unfinished_lamp`) + .itemInputs(unfinishedLampStack) + .outputFluids(Fluid.of(material.getFluid(), 144)) + .duration(material.getMass() * 8) + .category(GTRecipeCategories.EXTRACTOR_RECYCLING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.alloy_smelter(`tfg:cast_${material.getName()}_unfinished_lamp`) + .itemInputs(materialIngotStack) + .notConsumable('tfg:lamp_casting_mold') + .itemOutputs(unfinishedLampStack) + .duration(material.getMass() * 8) + .category(GTRecipeCategories.INGOT_MOLDING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.fluid_solidifier(`tfg:solidify_${material.getName()}_unfinished_lamp`) + .inputFluids(Fluid.of(material.getFluid(), 144)) + .notConsumable('tfg:lamp_casting_mold') + .itemOutputs(unfinishedLampStack) + .duration(material.getMass() * 8) + .EUt(GTValues.VA[GTValues.ULV]) + } + + const processTrapdoor = (material) => { + const trapdoorStack = ChemicalHelper.get(TFGTagPrefix.trapdoor, material, 1) + if (trapdoorStack == null) + return; + + const materialDustStack = ChemicalHelper.get(TagPrefix.dust, material, 1) + const materialIngotStack = ChemicalHelper.get(TagPrefix.ingot, material, 1) + + event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_trapdoor`) + .itemInputs(trapdoorStack) + .itemOutputs(materialDustStack) + .duration(material.getMass() * 7) + .category(GTRecipeCategories.MACERATOR_RECYCLING) + .EUt(GTValues.VA[GTValues.LV]) + + event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_trapdoor`) + .itemInputs(trapdoorStack) + .itemOutputs(materialIngotStack) + .duration(material.getMass() * 7) + .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.extractor(`tfg:extract_${material.getName()}_trapdoor`) + .itemInputs(trapdoorStack) + .outputFluids(Fluid.of(material.getFluid(), 144)) + .duration(material.getMass() * 7) + .category(GTRecipeCategories.EXTRACTOR_RECYCLING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.alloy_smelter(`tfg:cast_${material.getName()}_trapdoor`) + .itemInputs(materialIngotStack) + .notConsumable('tfg:trapdoor_casting_mold') + .itemOutputs(trapdoorStack) + .duration(material.getMass() * 8) + .category(GTRecipeCategories.INGOT_MOLDING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.fluid_solidifier(`tfg:solidify_${material.getName()}_trapdoor`) + .inputFluids(Fluid.of(material.getFluid(), 144)) + .notConsumable('tfg:trapdoor_casting_mold') + .itemOutputs(trapdoorStack) + .duration(material.getMass() * 7) + .EUt(GTValues.VA[GTValues.ULV]) + } + + const processChain = (material) => { + const chainStack = ChemicalHelper.get(TFGTagPrefix.chain, material, 1) + if (chainStack == null) + return; + + const chain2Stack = ChemicalHelper.get(TFGTagPrefix.chain, material, 2) + + const materialDustTinyStack = ChemicalHelper.get(TagPrefix.dustTiny, material, 1) + const materialNuggetStack = ChemicalHelper.get(TagPrefix.nugget, material, 1) + const materialIngotStack = ChemicalHelper.get(TagPrefix.ingot, material, 1) + + event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_chain`) + .itemInputs(chain2Stack) + .itemOutputs(materialDustTinyStack) + .duration(material.getMass() * 3) + .category(GTRecipeCategories.MACERATOR_RECYCLING) + .EUt(GTValues.VA[GTValues.LV]) + + event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_chain`) + .itemInputs(chain2Stack) + .itemOutputs(materialNuggetStack) + .duration(material.getMass() * 3) + .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.extractor(`tfg:extract_${material.getName()}_chain`) + .itemInputs(chainStack) + .outputFluids(Fluid.of(material.getFluid(), 9)) + .duration(material.getMass() * 3) + .category(GTRecipeCategories.EXTRACTOR_RECYCLING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.alloy_smelter(`tfg:cast_${material.getName()}_chain`) + .itemInputs(materialIngotStack) + .notConsumable('tfg:chain_casting_mold') + .itemOutputs(ChemicalHelper.get(TFGTagPrefix.chain, material, 16)) + .duration(material.getMass() * 3) + .category(GTRecipeCategories.INGOT_MOLDING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.fluid_solidifier(`tfg:solidify_${material.getName()}_chain`) + .inputFluids(Fluid.of(material.getFluid(), 9)) + .notConsumable('tfg:chain_casting_mold') + .itemOutputs(chainStack) + .duration(material.getMass() * 3) + .EUt(GTValues.VA[GTValues.ULV]) + } + + const processBell = (material) => { + const bellStack = ChemicalHelper.get(TFGTagPrefix.bell, material, 1) + if (bellStack == null) + return; + + const materialDustStack = ChemicalHelper.get(TagPrefix.dust, material, 1) + const materialIngotStack = ChemicalHelper.get(TagPrefix.ingot, material, 1) + + event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_bell`) + .itemInputs(bellStack) + .itemOutputs(materialDustStack) + .duration(material.getMass() * 5) + .category(GTRecipeCategories.MACERATOR_RECYCLING) + .EUt(GTValues.VA[GTValues.LV]) + + event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_bell`) + .itemInputs(bellStack) + .itemOutputs(materialIngotStack) + .duration(material.getMass() * 5) + .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.extractor(`tfg:extract_${material.getName()}_bell`) + .itemInputs(bellStack) + .outputFluids(Fluid.of(material.getFluid(), 144)) + .duration(material.getMass() * 5) + .category(GTRecipeCategories.EXTRACTOR_RECYCLING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.alloy_smelter(`tfg:cast_${material.getName()}_bell`) + .itemInputs(materialIngotStack) + .notConsumable('tfg:bell_casting_mold') + .itemOutputs(bellStack) + .duration(material.getMass() * 5) + .category(GTRecipeCategories.INGOT_MOLDING) + .EUt(GTValues.VA[GTValues.ULV]) + + event.recipes.gtceu.fluid_solidifier(`tfg:solidify_${material.getName()}_bell`) + .inputFluids(Fluid.of(material.getFluid(), 144)) + .notConsumable('tfg:bell_casting_mold') + .itemOutputs(bellStack) + .duration(material.getMass() * 5) + .EUt(GTValues.VA[GTValues.ULV]) + } + + const processBars = (material) => { + const barsStack = ChemicalHelper.get(TFGTagPrefix.bars, material, 4) + if (barsStack == null) + return; + + event.stonecutting(barsStack, ChemicalHelper.get(TagPrefix.ingot, material, 1)) + .id(`${material.getName()}_ingot_to_bars`) + } + GTMaterialRegistry.getRegisteredMaterials().forEach(material => { const toolProperty = material.getProperty(PropertyKey.TOOL) const ingotProperty = material.getProperty(PropertyKey.INGOT) const oreProperty = material.getProperty(PropertyKey.ORE) - const gemProperty = material.getProperty(PropertyKey.GEM) - - const anvilStack = ChemicalHelper.get(TFGTagPrefix.anvil, material, 1) - const finishedLampStack = ChemicalHelper.get(TFGTagPrefix.lamp, material, 1) - const trapdoorStack = ChemicalHelper.get(TFGTagPrefix.trapdoor, material, 1) - const chainStack = ChemicalHelper.get(TFGTagPrefix.chain, material, 1) - const bellStack = ChemicalHelper.get(TFGTagPrefix.bell, material, 1) - const barsStack = ChemicalHelper.get(TFGTagPrefix.bars, material, 4) if (toolProperty != null) { makeToolRecipe(GTToolType.SWORD, TFGTagPrefix.toolHeadSword, 'tfg:sword_head_extruder_mold', 1, material) @@ -428,285 +862,38 @@ function registerGTCEUMetalRecipes(event) { } if (ingotProperty != null) { - processIngot(TagPrefix.ingot, material) - processPlate(TagPrefix.plate, material) - processPlateDouble(TagPrefix.plateDouble, material) - processBlock(TagPrefix.block, material) - processFoil(TagPrefix.foil, material) - processRodLong(TagPrefix.rodLong, material) - processIngotDouble(TFGTagPrefix.ingotDouble, material) + processIngot(material) + processPlate(material) + processPlateDouble(material) + processBlock(material) + processFoil(material) + processRodLong(material) + processIngotDouble(material) + + processAnvil(material) + processLamp(material) + processTrapdoor(material) + processChain(material) + processBell(material) + processBars(material) } if (oreProperty != null) { - processSmallOre(TFGTagPrefix.oreSmall, material) - processSmallNativeOre(TFGTagPrefix.oreSmallNative, material) - processPoorRawOre(TFGTagPrefix.poorRawOre, material) - processNormalRawOre(TagPrefix.rawOre, material) - processRichRawOre(TFGTagPrefix.richRawOre, material) + processSmallOre(material) + processSmallNativeOre(material) + processPoorRawOre(material) + processNormalRawOre(material) + processRichRawOre(material) - processCrushedOre(TagPrefix.crushed, material) - processImpureDust(TagPrefix.dustImpure, material) - processPureDust(TagPrefix.dustPure, material) + processCrushedOre(material) + processImpureDust(material) + processPureDust(material) - if (gemProperty != null) { - let gem = ChemicalHelper.get(TagPrefix.gem, material, 1); - let chipped = ChemicalHelper.get(TagPrefix.gemChipped, material, 1) - let smallDust = ChemicalHelper.get(TagPrefix.dustSmall, material, 1) - - event.recipes.tfc.damage_inputs_shapeless_crafting(event.recipes.minecraft.crafting_shapeless( - `gtceu:${material.getName()}_bud_indicator`, [gem, '#tfc:chisels'])) - .id(`shapeless/${material.getName()}_bud_indicator`) - - event.shaped(smallDust, - [ 'A', 'B' ], - { A: chipped, B: '#forge:tools/mortars'}) - .id(`shapeless/mortar_chipped_${material.getName()}`) + if (material.hasProperty(PropertyKey.GEM)) { + processGems(material) } - } - - if (anvilStack != null) { - event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_anvil`) - .itemInputs(anvilStack) - .itemOutputs(ChemicalHelper.get(TagPrefix.dust, material, 14)) - .duration(material.getMass() * 32) - .category(GTRecipeCategories.MACERATOR_RECYCLING) - .EUt(GTValues.VA[GTValues.LV]) - - event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_anvil`) - .itemInputs(anvilStack) - .itemOutputs(ChemicalHelper.get(TagPrefix.ingot, material, 14)) - .duration(material.getMass() * 32) - .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.extractor(`tfg:extract_${material.getName()}_anvil`) - .itemInputs(anvilStack) - .outputFluids(Fluid.of(material.getFluid(), 14 * 144)) - .duration(material.getMass() * 32) - .category(GTRecipeCategories.EXTRACTOR_RECYCLING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.alloy_smelter(`tfg:cast_${material.getName()}_anvil`) - .itemInputs(ChemicalHelper.get(TagPrefix.ingot, material, 14)) - .notConsumable('gtceu:anvil_casting_mold') - .itemOutputs(anvilStack) - .duration(material.getMass() * 32) - .EUt(GTValues.VA[GTValues.ULV]) - .category(GTRecipeCategories.INGOT_MOLDING) - - event.recipes.gtceu.fluid_solidifier(`tfg:solidify_${material.getName()}_anvil`) - .inputFluids(Fluid.of(material.getFluid(), 14 * 144)) - .notConsumable('gtceu:anvil_casting_mold') - .itemOutputs(anvilStack) - .duration(material.getMass() * 32) - .EUt(GTValues.VA[GTValues.ULV]) - } - - if (finishedLampStack != null) { - const materialDustStack = ChemicalHelper.get(TagPrefix.dust, material, 1) - const materialIngotStack = ChemicalHelper.get(TagPrefix.ingot, material, 1) - const glassDustStack = ChemicalHelper.get(TagPrefix.dust, GTMaterials.Glass, 4) - const unfinishedLampStack = ChemicalHelper.get(TFGTagPrefix.lampUnfinished, material, 1) - - event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_lamp`) - .itemInputs(finishedLampStack) - .itemOutputs([materialDustStack, glassDustStack]) - .duration(material.getMass() * 8) - .category(GTRecipeCategories.MACERATOR_RECYCLING) - .EUt(GTValues.VA[GTValues.LV]) - - event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_lamp`) - .itemInputs(finishedLampStack) - .itemOutputs([materialIngotStack, glassDustStack]) - .duration(material.getMass() * 8) - .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.assembler(`tfg:${material.getName()}_lamp`) - .itemInputs("tfc:lamp_glass", unfinishedLampStack) - .itemOutputs(finishedLampStack) - .duration(material.getMass() * 7) - .circuit(12) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.assembler(`tfg:${material.getName()}_lamp_from_liquid`) - .itemInputs(unfinishedLampStack) - .inputFluids(Fluid.of(GTMaterials.Glass.getFluid(), 576)) - .itemOutputs(finishedLampStack) - .duration(material.getMass() * 7) - .circuit(13) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_unfinished_lamp`) - .itemInputs(unfinishedLampStack) - .itemOutputs(materialDustStack) - .duration(material.getMass() * 8) - .category(GTRecipeCategories.MACERATOR_RECYCLING) - .EUt(GTValues.VA[GTValues.LV]) - - event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_unfinished_lamp`) - .itemInputs(unfinishedLampStack) - .itemOutputs([materialIngotStack, glassDustStack]) - .duration(material.getMass() * 8) - .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.extractor(`tfg:extract_${material.getName()}_unfinished_lamp`) - .itemInputs(unfinishedLampStack) - .outputFluids(Fluid.of(material.getFluid(), 144)) - .duration(material.getMass() * 8) - .category(GTRecipeCategories.EXTRACTOR_RECYCLING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.alloy_smelter(`tfg:cast_${material.getName()}_unfinished_lamp`) - .itemInputs(materialIngotStack) - .notConsumable('tfg:lamp_casting_mold') - .itemOutputs(unfinishedLampStack) - .duration(material.getMass() * 8) - .category(GTRecipeCategories.INGOT_MOLDING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.fluid_solidifier(`tfg:solidify_${material.getName()}_unfinished_lamp`) - .inputFluids(Fluid.of(material.getFluid(), 144)) - .notConsumable('tfg:lamp_casting_mold') - .itemOutputs(unfinishedLampStack) - .duration(material.getMass() * 8) - .EUt(GTValues.VA[GTValues.ULV]) - } - - if (trapdoorStack != null) { - const materialDustStack = ChemicalHelper.get(TagPrefix.dust, material, 1) - const materialIngotStack = ChemicalHelper.get(TagPrefix.ingot, material, 1) - - event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_trapdoor`) - .itemInputs(trapdoorStack) - .itemOutputs(materialDustStack) - .duration(material.getMass() * 7) - .category(GTRecipeCategories.MACERATOR_RECYCLING) - .EUt(GTValues.VA[GTValues.LV]) - - event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_trapdoor`) - .itemInputs(trapdoorStack) - .itemOutputs(materialIngotStack) - .duration(material.getMass() * 7) - .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.extractor(`tfg:extract_${material.getName()}_trapdoor`) - .itemInputs(trapdoorStack) - .outputFluids(Fluid.of(material.getFluid(), 144)) - .duration(material.getMass() * 7) - .category(GTRecipeCategories.EXTRACTOR_RECYCLING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.alloy_smelter(`tfg:cast_${material.getName()}_trapdoor`) - .itemInputs(materialIngotStack) - .notConsumable('tfg:trapdoor_casting_mold') - .itemOutputs(trapdoorStack) - .duration(material.getMass() * 8) - .category(GTRecipeCategories.INGOT_MOLDING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.fluid_solidifier(`tfg:solidify_${material.getName()}_trapdoor`) - .inputFluids(Fluid.of(material.getFluid(), 144)) - .notConsumable('tfg:trapdoor_casting_mold') - .itemOutputs(trapdoorStack) - .duration(material.getMass() * 7) - .EUt(GTValues.VA[GTValues.ULV]) - } - - if (chainStack != null) { - const chain2Stack = ChemicalHelper.get(TFGTagPrefix.chain, material, 2) - - const materialDustTinyStack = ChemicalHelper.get(TagPrefix.dustTiny, material, 1) - const materialNuggetStack = ChemicalHelper.get(TagPrefix.nugget, material, 1) - const materialIngotStack = ChemicalHelper.get(TagPrefix.ingot, material, 1) - - event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_chain`) - .itemInputs(chain2Stack) - .itemOutputs(materialDustTinyStack) - .duration(material.getMass() * 3) - .category(GTRecipeCategories.MACERATOR_RECYCLING) - .EUt(GTValues.VA[GTValues.LV]) - - event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_chain`) - .itemInputs(chain2Stack) - .itemOutputs(materialNuggetStack) - .duration(material.getMass() * 3) - .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.extractor(`tfg:extract_${material.getName()}_chain`) - .itemInputs(chainStack) - .outputFluids(Fluid.of(material.getFluid(), 9)) - .duration(material.getMass() * 3) - .category(GTRecipeCategories.EXTRACTOR_RECYCLING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.alloy_smelter(`tfg:cast_${material.getName()}_chain`) - .itemInputs(materialIngotStack) - .notConsumable('tfg:chain_casting_mold') - .itemOutputs(ChemicalHelper.get(TFGTagPrefix.chain, material, 16)) - .duration(material.getMass() * 3) - .category(GTRecipeCategories.INGOT_MOLDING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.fluid_solidifier(`tfg:solidify_${material.getName()}_chain`) - .inputFluids(Fluid.of(material.getFluid(), 9)) - .notConsumable('tfg:chain_casting_mold') - .itemOutputs(chainStack) - .duration(material.getMass() * 3) - .EUt(GTValues.VA[GTValues.ULV]) - } - - if (bellStack != null) { - const materialDustStack = ChemicalHelper.get(TagPrefix.dust, material, 1) - const materialIngotStack = ChemicalHelper.get(TagPrefix.ingot, material, 1) - - event.recipes.gtceu.macerator(`tfg:macerate_${material.getName()}_bell`) - .itemInputs(bellStack) - .itemOutputs(materialDustStack) - .duration(material.getMass() * 5) - .category(GTRecipeCategories.MACERATOR_RECYCLING) - .EUt(GTValues.VA[GTValues.LV]) - - event.recipes.gtceu.arc_furnace(`tfg:arc_${material.getName()}_bell`) - .itemInputs(bellStack) - .itemOutputs(materialIngotStack) - .duration(material.getMass() * 5) - .category(GTRecipeCategories.ARC_FURNACE_RECYCLING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.extractor(`tfg:extract_${material.getName()}_bell`) - .itemInputs(bellStack) - .outputFluids(Fluid.of(material.getFluid(), 144)) - .duration(material.getMass() * 5) - .category(GTRecipeCategories.EXTRACTOR_RECYCLING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.alloy_smelter(`tfg:cast_${material.getName()}_bell`) - .itemInputs(materialIngotStack) - .notConsumable('tfg:bell_casting_mold') - .itemOutputs(bellStack) - .duration(material.getMass() * 5) - .category(GTRecipeCategories.INGOT_MOLDING) - .EUt(GTValues.VA[GTValues.ULV]) - - event.recipes.gtceu.fluid_solidifier(`tfg:solidify_${material.getName()}_bell`) - .inputFluids(Fluid.of(material.getFluid(), 144)) - .notConsumable('tfg:bell_casting_mold') - .itemOutputs(bellStack) - .duration(material.getMass() * 5) - .EUt(GTValues.VA[GTValues.ULV]) - } - - if (barsStack != null) { - event.stonecutting(barsStack, ChemicalHelper.get(TagPrefix.ingot, material, 1)) - .id(`${material.getName()}_ingot_to_bars`) - } - - // Indicators - if (oreProperty != null) { + + // Indicators event.replaceInput({ id: `gtceu:shaped/${material.getName()}_surface_indicator`}, 'minecraft:gravel', '#tfc:rock/gravel') } diff --git a/kubejs/server_scripts/tfc/recipes.materials.js b/kubejs/server_scripts/tfc/recipes.materials.js index 82b09a155..0ff8fd95c 100644 --- a/kubejs/server_scripts/tfc/recipes.materials.js +++ b/kubejs/server_scripts/tfc/recipes.materials.js @@ -579,11 +579,6 @@ function registerTFCMaterialsRecipes(event) { .useDurability(true) .id(`rnr:heating/metal/${material.getName()}_mattock`) - // event.recipes.tfc.anvil(`rnr:metal/mattock_head/${material.getName()}`, ingotItem, ['punch_last', 'punch_not_last', 'draw_not_last']) - // .tier(tfcProperty.getTier()) - // .bonus(true) - // .id(`rnr:anvil/${material.getName()}_mattock_head`) - event.recipes.tfc.heating(`rnr:metal/mattock_head/${material.getName()}`, tfcProperty.getMeltTemp()) .resultFluid(Fluid.of(outputMaterial.getFluid(), 144)) .id(`rnr:heating/metal/${material.getName()}_mattock_head`) diff --git a/kubejs/server_scripts/vintage_improvements/recipes.js b/kubejs/server_scripts/vintage_improvements/recipes.js index 89407e247..584f06431 100644 --- a/kubejs/server_scripts/vintage_improvements/recipes.js +++ b/kubejs/server_scripts/vintage_improvements/recipes.js @@ -489,6 +489,7 @@ function registerVintageImprovementsRecipes(event) { // #region Curving Press + // Copied from https://github.com/ThePansmith/Monifactory/blob/15c109298104e0c0b5083b266264bd6c158c6154/kubejs/server_scripts/mods/optionalCompats/create.js#L251 event.forEachRecipe([{ type: 'gtceu:extruder' }], recipe => { let r = JSON.parse(recipe.json) @@ -517,60 +518,6 @@ function registerVintageImprovementsRecipes(event) { // #endregion - // #region Centrifuge - - // Copied from https://github.com/ThePansmith/Monifactory/blob/15c109298104e0c0b5083b266264bd6c158c6154/kubejs/server_scripts/mods/optionalCompats/create.js#L251 - event.forEachRecipe([{ type: 'gtceu:centrifuge' }], - recipe => { - let r = JSON.parse(recipe.json) - - // ULV recipes only - let EUt = (r.tickInputs && r.tickInputs.eu) ? r.tickInputs.eu[0].content : null; - if (!(EUt <= 8)) { return } - - let inputs = []; - if (r.inputs.item) { - r.inputs.item.forEach(i => { - let ins = i.content.ingredient; - - if (i.content.count) - ins.count = i.content.count; - - inputs.push(ins) - }) - } - else return; - - let outputs = []; - if (r.outputs.item) { - r.outputs.item.forEach(i => { - let out = i.content.ingredient; - - if (i.content.count) - out.count = i.content.count; - - if (i.chance != 0 && i.chance != 10000) - out.chance = i.chance / 10000; - - outputs.push(out) - }) - } - else return; - - event.custom({ - type: 'vintageimprovements:centrifugation', - ingredients: inputs, - results: outputs, - processingTime: r.duration * global.VINTAGE_IMPROVEMENTS_DURATION_MULTIPLIER - }).id(`tfg:vi/${recipe.getId().split(':')[1]}`) - } - ) - - // Fix weird inconsistency - event.replaceOutput({ id: 'tfg:vi/centrifuge/sticky_resin_separation' }, 'gtceu:raw_rubber_dust', 'gtceu:carbon_dust') - - // #endregion - // #region Vacuum event.custom({ From 4e966955892ed43f20f2a4dfcb88f65404922d21 Mon Sep 17 00:00:00 2001 From: Redeix <59435925+Redeix@users.noreply.github.com> Date: Sun, 20 Apr 2025 07:35:20 -0500 Subject: [PATCH 03/12] Changed max size for Astikor Carts (#903) --- defaultconfigs/tfcastikorcarts-common.toml | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 defaultconfigs/tfcastikorcarts-common.toml diff --git a/defaultconfigs/tfcastikorcarts-common.toml b/defaultconfigs/tfcastikorcarts-common.toml new file mode 100644 index 000000000..f202e1249 --- /dev/null +++ b/defaultconfigs/tfcastikorcarts-common.toml @@ -0,0 +1,45 @@ + +[general] + # + # Max animal size that the animal cart can carry. + #Range: 0.0 ~ 1.7976931348623157E308 + maxAnimalSize = 3.0 + # + # Amount of animals the animal cart can carry. + #Range: > 0 + maxPassengerCount = 2 + # + # The largest (inclusive) size of an item that is allowed in a supply cart. + #Allowed Values: TINY, VERY_SMALL, SMALL, NORMAL, LARGE, VERY_LARGE, HUGE + maxItemSize = "HUGE" + # + # Can the animal cart pick up players by pushing it into them? + canPushIntoPlayers = true + # + # Can the animal cart pick up water animals? + canCarryWaterEntities = true + # + # Pulling distance modifier for carts. Higher => farther/greater break tolerance. + #Range: 4.9E-324 ~ 1.7976931348623157E308 + pullingDistanceModifier = 2.0 + # + # Should the player's average nutrient level and thirst affect the pulling speed of carts? + toggleFoodSpeed = true + # + # A very heavy huge item has a combined weight/size factor of 35, thus if a threshold is 140, then the player can carry 4 items. + # Threshold at which the player carrying a cart will get exhausted. Higher => can carry more. + #Range: 0.0 ~ 1.7976931348623157E308 + exhaustedThreshold = 140.0 + # + # Threshold at which the player carrying a cart will get overburdened. Higher => can carry more. + #Range: 0.0 ~ 1.7976931348623157E308 + overburdenedThreshold = 280.0 + # + # Threshold at which the player carrying a cart will get pinned. Higher => can carry more. + #Range: 0.0 ~ 1.7976931348623157E308 + pinnedThreshold = 420.0 + # + # How big the supply cart inventory should be. + #Allowed Values: SIZE_0, SIZE_1, SIZE_2, SIZE_3, SIZE_4, SIZE_5, SIZE_6, SIZE_7, SIZE_8, SIZE_9, SIZE_10, SIZE_11, SIZE_12, SIZE_13 + supplyCartInventorySize = "SIZE_6" + From ce6944c9b634a12762953ae2fc0e307a130d0cf4 Mon Sep 17 00:00:00 2001 From: Pyritie Date: Sun, 20 Apr 2025 14:01:28 +0100 Subject: [PATCH 04/12] don't need any more --- .../lootr/loot_table/blocks/lootr_chest.json | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 kubejs/data/lootr/loot_table/blocks/lootr_chest.json diff --git a/kubejs/data/lootr/loot_table/blocks/lootr_chest.json b/kubejs/data/lootr/loot_table/blocks/lootr_chest.json deleted file mode 100644 index 07e34f885..000000000 --- a/kubejs/data/lootr/loot_table/blocks/lootr_chest.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "functions": [ - { - "function": "minecraft:copy_components", - "include": [ - "minecraft:custom_name" - ], - "source": "block_entity" - } - ], - "name": "tfc:wood/chest/hickory" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "lootr:blocks/lootr_chest" -} \ No newline at end of file From dace370ebee2c142d7371d45b42a75f6a586183e Mon Sep 17 00:00:00 2001 From: Pyritie Date: Sun, 20 Apr 2025 14:01:36 +0100 Subject: [PATCH 05/12] moved wooden tongs earlier --- .../quests/chapters/questsstoneage.snbt | 131 +++++++++++------- 1 file changed, 81 insertions(+), 50 deletions(-) diff --git a/config/ftbquests/quests/chapters/questsstoneage.snbt b/config/ftbquests/quests/chapters/questsstoneage.snbt index ab5f24629..2c539de95 100644 --- a/config/ftbquests/quests/chapters/questsstoneage.snbt +++ b/config/ftbquests/quests/chapters/questsstoneage.snbt @@ -304,21 +304,70 @@ "{@pagebreak}" "{quests.stone_age.first_saw.desc.2}" ] + icon: { + Count: 1 + ForgeCaps: { + "tfc:item_heat": { + heat: 0.0f + ticks: 0L + } + } + id: "gtceu:copper_saw" + tag: { + DisallowContainerItem: 0b + GT.Behaviours: { + HarvestIce: 1b + } + GT.Tool: { + Damage: 0 + MaxDamage: 791 + } + HideFlags: 2 + } + } id: "76B145EFF9B5DB67" min_required_dependencies: 2 subtitle: "{quests.stone_age.first_saw.subtitle}" - tasks: [{ - id: "552927025A57B775" - item: { - Count: 1 - id: "ftbfiltersystem:smart_filter" - tag: { - "ftbfiltersystem:filter": "or(item(gtceu:copper_saw)item(gtceu:bismuth_bronze_saw)item(gtceu:bronze_saw)item(gtceu:black_bronze_saw))" + tasks: [ + { + id: "552927025A57B775" + item: { + Count: 1 + id: "ftbfiltersystem:smart_filter" + tag: { + "ftbfiltersystem:filter": "or(item(gtceu:copper_saw)item(gtceu:bismuth_bronze_saw)item(gtceu:bronze_saw)item(gtceu:black_bronze_saw))" + } } + title: "{quests.stone_age.first_saw.tasks.2}" + type: "item" } - title: "{quests.stone_age.first_saw.tasks.2}" - type: "item" - }] + { + icon: { + Count: 1 + ForgeCaps: { + "tfc:item_heat": { + heat: 0.0f + ticks: 0L + } + } + id: "tfchotornot:tongs/wood" + tag: { + Damage: 0 + } + } + id: "4CB979BADAFE0689" + item: { + Count: 1 + id: "ftbfiltersystem:smart_filter" + tag: { + "ftbfiltersystem:filter": "ftbfiltersystem:item_tag(tfchotornot:insulating)" + } + } + optional_task: true + title: "Any #tfchotornot:insulating" + type: "item" + } + ] title: "{quests.stone_age.first_saw.title}" x: 11.0d y: 8.5d @@ -638,49 +687,21 @@ description: ["{quests.stone_age.weld_copper_ingots.desc}"] id: "45A09AD0043FF92B" subtitle: "{quests.stone_age.weld_copper_ingots.subtitle}" - tasks: [ - { - count: 7L - id: "5A6EF9EBF232601C" - item: { - Count: 7 - ForgeCaps: { - "tfc:item_heat": { - heat: 0.0f - ticks: 0L - } + tasks: [{ + count: 7L + id: "5A6EF9EBF232601C" + item: { + Count: 7 + ForgeCaps: { + "tfc:item_heat": { + heat: 0.0f + ticks: 0L } - id: "gtceu:copper_double_ingot" } - type: "item" + id: "gtceu:copper_double_ingot" } - { - icon: { - Count: 1 - ForgeCaps: { - "tfc:item_heat": { - heat: 0.0f - ticks: 0L - } - } - id: "tfchotornot:tongs/wood" - tag: { - Damage: 0 - } - } - id: "16434B6660C44E17" - item: { - Count: 1 - id: "ftbfiltersystem:smart_filter" - tag: { - "ftbfiltersystem:filter": "ftbfiltersystem:item_tag(tfchotornot:insulating)" - } - } - optional_task: true - title: "Any #tfchotornot:insulating" - type: "item" - } - ] + type: "item" + }] title: "{quests.stone_age.weld_copper_ingots.title}" x: 21.0d y: 8.5d @@ -689,6 +710,16 @@ dependencies: ["5E186CD5E83BFDF0"] dependency_requirement: "one_completed" description: ["{quests.stone_age.flux.desc}"] + icon: { + Count: 1 + ForgeCaps: { + "tfc:item_heat": { + heat: 0.0f + ticks: 0L + } + } + id: "tfc:powder/flux" + } id: "30E26DC33FD019FE" subtitle: "{quests.stone_age.flux.subtitle}" tasks: [ From 30d25177bc94717ee700df18e9f1c4f0c0cbeca1 Mon Sep 17 00:00:00 2001 From: Pyritie Date: Sun, 20 Apr 2025 14:42:51 +0100 Subject: [PATCH 06/12] fixed not being able to pick up spring water or use it in a barrel/mixing bowl --- kubejs/server_scripts/firmalife/tags.js | 2 ++ kubejs/server_scripts/tfc/tags.js | 5 +++++ kubejs/server_scripts/tfg/tags.js | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/kubejs/server_scripts/firmalife/tags.js b/kubejs/server_scripts/firmalife/tags.js index 99fe9f2e9..87f7914c0 100644 --- a/kubejs/server_scripts/firmalife/tags.js +++ b/kubejs/server_scripts/firmalife/tags.js @@ -36,6 +36,8 @@ const registerFirmaLifeFluidTags = (event) => { // Добавляем тег для скрытия в EMI event.add('c:hidden_from_recipe_viewers', 'firmalife:metal/chromium') + + event.add('firmalife:mixable', 'tfc:spring_water') } const registerFirmaLifePlacedFeatures = (event) => { diff --git a/kubejs/server_scripts/tfc/tags.js b/kubejs/server_scripts/tfc/tags.js index a59e09a0e..193c1db14 100644 --- a/kubejs/server_scripts/tfc/tags.js +++ b/kubejs/server_scripts/tfc/tags.js @@ -444,6 +444,11 @@ const registerTFCFluidTags = (event) => { event.add('tfc:usable_in_red_steel_bucket', 'gtceu:creosote') event.add('tfc:usable_in_blue_steel_bucket', 'gtceu:creosote') + event.add('tfc:ingredients', 'tfc:spring_water') + event.add('tfc:usable_in_barrel', 'tfc:spring_water') + event.add('tfc:usable_in_wooden_bucket', 'tfc:spring_water') + event.add('tfc:usable_in_red_steel_bucket', 'tfc:spring_water') + // Добавляем тег для скрытия в EMI event.add('c:hidden_from_recipe_viewers', 'tfc:metal/bismuth') event.add('c:hidden_from_recipe_viewers', 'tfc:metal/bismuth_bronze') diff --git a/kubejs/server_scripts/tfg/tags.js b/kubejs/server_scripts/tfg/tags.js index 9a0480460..1101bef09 100644 --- a/kubejs/server_scripts/tfg/tags.js +++ b/kubejs/server_scripts/tfg/tags.js @@ -225,14 +225,20 @@ const registerTFGFluidTags = (event) => { event.add('tfc:usable_in_pot', 'tfg:latex') event.add('tfc:usable_in_barrel', 'tfg:latex') event.add('tfc:usable_in_wooden_bucket', 'tfg:latex') + event.add('tfc:usable_in_red_steel_bucket', 'tfg:latex') + event.add('tfc:usable_in_blue_steel_bucket', 'tfg:latex') event.add('tfc:usable_in_pot', 'tfg:vulcanized_latex') event.add('tfc:usable_in_barrel', 'tfg:vulcanized_latex') event.add('tfc:usable_in_wooden_bucket', 'tfg:vulcanized_latex') + event.add('tfc:usable_in_red_steel_bucket', 'tfg:vulcanized_latex') + event.add('tfc:usable_in_blue_steel_bucket', 'tfg:vulcanized_latex') event.add('tfc:usable_in_pot', 'tfg:conifer_pitch') event.add('tfc:usable_in_barrel', 'tfg:conifer_pitch') event.add('tfc:usable_in_wooden_bucket', 'tfg:conifer_pitch') + event.add('tfc:usable_in_red_steel_bucket', 'tfg:conifer_pitch') + event.add('tfc:usable_in_blue_steel_bucket', 'tfg:conifer_pitch') } From 7babaf2dfae46525e5917eee90c27d8125cc093f Mon Sep 17 00:00:00 2001 From: Pyritie Date: Sun, 20 Apr 2025 14:45:23 +0100 Subject: [PATCH 07/12] updated stone age quests --- kubejs/assets/tfg/lang/en_us.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kubejs/assets/tfg/lang/en_us.json b/kubejs/assets/tfg/lang/en_us.json index 11a2f418a..dfd4f52e5 100644 --- a/kubejs/assets/tfg/lang/en_us.json +++ b/kubejs/assets/tfg/lang/en_us.json @@ -205,6 +205,7 @@ "item.treetap.tap": "Deprecated Item, Craft to Upgrade", "tfc.jei.flint_knapping": "Flint Knapping", "tfc.recipe.barrel.tfg.barrel.soak_hardwood_strip": "Soaking Hardwood Strips", + "tfc.recipe.barrel.tfc.barrel.treated_wood_planks": "Treating Wood Planks", "item.gtceu.zinc_ingot": "Deprecated Item, Craft to Upgrade", "item.gtceu.brass_ingot": "Deprecated Item, Craft to Upgrade", "item.gtceu.vanadium_ingot": "Deprecated Item, Craft to Upgrade", @@ -1177,7 +1178,7 @@ "quests.stone_age.native_ores.desc.2": "Why are they called Indicators? This means that directly below, there is a big, HUGE vein with the same ore that you found on the surface. You don't have a pickaxe yet, so take note of the place where you found the Ore! It'll be very useful later on.\n\nEach one is worth about as much as a nugget, so collect as many as you can, but make sure you make a note of where you found them!", "quests.stone_age.first_saw.title": "Metallic Saw", "quests.stone_age.first_saw.subtitle": "Time for your first metal tool", - "quests.stone_age.first_saw.desc.1": "To begin making your Saw, add at least 144mb of ore of your desired metal to a Vessel. Afterwards, place the Vessel in a Pit Kiln and light it on fire.\n\nOnce the Pit Kiln burns out, quickly pick up your vessel while it's still hot, and interact with it to open the Pouring interface. Simply place the Saw Mold in the Pouring Interface's slot and watch it fill with your very first Saw Head. Afterwards, combine your Saw Head with a Stick and you'll create your Saw!", + "quests.stone_age.first_saw.desc.1": "To begin making your Saw, add at least 144mb of ore of your desired metal to a Vessel. Afterwards, place the Vessel in a Pit Kiln and light it on fire.\n\nOnce the Pit Kiln burns out, quickly pick up your vessel while it's still hot, while holding some Wooden Tongs in your offhand, and interact with it to open the Pouring interface. Simply place the Saw Mold in the Pouring Interface's slot and watch it fill with your very first Saw Head. Afterwards, combine your Saw Head with a Stick and you'll create your Saw!", "quests.stone_age.first_saw.desc.2": "While the easiest metal to work with is Copper, you can try your hand at the process of alloying. This quest's tasks will accept either an item made out of Copper, or a Bronze Alloy.\n\n&lBismuth Bronze&r: Copper, Bismuth and Zinc. The weakest of the bronzes, but can be the easiest to make.\n\n&lBronze&r: Copper and Tin. It's the most average of the bronzes.\n\n&lBlack Bronze&r: Copper, Gold, and Silver: The best bronze in the early game, but it's considerably more expensive.", "quests.stone_age.first_saw.tasks.1": "A Copper or Bronze Saw Head.", "quests.stone_age.first_saw.tasks.2": "A Copper or Bronze Saw.", From f434b9f380e36f3ad0903f1aa5f53db1f271e2e8 Mon Sep 17 00:00:00 2001 From: Pyritie Date: Sun, 20 Apr 2025 14:48:11 +0100 Subject: [PATCH 08/12] buffed hot or not insulation by x3 --- kubejs/startup_scripts/horornot/constants.js | 27 +++++++++++++++++++ .../startup_scripts/horornot/modifications.js | 10 +++++++ kubejs/startup_scripts/main_startup_script.js | 1 + 3 files changed, 38 insertions(+) create mode 100644 kubejs/startup_scripts/horornot/modifications.js diff --git a/kubejs/startup_scripts/horornot/constants.js b/kubejs/startup_scripts/horornot/constants.js index 8a46a7625..544611c11 100644 --- a/kubejs/startup_scripts/horornot/constants.js +++ b/kubejs/startup_scripts/horornot/constants.js @@ -3,3 +3,30 @@ global.HOT_OR_NOT_DISABLED_ITEMS = [ ]; +// Can't just use the #tfchotornot:insulating tag here because tags don't exist at startup +global.HOT_OR_NOT_ITEMS = [ + 'tfchotornot:mittens', + 'tfchotornot:burlap_potholder', + 'tfchotornot:silk_potholder', + 'tfchotornot:wool_potholder', + 'tfchotornot:tongs/wood', + 'tfchotornot:tongs/bismuth', + 'tfchotornot:tongs/bismuth_bronze', + 'tfchotornot:tongs/black_bronze', + 'tfchotornot:tongs/bronze', + 'tfchotornot:tongs/brass', + 'tfchotornot:tongs/copper', + 'tfchotornot:tongs/gold', + 'tfchotornot:tongs/nickel', + 'tfchotornot:tongs/rose_gold', + 'tfchotornot:tongs/silver', + 'tfchotornot:tongs/tin', + 'tfchotornot:tongs/zinc', + 'tfchotornot:tongs/sterling_silver', + 'tfchotornot:tongs/wrought_iron', + 'tfchotornot:tongs/cast_iron', + 'tfchotornot:tongs/steel', + 'tfchotornot:tongs/black_steel', + 'tfchotornot:tongs/red_steel', + 'tfchotornot:tongs/blue_steel', +]; \ No newline at end of file diff --git a/kubejs/startup_scripts/horornot/modifications.js b/kubejs/startup_scripts/horornot/modifications.js new file mode 100644 index 000000000..e4138548c --- /dev/null +++ b/kubejs/startup_scripts/horornot/modifications.js @@ -0,0 +1,10 @@ +// priority: 0 + +function registerHotOrNotItemModifications(event) { + + global.HOT_OR_NOT_ITEMS.forEach(i => { + event.modify(i, item => { + item.maxDamage = item.maxDamage * 3 + }) + }) +} \ No newline at end of file diff --git a/kubejs/startup_scripts/main_startup_script.js b/kubejs/startup_scripts/main_startup_script.js index cdf916826..c93d56db9 100644 --- a/kubejs/startup_scripts/main_startup_script.js +++ b/kubejs/startup_scripts/main_startup_script.js @@ -27,6 +27,7 @@ BlockEvents.modification(event => { */ ItemEvents.modification(event => { registerBeneathItemModifications(event) + registerHotOrNotItemModifications(event) registerMinecraftItemModifications(event) }) From c1ef170b1ee8bafbe61b79e18004727893ee8c23 Mon Sep 17 00:00:00 2001 From: Risuga Date: Sun, 20 Apr 2025 10:47:42 -0700 Subject: [PATCH 09/12] Update field guide for 0.9 (#895) * fieldguiderevisionfor0.9.1v1 * revision2 * Update hazards.json Signed-off-by: Pyritie * Update blast_furnace.json Signed-off-by: Pyritie --------- Signed-off-by: Pyritie Co-authored-by: Pyritie --- .../entries/getting_started/finding_ores.json | 86 ++++ .../getting_started/primitive_anvils.json | 88 ++++ .../en_us/entries/mechanics/anvils.json | 85 ++++ .../entries/mechanics/blast_furnace.json | 66 +++ .../mechanics/glassworking_applications.json | 441 +++++------------- .../en_us/entries/mechanics/prospecting.json | 59 +++ .../en_us/entries/mechanics/quern.json | 70 +++ .../en_us/entries/tfg_ores/hazards.json | 146 +++--- .../en_us/entries/tfg_ores/ore_basics.json | 98 ++-- 9 files changed, 693 insertions(+), 446 deletions(-) create mode 100644 kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/getting_started/finding_ores.json create mode 100644 kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/getting_started/primitive_anvils.json create mode 100644 kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/anvils.json create mode 100644 kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/blast_furnace.json create mode 100644 kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/prospecting.json create mode 100644 kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/quern.json diff --git a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/getting_started/finding_ores.json b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/getting_started/finding_ores.json new file mode 100644 index 000000000..755640f5e --- /dev/null +++ b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/getting_started/finding_ores.json @@ -0,0 +1,86 @@ +{ + "__comment__": "This file was automatically created by mcresources", + "name": "Ores, Metal, and Casting", + "category": "tfc:getting_started", + "icon": "tfc:ore/normal_native_copper", + "pages": [ + { + "type": "patchouli:text", + "text": "In addition to sticks, twigs, and stones on the ground, in your travels you may encounter small pieces of ores scattered around the ground. These are important, as they are one of the only sources of ore and metal before obtaining a pickaxe." + }, + { + "type": "patchouli:multiblock", + "multiblock": { + "pattern": [ [ " ", " 0 ", " " ], [ "ABCD", "EFGH", "IJKL" ], [ "XXXX", "XXXX", "XXXX" ] ], + "mapping": { + "X": "tfc:grass/loam", + "A": "tfc:ore/small_native_copper", + "B": "tfc:ore/small_native_gold", + "C": "tfc:ore/small_hematite", + "D": "tfc:ore/small_native_silver", + "E": "tfc:ore/small_cassiterite", + "F": "tfc:ore/small_bismuthinite", + "G": "tfc:ore/small_garnierite", + "H": "tfc:ore/small_malachite", + "I": "tfc:ore/small_magnetite", + "J": "tfc:ore/small_limonite", + "K": "tfc:ore/small_sphalerite", + "L": "tfc:ore/small_tetrahedrite" + } + }, + "name": "", + "text": "All small ore pieces", + "enable_visualize": false + }, + { + "type": "patchouli:text", + "text": "These small ore pieces can serve two purposes: they can provide a source of metal, and more importantly, they indicate the presence of a larger vein of ore somewhere nearby, probably underground and close to the surface. Be sure to note where you find small ores, as the location of ore veins will be useful later during $(l:mechanics/prospecting)Prospecting$().$(br2)The twelve types of small ores, and the metal they can be melted into are listed on the next page." + }, + { + "type": "patchouli:text", + "text": "$(li)Native Copper ($(thing)Copper$())$(li)Native Gold ($(thing)Gold$())$(li)Hematite ($(thing)Cast Iron$())$(li)Native Silver ($(thing)Silver$())$(li)Cassiterite ($(thing)Tin$())$(li)Bismuthinite ($(thing)Bismuth$())$(li)Garnierite ($(thing)Nickel$())$(li)Malachite ($(thing)Copper$())$(li)Magnetite ($(thing)Cast Iron$())$(li)Limonite ($(thing)Cast Iron$())$(li)Sphalerite ($(thing)Zinc$())$(li)Tetrahedrite ($(thing)Copper$())", + "title": "Small Ores" + }, + { + "type": "patchouli:text", + "anchor": "casting", + "text": "In TerraFirmaCraft, ores each contain a certain number of $(thing)units$(), or $(thing)mB (millibuckets)$() of actual metal which can be extracted. Small ores like this found on the surface are the lowest quality, and only provide $(thing)16 mB$() of metal. In order to extract this metal, it needs to be $(thing)melted$(), and made into tools using a process called $(thing)casting$().", + "title": "Casting" + }, + { + "type": "patchouli:text", + "text": "You will need:$(br)$(li)A $(l:getting_started/pottery#vessel)Small Vessel$()$(li)Enough materials for a $(l:getting_started/pit_kiln)Pit Kiln$().$(li)One or more $(l:getting_started/pottery#mold)Mold(s)$() to cast the molten metal.$(li)And finally, at least 144 mB total of a metal which is suitable for casting: $(thing)Copper$(), in one or more of its three ore forms.$(br2)$(br)$(italic)Note: Casting can also be done with some $(l:getting_started/primitive_alloys)Alloys$()" + }, + { + "type": "patchouli:text", + "text": "First, open the $(thing)Small Vessel$() and put the ores inside. Count up the total amount of metal in the ores carefully! Then, you need to build a $(l:getting_started/pit_kiln)Pit Kiln$() with the filled small vessel inside. As the vessel heats, the ores inside it will melt, and you'll be left with a vessel of molten metal.$(br2)Take the vessel out and $(item)$(k:key.use)$() while holding it, to open the $(thing)Casting$() interface." + }, + { + "type": "patchouli:image", + "images": [ "tfc:textures/gui/book/gui/casting.png" ], + "text": "The Casting Interface.", + "border": false + }, + { + "type": "patchouli:text", + "text": "With the casting interface open, place your empty fired mold in the center slot. It will fill up as long as the vessel remains liquid. (If the vessel solidifies, it can be reheated in another pit kiln.) Once the mold is full, it can be removed and left to cool. Once cool, the mold and its contents can be extracted by using the mold, or putting it in the crafting grid." + }, + { + "type": "patchouli:crafting", + "recipe": "gtceu:shaped/pickaxe_copper", + "text": "You are now able to craft your first pickaxe! Find enough copper to make a pickaxe head, fire a pickaxe mold and melt the ore using a pit kiln, then cast a head. Slap it on a stick, and voila! You can now dig for $(l:tfg_ores/index)ore$()." + }, + { + "type": "patchouli:spotlight", + "item": "tfc:metal/chisel/copper", + "text": "A couple other important metal tools are available for progression as well. The $(l:mechanics/chisel)Chisel$() is useful for working with stone blocks for building and other recipes." + }, + { + "type": "patchouli:spotlight", + "item": "gtceu:copper_saw", + "text": "The saw allows you turn wood logs into $(l:mechanics/support_beams)support beams$() and $(thing)lumber$(), which can further be crafted into planks, the crafting bench, barrels, and chests, among other things. It is also useful to make a $(l:firmaciv/canoe)canoe$()." + } + ], + "read_by_default": true, + "sortnum": 4 +} diff --git a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/getting_started/primitive_anvils.json b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/getting_started/primitive_anvils.json new file mode 100644 index 000000000..fef12b410 --- /dev/null +++ b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/getting_started/primitive_anvils.json @@ -0,0 +1,88 @@ +{ + "__comment__": "This file was automatically created by mcresources", + "name": "Primitive Anvils", + "category": "tfc:getting_started", + "icon": "tfc:rock/anvil/granite", + "pages": [ + { + "type": "patchouli:text", + "text": "An alternative to casting tools directly in the early game, and a requirement for higher tier metals, is to use an $(thing)Anvil$(). An anvil is a block which can be used for two different processes: $(l:mechanics/anvils#working)working$() and $(l:getting_started/primitive_anvils#welding)welding$(). An anvil can weld double ingots of the metal type needed to create the next tier anvil above it, which will be necessary to work other items from that metal." + }, + { + "type": "patchouli:text", + "text": "First, you need to acquire a block of $(thing)raw rock$(), that is $(thing)igneous extrusive$() (Rhyolite, Basalt, Andesite, or Dacite) or $(thing)igneous intrusive$() (Granite, Diorite, or Gabbro). You could find and use an exposed block in the world, or you could $(l:getting_started/primitive_anvils#raw_rock)extract one$() from the surrounding rock." + }, + { + "type": "patchouli:text", + "anchor": "stone_anvils", + "text": "You will also need any material of $(thing)hammer$(). In order to make the anvil, simply right click the exposed $(thing)top$() face of one of those raw rock blocks with your $(thing)hammer$(), and voila! An anvil will be formed.$(br2)Anvils have $(l:mechanics/anvils#tiers)tiers$() and the rock anvil is tier 0 - the lowest tier. It is only able to $(l:getting_started/primitive_anvils#welding)weld$() tier I ingots.", + "title": "Rock Anvil" + }, + { + "type": "tfc:multimultiblock", + "text": "Converting the center raw rock to an anvil.", + "multiblocks": [ { "pattern": [ [ " 0 " ], [ "RRR" ] ], "mapping": { "0": "AIR", "R": "tfc:rock/raw/gabbro" } }, "tfc:rock_anvil" ] + }, + { + "type": "patchouli:text", + "anchor": "raw_rock", + "text": "In order to obtain a raw rock block without breaking it into smaller rocks, it needs to be $(thing)extracted$(). You must mine the blocks on all six sides of a raw rock block - once it is surrounded by air on all sides - it will pop off as a item which can be picked up.", + "title": "Obtaining Raw Rock" + }, + { + "type": "tfc:multimultiblock", + "text": "Mining all six sides of a piece of raw stone - once complete, the center block will pop off as an item.", + "multiblocks": [ + { + "pattern": [ [ " ", " R ", " " ], [ " R ", "RRR", " R " ], [ " ", " 0 ", " " ] ], + "mapping": { "0": "tfc:rock/raw/gabbro", "R": "tfc:rock/raw/gabbro" } + }, + { + "pattern": [ [ " ", " ", " " ], [ " R ", "RRR", " R " ], [ " ", " 0 ", " " ] ], + "mapping": { "0": "tfc:rock/raw/gabbro", "R": "tfc:rock/raw/gabbro" } + }, + { + "pattern": [ [ " ", " ", " " ], [ " ", "RRR", " R " ], [ " ", " 0 ", " " ] ], + "mapping": { "0": "tfc:rock/raw/gabbro", "R": "tfc:rock/raw/gabbro" } + }, + { + "pattern": [ [ " ", " ", " " ], [ " ", " RR", " R " ], [ " ", " 0 ", " " ] ], + "mapping": { "0": "tfc:rock/raw/gabbro", "R": "tfc:rock/raw/gabbro" } + }, + { + "pattern": [ [ " ", " ", " " ], [ " ", " RR", " " ], [ " ", " 0 ", " " ] ], + "mapping": { "0": "tfc:rock/raw/gabbro", "R": "tfc:rock/raw/gabbro" } + }, + { + "pattern": [ [ " ", " ", " " ], [ " ", " R ", " " ], [ " ", " 0 ", " " ] ], + "mapping": { "0": "tfc:rock/raw/gabbro", "R": "tfc:rock/raw/gabbro" } + }, + { + "pattern": [ [ " ", " ", " " ], [ " ", " R ", " " ], [ " ", " 0 ", " " ] ], + "mapping": { "0": "AIR", "R": "tfc:rock/raw/gabbro" } + } + ] + }, + { + "type": "patchouli:text", + "anchor": "welding", + "text": "Welding is a process through which two items are fused together to create a new item. Welding works the same whether on a $(l:getting_started/primitive_anvils)stone anvil$() or a $(l:mechanics/anvils)metal anvil$().$(br2)First, you must place the two items you want to weld on the anvil. You can do this either by using the items on the anvil, or by opening the anvil interface and inserting them in the two leftmost slots.", + "title": "Welding" + }, + { + "type": "patchouli:text", + "text": "You also need to have at least one $(l:mechanics/flux)flux$() in the anvil to aid the welding process. Then, while both items are $(l:mechanics/heating)hot enough$() to weld - the tooltip will say \"Can Weld\" - you must use any $(thing)hammer$() on the anvil or press the weld button on the anvil interface. You will hear a hammering sound and the items will be welded together." + } + ], + "read_by_default": true, + "sortnum": 6, + "extra_recipe_mappings": { + "tfc:rock/anvil/granite": 0, + "tfc:rock/anvil/diorite": 0, + "tfc:rock/anvil/gabbro": 0, + "tfc:rock/anvil/rhyolite": 0, + "tfc:rock/anvil/basalt": 0, + "tfc:rock/anvil/andesite": 0, + "tfc:rock/anvil/dacite": 0 + } +} diff --git a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/anvils.json b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/anvils.json new file mode 100644 index 000000000..02998bb6f --- /dev/null +++ b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/anvils.json @@ -0,0 +1,85 @@ +{ + "__comment__": "This file was automatically created by mcresources", + "name": "Anvils", + "category": "tfc:mechanics", + "icon": "tfc:metal/anvil/copper", + "pages": [ + { + "type": "patchouli:text", + "text": "Anvils are an important tool required for metalworking, as they allow you to work and weld metal ingots into various different forms.$(br2)$(l:mechanics/anvils#working)Working$() is done to form one piece of metal into another, and $(l:getting_started/primitive_anvils#welding)welding$(), is used to fuse two metal items into one solid piece." + }, + { + "type": "patchouli:multiblock", + "multiblock": { "pattern": [ [ "X" ], [ "0" ] ], "mapping": { "X": "#tfc:anvils" } }, + "name": "", + "text": "All types of metal anvils.", + "enable_visualize": false + }, + { + "type": "patchouli:crafting", + "recipe": "tfc:crafting/metal/anvil/copper", + "text": "Anvils can be crafted with $(thing)double ingots$() of their respective metal. For your first anvil, you must first $(l:getting_started/primitive_anvils#welding)weld$() double ingots on a $(l:getting_started/primitive_anvils)stone anvil$()." + }, + { + "type": "patchouli:text", + "anchor": "tiers", + "text": "Anvils each have a $(thing)tier$(), which defines what types of material they can work and weld. An anvil can work metals of its current tier, and it can weld metals that are one tier higher.$(br)$(li)$(bold)Tier 0$(): Stone Anvils$(li)$(bold)Tier I$(): Copper$(li)$(bold)Tier II$(): Bismuth Bronze, Black Bronze, Bronze$(li)$(bold)Tier III$(): Wrought Iron$(li)$(bold)Tier IV$(): Steel$(li)$(bold)Tier V$(): Black Steel$(li)$(bold)Tier VI$(): Red Steel, Blue Steel" + }, + { + "type": "patchouli:text", + "anchor": "working", + "text": "In order to work an item on the anvil, you will need to use the anvil, to open up the anvil interface, seen to the right. On the left, there are two input slots for items - for working, the target item must be in the right hand slot. You will also need a hammer while working, either in the hammer slot on the right of the anvil $(bold)or$() in your main hand. The hammer will gradually take damage as you work the item.", + "title": "Working" + }, + { + "type": "patchouli:image", + "images": [ "tfc:textures/gui/book/gui/anvil_empty.png" ], + "text": "The anvil interface.", + "border": false + }, + { + "type": "patchouli:text", + "text": "You will then need to select the $(thing)plan$(), which chooses which item you want to create. $(item)$(k:key.attack)$() on the the scroll button, and then pick one of the items to create. The anvil interface will return, but now you will have selected a plan - the scroll will show the item you are working to create, and the $(thing)rules$() and $(thing)target$() will now be populated." + }, + { + "type": "patchouli:image", + "images": [ "tfc:textures/gui/book/gui/anvil_in_use.png" ], + "text": "After selecting to create a pickaxe.", + "border": false + }, + { + "type": "patchouli:text", + "text": "In the middle of the anvil screen, there is a bar with two colored indicators. The $(2)green$() pointer, is your current working progress. The $(4)red$() pointer, is the target. Your goal is to line up the current progress, with the target.$(br2)In order to do this, you can use the $(2)green$() and $(4)red$() action buttons, which move your current progress a certain amount, depending on the action taken.", + "title": "Targets" + }, + { + "type": "patchouli:text", + "text": "$(2)Green$() actions will always move your target $(bold)right$(), and $(4)Red$() actions will always move your progress $(bold)left$(). Note that if you move your target off of the progress bar, you will have overworked your item - you will lose the ingot. However, while working, you must also match the $(thing)rules$()..." + }, + { + "type": "patchouli:text", + "text": "The $(thing)rules$(), are the two or three icons shown on the top of the anvil interface. They represent specific actions that must be taken, at specific times, in order for your working to be a success. For example, a rule could be $(2)Bend Second Last$(), meaning the second to last action you take $(bold)must$() be a $(2)Bend$() action.", + "title": "Working Rules" + }, + { + "type": "patchouli:text", + "text": "Your last three actions are shown right underneath the rules. When a rule is satisfied, its outline will change to green. Success occurs when all rules are satisfied.$(br2)Finally, you have to be mindful of your item's $(l:mechanics/heating)temperature$(). Metals can only be worked when they are above a certain temperature where the tooltip shows \"Can Work\". You may take an item out and re-heat it during the working process." + }, + { + "type": "patchouli:text", + "text": "Working can be tedious, and take many steps to get correct. However, there is a reward for being efficient. Some items, such as tool heads, when they are worked in a low or minimal amount of steps, receive a Forging Bonus based on how efficiently they were forged. This bonus will then apply to tools that the item is used in, for example, a pickaxe head used to make a pickaxe.", + "title": "Forging Bonuses" + }, + { + "type": "patchouli:spotlight", + "item": "tfc:metal/pickaxe/wrought_iron{\"tfc:forging_bonus\":4}", + "title": "Perfectly Forged", + "link_recipes": false, + "text": "There are four tiers of forging bonus:$(li)Poorly Forged$(li)Well Forged$(li)Expertly Forged$(li)Perfectly Forged$(br2)These bonuses increase the power of your tool - making it break less often, mine faster, and/or do more damage in combat, depending on the tool." + } + ], + "read_by_default": true, + "extra_recipe_mappings": { + "tag:tfc:anvils": 0 + } +} diff --git a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/blast_furnace.json b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/blast_furnace.json new file mode 100644 index 000000000..29557a767 --- /dev/null +++ b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/blast_furnace.json @@ -0,0 +1,66 @@ +{ + "__comment__": "This file was automatically created by mcresources", + "name": "Blast Furnace", + "category": "tfc:mechanics", + "icon": "tfc:blast_furnace", + "pages": [ + { + "type": "patchouli:text", + "text": "A $(thing)Blast Furnace$() is an advanced device which is used in the creation of $(thing)Steel$(). By mixing $(l:getting_started/finding_ores)Iron Ores$(), $(l:tfg_tips/basic_automation)Coke$() or $(l:beneath/ores_and_minerals#cursecoal)Anthacite$(), and $(l:mechanics/flux)Flux$() in a controlled, hot environment, you can create a stronger metal than cast or wrought iron.$(br2)To obtain a blast furnace, you will first need a $(l:mechanics/crucible)Crucible$() and a lot of $(thing)Wrought Iron Sheets$()." + }, + { + "type": "patchouli:crafting", + "recipe": "tfc:crafting/blast_furnace", + "text": "Crafting a blast furnace itself requires a $(thing)Crucible$(), along with some of the $(thing)Wrought Iron Sheets$() you will need." + }, + { + "type": "patchouli:text", + "text": "You will then need to construct the blast furnace, along with its $(thing)Chimney$(). The chimney must be composed out of $(l:mechanics/fire_clay#fire_bricks)Reinforced Fire Bricks$(), as they are strong enough to withstand the intense heat. These can be crafted from fire brick blocks, and either cast iron or wrought iron sheets. The sheets can be applied to each exposed face of the bricks by $(item)$(k:key.use)$() with the sheet in hand, or crafted into $(l:mechanics/blast_furnace_insulation)Blast Furnace Insulation$()." + }, + { + "type": "patchouli:multiblock", + "multiblock_id": "tfc:blast_furnace", + "name": "A Blast Furnace", + "text": "A blast furnace with a minimum height chimney.", + "enable_visualize": true + }, + { + "type": "patchouli:text", + "text": "The blast furnace's chimney can be up to five layers - each layer requiring four $(thing)Fire Bricks$() and twelve $(thing)Wrought Iron Sheets$() to complete. Having more layers increases the total capacity of the blast furnace, allowing it to smelt more steel at once. Each chimney layer, up to a maximum of five, allows the blast furnace to hold four additional ore items." + }, + { + "type": "patchouli:text", + "text": "In order to use the blast furnace, you must drop items in the top of the chimney - for steel production, you must add an equal number of items of $(l:getting_started/finding_ores)Iron Ores$() and $(l:mechanics/flux)Flux$(). Any iron ores or items that are able to melt into $(thing)Cast Iron$() will do. You will also need to add $(l:tfg_tips/basic_automation)Coke$() or $(l:beneath/ores_and_minerals#cursecoal)Anthacite$(), which will be consumed as the blast furnace works." + }, + { + "type": "patchouli:text", + "text": "Using the blast furnace will open the blast furnace interface, seen to the right. In this interface, you will see meters for both ore and fuel contents of the blast furnace. The top right slot must have a $(thing)Tuyere$(), which is a metal pipe used to funnel air into the blast furnace, required to reach the hottest temperatures to smelt steel. A tuyere can be smithed on an $(l:mechanics/anvils)Anvil$()." + }, + { + "type": "patchouli:image", + "images": [ "tfc:textures/gui/book/gui/blast_furnace.png" ], + "text": "The Blast Furnace Interface", + "border": false + }, + { + "type": "patchouli:text", + "text": "You will also need a $(l:mechanics/bellows)Bellows$() in order for the Blast Furnace to reach a temperature which will melt iron. This can be placed on any of the four sides of the blast furnace." + }, + { + "type": "patchouli:multiblock", + "multiblock_id": "tfc:full_blast_furnace", + "name": "", + "text": "A full size blast furnace with bellows and crucible attached.", + "enable_visualize": true + }, + { + "type": "patchouli:text", + "text": "Finally, to get started, light the blast furnace with a $(l:getting_started/firepit#firestarter)Fire Starter$(), a $(thing)Flint and Pyrite$(), or a $(thing)Flint and Steel$(). It will begin to heat the ores inside. Make sure that the blast furnace continues to have fuel, and use the bellows to add air to the blast furnace after its internal temperature has reached the maximum for charcoal. After the ores inside heat up, they will melt and convert into $(l:mechanics/steel)Pig Iron$()." + }, + { + "type": "patchouli:text", + "text": "This liquid metal will drip into any metal fluid container placed immediately below the blast furnace, such as a $(l:mechanics/crucible)Crucible$(). It can be cast into ingot molds from the output slot of the crucible and worked into $(l:mechanics/steel)Steel$()." + } + ], + "read_by_default": true +} diff --git a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/glassworking_applications.json b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/glassworking_applications.json index 2825726b8..2b91b57b8 100644 --- a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/glassworking_applications.json +++ b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/glassworking_applications.json @@ -14,53 +14,44 @@ }, { "type": "patchouli:text", - "text": "$(thing)Glass Panes$() are made with a $(thing)Table Pour$(). A pouring table is made by placing up to sixteen $(thing)Kaolin Clay Blocks$() or $(thing)Brass Blocks$() in a continuous area.$(br2) 1. Add a $(l:mechanics/glassworking)Glass Batch$() to a $(thing)Blowpipe$().$(br) 2. Heat the blowpipe to $(4)$(bold)Faint Red$().$(br) 3. $()$(item)$(k:key.use)$() the $(thing)Blowpipe$() on the top of the table.$(br) 4. Finally $(item)$(k:key.use)$() with a $(l:mechanics/glassworking#paddle)Paddle$() to flatten the glass.", + "text": "$(thing)Glass Panes$() are made with a $(thing)Table Pour$(). A pouring table is made by placing up to sixteen $(thing)Kaolin Clay Blocks$() or $(thing)Brass Plated Blocks$() in a continuous area.$(br2) 1. Add a $(l:mechanics/glassworking)Glass Batch$() to a $(thing)Blowpipe$().$(br) 2. Heat the blowpipe to $(4)$(bold)Faint Red$().$(br) 3. $()$(item)$(k:key.use)$() the $(thing)Blowpipe$() on the top of the table.$(br) 4. Finally $(item)$(k:key.use)$() with a $(l:mechanics/glassworking#paddle)Paddle$() to flatten the glass.", "title": "Table Pour" }, { "type": "patchouli:multiblock", "multiblock": { - "mapping": { - "C": "#tfc:glass_pouring_table", - "0": "#tfc:glass_pouring_table" - }, - "pattern": [ - [ "CCCC", "CCC0", "CCCC", "CCCC" ] - ] + "mapping": { "C": "#tfc:glass_pouring_table", "0": "#tfc:glass_pouring_table" }, + "pattern": [ [ "CCCC", "CCC0", "CCCC", "CCCC" ] ] }, "text": "Once the glass is cooled, it can be broken with a $(l:mechanics/glassworking#saw)Gem Saw$() to obtain.", "border": true }, { "type": "patchouli:text", - "text": "$(thing)Glass Blocks$() are made with a $(thing)Basin Pour$(). A basin is made by surrounding all sides of an air block except the top with $(thing)Kaolin Clay Blocks$() or $(thing)Brass Blocks$().$(br2) 1. Add a $(l:mechanics/glassworking)Glass Batch$() to a $(thing)Blowpipe$().$(br) 2. Heat the blowpipe to $(4)$(bold)Faint Red$().$(br) 3. $(item)$(k:key.use)$() the $(thing)Blowpipe$() on the top of the table.", + "text": "$(thing)Glass Blocks$() are made with a $(thing)Basin Pour$(). A basin is made by surrounding all sides of an air block except the top with $(thing)Kaolin Clay Blocks$() or $(thing)Brass Plated Blocks$().$(br2) 1. Add a $(l:mechanics/glassworking)Glass Batch$() to a $(thing)Blowpipe$().$(br) 2. Heat the blowpipe to $(4)$(bold)Faint Red$().$(br) 3. $(item)$(k:key.use)$() the $(thing)Blowpipe$() on the top of the table.", "title": "Basin Pour" }, { "type": "patchouli:multiblock", "multiblock": { - "mapping": { - "C": "#tfc:glass_basin_blocks", - "0": "#tfc:glass_basin_blocks" - }, - "pattern": [ - [ " C ", "C C", " C " ], - [ " ", " 0 ", " " ] - ] + "mapping": { "C": "#tfc:glass_basin_blocks", "0": "#tfc:glass_basin_blocks" }, + "pattern": [ [ " C ", "C C", " C " ], [ " ", " 0 ", " " ] ] }, "text": "Once the glass is cooled, it can be broken with a $(l:mechanics/glassworking#saw)Gem Saw$() to obtain.", "border": true }, + { + "type": "patchouli:crafting", + "title": "Glassworking Blocks", + "recipe": "tfc:crafting/white_kaolin_clay", + "text": "$(thing)Brass plated blocks$() can be created by holding a $(thing)brass plate$() and $(item)$(k:key.use)$() on any $(thing)stone brick$()." + }, { "type": "patchouli:text", "anchor": "coloring", "text": "Glass has a natural color based on the type of $(l:mechanics/glassworking)Glass Batch$() that was used. Other colors can be made using a $(l:mechanics/bowls)Bowl$().$(br2)To use, place the $(l:mechanics/bowls)Bowl$() on the ground, then $(item)$(k:key.use)$() the required $(thing)Powder$(). Before $(thing)Pouring$(), use the $(thing)Blowpipe$() on the bowl to add the powder to the batch.", "title": "Coloring Glass" }, - { - "type": "patchouli:text", - "text": "$(br2)The next pages show the different combinations of glass types and powder materials to create each color." - }, { "type": "patchouli:text", "text": "$(li)$(bold)$(7)White$(): Silica or Hematitic Glass + $(thing)Soda Ash$()$(li)$(bold)$(0)Black$(): Any Glass + $(thing)Graphite$()$(li)$(bold)$(8)Gray$(): Any + $(thing)Graphite$() + $(thing)Soda Ash$()$(li)$(bold)$(7)Light Gray$(): Any + $(thing)Graphite$() + 2x $(thing)Soda Ash$()$(li)$(bold)$(5)Purple$(): Any + $(thing)Iron$() + $(thing)Copper$()$(li)$(bold)$(#964b00)Brown$(): Any + $(thing)Nickel$()$(li)$(bold)$(3)Cyan$(): Non-Volcanic Glass + $(thing)Copper$() + $(thing)Sapphire$()$(li)$(bold)$(2)Green$(): Silica or Hematitic Glass + $(thing)Iron$()", @@ -73,307 +64,108 @@ { "type": "tfc:table_small", "strings": [ - { - "text": "" - }, - { - "text": "C" - }, - { - "text": "T" - }, - { - "fill": "0xff42f2" - }, - { - "fill": "0x8af3ff" - }, - { - "fill": "0x526cff" - }, - { - "fill": "0xe3e3e3" - }, - { - "fill": "0xe69407" - }, - { - "fill": "0xc738c9" - }, - { - "fill": "0xffe81c" - }, - { - "fill": "0x48ff1f" - }, - { - "fill": "0xe01414" - }, - { - "fill": "0x0c9400" - }, - { - "fill": "0x188a9e" - }, - { - "fill": "0x7d4f00" - }, - { - "fill": "0x6e059c" - }, - { - "fill": "0x7d7d7d" - }, - { - "fill": "0xbdbdbd" - }, - { - "fill": "0x000000" - }, - { - "text": "Silica" - }, - { - "fill": "0x3d42a8" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "text": "Hematitic" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3d42a8" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "text": "Olivine" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0x3d42a8" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "text": "Volcanic" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0x3d42a8" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0xb33e3e" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - }, - { - "fill": "0x3eb340" - } + { "text": "" }, + { "text": "C" }, + { "text": "T" }, + { "fill": "0xff42f2" }, + { "fill": "0x8af3ff" }, + { "fill": "0x526cff" }, + { "fill": "0xe3e3e3" }, + { "fill": "0xe69407" }, + { "fill": "0xc738c9" }, + { "fill": "0xffe81c" }, + { "fill": "0x48ff1f" }, + { "fill": "0xe01414" }, + { "fill": "0x0c9400" }, + { "fill": "0x188a9e" }, + { "fill": "0x7d4f00" }, + { "fill": "0x6e059c" }, + { "fill": "0x7d7d7d" }, + { "fill": "0xbdbdbd" }, + { "fill": "0x000000" }, + { "text": "Silica" }, + { "fill": "0x3d42a8" }, + { "fill": "0xb33e3e" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "text": "Hematitic" }, + { "fill": "0xb33e3e" }, + { "fill": "0x3eb340" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0x3eb340" }, + { "fill": "0x3d42a8" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "text": "Olivine" }, + { "fill": "0xb33e3e" }, + { "fill": "0x3eb340" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0x3d42a8" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "text": "Volcanic" }, + { "fill": "0xb33e3e" }, + { "fill": "0x3eb340" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0x3d42a8" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0xb33e3e" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" }, + { "fill": "0x3eb340" } ], "text": "The availability of glass colors. 'C' is clear, 'T' is tinted. Colors can only be crafted with certain glass batches.", "title": "Glass Color Availability", "legend": [ - { - "text": "Can be Crafted", - "color": "0x3eb340" - }, - { - "text": "Cannot be Crafted", - "color": "0xb33e3e" - }, - { - "text": "Default Color", - "color": "0x3d42a8" - } + { "text": "Can be Crafted", "color": "0x3eb340" }, + { "text": "Cannot be Crafted", "color": "0xb33e3e" }, + { "text": "Default Color", "color": "0x3d42a8" } ], "columns": 18, "first_column_width": 35, @@ -383,10 +175,7 @@ "top_buffer": 15, "draw_background": true }, - { - "type": "patchouli:empty", - "draw_filler": false - }, + { "type": "patchouli:empty", "draw_filler": false }, { "type": "tfc:glassworking_recipe", "anchor": "lamp_glass", @@ -396,19 +185,19 @@ { "type": "tfc:glassworking_recipe", "anchor": "jar", - "recipe": "tfc:glassworking/empty_jar", + "recipe": "tfc:glassworking/jar", "text": "$(l:mechanics/jarring)Jars$() are also made from blown glass, but only silica or hematitic glass." }, { "type": "tfc:glassworking_recipe", "anchor": "glass_bottle", - "recipe": "tfc:glassworking/silica_glass_bottle", + "recipe": "tfc:glassworking/silica_bottle", "text": "$(thing)Glass Bottles$() can also be made. The quality of the glass bottle depends on the type of glass used to make it." }, { "type": "tfc:glassworking_recipe", "recipe": "tfc:glassworking/lens", - "text": "The $(thing)Lens$() is used for crafting the spyglass, compasses, and other things." + "text": "The $(thing)lens$() is used for crafting the $(thing)spyglass$(), $(thing)compass$(), and other things." } ], "read_by_default": true, @@ -416,4 +205,4 @@ "tag:tfc:glass_batches": 1, "tag:forge:glass": 2 } -} \ No newline at end of file +} diff --git a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/prospecting.json b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/prospecting.json new file mode 100644 index 000000000..8bc8d9df5 --- /dev/null +++ b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/prospecting.json @@ -0,0 +1,59 @@ +{ + "__comment__": "This file was automatically created by mcresources", + "name": "Prospecting", + "category": "tfc:mechanics", + "icon": "tfc:metal/propick/wrought_iron", + "pages": [ + { + "type": "patchouli:text", + "text": "You remembered where you picked up those $(l:getting_started/finding_ores)small metal nuggets$(), right? Finding additional ores may require extensive exploration and mining. You should become very familiar with $(l:tfg_ores/index)ores and minerals$(). If you need a specific resource, you must find the rock type it spawns in either under your feet or across the world." + }, + { + "type": "patchouli:text", + "text": "When picking up small nuggets becomes unsatisfying, it is time to start prospecting to find ore veins:$(br)$(li)Small nuggets occur when an ore vein is located below. If you find the center of a group of nuggets, it's likely that the vein is beneath you.$(li)Exposed ore can occur in cliffs and water bodies, which may be seen from farther away." + }, + { + "type": "patchouli:spotlight", + "anchor": "propick", + "item": "tfc:metal/propick/copper", + "title": "Prospector's Pick", + "link_recipes": false, + "text": "If you're looking for metal ores or mineral veins (which have no nuggets), and you can't find the vein by guessing, it's time to pull out the $(thing)prospector's pick$(). It searches the 25x25x25 area centered on the block clicked, and reports to the action bar the amount and type of ore located." + }, + { + "type": "tfc:knapping_recipe", + "recipe": "tfc:clay_knapping/propick_head_mold", + "text": "To make a prospector's pick, you can $(l:getting_started/pottery)knapp$() an unfired mold out of clay as shown above." + }, + { + "type": "tfc:heat_recipe", + "recipe": "tfc:heating/propick_head_mold", + "text": "Once the mold has been $(l:getting_started/pottery)knapped$(), it needs to be $(l:mechanics/heating)fired$() to create a $(thing)propick head mold.$()$(br2)To create the tool head, $(l:getting_started/finding_ores#casting)cast$() liquid metal into the mold." + }, + { + "type": "tfc:anvil_recipe", + "recipe": "tfc:anvil/copper_propick_head", + "text": "A prospector's pick head can also be $(l:mechanics/anvils#working)smithed$() out of an $(thing)ingot$() of any tool metal on an $(l:mechanics/anvils)Anvil$().$(br2)The prospector's pick is then created by crafting the tool head with a stick." + }, + { + "type": "patchouli:text", + "text": "The prospector's pick will never report finding something when nothing is actually there. However, it may incorrectly say nothing is there when a vein is in range. Higher tier tools will reduce or eliminate these false negatives.$(br2)Prospector's picks at the same tier give identical results when used on the same block unless ores were removed.$(br2)If the prospector's pick finds multiple ores nearby, it will only report one." + }, + { + "type": "patchouli:text", + "text": "Right-clicking a Prospector's Pick on a block will report finding one of these possible results:$(br)$(li)Nothing (may be false)$(li)Traces$(li)A Small Sample$(li)A Medium Sample$(li)A Large Sample$(li)A Very Large Sample$(br2)Very large samples indicate at least eighty and potentially many more blocks." + } + ], + "read_by_default": true, + "extra_recipe_mappings": { + "tfc:metal/propick/bismuth_bronze": 2, + "tfc:metal/propick/black_bronze": 2, + "tfc:metal/propick/bronze": 2, + "tfc:metal/propick/copper": 2, + "tfc:metal/propick/wrought_iron": 2, + "tfc:metal/propick/steel": 2, + "tfc:metal/propick/black_steel": 2, + "tfc:metal/propick/blue_steel": 2, + "tfc:metal/propick/red_steel": 2 + } +} diff --git a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/quern.json b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/quern.json new file mode 100644 index 000000000..321b7dc72 --- /dev/null +++ b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/mechanics/quern.json @@ -0,0 +1,70 @@ +{ + "__comment__": "This file was automatically created by mcresources", + "name": "Quern", + "category": "tfc:mechanics", + "icon": "tfc:quern", + "pages": [ + { + "type": "patchouli:text", + "text": "The $(thing)Quern$() is a device for grinding items. It can crush raw ores for $(l:tfg_ores/ore_basics#processing)processing$(), as well as make powders, $(l:mechanics/dye)dyes$(), and some other items. It is assembled from a $(thing)Base$() and $(thing)Handstone$()." + }, + { + "type": "patchouli:crafting", + "recipe": "tfc:crafting/quern", + "text": "The base of the quern can be crafted with three $(thing)smooth stone$() and three of any other $(thing)Stone$() blocks.$(br2)Stone blocks can be acquired via $(l:getting_started/primitive_anvils#raw_rock)extraction$(), and smooth blocks with the $(l:mechanics/chisel)chisel$()." + }, + { + "type": "patchouli:crafting", + "recipe": "tfc:crafting/handstone", + "text": "The quern needs a $(thing)Handstone$() to operate." + }, + { + "type": "patchouli:image", + "images": [ "tfc:textures/gui/book/tutorial/quern_empty.png" ], + "text": "Point at the top of the quern block and $(item)$(k:key.use)$() to place the handstone.", + "border": true + }, + { + "type": "patchouli:image", + "images": [ "tfc:textures/gui/book/tutorial/quern_add_item.png" ], + "text": "Use $(item)$(k:key.use)$() on the top of the handstone to add items.", + "border": true + }, + { + "type": "patchouli:image", + "images": [ "tfc:textures/gui/book/tutorial/quern_handle.png" ], + "text": "Use $(item)$(k:key.use)$() the handle to spin the handstone.", + "border": true + }, + { + "type": "patchouli:image", + "images": [ "tfc:textures/gui/book/tutorial/quern_result.png" ], + "text": "The output should appear on the base of the quern. $(item)$(k:key.use)$() anywhere on the base to retrieve it.", + "border": true + }, + { + "type": "tfc:quern_recipe", + "title": "Crushed Ore", + "recipe": "tfg:quern/copper_crushed_ore_from_normal_raw_ore", + "text": "$(l:tfg_ores/ore_basics#processing)Ores$() can be crushed to obtain more metal." + }, + { + "type": "tfc:quern_recipe", + "title": "Powders", + "recipe": "tfg:quern/sulfur_powder", + "text": "The quern is used to make various $(thing)Powders$() from dust, like $(thing)Sulfur$(). $(thing)Gems$() can also be ground into powder." + }, + { + "type": "tfc:quern_recipe", + "title": "Dyes", + "recipe": "tfc:quern/red_dye", + "text": "$(l:mechanics/dye)Dye$() can be obtained from various flowers." + }, + { + "type": "patchouli:spotlight", + "item": { "tag": "tfc:foods/flour" }, + "text": "$(thing)Crops$() can be processed with a knife or quern to acquire $(thing)Grain$(), which can further be ground into $(thing)Flour$()." + } + ], + "read_by_default": true +} diff --git a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/tfg_ores/hazards.json b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/tfg_ores/hazards.json index 674f2f829..c96eab0f8 100644 --- a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/tfg_ores/hazards.json +++ b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/tfg_ores/hazards.json @@ -1,64 +1,84 @@ { - "name": "Dealing with Hazards", - "icon": "gtceu:hazmat_headpiece", - "category": "tfc:tfg_ores", - "priority": true, - "sortnum": 1, - "read_by_default": true, - "pages": [ - { - "type": "patchouli:text", - "text": "Some ores are hazardous! Having them in your inventory will deal continuous poison damage.$(br2)There's a full $(thing)hazmat suit$(), but that's all the way in $(thing)MV$(), so what can you do instead?$(br2)Here's some tips until TFG is able to update to a newer version of a GregTech that provides its own primitive protection equipment." - }, - { - "type": "patchouli:text", - "text": "Later, if you want to move hazardous materials around, you can take them out of small vessels and into chests and machines by $(thing)Right-clicking$() on the vessel. This way, it will never enter your inventory!$(br2)Lastly, if you don't enjoy hazards, you can turn them off in the GregTech options." - }, - { - "type": "patchouli:spotlight", - "title": "Rocks", - "item": { "tag": "tfc:rock_knapping" }, - "text": "The easiest way to prevent hazardous items from entering your inventory is to not pick them up at all.$(br)Filling your inventory with $(thing)Rocks$(), for example, will let you pick and choose which items you want to pick up, letting you deal with the hazardous ones all at once later." - }, - { - "type": "patchouli:spotlight", - "title": "Containers", - "text": "As mentioned, the hazardous materials only deal damage while they are in your $(thing)inventory$(), but that doesn't apply to other containers!$(br)Hazardous materials will not deal damage while they are in another container such as a $(l:mechanics/crankshaft)Backpack$() or $(l:getting_started/pottery#vessel)Vessel$().", - "item": "sophisticatedbackpacks:backpack,tfc:ceramic/vessel,tfc:ceramic/large_vessel" - }, - { - "type": "patchouli:spotlight", - "title": "Armor", - "text": "Better armor will reduce the damage taken from hazardous materials.", - "item": { "tag": "minecraft:trimmable_armor" } - }, - { - "type": "patchouli:spotlight", - "title": "Spring Water", - "item": "tfc:bucket/spring_water", - "text": "Standing in $(thing)Spring Water$() will provide a slow $(thing)Regeneration$() effect." - }, - { - "type": "patchouli:spotlight", - "title": "Aged Alcohol", - "text": "$(thing)Aged Alcohol$() will give potion buffs, some of which you might find useful.$(br2)You can drink them with a $(l:getting_started/pottery#jug)Jug$() or $(l:waterflasks/recipes)Flask$().", - "item": "tfcagedalcohol:bucket/aged_beer,tfcagedalcohol:bucket/aged_cider,tfcagedalcohol:bucket/aged_rum,tfcagedalcohol:bucket/aged_sake,tfcagedalcohol:bucket/aged_vodka,tfcagedalcohol:bucket/aged_whiskey,tfcagedalcohol:bucket/aged_corn_whiskey,tfcagedalcohol:bucket/aged_rye_whiskey" - }, - { - "type": "patchouli:text", - "text": "Aged Beer: Absorption II (20:00)$(br2)Aged Cider: Speed (5:20)$(br2)Aged Rum: Speed II (2:40)$(br2)Aged Sake: Resistance (5:20)$(br2)Aged Vodka: Resistance II (2:40)$(br2)Aged Corn Whiskey: Haste (5:20)$(br2)Aged Rye Whiskey: Haste (5:20)$(br2)Aged Whiskey: Haste II (2:40)" - }, - { - "type": "patchouli:spotlight", - "item": { "tag": "tfc:foods" }, - "title": "Nutrition", - "text": "Eating better foods with more $(l:getting_started/food_and_water#nutrients)nutrition$() will raise your maximum HP by a significant amount.$(br2)$(l:mechanics/pot#soup)Soups$(), $(l:mechanics/sandwiches)Sandwiches$(), and $(l:mechanics/salad)Salads$() are great for this." - }, - { - "type": "patchouli:spotlight", - "title": "Bed", - "item": { "tag": "minecraft:beds" }, - "text": "If all else fails, bringing along a bed to respawn is a good idea.$(br2)If you don't have access to $(thing)Wool$() or $(thing)String$(), you can also make a $(l:getting_started/a_place_to_sleep)Thatch Bed$()." - } - ] -} \ No newline at end of file + "name": "Hazardous Materials", + "icon": "gtceu:raw_plutonium", + "category": "tfc:tfg_ores", + "priority": true, + "sortnum": 1, + "read_by_default": true, + "pages": [ + { + "type": "patchouli:spotlight", + "title": "Hazardous Materials", + "item": "gtceu:raw_plutonium", + "text": "Some ores and dusts are hazardous and can cause negative effects or even kill you if they are carried in your inventory.$(br2)Certain equipment such as $(thing)masks$(), $(thing)gloves$(), and $(thing)hazardous material suits$() later on can be used to conter these effects" + }, + { "type": "patchouli:crafting", "title": "Face Mask", "recipe": "gtceu:shaped/face_mask" }, + { + "type": "patchouli:spotlight", + "item": "gtceu:rubber_gloves", + "title": "Rubber gloves", + "link_recipes": true, + "text": "Rubber gloves can be made from $(l:mechanics/leather_making)leather$()." + }, + { + "type": "tfc:knapping_recipe", + "recipe": "tfchotornot:leather_knapping/mittens", + "text": "First knap the leather into mittens." + }, + { + "type": "tfc:sealed_barrel_recipe", + "recipe": "tfg:sealed_barrel/prepared_leather_gloves", + "text": "Mittens are then soaked in $(thing)Vinegar$(), a mixture of fruit and alcohol." + }, + { + "type": "patchouli:spotlight", + "item": "tfg:latex_soaked_gloves", + "text": "Prepared leather gloves are then heated in a $(thing)vat$() with $(thing)Vulcanized Latex$(), a mixture of latex and wood ash." + }, + { + "type": "patchouli:spotlight", + "item": "gtceu:rubber_gloves", + "text": "Finally, the latex-soaked gloves are heated in an $(l:firmalife/oven)Oven$()." + }, + { + "type": "patchouli:spotlight", + "title": "Rocks", + "item": { "tag": "tfc:rock_knapping" }, + "text": "The easiest way to prevent hazardous items from entering your inventory is to not pick them up at all.$(br)Filling your inventory with $(thing)Rocks$(), for example, will let you pick and choose which items you want to pick up, letting you deal with the hazardous ones all at once later." + }, + { + "type": "patchouli:spotlight", + "title": "Containers", + "text": "Hazardous materials only deal damage while they are in your $(thing)inventory$(), but that doesn't apply to other containers!$(br)Hazardous materials will not deal damage while they are in another container such as a $(l:tfg_tips/inventory_management)Backpack$() or $(l:getting_started/pottery#vessel)Vessel$(). $(thing)Right-clicking$() while holding a vessel will allow direct transfer of it's contents to and from containers", + "item": "sophisticatedbackpacks:backpack,tfc:ceramic/vessel,tfc:ceramic/large_vessel" + }, + { + "type": "patchouli:spotlight", + "title": "Spring Water", + "item": "tfc:bucket/spring_water", + "text": "Standing in $(thing)Spring Water$() will provide a slow $(thing)Regeneration$() effect." + }, + { + "type": "patchouli:spotlight", + "title": "Aged Alcohol", + "text": "$(thing)Aged Alcohol$() will give potion buffs, some of which you might find useful.$(br2)You can drink them with a $(l:getting_started/pottery#jug)Jug$() or $(l:waterflasks/recipes)Flask$().", + "item": "tfcagedalcohol:bucket/aged_beer,tfcagedalcohol:bucket/aged_cider,tfcagedalcohol:bucket/aged_rum,tfcagedalcohol:bucket/aged_sake,tfcagedalcohol:bucket/aged_vodka,tfcagedalcohol:bucket/aged_whiskey,tfcagedalcohol:bucket/aged_corn_whiskey,tfcagedalcohol:bucket/aged_rye_whiskey" + }, + { + "type": "patchouli:text", + "text": "Aged Beer: Absorption II (20:00)$(br2)Aged Cider: Speed (5:20)$(br2)Aged Rum: Speed II (2:40)$(br2)Aged Sake: Resistance (5:20)$(br2)Aged Vodka: Resistance II (2:40)$(br2)Aged Corn Whiskey: Haste (5:20)$(br2)Aged Rye Whiskey: Haste (5:20)$(br2)Aged Whiskey: Haste II (2:40)" + }, + { + "type": "patchouli:spotlight", + "item": { "tag": "tfc:foods" }, + "title": "Nutrition", + "text": "Eating better foods with more $(l:getting_started/food_and_water#nutrients)nutrition$() will raise your maximum HP by a significant amount.$(br2)$(l:mechanics/pot#soup)Soups$(), $(l:mechanics/sandwiches)Sandwiches$(), and $(l:mechanics/salad)Salads$() are great for this." + }, + { + "type": "patchouli:spotlight", + "title": "Bed", + "item": { "tag": "minecraft:beds" }, + "text": "If all else fails, bringing along a bed to respawn is a good idea.$(br2)If you don't have access to $(thing)Wool$() or $(thing)String$(), you can also make a $(l:getting_started/a_place_to_sleep)Thatch Bed$()." + } + ] +} diff --git a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/tfg_ores/ore_basics.json b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/tfg_ores/ore_basics.json index ca16d1ff2..c3ddc1f80 100644 --- a/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/tfg_ores/ore_basics.json +++ b/kubejs/assets/tfc/patchouli_books/field_guide/en_us/entries/tfg_ores/ore_basics.json @@ -1,59 +1,43 @@ { - "name": "Mining in TFG", - "icon": "gtceu:pyrite_dust", - "category": "tfc:tfg_ores", - "priority": true, - "sortnum": 0, - "pages": [ - { - "type": "patchouli:text", - "text": "There are two ways of mining ores - with a $(thing)Pickaxe$(), or with a $(thing)Hammer$().$(br)Generally, you should mine anything meltable (such as $(thing)Copper$()) with a hammer, and everything else with a pickaxe, but check JEI if you're unsure." - }, - { - "type": "patchouli:spotlight", - "title": "Pickaxe", - "text": "Breaking an ore block with a pickaxe will yield $(thing)Raw$() ores (poor, normal, or rich), as well as some stone dust. These are not worth much mB each and you will need multiple to make a single ingot, however some other minerals are only useable in this state, such as $(thing)Coal$().", - "item": { - "tag": "minecraft:pickaxes" - } - }, - { - "type": "patchouli:spotlight", - "title": "Hammer", - "text": "Breaking an ore block with a hammer will yield 1-2 $(thing)Crushed Ores$(). These already melt into more mB than Raw ores, but with a little $(l:tfg_ores/ore_basics#processing)extra processing$() they can be worth even more!", - "item": { - "tag": "forge:tools/hammers" - } - }, - { - "type": "patchouli:spotlight", - "title": "Mining Hammer", - "text": "These are basically a pickaxe with a 3x3 range, and will yield $(thing)Raw$() ores as well. Also good for clearing stone after you've hammered the ores out!$(br2)Holding $(thing)Sneak$() will only break a single block at a time.", - "item": { - "tag": "forge:tools/mining_hammers" - } - }, - { - "type": "patchouli:spotlight", - "title": "Basic ore processing", - "anchor": "processing", - "item": "gtceu:copper_dust", - "text": "To make your crushed ores melt into even more mB, first place them in a crafting grid along with a $(thing)Hammer$(). This will produce $(thing)Impure Dust$().$(br2)To further purify it, throw the dust into some water and wait a few seconds, or right-click a $(thing)Cauldron$() filled with water." - }, - { - "type": "patchouli:crafting", - "title": "Impure Dust", - "recipe": "gtceu:shapeless/crushed_ore_to_dust_copper" - }, - { - "type": "patchouli:spotlight", - "title": "Steam Age", - "text": "Once you have $(thing)Steam machines$(), you can mine everything with a $(thing)Mining Hammer$() - putting Raw ores into a $(thing)Steam Forge Hammer$() or $(thing)Steam Macerator$() gives about the same yield as mining with a Hammer yourself.", - "item": "gtceu:hp_steam_forge_hammer,gtceu:hp_steam_macerator" - }, - { - "type": "patchouli:text", - "text": "Later, when you're in LV, check the LV quests to learn about all the different ore processing machines and extra byproducts they can give you. Remember the $(thing)Macerator$() does not give byproducts until $(thing)HV$()!" - } - ] + "name": "Mining in TFG", + "icon": "gtceu:pyrite_dust", + "category": "tfc:tfg_ores", + "priority": true, + "sortnum": 0, + "pages": [ + { + "type": "patchouli:text", + "text": "You will need a $(thing)pickaxe$() or $(thing)mining hammer$() to mine ores.$(br2)A regular $(thing)hammer$() can also break stone type blocks quickly, but will not result in dropped ores. It can still be useful for $(l:getting_started/primitive_anvils#raw_rock)extracting$() stone blocks however." + }, + { + "type": "patchouli:crafting", + "recipe": "gtceu:shaped/pickaxe_copper", + "recipe2": "gtceu:shaped/mining_hammer_copper" + }, + { + "type": "patchouli:spotlight", + "title": "Pickaxe", + "text": "Breaking an ore block with a pickaxe will yield $(thing)raw ores$() (poor, normal, or rich), as well as some stone dust. These are not worth much mB each and you will need multiple to make a single ingot, however some other minerals are only useable in this state, such as $(thing)coal$().", + "item": { "tag": "minecraft:pickaxes" } + }, + { + "type": "patchouli:spotlight", + "title": "Mining Hammer", + "text": "These are basically a pickaxe with a 3x3 range, and will yield $(thing)raw ores$() as well. Also good for clearing stone after you've hammered the ores out!$(br2)Holding $(thing)sneak$() will only break a single block at a time.", + "item": { "tag": "forge:tools/mining_hammers" } + }, + { + "type": "patchouli:spotlight", + "title": "Basic ore processing", + "anchor": "processing", + "item": "gtceu:crushed_copper_ore", + "text": "Processing ores will result in much greater amounts of usable metal. The first step is to use a $(l:mechanics/quern)Quern$() to crush the raw ore. This step can be automated in the future with improved machines such as the $(thing)Millstone$(), $(thing)Crushing Wheel$(), $(thing)Macerator$(), and $(thing)Forge Hammer$()." + }, + { + "type": "patchouli:crafting", + "title": "Purifying dust", + "recipe": "gtceu:shapeless/crushed_ore_to_dust_copper", + "text": "To make your crushed ores melt into even more mB, first place them in a crafting grid along with a $(thing)Hammer$(). This will produce $(thing)Impure Dust$(). To purify the dust, throw it in water or $(item)$(k:key.use)$() a $(thing)Cauldron$() filled with water." + } + ] } From daeaebd48ab6bc72f2203a665d7a3fe3396f0d9b Mon Sep 17 00:00:00 2001 From: Pyritie Date: Sun, 20 Apr 2025 20:54:10 +0100 Subject: [PATCH 10/12] changed rotation speed controller to need black steel instead of an electron tube --- kubejs/server_scripts/create/recipes.js | 2 +- kubejs/startup_scripts/gtceu/materials.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/kubejs/server_scripts/create/recipes.js b/kubejs/server_scripts/create/recipes.js index bb4dc57e1..8ca8281be 100644 --- a/kubejs/server_scripts/create/recipes.js +++ b/kubejs/server_scripts/create/recipes.js @@ -1582,7 +1582,7 @@ const registerCreateRecipes = (event) => { ], { A: 'create:brass_casing', B: '#forge:small_gears/brass', - C: 'create:electron_tube', + C: '#forge:gears/black_steel', D: '#forge:tools/wrenches', E: '#forge:small_springs/gold', F: '#tfg:shafts', diff --git a/kubejs/startup_scripts/gtceu/materials.js b/kubejs/startup_scripts/gtceu/materials.js index 7443de9ce..9ff4119a0 100644 --- a/kubejs/startup_scripts/gtceu/materials.js +++ b/kubejs/startup_scripts/gtceu/materials.js @@ -188,7 +188,7 @@ const registerGTCEuMaterialModification = (event) => { GTMaterials.BismuthBronze.addFlags(GENERATE_GEAR); GTMaterials.Nickel.addFlags(GENERATE_ROD, GENERATE_LONG_ROD); - GTMaterials.BlackSteel.addFlags(GENERATE_LONG_ROD, GENERATE_BOLT_SCREW); + GTMaterials.BlackSteel.addFlags(GENERATE_LONG_ROD, GENERATE_BOLT_SCREW, GENERATE_SMALL_GEAR); GTMaterials.BlueSteel.addFlags(GENERATE_LONG_ROD, GENERATE_BOLT_SCREW); GTMaterials.RedSteel.addFlags(GENERATE_LONG_ROD, GENERATE_BOLT_SCREW); GTMaterials.WroughtIron.addFlags(GENERATE_ROTOR, GENERATE_SPRING, GENERATE_SMALL_GEAR); From 5c49b849f45892de66c7a039fe430e980f82dc52 Mon Sep 17 00:00:00 2001 From: Pyritie Date: Sun, 20 Apr 2025 22:19:50 +0100 Subject: [PATCH 11/12] fixed cart assembler recipe --- kubejs/server_scripts/create/recipes.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kubejs/server_scripts/create/recipes.js b/kubejs/server_scripts/create/recipes.js index 8ca8281be..27703b489 100644 --- a/kubejs/server_scripts/create/recipes.js +++ b/kubejs/server_scripts/create/recipes.js @@ -371,7 +371,7 @@ const registerCreateRecipes = (event) => { A: '#forge:plates/steel', B: 'gtceu:red_alloy_single_wire', C: '#minecraft:logs', - D: '#forge:wrenches' + D: '#forge:tools/wrenches' }).id('tfg:create/shaped/cart_assembler') // Контроллер рельсы From 853156b39b2d4c127ba55349da7c7836115446cd Mon Sep 17 00:00:00 2001 From: Pyritie Date: Mon, 21 Apr 2025 00:42:17 +0100 Subject: [PATCH 12/12] fixed duping with plated blocks --- kubejs/server_scripts/gregtech/utility.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kubejs/server_scripts/gregtech/utility.js b/kubejs/server_scripts/gregtech/utility.js index 6962606ec..6b07372c3 100644 --- a/kubejs/server_scripts/gregtech/utility.js +++ b/kubejs/server_scripts/gregtech/utility.js @@ -115,8 +115,9 @@ function generatePlatedBlockRecipe(event, material) { .EUt(GTValues.VA[GTValues.ULV]) if (tfcProperty != null) { + // Slabs are lossy because it's possible to plate a double slab block with one metal plate event.recipes.tfc.heating(platedSlab, tfcProperty.getMeltTemp()) - .resultFluid(Fluid.of(outputMaterial.getFluid(), 144)) + .resultFluid(Fluid.of(outputMaterial.getFluid(), 72)) .id(`tfc:heating/metal/${tfcMetalName}_block_slab`) } event.recipes.gtceu.macerator(`tfg:${material.getName()}_plated_slab`)