Custom Recipe Modifiers / Data Logic
Adding a Modifier
Custom recipe modifiers in KubeJS are done through a function. For this example, we will make multiblock that requires temperature for recipes, like the EBF does.
temperature_recipe_modifier.js
const $GTRecipe = Java.loadClass("com.gregtechceu.gtceu.api.recipe.GTRecipe");
const $MetaMachine = Java.loadClass("com.gregtechceu.gtceu.api.machine.MetaMachine");
function TemperatureModifier(machine, recipe) {
if (!(machine instanceof $MetaMachine)) return ModifierFunction.NULL // (1)
if (!(recipe instanceof $GTRecipe)) return ModifierFunction.NULL
if (!machine instanceof $CoilWorkableElectricMultiblockMachine) {
return $RecipeModifier.nullWrongType($CoilWorkableElectricMultiblockMachine, machine);
} else {
let temp = machine.getCoilType().getCoilTemperature() // (3)
let recipeTemp = recipe.data.getInt("RequiredTemp") // (4)
if (recipeTemp > temp) {
return ModifierFunction.NULL
}
return ModifierFunction.IDENTITY // (2)
}
}
ModifierFunction.NULL
Stops recipe.ModifierFunction.IDENTITY
Starts recipe.- Getting the coil temperature, multiblock must contain
.heatingCoils()
in any of its keys. - Checking if coil temperature is high enough.
Using Modifier
example_temperature_multiblock.js
const $CoilWorkableElectricMultiblockMachine = Java.loadClass("com.gregtechceu.gtceu.api.machine.multiblock.CoilWorkableElectricMultiblockMachine");
GTCEuStartupEvents.registry('gtceu:recipe_type', event => {
event.create('example_smelting')
.category('multiblock')
.setMaxIOSize(1, 1, 0, 0)
.setProgressBar(GuiTextures.PROGRESS_BAR_FUSION, FillDirection.LEFT_TO_RIGHT)
.setSound(GTSoundEntries.BATH);
});
GTCEuStartupEvents.registry('gtceu:machine', event => {
GTRecipeTypes.get("example_smelting").addDataInfo((data) => (
`Temperature: ${data.getInt("RequiredTemp")}K` // (4)
)) // (3)
event.create('example_smelter', 'multiblock')
.rotationState(RotationState.NON_Y_AXIS)
.machine((holder) => new $CoilWorkableElectricMultiblockMachine(holder)) // (1)
.recipeType('alchemy')
.recipeModifiers([(machine, recipe) => TemperatureModifier(machine, recipe)]) // (2)
.appearanceBlock(() => Block.getBlock("gtceu:solid_machine_casing"))
.pattern(definition => FactoryBlockPattern.start()
.aisle('###','HHH','###')
.aisle('###','H H','###')
.aisle('#C#','HHH','###')
.where('C', Predicates.controller(Predicates.blocks(definition.get())))
.where('#', Predicates.blocks("gtceu:solid_machine_casing")
.or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1))
.or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1))
.or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(1).setPreviewCount(1)))
.where('H', Predicates.heatingCoils())
.where(' ', Predicates.any())
.build())
.workableCasingModel("gtceu:block/casings/solid/machine_casing_solid_steel", "gtceu:block/multiblock/blast_furnace")
})
- Making multiblock coilMachine, without it our modifier won't work.
- Using our modifier.
- Display our data in EMI.
- Getting
RequiredTemp
data from our recipe.
Using our Modifier in a Recipe
To use our modifier in recipe, you need to add data to it.
example_smelting.js
ServerEvents.recipes(event => {
event.recipes.gtceu.example_smelting('example:diamondirt')
.itemInputs('minecraft:dirt')
.itemOutputs('gtceu:raw_diamond')
.addData("RequiredTemp", 1000) // (1)
.duration(320)
.EUt(GTValues.VA[GTValues.LV]);
})
- Adding data to our recipe, in this situation - Temperature