package su.a71.new_soviet;
// === ABANDON HOPE, YE WHO ENTER HERE ===

import com.google.common.collect.Lists;
import net.fabricmc.fabric.api.datagen.v1.DataGeneratorEntrypoint;
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricBlockLootTableProvider;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider;
import net.minecraft.block.Blocks;
import net.minecraft.data.client.BlockStateModelGenerator;
import net.minecraft.data.client.ItemModelGenerator;
import net.minecraft.data.server.recipe.RecipeJsonProvider;
import net.minecraft.data.server.recipe.RecipeProvider;
import net.minecraft.data.server.recipe.ShapedRecipeJsonBuilder;
import net.minecraft.data.server.recipe.ShapelessRecipeJsonBuilder;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.Items;
import net.minecraft.recipe.Ingredient;
import net.minecraft.recipe.book.RecipeCategory;
import net.minecraft.registry.RegistryWrapper;
import net.minecraft.registry.tag.BlockTags;
import net.minecraft.registry.tag.ItemTags;
import net.minecraft.util.Util;
import su.a71.new_soviet.registration.NSE_Blocks;
import su.a71.new_soviet.registration.NSE_Custom;
import su.a71.new_soviet.registration.NSE_Items;
import su.a71.new_soviet.util.NSE_Tags;

import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;

public class DataGeneration implements DataGeneratorEntrypoint {
    private class BlockLootTables extends FabricBlockLootTableProvider {
        public BlockLootTables(FabricDataOutput dataOutput) {
            super(dataOutput);
        }

