package twilightforest.block;

import net.minecraft.block.*;
import net.minecraft.block.material.Material;
import net.minecraft.block.material.MaterialColor;
import net.minecraft.item.Item;
import net.minecraft.util.Direction;
import net.minecraftforge.common.ToolType;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import twilightforest.TwilightForestMod;
import twilightforest.compat.TFCompat;
import twilightforest.enums.*;
import twilightforest.item.TFItems;
import twilightforest.world.feature.tree.*;

import javax.annotation.Nonnull;

@SuppressWarnings({"WeakerAccess", "unused"})
@Nonnull
@Mod.EventBusSubscriber(modid = TwilightForestMod.ID, bus = Mod.EventBusSubscriber.Bus.MOD)
public class TFBlocks {
	public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, TwilightForestMod.ID);

	public static final RegistryObject<RotatedPillarBlock> oak_log                = BLOCKS.register("twilight_oak_log", () -> new TFLogBlock(logProperties(MaterialColor.WOOD, MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> canopy_log             = BLOCKS.register("canopy_log", () -> new TFLogBlock(logProperties(MaterialColor.OBSIDIAN, MaterialColor.BROWN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> mangrove_log           = BLOCKS.register("mangrove_log", () -> new TFLogBlock(logProperties(MaterialColor.DIRT, MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> dark_log               = BLOCKS.register("dark_log", () -> new TFLogBlock(logProperties(MaterialColor.BROWN, MaterialColor.STONE).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_oak_log       = BLOCKS.register("stripped_twilight_oak_log", () -> new TFLogBlock(logProperties(MaterialColor.WOOD).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_canopy_log    = BLOCKS.register("stripped_canopy_log", () -> new TFLogBlock(logProperties(MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_mangrove_log  = BLOCKS.register("stripped_mangrove_log", () -> new TFLogBlock(logProperties(MaterialColor.DIRT).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_dark_log      = BLOCKS.register("stripped_dark_log", () -> new TFLogBlock(logProperties(MaterialColor.BROWN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> oak_wood               = BLOCKS.register("twilight_oak_wood", () -> new TFLogBlock(logProperties(MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> canopy_wood            = BLOCKS.register("canopy_wood", () -> new TFLogBlock(logProperties(MaterialColor.BROWN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> mangrove_wood          = BLOCKS.register("mangrove_wood", () -> new TFLogBlock(logProperties(MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> dark_wood              = BLOCKS.register("dark_wood", () -> new TFLogBlock(logProperties(MaterialColor.STONE).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_oak_wood      = BLOCKS.register("stripped_twilight_oak_wood", () -> new TFLogBlock(logProperties(MaterialColor.WOOD, MaterialColor.WOOD).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_canopy_wood   = BLOCKS.register("stripped_canopy_wood", () -> new TFLogBlock(logProperties(MaterialColor.OBSIDIAN, MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_mangrove_wood = BLOCKS.register("stripped_mangrove_wood", () -> new TFLogBlock(logProperties(MaterialColor.DIRT, MaterialColor.DIRT).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_dark_wood     = BLOCKS.register("stripped_dark_wood", () -> new TFLogBlock(logProperties(MaterialColor.ADOBE, MaterialColor.ADOBE).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> oak_leaves                 = BLOCKS.register("twilight_oak_leaves", () -> new TFLeavesBlock(Block.Properties.create(Material.LEAVES).hardnessAndResistance(0.2F).tickRandomly().notSolid().sound(SoundType.PLANT).harvestTool(ToolType.HOE)));
	public static final RegistryObject<Block> canopy_leaves              = BLOCKS.register("canopy_leaves", () -> new TFLeavesBlock(Block.Properties.create(Material.LEAVES).hardnessAndResistance(0.2F).tickRandomly().notSolid().sound(SoundType.PLANT).harvestTool(ToolType.HOE)));
	public static final RegistryObject<Block> mangrove_leaves            = BLOCKS.register("mangrove_leaves", () -> new TFLeavesBlock(Block.Properties.create(Material.LEAVES).hardnessAndResistance(0.2F).tickRandomly().notSolid().sound(SoundType.PLANT).harvestTool(ToolType.HOE)));
	public static final RegistryObject<Block> dark_leaves                = BLOCKS.register("dark_leaves", () -> new DarkLeavesBlock(Block.Properties.create(Material.LEAVES).hardnessAndResistance(2.0F, 10.0F).sound(SoundType.PLANT).harvestTool(ToolType.HOE)));
	public static final RegistryObject<Block> rainboak_leaves            = BLOCKS.register("rainboak_leaves", () -> new TFLeavesBlock(Block.Properties.create(Material.LEAVES).hardnessAndResistance(0.2F).tickRandomly().notSolid().sound(SoundType.PLANT).harvestTool(ToolType.HOE)));
	public static final RegistryObject<TFPortalBlock> twilight_portal    = BLOCKS.register("twilight_portal", () -> new TFPortalBlock(Block.Properties.create(Material.PORTAL).hardnessAndResistance(-1.0F).sound(SoundType.GLASS).setLightLevel((state) -> 11).doesNotBlockMovement().notSolid().noDrops()));
	public static final RegistryObject<Block> maze_stone                 = BLOCKS.register("maze_stone", () -> new MazestoneBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(100.0F, 5.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> maze_stone_brick           = BLOCKS.register("maze_stone_brick", () -> new MazestoneBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(100.0F, 5.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> maze_stone_chiseled        = BLOCKS.register("maze_stone_chiseled", () -> new MazestoneBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(100.0F, 5.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> maze_stone_decorative      = BLOCKS.register("maze_stone_decorative", () -> new MazestoneBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(100.0F, 5.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> maze_stone_cracked         = BLOCKS.register("maze_stone_cracked", () -> new MazestoneBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(100.0F, 5.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> maze_stone_mossy           = BLOCKS.register("maze_stone_mossy", () -> new MazestoneBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(100.0F, 5.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> maze_stone_mosaic          = BLOCKS.register("maze_stone_mosaic", () -> new MazestoneBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(100.0F, 5.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> maze_stone_border          = BLOCKS.register("maze_stone_border", () -> new MazestoneBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(100.0F, 5.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> hedge                      = BLOCKS.register("hedge", () -> new HedgeBlock(Block.Properties.create(Material.CACTUS).harvestTool(ToolType.AXE).hardnessAndResistance(2.0F, 10.0F).sound(SoundType.PLANT)));
	public static final RegistryObject<Block> boss_spawner_naga          = BLOCKS.register("boss_spawner_naga", () -> new BossSpawnerBlock(Block.Properties.create(Material.ROCK).hardnessAndResistance(-1.0F).notSolid().noDrops(), BossVariant.NAGA));
	public static final RegistryObject<Block> boss_spawner_lich          = BLOCKS.register("boss_spawner_lich", () -> new BossSpawnerBlock(Block.Properties.create(Material.ROCK).hardnessAndResistance(-1.0F).notSolid().noDrops(), BossVariant.LICH));
	public static final RegistryObject<Block> boss_spawner_hydra         = BLOCKS.register("boss_spawner_hydra", () -> new BossSpawnerBlock(Block.Properties.create(Material.ROCK).hardnessAndResistance(-1.0F).notSolid().noDrops(), BossVariant.HYDRA));
	public static final RegistryObject<Block> boss_spawner_ur_ghast      = BLOCKS.register("boss_spawner_ur_ghast", () -> new BossSpawnerBlock(Block.Properties.create(Material.ROCK).hardnessAndResistance(-1.0F).notSolid().noDrops(), BossVariant.UR_GHAST));
	public static final RegistryObject<Block> boss_spawner_knight_phantom = BLOCKS.register("boss_spawner_knight_phantom", () -> new BossSpawnerBlock(Block.Properties.create(Material.ROCK).hardnessAndResistance(-1.0F).notSolid().noDrops(), BossVariant.KNIGHT_PHANTOM));
	public static final RegistryObject<Block> boss_spawner_snow_queen    = BLOCKS.register("boss_spawner_snow_queen", () -> new BossSpawnerBlock(Block.Properties.create(Material.ROCK).hardnessAndResistance(-1.0F).notSolid().noDrops(), BossVariant.SNOW_QUEEN));
	public static final RegistryObject<Block> boss_spawner_minoshroom    = BLOCKS.register("boss_spawner_minoshroom", () -> new BossSpawnerBlock(Block.Properties.create(Material.ROCK).hardnessAndResistance(-1.0F).notSolid().noDrops(), BossVariant.MINOSHROOM));
	public static final RegistryObject<Block> boss_spawner_alpha_yeti    = BLOCKS.register("boss_spawner_alpha_yeti", () -> new BossSpawnerBlock(Block.Properties.create(Material.ROCK).hardnessAndResistance(-1.0F).notSolid().noDrops(), BossVariant.ALPHA_YETI));
	public static final RegistryObject<Block> boss_spawner_final_boss    = BLOCKS.register("boss_spawner_final_boss", () -> new BossSpawnerBlock(Block.Properties.create(Material.ROCK).hardnessAndResistance(-1.0F).notSolid().noDrops(), BossVariant.FINAL_BOSS));
	public static final RegistryObject<Block> firefly_jar                = BLOCKS.register("firefly_jar", () -> new JarBlock(Block.Properties.create(Material.GLASS).hardnessAndResistance(0.3F, 0.0F).sound(SoundType.WOOD).setLightLevel((state) -> 15).notSolid()));
	public static final RegistryObject<Block> cicada_jar                 = BLOCKS.register("cicada_jar", () -> new JarBlock(Block.Properties.create(Material.GLASS).hardnessAndResistance(0.3F, 0.0F).sound(SoundType.WOOD).notSolid().tickRandomly()));
	public static final RegistryObject<Block> moss_patch                 = BLOCKS.register("moss_patch", () -> new TFPlantBlock(PlantVariant.MOSSPATCH, Block.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().notSolid()));
	public static final RegistryObject<Block> mayapple                   = BLOCKS.register("mayapple", () -> new TFPlantBlock(PlantVariant.MAYAPPLE, Block.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().notSolid()));
	public static final RegistryObject<Block> clover_patch               = BLOCKS.register("clover_patch", () -> new TFPlantBlock(PlantVariant.CLOVERPATCH, Block.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().notSolid()));
	public static final RegistryObject<Block> fiddlehead                 = BLOCKS.register("fiddlehead", () -> new TFPlantBlock(PlantVariant.FIDDLEHEAD, Block.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().notSolid()));
	public static final RegistryObject<Block> mushgloom                  = BLOCKS.register("mushgloom", () -> new TFPlantBlock(PlantVariant.MUSHGLOOM, Block.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().notSolid().setLightLevel((state) -> 3)));
	public static final RegistryObject<Block> torchberry_plant           = BLOCKS.register("torchberry_plant", () -> new TFPlantBlock(PlantVariant.TORCHBERRY, Block.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().notSolid().setLightLevel((state) -> 8)));
	public static final RegistryObject<Block> root_strand                = BLOCKS.register("root_strand", () -> new TFPlantBlock(PlantVariant.ROOT_STRAND, Block.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().notSolid()));
	public static final RegistryObject<Block> fallen_leaves              = BLOCKS.register("fallen_leaves", () -> new TFPlantBlock(PlantVariant.FALLEN_LEAVES, Block.Properties.create(Material.TALL_PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().notSolid()));
	public static final RegistryObject<Block> root                       = BLOCKS.register("root", () -> new Block(Block.Properties.create(Material.WOOD).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> liveroot_block             = BLOCKS.register("liveroot_block", () -> new Block(Block.Properties.create(Material.WOOD).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> uncrafting_table           = BLOCKS.register("uncrafting_table", UncraftingTableBlock::new);
	public static final RegistryObject<Block> smoker                     = BLOCKS.register("smoker", () -> new TFSmokerBlock(Block.Properties.create(Material.ROCK, MaterialColor.GRASS).hardnessAndResistance(1.5F, 0.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> encased_smoker             = BLOCKS.register("encased_smoker", () -> new EncasedSmokerBlock(Block.Properties.create(Material.WOOD, MaterialColor.SAND).setRequiresTool().harvestTool(ToolType.AXE).hardnessAndResistance(1.5F, 0.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> fire_jet                   = BLOCKS.register("fire_jet", () -> new FireJetBlock(Block.Properties.create(Material.ROCK, MaterialColor.GRASS).hardnessAndResistance(1.5F, 0.0F).sound(SoundType.WOOD).tickRandomly().setLightLevel((state) -> state.get(FireJetBlock.STATE) != FireJetVariant.FLAME ? 0 : 15)));
	public static final RegistryObject<Block> encased_fire_jet           = BLOCKS.register("encased_fire_jet", () -> new EncasedFireJetBlock(Block.Properties.create(Material.WOOD, MaterialColor.SAND).setRequiresTool().harvestTool(ToolType.AXE).hardnessAndResistance(1.5F, 0.0F).sound(SoundType.WOOD).setLightLevel((state) -> 15)));
	public static final RegistryObject<Block> naga_stone_head            = BLOCKS.register("naga_stone_head", () -> new TFHorizontalBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(1.5F, 10.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> naga_stone                 = BLOCKS.register("naga_stone", () -> new NagastoneBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(1.5F, 10.0F).sound(SoundType.STONE)));
	public static final RegistryObject<SaplingBlock> oak_sapling            = BLOCKS.register("twilight_oak_sapling", () -> new SaplingBlock(new SmallOakTree(), AbstractBlock.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().tickRandomly()));
	public static final RegistryObject<SaplingBlock> canopy_sapling         = BLOCKS.register("canopy_sapling", () -> new SaplingBlock(new CanopyTree(), AbstractBlock.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().tickRandomly()));
	public static final RegistryObject<SaplingBlock> mangrove_sapling       = BLOCKS.register("mangrove_sapling", () -> new MangroveSaplingBlock(new MangroveTree(), AbstractBlock.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().tickRandomly()));
	public static final RegistryObject<SaplingBlock> darkwood_sapling       = BLOCKS.register("darkwood_sapling", () -> new SaplingBlock(new DarkCanopyTree(), AbstractBlock.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().tickRandomly()));
	public static final RegistryObject<SaplingBlock> hollow_oak_sapling     = BLOCKS.register("hollow_oak_sapling", () -> new SaplingBlock(new HollowTree(), AbstractBlock.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().tickRandomly()));
	public static final RegistryObject<SaplingBlock> time_sapling           = BLOCKS.register("time_sapling", () -> new SaplingBlock(new TimeTree(), AbstractBlock.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().tickRandomly()));
	public static final RegistryObject<SaplingBlock> transformation_sapling = BLOCKS.register("transformation_sapling", () -> new SaplingBlock(new TransformationTree(), AbstractBlock.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().tickRandomly()));
	public static final RegistryObject<SaplingBlock> mining_sapling         = BLOCKS.register("mining_sapling", () -> new SaplingBlock(new MinersTree(), AbstractBlock.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().tickRandomly()));
	public static final RegistryObject<SaplingBlock> sorting_sapling        = BLOCKS.register("sorting_sapling", () -> new SaplingBlock(new SortingTree(), AbstractBlock.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().tickRandomly()));
	public static final RegistryObject<SaplingBlock> rainboak_sapling       = BLOCKS.register("rainboak_sapling", () -> new SaplingBlock(new RainboakTree(), AbstractBlock.Properties.create(Material.PLANTS).hardnessAndResistance(0.0F).sound(SoundType.PLANT).doesNotBlockMovement().tickRandomly()));
	public static final RegistryObject<RotatedPillarBlock> time_log                     = BLOCKS.register("time_log", () -> new TFLogBlock(logProperties(MaterialColor.DIRT, MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> transformation_log           = BLOCKS.register("transformation_log", () -> new TFLogBlock(logProperties(MaterialColor.WOOD, MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> mining_log                   = BLOCKS.register("mining_log", () -> new TFLogBlock(logProperties(MaterialColor.SAND, MaterialColor.QUARTZ).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> sorting_log                  = BLOCKS.register("sorting_log", () -> new TFLogBlock(logProperties(MaterialColor.OBSIDIAN, MaterialColor.BROWN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_time_log            = BLOCKS.register("stripped_time_log", () -> new TFLogBlock(logProperties(MaterialColor.DIRT).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_transformation_log  = BLOCKS.register("stripped_transformation_log", () -> new TFLogBlock(logProperties(MaterialColor.WOOD).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_mining_log          = BLOCKS.register("stripped_mining_log", () -> new TFLogBlock(logProperties(MaterialColor.SAND).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_sorting_log         = BLOCKS.register("stripped_sorting_log", () -> new TFLogBlock(logProperties(MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> time_wood                    = BLOCKS.register("time_wood", () -> new TFLogBlock(logProperties(MaterialColor.DIRT).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> transformation_wood          = BLOCKS.register("transformation_wood", () -> new TFLogBlock(logProperties(MaterialColor.WOOD).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> mining_wood                  = BLOCKS.register("mining_wood", () -> new TFLogBlock(logProperties(MaterialColor.SAND).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> sorting_wood                 = BLOCKS.register("sorting_wood", () -> new TFLogBlock(logProperties(MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_time_wood           = BLOCKS.register("stripped_time_wood", () -> new TFLogBlock(logProperties(MaterialColor.DIRT).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_transformation_wood = BLOCKS.register("stripped_transformation_wood", () -> new TFLogBlock(logProperties(MaterialColor.WOOD).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_mining_wood         = BLOCKS.register("stripped_mining_wood", () -> new TFLogBlock(logProperties(MaterialColor.SAND).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<RotatedPillarBlock> stripped_sorting_wood        = BLOCKS.register("stripped_sorting_wood", () -> new TFLogBlock(logProperties(MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> time_log_core              = BLOCKS.register("time_log_core", () -> new SpecialMagicLogBlock(logProperties(MaterialColor.DIRT, MaterialColor.OBSIDIAN), MagicWoodVariant.TIME));
	public static final RegistryObject<Block> transformation_log_core    = BLOCKS.register("transformation_log_core", () -> new SpecialMagicLogBlock(logProperties(MaterialColor.WOOD, MaterialColor.OBSIDIAN), MagicWoodVariant.TRANS));
	public static final RegistryObject<Block> mining_log_core            = BLOCKS.register("mining_log_core", () -> new SpecialMagicLogBlock(logProperties(MaterialColor.SAND, MaterialColor.QUARTZ), MagicWoodVariant.MINE));
	public static final RegistryObject<Block> sorting_log_core           = BLOCKS.register("sorting_log_core", () -> new SpecialMagicLogBlock(logProperties(MaterialColor.OBSIDIAN, MaterialColor.BROWN), MagicWoodVariant.SORT));
	public static final RegistryObject<Block> time_leaves                = BLOCKS.register("time_leaves", () -> new MagicLeavesBlock(Block.Properties.create(Material.LEAVES).hardnessAndResistance(0.2F).sound(SoundType.PLANT).tickRandomly().notSolid().harvestTool(ToolType.HOE)));
	public static final RegistryObject<Block> transformation_leaves      = BLOCKS.register("transformation_leaves", () -> new MagicLeavesBlock(Block.Properties.create(Material.LEAVES).hardnessAndResistance(0.2F).sound(SoundType.PLANT).tickRandomly().notSolid().harvestTool(ToolType.HOE)));
	public static final RegistryObject<Block> mining_leaves              = BLOCKS.register("mining_leaves", () -> new MagicLeavesBlock(Block.Properties.create(Material.LEAVES).hardnessAndResistance(0.2F).sound(SoundType.PLANT).tickRandomly().notSolid().harvestTool(ToolType.HOE)));
	public static final RegistryObject<Block> sorting_leaves             = BLOCKS.register("sorting_leaves", () -> new MagicLeavesBlock(Block.Properties.create(Material.LEAVES).hardnessAndResistance(0.2F).sound(SoundType.PLANT).tickRandomly().notSolid().harvestTool(ToolType.HOE)));
	public static final RegistryObject<Block> firefly                    = BLOCKS.register("firefly", () -> new FireflyBlock(Block.Properties.create(new Material.Builder(MaterialColor.AIR).doesNotBlockMovement().notSolid().replaceable().build()).setLightLevel((state) -> 15).sound(SoundType.SLIME).hardnessAndResistance(0.0F).doesNotBlockMovement()));
	public static final RegistryObject<Block> cicada                     = BLOCKS.register("cicada", () -> new CicadaBlock(Block.Properties.create(new Material.Builder(MaterialColor.AIR).doesNotBlockMovement().notSolid().replaceable().build()).sound(SoundType.SLIME).hardnessAndResistance(0.0F).doesNotBlockMovement()));
	public static final RegistryObject<Block> moonworm                   = BLOCKS.register("moonworm", () -> new MoonwormBlock(Block.Properties.create(new Material.Builder(MaterialColor.AIR).doesNotBlockMovement().notSolid().replaceable().build()).setLightLevel((state) -> 14).sound(SoundType.SLIME).hardnessAndResistance(0.0F).doesNotBlockMovement()));
	public static final RegistryObject<Block> tower_wood                 = BLOCKS.register("tower_wood", () -> new FlammableBlock(1, 0, Block.Properties.create(Material.WOOD, MaterialColor.ADOBE).harvestTool(ToolType.AXE).hardnessAndResistance(40.0F, 10.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> tower_wood_encased         = BLOCKS.register("tower_wood_encased", () -> new FlammableBlock(1, 0, Block.Properties.create(Material.WOOD, MaterialColor.SAND).harvestTool(ToolType.AXE).hardnessAndResistance(40.0F, 10.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> tower_wood_cracked         = BLOCKS.register("tower_wood_cracked", () -> new FlammableBlock(1, 0, Block.Properties.create(Material.WOOD, MaterialColor.ADOBE).harvestTool(ToolType.AXE).hardnessAndResistance(40.0F, 10.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> tower_wood_mossy           = BLOCKS.register("tower_wood_mossy", () -> new FlammableBlock(1, 0, Block.Properties.create(Material.WOOD, MaterialColor.ADOBE).harvestTool(ToolType.AXE).hardnessAndResistance(40.0F, 10.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> tower_wood_infested        = BLOCKS.register("tower_wood_infested", () -> new InfestedTowerwoodBlock(1, 0, Block.Properties.create(Material.WOOD, MaterialColor.ADOBE).harvestTool(ToolType.AXE).hardnessAndResistance(0.75F, 10.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> reappearing_block          = BLOCKS.register("reappearing_block", () -> new ReappearingBlock(Block.Properties.create(Material.WOOD, MaterialColor.SAND).setRequiresTool().harvestTool(ToolType.AXE).hardnessAndResistance(10.0F, 35.0F).sound(SoundType.WOOD).setLightLevel((state) -> 4)));
	// FIXME Split Vanishing block into regular breakable variant, and then the unbreakable variant
	public static final RegistryObject<Block> vanishing_block            = BLOCKS.register("vanishing_block", () -> new VanishingBlock(Block.Properties.create(Material.WOOD, MaterialColor.SAND).hardnessAndResistance(-1.0F, 35.0F).sound(SoundType.WOOD).setLightLevel((state) -> state.get(VanishingBlock.ACTIVE) ? 4 : 0)));
	public static final RegistryObject<Block> locked_vanishing_block     = BLOCKS.register("locked_vanishing_block", () -> new LockedVanishingBlock(Block.Properties.create(Material.WOOD, MaterialColor.SAND).hardnessAndResistance(-1.0F, 35.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> carminite_builder          = BLOCKS.register("carminite_builder", () -> new BuilderBlock(Block.Properties.create(Material.WOOD, MaterialColor.SAND).setRequiresTool().harvestTool(ToolType.AXE).hardnessAndResistance(10.0F, 35.0F).sound(SoundType.WOOD).setLightLevel((state) -> state.get(BuilderBlock.STATE) == TowerDeviceVariant.BUILDER_ACTIVE ? 4 : 0)));
	public static final RegistryObject<Block> built_block                = BLOCKS.register("built_block", () -> new TranslucentBuiltBlock(Block.Properties.create(Material.GLASS).hardnessAndResistance(50.0F, 2000.0F).sound(SoundType.METAL).notSolid().noDrops()));
	public static final RegistryObject<Block> antibuilder                = BLOCKS.register("antibuilder", () -> new AntibuilderBlock(Block.Properties.create(Material.WOOD, MaterialColor.SAND).setRequiresTool().harvestTool(ToolType.AXE).hardnessAndResistance(10.0F, 35.0F).sound(SoundType.WOOD).setLightLevel((state) -> 10)));
	public static final RegistryObject<Block> antibuilt_block            = BLOCKS.register("antibuilt_block", () -> new Block(Block.Properties.create(Material.GLASS).hardnessAndResistance(0.3F, 2000.0F).sound(SoundType.METAL).noDrops().notSolid()));
	public static final RegistryObject<GhastTrapBlock> ghast_trap      = BLOCKS.register("ghast_trap", () -> new GhastTrapBlock(Block.Properties.create(Material.WOOD, MaterialColor.SAND).setRequiresTool().harvestTool(ToolType.AXE).hardnessAndResistance(10.0F, 35.0F).sound(SoundType.WOOD).setLightLevel((state) -> state.get(GhastTrapBlock.ACTIVE) ? 15 : 0)));
	public static final RegistryObject<Block> carminite_reactor          = BLOCKS.register("carminite_reactor", () -> new CarminiteReactorBlock(Block.Properties.create(Material.WOOD, MaterialColor.SAND).setRequiresTool().harvestTool(ToolType.AXE).hardnessAndResistance(10.0F, 35.0F).sound(SoundType.WOOD).setLightLevel((state) -> state.get(CarminiteReactorBlock.ACTIVE) ? 15 : 0)));
	public static final RegistryObject<Block> reactor_debris             = BLOCKS.register("reactor_debris", () -> new Block(Block.Properties.create(Material.GLASS).hardnessAndResistance(0.3F, 2000.0F).sound(SoundType.METAL).noDrops().notSolid()));
	public static final RegistryObject<Block> fake_gold                  = BLOCKS.register("fake_gold", () -> new Block(Block.Properties.create(Material.GLASS).hardnessAndResistance(50.0F, 2000.0F).sound(SoundType.METAL).noDrops()));
	public static final RegistryObject<Block> fake_diamond               = BLOCKS.register("fake_diamond", () -> new Block(Block.Properties.create(Material.GLASS).hardnessAndResistance(50.0F, 2000.0F).sound(SoundType.METAL).noDrops()));
	public static final RegistryObject<TrophyBlock> naga_trophy           = BLOCKS.register("naga_trophy", () -> new TrophyBlock(BossVariant.NAGA, 5));
	public static final RegistryObject<TrophyBlock> lich_trophy           = BLOCKS.register("lich_trophy", () -> new TrophyBlock(BossVariant.LICH, 6));
	public static final RegistryObject<TrophyBlock> hydra_trophy          = BLOCKS.register("hydra_trophy", () -> new TrophyBlock(BossVariant.HYDRA, 12));
	public static final RegistryObject<TrophyBlock> ur_ghast_trophy       = BLOCKS.register("ur_ghast_trophy", () -> new TrophyBlock(BossVariant.UR_GHAST, 13));
	public static final RegistryObject<TrophyBlock> knight_phantom_trophy = BLOCKS.register("knight_phantom_trophy", () -> new TrophyBlock(BossVariant.KNIGHT_PHANTOM, 8));
	public static final RegistryObject<TrophyBlock> snow_queen_trophy     = BLOCKS.register("snow_queen_trophy", () -> new TrophyBlock(BossVariant.SNOW_QUEEN, 14));
	public static final RegistryObject<TrophyBlock> minoshroom_trophy     = BLOCKS.register("minoshroom_trophy", () -> new TrophyBlock(BossVariant.MINOSHROOM, 7));
	public static final RegistryObject<TrophyBlock> yeti_trophy           = BLOCKS.register("yeti_trophy", () -> new TrophyBlock(BossVariant.ALPHA_YETI, 9));
	public static final RegistryObject<TrophyBlock> quest_ram_trophy      = BLOCKS.register("quest_ram_trophy", () -> new TrophyBlock(BossVariant.QUEST_RAM, 1));
	public static final RegistryObject<TrophyWallBlock> naga_wall_trophy           = BLOCKS.register("naga_wall_trophy", () -> new TrophyWallBlock(BossVariant.NAGA));
	public static final RegistryObject<TrophyWallBlock> lich_wall_trophy           = BLOCKS.register("lich_wall_trophy", () -> new TrophyWallBlock(BossVariant.LICH));
	public static final RegistryObject<TrophyWallBlock> hydra_wall_trophy          = BLOCKS.register("hydra_wall_trophy", () -> new TrophyWallBlock(BossVariant.HYDRA));
	public static final RegistryObject<TrophyWallBlock> ur_ghast_wall_trophy       = BLOCKS.register("ur_ghast_wall_trophy", () -> new TrophyWallBlock(BossVariant.UR_GHAST));
	public static final RegistryObject<TrophyWallBlock> knight_phantom_wall_trophy = BLOCKS.register("knight_phantom_wall_trophy", () -> new TrophyWallBlock(BossVariant.KNIGHT_PHANTOM));
	public static final RegistryObject<TrophyWallBlock> snow_queen_wall_trophy     = BLOCKS.register("snow_queen_wall_trophy", () -> new TrophyWallBlock(BossVariant.SNOW_QUEEN));
	public static final RegistryObject<TrophyWallBlock> minoshroom_wall_trophy     = BLOCKS.register("minoshroom_wall_trophy", () -> new TrophyWallBlock(BossVariant.MINOSHROOM));
	public static final RegistryObject<TrophyWallBlock> yeti_wall_trophy           = BLOCKS.register("yeti_wall_trophy", () -> new TrophyWallBlock(BossVariant.ALPHA_YETI));
	public static final RegistryObject<TrophyWallBlock> quest_ram_wall_trophy      = BLOCKS.register("quest_ram_wall_trophy", () -> new TrophyWallBlock(BossVariant.QUEST_RAM));
	public static final RegistryObject<Block> stronghold_shield           = BLOCKS.register("stronghold_shield", () -> new StrongholdShieldBlock(Block.Properties.create(Material.ROCK).setRequiresTool().harvestTool(ToolType.PICKAXE).hardnessAndResistance(-1.0F, 6000000.0F).sound(SoundType.METAL).noDrops()));
	public static final RegistryObject<Block> trophy_pedestal             = BLOCKS.register("trophy_pedestal", () -> new TrophyPedestalBlock(Block.Properties.create(Material.ROCK).setRequiresTool().harvestTool(ToolType.PICKAXE).hardnessAndResistance(2.0F, 2000.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> aurora_block                = BLOCKS.register("aurora_block", () -> new AuroraBrickBlock(Block.Properties.create(Material.PACKED_ICE).harvestTool(ToolType.PICKAXE).hardnessAndResistance(10.0F, 10.0F)));
	public static final RegistryObject<RotatedPillarBlock> aurora_pillar  = BLOCKS.register("aurora_pillar", () -> new RotatedPillarBlock(Block.Properties.create(Material.PACKED_ICE).setRequiresTool().harvestTool(ToolType.PICKAXE).hardnessAndResistance(2.0F, 10.0F)));
	public static final RegistryObject<Block> aurora_slab                 = BLOCKS.register("aurora_slab", () -> new SlabBlock(Block.Properties.create(Material.PACKED_ICE).setRequiresTool().harvestTool(ToolType.PICKAXE).hardnessAndResistance(2.0F, 10.0F)));
	public static final RegistryObject<Block> auroralized_glass           = BLOCKS.register("auroralized_glass", () -> new AuroralizedGlassBlock(Block.Properties.create(Material.ICE).notSolid()));
	public static final RegistryObject<Block> underbrick                  = BLOCKS.register("underbrick", () -> new Block(Block.Properties.create(Material.ROCK, MaterialColor.WOOD).setRequiresTool().hardnessAndResistance(1.5F, 10.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> underbrick_mossy            = BLOCKS.register("underbrick_mossy", () -> new Block(Block.Properties.create(Material.ROCK, MaterialColor.WOOD).setRequiresTool().hardnessAndResistance(1.5F, 10.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> underbrick_cracked          = BLOCKS.register("underbrick_cracked", () -> new Block(Block.Properties.create(Material.ROCK, MaterialColor.WOOD).setRequiresTool().hardnessAndResistance(1.5F, 10.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> underbrick_floor            = BLOCKS.register("underbrick_floor", () -> new UnfinishedBlock(Block.Properties.create(Material.ROCK, MaterialColor.WOOD).setRequiresTool().hardnessAndResistance(1.5F, 10.0F).sound(SoundType.STONE), true));
	public static final RegistryObject<Block> brown_thorns                = BLOCKS.register("brown_thorns", () -> new ThornsBlock(Block.Properties.create(Material.WOOD, MaterialColor.OBSIDIAN).hardnessAndResistance(50.0F, 2000.0F).sound(SoundType.WOOD).noDrops()));
	public static final RegistryObject<Block> green_thorns                = BLOCKS.register("green_thorns", () -> new ThornsBlock(Block.Properties.create(Material.WOOD, MaterialColor.FOLIAGE).hardnessAndResistance(50.0F, 2000.0F).sound(SoundType.WOOD).noDrops()));
	public static final RegistryObject<Block> burnt_thorns                = BLOCKS.register("burnt_thorns", () -> new BurntThornsBlock(Block.Properties.create(Material.WOOD, MaterialColor.STONE).hardnessAndResistance(0.01F, 0.0F).sound(SoundType.SAND).noDrops()));
	public static final RegistryObject<Block> thorn_rose                  = BLOCKS.register("thorn_rose", () -> new ThornRoseBlock(Block.Properties.create(Material.PLANTS).hardnessAndResistance(10.0F, 0.0F).sound(SoundType.PLANT).doesNotBlockMovement()));
	public static final RegistryObject<Block> thorn_leaves                = BLOCKS.register("thorn_leaves", () -> new TFLeavesBlock(Block.Properties.create(Material.LEAVES).harvestTool(ToolType.HOE).hardnessAndResistance(0.2F).tickRandomly().notSolid().sound(SoundType.PLANT)));
	public static final RegistryObject<Block> beanstalk_leaves            = BLOCKS.register("beanstalk_leaves", () -> new TFLeavesBlock(Block.Properties.create(Material.LEAVES).harvestTool(ToolType.HOE).hardnessAndResistance(0.2F).tickRandomly().notSolid().sound(SoundType.PLANT)));
	public static final RegistryObject<Block> deadrock                    = BLOCKS.register("deadrock", () -> new Block(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(100.0F, 6000000.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> deadrock_cracked            = BLOCKS.register("deadrock_cracked", () -> new Block(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(100.0F, 6000000.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> deadrock_weathered          = BLOCKS.register("deadrock_weathered", () -> new Block(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(100.0F, 6000000.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> trollsteinn                 = BLOCKS.register("trollsteinn", () -> new TrollsteinnBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(2.0F, 15.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> wispy_cloud                 = BLOCKS.register("wispy_cloud", () -> new BreakableBlock(Block.Properties.create(Material.SNOW).hardnessAndResistance(0.3F).sound(SoundType.CLOTH).notSolid()));
	public static final RegistryObject<Block> fluffy_cloud                = BLOCKS.register("fluffy_cloud", () -> new Block(Block.Properties.create(Material.PACKED_ICE).hardnessAndResistance(0.8F, 0.0F).sound(SoundType.CLOTH)));
	public static final RegistryObject<Block> giant_cobblestone           = BLOCKS.register("giant_cobblestone", () -> new GiantBlock(Block.Properties.from(Blocks.COBBLESTONE).setRequiresTool().hardnessAndResistance(128, 10)));
	public static final RegistryObject<Block> giant_log                   = BLOCKS.register("giant_log", () -> new GiantLogBlock(Block.Properties.from(Blocks.OAK_LOG).setRequiresTool().harvestTool(ToolType.PICKAXE).hardnessAndResistance(128, 0)));
	public static final RegistryObject<Block> giant_leaves                = BLOCKS.register("giant_leaves", () -> new GiantLeavesBlock(Block.Properties.from(Blocks.OAK_LEAVES).setRequiresTool().harvestTool(ToolType.PICKAXE).hardnessAndResistance(0.2F * 64F, 0.0F).notSolid()));
	public static final RegistryObject<Block> giant_obsidian              = BLOCKS.register("giant_obsidian", () -> new GiantBlock(Block.Properties.from(Blocks.OBSIDIAN).setRequiresTool().hardnessAndResistance(50.0F * 64F * 64F, 2000.0F * 64F * 64F)));
	public static final RegistryObject<Block> uberous_soil                = BLOCKS.register("uberous_soil", () -> new UberousSoilBlock(Block.Properties.create(Material.EARTH).harvestTool(ToolType.SHOVEL).hardnessAndResistance(0.6F).sound(SoundType.GROUND)));
	public static final RegistryObject<Block> huge_stalk                  = BLOCKS.register("huge_stalk", () -> new Block(Block.Properties.create(Material.WOOD, MaterialColor.FOLIAGE).hardnessAndResistance(1.25F, 7.0F).sound(SoundType.PLANT)));
	public static final RegistryObject<Block> huge_mushgloom              = BLOCKS.register("huge_mushgloom", () -> new HugeMushroomBlock(Block.Properties.create(Material.WOOD, MaterialColor.ADOBE).hardnessAndResistance(0.2F).sound(SoundType.WOOD).setLightLevel((state) -> 5)));
	public static final RegistryObject<Block> huge_mushgloom_stem         = BLOCKS.register("huge_mushgloom_stem", () -> new HugeMushroomBlock(Block.Properties.create(Material.WOOD, MaterialColor.ADOBE).hardnessAndResistance(0.2F).sound(SoundType.WOOD).setLightLevel((state) -> 5)));
	public static final RegistryObject<Block> trollvidr                   = BLOCKS.register("trollvidr", () -> new TrollRootBlock(Block.Properties.create(Material.PLANTS).sound(SoundType.PLANT).doesNotBlockMovement()));
	public static final RegistryObject<Block> unripe_trollber             = BLOCKS.register("unripe_trollber", () -> new UnripeTorchClusterBlock(Block.Properties.create(Material.PLANTS).sound(SoundType.PLANT).doesNotBlockMovement().tickRandomly()));
	public static final RegistryObject<Block> trollber                    = BLOCKS.register("trollber", () -> new TrollRootBlock(Block.Properties.create(Material.PLANTS).sound(SoundType.PLANT).doesNotBlockMovement().setLightLevel((state) -> 15)));
	public static final RegistryObject<HugeLilyPadBlock> huge_lilypad   = BLOCKS.register("huge_lilypad", () -> new HugeLilyPadBlock(Block.Properties.create(Material.PLANTS).sound(SoundType.PLANT)));
	public static final RegistryObject<Block> huge_waterlily              = BLOCKS.register("huge_waterlily", () -> new HugeWaterLilyBlock(Block.Properties.create(Material.PLANTS).sound(SoundType.PLANT)));
	public static final RegistryObject<RotatedPillarBlock> slider         = BLOCKS.register("slider", SliderBlock::new);
	public static final RegistryObject<Block> castle_brick                = BLOCKS.register("castle_brick", () -> new CastleBlock(MaterialColor.QUARTZ));
	public static final RegistryObject<Block> castle_brick_worn           = BLOCKS.register("castle_brick_worn", () -> new CastleBlock(MaterialColor.QUARTZ));
	public static final RegistryObject<Block> castle_brick_cracked        = BLOCKS.register("castle_brick_cracked", () -> new CastleBlock(MaterialColor.QUARTZ));
	public static final RegistryObject<Block> castle_brick_roof           = BLOCKS.register("castle_brick_roof", () -> new CastleBlock(MaterialColor.GRAY));
	public static final RegistryObject<Block> castle_brick_mossy          = BLOCKS.register("castle_brick_mossy", () -> new CastleBlock(MaterialColor.QUARTZ));
	public static final RegistryObject<Block> castle_brick_frame          = BLOCKS.register("castle_brick_frame", () -> new CastleBlock(MaterialColor.QUARTZ));
	public static final RegistryObject<Block> castle_pillar_encased       = BLOCKS.register("castle_pillar_encased", () -> new RotatedPillarBlock(Block.Properties.create(Material.ROCK, MaterialColor.QUARTZ).setRequiresTool().hardnessAndResistance(100.0F, 35.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> castle_pillar_encased_tile  = BLOCKS.register("castle_pillar_encased_tile", () -> new Block(Block.Properties.create(Material.ROCK, MaterialColor.QUARTZ).setRequiresTool().hardnessAndResistance(100.0F, 35.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> castle_pillar_bold          = BLOCKS.register("castle_pillar_bold", () -> new RotatedPillarBlock(Block.Properties.create(Material.ROCK, MaterialColor.QUARTZ).setRequiresTool().hardnessAndResistance(100.0F, 35.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> castle_pillar_bold_tile     = BLOCKS.register("castle_pillar_bold_tile", () -> new Block(Block.Properties.create(Material.ROCK, MaterialColor.QUARTZ).setRequiresTool().hardnessAndResistance(100.0F, 35.0F).sound(SoundType.STONE)));
	public static final RegistryObject<StairsBlock> castle_stairs_brick   = BLOCKS.register("castle_stairs_brick", () -> new StairsBlock(castle_brick.get().getDefaultState(), Block.Properties.from(castle_brick.get())));
	public static final RegistryObject<StairsBlock> castle_stairs_worn    = BLOCKS.register("castle_stairs_worn", () -> new StairsBlock(castle_brick_worn.get().getDefaultState(), Block.Properties.from(castle_brick_worn.get())));
	public static final RegistryObject<StairsBlock> castle_stairs_cracked = BLOCKS.register("castle_stairs_cracked", () -> new StairsBlock(castle_brick_cracked.get().getDefaultState(), Block.Properties.from(castle_brick_cracked.get())));
	public static final RegistryObject<StairsBlock> castle_stairs_mossy   = BLOCKS.register("castle_stairs_mossy", () -> new StairsBlock(castle_brick_mossy.get().getDefaultState(), Block.Properties.from(castle_brick_mossy.get())));
	public static final RegistryObject<StairsBlock> castle_stairs_encased = BLOCKS.register("castle_stairs_encased", () -> new StairsBlock(castle_pillar_encased.get().getDefaultState(), Block.Properties.from(castle_pillar_encased.get())));
	public static final RegistryObject<StairsBlock> castle_stairs_bold    = BLOCKS.register("castle_stairs_bold", () -> new StairsBlock(castle_pillar_bold.get().getDefaultState(), Block.Properties.from(castle_pillar_bold.get())));
	public static final RegistryObject<Block> castle_rune_brick_pink      = BLOCKS.register("castle_rune_brick_pink", () -> new Block(Block.Properties.create(Material.ROCK, MaterialColor.QUARTZ).setRequiresTool().hardnessAndResistance(100.0F, 15.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> castle_rune_brick_blue      = BLOCKS.register("castle_rune_brick_blue", () -> new Block(Block.Properties.create(Material.ROCK, MaterialColor.QUARTZ).setRequiresTool().hardnessAndResistance(100.0F, 15.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> castle_rune_brick_yellow    = BLOCKS.register("castle_rune_brick_yellow", () -> new Block(Block.Properties.create(Material.ROCK, MaterialColor.QUARTZ).setRequiresTool().hardnessAndResistance(100.0F, 15.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> castle_rune_brick_purple    = BLOCKS.register("castle_rune_brick_purple", () -> new Block(Block.Properties.create(Material.ROCK, MaterialColor.QUARTZ).setRequiresTool().hardnessAndResistance(100.0F, 15.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> force_field_purple          = BLOCKS.register("force_field_purple", () -> new ForceFieldBlock(Block.Properties.create(Material.BARRIER).hardnessAndResistance(-1.0F).setLightLevel((state) -> 2).noDrops().notSolid()));
	public static final RegistryObject<Block> force_field_pink            = BLOCKS.register("force_field_pink", () -> new ForceFieldBlock(Block.Properties.create(Material.BARRIER).hardnessAndResistance(-1.0F).setLightLevel((state) -> 2).noDrops().notSolid()));
	public static final RegistryObject<Block> force_field_orange          = BLOCKS.register("force_field_orange", () -> new ForceFieldBlock(Block.Properties.create(Material.BARRIER).hardnessAndResistance(-1.0F).setLightLevel((state) -> 2).noDrops().notSolid()));
	public static final RegistryObject<Block> force_field_green           = BLOCKS.register("force_field_green", () -> new ForceFieldBlock(Block.Properties.create(Material.BARRIER).hardnessAndResistance(-1.0F).setLightLevel((state) -> 2).noDrops().notSolid()));
	public static final RegistryObject<Block> force_field_blue            = BLOCKS.register("force_field_blue", () -> new ForceFieldBlock(Block.Properties.create(Material.BARRIER).hardnessAndResistance(-1.0F).setLightLevel((state) -> 2).noDrops().notSolid()));
	public static final RegistryObject<Block> cinder_furnace              = BLOCKS.register("cinder_furnace", CinderFurnaceBlock::new);
	public static final RegistryObject<RotatedPillarBlock> cinder_log     = BLOCKS.register("cinder_log", () -> new TFLogBlock(Block.Properties.create(Material.WOOD, MaterialColor.GRAY).harvestTool(ToolType.AXE).hardnessAndResistance(1.0F)));
	public static final RegistryObject<Block> cinder_wood                 = BLOCKS.register("cinder_wood", () -> new UnfinishedBlock(Block.Properties.create(Material.WOOD, MaterialColor.GRAY).harvestTool(ToolType.AXE).hardnessAndResistance(1.0F), true));
	public static final RegistryObject<Block> castle_door_yellow          = BLOCKS.register("castle_door_yellow", () -> new CastleDoorBlock(Block.Properties.create(Material.ROCK, (state) -> state.get(CastleDoorBlock.VANISHED) ? MaterialColor.AIR : MaterialColor.CYAN).setRequiresTool().hardnessAndResistance(100.0F, 35.0F)));
	public static final RegistryObject<Block> castle_door_purple          = BLOCKS.register("castle_door_purple", () -> new CastleDoorBlock(Block.Properties.create(Material.ROCK, (state) -> state.get(CastleDoorBlock.VANISHED) ? MaterialColor.AIR : MaterialColor.CYAN).setRequiresTool().hardnessAndResistance(100.0F, 35.0F)));
	public static final RegistryObject<Block> castle_door_pink            = BLOCKS.register("castle_door_pink", () -> new CastleDoorBlock(Block.Properties.create(Material.ROCK, (state) -> state.get(CastleDoorBlock.VANISHED) ? MaterialColor.AIR : MaterialColor.CYAN).setRequiresTool().hardnessAndResistance(100.0F, 35.0F)));
	public static final RegistryObject<Block> castle_door_blue            = BLOCKS.register("castle_door_blue", () -> new CastleDoorBlock(Block.Properties.create(Material.ROCK, (state) -> state.get(CastleDoorBlock.VANISHED) ? MaterialColor.AIR : MaterialColor.CYAN).setRequiresTool().hardnessAndResistance(100.0F, 35.0F)));
	public static final RegistryObject<Block> experiment_115              = BLOCKS.register("experiment_115", Experiment115Block::new);
	public static final RegistryObject<Block> twilight_portal_miniature_structure    = BLOCKS.register("twilight_portal_miniature_structure", MiniatureStructureBlock::new);
//	public static final RegistryObject<Block> hedge_maze_miniature_structure         = BLOCKS.register("hedge_maze_miniature_structure", () -> new BlockTFMiniatureStructure());
//	public static final RegistryObject<Block> hollow_hill_miniature_structure        = BLOCKS.register("hollow_hill_miniature_structure", () -> new BlockTFMiniatureStructure());
//	public static final RegistryObject<Block> quest_grove_miniature_structure        = BLOCKS.register("quest_grove_miniature_structure", () -> new BlockTFMiniatureStructure());
//	public static final RegistryObject<Block> mushroom_tower_miniature_structure     = BLOCKS.register("mushroom_tower_miniature_structure", () -> new BlockTFMiniatureStructure());
	public static final RegistryObject<Block> naga_courtyard_miniature_structure     = BLOCKS.register("naga_courtyard_miniature_structure", MiniatureStructureBlock::new);
	public static final RegistryObject<Block> lich_tower_miniature_structure         = BLOCKS.register("lich_tower_miniature_structure", MiniatureStructureBlock::new);
//	public static final RegistryObject<Block> minotaur_labyrinth_miniature_structure = BLOCKS.register("minotaur_labyrinth_miniature_structure", () -> new BlockTFMiniatureStructure());
//	public static final RegistryObject<Block> hydra_lair_miniature_structure         = BLOCKS.register("hydra_lair_miniature_structure", () -> new BlockTFMiniatureStructure());
//	public static final RegistryObject<Block> goblin_stronghold_miniature_structure  = BLOCKS.register("goblin_stronghold_miniature_structure", () -> new BlockTFMiniatureStructure());
//	public static final RegistryObject<Block> dark_tower_miniature_structure         = BLOCKS.register("dark_tower_miniature_structure", () -> new BlockTFMiniatureStructure());
//	public static final RegistryObject<Block> yeti_cave_miniature_structure          = BLOCKS.register("yeti_cave_miniature_structure", () -> new BlockTFMiniatureStructure());
//	public static final RegistryObject<Block> aurora_palace_miniature_structure      = BLOCKS.register("aurora_palace_miniature_structure", () -> new BlockTFMiniatureStructure());
//	public static final RegistryObject<Block> troll_cave_cottage_miniature_structure = BLOCKS.register("troll_cave_cottage_miniature_structure", () -> new BlockTFMiniatureStructure());
//	public static final RegistryObject<Block> final_castle_miniature_structure       = BLOCKS.register("final_castle_miniature_structure", () -> new BlockTFMiniatureStructure());
	public static final RegistryObject<Block> knightmetal_block                      = BLOCKS.register("knightmetal_block", () -> new KnightmetalBlock(Block.Properties.create(Material.IRON).setRequiresTool().harvestTool(ToolType.PICKAXE).hardnessAndResistance(5.0F, 41.0F).sound(SoundType.METAL)));
	public static final RegistryObject<Block> ironwood_block                         = BLOCKS.register("ironwood_block", () -> new CompressedBlock(Block.Properties.create(Material.WOOD, MaterialColor.WOOD).harvestTool(ToolType.AXE).hardnessAndResistance(5.0F, 10.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> fiery_block                            = BLOCKS.register("fiery_block", () -> new CompressedBlock(Block.Properties.create(Material.IRON, MaterialColor.BLACK_TERRACOTTA).setRequiresTool().harvestTool(ToolType.PICKAXE).hardnessAndResistance(5.0F, 10.0F).sound(SoundType.METAL).notSolid().setEmmisiveRendering((state, world, pos) -> true)));
	public static final RegistryObject<Block> steeleaf_block                         = BLOCKS.register("steeleaf_block", () -> new CompressedBlock(Block.Properties.create(Material.LEAVES, MaterialColor.FOLIAGE).harvestTool(ToolType.HOE).hardnessAndResistance(5.0F, 10.0F).sound(SoundType.PLANT)));
	public static final RegistryObject<Block> arctic_fur_block                       = BLOCKS.register("arctic_fur_block", () -> new CompressedBlock(Block.Properties.create(Material.WOOL, MaterialColor.WOOL).harvestTool(ToolType.HOE).hardnessAndResistance(0.8F, 10.0F).sound(SoundType.CLOTH)));
	public static final RegistryObject<Block> carminite_block                        = BLOCKS.register("carminite_block", () -> new CompressedBlock(Block.Properties.create(Material.CLAY, MaterialColor.RED).hardnessAndResistance(0.0F, 10.0F).sound(SoundType.SLIME)));
	public static final RegistryObject<Block> spiral_bricks                          = BLOCKS.register("spiral_bricks", SpiralBrickBlock::new);
	public static final RegistryObject<Block> etched_nagastone                       = BLOCKS.register("etched_nagastone", () -> new EtchedNagastoneBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(1.5F, 10.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> nagastone_pillar                       = BLOCKS.register("nagastone_pillar", NagastonePillarBlock::new);
	public static final RegistryObject<StairsBlock> nagastone_stairs_left            = BLOCKS.register("nagastone_stairs_left", () -> new StairsBlock(etched_nagastone.get().getDefaultState(), AbstractBlock.Properties.from(etched_nagastone.get())));
	public static final RegistryObject<StairsBlock> nagastone_stairs_right           = BLOCKS.register("nagastone_stairs_right", () -> new StairsBlock(etched_nagastone.get().getDefaultState(), AbstractBlock.Properties.from(etched_nagastone.get())));
	public static final RegistryObject<Block> etched_nagastone_mossy                 = BLOCKS.register("etched_nagastone_mossy", () -> new EtchedNagastoneBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(1.5F, 10.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> nagastone_pillar_mossy                 = BLOCKS.register("nagastone_pillar_mossy", NagastonePillarBlock::new);
	public static final RegistryObject<StairsBlock> nagastone_stairs_mossy_left      = BLOCKS.register("nagastone_stairs_mossy_left", () -> new StairsBlock(etched_nagastone_mossy.get().getDefaultState(), AbstractBlock.Properties.from(etched_nagastone_mossy.get())));
	public static final RegistryObject<StairsBlock> nagastone_stairs_mossy_right     = BLOCKS.register("nagastone_stairs_mossy_right", () -> new StairsBlock(etched_nagastone_mossy.get().getDefaultState(), AbstractBlock.Properties.from(etched_nagastone_mossy.get())));
	public static final RegistryObject<Block> etched_nagastone_weathered             = BLOCKS.register("etched_nagastone_weathered", () -> new EtchedNagastoneBlock(Block.Properties.create(Material.ROCK).hardnessAndResistance(1.5F, 10.0F).sound(SoundType.STONE)));
	public static final RegistryObject<Block> nagastone_pillar_weathered             = BLOCKS.register("nagastone_pillar_weathered", NagastonePillarBlock::new);
	public static final RegistryObject<StairsBlock> nagastone_stairs_weathered_left  = BLOCKS.register("nagastone_stairs_weathered_left", () -> new StairsBlock(etched_nagastone_weathered.get().getDefaultState(), AbstractBlock.Properties.from(etched_nagastone_weathered.get())));
	public static final RegistryObject<StairsBlock> nagastone_stairs_weathered_right = BLOCKS.register("nagastone_stairs_weathered_right", () -> new StairsBlock(etched_nagastone_weathered.get().getDefaultState(), AbstractBlock.Properties.from(etched_nagastone_weathered.get())));
	public static final RegistryObject<Block> iron_ladder                = BLOCKS.register("iron_ladder", () -> new IronLadderBlock(Block.Properties.create(Material.MISCELLANEOUS).setRequiresTool().harvestTool(ToolType.PICKAXE).hardnessAndResistance(5.0F, 10.0F).sound(SoundType.METAL).notSolid()));
	//public static final RegistryObject<Block> terrorcotta_circle         = BLOCKS.register("terrorcotta_circle", () -> new BlockTFHorizontal(Block.Properties.create(Material.ROCK, MaterialColor.SAND).setRequiresTool().hardnessAndResistance(1.7F).sound(SoundType.STONE)));
	//public static final RegistryObject<Block> terrorcotta_diagonal       = BLOCKS.register("terrorcotta_diagonal", () -> new BlockTFDiagonal(Block.Properties.create(Material.ROCK, MaterialColor.SAND).setRequiresTool().hardnessAndResistance(1.7F).sound(SoundType.STONE)));
	public static final RegistryObject<RotatedPillarBlock> stone_twist   = BLOCKS.register("stone_twist", () -> new RotatedPillarBlock(Block.Properties.create(Material.ROCK).setRequiresTool().hardnessAndResistance(1.5F, 10.0F)));
	public static final RegistryObject<Block> stone_twist_thin           = BLOCKS.register("stone_twist_thin", () -> new WallPillarBlock(Material.ROCK, 12, 16));
	//public static final RegistryObject<Block> lapis_block                = BLOCKS.register("lapis_block", () -> new Block(Block.Properties.create(Material.IRON).setRequiresTool().hardnessAndResistance(3.0F, 5.0F).sound(SoundType.STONE)));
	public static final RegistryObject<KeepsakeCasketBlock> keepsake_casket = BLOCKS.register("keepsake_casket", KeepsakeCasketBlock::new);

	//Pot all the things!
	public static final RegistryObject<FlowerPotBlock> potted_twilight_oak_sapling = BLOCKS.register("potted_twilight_oak_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, oak_sapling, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_canopy_sapling = BLOCKS.register("potted_canopy_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, canopy_sapling, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_mangrove_sapling = BLOCKS.register("potted_mangrove_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, mangrove_sapling, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_darkwood_sapling = BLOCKS.register("potted_darkwood_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, darkwood_sapling, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_hollow_oak_sapling = BLOCKS.register("potted_hollow_oak_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, hollow_oak_sapling, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_rainboak_sapling = BLOCKS.register("potted_rainboak_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, rainboak_sapling, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_time_sapling = BLOCKS.register("potted_time_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, time_sapling, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_trans_sapling = BLOCKS.register("potted_trans_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, transformation_sapling, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_mine_sapling = BLOCKS.register("potted_mine_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, mining_sapling, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_sort_sapling = BLOCKS.register("potted_sort_sapling", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, sorting_sapling, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_mayapple = BLOCKS.register("potted_mayapple", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, mayapple, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_fiddlehead = BLOCKS.register("potted_fiddlehead", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, fiddlehead, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_mushgloom = BLOCKS.register("potted_mushgloom", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, mushgloom, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_thorn = BLOCKS.register("potted_thorn", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, brown_thorns, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_green_thorn = BLOCKS.register("potted_green_thorn", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, green_thorns, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));
	public static final RegistryObject<FlowerPotBlock> potted_dead_thorn = BLOCKS.register("potted_dead_thorn", () -> new FlowerPotBlock(() -> (FlowerPotBlock) Blocks.FLOWER_POT, burnt_thorns, AbstractBlock.Properties.from(Blocks.FLOWER_POT)));

	public static final WoodType TWILIGHT_OAK = WoodType.create(TwilightForestMod.prefix("twilight_oak").toString());
	public static final WoodType CANOPY = WoodType.create(TwilightForestMod.prefix("canopy").toString());
	public static final WoodType MANGROVE = WoodType.create(TwilightForestMod.prefix("mangrove").toString());
	public static final WoodType DARKWOOD = WoodType.create(TwilightForestMod.prefix("darkwood").toString());
	public static final WoodType TIMEWOOD = WoodType.create(TwilightForestMod.prefix("timewood").toString());
	public static final WoodType TRANSFORMATION = WoodType.create(TwilightForestMod.prefix("transformation").toString());
	public static final WoodType MINING = WoodType.create(TwilightForestMod.prefix("mining").toString());
	public static final WoodType SORTING = WoodType.create(TwilightForestMod.prefix("sorting").toString());

	// TODO chests? boats?
	public static final RegistryObject<Block> twilight_oak_planks           = BLOCKS.register("twilight_oak_planks", () -> new Block(Block.Properties.create(Material.WOOD, MaterialColor.WOOD).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<StairsBlock> twilight_oak_stairs     = BLOCKS.register("twilight_oak_stairs", () -> new StairsBlock(twilight_oak_planks.get().getDefaultState(), Block.Properties.from(twilight_oak_planks.get())));
	public static final RegistryObject<Block> twilight_oak_slab             = BLOCKS.register("twilight_oak_slab", () -> new SlabBlock(Block.Properties.from(twilight_oak_planks.get())));
	public static final RegistryObject<Block> twilight_oak_button           = BLOCKS.register("twilight_oak_button", () -> new WoodButtonBlock(Block.Properties.from(twilight_oak_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> twilight_oak_fence            = BLOCKS.register("twilight_oak_fence", () -> new FenceBlock(Block.Properties.from(twilight_oak_planks.get())));
	public static final RegistryObject<Block> twilight_oak_gate             = BLOCKS.register("twilight_oak_gate", () -> new FenceGateBlock(Block.Properties.from(twilight_oak_planks.get())));
	public static final RegistryObject<Block> twilight_oak_plate            = BLOCKS.register("twilight_oak_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, Block.Properties.from(twilight_oak_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<DoorBlock> twilight_oak_door         = BLOCKS.register("twilight_oak_door", () -> new DoorBlock(Block.Properties.from(twilight_oak_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<TrapDoorBlock> twilight_oak_trapdoor = BLOCKS.register("twilight_oak_trapdoor", () -> new TrapDoorBlock(Block.Properties.from(twilight_oak_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<StandingSignBlock> twilight_oak_sign = BLOCKS.register("twilight_oak_sign", () -> new TFSignBlock(Block.Properties.from(twilight_oak_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), TWILIGHT_OAK));
	public static final RegistryObject<net.minecraft.block.WallSignBlock> twilight_wall_sign    = BLOCKS.register("twilight_wall_sign", () -> new TFWallSignBlock(Block.Properties.from(twilight_oak_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), TWILIGHT_OAK));
	public static final RegistryObject<Block> canopy_planks                 = BLOCKS.register("canopy_planks", () -> new Block(Block.Properties.create(Material.WOOD, MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<StairsBlock> canopy_stairs           = BLOCKS.register("canopy_stairs", () -> new StairsBlock(canopy_planks.get().getDefaultState(), Block.Properties.from(canopy_planks.get())));
	public static final RegistryObject<Block> canopy_slab                   = BLOCKS.register("canopy_slab", () -> new SlabBlock(Block.Properties.from(canopy_planks.get())));
	public static final RegistryObject<Block> canopy_button                 = BLOCKS.register("canopy_button", () -> new WoodButtonBlock(Block.Properties.from(canopy_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> canopy_fence                  = BLOCKS.register("canopy_fence", () -> new FenceBlock(Block.Properties.from(canopy_planks.get())));
	public static final RegistryObject<Block> canopy_gate                   = BLOCKS.register("canopy_gate", () -> new FenceGateBlock(Block.Properties.from(canopy_planks.get())));
	public static final RegistryObject<Block> canopy_plate                  = BLOCKS.register("canopy_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, Block.Properties.from(canopy_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<DoorBlock> canopy_door               = BLOCKS.register("canopy_door", () -> new DoorBlock(Block.Properties.create(Material.WOOD, MaterialColor.OBSIDIAN).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<TrapDoorBlock> canopy_trapdoor       = BLOCKS.register("canopy_trapdoor", () -> new TrapDoorBlock(AbstractBlock.Properties.create(Material.WOOD, MaterialColor.SAND).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<StandingSignBlock> canopy_sign       = BLOCKS.register("canopy_sign", () -> new TFSignBlock(Block.Properties.from(canopy_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), CANOPY));
	public static final RegistryObject<net.minecraft.block.WallSignBlock> canopy_wall_sign      = BLOCKS.register("canopy_wall_sign", () -> new TFWallSignBlock(Block.Properties.from(canopy_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), CANOPY));
	public static final RegistryObject<Block> mangrove_planks               = BLOCKS.register("mangrove_planks", () -> new Block(Block.Properties.create(Material.WOOD, MaterialColor.DIRT).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<StairsBlock> mangrove_stairs         = BLOCKS.register("mangrove_stairs", () -> new StairsBlock(mangrove_planks.get().getDefaultState(), Block.Properties.from(mangrove_planks.get())));
	public static final RegistryObject<Block> mangrove_slab                 = BLOCKS.register("mangrove_slab", () -> new SlabBlock(Block.Properties.from(mangrove_planks.get()).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> mangrove_button               = BLOCKS.register("mangrove_button", () -> new WoodButtonBlock(Block.Properties.from(mangrove_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> mangrove_fence                = BLOCKS.register("mangrove_fence", () -> new FenceBlock(Block.Properties.from(mangrove_planks.get())));
	public static final RegistryObject<Block> mangrove_gate                 = BLOCKS.register("mangrove_gate", () -> new FenceGateBlock(Block.Properties.from(mangrove_planks.get())));
	public static final RegistryObject<Block> mangrove_plate                = BLOCKS.register("mangrove_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, Block.Properties.from(mangrove_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<DoorBlock> mangrove_door             = BLOCKS.register("mangrove_door", () -> new DoorBlock(Block.Properties.from(mangrove_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<TrapDoorBlock> mangrove_trapdoor     = BLOCKS.register("mangrove_trapdoor", () -> new TrapDoorBlock(Block.Properties.from(mangrove_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<StandingSignBlock> mangrove_sign     = BLOCKS.register("mangrove_sign", () -> new TFSignBlock(Block.Properties.from(mangrove_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), MANGROVE));
	public static final RegistryObject<net.minecraft.block.WallSignBlock> mangrove_wall_sign    = BLOCKS.register("mangrove_wall_sign", () -> new TFWallSignBlock(Block.Properties.from(mangrove_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), MANGROVE));
	public static final RegistryObject<Block> dark_planks                   = BLOCKS.register("dark_planks", () -> new Block(Block.Properties.create(Material.WOOD, MaterialColor.ADOBE).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<StairsBlock> dark_stairs             = BLOCKS.register("dark_stairs", () -> new StairsBlock(dark_planks.get().getDefaultState(), Block.Properties.from(dark_planks.get())));
	public static final RegistryObject<Block> dark_slab                     = BLOCKS.register("dark_slab", () -> new SlabBlock(Block.Properties.from(dark_planks.get()).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> dark_button                   = BLOCKS.register("dark_button", () -> new WoodButtonBlock(Block.Properties.from(dark_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> dark_fence                    = BLOCKS.register("dark_fence", () -> new FenceBlock(Block.Properties.from(dark_planks.get())));
	public static final RegistryObject<Block> dark_gate                     = BLOCKS.register("dark_gate", () -> new FenceGateBlock(Block.Properties.from(dark_planks.get())));
	public static final RegistryObject<Block> dark_plate                    = BLOCKS.register("dark_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, Block.Properties.from(dark_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<DoorBlock> dark_door                 = BLOCKS.register("dark_door", () -> new DoorBlock(Block.Properties.from(dark_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<TrapDoorBlock> dark_trapdoor         = BLOCKS.register("dark_trapdoor", () -> new TrapDoorBlock(Block.Properties.from(dark_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<StandingSignBlock> darkwood_sign     = BLOCKS.register("darkwood_sign", () -> new TFSignBlock(Block.Properties.from(dark_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), DARKWOOD));
	public static final RegistryObject<net.minecraft.block.WallSignBlock> darkwood_wall_sign    = BLOCKS.register("darkwood_wall_sign", () -> new TFWallSignBlock(Block.Properties.from(dark_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), DARKWOOD));
	public static final RegistryObject<Block> time_planks                   = BLOCKS.register("time_planks", () -> new Block(Block.Properties.create(Material.WOOD, MaterialColor.DIRT).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<StairsBlock> time_stairs             = BLOCKS.register("time_stairs", () -> new StairsBlock(time_planks.get().getDefaultState(), Block.Properties.from(time_planks.get())));
	public static final RegistryObject<Block> time_slab                     = BLOCKS.register("time_slab", () -> new SlabBlock(Block.Properties.from(time_planks.get()).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> time_button                   = BLOCKS.register("time_button", () -> new WoodButtonBlock(Block.Properties.from(time_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> time_fence                    = BLOCKS.register("time_fence", () -> new FenceBlock(Block.Properties.from(time_planks.get())));
	public static final RegistryObject<Block> time_gate                     = BLOCKS.register("time_gate", () -> new FenceGateBlock(Block.Properties.from(time_planks.get())));
	public static final RegistryObject<Block> time_plate                    = BLOCKS.register("time_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, Block.Properties.from(time_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<DoorBlock> time_door                 = BLOCKS.register("time_door", () -> new DoorBlock(Block.Properties.from(time_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<TrapDoorBlock> time_trapdoor         = BLOCKS.register("time_trapdoor", () -> new TrapDoorBlock(Block.Properties.from(time_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<StandingSignBlock> time_sign         = BLOCKS.register("time_sign", () -> new TFSignBlock(Block.Properties.from(time_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), TIMEWOOD));
	public static final RegistryObject<net.minecraft.block.WallSignBlock> time_wall_sign        = BLOCKS.register("time_wall_sign", () -> new TFWallSignBlock(Block.Properties.from(time_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), TIMEWOOD));
	public static final RegistryObject<Block> trans_planks                  = BLOCKS.register("trans_planks", () -> new Block(Block.Properties.create(Material.WOOD, MaterialColor.WOOD).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<StairsBlock> trans_stairs            = BLOCKS.register("trans_stairs", () -> new StairsBlock(trans_planks.get().getDefaultState(), Block.Properties.from(trans_planks.get())));
	public static final RegistryObject<Block> trans_slab                    = BLOCKS.register("trans_slab", () -> new SlabBlock(Block.Properties.from(trans_planks.get()).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> trans_button                  = BLOCKS.register("trans_button", () -> new WoodButtonBlock(Block.Properties.from(trans_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> trans_fence                   = BLOCKS.register("trans_fence", () -> new FenceBlock(Block.Properties.from(trans_planks.get())));
	public static final RegistryObject<Block> trans_gate                    = BLOCKS.register("trans_gate", () -> new FenceGateBlock(Block.Properties.from(trans_planks.get())));
	public static final RegistryObject<Block> trans_plate                   = BLOCKS.register("trans_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, Block.Properties.from(trans_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<DoorBlock> trans_door                = BLOCKS.register("trans_door", () -> new DoorBlock(Block.Properties.from(trans_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<TrapDoorBlock> trans_trapdoor        = BLOCKS.register("trans_trapdoor", () -> new TrapDoorBlock(Block.Properties.from(trans_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<StandingSignBlock> trans_sign        = BLOCKS.register("trans_sign", () -> new TFSignBlock(Block.Properties.from(trans_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), TRANSFORMATION));
	public static final RegistryObject<net.minecraft.block.WallSignBlock> trans_wall_sign       = BLOCKS.register("trans_wall_sign", () -> new TFWallSignBlock(Block.Properties.from(trans_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), TRANSFORMATION));
	public static final RegistryObject<Block> mine_planks                   = BLOCKS.register("mine_planks", () -> new Block(Block.Properties.create(Material.WOOD, MaterialColor.SAND).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<StairsBlock> mine_stairs             = BLOCKS.register("mine_stairs", () -> new StairsBlock(mine_planks.get().getDefaultState(), Block.Properties.from(mine_planks.get())));
	public static final RegistryObject<Block> mine_slab                     = BLOCKS.register("mine_slab", () -> new SlabBlock(Block.Properties.from(mine_planks.get()).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> mine_button                   = BLOCKS.register("mine_button", () -> new WoodButtonBlock(Block.Properties.from(mine_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> mine_fence                    = BLOCKS.register("mine_fence", () -> new FenceBlock(Block.Properties.from(mine_planks.get())));
	public static final RegistryObject<Block> mine_gate                     = BLOCKS.register("mine_gate", () -> new FenceGateBlock(Block.Properties.from(mine_planks.get())));
	public static final RegistryObject<Block> mine_plate                    = BLOCKS.register("mine_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, Block.Properties.from(mine_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<DoorBlock> mine_door                 = BLOCKS.register("mine_door", () -> new DoorBlock(Block.Properties.from(mine_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<TrapDoorBlock> mine_trapdoor         = BLOCKS.register("mine_trapdoor", () -> new TrapDoorBlock(Block.Properties.from(mine_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<StandingSignBlock> mine_sign         = BLOCKS.register("mine_sign", () -> new TFSignBlock(Block.Properties.from(mine_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), MINING));
	public static final RegistryObject<net.minecraft.block.WallSignBlock> mine_wall_sign        = BLOCKS.register("mine_wall_sign", () -> new TFWallSignBlock(Block.Properties.from(mine_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), MINING));
	public static final RegistryObject<Block> sort_planks                   = BLOCKS.register("sort_planks", () -> new Block(Block.Properties.create(Material.WOOD, MaterialColor.OBSIDIAN).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<StairsBlock> sort_stairs             = BLOCKS.register("sort_stairs", () -> new StairsBlock(sort_planks.get().getDefaultState(), Block.Properties.from(sort_planks.get())));
	public static final RegistryObject<Block> sort_slab                     = BLOCKS.register("sort_slab", () -> new SlabBlock(Block.Properties.from(sort_planks.get()).hardnessAndResistance(2.0F, 5.0F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> sort_button                   = BLOCKS.register("sort_button", () -> new WoodButtonBlock(Block.Properties.from(sort_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<Block> sort_fence                    = BLOCKS.register("sort_fence", () -> new FenceBlock(Block.Properties.from(sort_planks.get())));
	public static final RegistryObject<Block> sort_gate                     = BLOCKS.register("sort_gate", () -> new FenceGateBlock(Block.Properties.from(sort_planks.get())));
	public static final RegistryObject<Block> sort_plate                    = BLOCKS.register("sort_plate", () -> new PressurePlateBlock(PressurePlateBlock.Sensitivity.EVERYTHING, Block.Properties.from(sort_planks.get()).doesNotBlockMovement().hardnessAndResistance(0.5F).sound(SoundType.WOOD)));
	public static final RegistryObject<DoorBlock> sort_door                 = BLOCKS.register("sort_door", () -> new DoorBlock(Block.Properties.from(sort_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<TrapDoorBlock> sort_trapdoor         = BLOCKS.register("sort_trapdoor", () -> new TrapDoorBlock(Block.Properties.from(sort_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid()));
	public static final RegistryObject<StandingSignBlock> sort_sign         = BLOCKS.register("sort_sign", () -> new TFSignBlock(Block.Properties.from(sort_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), SORTING));
	public static final RegistryObject<net.minecraft.block.WallSignBlock> sort_wall_sign        = BLOCKS.register("sort_wall_sign", () -> new TFWallSignBlock(Block.Properties.from(sort_planks.get()).hardnessAndResistance(3.0F).sound(SoundType.WOOD).notSolid().doesNotBlockMovement(), SORTING));

	@SubscribeEvent
	public static void registerItemblocks(RegistryEvent.Register<Item> evt) {
		TFBlockItems.registerBlockItems(evt);
		TFCompat.initCompatItems(evt);
	}

	private static AbstractBlock.Properties logProperties(MaterialColor color) {
		return logProperties(color, color);
	}

	private static AbstractBlock.Properties logProperties(MaterialColor top, MaterialColor side) {
		return AbstractBlock.Properties.create(Material.WOOD, (state) ->
				state.get(RotatedPillarBlock.AXIS) == Direction.Axis.Y ? top : side);
	}

	public static void tfCompostables() {
		ComposterBlock.registerCompostable(0.1F, fallen_leaves.get());
		ComposterBlock.registerCompostable(0.3F, canopy_leaves.get());
		ComposterBlock.registerCompostable(0.3F, clover_patch.get());
		ComposterBlock.registerCompostable(0.3F, dark_leaves.get());
		ComposterBlock.registerCompostable(0.3F, fiddlehead.get());
		ComposterBlock.registerCompostable(0.3F, hedge.get());
		ComposterBlock.registerCompostable(0.3F, mangrove_leaves.get());
		ComposterBlock.registerCompostable(0.3F, mayapple.get());
		ComposterBlock.registerCompostable(0.3F, mining_leaves.get());
		ComposterBlock.registerCompostable(0.3F, oak_leaves.get());
		ComposterBlock.registerCompostable(0.3F, rainboak_leaves.get());
		ComposterBlock.registerCompostable(0.3F, root_strand.get());
		ComposterBlock.registerCompostable(0.3F, sorting_leaves.get());
		ComposterBlock.registerCompostable(0.3F, thorn_leaves.get());
		ComposterBlock.registerCompostable(0.3F, time_leaves.get());
		ComposterBlock.registerCompostable(0.3F, transformation_leaves.get());
		ComposterBlock.registerCompostable(0.3F, oak_sapling.get());
		ComposterBlock.registerCompostable(0.3F, canopy_sapling.get());
		ComposterBlock.registerCompostable(0.3F, mangrove_sapling.get());
		ComposterBlock.registerCompostable(0.3F, darkwood_sapling.get());
		ComposterBlock.registerCompostable(0.3F, rainboak_sapling.get());
		ComposterBlock.registerCompostable(0.5F, beanstalk_leaves.get());
		ComposterBlock.registerCompostable(0.5F, moss_patch.get());
		ComposterBlock.registerCompostable(0.5F, root.get());
		ComposterBlock.registerCompostable(0.5F, thorn_rose.get());
		ComposterBlock.registerCompostable(0.5F, trollvidr.get());
		ComposterBlock.registerCompostable(0.5F, hollow_oak_sapling.get());
		ComposterBlock.registerCompostable(0.5F, time_sapling.get());
		ComposterBlock.registerCompostable(0.5F, transformation_sapling.get());
		ComposterBlock.registerCompostable(0.5F, mining_sapling.get());
		ComposterBlock.registerCompostable(0.5F, sorting_sapling.get());
		ComposterBlock.registerCompostable(0.65F, huge_mushgloom_stem.get());
		ComposterBlock.registerCompostable(0.65F, huge_waterlily.get());
		ComposterBlock.registerCompostable(0.65F, liveroot_block.get());
		ComposterBlock.registerCompostable(0.65F, mushgloom.get());
		ComposterBlock.registerCompostable(0.65F, uberous_soil.get());
		ComposterBlock.registerCompostable(0.65F, huge_stalk.get());
		ComposterBlock.registerCompostable(0.65F, unripe_trollber.get());
		ComposterBlock.registerCompostable(0.65F, trollber.get());
		ComposterBlock.registerCompostable(0.85F, huge_lilypad.get());
		ComposterBlock.registerCompostable(0.85F, huge_mushgloom.get());

		//eh, we'll do items here too
		ComposterBlock.registerCompostable(0.3F, TFItems.torchberries.get());
		ComposterBlock.registerCompostable(0.5F, TFItems.liveroot.get());
		ComposterBlock.registerCompostable(0.65F, TFItems.maze_wafer.get());
		ComposterBlock.registerCompostable(0.85F, TFItems.experiment_115.get());
		ComposterBlock.registerCompostable(0.85F, TFItems.magic_beans.get());
	}

	public static void TFBurnables() {
		FireBlock fireblock = (FireBlock)Blocks.FIRE;
		fireblock.setFireInfo(root.get(), 5, 20);
		fireblock.setFireInfo(liveroot_block.get(), 5, 20);
		fireblock.setFireInfo(oak_wood.get(), 5, 5);
		fireblock.setFireInfo(twilight_oak_planks.get(), 5, 20);
		fireblock.setFireInfo(twilight_oak_slab.get(), 5, 20);
		fireblock.setFireInfo(twilight_oak_stairs.get(), 5, 20);
		fireblock.setFireInfo(twilight_oak_fence.get(), 5, 20);
		fireblock.setFireInfo(twilight_oak_gate.get(), 5, 20);
		fireblock.setFireInfo(canopy_wood.get(), 5, 5);
		fireblock.setFireInfo(canopy_planks.get(), 5, 20);
		fireblock.setFireInfo(canopy_slab.get(), 5, 20);
		fireblock.setFireInfo(canopy_stairs.get(), 5, 20);
		fireblock.setFireInfo(canopy_fence.get(), 5, 20);
		fireblock.setFireInfo(canopy_gate.get(), 5, 20);
		fireblock.setFireInfo(mangrove_wood.get(), 5, 5);
		fireblock.setFireInfo(mangrove_planks.get(), 5, 20);
		fireblock.setFireInfo(mangrove_slab.get(), 5, 20);
		fireblock.setFireInfo(mangrove_stairs.get(), 5, 20);
		fireblock.setFireInfo(mangrove_fence.get(), 5, 20);
		fireblock.setFireInfo(mangrove_gate.get(), 5, 20);
		fireblock.setFireInfo(dark_wood.get(), 5, 5);
		fireblock.setFireInfo(dark_planks.get(), 5, 20);
		fireblock.setFireInfo(dark_slab.get(), 5, 20);
		fireblock.setFireInfo(dark_stairs.get(), 5, 20);
		fireblock.setFireInfo(dark_fence.get(), 5, 20);
		fireblock.setFireInfo(dark_gate.get(), 5, 20);
		fireblock.setFireInfo(time_wood.get(), 5, 5);
		fireblock.setFireInfo(time_planks.get(), 5, 20);
		fireblock.setFireInfo(time_slab.get(), 5, 20);
		fireblock.setFireInfo(time_stairs.get(), 5, 20);
		fireblock.setFireInfo(time_fence.get(), 5, 20);
		fireblock.setFireInfo(time_gate.get(), 5, 20);
		fireblock.setFireInfo(transformation_wood.get(), 5, 5);
		fireblock.setFireInfo(trans_planks.get(), 5, 20);
		fireblock.setFireInfo(trans_slab.get(), 5, 20);
		fireblock.setFireInfo(trans_stairs.get(), 5, 20);
		fireblock.setFireInfo(trans_fence.get(), 5, 20);
		fireblock.setFireInfo(trans_gate.get(), 5, 20);
		fireblock.setFireInfo(mining_wood.get(), 5, 5);
		fireblock.setFireInfo(mine_planks.get(), 5, 20);
		fireblock.setFireInfo(mine_slab.get(), 5, 20);
		fireblock.setFireInfo(mine_stairs.get(), 5, 20);
		fireblock.setFireInfo(mine_fence.get(), 5, 20);
		fireblock.setFireInfo(mine_gate.get(), 5, 20);
		fireblock.setFireInfo(sorting_wood.get(), 5, 5);
		fireblock.setFireInfo(sort_planks.get(), 5, 20);
		fireblock.setFireInfo(sort_slab.get(), 5, 20);
		fireblock.setFireInfo(sort_stairs.get(), 5, 20);
		fireblock.setFireInfo(sort_fence.get(), 5, 20);
		fireblock.setFireInfo(sort_gate.get(), 5, 20);
	}

	public static void TFPots() {
		FlowerPotBlock pot = (FlowerPotBlock) Blocks.FLOWER_POT;

		pot.addPlant(oak_sapling.getId(), potted_twilight_oak_sapling);
		pot.addPlant(canopy_sapling.getId(), potted_canopy_sapling);
		pot.addPlant(mangrove_sapling.getId(), potted_mangrove_sapling);
		pot.addPlant(darkwood_sapling.getId(), potted_darkwood_sapling);
		pot.addPlant(hollow_oak_sapling.getId(), potted_hollow_oak_sapling);
		pot.addPlant(rainboak_sapling.getId(), potted_rainboak_sapling);
		pot.addPlant(time_sapling.getId(), potted_time_sapling);
		pot.addPlant(transformation_sapling.getId(), potted_trans_sapling);
		pot.addPlant(mining_sapling.getId(), potted_mine_sapling);
		pot.addPlant(sorting_sapling.getId(), potted_sort_sapling);
		pot.addPlant(mayapple.getId(), potted_mayapple);
		pot.addPlant(fiddlehead.getId(), potted_fiddlehead);
		pot.addPlant(mushgloom.getId(), potted_mushgloom);
		pot.addPlant(brown_thorns.getId(), potted_thorn);
		pot.addPlant(green_thorns.getId(), potted_green_thorn);
		pot.addPlant(burnt_thorns.getId(), potted_dead_thorn);
	}
}
