package ovh.glitchlabs.ornamentum.blocks;

import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredBlock;
import net.neoforged.neoforge.registries.DeferredRegister;
import ovh.glitchlabs.ornamentum.Ornamentum;
import ovh.glitchlabs.ornamentum.blocks.custom.*;
import ovh.glitchlabs.ornamentum.items.ModItems;

import java.util.function.Supplier;

public class  ModBlocks {
    public static final DeferredRegister.Blocks BLOCKS =
            DeferredRegister.createBlocks(Ornamentum.MODID);

    public static final DeferredBlock<Block> REDSTONE_POWERED_FAN_BLOCK = registerBlock("redstone_powered_fan_block",
            () -> new RedstonePowerdFanBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK).noOcclusion()));

    public static final DeferredBlock<Block> FAN_BLOCK = registerBlock("fan_block",
            () -> new FanBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK).noOcclusion()));

    public static final DeferredBlock<Block> LINK_BLOCK = registerBlock("link_block",
            () -> new LinkBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.BLACK_CONCRETE).isRedstoneConductor((bs, br, bp) -> true).noOcclusion()));

    public static final DeferredBlock<Block> DUCK = registerBlock("duck",
            () -> new duckBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.YELLOW_CARPET).noOcclusion()));

    public static final DeferredBlock<Block> BABY_TURTLE = registerBlock("baby_turtle",
            () -> new babyTurtleBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.GREEN_CARPET).noOcclusion()));

    public static final DeferredBlock<Block> IRON_SHELF = registerBlock("iron_shelf",
            () -> new ShelfBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK).noOcclusion()));

    public static final DeferredBlock<Block> OBSIDIAN_BRICKS = registerBlock("obsidian_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.OBSIDIAN)));

    public static final DeferredBlock<Block> CRACKED_OBSIDIAN_BRICKS = registerBlock("cracked_obsidian_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.OBSIDIAN)));

    public static final DeferredBlock<Block> OBSIDIAN_TILES = registerBlock("obsidian_tiles",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.OBSIDIAN)));

    public static final DeferredBlock<Block> CRACKED_OBSIDIAN_TILES = registerBlock("cracked_obsidian_tiles",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.OBSIDIAN)));

    public static final DeferredBlock<Block> POLISHED_OBSIDIAN = registerBlock("polished_obsidian",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.OBSIDIAN)));

    // flags
    public static final DeferredBlock<Block> WHITE_FLAG = registerBlock("white_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.of().strength(1.0f).sound(SoundType.WOOD)));

    public static final DeferredBlock<Block> ORANGE_FLAG = registerBlock("orange_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> MAGENTA_FLAG = registerBlock("magenta_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> LIGHT_BLUE_FLAG = registerBlock("light_blue_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> YELLOW_FLAG = registerBlock("yellow_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> LIME_FLAG = registerBlock("lime_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> PINK_FLAG = registerBlock("pink_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> GRAY_FLAG = registerBlock("gray_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> LIGHT_GRAY_FLAG = registerBlock("light_gray_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> CYAN_FLAG = registerBlock("cyan_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> PURPLE_FLAG = registerBlock("purple_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> BLUE_FLAG = registerBlock("blue_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> BROWN_FLAG = registerBlock("brown_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> GREEN_FLAG = registerBlock("green_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> RED_FLAG = registerBlock("red_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> BLACK_FLAG = registerBlock("black_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));



    public static final DeferredBlock<Block> AUSTRIA_FLAG = registerBlock("austria_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> BOUVET_ISLAND_FLAG = registerBlock("bouvet_island_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> CANADA_FLAG = registerBlock("canada_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> CHINA_FLAG = registerBlock("china_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> DENMARK_FLAG = registerBlock("denmark_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> FINLAND_FLAG = registerBlock("finland_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> FRANCE_FLAG = registerBlock("france_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> GERMANY_FLAG = registerBlock("germany_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> GREECE_FLAG = registerBlock("greece_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> HUNGARY_FLAG = registerBlock("hungary_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> ICELAND_FLAG = registerBlock("iceland_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> INDIA_FLAG = registerBlock("india_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> IRELAND_FLAG = registerBlock("ireland_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> ITALY_FLAG = registerBlock("italy_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> JAPAN_FLAG = registerBlock("japan_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> LATVIA_FLAG = registerBlock("latvia_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> NETHERLANDS_FLAG = registerBlock("netherlands_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> SWEDEN_FLAG = registerBlock("sweden_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> SWITZERLAND_FLAG = registerBlock("switzerland_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> UNITED_KINGDOM_FLAG = registerBlock("united_kingdom_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> UNITED_STATES_FLAG = registerBlock("united_states_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> AGENDER_FLAG = registerBlock("agender_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> AROACE_FLAG = registerBlock("aroace_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> AROMANTIC_FLAG = registerBlock("aromantic_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> ASEXUAL_FLAG = registerBlock("asexual_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> BISEXUAL_FLAG = registerBlock("bisexual_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> DEMIROMANTIC_FLAG = registerBlock("demiromantic_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> DEMISEXUAL_FLAG = registerBlock("demisexual_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> GAY_MEN_FLAG = registerBlock("gay_men_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> GENDERFLUID_FLAG = registerBlock("genderfluid_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> GENDERQUEER_FLAG = registerBlock("genderqueer_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> INTERSEX_FLAG = registerBlock("intersex_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> LESBIAN_FLAG = registerBlock("lesbian_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> NON_BINARY_FLAG = registerBlock("non-binary_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> OMNISEXUAL_FLAG = registerBlock("omnisexual_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> PANSEXUAL_FLAG = registerBlock("pansexual_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> PRIDE_FLAG = registerBlock("pride_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> PROGRESS_PRIDE_FLAG = registerBlock("progress_pride_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    public static final DeferredBlock<Block> TRANS_FLAG = registerBlock("trans_flag",
            () -> new FlagBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_FLAG.get())));

    // Pattern Blocks

    public static final DeferredBlock<Block> WHITE_PATTERN_BLOCK = registerBlock("white_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.WHITE_CONCRETE)));
    public static final DeferredBlock<StairBlock> WHITE_PATTERN_BLOCK_STAIRS = registerBlock("white_pattern_block_stairs",
            () -> new StairBlock(WHITE_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(WHITE_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> WHITE_PATTERN_BLOCK_SLAB = registerBlock("white_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> ORANGE_PATTERN_BLOCK = registerBlock("orange_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.ORANGE_CONCRETE)));
    public static final DeferredBlock<StairBlock> ORANGE_PATTERN_BLOCK_STAIRS = registerBlock("orange_pattern_block_stairs",
            () -> new StairBlock(ORANGE_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(ORANGE_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> ORANGE_PATTERN_BLOCK_SLAB = registerBlock("orange_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(ORANGE_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> MAGENTA_PATTERN_BLOCK = registerBlock("magenta_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.MAGENTA_CONCRETE)));
    public static final DeferredBlock<StairBlock> MAGENTA_PATTERN_BLOCK_STAIRS = registerBlock("magenta_pattern_block_stairs",
            () -> new StairBlock(MAGENTA_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(MAGENTA_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> MAGENTA_PATTERN_BLOCK_SLAB = registerBlock("magenta_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(MAGENTA_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> LIGHT_BLUE_PATTERN_BLOCK = registerBlock("light_blue_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.LIGHT_BLUE_CONCRETE)));
    public static final DeferredBlock<StairBlock> LIGHT_BLUE_PATTERN_BLOCK_STAIRS = registerBlock("light_blue_pattern_block_stairs",
            () -> new StairBlock(LIGHT_BLUE_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(LIGHT_BLUE_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> LIGHT_BLUE_PATTERN_BLOCK_SLAB = registerBlock("light_blue_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(LIGHT_BLUE_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> YELLOW_PATTERN_BLOCK = registerBlock("yellow_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.YELLOW_CONCRETE)));
    public static final DeferredBlock<StairBlock> YELLOW_PATTERN_BLOCK_STAIRS = registerBlock("yellow_pattern_block_stairs",
            () -> new StairBlock(YELLOW_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(YELLOW_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> YELLOW_PATTERN_BLOCK_SLAB = registerBlock("yellow_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(YELLOW_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> LIME_PATTERN_BLOCK = registerBlock("lime_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.LIME_CONCRETE)));
    public static final DeferredBlock<StairBlock> LIME_PATTERN_BLOCK_STAIRS = registerBlock("lime_pattern_block_stairs",
            () -> new StairBlock(LIME_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(LIME_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> LIME_PATTERN_BLOCK_SLAB = registerBlock("lime_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(LIME_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> PINK_PATTERN_BLOCK = registerBlock("pink_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.PINK_CONCRETE)));
    public static final DeferredBlock<StairBlock> PINK_PATTERN_BLOCK_STAIRS = registerBlock("pink_pattern_block_stairs",
            () -> new StairBlock(PINK_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(PINK_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> PINK_PATTERN_BLOCK_SLAB = registerBlock("pink_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(PINK_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> GRAY_PATTERN_BLOCK = registerBlock("gray_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.GRAY_CONCRETE)));
    public static final DeferredBlock<StairBlock> GRAY_PATTERN_BLOCK_STAIRS = registerBlock("gray_pattern_block_stairs",
            () -> new StairBlock(GRAY_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(GRAY_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> GRAY_PATTERN_BLOCK_SLAB = registerBlock("gray_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(GRAY_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> LIGHT_GRAY_PATTERN_BLOCK = registerBlock("light_gray_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.LIGHT_GRAY_CONCRETE)));
    public static final DeferredBlock<StairBlock> LIGHT_GRAY_PATTERN_BLOCK_STAIRS = registerBlock("light_gray_pattern_block_stairs",
            () -> new StairBlock(LIGHT_GRAY_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(LIGHT_GRAY_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> LIGHT_GRAY_PATTERN_BLOCK_SLAB = registerBlock("light_gray_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(LIGHT_GRAY_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> CYAN_PATTERN_BLOCK = registerBlock("cyan_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.CYAN_CONCRETE)));
    public static final DeferredBlock<StairBlock> CYAN_PATTERN_BLOCK_STAIRS = registerBlock("cyan_pattern_block_stairs",
            () -> new StairBlock(CYAN_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(CYAN_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> CYAN_PATTERN_BLOCK_SLAB = registerBlock("cyan_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(CYAN_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> PURPLE_PATTERN_BLOCK = registerBlock("purple_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.PURPLE_CONCRETE)));
    public static final DeferredBlock<StairBlock> PURPLE_PATTERN_BLOCK_STAIRS = registerBlock("purple_pattern_block_stairs",
            () -> new StairBlock(PURPLE_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(PURPLE_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> PURPLE_PATTERN_BLOCK_SLAB = registerBlock("purple_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(PURPLE_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> BLUE_PATTERN_BLOCK = registerBlock("blue_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BLUE_CONCRETE)));
    public static final DeferredBlock<StairBlock> BLUE_PATTERN_BLOCK_STAIRS = registerBlock("blue_pattern_block_stairs",
            () -> new StairBlock(BLUE_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(BLUE_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> BLUE_PATTERN_BLOCK_SLAB = registerBlock("blue_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(BLUE_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> BROWN_PATTERN_BLOCK = registerBlock("brown_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BROWN_CONCRETE)));
    public static final DeferredBlock<StairBlock> BROWN_PATTERN_BLOCK_STAIRS = registerBlock("brown_pattern_block_stairs",
            () -> new StairBlock(BROWN_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(BROWN_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> BROWN_PATTERN_BLOCK_SLAB = registerBlock("brown_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(BROWN_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> GREEN_PATTERN_BLOCK = registerBlock("green_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.GREEN_CONCRETE)));
    public static final DeferredBlock<StairBlock> GREEN_PATTERN_BLOCK_STAIRS = registerBlock("green_pattern_block_stairs",
            () -> new StairBlock(GREEN_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(GREEN_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> GREEN_PATTERN_BLOCK_SLAB = registerBlock("green_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(GREEN_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> RED_PATTERN_BLOCK = registerBlock("red_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.RED_CONCRETE)));
    public static final DeferredBlock<StairBlock> RED_PATTERN_BLOCK_STAIRS = registerBlock("red_pattern_block_stairs",
            () -> new StairBlock(RED_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(RED_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> RED_PATTERN_BLOCK_SLAB = registerBlock("red_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(RED_PATTERN_BLOCK.get())));

    public static final DeferredBlock<Block> BLACK_PATTERN_BLOCK = registerBlock("black_pattern_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BLACK_CONCRETE)));
    public static final DeferredBlock<StairBlock> BLACK_PATTERN_BLOCK_STAIRS = registerBlock("black_pattern_block_stairs",
            () -> new StairBlock(BLACK_PATTERN_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(BLACK_PATTERN_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> BLACK_PATTERN_BLOCK_SLAB = registerBlock("black_pattern_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(BLACK_PATTERN_BLOCK.get())));


    //more bricks

    public static final DeferredBlock<Block> AMETIST_BRICKS = registerBlock("ametist_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.AMETHYST_BLOCK)));
    public static final DeferredBlock<StairBlock> AMETIST_BRICKS_STAIRS = registerBlock("ametist_bricks_stairs",
            () -> new StairBlock(AMETIST_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(AMETIST_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> AMETIST_BRICKS_SLAB = registerBlock("ametist_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(AMETIST_BRICKS.get())));


    public static final DeferredBlock<Block> POLISHED_ANDESITE_BRICKS = registerBlock("polished_andesite_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.POLISHED_ANDESITE)));
    public static final DeferredBlock<StairBlock> POLISHED_ANDESITE_BRICKS_STAIRS = registerBlock("polished_andesite_bricks_stairs",
            () -> new StairBlock(POLISHED_ANDESITE_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(POLISHED_ANDESITE_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> POLISHED_ANDESITE_BRICKS_SLAB = registerBlock("polished_andesite_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(POLISHED_ANDESITE_BRICKS.get())));

    public static final DeferredBlock<Block> POLISHED_DIORITE_BRICKS = registerBlock("polished_diorite_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.POLISHED_DIORITE)));
    public static final DeferredBlock<StairBlock> POLISHED_DIORITE_BRICKS_STAIRS = registerBlock("polished_diorite_bricks_stairs",
            () -> new StairBlock(POLISHED_DIORITE_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(POLISHED_DIORITE_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> POLISHED_DIORITE_BRICKS_SLAB = registerBlock("polished_diorite_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(POLISHED_DIORITE_BRICKS.get())));

    public static final DeferredBlock<Block> POLISHED_GRANITE_BRICKS = registerBlock("polished_granite_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.POLISHED_GRANITE)));
    public static final DeferredBlock<StairBlock> POLISHED_GRANITE_BRICKS_STAIRS = registerBlock("polished_granite_bricks_stairs",
            () -> new StairBlock(POLISHED_GRANITE_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(POLISHED_GRANITE_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> POLISHED_GRANITE_BRICKS_SLAB = registerBlock("polished_granite_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(POLISHED_GRANITE_BRICKS.get())));

    public static final DeferredBlock<Block> PURPUR_BRICKS = registerBlock("purpur_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.PURPUR_BLOCK)));
    public static final DeferredBlock<StairBlock> PURPUR_BRICKS_STAIRS = registerBlock("purpur_bricks_stairs",
            () -> new StairBlock(PURPUR_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(PURPUR_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> PURPUR_BRICKS_SLAB = registerBlock("purpur_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(PURPUR_BRICKS.get())));

    public static final DeferredBlock<Block> SMOOTH_BASALT_BRICKS = registerBlock("smooth_basalt_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.SMOOTH_BASALT)));
    public static final DeferredBlock<StairBlock> SMOOTH_BASALT_BRICKS_STAIRS = registerBlock("smooth_basalt_bricks_stairs",
            () -> new StairBlock(SMOOTH_BASALT_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(SMOOTH_BASALT_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> SMOOTH_BASALT_BRICKS_SLAB = registerBlock("smooth_basalt_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(SMOOTH_BASALT_BRICKS.get())));

    // COLORED BRICKS + STAIRS + SLABS
    public static final DeferredBlock<Block> WHITE_BRICKS = registerBlock("white_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> WHITE_BRICKS_STAIRS = registerBlock("white_bricks_stairs",
            () -> new StairBlock(WHITE_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(WHITE_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> WHITE_BRICKS_SLAB = registerBlock("white_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_BRICKS.get())));

    public static final DeferredBlock<Block> ORANGE_BRICKS = registerBlock("orange_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> ORANGE_BRICKS_STAIRS = registerBlock("orange_bricks_stairs",
            () -> new StairBlock(ORANGE_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(ORANGE_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> ORANGE_BRICKS_SLAB = registerBlock("orange_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(ORANGE_BRICKS.get())));

    public static final DeferredBlock<Block> MAGENTA_BRICKS = registerBlock("magenta_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> MAGENTA_BRICKS_STAIRS = registerBlock("magenta_bricks_stairs",
            () -> new StairBlock(MAGENTA_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(MAGENTA_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> MAGENTA_BRICKS_SLAB = registerBlock("magenta_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(MAGENTA_BRICKS.get())));

    public static final DeferredBlock<Block> LIGHT_BLUE_BRICKS = registerBlock("light_blue_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> LIGHT_BLUE_BRICKS_STAIRS = registerBlock("light_blue_bricks_stairs",
            () -> new StairBlock(LIGHT_BLUE_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(LIGHT_BLUE_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> LIGHT_BLUE_BRICKS_SLAB = registerBlock("light_blue_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(LIGHT_BLUE_BRICKS.get())));

    public static final DeferredBlock<Block> YELLOW_BRICKS = registerBlock("yellow_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> YELLOW_BRICKS_STAIRS = registerBlock("yellow_bricks_stairs",
            () -> new StairBlock(YELLOW_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(YELLOW_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> YELLOW_BRICKS_SLAB = registerBlock("yellow_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(YELLOW_BRICKS.get())));

    public static final DeferredBlock<Block> LIME_BRICKS = registerBlock("lime_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> LIME_BRICKS_STAIRS = registerBlock("lime_bricks_stairs",
            () -> new StairBlock(LIME_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(LIME_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> LIME_BRICKS_SLAB = registerBlock("lime_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(LIME_BRICKS.get())));

    public static final DeferredBlock<Block> PINK_BRICKS = registerBlock("pink_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> PINK_BRICKS_STAIRS = registerBlock("pink_bricks_stairs",
            () -> new StairBlock(PINK_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(PINK_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> PINK_BRICKS_SLAB = registerBlock("pink_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(PINK_BRICKS.get())));

    public static final DeferredBlock<Block> GRAY_BRICKS = registerBlock("gray_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> GRAY_BRICKS_STAIRS = registerBlock("gray_bricks_stairs",
            () -> new StairBlock(GRAY_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(GRAY_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> GRAY_BRICKS_SLAB = registerBlock("gray_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(GRAY_BRICKS.get())));

    public static final DeferredBlock<Block> LIGHT_GRAY_BRICKS = registerBlock("light_gray_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> LIGHT_GRAY_BRICKS_STAIRS = registerBlock("light_gray_bricks_stairs",
            () -> new StairBlock(LIGHT_GRAY_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(LIGHT_GRAY_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> LIGHT_GRAY_BRICKS_SLAB = registerBlock("light_gray_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(LIGHT_GRAY_BRICKS.get())));

    public static final DeferredBlock<Block> CYAN_BRICKS = registerBlock("cyan_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> CYAN_BRICKS_STAIRS = registerBlock("cyan_bricks_stairs",
            () -> new StairBlock(CYAN_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(CYAN_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> CYAN_BRICKS_SLAB = registerBlock("cyan_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(CYAN_BRICKS.get())));

    public static final DeferredBlock<Block> PURPLE_BRICKS = registerBlock("purple_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> PURPLE_BRICKS_STAIRS = registerBlock("purple_bricks_stairs",
            () -> new StairBlock(PURPLE_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(PURPLE_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> PURPLE_BRICKS_SLAB = registerBlock("purple_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(PURPLE_BRICKS.get())));

    public static final DeferredBlock<Block> BLUE_BRICKS = registerBlock("blue_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> BLUE_BRICKS_STAIRS = registerBlock("blue_bricks_stairs",
            () -> new StairBlock(BLUE_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(BLUE_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> BLUE_BRICKS_SLAB = registerBlock("blue_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(BLUE_BRICKS.get())));

    public static final DeferredBlock<Block> BROWN_BRICKS = registerBlock("brown_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> BROWN_BRICKS_STAIRS = registerBlock("brown_bricks_stairs",
            () -> new StairBlock(BROWN_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(BROWN_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> BROWN_BRICKS_SLAB = registerBlock("brown_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(BROWN_BRICKS.get())));

    public static final DeferredBlock<Block> GREEN_BRICKS = registerBlock("green_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> GREEN_BRICKS_STAIRS = registerBlock("green_bricks_stairs",
            () -> new StairBlock(GREEN_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(GREEN_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> GREEN_BRICKS_SLAB = registerBlock("green_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(GREEN_BRICKS.get())));

    public static final DeferredBlock<Block> RED_BRICKS = registerBlock("red_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> RED_BRICKS_STAIRS = registerBlock("red_bricks_stairs",
            () -> new StairBlock(RED_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(RED_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> RED_BRICKS_SLAB = registerBlock("red_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(RED_BRICKS.get())));

    public static final DeferredBlock<Block> BLACK_BRICKS = registerBlock("black_bricks",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.BRICKS)));
    public static final DeferredBlock<StairBlock> BLACK_BRICKS_STAIRS = registerBlock("black_bricks_stairs",
            () -> new StairBlock(BLACK_BRICKS.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(BLACK_BRICKS.get())));
    public static final DeferredBlock<SlabBlock> BLACK_BRICKS_SLAB = registerBlock("black_bricks_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(BLACK_BRICKS.get())));


    // WOOL STAIRS AND SLABS
    public static final DeferredBlock<StairBlock> WHITE_WOOL_STAIRS = registerBlock("white_wool_stairs",
            () -> new StairBlock(Blocks.WHITE_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.WHITE_WOOL)));
    public static final DeferredBlock<SlabBlock> WHITE_WOOL_SLAB = registerBlock("white_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.WHITE_WOOL)));

    public static final DeferredBlock<StairBlock> ORANGE_WOOL_STAIRS = registerBlock("orange_wool_stairs",
            () -> new StairBlock(Blocks.ORANGE_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.ORANGE_WOOL)));
    public static final DeferredBlock<SlabBlock> ORANGE_WOOL_SLAB = registerBlock("orange_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.ORANGE_WOOL)));

    public static final DeferredBlock<StairBlock> MAGENTA_WOOL_STAIRS = registerBlock("magenta_wool_stairs",
            () -> new StairBlock(Blocks.MAGENTA_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.MAGENTA_WOOL)));
    public static final DeferredBlock<SlabBlock> MAGENTA_WOOL_SLAB = registerBlock("magenta_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.MAGENTA_WOOL)));

    public static final DeferredBlock<StairBlock> LIGHT_BLUE_WOOL_STAIRS = registerBlock("light_blue_wool_stairs",
            () -> new StairBlock(Blocks.LIGHT_BLUE_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.LIGHT_BLUE_WOOL)));
    public static final DeferredBlock<SlabBlock> LIGHT_BLUE_WOOL_SLAB = registerBlock("light_blue_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.LIGHT_BLUE_WOOL)));

    public static final DeferredBlock<StairBlock> YELLOW_WOOL_STAIRS = registerBlock("yellow_wool_stairs",
            () -> new StairBlock(Blocks.YELLOW_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.YELLOW_WOOL)));
    public static final DeferredBlock<SlabBlock> YELLOW_WOOL_SLAB = registerBlock("yellow_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.YELLOW_WOOL)));

    public static final DeferredBlock<StairBlock> LIME_WOOL_STAIRS = registerBlock("lime_wool_stairs",
            () -> new StairBlock(Blocks.LIME_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.LIME_WOOL)));
    public static final DeferredBlock<SlabBlock> LIME_WOOL_SLAB = registerBlock("lime_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.LIME_WOOL)));

    public static final DeferredBlock<StairBlock> PINK_WOOL_STAIRS = registerBlock("pink_wool_stairs",
            () -> new StairBlock(Blocks.PINK_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.PINK_WOOL)));
    public static final DeferredBlock<SlabBlock> PINK_WOOL_SLAB = registerBlock("pink_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.PINK_WOOL)));

    public static final DeferredBlock<StairBlock> GRAY_WOOL_STAIRS = registerBlock("gray_wool_stairs",
            () -> new StairBlock(Blocks.GRAY_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.GRAY_WOOL)));
    public static final DeferredBlock<SlabBlock> GRAY_WOOL_SLAB = registerBlock("gray_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.GRAY_WOOL)));

    public static final DeferredBlock<StairBlock> LIGHT_GRAY_WOOL_STAIRS = registerBlock("light_gray_wool_stairs",
            () -> new StairBlock(Blocks.LIGHT_GRAY_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.LIGHT_GRAY_WOOL)));
    public static final DeferredBlock<SlabBlock> LIGHT_GRAY_WOOL_SLAB = registerBlock("light_gray_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.LIGHT_GRAY_WOOL)));

    public static final DeferredBlock<StairBlock> CYAN_WOOL_STAIRS = registerBlock("cyan_wool_stairs",
            () -> new StairBlock(Blocks.CYAN_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.CYAN_WOOL)));
    public static final DeferredBlock<SlabBlock> CYAN_WOOL_SLAB = registerBlock("cyan_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.CYAN_WOOL)));

    public static final DeferredBlock<StairBlock> PURPLE_WOOL_STAIRS = registerBlock("purple_wool_stairs",
            () -> new StairBlock(Blocks.PURPLE_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.PURPLE_WOOL)));
    public static final DeferredBlock<SlabBlock> PURPLE_WOOL_SLAB = registerBlock("purple_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.PURPLE_WOOL)));

    public static final DeferredBlock<StairBlock> BLUE_WOOL_STAIRS = registerBlock("blue_wool_stairs",
            () -> new StairBlock(Blocks.BLUE_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.BLUE_WOOL)));
    public static final DeferredBlock<SlabBlock> BLUE_WOOL_SLAB = registerBlock("blue_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.BLUE_WOOL)));

    public static final DeferredBlock<StairBlock> BROWN_WOOL_STAIRS = registerBlock("brown_wool_stairs",
            () -> new StairBlock(Blocks.BROWN_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.BROWN_WOOL)));
    public static final DeferredBlock<SlabBlock> BROWN_WOOL_SLAB = registerBlock("brown_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.BROWN_WOOL)));

    public static final DeferredBlock<StairBlock> GREEN_WOOL_STAIRS = registerBlock("green_wool_stairs",
            () -> new StairBlock(Blocks.GREEN_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.GREEN_WOOL)));
    public static final DeferredBlock<SlabBlock> GREEN_WOOL_SLAB = registerBlock("green_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.GREEN_WOOL)));

    public static final DeferredBlock<StairBlock> RED_WOOL_STAIRS = registerBlock("red_wool_stairs",
            () -> new StairBlock(Blocks.RED_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.RED_WOOL)));
    public static final DeferredBlock<SlabBlock> RED_WOOL_SLAB = registerBlock("red_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.RED_WOOL)));

    public static final DeferredBlock<StairBlock> BLACK_WOOL_STAIRS = registerBlock("black_wool_stairs",
            () -> new StairBlock(Blocks.BLACK_WOOL.defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(Blocks.BLACK_WOOL)));
    public static final DeferredBlock<SlabBlock> BLACK_WOOL_SLAB = registerBlock("black_wool_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.BLACK_WOOL)));

    public static final DeferredBlock<Block> MESH_IRON = registerBlock("mesh_iron",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK)
                    .strength(5.0f, 6.0f)
                    .noOcclusion()
    ));
    //POOL TILES

    public static final DeferredBlock<Block> POOL_TILES = registerBlock("pool_tiles",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK)
                    .strength(5.0f, 6.0f)
                    .noOcclusion()
    ));

    public static final DeferredBlock<Block> POOL_TILES1 = registerBlock("pool_tiles1",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(ModBlocks.POOL_TILES.get())
            ));

    public static final DeferredBlock<StairBlock> POOL_TILES_STAIRS = registerBlock("pool_tiles_stairs",
            () -> new StairBlock(ModBlocks.POOL_TILES.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(ModBlocks.POOL_TILES.get())));
    public static final DeferredBlock<SlabBlock> POOL_TILES_SLAB = registerBlock("pool_tiles_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(ModBlocks.POOL_TILES.get())));


    public static final DeferredBlock<StairBlock> POOL_TILES1_STAIRS = registerBlock("pool_tiles1_stairs",
            () -> new StairBlock(ModBlocks.POOL_TILES1.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(ModBlocks.POOL_TILES1.get())));
    public static final DeferredBlock<SlabBlock> POOL_TILES1_SLAB = registerBlock("pool_tiles1_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(ModBlocks.POOL_TILES1.get())));


    //GRATES

    public static final DeferredBlock<Block> IRON_GRATE = registerBlock("iron_grate",
            () -> new GrateBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_GRATE)
                    .strength(5.0f, 6.0f)
                    .noOcclusion()
    ));

    public static final DeferredBlock<Block> GOLD_GRATE = registerBlock("gold_grate",
            () -> new GrateBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_GRATE)
                    .strength(3.0f, 4.0f)
                    .noOcclusion()
    ));

    public static final DeferredBlock<Block> DIAMOND_GRATE = registerBlock("diamond_grate",
            () -> new GrateBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_GRATE)
                    .strength(5.0f, 6.0f)
                    .noOcclusion()
    ));

    public static final DeferredBlock<Block> NETHERITE_GRATE = registerBlock("netherite_grate",
            () -> new GrateBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_GRATE)
                    .strength(6.0f, 7.0f)
                    .noOcclusion()
                    .explosionResistance(1200.0f)
    ));

    public static final DeferredBlock<Block> AMETHYST_GRATE = registerBlock("amethyst_grate",
            () -> new GrateBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_GRATE)
                    .strength(3.0f, 4.0f)
                    .noOcclusion()
    ));

    public static final DeferredBlock<Block> OBSIDIAN_GRATE = registerBlock("obsidian_grate",
            () -> new GrateBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.COPPER_GRATE)
                    .strength(50.0f, 1200.0f)
                    .noOcclusion()
                    .explosionResistance(1200.0f)
    ));

    //GLOW BLOCK

    public static final DeferredBlock<Block> LIME_GLOW_BLOCK = registerBlock("lime_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(Blocks.IRON_BLOCK)
                    .emissiveRendering((state, level, pos) -> true)
                    .lightLevel(blockstate -> 15)
                    .hasPostProcess((bs, br, bp) -> true)
                    .noOcclusion()
            ));

    public static final DeferredBlock<Block> WHITE_GLOW_BLOCK = registerBlock("white_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> LIGHT_GRAY_GLOW_BLOCK = registerBlock("light_gray_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> GRAY_GLOW_BLOCK = registerBlock("gray_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> BLACK_GLOW_BLOCK = registerBlock("black_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> BROWN_GLOW_BLOCK = registerBlock("brown_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> RED_GLOW_BLOCK = registerBlock("red_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> ORANGE_GLOW_BLOCK = registerBlock("orange_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> YELLOW_GLOW_BLOCK = registerBlock("yellow_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> GREEN_GLOW_BLOCK = registerBlock("green_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> CYAN_GLOW_BLOCK = registerBlock("cyan_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> LIGHT_BLUE_GLOW_BLOCK = registerBlock("light_blue_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> BLUE_GLOW_BLOCK = registerBlock("blue_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> PURPLE_GLOW_BLOCK = registerBlock("purple_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> MAGENTA_GLOW_BLOCK = registerBlock("magenta_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<Block> PINK_GLOW_BLOCK = registerBlock("pink_glow_block",
            () -> new Block(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    // GlowBlock stairs/slabs

    public static final DeferredBlock<StairBlock> LIME_GLOW_BLOCK_STAIRS = registerBlock("lime_glow_block_stairs",
            () -> new StairBlock(LIME_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> LIME_GLOW_BLOCK_SLAB = registerBlock("lime_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> WHITE_GLOW_BLOCK_STAIRS = registerBlock("white_glow_block_stairs",
            () -> new StairBlock(WHITE_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(WHITE_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> WHITE_GLOW_BLOCK_SLAB = registerBlock("white_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(WHITE_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> LIGHT_GRAY_GLOW_BLOCK_STAIRS = registerBlock("light_gray_glow_block_stairs",
            () -> new StairBlock(LIGHT_GRAY_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(LIGHT_GRAY_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> LIGHT_GRAY_GLOW_BLOCK_SLAB = registerBlock("light_gray_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(LIGHT_GRAY_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> GRAY_GLOW_BLOCK_STAIRS = registerBlock("gray_glow_block_stairs",
            () -> new StairBlock(GRAY_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(GRAY_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> GRAY_GLOW_BLOCK_SLAB = registerBlock("gray_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(GRAY_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> BLACK_GLOW_BLOCK_STAIRS = registerBlock("black_glow_block_stairs",
            () -> new StairBlock(BLACK_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(BLACK_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> BLACK_GLOW_BLOCK_SLAB = registerBlock("black_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(BLACK_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> BROWN_GLOW_BLOCK_STAIRS = registerBlock("brown_glow_block_stairs",
            () -> new StairBlock(BROWN_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(BROWN_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> BROWN_GLOW_BLOCK_SLAB = registerBlock("brown_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(BROWN_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> RED_GLOW_BLOCK_STAIRS = registerBlock("red_glow_block_stairs",
            () -> new StairBlock(RED_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(RED_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> RED_GLOW_BLOCK_SLAB = registerBlock("red_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(RED_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> ORANGE_GLOW_BLOCK_STAIRS = registerBlock("orange_glow_block_stairs",
            () -> new StairBlock(ORANGE_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(ORANGE_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> ORANGE_GLOW_BLOCK_SLAB = registerBlock("orange_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(ORANGE_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> YELLOW_GLOW_BLOCK_STAIRS = registerBlock("yellow_glow_block_stairs",
            () -> new StairBlock(YELLOW_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(YELLOW_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> YELLOW_GLOW_BLOCK_SLAB = registerBlock("yellow_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(YELLOW_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> GREEN_GLOW_BLOCK_STAIRS = registerBlock("green_glow_block_stairs",
            () -> new StairBlock(GREEN_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(GREEN_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> GREEN_GLOW_BLOCK_SLAB = registerBlock("green_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(GREEN_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> CYAN_GLOW_BLOCK_STAIRS = registerBlock("cyan_glow_block_stairs",
            () -> new StairBlock(CYAN_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(CYAN_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> CYAN_GLOW_BLOCK_SLAB = registerBlock("cyan_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(CYAN_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> LIGHT_BLUE_GLOW_BLOCK_STAIRS = registerBlock("light_blue_glow_block_stairs",
            () -> new StairBlock(LIGHT_BLUE_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(LIGHT_BLUE_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> LIGHT_BLUE_GLOW_BLOCK_SLAB = registerBlock("light_blue_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(LIGHT_BLUE_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> BLUE_GLOW_BLOCK_STAIRS = registerBlock("blue_glow_block_stairs",
            () -> new StairBlock(BLUE_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(BLUE_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> BLUE_GLOW_BLOCK_SLAB = registerBlock("blue_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(BLUE_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> PURPLE_GLOW_BLOCK_STAIRS = registerBlock("purple_glow_block_stairs",
            () -> new StairBlock(PURPLE_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(PURPLE_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> PURPLE_GLOW_BLOCK_SLAB = registerBlock("purple_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(PURPLE_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> MAGENTA_GLOW_BLOCK_STAIRS = registerBlock("magenta_glow_block_stairs",
            () -> new StairBlock(MAGENTA_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(MAGENTA_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> MAGENTA_GLOW_BLOCK_SLAB = registerBlock("magenta_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(MAGENTA_GLOW_BLOCK.get())));

    public static final DeferredBlock<StairBlock> PINK_GLOW_BLOCK_STAIRS = registerBlock("pink_glow_block_stairs",
            () -> new StairBlock(PINK_GLOW_BLOCK.get().defaultBlockState(), BlockBehaviour.Properties.ofFullCopy(PINK_GLOW_BLOCK.get())));
    public static final DeferredBlock<SlabBlock> PINK_GLOW_BLOCK_SLAB = registerBlock("pink_glow_block_slab",
            () -> new SlabBlock(BlockBehaviour.Properties.ofFullCopy(PINK_GLOW_BLOCK.get())));

    //GlowGlass
    public static final DeferredBlock<Block> LIME_GLOW_STAINED_GLASS = registerBlock("lime_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(Blocks.GLASS)
                    .emissiveRendering(((blockState, blockGetter, blockPos) -> true))
                    .lightLevel(blockstate -> 13)
                    .noOcclusion()
                    .hasPostProcess((bs, br, bp) -> true))
    );

    public static final DeferredBlock<Block> WHITE_GLOW_STAINED_GLASS = registerBlock("white_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> LIGHT_GRAY_GLOW_STAINED_GLASS = registerBlock("light_gray_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> GRAY_GLOW_STAINED_GLASS = registerBlock("gray_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> BLACK_GLOW_STAINED_GLASS = registerBlock("black_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> BROWN_GLOW_STAINED_GLASS = registerBlock("brown_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> RED_GLOW_STAINED_GLASS = registerBlock("red_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> ORANGE_GLOW_STAINED_GLASS = registerBlock("orange_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> YELLOW_GLOW_STAINED_GLASS = registerBlock("yellow_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> GREEN_GLOW_STAINED_GLASS = registerBlock("green_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> CYAN_GLOW_STAINED_GLASS = registerBlock("cyan_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> LIGHT_BLUE_GLOW_STAINED_GLASS = registerBlock("light_blue_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> BLUE_GLOW_STAINED_GLASS = registerBlock("blue_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> PURPLE_GLOW_STAINED_GLASS = registerBlock("purple_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> MAGENTA_GLOW_STAINED_GLASS = registerBlock("magenta_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    public static final DeferredBlock<Block> PINK_GLOW_STAINED_GLASS = registerBlock("pink_glow_stained_glass",
            () -> new GlowGlassBlock(BlockBehaviour.Properties.ofFullCopy(LIME_GLOW_STAINED_GLASS.get())));

    private static <T extends Block> DeferredBlock<T> registerBlock(String name, Supplier<T> block) {
        DeferredBlock<T> toReturn = BLOCKS.register(name, block);
        registerBlockItem(name, toReturn);
        return toReturn;
    }



    private static <T extends Block> void registerBlockItem(String name, DeferredBlock<T> block) {
        ModItems.ITEMS.register(name, () -> new BlockItem(block.get(), new Item.Properties()));
    }

    public static void register(IEventBus eventBus) {
        BLOCKS.register(eventBus);
    }
}
