#modloaded deepmoblearning import mods.gregtech.multiblock.Builder; import mods.gregtech.multiblock.FactoryBlockPattern; import mods.gregtech.multiblock.RelativeDirection; import mods.gregtech.multiblock.functions.IPatternBuilderFunction; import mods.gregtech.IControllerTile; import mods.gregtech.multiblock.CTPredicate; import mods.gregtech.multiblock.IBlockPattern; import mods.gregtech.recipe.FactoryRecipeMap; import mods.gregtech.recipe.RecipeMap; import crafttweaker.data.IData; import crafttweaker.world.IFacing; import crafttweaker.item.IItemStack; import crafttweaker.item.IItemCondition; import scripts.common.makeShaped as makeShaped; // from DML's config val mobs as int[string] = { // mob RF/t "zombie": 64, "skeleton": 64, "creeper": 64, "spider": 64, "slime": 64, "witch": 512, "blaze": 1024, "ghast": 1024, "wither_skeleton": 1024, "enderman": 2048, "wither": 6666, "dragon": 6666, "shulker": 512, "guardian": 1024, "thermal_elemental": 1024 }; val pristine_types as IItemStack[string] = { // mob pristine type "zombie": , "skeleton": , "creeper": , "spider": , "slime": , "witch": , "blaze": , "ghast": , "wither_skeleton": , "enderman": , "wither": , "dragon": , "shulker": , "guardian": , "thermal_elemental": }; val model_prefix = "deepmoblearning:data_model_"; val pristine_prefix = "deepmoblearning:pristine_matter_"; // from DML's config val pristine_chances as int[] = [ 5, 10, 20, 30 ]; // from DML's config val maxExperience as int[] = [ 0, 50, 250, 500 ]; val name as string = "dml_sim_chamber"; val dml_sim_chamber = Builder.start("dml_sim_chamber", 3100) .withPattern(function(controller as IControllerTile) as IBlockPattern { return FactoryBlockPattern.start() .aisle( "CCCCC", "DEEED", "DEEED", "DEEED", "CCCCC" ) .aisle( "CGGGC", "GOOOG", "DOOOD", "GOOOG", "CCCCC" ) .aisle( "CGGGC", "GOOOG", "DO-OD", "GOOOG", "CCCCC" ) .aisle( "CGGGC", "GOOOG", "DOOOD", "GOOOG", "CCCCC" ) .aisle( "CCCCC", "DGGGD", "DGGGD", "DGGGD", "CCSCC" ) .where('S', controller.self) .where('D', ) .where('E', ) // enderium .where('G', ) .where('O', /* omnium */) .where('C', | CTPredicate.autoAbilities(true, false, true, true, false, false, false)) .build(); } as IPatternBuilderFunction) .withRecipeMap( FactoryRecipeMap.start("dml_recipe_map") .minInputs(2) .maxInputs(2) .minOutputs(2) .maxOutputs(2) .build()) .withBaseTexture() .buildAndRegister(); dml_sim_chamber.hasMaintenanceMechanics = false; dml_sim_chamber.hasMufflerMechanics = false; //Recipe for Controller makeShaped("simulation_controller", , ["MHM", "RCR", "MEM"], { M : , R : , C : , E : , H : }); val DATA_MODEL_MAXIMUM_TIER = 4; val asInt = function(data as IData) as int { return isNull(data) ? 0 : data as int; }; dml_sim_chamber.completeRecipe = function(logic as IRecipeLogic) { for slot, stack in logic.inputInventory { if(!isNull(stack) && stack.definition.id.startsWith(model_prefix)) { var tier = asInt(stack.tag.tier); var simulationCount = asInt(stack.tag.simulationCount) + 1; var killCount = asInt(stack.tag.killCount); if(tier < DATA_MODEL_MAXIMUM_TIER) { val roof = maxExperience[tier]; if(simulationCount + 1 >= roof) { killCount = 0; simulationCount = 0; tier += 1; } } logic.inputInventory.setStackInSlot( slot, stack.withTag( stack.tag + ({ tier: tier, simulationCount: simulationCount, totalSimulationCount: asInt(stack.tag.totalSimulationCount) + 1, killCount: killCount } as IData) ) ); return; } } } as ICompleteRecipeFunction; val withTier = function(tier as int) as IItemCondition { return function(stack as IItemStack) as bool { return asInt(stack.tag.tier) == tier; } as IItemCondition; }; for mob, cost in mobs { for tier, pristine_chance in pristine_chances { dml_recipe_map.recipeBuilder() .duration(301) .EUt(cost / 4 as int) .inputs() .notConsumable(itemUtils.getItem(model_prefix + mob).withTag({tier: tier + 1}, false).only(withTier(tier + 1))) .outputs(pristine_types[mob]) .chancedOutput(itemUtils.getItem(pristine_prefix + mob), pristine_chance * 100, 0) .buildAndRegister(); } }