Custom Recipe Modifiers / Data Logic
Adding a Modifier
Custom recipe modifiers in are done through a function. For this example, we will make multiblock that requires temperature for recipes, like the EBF does.
Warning
It is recommended that your custom recipe modifiers are implemented in Java.
AddonRecipeModifiers.java
public static ModifierFunction customTemperatureModifier(MetaMachine machine, GTRecipe recipe) {
if (!(machine instanceof CoilWorkableElectricMultiblockMachine coilWorkable)) {
return RecipeModifier.nullWrongType(CoilWorkableElectricMultiblockMachine.class, machine);
}
int temp = coilWorkable.getCoilType().getCoilTemperature();
int recipeTemp = recipe.data.getInt("RequiredTemp");
if (recipeTemp > temp) {
return ModifierFunction.NULL; // Cancels recipe
}
return ModifierFunction.IDENTITY; // Runs recipe
}
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 $CoilWorkableElectricMultiblockMachine) {
return $RecipeModifier.nullWrongType($CoilWorkableElectricMultiblockMachine, machine);
} else {
let temp = machine.getCoilType().getCoilTemperature() // (1)
let recipeTemp = recipe.data.getInt("RequiredTemp") // (2)
if (recipeTemp > temp) {
return ModifierFunction.NULL // Cancels recipe
}
return ModifierFunction.IDENTITY // Runs 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(GTGuiTextures.PROGRESS_FUSION)
.addRecipeInfo(recipe => Text.literal(`Temperature: ${recipe.data.getInt("RequiredTemp")}K`)) // (3) (4)
.setSound(GTSoundEntries.BATH);
});
GTCEuStartupEvents.registry('gtceu:machine', event => {
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 => MultiblockPatternBuilder.start(RelativeDirection.FRONT, RelativeDirection.UP, RelativeDirection.LEFT)
.slice("###","HHH","###")
.slice("###","H H","###")
.slice("#C#","HHH","###")
.where('C', Predicates.controller(Predicates.blocks(definition.get())))
.where('#', Predicates.blocks("gtceu:solid_machine_casing")
.and(Predicates.abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1))
.and(Predicates.abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1))
.and(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
RequiredTempdata 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