        @Override
        public void generate() {
            // Drops for building blocks
            addDrop(NSE_Blocks.SAND_TILES);
            addDrop(NSE_Blocks.NII_FLOOR);
            addDrop(NSE_Blocks.BIG_GREEN_TILES);
            addDrop(NSE_Blocks.BIG_GREEN_TILES_CRACKED);
            addDrop(NSE_Blocks.GREEN_BRICKS);
            addDrop(NSE_Blocks.CRACKED_GREEN_BRICKS);
            addDrop(NSE_Blocks.MOSSY_GREEN_BRICKS);
            addDrop(NSE_Blocks.GREEN_BRICKS_2);
            addDrop(NSE_Blocks.CRACKED_GREEN_BRICKS_2);
            addDrop(NSE_Blocks.MOSSY_GREEN_BRICKS_2);
            addDrop(NSE_Blocks.CRACKED_SAND_TILES);
            addDrop(NSE_Blocks.MOSSY_SAND_TILES);
            addDrop(NSE_Blocks.SMALL_SAND_TILES);
            addDrop(NSE_Blocks.SMALL_CRACKED_SAND_TILES);
            addDrop(NSE_Blocks.HERRINGBONE_SAND_TILES);
            addDrop(NSE_Blocks.CROSS_SAND_TILES);
            addDrop(NSE_Blocks.BIG_SAND_TILES);
            addDrop(NSE_Blocks.SAND_BRICKS);
            addDrop(NSE_Blocks.CRACKED_SAND_BRICKS);
            addDrop(NSE_Blocks.MOSSY_SAND_BRICKS);
            addDrop(NSE_Blocks.BIG_SAND_BRICKS);
            addDrop(NSE_Blocks.BRICK_TILES);
            addDrop(NSE_Blocks.CRACKED_BRICK_TILES);
            addDrop(NSE_Blocks.MOSSY_BRICK_TILES);
            addDrop(NSE_Blocks.DIRTY_BRICK_TILES);
            addDrop(NSE_Blocks.DARK_BRICK_TILES);
            addDrop(NSE_Blocks.CRACKED_DARK_BRICK_TILES);
            addDrop(NSE_Blocks.MOSSY_DARK_BRICK_TILES);
            addDrop(NSE_Blocks.DIRTY_DARK_BRICK_TILES);
            addDrop(NSE_Blocks.TEAL_TILES);
            addDrop(NSE_Blocks.CRACKED_TEAL_TILES);
            addDrop(NSE_Blocks.MOSSY_TEAL_TILES);
            addDrop(NSE_Blocks.SMALL_TEAL_TILES);
            addDrop(NSE_Blocks.SMALL_CRACKED_TEAL_TILES);
            addDrop(NSE_Blocks.GLAZED_TEAL_TILES);
            addDrop(NSE_Blocks.CRACKED_GLAZED_TEAL_TILES);
            addDrop(NSE_Blocks.VARIATED_TEAL_TILES);
            addDrop(NSE_Blocks.AQUAMARINE_TILES);
            addDrop(NSE_Blocks.CRACKED_AQUAMARINE_TILES);
            addDrop(NSE_Blocks.MOSSY_AQUAMARINE_TILES);
            addDrop(NSE_Blocks.DIRTY_AQUAMARINE_TILES);
            addDrop(NSE_Blocks.SMALL_AQUAMARINE_TILES);
            addDrop(NSE_Blocks.SMALL_CRACKED_AQUAMARINE_TILES);
            addDrop(NSE_Blocks.GLAZED_AQUAMARINE_TILES);
            addDrop(NSE_Blocks.CRACKED_GLAZED_AQUAMARINE_TILES);
            addDrop(NSE_Blocks.SMALL_DIORITE_TILES);
            addDrop(NSE_Blocks.SMALL_CRACKED_DIORITE_TILES);
            addDrop(NSE_Blocks.BIG_DIORITE_TILES);
            addDrop(NSE_Blocks.DIORITE_BRICKS);
            addDrop(NSE_Blocks.CRACKED_DIORITE_BRICKS);
            addDrop(NSE_Blocks.MOSSY_DIORITE_BRICKS);
            addDrop(NSE_Blocks.CALCITE_TILES);
            addDrop(NSE_Blocks.CRACKED_CALCITE_TILES);
            addDrop(NSE_Blocks.MOSSY_CALCITE_TILES);
            addDrop(NSE_Blocks.DIAGONAL_CALCITE_TILES);
            addDrop(NSE_Blocks.NII_WALL_1);
            addDrop(NSE_Blocks.CRACKED_NII_WALL_1);
            addDrop(NSE_Blocks.NII_WALL_2);
            addDrop(NSE_Blocks.NII_WALL_3);
            addDrop(NSE_Blocks.DRIPSTONE_TILES);
            addDrop(NSE_Blocks.CRACKED_DRIPSTONE_TILES);
            addDrop(NSE_Blocks.MOSSY_DRIPSTONE_TILES);
            addDrop(NSE_Blocks.DRIPSTONE_BRICKS);
            addDrop(NSE_Blocks.DEEPSLATE_TILES);
            addDrop(NSE_Blocks.CRACKED_DEEPSLATE_TILES);
            addDrop(NSE_Blocks.MOSSY_DEEPSLATE_TILES);
            addDrop(NSE_Blocks.SMALL_DEEPSLATE_TILES);
            addDrop(NSE_Blocks.SMALL_CRACKED_DEEPSLATE_TILES);
            addDrop(NSE_Blocks.DIAGONAL_DEEPSLATE_TILES);
            addDrop(NSE_Blocks.LIGHT_BLUE_TILES);
            addDrop(NSE_Blocks.CRACKED_LIGHT_BLUE_TILES);
            addDrop(NSE_Blocks.MOSSY_LIGHT_BLUE_TILES);
            addDrop(NSE_Blocks.VARIATED_LIGHT_BLUE_TILES);
            addDrop(NSE_Blocks.SMALL_LIGHT_BLUE_TILES);
            addDrop(NSE_Blocks.SMALL_CRACKED_LIGHT_BLUE_TILES);
            addDrop(NSE_Blocks.GLAZED_LIGHT_BLUE_TILES);
            addDrop(NSE_Blocks.CRACKED_GLAZED_LIGHT_BLUE_TILES);
            addDrop(NSE_Blocks.LIGHT_BLUE_BRICKS);
            addDrop(NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS);
            addDrop(NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS);
            addDrop(NSE_Blocks.BIG_GRANITE_TILES);
            addDrop(NSE_Blocks.SMALL_GRANITE_TILES);
            addDrop(NSE_Blocks.SMALL_CRACKED_GRANITE_TILES);
            addDrop(NSE_Blocks.GREEN_WHITE_TILES);
            addDrop(NSE_Blocks.CRACKED_GREEN_WHITE_TILES);
            addDrop(NSE_Blocks.MOSSY_GREEN_WHITE_TILES);
            addDrop(NSE_Blocks.TUFF_TILES);
            addDrop(NSE_Blocks.CRACKED_TUFF_TILES);
            addDrop(NSE_Blocks.MOSSY_TUFF_TILES);
            addDrop(NSE_Blocks.BIG_TUFF_TILES);
            addDrop(NSE_Blocks.TUFF_BRICKS);
            addDrop(NSE_Blocks.CRACKED_TUFF_BRICKS);
            addDrop(NSE_Blocks.MOSSY_TUFF_BRICKS);
            addDrop(NSE_Blocks.INDUSTRIAL_WARNING);
            addDrop(NSE_Blocks.GRAY_WARNING);
            addDrop(NSE_Blocks.RED_WARNING);
            addDrop(NSE_Blocks.ORANGE_WARNING);
            addDrop(NSE_Blocks.YELLOW_WARNING);
            addDrop(NSE_Blocks.LIME_WARNING);
            addDrop(NSE_Blocks.GREEN_WARNING);
            addDrop(NSE_Blocks.CYAN_WARNING);
            addDrop(NSE_Blocks.LIGHT_BLUE_WARNING);
            addDrop(NSE_Blocks.BLUE_WARNING);
            addDrop(NSE_Blocks.PURPLE_WARNING);
            addDrop(NSE_Blocks.MAGENTA_WARNING);
            addDrop(NSE_Blocks.METAL_PLATING);
            addDrop(NSE_Blocks.CRATE);
            addDrop(NSE_Blocks.CONCRETE_WALL);
            addDrop(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS);
            addDrop(NSE_Blocks.CROSS_ACACIA_PLANKS);
            addDrop(NSE_Blocks.HERRINGBONE_OAK_PLANKS);
            addDrop(NSE_Blocks.CROSS_OAK_PLANKS);
            addDrop(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS);
            addDrop(NSE_Blocks.CROSS_BIRCH_PLANKS);
            addDrop(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS);
            addDrop(NSE_Blocks.CROSS_CRIMSON_PLANKS);
            addDrop(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS);
            addDrop(NSE_Blocks.CROSS_DARK_OAK_PLANKS);
            addDrop(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS);
            addDrop(NSE_Blocks.CROSS_JUNGLE_PLANKS);
            addDrop(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS);
            addDrop(NSE_Blocks.CROSS_MANGROVE_PLANKS);
            addDrop(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS);
            addDrop(NSE_Blocks.CROSS_SPRUCE_PLANKS);
            addDrop(NSE_Blocks.HERRINGBONE_PARQUET);
            addDrop(NSE_Blocks.STRAIGHT_PARQUET);
            addDrop(NSE_Blocks.SEPARATED_PARQUET);
            addDrop(NSE_Blocks.GREEN_LINOLEUM);
            addDrop(NSE_Blocks.BLUE_LINOLEUM);
            addDrop(NSE_Blocks.RED_LINOLEUM);
            addDrop(NSE_Blocks.GRAY_LINOLEUM);
            addDrop(NSE_Blocks.ORANGE_LINOLEUM);
            addDrop(NSE_Blocks.BROWN_LINOLEUM);
            addDrop(NSE_Blocks.CYAN_LINOLEUM);
            addDrop(NSE_Blocks.CROSS_ORANGE_LINOLEUM);
            addDrop(NSE_Blocks.CROSS_BROWN_LINOLEUM);
            addDrop(NSE_Blocks.WHITE_CONCRETE);
            addDrop(NSE_Blocks.CRACKED_WHITE_CONCRETE);
            addDrop(NSE_Blocks.BEIGE_CONCRETE);
            addDrop(NSE_Blocks.CRACKED_BEIGE_CONCRETE);
            addDrop(NSE_Blocks.BLUE_CONCRETE);
            addDrop(NSE_Blocks.CRACKED_BLUE_CONCRETE);
            addDrop(NSE_Blocks.RED_CONCRETE);
            addDrop(NSE_Blocks.CRACKED_RED_CONCRETE);
            addDrop(NSE_Blocks.YELLOW_CONCRETE);
            addDrop(NSE_Blocks.CRACKED_YELLOW_CONCRETE);
            addDrop(NSE_Blocks.GREEN_CONCRETE);
            addDrop(NSE_Blocks.CRACKED_GREEN_CONCRETE);
            addDrop(NSE_Blocks.WHITEWASH);
            addDrop(NSE_Blocks.CRACKED_WHITEWASH);
            addDrop(NSE_Blocks.VERY_CRACKED_WHITEWASH);
            addDrop(NSE_Blocks.SMALL_YELLOW_TILES);
            addDrop(NSE_Blocks.SMALL_CRACKED_YELLOW_TILES);
            addDrop(NSE_Blocks.MEAT);
            addDrop(NSE_Blocks.MEAT_EYE);
            addDrop(NSE_Blocks.MEAT_TEETH);
            addDrop(NSE_Blocks.CHISELED_BIRCH_DOOR, doorDrops(NSE_Blocks.CHISELED_BIRCH_DOOR));
            addDrop(NSE_Blocks.CHISELED_MANGROVE_DOOR, doorDrops(NSE_Blocks.CHISELED_MANGROVE_DOOR));;
            addDrop(NSE_Blocks.CHISELED_OAK_DOOR, doorDrops(NSE_Blocks.CHISELED_OAK_DOOR));
            addDrop(NSE_Blocks.CHISELED_SPRUCE_DOOR, doorDrops(NSE_Blocks.CHISELED_SPRUCE_DOOR));;
            addDrop(NSE_Blocks.BEIGE_WALLPAPER);
            addDrop(NSE_Blocks.BROWN_WALLPAPER);
            addDrop(NSE_Blocks.GREEN_WALLPAPER);
            addDrop(NSE_Blocks.HANDRAIL);

            // Drops for furniture/electronics/appliances
            addDrop(NSE_Custom.WHITE_PAWN);
            addDrop(NSE_Custom.WHITE_BISHOP);
            addDrop(NSE_Custom.WHITE_KING);
            addDrop(NSE_Custom.WHITE_KNIGHT);
            addDrop(NSE_Custom.WHITE_QUEEN);
            addDrop(NSE_Custom.WHITE_ROOK);
            addDrop(NSE_Custom.BLACK_KNIGHT);
            addDrop(NSE_Custom.BLACK_PAWN);
            addDrop(NSE_Custom.BLACK_KING);
            addDrop(NSE_Custom.BLACK_QUEEN);
            addDrop(NSE_Custom.BLACK_BISHOP);
            addDrop(NSE_Custom.BLACK_ROOK);

            addDrop(NSE_Custom.TV);
            addDrop(NSE_Custom.RED_TV);
            addDrop(NSE_Custom.BROWN_TV);
            addDrop(NSE_Custom.RADIO_RECEIVER);
            addDrop(NSE_Custom.SIREN);
            addDrop(NSE_Custom.TABLE_LAMP);
            addDrop(NSE_Custom.VINTAGE_LAMP);
            addDrop(NSE_Custom.CEILING_FAN);
            addDrop(NSE_Custom.SWITCH);

            // Generated stairs and slabs drops
            addDrop(NSE_Blocks.SAND_TILES_SLAB);
            addDrop(NSE_Blocks.SAND_TILES_STAIRS);
            addDrop(NSE_Blocks.CRACKED_SAND_TILES_SLAB);
            addDrop(NSE_Blocks.CRACKED_SAND_TILES_STAIRS);
            addDrop(NSE_Blocks.MOSSY_SAND_TILES_SLAB);
            addDrop(NSE_Blocks.MOSSY_SAND_TILES_STAIRS);
            addDrop(NSE_Blocks.HERRINGBONE_SAND_TILES_SLAB);
            addDrop(NSE_Blocks.HERRINGBONE_SAND_TILES_STAIRS);
            addDrop(NSE_Blocks.CROSS_SAND_TILES_SLAB);
            addDrop(NSE_Blocks.CROSS_SAND_TILES_STAIRS);
            addDrop(NSE_Blocks.SAND_BRICKS_SLAB);
            addDrop(NSE_Blocks.SAND_BRICKS_STAIRS);
            addDrop(NSE_Blocks.CRACKED_SAND_BRICKS_SLAB);
            addDrop(NSE_Blocks.CRACKED_SAND_BRICKS_STAIRS);
            addDrop(NSE_Blocks.MOSSY_SAND_BRICKS_SLAB);
            addDrop(NSE_Blocks.MOSSY_SAND_BRICKS_STAIRS);
            addDrop(NSE_Blocks.BIG_SAND_BRICKS_SLAB);
            addDrop(NSE_Blocks.BIG_SAND_BRICKS_STAIRS);
            addDrop(NSE_Blocks.BRICK_TILES_SLAB);
            addDrop(NSE_Blocks.BRICK_TILES_STAIRS);
            addDrop(NSE_Blocks.CRACKED_BRICK_TILES_SLAB);
            addDrop(NSE_Blocks.CRACKED_BRICK_TILES_STAIRS);
            addDrop(NSE_Blocks.MOSSY_BRICK_TILES_SLAB);
            addDrop(NSE_Blocks.MOSSY_BRICK_TILES_STAIRS);
            addDrop(NSE_Blocks.DIRTY_BRICK_TILES_SLAB);
            addDrop(NSE_Blocks.DIRTY_BRICK_TILES_STAIRS);
            addDrop(NSE_Blocks.DARK_BRICK_TILES_SLAB);
            addDrop(NSE_Blocks.DARK_BRICK_TILES_STAIRS);
            addDrop(NSE_Blocks.CRACKED_DARK_BRICK_TILES_SLAB);
            addDrop(NSE_Blocks.CRACKED_DARK_BRICK_TILES_STAIRS);
            addDrop(NSE_Blocks.MOSSY_DARK_BRICK_TILES_SLAB);
            addDrop(NSE_Blocks.MOSSY_DARK_BRICK_TILES_STAIRS);
            addDrop(NSE_Blocks.DIRTY_DARK_BRICK_TILES_SLAB);
            addDrop(NSE_Blocks.DIRTY_DARK_BRICK_TILES_STAIRS);
            addDrop(NSE_Blocks.RED_BRICKS_SLAB);
            addDrop(NSE_Blocks.RED_BRICKS_STAIRS);
            addDrop(NSE_Blocks.CRACKED_RED_BRICKS_SLAB);
            addDrop(NSE_Blocks.CRACKED_RED_BRICKS_STAIRS);
            addDrop(NSE_Blocks.MOSSY_RED_BRICKS_SLAB);
            addDrop(NSE_Blocks.MOSSY_RED_BRICKS_STAIRS);
            addDrop(NSE_Blocks.TEAL_TILES_SLAB);
            addDrop(NSE_Blocks.TEAL_TILES_STAIRS);
            addDrop(NSE_Blocks.CRACKED_TEAL_TILES_SLAB);
            addDrop(NSE_Blocks.CRACKED_TEAL_TILES_STAIRS);
            addDrop(NSE_Blocks.MOSSY_TEAL_TILES_SLAB);
            addDrop(NSE_Blocks.MOSSY_TEAL_TILES_STAIRS);
            addDrop(NSE_Blocks.VARIATED_TEAL_TILES_SLAB);
            addDrop(NSE_Blocks.VARIATED_TEAL_TILES_STAIRS);
            addDrop(NSE_Blocks.GREEN_BRICKS_SLAB);
            addDrop(NSE_Blocks.GREEN_BRICKS_STAIRS);
            addDrop(NSE_Blocks.CRACKED_GREEN_BRICKS_SLAB);
            addDrop(NSE_Blocks.CRACKED_GREEN_BRICKS_STAIRS);
            addDrop(NSE_Blocks.MOSSY_GREEN_BRICKS_SLAB);
            addDrop(NSE_Blocks.MOSSY_GREEN_BRICKS_STAIRS);
            addDrop(NSE_Blocks.GREEN_BRICKS_2_SLAB);
            addDrop(NSE_Blocks.GREEN_BRICKS_2_STAIRS);
            addDrop(NSE_Blocks.CRACKED_GREEN_BRICKS_2_SLAB);
            addDrop(NSE_Blocks.CRACKED_GREEN_BRICKS_2_STAIRS);
            addDrop(NSE_Blocks.MOSSY_GREEN_BRICKS_2_SLAB);
            addDrop(NSE_Blocks.MOSSY_GREEN_BRICKS_2_STAIRS);
            addDrop(NSE_Blocks.AQUAMARINE_TILES_SLAB);
            addDrop(NSE_Blocks.AQUAMARINE_TILES_STAIRS);
            addDrop(NSE_Blocks.CRACKED_AQUAMARINE_TILES_SLAB);
            addDrop(NSE_Blocks.CRACKED_AQUAMARINE_TILES_STAIRS);
            addDrop(NSE_Blocks.MOSSY_AQUAMARINE_TILES_SLAB);
            addDrop(NSE_Blocks.MOSSY_AQUAMARINE_TILES_STAIRS);
            addDrop(NSE_Blocks.DIRTY_AQUAMARINE_TILES_SLAB);
            addDrop(NSE_Blocks.DIRTY_AQUAMARINE_TILES_STAIRS);
            addDrop(NSE_Blocks.DIORITE_BRICKS_SLAB);
            addDrop(NSE_Blocks.DIORITE_BRICKS_STAIRS);
            addDrop(NSE_Blocks.CRACKED_DIORITE_BRICKS_SLAB);
            addDrop(NSE_Blocks.CRACKED_DIORITE_BRICKS_STAIRS);
            addDrop(NSE_Blocks.MOSSY_DIORITE_BRICKS_SLAB);
            addDrop(NSE_Blocks.MOSSY_DIORITE_BRICKS_STAIRS);
            addDrop(NSE_Blocks.CALCITE_TILES_SLAB);
            addDrop(NSE_Blocks.CALCITE_TILES_STAIRS);
            addDrop(NSE_Blocks.CRACKED_CALCITE_TILES_SLAB);
            addDrop(NSE_Blocks.CRACKED_CALCITE_TILES_STAIRS);
            addDrop(NSE_Blocks.MOSSY_CALCITE_TILES_SLAB);
            addDrop(NSE_Blocks.MOSSY_CALCITE_TILES_STAIRS);
            addDrop(NSE_Blocks.DRIPSTONE_TILES_SLAB);
            addDrop(NSE_Blocks.DRIPSTONE_TILES_STAIRS);
            addDrop(NSE_Blocks.CRACKED_DRIPSTONE_TILES_SLAB);
            addDrop(NSE_Blocks.CRACKED_DRIPSTONE_TILES_STAIRS);
            addDrop(NSE_Blocks.MOSSY_DRIPSTONE_TILES_SLAB);
            addDrop(NSE_Blocks.MOSSY_DRIPSTONE_TILES_STAIRS);
            addDrop(NSE_Blocks.DEEPSLATE_TILES_SLAB);
            addDrop(NSE_Blocks.DEEPSLATE_TILES_STAIRS);
            addDrop(NSE_Blocks.CRACKED_DEEPSLATE_TILES_SLAB);
            addDrop(NSE_Blocks.CRACKED_DEEPSLATE_TILES_STAIRS);
            addDrop(NSE_Blocks.MOSSY_DEEPSLATE_TILES_SLAB);
            addDrop(NSE_Blocks.MOSSY_DEEPSLATE_TILES_STAIRS);
            addDrop(NSE_Blocks.LIGHT_BLUE_TILES_SLAB);
            addDrop(NSE_Blocks.LIGHT_BLUE_TILES_STAIRS);
            addDrop(NSE_Blocks.CRACKED_LIGHT_BLUE_TILES_SLAB);
            addDrop(NSE_Blocks.CRACKED_LIGHT_BLUE_TILES_STAIRS);
            addDrop(NSE_Blocks.MOSSY_LIGHT_BLUE_TILES_SLAB);
            addDrop(NSE_Blocks.MOSSY_LIGHT_BLUE_TILES_STAIRS);
            addDrop(NSE_Blocks.VARIATED_LIGHT_BLUE_TILES_SLAB);
            addDrop(NSE_Blocks.VARIATED_LIGHT_BLUE_TILES_STAIRS);
            addDrop(NSE_Blocks.LIGHT_BLUE_BRICKS_SLAB);
            addDrop(NSE_Blocks.LIGHT_BLUE_BRICKS_STAIRS);
            addDrop(NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS_SLAB);
            addDrop(NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS_STAIRS);
            addDrop(NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS_SLAB);
            addDrop(NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS_STAIRS);
            addDrop(NSE_Blocks.GREEN_WHITE_TILES_SLAB);
            addDrop(NSE_Blocks.GREEN_WHITE_TILES_STAIRS);
            addDrop(NSE_Blocks.CRACKED_GREEN_WHITE_TILES_SLAB);
            addDrop(NSE_Blocks.CRACKED_GREEN_WHITE_TILES_STAIRS);
            addDrop(NSE_Blocks.MOSSY_GREEN_WHITE_TILES_SLAB);
            addDrop(NSE_Blocks.MOSSY_GREEN_WHITE_TILES_STAIRS);
            addDrop(NSE_Blocks.TUFF_TILES_SLAB);
            addDrop(NSE_Blocks.TUFF_TILES_STAIRS);
            addDrop(NSE_Blocks.CRACKED_TUFF_TILES_SLAB);
            addDrop(NSE_Blocks.CRACKED_TUFF_TILES_STAIRS);
            addDrop(NSE_Blocks.MOSSY_TUFF_TILES_SLAB);
            addDrop(NSE_Blocks.MOSSY_TUFF_TILES_STAIRS);
            addDrop(NSE_Blocks.TUFF_BRICKS_SLAB);
            addDrop(NSE_Blocks.TUFF_BRICKS_STAIRS);
            addDrop(NSE_Blocks.CRACKED_TUFF_BRICKS_SLAB);
            addDrop(NSE_Blocks.CRACKED_TUFF_BRICKS_STAIRS);
            addDrop(NSE_Blocks.MOSSY_TUFF_BRICKS_SLAB);
            addDrop(NSE_Blocks.MOSSY_TUFF_BRICKS_STAIRS);
            addDrop(NSE_Blocks.WHITE_CONCRETE_SLAB);
            addDrop(NSE_Blocks.WHITE_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.CRACKED_WHITE_CONCRETE_SLAB);
            addDrop(NSE_Blocks.CRACKED_WHITE_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.BEIGE_CONCRETE_SLAB);
            addDrop(NSE_Blocks.BEIGE_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.CRACKED_BEIGE_CONCRETE_SLAB);
            addDrop(NSE_Blocks.CRACKED_BEIGE_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.BLUE_CONCRETE_SLAB);
            addDrop(NSE_Blocks.BLUE_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.CRACKED_BLUE_CONCRETE_SLAB);
            addDrop(NSE_Blocks.CRACKED_BLUE_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.RED_CONCRETE_SLAB);
            addDrop(NSE_Blocks.RED_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.CRACKED_RED_CONCRETE_SLAB);
            addDrop(NSE_Blocks.CRACKED_RED_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.YELLOW_CONCRETE_SLAB);
            addDrop(NSE_Blocks.YELLOW_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.CRACKED_YELLOW_CONCRETE_SLAB);
            addDrop(NSE_Blocks.CRACKED_YELLOW_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.GREEN_CONCRETE_SLAB);
            addDrop(NSE_Blocks.GREEN_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.CRACKED_GREEN_CONCRETE_SLAB);
            addDrop(NSE_Blocks.CRACKED_GREEN_CONCRETE_STAIRS);
            addDrop(NSE_Blocks.NII_FLOOR_SLAB);
            addDrop(NSE_Blocks.NII_FLOOR_STAIRS);
            addDrop(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS_SLAB);
            addDrop(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS_STAIRS);
            addDrop(NSE_Blocks.CROSS_ACACIA_PLANKS_SLAB);
            addDrop(NSE_Blocks.CROSS_ACACIA_PLANKS_STAIRS);
            addDrop(NSE_Blocks.HERRINGBONE_OAK_PLANKS_SLAB);
            addDrop(NSE_Blocks.HERRINGBONE_OAK_PLANKS_STAIRS);
            addDrop(NSE_Blocks.CROSS_OAK_PLANKS_SLAB);
            addDrop(NSE_Blocks.CROSS_OAK_PLANKS_STAIRS);
            addDrop(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS_SLAB);
            addDrop(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS_STAIRS);
            addDrop(NSE_Blocks.CROSS_BIRCH_PLANKS_SLAB);
            addDrop(NSE_Blocks.CROSS_BIRCH_PLANKS_STAIRS);
            addDrop(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS_SLAB);
            addDrop(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS_STAIRS);
            addDrop(NSE_Blocks.CROSS_CRIMSON_PLANKS_SLAB);
            addDrop(NSE_Blocks.CROSS_CRIMSON_PLANKS_STAIRS);
            addDrop(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS_SLAB);
            addDrop(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS_STAIRS);
            addDrop(NSE_Blocks.CROSS_DARK_OAK_PLANKS_SLAB);
            addDrop(NSE_Blocks.CROSS_DARK_OAK_PLANKS_STAIRS);
            addDrop(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS_SLAB);
            addDrop(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS_STAIRS);
            addDrop(NSE_Blocks.CROSS_JUNGLE_PLANKS_SLAB);
            addDrop(NSE_Blocks.CROSS_JUNGLE_PLANKS_STAIRS);
            addDrop(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS_SLAB);
            addDrop(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS_STAIRS);
            addDrop(NSE_Blocks.CROSS_MANGROVE_PLANKS_SLAB);
            addDrop(NSE_Blocks.CROSS_MANGROVE_PLANKS_STAIRS);
            addDrop(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS_SLAB);
            addDrop(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS_STAIRS);
            addDrop(NSE_Blocks.CROSS_SPRUCE_PLANKS_SLAB);
            addDrop(NSE_Blocks.CROSS_SPRUCE_PLANKS_STAIRS);
            addDrop(NSE_Blocks.HERRINGBONE_PARQUET_SLAB);
            addDrop(NSE_Blocks.HERRINGBONE_PARQUET_STAIRS);
            addDrop(NSE_Blocks.STRAIGHT_PARQUET_SLAB);
            addDrop(NSE_Blocks.STRAIGHT_PARQUET_STAIRS);
            addDrop(NSE_Blocks.SEPARATED_PARQUET_SLAB);
            addDrop(NSE_Blocks.SEPARATED_PARQUET_STAIRS);
            addDrop(NSE_Blocks.GREEN_LINOLEUM_SLAB);
            addDrop(NSE_Blocks.GREEN_LINOLEUM_STAIRS);
            addDrop(NSE_Blocks.BLUE_LINOLEUM_SLAB);
            addDrop(NSE_Blocks.BLUE_LINOLEUM_STAIRS);
            addDrop(NSE_Blocks.RED_LINOLEUM_SLAB);
            addDrop(NSE_Blocks.RED_LINOLEUM_STAIRS);
            addDrop(NSE_Blocks.GRAY_LINOLEUM_SLAB);
            addDrop(NSE_Blocks.GRAY_LINOLEUM_STAIRS);
            addDrop(NSE_Blocks.ORANGE_LINOLEUM_SLAB);
            addDrop(NSE_Blocks.ORANGE_LINOLEUM_STAIRS);
            addDrop(NSE_Blocks.BROWN_LINOLEUM_SLAB);
            addDrop(NSE_Blocks.BROWN_LINOLEUM_STAIRS);
            addDrop(NSE_Blocks.CYAN_LINOLEUM_SLAB);
            addDrop(NSE_Blocks.CYAN_LINOLEUM_STAIRS);
            addDrop(NSE_Blocks.METAL_PLATING_SLAB);
            addDrop(NSE_Blocks.METAL_PLATING_STAIRS);
        }
    }

