//priority: 900 events.listen('recipes', function (event) { materialsToUnify.forEach(function (material) { var ore = getPreferredItemInTag(ingredient.of('#forge:ores/' + material)).id; var ingot = getPreferredItemInTag(ingredient.of('#forge:ingots/' + material)).id; var gem = getPreferredItemInTag(ingredient.of('#forge:gems/' + material)).id; var crushedOre = getPreferredItemInTag(ingredient.of('#create:crushed_ores/' + material)).id; var dust = getPreferredItemInTag(ingredient.of('#forge:dusts/' + material)).id; var plate = getPreferredItemInTag(ingredient.of('#forge:plates/' + material)).id; var gear = getPreferredItemInTag(ingredient.of('#forge:gears/' + material)).id; var rod = getPreferredItemInTag(ingredient.of('#forge:rods/' + material)).id; var wire = getPreferredItemInTag(ingredient.of('#forge:wires/' + material)).id; gear_unification(event, material, ingot, gem, gear); rod_unification(event, material, ingot, gem, rod); astralsorcery_ore_processing_infuser(event, material, ore, ingot, gem); bloodmagic_ore_processing_alchemy(event, material, ore, dust, gem); bloodmagic_ore_processing_arc(event, material, ore, dust, gem); create_ore_processing_with_secondary_outputs(event, material, crushedOre); create_gem_processing(event, material, ore, gem, dust); create_ingot_gem_milling(event, material, ingot, dust, gem); create_press_plates(event, material, gem, plate); emendatus_hammer_crushing(event, material, ore, dust); immersiveengineering_gem_crushing(event, material, dust, gem); immersiveengineering_ingot_crushing(event, material, dust, ingot); immersiveengineering_ore_processing(event, material, ore, gem); immersiveengineering_press_plates(event, material, ingot, gem, plate); occultism_ore_crushing(event, material, ore, dust, gem); occultism_ingot_gem_crushing(event, material, ingot, dust, gem); pedestals_ore_crushing(event, material, ore, dust, gem); pedestals_ingot_gem_crushing(event, material, ingot, dust, gem); thermal_press_wires(event, material, wire); thermal_press_plates(event, material, gem, plate); }); dyeSources.forEach((recipe) => { botania_dye_pestle_mortar(event, recipe); create_dye_milling(event, recipe); immersiveengineering_dye_crusher(event, recipe); mekanism_dye_enriching(event, recipe); pedestals_dye_crushing(event, recipe); thermal_dye_centrifuge(event, recipe); }); }); function getPreferredItemInTag(tag) { const pref = wrapArray(tag.stacks).sort(({ mod: a }, { mod: b }) => compareIndices(a, b, tag))[0] || item.of(air); // console.info('Preferred item: ' + tag + ' => ' + pref); return pref; } function tagIsEmpty(tag) { return getPreferredItemInTag(ingredient.of(tag)).id == air; } //material unification functions function gear_unification(event, material, ingot, gem, gear) { if (gear == air) { return; } var output = gear, input, mold = 'immersiveengineering:mold_gear'; if (ingot != air) { input = '#forge:ingots/' + material; } else if (gem != air) { input = '#forge:gems/' + material; } else { return; } // Implemented by Thermal // event.recipes.thermal.press(gear, [item.of(gearInput, 4), 'thermal:press_gear_die']); event.recipes.immersiveengineering.metal_press(output, ingredient.of(input, 4), mold); event.shaped(gear, [' B ', 'BAB', ' B '], { A: '#forge:nuggets/iron', B: input }); } function rod_unification(event, material, ingot, gem, rod) { if (rod == air) { return; } event.remove({ type: 'minecraft:crafting_shaped', output: rod }); var output = item.of(rod, 2), input, mold = 'immersiveengineering:mold_rod'; if (ingot != air) { input = '#forge:ingots/' + material; } else if (gem != air) { input = '#forge:gems/' + material; } else { return; } event.recipes.thermal.press(output, [input, mold]).energy(2400); event.recipes.immersiveengineering.metal_press(output, input, mold); event.shaped(output, [' A ', ' A ', ' '], { A: input }); } function astralsorcery_ore_processing_infuser(event, material, ore, ingot, gem) { if (ore == air) { return; } blacklistedMaterials = ['redstone', 'lapis', 'emerald', 'diamond', 'iron']; for (var i = 0; i < blacklistedMaterials.length; i++) { if (blacklistedMaterials[i] == material) { return; } } var input = 'forge:ores/' + material, output, count; if (gem != air) { output = gem; count = 5; } else if (ingot != air) { output = ingot; count = 3; } else { return; } event.custom({ type: 'astralsorcery:infuser', fluidInput: 'astralsorcery:liquid_starlight', input: { tag: input }, output: { item: output, count: count }, consumptionChance: 0.1, duration: 100, consumeMultipleFluids: false, acceptChaliceInput: true, copyNBTToOutputs: false }); } function bloodmagic_ore_processing_alchemy(event, material, ore, dust, gem) { if (ore == air || gem == air) { return; } var inputs = ['#forge:ores/' + material, '#bloodmagic:arc/cuttingfluid'], output = item.of(gem, 2); event.recipes.bloodmagic.alchemytable(output, inputs).syphon(400).ticks(200).upgradeLevel(1); } function bloodmagic_ore_processing_arc(event, material, ore, dust, gem) { var data = { recipes: [] }; if (ore != air && gem != air) { data.recipes.push({ input: '#forge:ores/' + material, output: item.of(gem, 5), addedOutput: [], tool: '#bloodmagic:arc/cuttingfluid' }); } if (gem != air && dust != air) { data.recipes.push({ input: '#forge:gems/' + material, output: item.of(dust, 1), addedOutput: [], tool: '#bloodmagic:arc/explosive' }); } data.recipes.forEach((recipe) => { event.recipes.bloodmagic .arc(recipe.output, recipe.input, recipe.tool, recipe.addedOutput) .consumeIngredient(false); }); } function create_ore_processing_with_secondary_outputs(event, material, crushedOre) { if (crushedOre == air) { return; } var primaryOutput = crushedOre, stoneOutput = 'minecraft:cobblestone', primaryCount = 2, secondaryCount = 2, secondaryMaterial, input = '#forge:ores/' + material, processingTime = 300; switch (material) { case 'iron': secondaryMaterial = 'nickel'; processingTime = 400; break; case 'nickel': secondaryMaterial = 'iron'; processingTime = 350; break; case 'gold': secondaryMaterial = 'zinc'; break; case 'copper': secondaryMaterial = 'gold'; processingTime = 350; break; case 'aluminum': secondaryMaterial = 'iron'; break; case 'lead': secondaryMaterial = 'silver'; break; case 'silver': secondaryMaterial = 'lead'; break; case 'uranium': secondaryMaterial = 'lead'; processingTime = 400; break; case 'osmium': secondaryMaterial = 'tin'; processingTime = 400; break; case 'tin': secondaryMaterial = 'osmium'; processingTime = 350; break; case 'zinc': secondaryMaterial = 'gold'; processingTime = 350; break; case 'iesnium': secondaryMaterial = 'iesnium'; processingTime = 350; break; case 'cloggrum': secondaryMaterial = 'cloggrum'; processingTime = 350; break; case 'froststeel': secondaryMaterial = 'froststeel'; processingTime = 350; break; case 'regalium': secondaryMaterial = 'regalium'; processingTime = 350; break; case 'utherium': secondaryMaterial = 'utherium'; processingTime = 350; break; default: return; } var secondaryOutput = getPreferredItemInTag(ingredient.of('#create:crushed_ores/' + secondaryMaterial)).id; var primaryChance = 0.25, secondaryChance = 0.05; var outputs = [ item.of(primaryOutput), item.of(primaryOutput, primaryCount).withChance(primaryChance), item.of(secondaryOutput, secondaryCount).withChance(secondaryChance) ]; event.recipes.create.milling(outputs, input).processingTime(processingTime); primaryChance = 0.6; secondaryChance = 0.1; outputs = [ item.of(primaryOutput), item.of(primaryOutput, primaryCount).withChance(primaryChance), item.of(secondaryOutput, secondaryCount).withChance(secondaryChance), Item.of(stoneOutput).withChance(0.125) ]; event.recipes.create.crushing(outputs, input).processingTime(processingTime); } function create_gem_processing(event, material, ore, gem, dust) { if (ore == air) { return; } var stoneOutput = 'minecraft:cobblestone', processingTime = 300, output = gem, primaryCount, secondaryCount, input = '#forge:ores/' + material; switch (material) { case 'redstone': primaryCount = 8; secondaryCount = 6; secondaryChance = 0.25; output = dust; break; case 'coal': primaryCount = 2; secondaryCount = 2; secondaryChance = 0.5; break; case 'diamond': primaryCount = 2; secondaryCount = 1; secondaryChance = 0.25; processingTime = 500; break; case 'emerald': primaryCount = 2; secondaryCount = 1; secondaryChance = 0.25; processingTime = 500; break; case 'lapis': primaryCount = 8; secondaryCount = 4; secondaryChance = 0.25; break; case 'quartz': primaryCount = 2; secondaryCount = 4; secondaryChance = 0.5; processingTime = 350; stoneOutput = 'minecraft:netherrack'; break; case 'sulfur': primaryCount = 6; secondaryCount = 2; secondaryChance = 0.25; break; case 'apatite': primaryCount = 8; secondaryCount = 4; secondaryChance = 0.25; break; case 'fluorite': primaryCount = 6; secondaryCount = 3; secondaryChance = 0.25; break; case 'dimensional': primaryCount = 6; secondaryCount = 3; secondaryChance = 0.25; break; default: return; } var outputs = [ item.of(output, primaryCount), item.of(output, secondaryCount).withChance(secondaryChance), Item.of(stoneOutput).withChance(0.125) ]; event.recipes.create.crushing(outputs, input).processingTime(processingTime); } function create_ingot_gem_milling(event, material, ingot, dust, gem) { if (dust == air) { return; } var input, outputs = [item.of(dust, 1)], processingTime = 300; if (ingot != air) { input = '#forge:ingots/' + material; } else if (gem != air) { input = '#forge:gems/' + material; } else { return; } event.recipes.create.milling(outputs, input).processingTime(processingTime); } function create_press_plates(event, material, gem, plate) { if (plate == air || gem == air) { return; } var output = plate; var input = '#forge:gems/' + material; event.recipes.create.pressing(output, input); } function emendatus_hammer_crushing(event, material, ore, dust) { if (ore == air || dust == air) { return; } event.remove({ id: 'immersiveengineering:crafting/hammercrushing_' + material }); event.replaceInput( { id: 'emendatusenigmatica:dust_from_chunk/' + material }, 'emendatusenigmatica:' + material + '_chunk', '#forge:ores/' + material ); } function immersiveengineering_gem_crushing(event, material, dust, gem) { if (gem == air || dust == air) { return; } var output = dust, input = '#forge:gems/' + material; event.recipes.immersiveengineering.crusher(output, input).energy(2000); } function immersiveengineering_ingot_crushing(event, material, dust, ingot) { if (ingot == air || dust == air) { return; } if (material == 'signalum' || material == 'lumium' || material == 'enderium') { var output = dust, input = '#forge:ingots/' + material; event.recipes.immersiveengineering.crusher(output, input).energy(2000); } } function immersiveengineering_ore_processing(event, material, ore, gem) { if (ore == air || gem == air) { return; } var count, input = '#forge:ores/' + material; switch (material) { case 'sulfur': count = 6; break; case 'apatite': count = 12; break; case 'dimensional': count = 8; break; case 'mana': count = 2; break; case 'cinnabar': count = 2; break; case 'potassium_nitrate': count = 2; break; case 'bitumen': count = 2; break; default: return; } var output = item.of(gem, count); event.recipes.immersiveengineering.crusher(output, input).energy(2000); } function immersiveengineering_press_plates(event, material, ingot, gem, plate) { if (plate == air) { return; } //var hammer = 'immersiveengineering:hammer'; //event.shapeless(plate, [hammer, ingot]); event.remove({ id: 'immersiveengineering:crafting/plate_' + material + '_hammering' }); blacklistedMaterials = [ 'iron', 'gold', 'copper', 'aluminum', 'silver', 'lead', 'nickel', 'uranium', 'osmium', 'tin', 'zinc', 'bronze', 'brass', 'constantan', 'electrum', 'steel', 'invar' ]; for (var i = 0; i < blacklistedMaterials.length; i++) { if (blacklistedMaterials[i] == material) { return; } } var output = plate, mold = 'immersiveengineering:mold_plate'; if (ingot != air) { input = '#forge:ingots/' + material; } else if (gem != air) { input = '#forge:gems/' + material; } else { return; } event.recipes.immersiveengineering.metal_press(output, input, mold).energy(2400); } function occultism_ore_crushing(event, material, ore, dust, gem) { if (ore == air) { return; } blacklistedMaterials = ['silver']; for (var i = 0; i < blacklistedMaterials.length; i++) { if (blacklistedMaterials[i] == material) { return; } } var count; switch (material) { case 'redstone': count = 6; break; case 'coal': count = 4; break; case 'lapis': count = 9; break; case 'quartz': count = 3; break; case 'sulfur': count = 6; break; case 'apatite': count = 12; break; case 'fluorite': count = 6; break; case 'dimensional': count = 8; break; default: count = 2; } var output, input = 'forge:ores/' + material, output = dust; if (gem != air) { output = gem; } event.custom({ type: 'occultism:crushing', ingredient: { tag: input }, result: { item: output, count: count }, crushing_time: 100 }); } function occultism_ingot_gem_crushing(event, material, ingot, dust, gem) { if (dust == air) { return; } blacklistedMaterials = ['silver']; for (var i = 0; i < blacklistedMaterials.length; i++) { if (blacklistedMaterials[i] == material) { return; } } var input, output = dust; if (ingot != air) { input = 'forge:ingots/' + material; } else if (gem != air) { input = 'forge:gems/' + material; } else { return; } event.custom({ type: 'occultism:crushing', ingredient: { tag: input }, result: { item: output, count: 1 }, crushing_time: 100 }); } function pedestals_ore_crushing(event, material, ore, dust, gem) { if (ore == air) { return; } var count; switch (material) { case 'redstone': count = 6; break; case 'coal': count = 4; break; case 'lapis': count = 9; break; case 'quartz': count = 3; break; case 'sulfur': count = 6; break; case 'apatite': count = 12; break; case 'fluorite': count = 6; break; case 'dimensional': count = 8; break; default: count = 2; } var output, input = 'forge:ores/' + material, output = dust; if (gem != air) { output = gem; } event.custom({ type: 'pedestals:pedestal_crushing', ingredient: { tag: input }, result: { item: output, count: count } }); event.remove({ id: 'pedestals:pedestal_crushing/dust' + material }); } function pedestals_ingot_gem_crushing(event, material, ingot, dust, gem) { if (dust == air) { return; } var input, output = dust; if (ingot != air) { input = 'forge:ingots/' + material; } else if (gem != air) { input = 'forge:gems/' + material; } else { return; } event.custom({ type: 'pedestals:pedestal_crushing', ingredient: { tag: input }, result: { item: output, count: 1 } }); } function thermal_press_plates(event, material, gem, plate) { if (plate == air || gem == air) { return; } var output = plate; var input = '#forge:gems/' + material; event.recipes.thermal.press(item.of(output), input); } function thermal_press_wires(event, material, wire) { if (wire == air) { return; } var output = item.of(wire, 2), input = '#forge:ingots/' + material, mold = 'immersiveengineering:mold_wire'; event.recipes.thermal.press(output, [input, mold]).energy(2400); } //dye normalization functions function botania_dye_pestle_mortar(event, recipe) { if (recipe.type == 'petal') { return; } var baseCount = 2, multiplier = 1; if (recipe.type == 'large') { multiplier = 2; } var count = baseCount * multiplier, output = Item.of(recipe.primary, count), inputs = [recipe.input, 'botania:pestle_and_mortar']; event.shapeless(output, inputs); } function create_dye_milling(event, recipe) { var baseCount = 2, multiplier = 1; if (recipe.type == 'large') { multiplier = 2; } var count = baseCount * multiplier, outputs = [ Item.of(recipe.primary, count), Item.of(recipe.secondary).withCount(count).withChance(0.25), Item.of(recipe.tertiary).withCount(multiplier).withChance(0.05) ], input = recipe.input; event.recipes.create.milling(outputs, input); } function immersiveengineering_dye_crusher(event, recipe) { var baseCount = 2, multiplier = 1; if (recipe.type == 'large') { multiplier = 2; } var count = baseCount * multiplier, output = Item.of(recipe.primary, count), extras = [ Item.of(recipe.secondary).withCount(count).withChance(0.25), Item.of(recipe.tertiary).withCount(multiplier).withChance(0.05) ], input = recipe.input; event.recipes.immersiveengineering.crusher(output, input, extras); } function mekanism_dye_enriching(event, recipe) { var baseCount = 3, multiplier = 1; if (recipe.type == 'large') { multiplier = 2; } var count = baseCount * multiplier, output = Item.of(recipe.primary, count), input = recipe.input; event.recipes.mekanism.enriching(output, input); } function pedestals_dye_crushing(event, recipe) { var baseCount = 2, multiplier = 1; if (recipe.type == 'large') { multiplier = 2; } var count = baseCount * multiplier, output = recipe.primary, input = recipe.input; event.custom({ type: 'pedestals:pedestal_crushing', ingredient: { item: input }, result: { item: output, count: count } }); } function thermal_dye_centrifuge(event, recipe) { var baseCount = 2, multiplier = 1; if (recipe.type == 'large') { multiplier = 2; } var count = baseCount * multiplier, outputs = [ Item.of(recipe.primary, count), Item.of(recipe.secondary).withCount(count).withChance(0.25), Item.of(recipe.tertiary).withCount(multiplier).withChance(0.05) ], input = recipe.input; event.recipes.thermal.centrifuge(outputs, input); }