From b0633925191122a71e4181d64fefc26d5da81e3c Mon Sep 17 00:00:00 2001 From: Redeix Date: Tue, 11 Nov 2025 12:35:27 -0600 Subject: [PATCH] First day of bioline recipes (#2201) * material and tag changes * adds a cleanroom recipe json editor utility script * most of the initial biochem recipes * circuit number change * hoisted up class loaders * ISP output is so fickle --------- Co-authored-by: Pyritie --- kubejs/server_scripts/gregtech/utility.js | 71 +++- kubejs/server_scripts/tfg/recipes.biochem.js | 371 +++++++++++++++++- kubejs/server_scripts/tfg/tags.js | 5 +- kubejs/startup_scripts/gtceu/constants.js | 17 +- .../startup_scripts/tfg/materials.bioline.js | 4 +- 5 files changed, 445 insertions(+), 23 deletions(-) diff --git a/kubejs/server_scripts/gregtech/utility.js b/kubejs/server_scripts/gregtech/utility.js index d95f49e77..bbda57007 100644 --- a/kubejs/server_scripts/gregtech/utility.js +++ b/kubejs/server_scripts/gregtech/utility.js @@ -1,6 +1,16 @@ // priority: 0 "use strict"; +const JsonObject = Java.loadClass('com.google.gson.JsonObject'); +const JsonArray = Java.loadClass('com.google.gson.JsonArray'); +const JsonParser = Java.loadClass('com.google.gson.JsonParser'); +const JsonElement = Java.loadClass('com.google.gson.JsonElement'); + +// Helper to call `JsonArray.add(JsonElement)` explicitly because "Rhino Moment". +const addJsonElement = (jsonArray, jsonElement) => { + jsonArray.getClass().getMethod("add", JsonElement).invoke(jsonArray, jsonElement); +}; + //#region Mixer Recipes /** * Function for generating gtceu mixer recipes. @@ -273,16 +283,6 @@ function forEachMaterial(iterator) { */ function addCircuitToRecipe(event, recipeId, circuitNumber) { - const JsonObject = Java.loadClass('com.google.gson.JsonObject'); - const JsonArray = Java.loadClass('com.google.gson.JsonArray'); - const JsonParser = Java.loadClass('com.google.gson.JsonParser'); - const JsonElementClass = Java.loadClass('com.google.gson.JsonElement'); - - // Helper to call JsonArray.add(JsonElement) explicitly because "Rhino Moment". - const addJsonElement = (jsonArray, jsonElement) => { - jsonArray.getClass().getMethod("add", JsonElementClass).invoke(jsonArray, jsonElement); - }; - event.findRecipes({ id: recipeId }).forEach(recipe => { const inputsEl = recipe.json.get("inputs"); let inputsObj; @@ -598,4 +598,55 @@ function sterilizeItem(event, input, output, multiplier, cleanroom) { autoclave_recipe.cleanroom(cleanroom); }; }; + +//#endregion +//#region Cleanroom Tool + +/** + * Ensures recipes have a cleanroom recipe condition set to the specified type. + * + * * For each recipe: + * * * If `recipeConditions` is an array, finds an object with `type` === `cleanroom`. + * * * If found, updates its `cleanroom` property to the given `cleanroomType`. + * * * If not found, appends a new condition object `{ type: "cleanroom", cleanroom: cleanroomType }` to the array. + * * * If `recipeConditions` is absent or not an array, creates a new JSON array containing the cleanroom condition. + * + * @throws This function will not work with other recipe conditions present besides `CleanroomType`. + * + * @param {event} event + * @param {string} recipeId - recipe ID. + * @param {'cleanroom'|'sterile_cleanroom'} cleanroomType - Cleanroom type to be assigned. + */ +function addCleanroom(event, recipeId, cleanroomType) { + event.findRecipes({ id: recipeId }).forEach(recipe => { + // Ensure recipe has a cleanroom condition matching the cleanroomType string. + // Replace existing cleanroom condition or add new one if absent. + const desiredCleanroom = cleanroomType; + const conditions = recipe.json.get("recipeConditions"); + let conditionArray; + if (conditions && conditions.isJsonArray && conditions.isJsonArray()) { + conditionArray = conditions.getAsJsonArray(); + } else { + conditionArray = new JsonArray(); + recipe.json.add("recipeConditions", conditionArray); + } + + let hasCleanroom = false; + for (let i = 0; i < conditionArray.size(); i++) { + let element = conditionArray.get(i).getAsJsonObject(); + if (element.has("type") && element.get("type").getAsString() === "cleanroom") { + element.addProperty("cleanroom", desiredCleanroom); + hasCleanroom = true; + break; + } + } + if (!hasCleanroom) { + let cond = new JsonObject(); + cond.addProperty("type", "cleanroom"); + cond.addProperty("cleanroom", desiredCleanroom); + addJsonElement(conditionArray, cond); + } + }); +}; + //#endregion \ No newline at end of file diff --git a/kubejs/server_scripts/tfg/recipes.biochem.js b/kubejs/server_scripts/tfg/recipes.biochem.js index 58bc16287..add895ec3 100644 --- a/kubejs/server_scripts/tfg/recipes.biochem.js +++ b/kubejs/server_scripts/tfg/recipes.biochem.js @@ -7,6 +7,7 @@ function registerTFGBiochemRecipes(event) { const $ISPRecipeLogic = Java.loadClass("su.terrafirmagreg.core.common.data.tfgt.machine.trait.ISPOutputRecipeLogic") const $SizedIngredient = Java.loadClass("com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient") + const Sized = (ing, amount) => $SizedIngredient.create(ing, amount) /** * @typedef {Object} BioreactorRecipeData @@ -117,7 +118,6 @@ function registerTFGBiochemRecipes(event) { ///////////////////////////////////////// - //#region Recipes // EXAMPLE // growthChamberRecipeText('test/test', 10*60*20, GTValues.VA[GTValues.EV], 'tfg.food_recipe.brining', { // itemInputs: ['tfc:food/red_apple','tfc:food/red_apple', '1x tfc:silica_glass_bottle'], @@ -132,7 +132,6 @@ function registerTFGBiochemRecipes(event) { // itemOutputProvider: TFC.isp.of('3x tfc:food/green_apple').copyFood().addTrait('firmalife:smoked') // }) - //#endregion //#region Multiblock Parts event.recipes.gtceu.assembler('tfg:uv_led') @@ -188,7 +187,7 @@ function registerTFGBiochemRecipes(event) { C: '#gtceu:circuits/ev', D: 'gtceu:aluminium_single_cable', E: 'gtceu:ev_electric_pump', - F: 'gtceu:ev_electric_motor', + F: 'gtceu:ev_electric_motor' }).addMaterialInfo().id('tfg:shaped/bioreactor'); event.recipes.gtceu.shaped('tfg:casings/bioculture_rotor_primary', [ @@ -354,5 +353,371 @@ function registerTFGBiochemRecipes(event) { lab_cleaning.forEach(entry => { sterilizeItem(event, entry.input, entry.output, entry.multiplier, entry.cleanroom); }); + + //#endregion + //#region Decellularization + + // Hydrogenation of fatty acids to produce lauryl alcohol. + event.recipes.gtceu.chemical_reactor('tfg:lauryl_alcohol') + .inputFluids( + '#firmalife:oils 1000', + Fluid.of('gtceu:hydrogen', 2000) + ) + .notConsumable(ChemicalHelper.get(TagPrefix.dust, GTMaterials.Palladium, 1)) + .outputFluids(Fluid.of('tfg:lauryl_alcohol', 1000)) + .duration(20*20) + .EUt(GTValues.VA[GTValues.EV]); + + // Direct synthesis of chlorosulfuric acid. + event.recipes.gtceu.chemical_reactor('tfg:chlorosulfuric_acid') + .inputFluids( + Fluid.of('gtceu:sulfur_trioxide', 1000), + Fluid.of('gtceu:hydrochloric_acid', 1000) + ) + .outputFluids(Fluid.of('tfg:chlorosulfuric_acid', 1000)) + .duration(10*20) + .EUt(GTValues.VA[GTValues.HV]); + + // Synthesis of sodium dodecyl sulfate. Chemistry is not accurate since the organic group in lauryl alcohol is unknown here. + event.recipes.gtceu.chemical_reactor('tfg:sodium_dodecyl_sulfate') + .inputFluids( + Fluid.of('tfg:lauryl_alcohol', 1000), + Fluid.of('tfg:chlorosulfuric_acid', 2000) + ) + .outputFluids( + Fluid.of('tfg:sodium_dodecyl_sulfate', 1000), + Fluid.of('gtceu:sulfur_trioxide', 1000) + ) + .duration(30*20) + .EUt(GTValues.VA[GTValues.EV]); + + // Redox reaction to produce sodium hypochlorite. + event.recipes.gtceu.chemical_reactor('tfg:sodium_hypochlorite') + .itemInputs( + ChemicalHelper.get(TagPrefix.dust, GTMaterials.SodiumHydroxide, 2) + ) + .inputFluids( + Fluid.of('gtceu:chlorine', 2000) + ) + .outputFluids( + Fluid.of('tfg:sodium_hypochlorite', 1000), + Fluid.of('minecraft:water', 1000) + ) + .itemOutputs(Item.of('gtceu:salt')) + .duration(10*20) + .EUt(GTValues.VA[GTValues.HV]); + + // Decellularization of organic material to produce cellulose matrix. + /** + * @type {Array} + * @property {'fluid'|'item'} type - Item or Fluid. + * @property {string} id - Item or fluid ID. + * @property {number} amount - Amount of items or millibuckets of fluid. + */ + const organics = [ + { type: 'item', id: 'gtceu:bio_chaff', amount: 1 }, + { type: 'fluid', id: 'gtceu:biomass', amount: 1000 } + ]; + + /** + * Registers a bioreactor "decellularization" recipes. + * + * @param {event} event + * @param {'fluid'|'item'} organicType - Type of the organic input. Must be either 'fluid' or 'item'. + * @param {string} organicId - Registry ID of the organic input. + * @param {number} organicAmount - Amount of the organic input. + */ + function deccellularizationRecipe(event, organicType, organicId, organicAmount) { + let recipe = event.recipes.gtceu.bioreactor(`tfg:decellularization/${organicId.replace(':', '_')}`) + .inputFluids( + Fluid.of('tfg:sodium_dodecyl_sulfate', 200), + Fluid.of('gtceu:acetone', 1000), + Fluid.of('tfg:sodium_hypochlorite', 1000) + ) + .itemInputs( + Ingredient.of('tfg:lab_equipment') + ) + .itemOutputs( + Item.of('tfg:cellulose_matrix'), + Item.of('tfg:dirty_lab_equipment') + ) + .duration(30*20) + .EUt(GTValues.VA[GTValues.IV]) + .cleanroom(CleanroomType.CLEANROOM) + .dimension('ad_astra:venus'); + + if (organicType === 'fluid') { + recipe.inputFluids( + Fluid.of(organicId, organicAmount) + ); + }; + if (organicType === 'item') { + recipe.itemInputs( + Ingredient.of(organicId).withCount(organicAmount) + ); + }; + }; + + organics.forEach(organic => + deccellularizationRecipe(event, organic.type, organic.id, organic.amount) + ); + + //#endregion + //#region Gram Stain + + // N,N-Dimethylaniline synthesis. + event.recipes.gtceu.chemical_reactor('tfg:n_n_dimethylaniline') + .inputFluids( + Fluid.of('tfg:aniline', 1000), + Fluid.of('tfg:iodomethane', 2000) + ) + .outputFluids( + Fluid.of('tfg:n_n_dimethylaniline', 1000), + Fluid.of('gtceu:hydrogen_iodide', 2000) + ) + .duration(20*20) + .EUt(GTValues.VA[GTValues.EV]); + + // Crystal violet synthesis. + event.recipes.gtceu.large_chemical_reactor('tfg:crystal_violet') + .inputFluids( + Fluid.of('tfg:n_n_dimethylaniline', 3000), + Fluid.of('gtceu:formaldehyde', 1000), + Fluid.of('gtceu:hydrochloric_acid', 1000), + Fluid.of('gtceu:oxygen', 2000) + ) + .outputFluids( + Fluid.of('tfg:crystal_violet', 1000), + Fluid.of('gtceu:water', 3000) + ) + .duration(20*20) + .EUt(GTValues.VA[GTValues.IV]); + + // Crystal violet to dye. + event.recipes.gtceu.mixer('tfg:crystal_violet_dye') + .inputFluids( + Fluid.of('tfg:crystal_violet', 10), + Fluid.of('minecraft:water', 1000) + ) + .outputFluids(Fluid.of('tfc:purple_dye', 1000)) + .duration(5*20) + .EUt(GTValues.VA[GTValues.LV]); + + //Gram stain solution. + /** + * @type {Array} + * @property {string} solvent - Solvent fluid ID. + */ + const gramStainSolvents = [ + 'gtceu:ethanol', + 'gtceu:acetone' + ]; + gramStainSolvents.forEach(solvent => { + event.recipes.gtceu.large_chemical_reactor(`tfg:gram_stain_solvent_${solvent.replace(':', '_')}`) + .inputFluids( + Fluid.of('tfg:crystal_violet', 1000), + Fluid.of('tfc:red_dye', 1000), + Fluid.of(solvent, 1000) + ) + .itemInputs( + ChemicalHelper.get(TagPrefix.dust, GTMaterials.Iodine, 1) + ) + .outputFluids(Fluid.of('tfg:gram_stain', 4000)) + .duration(8*20) + .EUt(GTValues.VA[GTValues.IV]) + .cleanroom(CleanroomType.CLEANROOM) + .dimension('ad_astra:venus'); + }); + + //#endregion + //#region Triglcerides + + // Butyric acid synthesis. + event.recipes.gtceu.chemical_reactor('tfg:butyric_acid') + .inputFluids( + Fluid.of('gtceu:propene', 2000), + Fluid.of('gtceu:carbon_monoxide', 6000), + Fluid.of('gtceu:hydrogen', 12000) + ) + .outputFluids( + Fluid.of('tfg:butyric_acid', 3000) + ) + .duration(10*20) + .circuit(4) + .EUt(GTValues.VA[GTValues.EV]); + + // Triglycerides from fat. + event.recipes.gtceu.vacuum_freezer('tfg:triglyceride_oil_from_fat') + .inputFluids( + Fluid.of('gtceu:liquid_carbon_dioxide', 1000) + ) + .itemInputs( + Ingredient.of('#tfg:solid_fats') + ) + .outputFluids( + Fluid.of('tfg:triglyceride_oil', 2000) + ) + .itemOutputs( + ChemicalHelper.get(TagPrefix.dust, 'tfg:cholesterol', 1) + ) + .duration(20*20) + .dimension('ad_astra:venus') + .EUt(GTValues.VA[GTValues.IV]); + + // Triglycerides from cell factory. + bioreactorRecipe('triglyceride_oil_from_smooth_endoplasmic_reticula', 10*20, 1920, { + fluidInputs: [ + 'gtceu:glycerol 1000', + 'tfg:butyric_acid 1000' + ], + itemInputs: [ + 'tfg:smooth_endoplasmic_reticula', + 'tfg:lab_equipment' + ], + fluidOutputs: [ + Fluid.of('tfg:triglyceride_oil', 2000) + ], + itemOutputs: [ + 'tfg:dirty_lab_equipment' + ], + cleanroom: CleanroomType.CLEANROOM + }); + + // Lactose from cell factory. + bioreactorRecipe('lactose_from_rough_endoplasmic_reticula', 10*20, 1920, { + itemInputs: [ + 'tfg:rough_endoplasmic_reticula', + 'tfg:lab_equipment', + 'tfg:cholesterol_dust' + ], + itemOutputs: [ + '4x gtceu:lactose_dust', + 'tfg:dirty_lab_equipment' + ], + cleanroom: CleanroomType.CLEANROOM, + itemOutputProvider: TFC.isp.of('4x gtceu:lactose_dust') + }); + + // Alpha keratin from cell factory. + bioreactorRecipe('alpha_keratin_from_rough_endoplasmic_reticula', 10*20, 1920, { + itemInputs: [ + 'tfg:rough_endoplasmic_reticula', + 'tfg:lab_equipment' + ], + fluidInputs: [ + 'tfg:proto_growth_medium 1000' + ], + itemOutputs: [ + '4x tfg:alpha_keratin', + 'tfg:dirty_lab_equipment' + ], + cleanroom: CleanroomType.CLEANROOM, + itemOutputProvider: TFC.isp.of('4x tfg:alpha_keratin') + }); + + //#endregion + //#region Basic Feeder Cells + + // Set collagen recipes to require a normal cleanroom instead of sterile. + /** + * @type {Array} + * @property {'string'} recipeId - Collagen recipe ID's. + */ + const collagenRecipes = [ + 'gtceu:large_chemical_reactor/collagen_from_bone', + 'gtceu:large_chemical_reactor/collagen_from_bone_meal', + 'gtceu:chemical_reactor/collagen_from_bone', + 'gtceu:chemical_reactor/collagen_from_bone_meal' + ]; + collagenRecipes.forEach(recipeEntry => { + addCleanroom(event, recipeEntry, 'cleanroom') + }); + + // Proto growth medium synthesis. + event.recipes.gtceu.bioreactor('tfg:proto_growth_medium') + .inputFluids( + Fluid.of('gtceu:distilled_water', 1000) + ) + .itemInputs( + ChemicalHelper.get(TagPrefix.dust, GTMaterials.Calcium, 1), + ChemicalHelper.get(TagPrefix.dust, GTMaterials.SodiumHydroxide, 1), + ChemicalHelper.get(TagPrefix.dust, 'gtceu:lactose', 1) + ) + .outputFluids( + Fluid.of('tfg:proto_growth_medium', 1000) + ) + .duration(10*20) + .EUt(GTValues.VA[GTValues.EV]) + .cleanroom(CleanroomType.CLEANROOM); + + // Fibroblast feeder cell synthesis. + event.recipes.gtceu.bioreactor('tfg:fibroblast_feeder_cells') + .inputFluids( + Fluid.of('firmalife:sugar_water', 1000), + Fluid.of('tfg:mutative_yeast', 1000) + ) + .itemInputs( + ChemicalHelper.get(TagPrefix.dust, GTMaterials.Collagen, 1), + Ingredient.of('tfg:lab_equipment') + ) + .notConsumable( + Ingredient.of('tfg:filled_dna_syringe') + ) + .outputFluids( + Fluid.of('tfg:fibroblast_feeder_cells', 1000) + ) + .itemOutputs( + Item.of('tfg:dirty_lab_equipment') + ) + .duration(1*60*20) + .EUt(GTValues.VA[GTValues.EV]) + .circuit(1) + .dimension('ad_astra:venus') + .cleanroom(CleanroomType.CLEANROOM); + + // Rough endoplasmic reticula synthesis. + bioreactorRecipe('tfg:rough_endoplasmic_reticula', 1*60*20, GTValues.VA[GTValues.EV], { + itemInputs: [ + 'gtceu:collagen_dust', + 'tfg:lab_equipment' + ], + fluidInputs: [ + Fluid.of('firmalife:sugar_water', 1000), + Fluid.of('tfg:mutative_yeast', 1000) + ], + itemOutputs: [ + 'tfg:rough_endoplasmic_reticula', + 'tfg:dirty_lab_equipment' + ], + notConsumable: [ + 'tfg:filled_dna_syringe' + ], + circuit: 2, + cleanroom: CleanroomType.CLEANROOM, + itemOutputProvider: TFC.isp.of('tfg:rough_endoplasmic_reticula').resetFood() + }); + + // Smooth endoplasmic reticula synthesis. + bioreactorRecipe('tfg:smooth_endoplasmic_reticula', 1*60*20, GTValues.VA[GTValues.EV], { + itemInputs: [ + 'gtceu:collagen_dust', + 'tfg:lab_equipment' + ], + fluidInputs: [ + Fluid.of('firmalife:sugar_water', 1000), + Fluid.of('tfg:mutative_yeast', 1000) + ], + itemOutputs: [ + 'tfg:smooth_endoplasmic_reticula', + 'tfg:dirty_lab_equipment' + ], + notConsumable: [ + 'tfg:filled_dna_syringe' + ], + circuit: 3, + cleanroom: CleanroomType.CLEANROOM, + itemOutputProvider: TFC.isp.of('tfg:smooth_endoplasmic_reticula').resetFood() + }); + //#endregion } \ No newline at end of file diff --git a/kubejs/server_scripts/tfg/tags.js b/kubejs/server_scripts/tfg/tags.js index 2aff6e5bb..803dd73f1 100644 --- a/kubejs/server_scripts/tfg/tags.js +++ b/kubejs/server_scripts/tfg/tags.js @@ -318,6 +318,9 @@ const registerTFGItemTags = (event) => { }); event.add('tfg:foil_packs', 'tfg:foil_pack'); event.add('tfg:foil_packs', 'tfg:clean_foil_pack') + + event.add('tfg:solid_fats', 'firmalife:food/butter') + event.add('tfg:solid_fats', 'tfc:blubber') //#endregion //#endregion @@ -691,8 +694,6 @@ const registerTFGFluidTags = (event) => { event.add('tfc:drinkables', 'tfg:semiheavy_ammoniacal_water') event.add('tfc:any_drinkables', 'tfg:semiheavy_ammoniacal_water') event.add('tfc:ingredients', 'tfg:semiheavy_ammoniacal_water') - event.add('firmalife:mixable', 'tfg:semiheavy_ammoniacal_water') - event.add('firmalife:usable_in_vat', 'tfg:semiheavy_ammoniacal_water') event.add('minecraft:water', 'tfg:semiheavy_ammoniacal_water') event.add('tfc:drinkables', 'tfg:proto_growth_medium') diff --git a/kubejs/startup_scripts/gtceu/constants.js b/kubejs/startup_scripts/gtceu/constants.js index 547da8ddc..85c03441a 100644 --- a/kubejs/startup_scripts/gtceu/constants.js +++ b/kubejs/startup_scripts/gtceu/constants.js @@ -230,7 +230,7 @@ global.GTCEU_HIDED_ITEMS = /** @type {const} */ ([ "gtceu:iv_damascus_steel_wrench", "gtceu:lv_damascus_steel_screwdriver", - "gtceu:sus_record", + "gtceu:sus_record" ]); //#endregion @@ -250,7 +250,7 @@ global.GTCEU_ARMORS = /** @type {const} */ ([ "gtceu:quarktech_leggings", "gtceu:quarktech_boots", "gtceu:quarktech_helmet", - "gtceu:advanced_quarktech_chestplate", + "gtceu:advanced_quarktech_chestplate" ]); //#endregion @@ -313,7 +313,7 @@ global.TFG_CASTING_MOLDS = /** @type {const} */ ([ "tfg:lamp_casting_mold", "tfg:trapdoor_casting_mold", "tfg:chain_casting_mold", - "tfg:bell_casting_mold", + "tfg:bell_casting_mold" ]); global.GTCEU_CASTING_MOLDS = /** @type {const} */ ([ @@ -334,7 +334,7 @@ global.GTCEU_CASTING_MOLDS = /** @type {const} */ ([ "gtceu:small_pipe_casting_mold", "gtceu:normal_pipe_casting_mold", "gtceu:large_pipe_casting_mold", - "gtceu:huge_pipe_casting_mold", + "gtceu:huge_pipe_casting_mold" ]); //#endregion @@ -371,7 +371,7 @@ global.ORE_BEARING_STONES = /** @type {const} */ ([ "mars_stone", "venus_stone", "mercury_stone", - "glacio_stone", + "glacio_stone" ]); //#endregion @@ -391,7 +391,10 @@ global.ADD_CIRCUIT = /** @type {const} */ ([ { recipeId: "gtceu:large_chemical_reactor/sodium_bicarbonate_from_salt", circuitNumber: 2 }, { recipeId: "gtceu:chemical_reactor/acetic_acid_from_methanol", circuitNumber: 1 }, - { recipeId: "gtceu:large_chemical_reactor/acetic_acid_from_methanol", circuitNumber: 1 } + { recipeId: "gtceu:large_chemical_reactor/acetic_acid_from_methanol", circuitNumber: 1 }, + + { recipeId: "gtceu:chemical_reactor/butraldehyde", circuitNumber: 1 }, + { recipeId: "gtceu:large_chemical_reactor/butraldehyde", circuitNumber: 1 } ]); //#endregion @@ -406,6 +409,6 @@ global.GTCEU_SUPERCONDUCTORS = /** @type {const} */ ([ { name: "indium_tin_barium_titanium_cuprate", materialId: "IndiumTinBariumTitaniumCuprate" }, { name: "uranium_rhodium_dinaquadide", materialId: "UraniumRhodiumDinaquadide" }, { name: "enriched_naquadah_trinium_europium_duranide", materialId: "EnrichedNaquadahTriniumEuropiumDuranide" }, - { name: "ruthenium_trinium_americium_neutronate", materialId: "RutheniumTriniumAmericiumNeutronate" }, + { name: "ruthenium_trinium_americium_neutronate", materialId: "RutheniumTriniumAmericiumNeutronate" } ]); //#endregion diff --git a/kubejs/startup_scripts/tfg/materials.bioline.js b/kubejs/startup_scripts/tfg/materials.bioline.js index 593eb40a2..7649d7ac0 100644 --- a/kubejs/startup_scripts/tfg/materials.bioline.js +++ b/kubejs/startup_scripts/tfg/materials.bioline.js @@ -26,10 +26,11 @@ const registerTFGBiolineMaterials = (event) => { event.create('tfg:lauryl_alcohol') .liquid(new GTFluidBuilder().temperature(293)) - .components('12x carbon', '26x hydrogen', '1x oxygen') + .components('12x carbon', '26x hydrogen', '1x oxygen', 'unknown') .iconSet(GTMaterialIconSet.FINE) .color(0x9C734E) .secondaryColor(0xA12727) + .flags(GTMaterialFlags.DISABLE_DECOMPOSITION) event.create('tfg:chlorosulfuric_acid') .liquid(new GTFluidBuilder().temperature(293).attribute(GTFluidAttributes.ACID)) @@ -44,6 +45,7 @@ const registerTFGBiolineMaterials = (event) => { .iconSet(GTMaterialIconSet.FINE) .color(0xCA9851) .secondaryColor(0xF0D5CE) + .flags(GTMaterialFlags.DISABLE_DECOMPOSITION) event.create('tfg:sodium_hypochlorite') .liquid(new GTFluidBuilder().temperature(293))