[add] Datagen

[add] veil light test
[add] setup for future Blocks/Items/etc
This commit is contained in:
2026-10-16 13:44:54 +02:00
parent 9680df26dc
commit 93149a2340
31 changed files with 506 additions and 7 deletions
+17
View File
@@ -94,8 +94,25 @@ neoForge {
// Include resources generated by data generators. // Include resources generated by data generators.
sourceSets.main.resources { srcDir 'src/generated/resources' } sourceSets.main.resources { srcDir 'src/generated/resources' }
repositories {
maven { // For ImGuiMC
url = "https://maven.ryanhcode.dev/releases"
name = "RyanHCode Maven"
}
maven { // For Veil
name = 'BlameJared Maven (CrT / Bookshelf)'
url = 'https://maven.blamejared.com'
}
}
dependencies { dependencies {
implementation("foundry.veil:veil-neoforge-${project.minecraft_version}:${project.veil_version}") {
exclude group: "maven.modrinth"
exclude group: "me.fallenbreath"
}
implementation("foundry.imguimc:imguimc-neoforge-${project.minecraft_version}:${project.imguimc_version}")
// Example mod dependency with JEI // Example mod dependency with JEI
// The JEI API is declared for compile time use, while the full JEI artifact is used at runtime // The JEI API is declared for compile time use, while the full JEI artifact is used at runtime
// compileOnly "mezz.jei:jei-${mc_version}-common-api:${jei_version}" // compileOnly "mezz.jei:jei-${mc_version}-common-api:${jei_version}"
+3
View File
@@ -38,3 +38,6 @@ mod_group_id=ovh.glitchlabs
mod_authors= mod_authors=
# The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list. # The description of the mod. This is a simple multiline text string that is used for display purposes in the mod list.
mod_description= mod_description=
veil_version=4.5.2
imguimc_version=2.0.5
@@ -0,0 +1 @@
// 1.21.1 2026-10-16T12:47:44.582744189 Registries
@@ -0,0 +1,2 @@
// 1.21.1 2026-10-16T12:47:44.583189104 Tags for minecraft:item mod id ichori
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/c/tags/item/foods.json
@@ -0,0 +1,2 @@
// 1.21.1 2026-10-16T12:47:44.582965674 Tags for minecraft:block mod id ichori
35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/minecraft/tags/block/mineable/pickaxe.json
@@ -0,0 +1,2 @@
// 1.21.1 2026-10-16T12:47:44.582288393 Languages: en_us for mod: ichori
5fbe0d5f50f86e79824a0a050bd84d984933d48e assets/ichori/lang/en_us.json
@@ -0,0 +1 @@
// 1.21.1 2026-10-16T12:47:44.582476236 Loot Tables
@@ -0,0 +1 @@
// 1.21.1 2026-10-16T12:47:44.583089988 Block States: ichori
@@ -0,0 +1,2 @@
// 1.21.1 2026-10-16T12:48:59.62422735 Item Models: ichori
be44db6dcd5cd06217ef4e7a8025a21185ac48ac assets/ichori/models/item/test_spawn_light.json
@@ -0,0 +1 @@
// 1.21.1 2026-10-16T12:47:44.582636587 Recipes
@@ -0,0 +1,2 @@
// 1.21.1 2026-10-16T12:47:44.58149816 Data Maps
813fb735bf77d930c172d32fd84a5f09a09bb4a8 data/neoforge/data_maps/item/furnace_fuels.json
@@ -0,0 +1,3 @@
{
"creativetab.icgori.ichori": "Ichori"
}
@@ -0,0 +1,3 @@
{
"parent": "minecraft:item/stick"
}
@@ -0,0 +1,3 @@
{
"values": []
}
@@ -0,0 +1,3 @@
{
"values": []
}
@@ -0,0 +1,3 @@
{
"values": {}
}
@@ -0,0 +1,31 @@
package ovh.glitchlabs.ichori.Block;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredBlock;
import net.neoforged.neoforge.registries.DeferredRegister;
import ovh.glitchlabs.ichori.Ichori;
import ovh.glitchlabs.ichori.Item.ModItems;
import java.util.function.Supplier;
public class ModBlocks {
public static final DeferredRegister.Blocks BLOCKS =
DeferredRegister.createBlocks(Ichori.MODID);
private static <T extends Block>DeferredBlock<T> registerBlock(String name, Supplier<T> block) {
DeferredBlock<T> toReturn = BLOCKS.register(name, block);
registerBlockItem(name, toReturn);
return toReturn;
}
private static <T extends Block> void registerBlockItem(String name, DeferredBlock<T> block) {
ModItems.ITEMS.register(name, () -> new BlockItem(block.get(), new Item.Properties()));
}
public static void register(IEventBus eventBus) {
BLOCKS.register(eventBus);
}
}
@@ -31,6 +31,9 @@ import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredItem; import net.neoforged.neoforge.registries.DeferredItem;
import net.neoforged.neoforge.registries.DeferredRegister; import net.neoforged.neoforge.registries.DeferredRegister;
import org.slf4j.Logger; import org.slf4j.Logger;
import ovh.glitchlabs.ichori.Block.ModBlocks;
import ovh.glitchlabs.ichori.Item.ModCreativeModeTabs;
import ovh.glitchlabs.ichori.Item.ModItems;
// The value here should match an entry in the META-INF/neoforge.mods.toml file // The value here should match an entry in the META-INF/neoforge.mods.toml file
@Mod(Ichori.MODID) @Mod(Ichori.MODID)
@@ -49,8 +52,10 @@ public class Ichori {
// Do not add this line if there are no @SubscribeEvent-annotated functions in this class, like onServerStarting() below. // Do not add this line if there are no @SubscribeEvent-annotated functions in this class, like onServerStarting() below.
NeoForge.EVENT_BUS.register(this); NeoForge.EVENT_BUS.register(this);
// Register the item to a creative tab ModItems.register(modEventBus);
modEventBus.addListener(this::addCreative); ModBlocks.register(modEventBus);
ModCreativeModeTabs.register(modEventBus);
// Register our mod's ModConfigSpec so that FML can create and load the config file for us // Register our mod's ModConfigSpec so that FML can create and load the config file for us
modContainer.registerConfig(ModConfig.Type.COMMON, Config.SPEC); modContainer.registerConfig(ModConfig.Type.COMMON, Config.SPEC);
@@ -61,11 +66,6 @@ public class Ichori {
LOGGER.info("HELLO FROM COMMON SETUP"); LOGGER.info("HELLO FROM COMMON SETUP");
} }
// Add the example block item to the building blocks tab
private void addCreative(BuildCreativeModeTabContentsEvent event) {
if (event.getTabKey() == CreativeModeTabs.BUILDING_BLOCKS) event.accept(EXAMPLE_BLOCK_ITEM);
}
// You can use SubscribeEvent and let the Event Bus discover methods to call // You can use SubscribeEvent and let the Event Bus discover methods to call
@SubscribeEvent @SubscribeEvent
public void onServerStarting(ServerStartingEvent event) { public void onServerStarting(ServerStartingEvent event) {
@@ -0,0 +1,30 @@
package ovh.glitchlabs.ichori.Item;
import net.minecraft.core.registries.Registries;
import net.minecraft.network.chat.Component;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.ItemStack;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredItem;
import net.neoforged.neoforge.registries.DeferredRegister;
import ovh.glitchlabs.ichori.Ichori;
import java.awt.*;
import java.util.function.Supplier;
public class ModCreativeModeTabs {
public static final DeferredRegister<CreativeModeTab> CREATIVE_MODE_TAB =
DeferredRegister.create(Registries.CREATIVE_MODE_TAB, Ichori.MODID);
public static final Supplier<CreativeModeTab> ICHORI_TAB = CREATIVE_MODE_TAB.register("ichori_tab",
() -> CreativeModeTab.builder().icon(() -> new ItemStack(ModItems.TEST_Spawn_LIGHT.get()))
.title(Component.translatable("creativetab.ichori.ichori"))
.displayItems(((itemDisplayParameters, output) -> {
output.accept(ModItems.TEST_Spawn_LIGHT);
})).build());
public static void register(IEventBus eventBus) {
CREATIVE_MODE_TAB.register(eventBus);
}
}
@@ -0,0 +1,23 @@
package ovh.glitchlabs.ichori.Item;
import net.minecraft.world.item.Item;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredItem;
import net.neoforged.neoforge.registries.DeferredRegister;
import ovh.glitchlabs.ichori.Ichori;
import ovh.glitchlabs.ichori.Item.custom.test_spawn_light;
public class ModItems {
public static final DeferredRegister.Items ITEMS = DeferredRegister.createItems(Ichori.MODID);
public static final DeferredItem<Item> TEST_Spawn_LIGHT = ITEMS.register("test_spawn_light",
() -> new test_spawn_light(new Item.Properties()));
public static void register(IEventBus eventBus) {
ITEMS.register(eventBus);
}
}
@@ -0,0 +1,39 @@
package ovh.glitchlabs.ichori.Item.custom;
import foundry.veil.api.client.color.Color;
import foundry.veil.api.client.render.VeilRenderSystem;
import foundry.veil.api.client.render.light.data.PointLightData;
import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResultHolder;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level;
public class test_spawn_light extends Item {
public test_spawn_light(Properties properties) {
super(properties);
}
@Override
public InteractionResultHolder<ItemStack> use(Level level, Player player, InteractionHand hand) {
ItemStack stack = player.getItemInHand(hand);
if (level.isClientSide) {
BlockPos blockPos = player.blockPosition();
PointLightData data = new PointLightData();
data.setPosition(blockPos.getX() + 0.5, blockPos.getY() + 0.5, blockPos.getZ() + 0.5);
data.setRadius(6.0f);
data.setBrightness(7.0f);
data.setColor(137,39,39);
data.setInscatteringStrength(4.0f);
VeilRenderSystem.renderer().getLightRenderer().addLight(data);
}
return InteractionResultHolder.sidedSuccess(stack, level.isClientSide());
}
}
@@ -0,0 +1,45 @@
package ovh.glitchlabs.ichori.datagen;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.PackOutput;
import net.minecraft.data.loot.LootTableProvider;
import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.common.data.BlockTagsProvider;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import net.neoforged.neoforge.data.event.GatherDataEvent;
import ovh.glitchlabs.ichori.Ichori;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@EventBusSubscriber(modid = Ichori.MODID, bus = EventBusSubscriber.Bus.MOD)
public class DataGenerators {
@SubscribeEvent
public static void gatherData(GatherDataEvent event) {
DataGenerator generator = event.getGenerator();
PackOutput packOutput = generator.getPackOutput();
ExistingFileHelper existingFileHelper = event.getExistingFileHelper();
CompletableFuture<HolderLookup.Provider> lookupProvider = event.getLookupProvider();
generator.addProvider(event.includeServer(), new LootTableProvider(packOutput, Collections.emptySet(),
List.of(new LootTableProvider.SubProviderEntry(ModBlockLootTableProvider::new, LootContextParamSets.BLOCK)), lookupProvider));
generator.addProvider(event.includeServer(), new ModRecipeProvider(packOutput, lookupProvider));
BlockTagsProvider blockTagsProvider = new ModBlockTagProvider(packOutput, lookupProvider, existingFileHelper);
generator.addProvider(event.includeServer(), blockTagsProvider);
generator.addProvider(event.includeServer(), new ModItemTagProvider(packOutput, lookupProvider, blockTagsProvider.contentsGetter(), existingFileHelper));
generator.addProvider(event.includeServer(), new ModDataMapProvider(packOutput, lookupProvider));
generator.addProvider(event.includeServer(), new ModDatapackProvider(packOutput, lookupProvider));
generator.addProvider(event.includeClient(), new ModItemModelProvider(packOutput, existingFileHelper));
generator.addProvider(event.includeClient(), new ModBlockStateProvider(packOutput, existingFileHelper));
generator.addProvider(event.includeClient(), new ModLanguageProvider(packOutput));
}
}
@@ -0,0 +1,55 @@
package ovh.glitchlabs.ichori.datagen;
import net.minecraft.core.Holder;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.loot.BlockLootSubProvider;
import net.minecraft.world.flag.FeatureFlags;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.enchantment.Enchantment;
import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.storage.loot.LootTable;
import net.minecraft.world.level.storage.loot.entries.LootItem;
import net.minecraft.world.level.storage.loot.functions.ApplyBonusCount;
import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction;
import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator;
import ovh.glitchlabs.ichori.Block.ModBlocks;
import java.util.Set;
public class ModBlockLootTableProvider extends BlockLootSubProvider {
protected ModBlockLootTableProvider(HolderLookup.Provider registries) {
super(Set.of(), FeatureFlags.REGISTRY.allFlags(), registries);
}
@Override
protected void generate() {
/*
dropSelf(ModBlocks.BISMUTH_BLOCK.get());
// dropSelf(ModBlocks.MAGIC_BLOCK.get());
add(ModBlocks.BISMUTH_ORE.get(),
block -> createOreDrop(ModBlocks.BISMUTH_ORE.get(), ModItems.RAW_BISMUTH.get()));
add(ModBlocks.BISMUTH_DEEPSLATE_ORE.get(),
block -> createMultipleOreDrops(ModBlocks.BISMUTH_DEEPSLATE_ORE.get(), ModItems.RAW_BISMUTH.get(), 2, 5));
*/
}
protected LootTable.Builder createMultipleOreDrops(Block pBlock, Item item, float minDrops, float maxDrops) {
HolderLookup.RegistryLookup<Enchantment> registrylookup = this.registries.lookupOrThrow(Registries.ENCHANTMENT);
return this.createSilkTouchDispatchTable(pBlock,
this.applyExplosionDecay(pBlock, LootItem.lootTableItem(item)
.apply(SetItemCountFunction.setCount(UniformGenerator.between(minDrops, maxDrops)))
.apply(ApplyBonusCount.addOreBonusCount(registrylookup.getOrThrow(Enchantments.FORTUNE)))));
}
@Override
protected Iterable<Block> getKnownBlocks() {
return ModBlocks.BLOCKS.getEntries().stream().map(Holder::value)::iterator;
}
}
@@ -0,0 +1,23 @@
package ovh.glitchlabs.ichori.datagen;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.client.model.generators.BlockStateProvider;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import net.neoforged.neoforge.registries.DeferredBlock;
import ovh.glitchlabs.ichori.Ichori;
public class ModBlockStateProvider extends BlockStateProvider {
public ModBlockStateProvider(PackOutput output, ExistingFileHelper exFileHelper) {
super(output, Ichori.MODID, exFileHelper);
}
@Override
protected void registerStatesAndModels() {
// blockWithItem(ModBlocks.BISMUTH_BLOCK);
}
private void blockWithItem(DeferredBlock<?> deferredBlock) {
simpleBlockWithItem(deferredBlock.get(), cubeAll(deferredBlock.get()));
}
}
@@ -0,0 +1,25 @@
package ovh.glitchlabs.ichori.datagen;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.tags.BlockTags;
import net.neoforged.neoforge.common.data.BlockTagsProvider;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import org.jetbrains.annotations.Nullable;
import ovh.glitchlabs.ichori.Ichori;
import java.util.concurrent.CompletableFuture;
public class ModBlockTagProvider extends BlockTagsProvider {
public ModBlockTagProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider, @Nullable ExistingFileHelper existingFileHelper) {
super(output, lookupProvider, Ichori.MODID, existingFileHelper);
}
@Override
protected void addTags(HolderLookup.Provider provider) {
tag(BlockTags.MINEABLE_WITH_PICKAXE)
;
}
}
@@ -0,0 +1,22 @@
package ovh.glitchlabs.ichori.datagen;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.common.data.DataMapProvider;
import net.neoforged.neoforge.registries.datamaps.builtin.FurnaceFuel;
import net.neoforged.neoforge.registries.datamaps.builtin.NeoForgeDataMaps;
import java.util.concurrent.CompletableFuture;
public class ModDataMapProvider extends DataMapProvider {
protected ModDataMapProvider(PackOutput packOutput, CompletableFuture<HolderLookup.Provider> lookupProvider) {
super(packOutput, lookupProvider);
}
@Override
protected void gather() {
this.builder(NeoForgeDataMaps.FURNACE_FUELS)
//.add(ModItems.STARLIGHT_ASHES.getId(), new FurnaceFuel(1200), false)
;
}
}
@@ -0,0 +1,28 @@
package ovh.glitchlabs.ichori.datagen;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.RegistrySetBuilder;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.common.data.DatapackBuiltinEntriesProvider;
import net.neoforged.neoforge.registries.NeoForgeRegistries;
import ovh.glitchlabs.ichori.Ichori;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
public class ModDatapackProvider extends DatapackBuiltinEntriesProvider {
public static final RegistrySetBuilder BUILDER = new RegistrySetBuilder()
//.add(Registries.TRIM_MATERIAL, ModTrimMaterials::bootstrap)
//.add(Registries.TRIM_PATTERN, ModTrimPatterns::bootstrap)
//.add(Registries.ENCHANTMENT, ModEnchantments::bootstrap)
//.add(Registries.CONFIGURED_FEATURE, ModConfiguredFeatures::bootstrap)
//.add(Registries.PLACED_FEATURE, ModPlacedFeatures::bootstrap)
//.add(NeoForgeRegistries.Keys.BIOME_MODIFIERS, ModBiomeModifiers::bootstrap)
;
public ModDatapackProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
super(output, registries, BUILDER, Set.of(Ichori.MODID));
}
}
@@ -0,0 +1,22 @@
package ovh.glitchlabs.ichori.datagen;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.client.model.generators.ItemModelProvider;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import ovh.glitchlabs.ichori.Ichori;
import ovh.glitchlabs.ichori.Item.ModItems;
public class ModItemModelProvider extends ItemModelProvider {
public ModItemModelProvider(PackOutput output, ExistingFileHelper existingFileHelper) {
super(output, Ichori.MODID, existingFileHelper);
}
@Override
protected void registerModels() {
withExistingParent(ModItems.TEST_Spawn_LIGHT.getId().getPath(), mcLoc("item/stick"));
}
}
@@ -0,0 +1,27 @@
package ovh.glitchlabs.ichori.datagen;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.data.tags.ItemTagsProvider;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Block;
import net.neoforged.fml.common.Mod;
import net.neoforged.neoforge.common.Tags;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import org.jetbrains.annotations.Nullable;
import ovh.glitchlabs.ichori.Ichori;
import java.util.concurrent.CompletableFuture;
public class ModItemTagProvider extends ItemTagsProvider {
public ModItemTagProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider,
CompletableFuture<TagLookup<Block>> blockTags, @Nullable ExistingFileHelper existingFileHelper) {
super(output, lookupProvider, blockTags, Ichori.MODID, existingFileHelper);
}
@Override
protected void addTags(HolderLookup.Provider provider) {
tag(Tags.Items.FOODS)
;
}
}
@@ -0,0 +1,18 @@
package ovh.glitchlabs.ichori.datagen;
import net.minecraft.data.PackOutput;
import net.neoforged.neoforge.common.data.LanguageProvider;
import ovh.glitchlabs.ichori.Ichori;
public class ModLanguageProvider extends LanguageProvider {
public ModLanguageProvider(PackOutput output) {
super(output, Ichori.MODID, "en_us");
}
@Override
protected void addTranslations() {
add("creativetab.icgori.ichori", "Ichori");
}
}
@@ -0,0 +1,62 @@
package ovh.glitchlabs.ichori.datagen;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.data.recipes.*;
import net.minecraft.world.item.crafting.*;
import net.minecraft.world.level.ItemLike;
import net.neoforged.neoforge.common.conditions.IConditionBuilder;
import ovh.glitchlabs.ichori.Ichori;
import java.util.List;
import java.util.concurrent.CompletableFuture;
public class ModRecipeProvider extends RecipeProvider implements IConditionBuilder {
public ModRecipeProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
super(output, registries);
}
@Override
protected void buildRecipes(RecipeOutput recipeOutput) {
/*
List<ItemLike> BISMUTH_SMELTABLES = List.of(ModItems.RAW_BISMUTH,
ModBlocks.BISMUTH_ORE, ModBlocks.BISMUTH_DEEPSLATE_ORE);
ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModBlocks.BISMUTH_BLOCK.get())
.pattern("BBB")
.pattern("BBB")
.pattern("BBB")
.define('B', ModItems.BISMUTH.get())
.unlockedBy("has_bismuth", has(ModItems.BISMUTH)).save(recipeOutput);
ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ModItems.BISMUTH.get(), 9)
.requires(ModBlocks.BISMUTH_BLOCK)
.unlockedBy("has_bismuth_block", has(ModBlocks.BISMUTH_BLOCK)).save(recipeOutput);
oreSmelting(recipeOutput, BISMUTH_SMELTABLES, RecipeCategory.MISC, ModItems.BISMUTH.get(), 0.25f, 200, "bismuth");
*/
}
protected static void oreSmelting(RecipeOutput recipeOutput, List<ItemLike> pIngredients, RecipeCategory pCategory, ItemLike pResult,
float pExperience, int pCookingTIme, String pGroup) {
oreCooking(recipeOutput, RecipeSerializer.SMELTING_RECIPE, SmeltingRecipe::new, pIngredients, pCategory, pResult,
pExperience, pCookingTIme, pGroup, "_from_smelting");
}
protected static void oreBlasting(RecipeOutput recipeOutput, List<ItemLike> pIngredients, RecipeCategory pCategory, ItemLike pResult,
float pExperience, int pCookingTime, String pGroup) {
oreCooking(recipeOutput, RecipeSerializer.BLASTING_RECIPE, BlastingRecipe::new, pIngredients, pCategory, pResult,
pExperience, pCookingTime, pGroup, "_from_blasting");
}
protected static <T extends AbstractCookingRecipe> void oreCooking(RecipeOutput recipeOutput, RecipeSerializer<T> pCookingSerializer, AbstractCookingRecipe.Factory<T> factory,
List<ItemLike> pIngredients, RecipeCategory pCategory, ItemLike pResult, float pExperience, int pCookingTime, String pGroup, String pRecipeName) {
for(ItemLike itemlike : pIngredients) {
SimpleCookingRecipeBuilder.generic(Ingredient.of(itemlike), pCategory, pResult, pExperience, pCookingTime, pCookingSerializer, factory).group(pGroup).unlockedBy(getHasName(itemlike), has(itemlike))
.save(recipeOutput, Ichori.MODID + ":" + getItemName(pResult) + pRecipeName + "_" + getItemName(itemlike));
}
}
}