    private static class BlockTagGenerator extends FabricTagProvider.BlockTagProvider {

        public BlockTagGenerator(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> completableFuture) {
            super(output, completableFuture);
        }

        @Override
        protected void configure(RegistryWrapper.WrapperLookup arg) {
            // Blocks mined with a pickaxe
            getOrCreateTagBuilder(BlockTags.PICKAXE_MINEABLE)
                    .add(NSE_Blocks.SAND_TILES)
                    .add(NSE_Blocks.HANDRAIL)
                    .add(NSE_Blocks.NII_FLOOR)
                    .add(NSE_Blocks.BIG_GREEN_TILES)
                    .add(NSE_Blocks.BIG_GREEN_TILES_CRACKED)
                    .add(NSE_Blocks.GREEN_BRICKS)
                    .add(NSE_Blocks.CRACKED_GREEN_BRICKS)
                    .add(NSE_Blocks.MOSSY_GREEN_BRICKS)
                    .add(NSE_Blocks.GREEN_BRICKS_2)
                    .add(NSE_Blocks.CRACKED_GREEN_BRICKS_2)
                    .add(NSE_Blocks.MOSSY_GREEN_BRICKS_2)
                    .add(NSE_Blocks.CRACKED_SAND_TILES)
                    .add(NSE_Blocks.MOSSY_SAND_TILES)
                    .add(NSE_Blocks.SMALL_SAND_TILES)
                    .add(NSE_Blocks.SMALL_CRACKED_SAND_TILES)
                    .add(NSE_Blocks.HERRINGBONE_SAND_TILES)
                    .add(NSE_Blocks.CROSS_SAND_TILES)
                    .add(NSE_Blocks.BIG_SAND_TILES)
                    .add(NSE_Blocks.SAND_BRICKS)
                    .add(NSE_Blocks.CRACKED_SAND_BRICKS)
                    .add(NSE_Blocks.MOSSY_SAND_BRICKS)
                    .add(NSE_Blocks.BIG_SAND_BRICKS)
                    .add(NSE_Blocks.BRICK_TILES)
                    .add(NSE_Blocks.CRACKED_BRICK_TILES)
                    .add(NSE_Blocks.MOSSY_BRICK_TILES)
                    .add(NSE_Blocks.DIRTY_BRICK_TILES)
                    .add(NSE_Blocks.DARK_BRICK_TILES)
                    .add(NSE_Blocks.CRACKED_DARK_BRICK_TILES)
                    .add(NSE_Blocks.MOSSY_DARK_BRICK_TILES)
                    .add(NSE_Blocks.DIRTY_DARK_BRICK_TILES)
                    .add(NSE_Blocks.GLAZED_BRICK_TILES)
                    .add(NSE_Blocks.CRACKED_GLAZED_BRICK_TILES)
                    .add(NSE_Blocks.RED_BRICKS)
                    .add(NSE_Blocks.CRACKED_RED_BRICKS)
                    .add(NSE_Blocks.MOSSY_RED_BRICKS)
                    .add(NSE_Blocks.TEAL_TILES)
                    .add(NSE_Blocks.CRACKED_TEAL_TILES)
                    .add(NSE_Blocks.MOSSY_TEAL_TILES)
                    .add(NSE_Blocks.SMALL_TEAL_TILES)
                    .add(NSE_Blocks.SMALL_CRACKED_TEAL_TILES)
                    .add(NSE_Blocks.GLAZED_TEAL_TILES)
                    .add(NSE_Blocks.CRACKED_GLAZED_TEAL_TILES)
                    .add(NSE_Blocks.VARIATED_TEAL_TILES)
                    .add(NSE_Blocks.AQUAMARINE_TILES)
                    .add(NSE_Blocks.CRACKED_AQUAMARINE_TILES)
                    .add(NSE_Blocks.MOSSY_AQUAMARINE_TILES)
                    .add(NSE_Blocks.DIRTY_AQUAMARINE_TILES)
                    .add(NSE_Blocks.SMALL_AQUAMARINE_TILES)
                    .add(NSE_Blocks.SMALL_CRACKED_AQUAMARINE_TILES)
                    .add(NSE_Blocks.GLAZED_AQUAMARINE_TILES)
                    .add(NSE_Blocks.CRACKED_GLAZED_AQUAMARINE_TILES)
                    .add(NSE_Blocks.SMALL_DIORITE_TILES)
                    .add(NSE_Blocks.SMALL_CRACKED_DIORITE_TILES)
                    .add(NSE_Blocks.BIG_DIORITE_TILES)
                    .add(NSE_Blocks.DIORITE_BRICKS)
                    .add(NSE_Blocks.CRACKED_DIORITE_BRICKS)
                    .add(NSE_Blocks.MOSSY_DIORITE_BRICKS)
                    .add(NSE_Blocks.CALCITE_TILES)
                    .add(NSE_Blocks.CRACKED_CALCITE_TILES)
                    .add(NSE_Blocks.MOSSY_CALCITE_TILES)
                    .add(NSE_Blocks.DIAGONAL_CALCITE_TILES)
                    .add(NSE_Blocks.NII_WALL_1)
                    .add(NSE_Blocks.CRACKED_NII_WALL_1)
                    .add(NSE_Blocks.NII_WALL_2)
                    .add(NSE_Blocks.NII_WALL_3)
                    .add(NSE_Blocks.DRIPSTONE_TILES)
                    .add(NSE_Blocks.CRACKED_DRIPSTONE_TILES)
                    .add(NSE_Blocks.MOSSY_DRIPSTONE_TILES)
                    .add(NSE_Blocks.DRIPSTONE_BRICKS)
                    .add(NSE_Blocks.DEEPSLATE_TILES)
                    .add(NSE_Blocks.CRACKED_DEEPSLATE_TILES)
                    .add(NSE_Blocks.MOSSY_DEEPSLATE_TILES)
                    .add(NSE_Blocks.SMALL_DEEPSLATE_TILES)
                    .add(NSE_Blocks.SMALL_CRACKED_DEEPSLATE_TILES)
                    .add(NSE_Blocks.DIAGONAL_DEEPSLATE_TILES)
                    .add(NSE_Blocks.LIGHT_BLUE_TILES)
                    .add(NSE_Blocks.CRACKED_LIGHT_BLUE_TILES)
                    .add(NSE_Blocks.VARIATED_LIGHT_BLUE_TILES)
                    .add(NSE_Blocks.MOSSY_LIGHT_BLUE_TILES)
                    .add(NSE_Blocks.SMALL_LIGHT_BLUE_TILES)
                    .add(NSE_Blocks.SMALL_CRACKED_LIGHT_BLUE_TILES)
                    .add(NSE_Blocks.GLAZED_LIGHT_BLUE_TILES)
                    .add(NSE_Blocks.CRACKED_GLAZED_LIGHT_BLUE_TILES)
                    .add(NSE_Blocks.LIGHT_BLUE_BRICKS)
                    .add(NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS)
                    .add(NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS)
                    .add(NSE_Blocks.BIG_GRANITE_TILES)
                    .add(NSE_Blocks.SMALL_GRANITE_TILES)
                    .add(NSE_Blocks.SMALL_CRACKED_GRANITE_TILES)
                    .add(NSE_Blocks.GREEN_WHITE_TILES)
                    .add(NSE_Blocks.CRACKED_GREEN_WHITE_TILES)
                    .add(NSE_Blocks.MOSSY_GREEN_WHITE_TILES)
                    .add(NSE_Blocks.TUFF_TILES)
                    .add(NSE_Blocks.CRACKED_TUFF_TILES)
                    .add(NSE_Blocks.MOSSY_TUFF_TILES)
                    .add(NSE_Blocks.BIG_TUFF_TILES)
                    .add(NSE_Blocks.TUFF_BRICKS)
                    .add(NSE_Blocks.CRACKED_TUFF_BRICKS)
                    .add(NSE_Blocks.MOSSY_TUFF_BRICKS)
                    .add(NSE_Blocks.INDUSTRIAL_WARNING)
                    .add(NSE_Blocks.GRAY_WARNING)
                    .add(NSE_Blocks.RED_WARNING)
                    .add(NSE_Blocks.ORANGE_WARNING)
                    .add(NSE_Blocks.YELLOW_WARNING)
                    .add(NSE_Blocks.LIME_WARNING)
                    .add(NSE_Blocks.GREEN_WARNING)
                    .add(NSE_Blocks.CYAN_WARNING)
                    .add(NSE_Blocks.LIGHT_BLUE_WARNING)
                    .add(NSE_Blocks.BLUE_WARNING)
                    .add(NSE_Blocks.PURPLE_WARNING)
                    .add(NSE_Blocks.MAGENTA_WARNING)
                    .add(NSE_Blocks.METAL_PLATING)
                    .add(NSE_Blocks.CONCRETE_WALL)
                    .add(NSE_Blocks.SMALL_YELLOW_TILES)
                    .add(NSE_Blocks.SMALL_CRACKED_YELLOW_TILES)
                    .add(NSE_Blocks.SAND_TILES_STAIRS)
                    .add(NSE_Blocks.SAND_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_SAND_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_SAND_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_SAND_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_SAND_TILES_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_SAND_TILES_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_SAND_TILES_SLAB)
                    .add(NSE_Blocks.CROSS_SAND_TILES_STAIRS)
                    .add(NSE_Blocks.CROSS_SAND_TILES_SLAB)
                    .add(NSE_Blocks.SAND_BRICKS_STAIRS)
                    .add(NSE_Blocks.SAND_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_SAND_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_SAND_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_SAND_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_SAND_BRICKS_SLAB)
                    .add(NSE_Blocks.BIG_SAND_BRICKS_STAIRS)
                    .add(NSE_Blocks.BIG_SAND_BRICKS_SLAB)
                    .add(NSE_Blocks.BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.BRICK_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.DIRTY_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.DIRTY_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.DARK_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.DARK_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_DARK_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_DARK_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_DARK_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_DARK_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.DIRTY_DARK_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.DIRTY_DARK_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.RED_BRICKS_STAIRS)
                    .add(NSE_Blocks.RED_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_RED_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_RED_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_RED_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_RED_BRICKS_SLAB)
                    .add(NSE_Blocks.TEAL_TILES_STAIRS)
                    .add(NSE_Blocks.TEAL_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_TEAL_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_TEAL_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_TEAL_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_TEAL_TILES_SLAB)
                    .add(NSE_Blocks.VARIATED_TEAL_TILES_STAIRS)
                    .add(NSE_Blocks.VARIATED_TEAL_TILES_SLAB)
                    .add(NSE_Blocks.GREEN_BRICKS_STAIRS)
                    .add(NSE_Blocks.GREEN_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_GREEN_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_GREEN_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_GREEN_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_GREEN_BRICKS_SLAB)
                    .add(NSE_Blocks.GREEN_BRICKS_2_STAIRS)
                    .add(NSE_Blocks.GREEN_BRICKS_2_SLAB)
                    .add(NSE_Blocks.CRACKED_GREEN_BRICKS_2_STAIRS)
                    .add(NSE_Blocks.CRACKED_GREEN_BRICKS_2_SLAB)
                    .add(NSE_Blocks.MOSSY_GREEN_BRICKS_2_STAIRS)
                    .add(NSE_Blocks.MOSSY_GREEN_BRICKS_2_SLAB)
                    .add(NSE_Blocks.AQUAMARINE_TILES_STAIRS)
                    .add(NSE_Blocks.AQUAMARINE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_AQUAMARINE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_AQUAMARINE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_AQUAMARINE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_AQUAMARINE_TILES_SLAB)
                    .add(NSE_Blocks.DIRTY_AQUAMARINE_TILES_STAIRS)
                    .add(NSE_Blocks.DIRTY_AQUAMARINE_TILES_SLAB)
                    .add(NSE_Blocks.DIORITE_BRICKS_STAIRS)
                    .add(NSE_Blocks.DIORITE_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_DIORITE_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_DIORITE_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_DIORITE_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_DIORITE_BRICKS_SLAB)
                    .add(NSE_Blocks.CALCITE_TILES_STAIRS)
                    .add(NSE_Blocks.CALCITE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_CALCITE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_CALCITE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_CALCITE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_CALCITE_TILES_SLAB)
                    .add(NSE_Blocks.DRIPSTONE_TILES_STAIRS)
                    .add(NSE_Blocks.DRIPSTONE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_DRIPSTONE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_DRIPSTONE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_DRIPSTONE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_DRIPSTONE_TILES_SLAB)
                    .add(NSE_Blocks.DEEPSLATE_TILES_STAIRS)
                    .add(NSE_Blocks.DEEPSLATE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_DEEPSLATE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_DEEPSLATE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_DEEPSLATE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_DEEPSLATE_TILES_SLAB)
                    .add(NSE_Blocks.LIGHT_BLUE_TILES_STAIRS)
                    .add(NSE_Blocks.LIGHT_BLUE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_LIGHT_BLUE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_LIGHT_BLUE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_LIGHT_BLUE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_LIGHT_BLUE_TILES_SLAB)
                    .add(NSE_Blocks.VARIATED_LIGHT_BLUE_TILES_STAIRS)
                    .add(NSE_Blocks.VARIATED_LIGHT_BLUE_TILES_SLAB)
                    .add(NSE_Blocks.LIGHT_BLUE_BRICKS_STAIRS)
                    .add(NSE_Blocks.LIGHT_BLUE_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS_SLAB)
                    .add(NSE_Blocks.GREEN_WHITE_TILES_STAIRS)
                    .add(NSE_Blocks.GREEN_WHITE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_GREEN_WHITE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_GREEN_WHITE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_GREEN_WHITE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_GREEN_WHITE_TILES_SLAB)
                    .add(NSE_Blocks.TUFF_TILES_STAIRS)
                    .add(NSE_Blocks.TUFF_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_TUFF_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_TUFF_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_TUFF_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_TUFF_TILES_SLAB)
                    .add(NSE_Blocks.TUFF_BRICKS_STAIRS)
                    .add(NSE_Blocks.TUFF_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_TUFF_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_TUFF_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_TUFF_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_TUFF_BRICKS_SLAB)
                    .add(NSE_Blocks.WHITE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.WHITE_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_WHITE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_WHITE_CONCRETE_SLAB)
                    .add(NSE_Blocks.BEIGE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.BEIGE_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_BEIGE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_BEIGE_CONCRETE_SLAB)
                    .add(NSE_Blocks.BLUE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.BLUE_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_BLUE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_BLUE_CONCRETE_SLAB)
                    .add(NSE_Blocks.RED_CONCRETE_STAIRS)
                    .add(NSE_Blocks.RED_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_RED_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_RED_CONCRETE_SLAB)
                    .add(NSE_Blocks.YELLOW_CONCRETE_STAIRS)
                    .add(NSE_Blocks.YELLOW_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_YELLOW_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_YELLOW_CONCRETE_SLAB)
                    .add(NSE_Blocks.GREEN_CONCRETE_STAIRS)
                    .add(NSE_Blocks.GREEN_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_GREEN_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_GREEN_CONCRETE_SLAB)
                    .add(NSE_Blocks.NII_FLOOR_STAIRS)
                    .add(NSE_Blocks.NII_FLOOR_SLAB)
                    .add(NSE_Blocks.METAL_PLATING_STAIRS)
                    .add(NSE_Blocks.METAL_PLATING_SLAB)
                    .add(NSE_Custom.VINTAGE_LAMP)
                    .add(NSE_Custom.LIGHT_BULB_LAMP);

            // Blocks mined with an axe
            getOrCreateTagBuilder(BlockTags.AXE_MINEABLE)
                    .add(NSE_Blocks.CRATE)
                    .add(NSE_Blocks.CONCRETE_WALL)
                    .add(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS)
                    .add(NSE_Blocks.CROSS_ACACIA_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_OAK_PLANKS)
                    .add(NSE_Blocks.CROSS_OAK_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS)
                    .add(NSE_Blocks.CROSS_BIRCH_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS)
                    .add(NSE_Blocks.CROSS_CRIMSON_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS)
                    .add(NSE_Blocks.CROSS_DARK_OAK_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS)
                    .add(NSE_Blocks.CROSS_JUNGLE_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS)
                    .add(NSE_Blocks.CROSS_MANGROVE_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS)
                    .add(NSE_Blocks.CROSS_SPRUCE_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_PARQUET)
                    .add(NSE_Blocks.STRAIGHT_PARQUET)
                    .add(NSE_Blocks.SEPARATED_PARQUET)
                    .add(NSE_Blocks.GREEN_LINOLEUM)
                    .add(NSE_Blocks.BLUE_LINOLEUM)
                    .add(NSE_Blocks.RED_LINOLEUM)
                    .add(NSE_Blocks.GRAY_LINOLEUM)
                    .add(NSE_Blocks.ORANGE_LINOLEUM)
                    .add(NSE_Blocks.BROWN_LINOLEUM)
                    .add(NSE_Blocks.CYAN_LINOLEUM)
                    .add(NSE_Blocks.CROSS_ORANGE_LINOLEUM)
                    .add(NSE_Blocks.CROSS_BROWN_LINOLEUM)
                    .add(NSE_Blocks.CHISELED_BIRCH_DOOR)
                    .add(NSE_Blocks.CHISELED_MANGROVE_DOOR)
                    .add(NSE_Blocks.CHISELED_OAK_DOOR)
                    .add(NSE_Blocks.CHISELED_SPRUCE_DOOR)
                    .add(NSE_Blocks.GREEN_WALLPAPER)
                    .add(NSE_Blocks.BROWN_WALLPAPER)
                    .add(NSE_Blocks.BEIGE_WALLPAPER)
                    .add(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_ACACIA_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_ACACIA_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_BIRCH_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_BIRCH_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_CRIMSON_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_CRIMSON_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_DARK_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_DARK_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_JUNGLE_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_JUNGLE_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_MANGROVE_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_MANGROVE_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_SPRUCE_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_SPRUCE_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_PARQUET_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_PARQUET_SLAB)
                    .add(NSE_Blocks.STRAIGHT_PARQUET_STAIRS)
                    .add(NSE_Blocks.STRAIGHT_PARQUET_SLAB)
                    .add(NSE_Blocks.SEPARATED_PARQUET_STAIRS)
                    .add(NSE_Blocks.SEPARATED_PARQUET_SLAB)
                    .add(NSE_Blocks.GREEN_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.GREEN_LINOLEUM_SLAB)
                    .add(NSE_Blocks.BLUE_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.BLUE_LINOLEUM_SLAB)
                    .add(NSE_Blocks.RED_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.RED_LINOLEUM_SLAB)
                    .add(NSE_Blocks.GRAY_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.GRAY_LINOLEUM_SLAB)
                    .add(NSE_Blocks.ORANGE_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.ORANGE_LINOLEUM_SLAB)
                    .add(NSE_Blocks.BROWN_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.BROWN_LINOLEUM_SLAB)
                    .add(NSE_Blocks.CYAN_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.CYAN_LINOLEUM_SLAB)
                    .add(NSE_Custom.TABLE_LAMP);

            getOrCreateTagBuilder(NSE_Tags.Blocks.RAKE_MINEABLE)
                    .add(NSE_Blocks.MEAT)
                    .add(NSE_Blocks.MEAT_EYE)
                    .add(NSE_Blocks.MEAT_TEETH)
                    .add(NSE_Blocks.PURPLE_GOO);

            getOrCreateTagBuilder(BlockTags.DOORS)
                    .add(NSE_Blocks.CHISELED_BIRCH_DOOR)
                    .add(NSE_Blocks.CHISELED_OAK_DOOR)
                    .add(NSE_Blocks.CHISELED_MANGROVE_DOOR)
                    .add(NSE_Blocks.CHISELED_SPRUCE_DOOR);

            getOrCreateTagBuilder(BlockTags.WOODEN_DOORS)
                    .add(NSE_Blocks.CHISELED_BIRCH_DOOR)
                    .add(NSE_Blocks.CHISELED_OAK_DOOR)
                    .add(NSE_Blocks.CHISELED_MANGROVE_DOOR)
                    .add(NSE_Blocks.CHISELED_SPRUCE_DOOR);

            getOrCreateTagBuilder(BlockTags.WALLS).add(NSE_Blocks.CONCRETE_WALL);

            getOrCreateTagBuilder(BlockTags.PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS)
                    .add(NSE_Blocks.CROSS_ACACIA_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_OAK_PLANKS)
                    .add(NSE_Blocks.CROSS_OAK_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS)
                    .add(NSE_Blocks.CROSS_BIRCH_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS)
                    .add(NSE_Blocks.CROSS_CRIMSON_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS)
                    .add(NSE_Blocks.CROSS_DARK_OAK_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS)
                    .add(NSE_Blocks.CROSS_JUNGLE_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS)
                    .add(NSE_Blocks.CROSS_MANGROVE_PLANKS)
                    .add(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS)
                    .add(NSE_Blocks.CROSS_SPRUCE_PLANKS);

            getOrCreateTagBuilder(BlockTags.STAIRS)
                    .add(NSE_Blocks.SAND_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_SAND_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_SAND_TILES_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_SAND_TILES_STAIRS)
                    .add(NSE_Blocks.CROSS_SAND_TILES_STAIRS)
                    .add(NSE_Blocks.SAND_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_SAND_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_SAND_BRICKS_STAIRS)
                    .add(NSE_Blocks.BIG_SAND_BRICKS_STAIRS)
                    .add(NSE_Blocks.BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.DIRTY_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.DARK_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_DARK_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_DARK_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.DIRTY_DARK_BRICK_TILES_STAIRS)
                    .add(NSE_Blocks.RED_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_RED_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_RED_BRICKS_STAIRS)
                    .add(NSE_Blocks.TEAL_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_TEAL_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_TEAL_TILES_STAIRS)
                    .add(NSE_Blocks.VARIATED_TEAL_TILES_STAIRS)
                    .add(NSE_Blocks.GREEN_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_GREEN_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_GREEN_BRICKS_STAIRS)
                    .add(NSE_Blocks.GREEN_BRICKS_2_STAIRS)
                    .add(NSE_Blocks.CRACKED_GREEN_BRICKS_2_STAIRS)
                    .add(NSE_Blocks.MOSSY_GREEN_BRICKS_2_STAIRS)
                    .add(NSE_Blocks.AQUAMARINE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_AQUAMARINE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_AQUAMARINE_TILES_STAIRS)
                    .add(NSE_Blocks.DIRTY_AQUAMARINE_TILES_STAIRS)
                    .add(NSE_Blocks.DIORITE_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_DIORITE_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_DIORITE_BRICKS_STAIRS)
                    .add(NSE_Blocks.CALCITE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_CALCITE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_CALCITE_TILES_STAIRS)
                    .add(NSE_Blocks.DRIPSTONE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_DRIPSTONE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_DRIPSTONE_TILES_STAIRS)
                    .add(NSE_Blocks.DEEPSLATE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_DEEPSLATE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_DEEPSLATE_TILES_STAIRS)
                    .add(NSE_Blocks.LIGHT_BLUE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_LIGHT_BLUE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_LIGHT_BLUE_TILES_STAIRS)
                    .add(NSE_Blocks.VARIATED_LIGHT_BLUE_TILES_STAIRS)
                    .add(NSE_Blocks.LIGHT_BLUE_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS_STAIRS)
                    .add(NSE_Blocks.GREEN_WHITE_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_GREEN_WHITE_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_GREEN_WHITE_TILES_STAIRS)
                    .add(NSE_Blocks.TUFF_TILES_STAIRS)
                    .add(NSE_Blocks.CRACKED_TUFF_TILES_STAIRS)
                    .add(NSE_Blocks.MOSSY_TUFF_TILES_STAIRS)
                    .add(NSE_Blocks.TUFF_BRICKS_STAIRS)
                    .add(NSE_Blocks.CRACKED_TUFF_BRICKS_STAIRS)
                    .add(NSE_Blocks.MOSSY_TUFF_BRICKS_STAIRS)
                    .add(NSE_Blocks.WHITE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_WHITE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.BEIGE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_BEIGE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.BLUE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_BLUE_CONCRETE_STAIRS)
                    .add(NSE_Blocks.RED_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_RED_CONCRETE_STAIRS)
                    .add(NSE_Blocks.YELLOW_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_YELLOW_CONCRETE_STAIRS)
                    .add(NSE_Blocks.GREEN_CONCRETE_STAIRS)
                    .add(NSE_Blocks.CRACKED_GREEN_CONCRETE_STAIRS)
                    .add(NSE_Blocks.NII_FLOOR_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_ACACIA_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_BIRCH_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_CRIMSON_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_DARK_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_JUNGLE_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_MANGROVE_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_SPRUCE_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_PARQUET_STAIRS)
                    .add(NSE_Blocks.STRAIGHT_PARQUET_STAIRS)
                    .add(NSE_Blocks.SEPARATED_PARQUET_STAIRS)
                    .add(NSE_Blocks.GREEN_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.BLUE_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.RED_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.GRAY_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.ORANGE_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.BROWN_LINOLEUM_STAIRS)
                    .add(NSE_Blocks.CYAN_LINOLEUM_STAIRS);

            getOrCreateTagBuilder(BlockTags.SLABS)
                    .add(NSE_Blocks.SAND_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_SAND_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_SAND_TILES_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_SAND_TILES_SLAB)
                    .add(NSE_Blocks.CROSS_SAND_TILES_SLAB)
                    .add(NSE_Blocks.SAND_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_SAND_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_SAND_BRICKS_SLAB)
                    .add(NSE_Blocks.BIG_SAND_BRICKS_SLAB)
                    .add(NSE_Blocks.BRICK_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.DIRTY_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.DARK_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_DARK_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_DARK_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.DIRTY_DARK_BRICK_TILES_SLAB)
                    .add(NSE_Blocks.RED_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_RED_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_RED_BRICKS_SLAB)
                    .add(NSE_Blocks.TEAL_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_TEAL_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_TEAL_TILES_SLAB)
                    .add(NSE_Blocks.VARIATED_TEAL_TILES_SLAB)
                    .add(NSE_Blocks.GREEN_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_GREEN_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_GREEN_BRICKS_SLAB)
                    .add(NSE_Blocks.GREEN_BRICKS_2_SLAB)
                    .add(NSE_Blocks.CRACKED_GREEN_BRICKS_2_SLAB)
                    .add(NSE_Blocks.MOSSY_GREEN_BRICKS_2_SLAB)
                    .add(NSE_Blocks.AQUAMARINE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_AQUAMARINE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_AQUAMARINE_TILES_SLAB)
                    .add(NSE_Blocks.DIRTY_AQUAMARINE_TILES_SLAB)
                    .add(NSE_Blocks.DIORITE_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_DIORITE_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_DIORITE_BRICKS_SLAB)
                    .add(NSE_Blocks.CALCITE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_CALCITE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_CALCITE_TILES_SLAB)
                    .add(NSE_Blocks.DRIPSTONE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_DRIPSTONE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_DRIPSTONE_TILES_SLAB)
                    .add(NSE_Blocks.DEEPSLATE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_DEEPSLATE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_DEEPSLATE_TILES_SLAB)
                    .add(NSE_Blocks.LIGHT_BLUE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_LIGHT_BLUE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_LIGHT_BLUE_TILES_SLAB)
                    .add(NSE_Blocks.VARIATED_LIGHT_BLUE_TILES_SLAB)
                    .add(NSE_Blocks.LIGHT_BLUE_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS_SLAB)
                    .add(NSE_Blocks.GREEN_WHITE_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_GREEN_WHITE_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_GREEN_WHITE_TILES_SLAB)
                    .add(NSE_Blocks.TUFF_TILES_SLAB)
                    .add(NSE_Blocks.CRACKED_TUFF_TILES_SLAB)
                    .add(NSE_Blocks.MOSSY_TUFF_TILES_SLAB)
                    .add(NSE_Blocks.TUFF_BRICKS_SLAB)
                    .add(NSE_Blocks.CRACKED_TUFF_BRICKS_SLAB)
                    .add(NSE_Blocks.MOSSY_TUFF_BRICKS_SLAB)
                    .add(NSE_Blocks.WHITE_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_WHITE_CONCRETE_SLAB)
                    .add(NSE_Blocks.BEIGE_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_BEIGE_CONCRETE_SLAB)
                    .add(NSE_Blocks.BLUE_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_BLUE_CONCRETE_SLAB)
                    .add(NSE_Blocks.RED_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_RED_CONCRETE_SLAB)
                    .add(NSE_Blocks.YELLOW_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_YELLOW_CONCRETE_SLAB)
                    .add(NSE_Blocks.GREEN_CONCRETE_SLAB)
                    .add(NSE_Blocks.CRACKED_GREEN_CONCRETE_SLAB)
                    .add(NSE_Blocks.NII_FLOOR_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_ACACIA_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_BIRCH_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_CRIMSON_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_DARK_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_JUNGLE_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_MANGROVE_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_SPRUCE_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_PARQUET_SLAB)
                    .add(NSE_Blocks.STRAIGHT_PARQUET_SLAB)
                    .add(NSE_Blocks.SEPARATED_PARQUET_SLAB)
                    .add(NSE_Blocks.GREEN_LINOLEUM_SLAB)
                    .add(NSE_Blocks.BLUE_LINOLEUM_SLAB)
                    .add(NSE_Blocks.RED_LINOLEUM_SLAB)
                    .add(NSE_Blocks.GRAY_LINOLEUM_SLAB)
                    .add(NSE_Blocks.ORANGE_LINOLEUM_SLAB)
                    .add(NSE_Blocks.BROWN_LINOLEUM_SLAB)
                    .add(NSE_Blocks.CYAN_LINOLEUM_SLAB);

            getOrCreateTagBuilder(BlockTags.WOODEN_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_ACACIA_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_BIRCH_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_CRIMSON_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_DARK_OAK_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_JUNGLE_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_MANGROVE_PLANKS_STAIRS)
                    .add(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS_STAIRS)
                    .add(NSE_Blocks.CROSS_SPRUCE_PLANKS_STAIRS);

            getOrCreateTagBuilder(BlockTags.WOODEN_SLABS)
                    .add(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_ACACIA_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_BIRCH_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_CRIMSON_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_DARK_OAK_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_JUNGLE_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_MANGROVE_PLANKS_SLAB)
                    .add(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS_SLAB)
                    .add(NSE_Blocks.CROSS_SPRUCE_PLANKS_SLAB);
        }
    }


    private static class RecipeGenerator extends FabricRecipeProvider {
        private RecipeGenerator(FabricDataOutput generator) {
            super(generator);
        }

        private void mossRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible output, ItemConvertible input) {
            var path = convertBetween(output, input);
            ShapelessRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, output).input(input).input(Items.VINE).criterion(FabricRecipeProvider.hasItem(output),
                    FabricRecipeProvider.conditionsFromItem(output)).criterion(FabricRecipeProvider.hasItem(input),
                    FabricRecipeProvider.conditionsFromItem(output)).criterion(FabricRecipeProvider.hasItem(Items.VINE),
                    FabricRecipeProvider.conditionsFromItem(output)).offerTo(exporter, path + "_vine");

            ShapelessRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, output).input(input).input(Items.MOSS_BLOCK).criterion(FabricRecipeProvider.hasItem(output),
                    FabricRecipeProvider.conditionsFromItem(output)).criterion(FabricRecipeProvider.hasItem(input),
                    FabricRecipeProvider.conditionsFromItem(output)).criterion(FabricRecipeProvider.hasItem(Items.MOSS_BLOCK),
                    FabricRecipeProvider.conditionsFromItem(output)).offerTo(exporter, path + "_moss");
        }

        private void dirtyRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible output, ItemConvertible input) {
            var path = convertBetween(output, input);
            ShapelessRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, output).input(input).input(Items.DIRT).criterion(FabricRecipeProvider.hasItem(output),
                    FabricRecipeProvider.conditionsFromItem(output)).criterion(FabricRecipeProvider.hasItem(input),
                    FabricRecipeProvider.conditionsFromItem(output)).criterion(FabricRecipeProvider.hasItem(Items.DIRT),
                    FabricRecipeProvider.conditionsFromItem(output)).offerTo(exporter, path + "_dirt");

            ShapelessRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, output).input(input).input(Items.GLOW_LICHEN).criterion(FabricRecipeProvider.hasItem(output),
                    FabricRecipeProvider.conditionsFromItem(output)).criterion(FabricRecipeProvider.hasItem(input),
                    FabricRecipeProvider.conditionsFromItem(output)).criterion(FabricRecipeProvider.hasItem(Items.GLOW_LICHEN),
                    FabricRecipeProvider.conditionsFromItem(output)).offerTo(exporter, path + "_lichen");
        }

        private void stoneCuttingCategory(Consumer<RecipeJsonProvider> exporter, List<ItemConvertible> category, RecipeCategory recipe_category) {
            for (int i = 0; i < category.size(); i++) {
                for (int j = 0; j < category.size(); j++) {
                    if (i != j) {
                        offerStonecuttingRecipe(exporter, recipe_category,
                                category.get(i), category.get(j));
                    }
                }
            }
        }

        private void diceRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible dice) {
            var buttons = Util.make(Lists.newArrayList(), list -> {
                list.add(Blocks.OAK_BUTTON);
                list.add(Blocks.BAMBOO_BUTTON);
                list.add(Blocks.BIRCH_BUTTON);
                list.add(Blocks.CHERRY_BUTTON);
                list.add(Blocks.ACACIA_BUTTON);
                list.add(Blocks.CRIMSON_BUTTON);
                list.add(Blocks.DARK_OAK_BUTTON);
                list.add(Blocks.JUNGLE_BUTTON);
                list.add(Blocks.MANGROVE_BUTTON);
                list.add(Blocks.SPRUCE_BUTTON);
                list.add(Blocks.WARPED_BUTTON);
            });
            for (Object button : buttons) {
                offerStonecuttingRecipe(exporter, RecipeCategory.MISC, dice, (ItemConvertible) button);
            }
        }

        private void warningStripeRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible output, ItemConvertible dye) {
            ShapedRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, output, 4)
            .pattern("D#D")
                .pattern("#D#")
                .pattern("D#D")
                .input('D', dye)
                .input('#', Items.IRON_INGOT)
                .criterion(RecipeProvider.hasItem(Items.IRON_INGOT),
                        RecipeProvider.conditionsFromItem(Items.IRON_INGOT))
                .criterion(RecipeProvider.hasItem(dye),
                        RecipeProvider.conditionsFromItem(dye))
            .offerTo(exporter);
        }

        private void crissCrossRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible output, ItemConvertible input1, ItemConvertible input2) {
            ShapedRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, output, 4)
                    .pattern("XY")
                    .pattern("YX")
                    .input('X', input1)
                    .input('Y', input2)
                    .criterion(RecipeProvider.hasItem(input1),
                            RecipeProvider.conditionsFromItem(input1))
                    .criterion(RecipeProvider.hasItem(input2),
                            RecipeProvider.conditionsFromItem(input2))
                    .offerTo(exporter);
        }

        private void tvRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible output, ItemConvertible dye) {
            ShapedRecipeJsonBuilder.create(RecipeCategory.DECORATIONS, output, 1)
                    .pattern("N N")
                    .pattern("DGD")
                    .pattern("DRD")
                    .input('D', dye)
                    .input('N', Items.IRON_NUGGET)
                    .input('R', Items.REDSTONE)
                    .input('G', Items.GLASS_PANE)
                    .criterion(RecipeProvider.hasItem(Items.IRON_NUGGET),
                            RecipeProvider.conditionsFromItem(Items.IRON_NUGGET))
                    .criterion(RecipeProvider.hasItem(Items.GLASS_PANE),
                            RecipeProvider.conditionsFromItem(Items.GLASS_PANE))
                    .criterion(RecipeProvider.hasItem(Items.REDSTONE),
                            RecipeProvider.conditionsFromItem(Items.REDSTONE))
                    .criterion(RecipeProvider.hasItem(dye),
                            RecipeProvider.conditionsFromItem(dye))
                    .offerTo(exporter);
        }

        private void radioRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible output) {
            ShapedRecipeJsonBuilder.create(RecipeCategory.DECORATIONS, output, 1)
                    .pattern("  N")
                    .pattern("MMM")
                    .pattern("III")
                    .input('M', Blocks.NOTE_BLOCK)
                    .input('N', Items.IRON_NUGGET)
                    .input('I', Items.IRON_INGOT)
                    .criterion(RecipeProvider.hasItem(Items.IRON_NUGGET),
                            RecipeProvider.conditionsFromItem(Items.IRON_NUGGET))
                    .criterion(RecipeProvider.hasItem(Items.NOTE_BLOCK),
                            RecipeProvider.conditionsFromItem(Items.NOTE_BLOCK))
                    .criterion(RecipeProvider.hasItem(Items.IRON_INGOT),
                            RecipeProvider.conditionsFromItem(Items.IRON_INGOT))
                    .offerTo(exporter);
        }

        private void ceilingFanRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible output) {
            ShapedRecipeJsonBuilder.create(RecipeCategory.DECORATIONS, output, 1)
                    .pattern(" S ")
                    .pattern("WNW")
                    .input('S', Items.STICK)
                    .input('N', Items.IRON_NUGGET)
                    .input('W', Items.WHITE_WOOL)
                    .criterion(RecipeProvider.hasItem(Items.IRON_NUGGET),
                            RecipeProvider.conditionsFromItem(Items.IRON_NUGGET))
                    .criterion(RecipeProvider.hasItem(Items.STICK),
                            RecipeProvider.conditionsFromItem(Items.STICK))
                    .criterion(RecipeProvider.hasItem(Items.WHITE_WOOL),
                            RecipeProvider.conditionsFromItem(Items.WHITE_WOOL))
                    .offerTo(exporter);
        }

        private void tableLampRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible output) {
            ShapedRecipeJsonBuilder.create(RecipeCategory.DECORATIONS, output, 3)
                    .pattern("WWW")
                    .pattern("WTW")
                    .pattern(" S ")

                    .input('S', Items.STICK)
                    .input('T', Items.TORCH)
                    .input('W', ItemTags.WOOL)
                    .criterion(RecipeProvider.hasItem(Items.TORCH),
                            RecipeProvider.conditionsFromItem(Items.TORCH))
                    .criterion(RecipeProvider.hasItem(Items.STICK),
                            RecipeProvider.conditionsFromItem(Items.STICK))
                    .criterion("has_wool", RecipeProvider.conditionsFromTag(ItemTags.WOOL))
                    .offerTo(exporter);
        }

        private void vintageLampRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible output) {
            ShapedRecipeJsonBuilder.create(RecipeCategory.DECORATIONS, output, 3)
                    .pattern("NNN")
                    .pattern("GTG")
                    .pattern(" N ")

                    .input('N', Items.IRON_NUGGET)
                    .input('T', Items.TORCH)
                    .input('G', Items.GREEN_STAINED_GLASS)
                    .criterion(RecipeProvider.hasItem(Items.TORCH),
                            RecipeProvider.conditionsFromItem(Items.TORCH))
                    .criterion(RecipeProvider.hasItem(Items.IRON_NUGGET),
                            RecipeProvider.conditionsFromItem(Items.IRON_NUGGET))
                    .criterion(RecipeProvider.hasItem(Items.GREEN_STAINED_GLASS),
                            RecipeProvider.conditionsFromItem(Items.GREEN_STAINED_GLASS))
                    .offerTo(exporter);
        }

        private void sickleRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible output) {
            ShapedRecipeJsonBuilder.create(RecipeCategory.DECORATIONS, output, 1)
                    .pattern(" I ")
                    .pattern("  I")
                    .pattern(" S ")
                    .input('S', Items.STICK)
                    .input('I', Items.IRON_INGOT)
                    .criterion(RecipeProvider.hasItem(Items.STICK),
                            RecipeProvider.conditionsFromItem(Items.STICK))
                    .criterion(RecipeProvider.hasItem(Items.IRON_INGOT),
                            RecipeProvider.conditionsFromItem(Items.IRON_INGOT))
                    .offerTo(exporter);
        }

        private void rakeRecipe(Consumer<RecipeJsonProvider> exporter, ItemConvertible output) {
            ShapedRecipeJsonBuilder.create(RecipeCategory.DECORATIONS, output, 1)
                    .pattern("III")
                    .pattern(" N ")
                    .pattern(" S ")
                    .input('S', Items.STICK)
                    .input('I', Items.IRON_INGOT)
                    .input('N', Items.IRON_NUGGET)
                    .criterion(RecipeProvider.hasItem(Items.STICK),
                            RecipeProvider.conditionsFromItem(Items.STICK))
                    .criterion(RecipeProvider.hasItem(Items.IRON_INGOT),
                            RecipeProvider.conditionsFromItem(Items.IRON_INGOT))
                    .criterion(RecipeProvider.hasItem(Items.IRON_NUGGET),
                            RecipeProvider.conditionsFromItem(Items.IRON_NUGGET))
                    .offerTo(exporter);
        }

        private void offerStairsAndSlab(Consumer<RecipeJsonProvider> exporter, ItemConvertible output_stairs, ItemConvertible output_slab, ItemConvertible input) {
            createStairsRecipe(output_stairs, Ingredient.ofItems(input))
                    .criterion(hasItem(input), conditionsFromItem(input)).offerTo(exporter);
            createSlabRecipe(RecipeCategory.BUILDING_BLOCKS, output_slab, Ingredient.ofItems(input))
                    .criterion(hasItem(input), conditionsFromItem(input)).offerTo(exporter);

            offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, output_stairs, input);
            offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, output_slab, input);
        }

        @Override
        public void generate(Consumer<RecipeJsonProvider> exporter) {
            crissCrossRecipe(exporter, NSE_Blocks.SAND_TILES, Blocks.SMOOTH_SANDSTONE, Blocks.SMOOTH_RED_SANDSTONE);
            crissCrossRecipe(exporter, NSE_Blocks.LIGHT_BLUE_TILES, Blocks.STONE, Items.LIGHT_BLUE_DYE);
            crissCrossRecipe(exporter, NSE_Blocks.SMALL_WHITE_TILES, Blocks.STONE, Items.WHITE_DYE);
            crissCrossRecipe(exporter, NSE_Blocks.GREEN_WHITE_TILES, Blocks.POLISHED_DIORITE, Items.GREEN_DYE);

            tvRecipe(exporter, NSE_Custom.TV, Items.ORANGE_DYE);
            tvRecipe(exporter, NSE_Custom.BROWN_TV, Items.BROWN_DYE);
            tvRecipe(exporter, NSE_Custom.RED_TV, Items.RED_DYE);
            radioRecipe(exporter, NSE_Custom.RADIO_RECEIVER);
            ceilingFanRecipe(exporter, NSE_Custom.CEILING_FAN);
            tableLampRecipe(exporter, NSE_Custom.TABLE_LAMP);
            vintageLampRecipe(exporter, NSE_Custom.VINTAGE_LAMP);
            sickleRecipe(exporter, NSE_Items.SICKLE);
            rakeRecipe(exporter, NSE_Items.RAKE);

            // Cracked blocks
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_BRICK_TILES, NSE_Blocks.BRICK_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_GLAZED_BRICK_TILES, NSE_Blocks.GLAZED_BRICK_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_DARK_BRICK_TILES, NSE_Blocks.DARK_BRICK_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_NII_WALL_1, NSE_Blocks.NII_WALL_1);
            offerCrackingRecipe(exporter, NSE_Blocks.SMALL_CRACKED_YELLOW_TILES, NSE_Blocks.SMALL_YELLOW_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_SAND_TILES, NSE_Blocks.SAND_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.SMALL_CRACKED_SAND_TILES, NSE_Blocks.SMALL_SAND_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_SAND_BRICKS, NSE_Blocks.SAND_BRICKS);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_TEAL_TILES, NSE_Blocks.TEAL_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.SMALL_CRACKED_TEAL_TILES, NSE_Blocks.SMALL_TEAL_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_GLAZED_TEAL_TILES, NSE_Blocks.GLAZED_TEAL_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_AQUAMARINE_TILES, NSE_Blocks.AQUAMARINE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.SMALL_CRACKED_AQUAMARINE_TILES, NSE_Blocks.SMALL_AQUAMARINE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_GLAZED_AQUAMARINE_TILES, NSE_Blocks.GLAZED_AQUAMARINE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.SMALL_CRACKED_DIORITE_TILES, NSE_Blocks.SMALL_DIORITE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_DIORITE_BRICKS, NSE_Blocks.DIORITE_BRICKS);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_CALCITE_TILES, NSE_Blocks.CALCITE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_DRIPSTONE_TILES, NSE_Blocks.DRIPSTONE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_DEEPSLATE_TILES, NSE_Blocks.DEEPSLATE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.SMALL_CRACKED_DEEPSLATE_TILES, NSE_Blocks.SMALL_DEEPSLATE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_LIGHT_BLUE_TILES, NSE_Blocks.LIGHT_BLUE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.SMALL_CRACKED_LIGHT_BLUE_TILES, NSE_Blocks.SMALL_LIGHT_BLUE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_GLAZED_LIGHT_BLUE_TILES, NSE_Blocks.GLAZED_LIGHT_BLUE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS, NSE_Blocks.LIGHT_BLUE_BRICKS);
            offerCrackingRecipe(exporter, NSE_Blocks.SMALL_CRACKED_GRANITE_TILES, NSE_Blocks.SMALL_GRANITE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_GREEN_WHITE_TILES, NSE_Blocks.GREEN_WHITE_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_TUFF_TILES, NSE_Blocks.TUFF_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_TUFF_BRICKS, NSE_Blocks.TUFF_BRICKS);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_WHITEWASH, NSE_Blocks.WHITEWASH);
            offerCrackingRecipe(exporter, NSE_Blocks.VERY_CRACKED_WHITEWASH, NSE_Blocks.CRACKED_WHITEWASH);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_WHITE_CONCRETE, NSE_Blocks.WHITE_CONCRETE);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_BEIGE_CONCRETE, NSE_Blocks.BEIGE_CONCRETE);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_BLUE_CONCRETE, NSE_Blocks.BLUE_CONCRETE);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_RED_CONCRETE, NSE_Blocks.RED_CONCRETE);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_YELLOW_CONCRETE, NSE_Blocks.YELLOW_CONCRETE);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_GREEN_CONCRETE, NSE_Blocks.GREEN_CONCRETE);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_GREEN_BRICKS, NSE_Blocks.GREEN_BRICKS);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_GREEN_BRICKS_2, NSE_Blocks.GREEN_BRICKS_2);
            offerCrackingRecipe(exporter, NSE_Blocks.BIG_GREEN_TILES_CRACKED, NSE_Blocks.BIG_GREEN_TILES);
            offerCrackingRecipe(exporter, NSE_Blocks.CRACKED_RED_BRICKS, NSE_Blocks.RED_BRICKS);

            // Mossy variants
            mossRecipe(exporter, NSE_Blocks.MOSSY_SAND_TILES, NSE_Blocks.SAND_TILES);
            mossRecipe(exporter, NSE_Blocks.MOSSY_SAND_BRICKS, NSE_Blocks.SAND_BRICKS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_TEAL_TILES, NSE_Blocks.TEAL_TILES);
            mossRecipe(exporter, NSE_Blocks.MOSSY_AQUAMARINE_TILES, NSE_Blocks.AQUAMARINE_TILES);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DIORITE_BRICKS, NSE_Blocks.DIORITE_BRICKS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_CALCITE_TILES, NSE_Blocks.CALCITE_TILES);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DRIPSTONE_TILES, NSE_Blocks.DRIPSTONE_TILES);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DEEPSLATE_TILES, NSE_Blocks.DEEPSLATE_TILES);
            mossRecipe(exporter, NSE_Blocks.MOSSY_LIGHT_BLUE_TILES, NSE_Blocks.LIGHT_BLUE_TILES);
            mossRecipe(exporter, NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS, NSE_Blocks.LIGHT_BLUE_BRICKS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_GREEN_WHITE_TILES, NSE_Blocks.GREEN_WHITE_TILES);
            mossRecipe(exporter, NSE_Blocks.MOSSY_TUFF_TILES, NSE_Blocks.TUFF_TILES);
            mossRecipe(exporter, NSE_Blocks.MOSSY_TUFF_BRICKS, NSE_Blocks.TUFF_BRICKS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_GREEN_BRICKS, NSE_Blocks.GREEN_BRICKS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_GREEN_BRICKS_2, NSE_Blocks.GREEN_BRICKS_2);
            mossRecipe(exporter, NSE_Blocks.MOSSY_RED_BRICKS, NSE_Blocks.RED_BRICKS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_BRICK_TILES, NSE_Blocks.BRICK_TILES);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DARK_BRICK_TILES, NSE_Blocks.DARK_BRICK_TILES);
            mossRecipe(exporter, NSE_Blocks.MOSSY_SAND_TILES_STAIRS, NSE_Blocks.SAND_TILES_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_SAND_TILES_SLAB, NSE_Blocks.SAND_TILES_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_SAND_BRICKS_STAIRS, NSE_Blocks.SAND_BRICKS_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_SAND_BRICKS_SLAB, NSE_Blocks.SAND_BRICKS_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_BRICK_TILES_STAIRS, NSE_Blocks.BRICK_TILES_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_BRICK_TILES_SLAB, NSE_Blocks.BRICK_TILES_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DARK_BRICK_TILES_STAIRS, NSE_Blocks.DARK_BRICK_TILES_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DARK_BRICK_TILES_SLAB, NSE_Blocks.DARK_BRICK_TILES_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_RED_BRICKS_STAIRS, NSE_Blocks.RED_BRICKS_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_RED_BRICKS_SLAB, NSE_Blocks.RED_BRICKS_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_TEAL_TILES_STAIRS, NSE_Blocks.TEAL_TILES_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_TEAL_TILES_SLAB, NSE_Blocks.TEAL_TILES_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_GREEN_BRICKS_STAIRS, NSE_Blocks.GREEN_BRICKS_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_GREEN_BRICKS_SLAB, NSE_Blocks.GREEN_BRICKS_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_GREEN_BRICKS_2_STAIRS, NSE_Blocks.GREEN_BRICKS_2_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_GREEN_BRICKS_2_SLAB, NSE_Blocks.GREEN_BRICKS_2_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_AQUAMARINE_TILES_STAIRS, NSE_Blocks.AQUAMARINE_TILES_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_AQUAMARINE_TILES_SLAB, NSE_Blocks.AQUAMARINE_TILES_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DIORITE_BRICKS_STAIRS, NSE_Blocks.DIORITE_BRICKS_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DIORITE_BRICKS_SLAB, NSE_Blocks.DIORITE_BRICKS_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_CALCITE_TILES_STAIRS, NSE_Blocks.CALCITE_TILES_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_CALCITE_TILES_SLAB, NSE_Blocks.CALCITE_TILES_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DRIPSTONE_TILES_STAIRS, NSE_Blocks.DRIPSTONE_TILES_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DRIPSTONE_TILES_SLAB, NSE_Blocks.DRIPSTONE_TILES_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DEEPSLATE_TILES_STAIRS, NSE_Blocks.DEEPSLATE_TILES_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_DEEPSLATE_TILES_SLAB, NSE_Blocks.DEEPSLATE_TILES_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_LIGHT_BLUE_TILES_STAIRS, NSE_Blocks.LIGHT_BLUE_TILES_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_LIGHT_BLUE_TILES_SLAB, NSE_Blocks.LIGHT_BLUE_TILES_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS_STAIRS, NSE_Blocks.LIGHT_BLUE_BRICKS_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS_SLAB, NSE_Blocks.LIGHT_BLUE_BRICKS_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_GREEN_WHITE_TILES_STAIRS, NSE_Blocks.GREEN_WHITE_TILES_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_GREEN_WHITE_TILES_SLAB, NSE_Blocks.GREEN_WHITE_TILES_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_TUFF_TILES_STAIRS, NSE_Blocks.TUFF_TILES_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_TUFF_TILES_SLAB, NSE_Blocks.TUFF_TILES_SLAB);
            mossRecipe(exporter, NSE_Blocks.MOSSY_TUFF_BRICKS_STAIRS, NSE_Blocks.TUFF_BRICKS_STAIRS);
            mossRecipe(exporter, NSE_Blocks.MOSSY_TUFF_BRICKS_SLAB, NSE_Blocks.TUFF_BRICKS_SLAB);

            // Dirty blocks recipe
            dirtyRecipe(exporter, NSE_Blocks.DIRTY_AQUAMARINE_TILES, NSE_Blocks.AQUAMARINE_TILES);
            dirtyRecipe(exporter, NSE_Blocks.DIRTY_AQUAMARINE_TILES_SLAB, NSE_Blocks.AQUAMARINE_TILES_SLAB);
            dirtyRecipe(exporter, NSE_Blocks.DIRTY_AQUAMARINE_TILES_STAIRS, NSE_Blocks.AQUAMARINE_TILES_STAIRS);
            dirtyRecipe(exporter, NSE_Blocks.DIRTY_BRICK_TILES, NSE_Blocks.BRICK_TILES);
            dirtyRecipe(exporter, NSE_Blocks.DIRTY_BRICK_TILES_SLAB, NSE_Blocks.BRICK_TILES_SLAB);
            dirtyRecipe(exporter, NSE_Blocks.DIRTY_BRICK_TILES_STAIRS, NSE_Blocks.BRICK_TILES_STAIRS);
            dirtyRecipe(exporter, NSE_Blocks.DIRTY_DARK_BRICK_TILES, NSE_Blocks.DARK_BRICK_TILES);
            dirtyRecipe(exporter, NSE_Blocks.DIRTY_DARK_BRICK_TILES_SLAB, NSE_Blocks.DARK_BRICK_TILES_SLAB);
            dirtyRecipe(exporter, NSE_Blocks.DIRTY_DARK_BRICK_TILES_STAIRS, NSE_Blocks.DARK_BRICK_TILES_STAIRS);

            // Warning stripes
            warningStripeRecipe(exporter, NSE_Blocks.INDUSTRIAL_WARNING, Items.BLACK_DYE);
            warningStripeRecipe(exporter, NSE_Blocks.RED_WARNING, Items.RED_DYE);
            warningStripeRecipe(exporter, NSE_Blocks.BLUE_WARNING, Items.BLUE_DYE);
            warningStripeRecipe(exporter, NSE_Blocks.LIGHT_BLUE_WARNING, Items.LIGHT_BLUE_DYE);
            warningStripeRecipe(exporter, NSE_Blocks.CYAN_WARNING, Items.CYAN_DYE);
            warningStripeRecipe(exporter, NSE_Blocks.YELLOW_WARNING, Items.YELLOW_DYE);
            warningStripeRecipe(exporter, NSE_Blocks.ORANGE_WARNING, Items.ORANGE_DYE);
            warningStripeRecipe(exporter, NSE_Blocks.GREEN_WARNING, Items.GREEN_DYE);
            warningStripeRecipe(exporter, NSE_Blocks.LIME_WARNING, Items.LIME_DYE);
            warningStripeRecipe(exporter, NSE_Blocks.PURPLE_WARNING, Items.PURPLE_DYE);
            warningStripeRecipe(exporter, NSE_Blocks.MAGENTA_WARNING, Items.MAGENTA_DYE);
            warningStripeRecipe(exporter, NSE_Blocks.GRAY_WARNING, Items.GRAY_DYE);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.SAND_TILES);
                list.add(NSE_Blocks.SAND_BRICKS);
                list.add(NSE_Blocks.SMALL_SAND_TILES);
                list.add(NSE_Blocks.BIG_SAND_TILES);
                list.add(NSE_Blocks.BIG_SAND_BRICKS);
                list.add(NSE_Blocks.CROSS_SAND_TILES);
                list.add(NSE_Blocks.HERRINGBONE_SAND_TILES);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.TEAL_TILES);
                list.add(NSE_Blocks.SMALL_TEAL_TILES);
                list.add(NSE_Blocks.GLAZED_TEAL_TILES);
                list.add(NSE_Blocks.VARIATED_TEAL_TILES);
                list.add(Blocks.PRISMARINE_BRICKS);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.AQUAMARINE_TILES);
                list.add(NSE_Blocks.GLAZED_AQUAMARINE_TILES);
                list.add(NSE_Blocks.SMALL_AQUAMARINE_TILES);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.DIORITE_BRICKS);
                list.add(NSE_Blocks.BIG_DIORITE_TILES);
                list.add(NSE_Blocks.SMALL_DIORITE_TILES);
                list.add(NSE_Blocks.NII_WALL_1);
                list.add(Blocks.POLISHED_DIORITE);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.CALCITE_TILES);
                list.add(NSE_Blocks.DIAGONAL_CALCITE_TILES);
                list.add(Blocks.CALCITE);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.DRIPSTONE_TILES);
                list.add(NSE_Blocks.DRIPSTONE_BRICKS);
                list.add(Blocks.DRIPSTONE_BLOCK);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.DEEPSLATE_TILES);
                list.add(NSE_Blocks.DIAGONAL_DEEPSLATE_TILES);
                list.add(NSE_Blocks.SMALL_DEEPSLATE_TILES);
                list.add(Blocks.POLISHED_DEEPSLATE);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.LIGHT_BLUE_TILES);
                list.add(NSE_Blocks.LIGHT_BLUE_BRICKS);
                list.add(NSE_Blocks.VARIATED_LIGHT_BLUE_TILES);
                list.add(NSE_Blocks.GLAZED_LIGHT_BLUE_TILES);
                list.add(NSE_Blocks.SMALL_LIGHT_BLUE_TILES);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.BIG_GRANITE_TILES);
                list.add(NSE_Blocks.SMALL_GRANITE_TILES);
                list.add(Blocks.POLISHED_GRANITE);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.TUFF_TILES);
                list.add(NSE_Blocks.TUFF_BRICKS);
                list.add(NSE_Blocks.BIG_TUFF_TILES);
                list.add(Blocks.TUFF);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.SMALL_WHITE_TILES);
                list.add(NSE_Blocks.SMALL_CRACKED_WHITE_TILES);
                list.add(NSE_Blocks.GLAZED_WHITE_TILES);
                list.add(NSE_Blocks.CRACKED_GLAZED_WHITE_TILES);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.CROSS_ACACIA_PLANKS);
                list.add(NSE_Blocks.HERRINGBONE_ACACIA_PLANKS);
                list.add(Blocks.ACACIA_PLANKS);
            }), RecipeCategory.BUILDING_BLOCKS);
            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.CROSS_OAK_PLANKS);
                list.add(NSE_Blocks.HERRINGBONE_OAK_PLANKS);
                list.add(Blocks.OAK_PLANKS);
            }), RecipeCategory.BUILDING_BLOCKS);
            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.CROSS_BIRCH_PLANKS);
                list.add(NSE_Blocks.HERRINGBONE_BIRCH_PLANKS);
                list.add(Blocks.BIRCH_PLANKS);
            }), RecipeCategory.BUILDING_BLOCKS);
            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.CROSS_CRIMSON_PLANKS);
                list.add(NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS);
                list.add(Blocks.CRIMSON_PLANKS);
            }), RecipeCategory.BUILDING_BLOCKS);
            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.CROSS_DARK_OAK_PLANKS);
                list.add(NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS);
                list.add(Blocks.DARK_OAK_PLANKS);
            }), RecipeCategory.BUILDING_BLOCKS);
            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.CROSS_JUNGLE_PLANKS);
                list.add(NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS);
                list.add(Blocks.JUNGLE_PLANKS);
            }), RecipeCategory.BUILDING_BLOCKS);
            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.CROSS_MANGROVE_PLANKS);
                list.add(NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS);
                list.add(Blocks.MANGROVE_PLANKS);
            }), RecipeCategory.BUILDING_BLOCKS);
            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.CROSS_SPRUCE_PLANKS);
                list.add(NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS);
                list.add(Blocks.SPRUCE_PLANKS);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.BRICK_TILES);
                list.add(NSE_Blocks.GLAZED_BRICK_TILES);
                list.add(Blocks.BRICKS);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.NII_WALL_3);
                list.add(Blocks.STONE);
                list.add(Blocks.STONE_BRICKS);
            }), RecipeCategory.BUILDING_BLOCKS);

            stoneCuttingCategory(exporter, Util.make(Lists.newArrayList(), list -> {
                list.add(NSE_Blocks.NII_WALL_2);
                list.add(Blocks.SMOOTH_STONE);
            }), RecipeCategory.BUILDING_BLOCKS);

            diceRecipe(exporter, NSE_Items.DICE_D4);
            diceRecipe(exporter, NSE_Items.DICE_D6);
            diceRecipe(exporter, NSE_Items.DICE_D20);

            offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, NSE_Blocks.CHISELED_MANGROVE_DOOR, Blocks.MANGROVE_DOOR);
            offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, NSE_Blocks.CHISELED_OAK_DOOR, Blocks.OAK_DOOR);
            offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, NSE_Blocks.CHISELED_SPRUCE_DOOR, Blocks.SPRUCE_DOOR);
            offerStonecuttingRecipe(exporter, RecipeCategory.BUILDING_BLOCKS, NSE_Blocks.CHISELED_BIRCH_DOOR, Blocks.BIRCH_DOOR);

            ShapedRecipeJsonBuilder.create(RecipeCategory.DECORATIONS, NSE_Custom.LIGHT_BULB_LAMP, 1)
                    .input('X', Items.IRON_INGOT).input('Y', Items.IRON_NUGGET).input('Z', NSE_Items.LIGHT_BULB)
                    .pattern(" X ").pattern(" Y ").pattern(" Z ")
                    .criterion(hasItem(NSE_Items.LIGHT_BULB), conditionsFromItem(NSE_Items.LIGHT_BULB)).offerTo(exporter);

            ShapedRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, NSE_Blocks.NII_FLOOR, 4)
                    .input('#', Items.DIORITE).input('G', Items.GRANITE).input('C', Items.COBBLESTONE)
                    .pattern("#G").pattern("GC")
                    .criterion(hasItem(Items.GRANITE), conditionsFromItem(Items.GRANITE))
                    .criterion(hasItem(Items.DIORITE), conditionsFromItem(Items.DIORITE))
                    .criterion(hasItem(Items.COBBLESTONE), conditionsFromItem(Items.COBBLESTONE))
                    .offerTo(exporter);

            ShapedRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, NSE_Blocks.BIG_GREEN_TILES, 8)
                    .input('#', NSE_Blocks.BIG_DIORITE_TILES).input('G', Items.GREEN_DYE)
                    .pattern("###")
                    .pattern("#G#")
                    .pattern("###")
                    .criterion(hasItem(Items.GREEN_DYE), conditionsFromItem(Items.GREEN_DYE))
                    .criterion(hasItem(NSE_Blocks.BIG_DIORITE_TILES), conditionsFromItem(NSE_Blocks.BIG_DIORITE_TILES))
                    .offerTo(exporter);

            ShapedRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, NSE_Blocks.GREEN_BRICKS, 8)
                    .input('#', Items.BRICKS).input('G', Items.GREEN_DYE)
                    .pattern("###")
                    .pattern("#G#")
                    .pattern("###")
                    .criterion(hasItem(Items.GREEN_DYE), conditionsFromItem(Items.GREEN_DYE))
                    .criterion(hasItem(Items.BRICKS), conditionsFromItem(Items.BRICKS))
                    .offerTo(exporter);

            ShapelessRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, NSE_Blocks.GREEN_BRICKS_2, 2)
                    .input(Items.BRICKS).input(NSE_Blocks.GREEN_BRICKS)
                    .criterion(hasItem(NSE_Blocks.GREEN_BRICKS), conditionsFromItem(NSE_Blocks.GREEN_BRICKS))
                    .criterion(hasItem(Items.BRICKS), conditionsFromItem(Items.BRICKS))
                    .offerTo(exporter);

            ShapedRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, NSE_Blocks.SMALL_YELLOW_TILES, 8)
                    .pattern("###")
                    .pattern("#Y#")
                    .pattern("###")
                    .input('#', NSE_Blocks.SMALL_WHITE_TILES).input('Y', Items.YELLOW_DYE)
                    .criterion(hasItem(NSE_Blocks.SMALL_WHITE_TILES), conditionsFromItem(NSE_Blocks.SMALL_WHITE_TILES))
                    .criterion(hasItem(Items.YELLOW_DYE), conditionsFromItem(Items.YELLOW_DYE))
                    .offerTo(exporter);

            ShapedRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, NSE_Blocks.RED_BRICKS, 8)
                    .pattern("###")
                    .pattern("#R#")
                    .pattern("###")
                    .input('#', Items.BRICKS).input('R', Items.RED_DYE)
                    .criterion(hasItem(Items.BRICKS), conditionsFromItem(Items.BRICKS))
                    .criterion(hasItem(Items.RED_DYE), conditionsFromItem(Items.RED_DYE))
                    .offerTo(exporter);

            ShapedRecipeJsonBuilder.create(RecipeCategory.BUILDING_BLOCKS, NSE_Blocks.DARK_BRICK_TILES, 8)
                    .pattern("###")
                    .pattern("#D#")
                    .pattern("###")
                    .input('#', NSE_Blocks.BRICK_TILES).input('D', Items.BROWN_DYE)
                    .criterion(hasItem(NSE_Blocks.BRICK_TILES), conditionsFromItem(NSE_Blocks.BRICK_TILES))
                    .criterion(hasItem(Items.BROWN_DYE), conditionsFromItem(Items.BROWN_DYE))
                    .offerTo(exporter);

            // Generated stairs and slabs recipes
            offerStairsAndSlab(exporter, NSE_Blocks.SAND_TILES_STAIRS, NSE_Blocks.SAND_TILES_SLAB, NSE_Blocks.SAND_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_SAND_TILES_STAIRS, NSE_Blocks.CRACKED_SAND_TILES_SLAB, NSE_Blocks.CRACKED_SAND_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_SAND_TILES_STAIRS, NSE_Blocks.MOSSY_SAND_TILES_SLAB, NSE_Blocks.MOSSY_SAND_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.HERRINGBONE_SAND_TILES_STAIRS, NSE_Blocks.HERRINGBONE_SAND_TILES_SLAB, NSE_Blocks.HERRINGBONE_SAND_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CROSS_SAND_TILES_STAIRS, NSE_Blocks.CROSS_SAND_TILES_SLAB, NSE_Blocks.CROSS_SAND_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.SAND_BRICKS_STAIRS, NSE_Blocks.SAND_BRICKS_SLAB, NSE_Blocks.SAND_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_SAND_BRICKS_STAIRS, NSE_Blocks.CRACKED_SAND_BRICKS_SLAB, NSE_Blocks.CRACKED_SAND_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_SAND_BRICKS_STAIRS, NSE_Blocks.MOSSY_SAND_BRICKS_SLAB, NSE_Blocks.MOSSY_SAND_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.BIG_SAND_BRICKS_STAIRS, NSE_Blocks.BIG_SAND_BRICKS_SLAB, NSE_Blocks.BIG_SAND_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.BRICK_TILES_STAIRS, NSE_Blocks.BRICK_TILES_SLAB, NSE_Blocks.BRICK_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_BRICK_TILES_STAIRS, NSE_Blocks.CRACKED_BRICK_TILES_SLAB, NSE_Blocks.CRACKED_BRICK_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_BRICK_TILES_STAIRS, NSE_Blocks.MOSSY_BRICK_TILES_SLAB, NSE_Blocks.MOSSY_BRICK_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.DIRTY_BRICK_TILES_STAIRS, NSE_Blocks.DIRTY_BRICK_TILES_SLAB, NSE_Blocks.DIRTY_BRICK_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.DARK_BRICK_TILES_STAIRS, NSE_Blocks.DARK_BRICK_TILES_SLAB, NSE_Blocks.DARK_BRICK_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_DARK_BRICK_TILES_STAIRS, NSE_Blocks.CRACKED_DARK_BRICK_TILES_SLAB, NSE_Blocks.CRACKED_DARK_BRICK_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_DARK_BRICK_TILES_STAIRS, NSE_Blocks.MOSSY_DARK_BRICK_TILES_SLAB, NSE_Blocks.MOSSY_DARK_BRICK_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.DIRTY_DARK_BRICK_TILES_STAIRS, NSE_Blocks.DIRTY_DARK_BRICK_TILES_SLAB, NSE_Blocks.DIRTY_DARK_BRICK_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.RED_BRICKS_STAIRS, NSE_Blocks.RED_BRICKS_SLAB, NSE_Blocks.RED_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_RED_BRICKS_STAIRS, NSE_Blocks.CRACKED_RED_BRICKS_SLAB, NSE_Blocks.CRACKED_RED_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_RED_BRICKS_STAIRS, NSE_Blocks.MOSSY_RED_BRICKS_SLAB, NSE_Blocks.MOSSY_RED_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.TEAL_TILES_STAIRS, NSE_Blocks.TEAL_TILES_SLAB, NSE_Blocks.TEAL_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_TEAL_TILES_STAIRS, NSE_Blocks.CRACKED_TEAL_TILES_SLAB, NSE_Blocks.CRACKED_TEAL_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_TEAL_TILES_STAIRS, NSE_Blocks.MOSSY_TEAL_TILES_SLAB, NSE_Blocks.MOSSY_TEAL_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.VARIATED_TEAL_TILES_STAIRS, NSE_Blocks.VARIATED_TEAL_TILES_SLAB, NSE_Blocks.VARIATED_TEAL_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.GREEN_BRICKS_STAIRS, NSE_Blocks.GREEN_BRICKS_SLAB, NSE_Blocks.GREEN_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_GREEN_BRICKS_STAIRS, NSE_Blocks.CRACKED_GREEN_BRICKS_SLAB, NSE_Blocks.CRACKED_GREEN_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_GREEN_BRICKS_STAIRS, NSE_Blocks.MOSSY_GREEN_BRICKS_SLAB, NSE_Blocks.MOSSY_GREEN_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.GREEN_BRICKS_2_STAIRS, NSE_Blocks.GREEN_BRICKS_2_SLAB, NSE_Blocks.GREEN_BRICKS_2);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_GREEN_BRICKS_2_STAIRS, NSE_Blocks.CRACKED_GREEN_BRICKS_2_SLAB, NSE_Blocks.CRACKED_GREEN_BRICKS_2);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_GREEN_BRICKS_2_STAIRS, NSE_Blocks.MOSSY_GREEN_BRICKS_2_SLAB, NSE_Blocks.MOSSY_GREEN_BRICKS_2);
            offerStairsAndSlab(exporter, NSE_Blocks.AQUAMARINE_TILES_STAIRS, NSE_Blocks.AQUAMARINE_TILES_SLAB, NSE_Blocks.AQUAMARINE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_AQUAMARINE_TILES_STAIRS, NSE_Blocks.CRACKED_AQUAMARINE_TILES_SLAB, NSE_Blocks.CRACKED_AQUAMARINE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_AQUAMARINE_TILES_STAIRS, NSE_Blocks.MOSSY_AQUAMARINE_TILES_SLAB, NSE_Blocks.MOSSY_AQUAMARINE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.DIRTY_AQUAMARINE_TILES_STAIRS, NSE_Blocks.DIRTY_AQUAMARINE_TILES_SLAB, NSE_Blocks.DIRTY_AQUAMARINE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.DIORITE_BRICKS_STAIRS, NSE_Blocks.DIORITE_BRICKS_SLAB, NSE_Blocks.DIORITE_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_DIORITE_BRICKS_STAIRS, NSE_Blocks.CRACKED_DIORITE_BRICKS_SLAB, NSE_Blocks.CRACKED_DIORITE_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_DIORITE_BRICKS_STAIRS, NSE_Blocks.MOSSY_DIORITE_BRICKS_SLAB, NSE_Blocks.MOSSY_DIORITE_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CALCITE_TILES_STAIRS, NSE_Blocks.CALCITE_TILES_SLAB, NSE_Blocks.CALCITE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_CALCITE_TILES_STAIRS, NSE_Blocks.CRACKED_CALCITE_TILES_SLAB, NSE_Blocks.CRACKED_CALCITE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_CALCITE_TILES_STAIRS, NSE_Blocks.MOSSY_CALCITE_TILES_SLAB, NSE_Blocks.MOSSY_CALCITE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.DRIPSTONE_TILES_STAIRS, NSE_Blocks.DRIPSTONE_TILES_SLAB, NSE_Blocks.DRIPSTONE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_DRIPSTONE_TILES_STAIRS, NSE_Blocks.CRACKED_DRIPSTONE_TILES_SLAB, NSE_Blocks.CRACKED_DRIPSTONE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_DRIPSTONE_TILES_STAIRS, NSE_Blocks.MOSSY_DRIPSTONE_TILES_SLAB, NSE_Blocks.MOSSY_DRIPSTONE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.DEEPSLATE_TILES_STAIRS, NSE_Blocks.DEEPSLATE_TILES_SLAB, NSE_Blocks.DEEPSLATE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_DEEPSLATE_TILES_STAIRS, NSE_Blocks.CRACKED_DEEPSLATE_TILES_SLAB, NSE_Blocks.CRACKED_DEEPSLATE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_DEEPSLATE_TILES_STAIRS, NSE_Blocks.MOSSY_DEEPSLATE_TILES_SLAB, NSE_Blocks.MOSSY_DEEPSLATE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.LIGHT_BLUE_TILES_STAIRS, NSE_Blocks.LIGHT_BLUE_TILES_SLAB, NSE_Blocks.LIGHT_BLUE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_LIGHT_BLUE_TILES_STAIRS, NSE_Blocks.CRACKED_LIGHT_BLUE_TILES_SLAB, NSE_Blocks.CRACKED_LIGHT_BLUE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_LIGHT_BLUE_TILES_STAIRS, NSE_Blocks.MOSSY_LIGHT_BLUE_TILES_SLAB, NSE_Blocks.MOSSY_LIGHT_BLUE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.VARIATED_LIGHT_BLUE_TILES_STAIRS, NSE_Blocks.VARIATED_LIGHT_BLUE_TILES_SLAB, NSE_Blocks.VARIATED_LIGHT_BLUE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.LIGHT_BLUE_BRICKS_STAIRS, NSE_Blocks.LIGHT_BLUE_BRICKS_SLAB, NSE_Blocks.LIGHT_BLUE_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS_STAIRS, NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS_SLAB, NSE_Blocks.CRACKED_LIGHT_BLUE_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS_STAIRS, NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS_SLAB, NSE_Blocks.MOSSY_LIGHT_BLUE_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.GREEN_WHITE_TILES_STAIRS, NSE_Blocks.GREEN_WHITE_TILES_SLAB, NSE_Blocks.GREEN_WHITE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_GREEN_WHITE_TILES_STAIRS, NSE_Blocks.CRACKED_GREEN_WHITE_TILES_SLAB, NSE_Blocks.CRACKED_GREEN_WHITE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_GREEN_WHITE_TILES_STAIRS, NSE_Blocks.MOSSY_GREEN_WHITE_TILES_SLAB, NSE_Blocks.MOSSY_GREEN_WHITE_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.TUFF_TILES_STAIRS, NSE_Blocks.TUFF_TILES_SLAB, NSE_Blocks.TUFF_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_TUFF_TILES_STAIRS, NSE_Blocks.CRACKED_TUFF_TILES_SLAB, NSE_Blocks.CRACKED_TUFF_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_TUFF_TILES_STAIRS, NSE_Blocks.MOSSY_TUFF_TILES_SLAB, NSE_Blocks.MOSSY_TUFF_TILES);
            offerStairsAndSlab(exporter, NSE_Blocks.TUFF_BRICKS_STAIRS, NSE_Blocks.TUFF_BRICKS_SLAB, NSE_Blocks.TUFF_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_TUFF_BRICKS_STAIRS, NSE_Blocks.CRACKED_TUFF_BRICKS_SLAB, NSE_Blocks.CRACKED_TUFF_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.MOSSY_TUFF_BRICKS_STAIRS, NSE_Blocks.MOSSY_TUFF_BRICKS_SLAB, NSE_Blocks.MOSSY_TUFF_BRICKS);
            offerStairsAndSlab(exporter, NSE_Blocks.WHITE_CONCRETE_STAIRS, NSE_Blocks.WHITE_CONCRETE_SLAB, NSE_Blocks.WHITE_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_WHITE_CONCRETE_STAIRS, NSE_Blocks.CRACKED_WHITE_CONCRETE_SLAB, NSE_Blocks.CRACKED_WHITE_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.BEIGE_CONCRETE_STAIRS, NSE_Blocks.BEIGE_CONCRETE_SLAB, NSE_Blocks.BEIGE_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_BEIGE_CONCRETE_STAIRS, NSE_Blocks.CRACKED_BEIGE_CONCRETE_SLAB, NSE_Blocks.CRACKED_BEIGE_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.BLUE_CONCRETE_STAIRS, NSE_Blocks.BLUE_CONCRETE_SLAB, NSE_Blocks.BLUE_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_BLUE_CONCRETE_STAIRS, NSE_Blocks.CRACKED_BLUE_CONCRETE_SLAB, NSE_Blocks.CRACKED_BLUE_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.RED_CONCRETE_STAIRS, NSE_Blocks.RED_CONCRETE_SLAB, NSE_Blocks.RED_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_RED_CONCRETE_STAIRS, NSE_Blocks.CRACKED_RED_CONCRETE_SLAB, NSE_Blocks.CRACKED_RED_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.YELLOW_CONCRETE_STAIRS, NSE_Blocks.YELLOW_CONCRETE_SLAB, NSE_Blocks.YELLOW_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_YELLOW_CONCRETE_STAIRS, NSE_Blocks.CRACKED_YELLOW_CONCRETE_SLAB, NSE_Blocks.CRACKED_YELLOW_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.GREEN_CONCRETE_STAIRS, NSE_Blocks.GREEN_CONCRETE_SLAB, NSE_Blocks.GREEN_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.CRACKED_GREEN_CONCRETE_STAIRS, NSE_Blocks.CRACKED_GREEN_CONCRETE_SLAB, NSE_Blocks.CRACKED_GREEN_CONCRETE);
            offerStairsAndSlab(exporter, NSE_Blocks.NII_FLOOR_STAIRS, NSE_Blocks.NII_FLOOR_SLAB, NSE_Blocks.NII_FLOOR);
            offerStairsAndSlab(exporter, NSE_Blocks.HERRINGBONE_ACACIA_PLANKS_STAIRS, NSE_Blocks.HERRINGBONE_ACACIA_PLANKS_SLAB, NSE_Blocks.HERRINGBONE_ACACIA_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CROSS_ACACIA_PLANKS_STAIRS, NSE_Blocks.CROSS_ACACIA_PLANKS_SLAB, NSE_Blocks.CROSS_ACACIA_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.HERRINGBONE_OAK_PLANKS_STAIRS, NSE_Blocks.HERRINGBONE_OAK_PLANKS_SLAB, NSE_Blocks.HERRINGBONE_OAK_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CROSS_OAK_PLANKS_STAIRS, NSE_Blocks.CROSS_OAK_PLANKS_SLAB, NSE_Blocks.CROSS_OAK_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.HERRINGBONE_BIRCH_PLANKS_STAIRS, NSE_Blocks.HERRINGBONE_BIRCH_PLANKS_SLAB, NSE_Blocks.HERRINGBONE_BIRCH_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CROSS_BIRCH_PLANKS_STAIRS, NSE_Blocks.CROSS_BIRCH_PLANKS_SLAB, NSE_Blocks.CROSS_BIRCH_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS_STAIRS, NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS_SLAB, NSE_Blocks.HERRINGBONE_CRIMSON_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CROSS_CRIMSON_PLANKS_STAIRS, NSE_Blocks.CROSS_CRIMSON_PLANKS_SLAB, NSE_Blocks.CROSS_CRIMSON_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS_STAIRS, NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS_SLAB, NSE_Blocks.HERRINGBONE_DARK_OAK_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CROSS_DARK_OAK_PLANKS_STAIRS, NSE_Blocks.CROSS_DARK_OAK_PLANKS_SLAB, NSE_Blocks.CROSS_DARK_OAK_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS_STAIRS, NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS_SLAB, NSE_Blocks.HERRINGBONE_JUNGLE_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CROSS_JUNGLE_PLANKS_STAIRS, NSE_Blocks.CROSS_JUNGLE_PLANKS_SLAB, NSE_Blocks.CROSS_JUNGLE_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS_STAIRS, NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS_SLAB, NSE_Blocks.HERRINGBONE_MANGROVE_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CROSS_MANGROVE_PLANKS_STAIRS, NSE_Blocks.CROSS_MANGROVE_PLANKS_SLAB, NSE_Blocks.CROSS_MANGROVE_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS_STAIRS, NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS_SLAB, NSE_Blocks.HERRINGBONE_SPRUCE_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.CROSS_SPRUCE_PLANKS_STAIRS, NSE_Blocks.CROSS_SPRUCE_PLANKS_SLAB, NSE_Blocks.CROSS_SPRUCE_PLANKS);
            offerStairsAndSlab(exporter, NSE_Blocks.HERRINGBONE_PARQUET_STAIRS, NSE_Blocks.HERRINGBONE_PARQUET_SLAB, NSE_Blocks.HERRINGBONE_PARQUET);
            offerStairsAndSlab(exporter, NSE_Blocks.STRAIGHT_PARQUET_STAIRS, NSE_Blocks.STRAIGHT_PARQUET_SLAB, NSE_Blocks.STRAIGHT_PARQUET);
            offerStairsAndSlab(exporter, NSE_Blocks.SEPARATED_PARQUET_STAIRS, NSE_Blocks.SEPARATED_PARQUET_SLAB, NSE_Blocks.SEPARATED_PARQUET);
            offerStairsAndSlab(exporter, NSE_Blocks.GREEN_LINOLEUM_STAIRS, NSE_Blocks.GREEN_LINOLEUM_SLAB, NSE_Blocks.GREEN_LINOLEUM);
            offerStairsAndSlab(exporter, NSE_Blocks.BLUE_LINOLEUM_STAIRS, NSE_Blocks.BLUE_LINOLEUM_SLAB, NSE_Blocks.BLUE_LINOLEUM);
            offerStairsAndSlab(exporter, NSE_Blocks.RED_LINOLEUM_STAIRS, NSE_Blocks.RED_LINOLEUM_SLAB, NSE_Blocks.RED_LINOLEUM);
            offerStairsAndSlab(exporter, NSE_Blocks.GRAY_LINOLEUM_STAIRS, NSE_Blocks.GRAY_LINOLEUM_SLAB, NSE_Blocks.GRAY_LINOLEUM);
            offerStairsAndSlab(exporter, NSE_Blocks.ORANGE_LINOLEUM_STAIRS, NSE_Blocks.ORANGE_LINOLEUM_SLAB, NSE_Blocks.ORANGE_LINOLEUM);
            offerStairsAndSlab(exporter, NSE_Blocks.BROWN_LINOLEUM_STAIRS, NSE_Blocks.BROWN_LINOLEUM_SLAB, NSE_Blocks.BROWN_LINOLEUM);
            offerStairsAndSlab(exporter, NSE_Blocks.CYAN_LINOLEUM_STAIRS, NSE_Blocks.CYAN_LINOLEUM_SLAB, NSE_Blocks.CYAN_LINOLEUM);
            offerStairsAndSlab(exporter, NSE_Blocks.METAL_PLATING_STAIRS, NSE_Blocks.METAL_PLATING_SLAB, NSE_Blocks.METAL_PLATING);
        }
    }

    // This is often used once to generate some model and then move it into "proper" assets folder
    private static class ModelGenerator extends FabricModelProvider {
        private ModelGenerator(FabricDataOutput generator) {
            super(generator);
        }

        @Override
        public void generateBlockStateModels(BlockStateModelGenerator blockStateModelGenerator) {
//            BlockStateModelGenerator.createStairsBlockState(NSE_Blocks.SAND_TILES_STAIRS, new Identifier(NewSoviet.MOD_ID, "sand_tiles_stairs"));
        }

        @Override
        public void generateItemModels(ItemModelGenerator itemModelGenerator) {
        }
    }

    @Override
    public void onInitializeDataGenerator(FabricDataGenerator fabricDataGenerator) {
        FabricDataGenerator.Pack NSEPack = fabricDataGenerator.createPack();
        NSEPack.addProvider(BlockLootTables::new);
        NSEPack.addProvider(RecipeGenerator::new);
        NSEPack.addProvider(BlockTagGenerator::new);
        NSEPack.addProvider(ModelGenerator::new);
    }
}