package thebetweenlands.common.registries;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import javax.annotation.Nullable;

import net.minecraft.block.Block;
import net.minecraft.block.SoundType;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.BlockRenderLayer;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.registries.IForgeRegistry;
import thebetweenlands.client.render.particle.BLParticles;
import thebetweenlands.common.TheBetweenlands;
import thebetweenlands.common.block.BasicBlock;
import thebetweenlands.common.block.BlockBLColored;
import thebetweenlands.common.block.container.BlockAlembic;
import thebetweenlands.common.block.container.BlockAnimator;
import thebetweenlands.common.block.container.BlockAspectVial;
import thebetweenlands.common.block.container.BlockBLDualFurnace;
import thebetweenlands.common.block.container.BlockBLFurnace;
import thebetweenlands.common.block.container.BlockBarrel;
import thebetweenlands.common.block.container.BlockCenser;
import thebetweenlands.common.block.container.BlockChestBetweenlands;
import thebetweenlands.common.block.container.BlockCompostBin;
import thebetweenlands.common.block.container.BlockCrabPot;
import thebetweenlands.common.block.container.BlockCrabPotFilter;
import thebetweenlands.common.block.container.BlockDruidAltar;
import thebetweenlands.common.block.container.BlockFilteredSiltGlassJar;
import thebetweenlands.common.block.container.BlockFishTrimmingTable;
import thebetweenlands.common.block.container.BlockFishingTackleBox;
import thebetweenlands.common.block.container.BlockGeckoCage;
import thebetweenlands.common.block.container.BlockGrubHub;
import thebetweenlands.common.block.container.BlockHopperBetweenlands;
import thebetweenlands.common.block.container.BlockInfuser;
import thebetweenlands.common.block.container.BlockItemShelf;
import thebetweenlands.common.block.container.BlockLootPot;
import thebetweenlands.common.block.container.BlockLootUrn;
import thebetweenlands.common.block.container.BlockMortar;
import thebetweenlands.common.block.container.BlockMothHouse;
import thebetweenlands.common.block.container.BlockMudBrickAlcove;
import thebetweenlands.common.block.container.BlockMudLootPot;
import thebetweenlands.common.block.container.BlockPresent;
import thebetweenlands.common.block.container.BlockPurifier;
import thebetweenlands.common.block.container.BlockRepeller;
import thebetweenlands.common.block.container.BlockSiltGlassJar;
import thebetweenlands.common.block.container.BlockSmokingRack;
import thebetweenlands.common.block.container.BlockSteepingPot;
import thebetweenlands.common.block.container.BlockTarLootPot;
import thebetweenlands.common.block.container.BlockWaterFilter;
import thebetweenlands.common.block.container.BlockWeedwoodJukebox;
import thebetweenlands.common.block.container.BlockWeedwoodWorkbench;
import thebetweenlands.common.block.container.BlockWindChime;
import thebetweenlands.common.block.farming.BlockAspectrusCrop;
import thebetweenlands.common.block.farming.BlockBarnacle_1_2;
import thebetweenlands.common.block.farming.BlockBarnacle_3_4;
import thebetweenlands.common.block.farming.BlockDugDirt;
import thebetweenlands.common.block.farming.BlockDugGrass;
import thebetweenlands.common.block.farming.BlockFungusCrop;
import thebetweenlands.common.block.farming.BlockMiddleFruitBush;
import thebetweenlands.common.block.misc.BlockAmatePaperPane;
import thebetweenlands.common.block.misc.BlockBauble;
import thebetweenlands.common.block.misc.BlockBouncyBetweenlands;
import thebetweenlands.common.block.misc.BlockButtonBetweenlands;
import thebetweenlands.common.block.misc.BlockCavingRopeLight;
import thebetweenlands.common.block.misc.BlockDampTorch;
import thebetweenlands.common.block.misc.BlockDentrothystPane;
import thebetweenlands.common.block.misc.BlockFilteredSiltGlass;
import thebetweenlands.common.block.misc.BlockFilteredSiltGlassPane;
import thebetweenlands.common.block.misc.BlockFilteredSiltGlassStained;
import thebetweenlands.common.block.misc.BlockGlassBetweenlands;
import thebetweenlands.common.block.misc.BlockGlowingGoop;
import thebetweenlands.common.block.misc.BlockGlowingGoopUnderwater;
import thebetweenlands.common.block.misc.BlockGroundItem;
import thebetweenlands.common.block.misc.BlockLadderBetweenlands;
import thebetweenlands.common.block.misc.BlockLantern;
import thebetweenlands.common.block.misc.BlockLanternSiltGlass;
import thebetweenlands.common.block.misc.BlockLattice;
import thebetweenlands.common.block.misc.BlockLeverBetweenlands;
import thebetweenlands.common.block.misc.BlockMistBridge;
import thebetweenlands.common.block.misc.BlockMossBed;
import thebetweenlands.common.block.misc.BlockMudFlowerPot;
import thebetweenlands.common.block.misc.BlockMudFlowerPotCandle;
import thebetweenlands.common.block.misc.BlockOctine;
import thebetweenlands.common.block.misc.BlockOfferingTable;
import thebetweenlands.common.block.misc.BlockPaneBetweenlands;
import thebetweenlands.common.block.misc.BlockPolishedDentrothyst;
import thebetweenlands.common.block.misc.BlockPressurePlateBetweenlands;
import thebetweenlands.common.block.misc.BlockReedMat;
import thebetweenlands.common.block.misc.BlockReedMatColored;
import thebetweenlands.common.block.misc.BlockRope;
import thebetweenlands.common.block.misc.BlockRubberTap;
import thebetweenlands.common.block.misc.BlockSamiteCanvasPanel;
import thebetweenlands.common.block.misc.BlockSamiteCanvasPanelRotated;
import thebetweenlands.common.block.misc.BlockShadowWalker;
import thebetweenlands.common.block.misc.BlockSludge;
import thebetweenlands.common.block.misc.BlockSulfurTorch;
import thebetweenlands.common.block.misc.BlockSulfurTorchExtinguished;
import thebetweenlands.common.block.misc.BlockTrapDoorBetweenlands;
import thebetweenlands.common.block.plant.BlockAlgae;
import thebetweenlands.common.block.plant.BlockBlackHatMushroom;
import thebetweenlands.common.block.plant.BlockBladderwortFlower;
import thebetweenlands.common.block.plant.BlockBladderwortStalk;
import thebetweenlands.common.block.plant.BlockBogBeanFlower;
import thebetweenlands.common.block.plant.BlockBogBeanStalk;
import thebetweenlands.common.block.plant.BlockBulbCappedMushroom;
import thebetweenlands.common.block.plant.BlockBulbCappedMushroomCap;
import thebetweenlands.common.block.plant.BlockBulbCappedMushroomStalk;
import thebetweenlands.common.block.plant.BlockCaveGrass;
import thebetweenlands.common.block.plant.BlockCaveMoss;
import thebetweenlands.common.block.plant.BlockDoublePlantBL;
import thebetweenlands.common.block.plant.BlockEdgePlant;
import thebetweenlands.common.block.plant.BlockFlatheadMushroom;
import thebetweenlands.common.block.plant.BlockGoldenClubFlower;
import thebetweenlands.common.block.plant.BlockGoldenClubStalk;
import thebetweenlands.common.block.plant.BlockHollowLog;
import thebetweenlands.common.block.plant.BlockLichen;
import thebetweenlands.common.block.plant.BlockMarshMarigoldFlower;
import thebetweenlands.common.block.plant.BlockMarshMarigoldStalk;
import thebetweenlands.common.block.plant.BlockMoss;
import thebetweenlands.common.block.plant.BlockNesting;
import thebetweenlands.common.block.plant.BlockNettle;
import thebetweenlands.common.block.plant.BlockNettleFlowered;
import thebetweenlands.common.block.plant.BlockPhragmites;
import thebetweenlands.common.block.plant.BlockPlant;
import thebetweenlands.common.block.plant.BlockPlantUnderwater;
import thebetweenlands.common.block.plant.BlockPoisonIvy;
import thebetweenlands.common.block.plant.BlockSaplingBetweenlands;
import thebetweenlands.common.block.plant.BlockSaplingSpiritTree;
import thebetweenlands.common.block.plant.BlockShelfFungus;
import thebetweenlands.common.block.plant.BlockSludgeDungeonHangingPlant;
import thebetweenlands.common.block.plant.BlockSludgeDungeonPlant;
import thebetweenlands.common.block.plant.BlockSundew;
import thebetweenlands.common.block.plant.BlockSwampKelp;
import thebetweenlands.common.block.plant.BlockSwampReed;
import thebetweenlands.common.block.plant.BlockSwampReedUnderwater;
import thebetweenlands.common.block.plant.BlockThorns;
import thebetweenlands.common.block.plant.BlockVenusFlyTrap;
import thebetweenlands.common.block.plant.BlockWaterWeeds;
import thebetweenlands.common.block.plant.BlockWeedwoodBush;
import thebetweenlands.common.block.plant.BlockWeedwoodBushInfested;
import thebetweenlands.common.block.plant.BlockWeepingBlue;
import thebetweenlands.common.block.structure.BlockBeamLensSupport;
import thebetweenlands.common.block.structure.BlockBeamOrigin;
import thebetweenlands.common.block.structure.BlockBeamRelay;
import thebetweenlands.common.block.structure.BlockBeamTube;
import thebetweenlands.common.block.structure.BlockBrazier;
import thebetweenlands.common.block.structure.BlockCarvedMudBrick;
import thebetweenlands.common.block.structure.BlockCarvedMudBrick.EnumCarvedMudBrickType;
import thebetweenlands.common.block.structure.BlockChipPath;
import thebetweenlands.common.block.structure.BlockCompactedMud;
import thebetweenlands.common.block.structure.BlockCompactedMudSlope;
import thebetweenlands.common.block.structure.BlockDecayPitControl;
import thebetweenlands.common.block.structure.BlockDecayPitGroundChain;
import thebetweenlands.common.block.structure.BlockDecayPitHangingChain;
import thebetweenlands.common.block.structure.BlockDecayPitInvisibleFloorBlock;
import thebetweenlands.common.block.structure.BlockDecayPitInvisibleFloorBlockDiagonal;
import thebetweenlands.common.block.structure.BlockDecayPitInvisibleFloorBlockL1;
import thebetweenlands.common.block.structure.BlockDecayPitInvisibleFloorBlockL2;
import thebetweenlands.common.block.structure.BlockDecayPitInvisibleFloorBlockR1;
import thebetweenlands.common.block.structure.BlockDecayPitInvisibleFloorBlockR2;
import thebetweenlands.common.block.structure.BlockDiagonalEnergyBarrier;
import thebetweenlands.common.block.structure.BlockDoorBetweenlands;
import thebetweenlands.common.block.structure.BlockDruidStone;
import thebetweenlands.common.block.structure.BlockDungeonDoorCombination;
import thebetweenlands.common.block.structure.BlockDungeonDoorRunes;
import thebetweenlands.common.block.structure.BlockDungeonWallCandle;
import thebetweenlands.common.block.structure.BlockEnergyBarrier;
import thebetweenlands.common.block.structure.BlockEnergyBarrierMud;
import thebetweenlands.common.block.structure.BlockFenceBetweenlands;
import thebetweenlands.common.block.structure.BlockFenceGateBetweenlands;
import thebetweenlands.common.block.structure.BlockItemCage;
import thebetweenlands.common.block.structure.BlockMobSpawnerBetweenlands;
import thebetweenlands.common.block.structure.BlockMudBrickRoof;
import thebetweenlands.common.block.structure.BlockMudBrickShingleSlab;
import thebetweenlands.common.block.structure.BlockMudBrickShingleStained;
import thebetweenlands.common.block.structure.BlockMudBrickSpikeTrap;
import thebetweenlands.common.block.structure.BlockMudBricks;
import thebetweenlands.common.block.structure.BlockMudBricksClimbable;
import thebetweenlands.common.block.structure.BlockMudTiles;
import thebetweenlands.common.block.structure.BlockMudTilesSpikeTrap;
import thebetweenlands.common.block.structure.BlockMudTilesWater;
import thebetweenlands.common.block.structure.BlockPortalFrame;
import thebetweenlands.common.block.structure.BlockPossessedBlock;
import thebetweenlands.common.block.structure.BlockPuffshroom;
import thebetweenlands.common.block.structure.BlockRottenBarkCarved;
import thebetweenlands.common.block.structure.BlockSimulacrum;
import thebetweenlands.common.block.structure.BlockSlabBetweenlands;
import thebetweenlands.common.block.structure.BlockSpikeTrap;
import thebetweenlands.common.block.structure.BlockStairsBetweenlands;
import thebetweenlands.common.block.structure.BlockStandingWeedwoodSign;
import thebetweenlands.common.block.structure.BlockTarBeastSpawner;
import thebetweenlands.common.block.structure.BlockTemplePillar;
import thebetweenlands.common.block.structure.BlockThatchRoof;
import thebetweenlands.common.block.structure.BlockTreePortal;
import thebetweenlands.common.block.structure.BlockWalkway;
import thebetweenlands.common.block.structure.BlockWallBetweenlands;
import thebetweenlands.common.block.structure.BlockWallWeedwoodSign;
import thebetweenlands.common.block.structure.BlockWaystone;
import thebetweenlands.common.block.structure.BlockWoodenSupportBeam;
import thebetweenlands.common.block.structure.BlockWormDungeonPillar;
import thebetweenlands.common.block.terrain.BlockBetweenlandsBedrock;
import thebetweenlands.common.block.terrain.BlockBetweenstonePebblePile;
import thebetweenlands.common.block.terrain.BlockBetweenstonePebblePileWater;
import thebetweenlands.common.block.terrain.BlockBlackIce;
import thebetweenlands.common.block.terrain.BlockCircleGem;
import thebetweenlands.common.block.terrain.BlockCragrock;
import thebetweenlands.common.block.terrain.BlockDeadGrass;
import thebetweenlands.common.block.terrain.BlockDentrothyst;
import thebetweenlands.common.block.terrain.BlockFallenLeaves;
import thebetweenlands.common.block.terrain.BlockGenericCollapsing;
import thebetweenlands.common.block.terrain.BlockGenericMirage;
import thebetweenlands.common.block.terrain.BlockGenericOre;
import thebetweenlands.common.block.terrain.BlockGenericStone;
import thebetweenlands.common.block.terrain.BlockGiantRoot;
import thebetweenlands.common.block.terrain.BlockHanger;
import thebetweenlands.common.block.terrain.BlockHearthgroveLog;
import thebetweenlands.common.block.terrain.BlockLeavesSpiritTree;
import thebetweenlands.common.block.terrain.BlockLifeCrystalStalactite;
import thebetweenlands.common.block.terrain.BlockLogBetweenlands;
import thebetweenlands.common.block.terrain.BlockLogSap;
import thebetweenlands.common.block.terrain.BlockLyestone;
import thebetweenlands.common.block.terrain.BlockMud;
import thebetweenlands.common.block.terrain.BlockPeat;
import thebetweenlands.common.block.terrain.BlockPeatSmouldering;
import thebetweenlands.common.block.terrain.BlockPuddle;
import thebetweenlands.common.block.terrain.BlockRoot;
import thebetweenlands.common.block.terrain.BlockRootUnderwater;
import thebetweenlands.common.block.terrain.BlockRottenLog;
import thebetweenlands.common.block.terrain.BlockRubber;
import thebetweenlands.common.block.terrain.BlockRubberLog;
import thebetweenlands.common.block.terrain.BlockSilt;
import thebetweenlands.common.block.terrain.BlockSlimyGrass;
import thebetweenlands.common.block.terrain.BlockSludgyDirt;
import thebetweenlands.common.block.terrain.BlockSnowBetweenlands;
import thebetweenlands.common.block.terrain.BlockSpreadingRottenLog;
import thebetweenlands.common.block.terrain.BlockSpreadingSludgyDirt;
import thebetweenlands.common.block.terrain.BlockStagnantWater;
import thebetweenlands.common.block.terrain.BlockStalactite;
import thebetweenlands.common.block.terrain.BlockSwampDirt;
import thebetweenlands.common.block.terrain.BlockSwampGrass;
import thebetweenlands.common.block.terrain.BlockSwampWater;
import thebetweenlands.common.block.terrain.BlockTar;
import thebetweenlands.common.block.terrain.BlockTintedLeaves;
import thebetweenlands.common.block.terrain.BlockWisp;
import thebetweenlands.common.capability.circlegem.CircleGemType;
import thebetweenlands.common.config.BetweenlandsConfig;
import thebetweenlands.common.item.herblore.ItemPlantDrop.EnumItemPlantDrop;
import thebetweenlands.common.item.misc.ItemMisc.EnumItemMisc;
import thebetweenlands.common.lib.ModInfo;
import thebetweenlands.common.world.gen.feature.WorldGenRootPodRoots;
import thebetweenlands.common.world.gen.feature.tree.WorldGenHearthgroveTree;
import thebetweenlands.common.world.gen.feature.tree.WorldGenNibbletwigTree;
import thebetweenlands.common.world.gen.feature.tree.WorldGenRubberTree;
import thebetweenlands.common.world.gen.feature.tree.WorldGenSapTree;
import thebetweenlands.common.world.gen.feature.tree.WorldGenWeedwoodTree;
import thebetweenlands.util.AdvancedStateMap;

public class BlockRegistry {
    public static final Block SWAMP_WATER = new BlockSwampWater(FluidRegistry.SWAMP_WATER, Material.WATER);
    public static final Block STAGNANT_WATER = new BlockStagnantWater();
    public static final Block TAR = new BlockTar();
    public static final Block RUBBER = new BlockRubber();
    public static final Block DRUID_STONE_1 = new BlockDruidStone(Material.ROCK);
    public static final Block DRUID_STONE_2 = new BlockDruidStone(Material.ROCK);
    public static final Block DRUID_STONE_3 = new BlockDruidStone(Material.ROCK);
    public static final Block DRUID_STONE_4 = new BlockDruidStone(Material.ROCK);
    public static final Block DRUID_STONE_5 = new BlockDruidStone(Material.ROCK);
    public static final Block DRUID_STONE_6 = new BlockDruidStone(Material.ROCK);
    //TERRAIN BLOCKS
    public static final Block BETWEENLANDS_BEDROCK = new BlockBetweenlandsBedrock();
    public static final Block BETWEENSTONE = new BasicBlock(Material.ROCK)
            .setDefaultCreativeTab()
            .setSoundType2(SoundType.STONE)
            .setHardness(1.5F)
            .setResistance(10.0F);
    public static final Block GENERIC_STONE = new BlockGenericStone();
    public static final Block MUD = new BlockMud();
    public static final Block PEAT = new BlockPeat();
    public static final Block PEAT_SMOULDERING = new BlockPeatSmouldering();
    public static final Block SLUDGY_DIRT = new BlockSludgyDirt();
    public static final Block SPREADING_SLUDGY_DIRT = new BlockSpreadingSludgyDirt();
    public static final Block SLIMY_DIRT = new BasicBlock(Material.GROUND)
            .setDefaultCreativeTab()
            .setHarvestLevel2("shovel", 0)
            .setSoundType2(SoundType.GROUND)
            .setHardness(0.5F);
    public static final Block SLIMY_GRASS = new BlockSlimyGrass();
    public static final Block CRAGROCK = new BlockCragrock(Material.ROCK);
    public static final Block PITSTONE = new BasicBlock(Material.ROCK).setDefaultCreativeTab().setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block LIMESTONE = new BasicBlock(Material.ROCK)
            .setDefaultCreativeTab()
            .setSoundType2(SoundType.STONE)
            .setHardness(1.2F)
            .setResistance(8.0F);
    public static final Block SWAMP_DIRT = new BlockSwampDirt(Material.GROUND);
    public static final Block COARSE_SWAMP_DIRT = new BlockSwampDirt(Material.GROUND).setItemDropped(() -> Item.getItemFromBlock(BlockRegistry.SWAMP_DIRT));
    public static final Block SWAMP_GRASS = new BlockSwampGrass();
    public static final Block WISP = new BlockWisp();
    public static final Block OCTINE_ORE = new BlockGenericOre(Material.ROCK){
        @SideOnly(Side.CLIENT)
        @Override
        public void spawnParticle(World world, double x, double y, double z) {
            BLParticles.FLAME.spawn(world, x, y, z);
        }
    }.setHarvestLevel2("pickaxe", 1).setLightLevel(0.875F);
    public static final Block VALONITE_ORE = new BlockGenericOre(Material.ROCK) {
        @Override
        protected ItemStack getOreDrop(Random rand, int fortune) {
            return EnumItemMisc.VALONITE_SHARD.create(1 + rand.nextInt(fortune + 1));
        }
    }.setXP(5, 12).setHarvestLevel2("pickaxe", 2);
    public static final Block SULFUR_ORE = new BlockGenericOre(Material.ROCK) {
        @Override
        protected ItemStack getOreDrop(Random rand, int fortune) {
            return EnumItemMisc.SULFUR.create(1 + rand.nextInt(fortune + 1));
        }

        @SideOnly(Side.CLIENT)
        @Override
        public void spawnParticle(World world, double x, double y, double z) {
            BLParticles.SULFUR_ORE.spawn(world, x, y, z);
        }
    }.setXP(0, 2).setHarvestLevel2("pickaxe", 0);
    public static final Block SLIMY_BONE_ORE = new BlockGenericOre(Material.ROCK) {
        @Override
        protected ItemStack getOreDrop(Random rand, int fortune) {
            return EnumItemMisc.SLIMY_BONE.create(1 + rand.nextInt(fortune + 1));
        }
    }.setXP(1, 4).setHarvestLevel2("pickaxe", 0);
    public static final Block SCABYST_ORE = new BlockGenericOre(Material.ROCK) {
        @Override
        protected ItemStack getOreDrop(Random rand, int fortune) {
            return EnumItemMisc.SCABYST.create(1 + rand.nextInt(fortune + 3));
        }
    }.setXP(4, 10).setHarvestLevel2("pickaxe", 2);
    public static final Block SYRMORITE_ORE = new BlockGenericOre(Material.ROCK).setHarvestLevel2("pickaxe", 1);
    public static final Block AQUA_MIDDLE_GEM_ORE = new BlockCircleGem(CircleGemType.AQUA);
    public static final Block CRIMSON_MIDDLE_GEM_ORE = new BlockCircleGem(CircleGemType.CRIMSON);
    public static final Block GREEN_MIDDLE_GEM_ORE = new BlockCircleGem(CircleGemType.GREEN);
    public static final Block LIFE_CRYSTAL_STALACTITE = new BlockLifeCrystalStalactite(FluidRegistry.SWAMP_WATER, Material.WATER);
    public static final Block STALACTITE = new BlockStalactite();
    public static final Block SILT = new BlockSilt();
    public static final Block FILTERED_SILT = new BlockSilt();
    public static final Block DEAD_GRASS = new BlockDeadGrass();
    public static final Block TAR_SOLID = new BasicBlock(Material.ROCK)
            .setDefaultCreativeTab()
            .setSoundType2(SoundType.STONE)
            .setHardness(1.5F)
            .setResistance(10.0F);
    public static final Block PUDDLE = new BlockPuddle();
    public static final Block PEARL_BLOCK = new BasicBlock(Material.ROCK)
            .setDefaultCreativeTab()
            .setSoundType2(SoundType.STONE)
            .setHardness(1.2F)
            .setResistance(8.0F);
    public static final Block ANCIENT_REMNANT_BLOCK = new BasicBlock(Material.ROCK)
            .setDefaultCreativeTab()
            .setSoundType2(SoundType.STONE)
            .setHardness(1.2F)
            .setResistance(8.0F);
    //TREES
    public static final Block LOG_WEEDWOOD = new BlockLogBetweenlands();
    public static final Block LOG_ROTTEN_BARK = new BlockRottenLog();
    public static final Block LOG_SPREADING_ROTTEN_BARK = new BlockSpreadingRottenLog();
    public static final Block LOG_RUBBER = new BlockRubberLog();
    public static final Block LOG_HEARTHGROVE = new BlockHearthgroveLog();
    public static final Block LOG_NIBBLETWIG = new BlockLogBetweenlands();
    public static final Block LOG_SPIRIT_TREE = new BlockLogBetweenlands();
    public static final Block WEEDWOOD = new BasicBlock(Material.WOOD).setHarvestLevel2("axe", 0).setSoundType2(SoundType.WOOD).setHardness(2.0F);
    public static final Block LOG_SAP = new BlockLogSap();
    public static final Block SAPLING_WEEDWOOD = new BlockSaplingBetweenlands(new WorldGenWeedwoodTree());
    public static final Block SAPLING_SAP = new BlockSaplingBetweenlands(new WorldGenSapTree());
    public static final Block SAPLING_RUBBER = new BlockSaplingBetweenlands(new WorldGenRubberTree());
    public static final Block SAPLING_HEARTHGROVE = new BlockSaplingBetweenlands(new WorldGenHearthgroveTree());
    public static final Block SAPLING_NIBBLETWIG = new BlockSaplingBetweenlands(new WorldGenNibbletwigTree());
    public static final Block SAPLING_SPIRIT_TREE = new BlockSaplingSpiritTree();
    public static final Block ROOT_POD = new BlockSaplingBetweenlands(new WorldGenRootPodRoots());
    public static final Block LEAVES_WEEDWOOD_TREE = new BlockTintedLeaves() {
    	@Override
    	public Item getItemDropped(IBlockState state, Random rand, int fortune) {
    		return Item.getItemFromBlock(BlockRegistry.SAPLING_WEEDWOOD);
    	}
    };
    public static final Block LEAVES_SAP_TREE = new BlockTintedLeaves() {
        @Override
        public Item getItemDropped(IBlockState state, Random rand, int fortune) {
            return Item.getItemFromBlock(BlockRegistry.SAPLING_SAP);
        }
    };
    public static final Block LEAVES_RUBBER_TREE = new BlockTintedLeaves() {
        @Override
        public Item getItemDropped(IBlockState state, Random rand, int fortune) {
            return Item.getItemFromBlock(BlockRegistry.SAPLING_RUBBER);
        }
    };
    public static final Block LEAVES_HEARTHGROVE_TREE = new BlockTintedLeaves() {
    	@Override
    	public Item getItemDropped(IBlockState state, Random rand, int fortune) {
    		return Item.getItemFromBlock(BlockRegistry.SAPLING_HEARTHGROVE);
    	}
    };
    public static final Block LEAVES_NIBBLETWIG_TREE = new BlockTintedLeaves() {
    	@Override
    	public Item getItemDropped(IBlockState state, Random rand, int fortune) {
    		return Item.getItemFromBlock(BlockRegistry.SAPLING_NIBBLETWIG);
    	}
    };
    public static final Block LEAVES_SPIRIT_TREE_TOP = new BlockLeavesSpiritTree(BlockLeavesSpiritTree.Type.TOP);
    public static final Block LEAVES_SPIRIT_TREE_MIDDLE = new BlockLeavesSpiritTree(BlockLeavesSpiritTree.Type.MIDDLE);
    public static final Block LEAVES_SPIRIT_TREE_BOTTOM = new BlockLeavesSpiritTree(BlockLeavesSpiritTree.Type.BOTTOM);
    //STRUCTURE
    public static final Block WEEDWOOD_PLANKS = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(2.0F).setResistance(5.0F);
    public static final Block RUBBER_TREE_PLANKS = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block GIANT_ROOT_PLANKS = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block HEARTHGROVE_PLANKS = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block NIBBLETWIG_PLANKS = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block ANGRY_BETWEENSTONE = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F).setLightLevel(0.8F);
    public static final Block BETWEENSTONE_BRICKS = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block BETWEENSTONE_BRICKS_MIRAGE = new BlockGenericMirage(Material.CIRCUITS).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block BETWEENSTONE_TILES = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block BETWEENSTONE_CHISELED = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRAGROCK_CHISELED = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRAGROCK_CHISELED_CRACKED = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRAGROCK_CHISELED_MOSSY = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block LIMESTONE_CHISELED = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block PITSTONE_CHISELED = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block SCABYST_CHISELED_1 = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block SCABYST_CHISELED_2 = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block SCABYST_CHISELED_3 = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block SCABYST_PITSTONE_DOTTED = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block SCABYST_PITSTONE_HORIZONTAL = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block SCABYST_BRICKS = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRACKED_BETWEENSTONE_BRICKS = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRACKED_BETWEENSTONE_TILES = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRACKED_LIMESTONE_BRICKS = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRAGROCK_BRICKS = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRAGROCK_BRICKS_CRACKED = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRAGROCK_BRICKS_MOSSY = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRAGROCK_TILES = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRAGROCK_TILES_CRACKED = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block CRAGROCK_TILES_MOSSY = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block GLOWING_BETWEENSTONE_TILE = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F).setLightLevel(0.875F);
    public static final Block INACTIVE_GLOWING_SMOOTH_CRAGROCK = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block GLOWING_SMOOTH_CRAGROCK = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F).setLightLevel(0.875F);
    public static final Block LIMESTONE_BRICKS = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block LIMESTONE_TILES = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block MOSSY_BETWEENSTONE_BRICKS = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block MOSSY_BETWEENSTONE_TILES = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block MOSSY_LIMESTONE_BRICKS = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block MOSSY_SMOOTH_BETWEENSTONE = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block MUD_BRICKS = new BlockMudBricks();
    public static final Block MUD_BRICK_SHINGLES = new BlockMudBricks();
    public static final Block RUBBER_BLOCK = new BlockBouncyBetweenlands(0.8f).setSoundType2(SoundType.SLIME).setHardness(1.0f);
    public static final Block PITSTONE_BRICKS = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block PITSTONE_TILES = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block POLISHED_LIMESTONE = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block SMOOTH_BETWEENSTONE = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block SMOOTH_CRAGROCK = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block OCTINE_BLOCK = new BlockOctine();
    public static final Block SYRMORITE_BLOCK = new BasicBlock(Material.IRON).setSoundType2(SoundType.METAL).setHardness(1.5F).setResistance(10.0F);
    public static final Block VALONITE_BLOCK = new BasicBlock(Material.IRON).setSoundType2(SoundType.METAL).setHardness(1.5F).setResistance(10.0F);
    public static final Block SCABYST_BLOCK = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block WEAK_BETWEENSTONE_TILES = new BlockGenericCollapsing(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block WEAK_POLISHED_LIMESTONE = new BlockGenericCollapsing(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block WEAK_MOSSY_BETWEENSTONE_TILES = new BlockGenericCollapsing(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block WEAK_SMOOTH_CRAGROCK = new BlockGenericCollapsing(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block DENTROTHYST = new BlockDentrothyst(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block LOOT_POT = new BlockLootPot();
    public static final Block MOB_SPAWNER = new BlockMobSpawnerBetweenlands();
    public static final Block TEMPLE_PILLAR = new BlockTemplePillar();
    public static final Block BETWEENSTONE_PILLAR = new BlockTemplePillar();
    public static final Block PITSTONE_PILLAR = new BlockTemplePillar();
    public static final Block LIMESTONE_PILLAR = new BlockTemplePillar();
    public static final Block CRAGROCK_PILLAR = new BlockTemplePillar();
    public static final Block TAR_BEAST_SPAWNER = new BlockTarBeastSpawner();
    public static final Block TAR_LOOT_POT = new BlockTarLootPot();
    public static final Block CRAGROCK_STAIRS = new BlockStairsBetweenlands(CRAGROCK.getDefaultState());
    public static final Block PITSTONE_STAIRS = new BlockStairsBetweenlands(PITSTONE.getDefaultState());
    public static final Block BETWEENSTONE_STAIRS = new BlockStairsBetweenlands(BETWEENSTONE.getDefaultState());
    public static final Block BETWEENSTONE_BRICK_STAIRS = new BlockStairsBetweenlands(BETWEENSTONE_BRICKS.getDefaultState());
    public static final Block MUD_BRICK_STAIRS = new BlockStairsBetweenlands(MUD_BRICKS.getDefaultState());
    public static final Block CRAGROCK_BRICK_STAIRS = new BlockStairsBetweenlands(CRAGROCK_BRICKS.getDefaultState());
    public static final Block LIMESTONE_BRICK_STAIRS = new BlockStairsBetweenlands(LIMESTONE_BRICKS.getDefaultState());
    public static final Block PITSTONE_BRICK_STAIRS = new BlockStairsBetweenlands(PITSTONE_BRICKS.getDefaultState());
    public static final Block LIMESTONE_STAIRS = new BlockStairsBetweenlands(LIMESTONE.getDefaultState());
    public static final Block SMOOTH_BETWEENSTONE_STAIRS = new BlockStairsBetweenlands(SMOOTH_BETWEENSTONE.getDefaultState());
    public static final Block SMOOTH_CRAGROCK_STAIRS = new BlockStairsBetweenlands(SMOOTH_CRAGROCK.getDefaultState());
    public static final Block POLISHED_LIMESTONE_STAIRS = new BlockStairsBetweenlands(POLISHED_LIMESTONE.getDefaultState());
    public static final Block MOSSY_BETWEENSTONE_BRICK_STAIRS = new BlockStairsBetweenlands(MOSSY_BETWEENSTONE_BRICKS.getDefaultState());
    public static final Block MOSSY_SMOOTH_BETWEENSTONE_STAIRS = new BlockStairsBetweenlands(MOSSY_SMOOTH_BETWEENSTONE.getDefaultState());
    public static final Block CRACKED_BETWEENSTONE_BRICK_STAIRS = new BlockStairsBetweenlands(CRACKED_BETWEENSTONE_BRICKS.getDefaultState());
    public static final Block SCABYST_BRICK_STAIRS = new BlockStairsBetweenlands(SCABYST_BRICKS.getDefaultState());
    public static final Block SULFUR_BLOCK = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block TEMPLE_BRICKS = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block SMOOTH_PITSTONE = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block MIRE_CORAL_BLOCK = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F).setLightLevel(1F);
    public static final Block DEEP_WATER_CORAL_BLOCK = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F).setLightLevel(1F);
    public static final Block SLIMY_BONE_BLOCK = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F);
    public static final Block AQUA_MIDDLE_GEM_BLOCK = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F).setLightLevel(0.9f);
    public static final Block CRIMSON_MIDDLE_GEM_BLOCK = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F).setLightLevel(0.9f);
    public static final Block GREEN_MIDDLE_GEM_BLOCK = new BasicBlock(Material.ROCK).setSoundType2(SoundType.STONE).setHardness(1.5F).setResistance(10.0F).setLightLevel(0.9f);
    public static final Block COMPOST_BLOCK = new BasicBlock(Material.PLANTS).setSoundType2(SoundType.PLANT).setHardness(0.5F).setResistance(10.0F);
    public static final Block POLISHED_DENTROTHYST = new BlockPolishedDentrothyst().setHardness(0.3F);
    public static final Block SILT_GLASS = new BlockGlassBetweenlands(Material.GLASS).setHardness(0.3F);
    public static final Block SILT_GLASS_PANE = new BlockPaneBetweenlands(Material.GLASS).setHardness(0.3F);
    public static final Block LATTICE = new BlockLattice();
    public static final Block LATTICE_FINE = new BlockLattice().setHardness(1.5F);
    public static final Block FILTERED_SILT_GLASS = new BlockFilteredSiltGlass().setHardness(0.3F);
    public static final Block FILTERED_SILT_GLASS_PANE = new BlockFilteredSiltGlassPane();
    public static final Block POLISHED_DENTROTHYST_PANE = new BlockDentrothystPane().setHardness(0.3F);
    public static final Block AMATE_PAPER_PANE_1 = new BlockAmatePaperPane();
    public static final Block AMATE_PAPER_PANE_2 = new BlockAmatePaperPane();
    public static final Block AMATE_PAPER_PANE_3 = new BlockAmatePaperPane();
    public static final Block SMOOTH_PITSTONE_STAIRS = new BlockStairsBetweenlands(SMOOTH_PITSTONE.getDefaultState());
    public static final Block TAR_SOLID_STAIRS = new BlockStairsBetweenlands(TAR_SOLID.getDefaultState());
    public static final Block TEMPLE_BRICK_STAIRS = new BlockStairsBetweenlands(TEMPLE_BRICKS.getDefaultState());
    public static final Block SPIKE_TRAP = new BlockSpikeTrap();
    public static final Block WEEDWOOD_PLANK_STAIRS = new BlockStairsBetweenlands(WEEDWOOD_PLANKS.getDefaultState());
    public static final Block RUBBER_TREE_PLANK_STAIRS = new BlockStairsBetweenlands(RUBBER_TREE_PLANKS.getDefaultState());
    public static final Block GIANT_ROOT_PLANK_STAIRS = new BlockStairsBetweenlands(GIANT_ROOT_PLANKS.getDefaultState());
    public static final Block HEARTHGROVE_PLANK_STAIRS = new BlockStairsBetweenlands(HEARTHGROVE_PLANKS.getDefaultState());
    public static final Block NIBBLETWIG_PLANK_STAIRS = new BlockStairsBetweenlands(NIBBLETWIG_PLANKS.getDefaultState());
    public static final Block POSSESSED_BLOCK = new BlockPossessedBlock();
    public static final Block ITEM_CAGE = new BlockItemCage();
    public static final Block ITEM_SHELF = new BlockItemShelf();
    public static final Block THATCH = new BasicBlock(Material.GRASS).setSoundType2(SoundType.PLANT).setDefaultCreativeTab().setHardness(0.5F);
    public static final Block CRAGROCK_SLAB = new BlockSlabBetweenlands(CRAGROCK);
    public static final Block PITSTONE_SLAB = new BlockSlabBetweenlands(PITSTONE);
    public static final Block BETWEENSTONE_SLAB = new BlockSlabBetweenlands(BETWEENSTONE);
    public static final Block SMOOTH_PITSTONE_SLAB = new BlockSlabBetweenlands(SMOOTH_PITSTONE);
    public static final Block TAR_SOLID_SLAB = new BlockSlabBetweenlands(TAR_SOLID);
    public static final Block TEMPLE_BRICK_SLAB = new BlockSlabBetweenlands(TEMPLE_BRICKS);
    public static final Block BETWEENSTONE_BRICK_SLAB = new BlockSlabBetweenlands(BETWEENSTONE_BRICKS);
    public static final Block MUD_BRICK_SLAB = new BlockSlabBetweenlands(MUD_BRICKS);
    public static final Block CRAGROCK_BRICK_SLAB = new BlockSlabBetweenlands(CRAGROCK_BRICKS);
    public static final Block LIMESTONE_BRICK_SLAB = new BlockSlabBetweenlands(LIMESTONE_BRICKS);
    public static final Block LIMESTONE_SLAB = new BlockSlabBetweenlands(LIMESTONE);
    public static final Block SMOOTH_BETWEENSTONE_SLAB = new BlockSlabBetweenlands(SMOOTH_BETWEENSTONE);
    public static final Block SMOOTH_CRAGROCK_SLAB = new BlockSlabBetweenlands(SMOOTH_CRAGROCK);
    public static final Block POLISHED_LIMESTONE_SLAB = new BlockSlabBetweenlands(POLISHED_LIMESTONE);
    public static final Block PITSTONE_BRICK_SLAB = new BlockSlabBetweenlands(PITSTONE_BRICKS);
    public static final Block MOSSY_BETWEENSTONE_BRICK_SLAB = new BlockSlabBetweenlands(MOSSY_BETWEENSTONE_BRICKS);
    public static final Block MOSSY_SMOOTH_BETWEENSTONE_SLAB = new BlockSlabBetweenlands(MOSSY_SMOOTH_BETWEENSTONE);
    public static final Block CRACKED_BETWEENSTONE_BRICK_SLAB = new BlockSlabBetweenlands(CRACKED_BETWEENSTONE_BRICKS);
    public static final Block WEEDWOOD_PLANK_SLAB = new BlockSlabBetweenlands(WEEDWOOD_PLANKS);
    public static final Block RUBBER_TREE_PLANK_SLAB = new BlockSlabBetweenlands(RUBBER_TREE_PLANKS);
    public static final Block GIANT_ROOT_PLANK_SLAB = new BlockSlabBetweenlands(GIANT_ROOT_PLANKS);
    public static final Block HEARTHGROVE_PLANK_SLAB = new BlockSlabBetweenlands(HEARTHGROVE_PLANKS);
    public static final Block NIBBLETWIG_PLANK_SLAB = new BlockSlabBetweenlands(NIBBLETWIG_PLANKS);
    public static final Block MUD_BRICK_SHINGLE_SLAB = new BlockMudBrickShingleSlab();
    public static final Block MUD_BRICK_SHINGLE_STAIRS = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_WALL = new BlockWallBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block FILTERED_SILT_GLASS_STAINED = new BlockFilteredSiltGlassStained().setHardness(0.3F);
    public static final Block MUD_BRICK_SHINGLE_STAINED = new BlockMudBrickShingleStained();

    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_DULL_LAVENDER = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_MAROON = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_SHADOW_GREEN = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_CAMELOT_MAGENTA = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_SAFFRON = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_CARIBBEAN_GREEN = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_VIVID_TANGERINE = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_CHAMPAGNE = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_RAISIN_BLACK = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_SUSHI_GREEN = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_ELM_CYAN = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_CADMIUM_GREEN = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_LAVENDER_BLUE = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_BROWN_RUST = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_MIDNIGHT_PURPLE = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);
    public static final Block MUD_BRICK_SHINGLE_SLAB_STAINED_PEWTER_GREY = new BlockSlabBetweenlands(MUD_BRICK_SHINGLES);

    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_DULL_LAVENDER = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_MAROON = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_SHADOW_GREEN = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_CAMELOT_MAGENTA = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_SAFFRON = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_CARIBBEAN_GREEN = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_VIVID_TANGERINE = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_CHAMPAGNE = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_RAISIN_BLACK = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_SUSHI_GREEN = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_ELM_CYAN = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_CADMIUM_GREEN = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_LAVENDER_BLUE = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_BROWN_RUST = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_MIDNIGHT_PURPLE = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());
    public static final Block MUD_BRICK_SHINGLE_STAIRS_STAINED_PEWTER_GREY = new BlockStairsBetweenlands(MUD_BRICK_SHINGLES.getDefaultState());

    public static final Block THATCH_SLAB = new BlockSlabBetweenlands(THATCH).setHardness(0.5F);
    public static final Block SCABYST_BRICK_SLAB = new BlockSlabBetweenlands(SCABYST_BRICKS);
    public static final Block PITSTONE_WALL = new BlockWallBetweenlands(PITSTONE.getDefaultState());
    public static final Block BETWEENSTONE_WALL = new BlockWallBetweenlands(BETWEENSTONE.getDefaultState());
    public static final Block TAR_SOLID_WALL = new BlockWallBetweenlands(TAR_SOLID.getDefaultState());
    public static final Block TEMPLE_BRICK_WALL = new BlockWallBetweenlands(TEMPLE_BRICKS.getDefaultState());
    public static final Block SMOOTH_PITSTONE_WALL = new BlockWallBetweenlands(SMOOTH_PITSTONE.getDefaultState());
    public static final Block BETWEENSTONE_BRICK_WALL = new BlockWallBetweenlands(BETWEENSTONE_BRICKS.getDefaultState());
    public static final Block MUD_BRICK_WALL = new BlockWallBetweenlands(MUD_BRICKS.getDefaultState());
    public static final Block CRAGROCK_WALL = new BlockWallBetweenlands(CRAGROCK.getDefaultState());
    public static final Block CRAGROCK_BRICK_WALL = new BlockWallBetweenlands(CRAGROCK_BRICKS.getDefaultState());
    public static final Block LIMESTONE_BRICK_WALL = new BlockWallBetweenlands(LIMESTONE_BRICKS.getDefaultState());
    public static final Block LIMESTONE_WALL = new BlockWallBetweenlands(LIMESTONE.getDefaultState());
    public static final Block POLISHED_LIMESTONE_WALL = new BlockWallBetweenlands(LIMESTONE.getDefaultState());
    public static final Block PITSTONE_BRICK_WALL = new BlockWallBetweenlands(PITSTONE_BRICKS.getDefaultState());
    public static final Block SMOOTH_BETWEENSTONE_WALL = new BlockWallBetweenlands(SMOOTH_BETWEENSTONE.getDefaultState());
    public static final Block SMOOTH_CRAGROCK_WALL = new BlockWallBetweenlands(SMOOTH_CRAGROCK.getDefaultState());
    public static final Block MOSSY_BETWEENSTONE_BRICK_WALL = new BlockWallBetweenlands(MOSSY_BETWEENSTONE_BRICKS.getDefaultState());
    public static final Block MOSSY_SMOOTH_BETWEENSTONE_WALL = new BlockWallBetweenlands(MOSSY_SMOOTH_BETWEENSTONE.getDefaultState());
    public static final Block CRACKED_BETWEENSTONE_BRICK_WALL = new BlockWallBetweenlands(CRACKED_BETWEENSTONE_BRICKS.getDefaultState());
    public static final Block SCABYST_BRICK_WALL = new BlockWallBetweenlands(SCABYST_BRICKS.getDefaultState());
    public static final Block WEEDWOOD_PLANK_FENCE = new BlockFenceBetweenlands(WEEDWOOD_PLANKS.getDefaultState());
    public static final Block WEEDWOOD_LOG_FENCE = new BlockFenceBetweenlands(WEEDWOOD.getDefaultState());
    public static final Block RUBBER_TREE_PLANK_FENCE = new BlockFenceBetweenlands(RUBBER_TREE_PLANKS.getDefaultState());
    public static final Block GIANT_ROOT_PLANK_FENCE = new BlockFenceBetweenlands(GIANT_ROOT_PLANKS.getDefaultState());
    public static final Block HEARTHGROVE_PLANK_FENCE = new BlockFenceBetweenlands(HEARTHGROVE_PLANKS.getDefaultState());
    public static final Block NIBBLETWIG_PLANK_FENCE = new BlockFenceBetweenlands(NIBBLETWIG_PLANKS.getDefaultState());
    public static final Block WEEDWOOD_PLANK_FENCE_GATE = new BlockFenceGateBetweenlands(WEEDWOOD_PLANKS.getDefaultState());
    public static final Block WEEDWOOD_LOG_FENCE_GATE = new BlockFenceGateBetweenlands(WEEDWOOD.getDefaultState());
    public static final Block RUBBER_TREE_PLANK_FENCE_GATE = new BlockFenceGateBetweenlands(RUBBER_TREE_PLANKS.getDefaultState());
    public static final Block GIANT_ROOT_PLANK_FENCE_GATE = new BlockFenceGateBetweenlands(GIANT_ROOT_PLANKS.getDefaultState());
    public static final Block HEARTHGROVE_PLANK_FENCE_GATE = new BlockFenceGateBetweenlands(HEARTHGROVE_PLANKS.getDefaultState());
    public static final Block NIBBLETWIG_PLANK_FENCE_GATE = new BlockFenceGateBetweenlands(NIBBLETWIG_PLANKS.getDefaultState());
    public static final Block WEEDWOOD_PLANK_PRESSURE_PLATE = new BlockPressurePlateBetweenlands(Material.WOOD, BlockPressurePlateBetweenlands.PressurePlateSensitivity.EVERYTHING)
            .setSoundType(SoundType.WOOD)
            .setHardness(2.0F)
            .setResistance(5.0F);
    public static final Block BETWEENSTONE_PRESSURE_PLATE = new BlockPressurePlateBetweenlands(Material.ROCK, BlockPressurePlateBetweenlands.PressurePlateSensitivity.MOBS)
            .setSoundType(SoundType.STONE)
            .setHardness(1.5F)
            .setResistance(10.0F);
    public static final Block SYRMORITE_PRESSURE_PLATE = new BlockPressurePlateBetweenlands(Material.IRON, BlockPressurePlateBetweenlands.PressurePlateSensitivity.PLAYERS)
            .setSoundType(SoundType.METAL)
            .setHardness(1.5F)
            .setResistance(10.0F);
    public static final Block WEEDWOOD_PLANK_BUTTON = new BlockButtonBetweenlands(true);
    public static final Block BETWEENSTONE_BUTTON = new BlockButtonBetweenlands(false);
    public static final Block WEEDWOOD_LADDER = new BlockLadderBetweenlands();
    public static final Block WEEDWOOD_LEVER = new BlockLeverBetweenlands();
    public static final Block MUD_LOOT_POT = new BlockMudLootPot();
    
    //Worm Dungeon
    public static final Block WORM_DUNGEON_PILLAR = new BlockWormDungeonPillar();
    public static final Block COMPACTED_MUD = new BlockCompactedMud();
    public static final Block MUD_TILES = new BlockMudTiles();
    public static final Block PUFFSHROOM = new BlockPuffshroom();
    public static final Block MUD_BRICKS_CARVED = new BlockCarvedMudBrick();
    public static final Block MUD_BRICK_STAIRS_DECAY_1 = new BlockStairsBetweenlands(MUD_BRICKS_CARVED.getDefaultState().withProperty(BlockCarvedMudBrick.VARIANT, EnumCarvedMudBrickType.MUD_BRICKS_DECAY_1));
    public static final Block MUD_BRICK_STAIRS_DECAY_2 = new BlockStairsBetweenlands(MUD_BRICKS_CARVED.getDefaultState().withProperty(BlockCarvedMudBrick.VARIANT, EnumCarvedMudBrickType.MUD_BRICKS_DECAY_2));
    public static final Block MUD_BRICK_STAIRS_DECAY_3 = new BlockStairsBetweenlands(MUD_BRICKS_CARVED.getDefaultState().withProperty(BlockCarvedMudBrick.VARIANT, EnumCarvedMudBrickType.MUD_BRICKS_DECAY_3));
    public static final Block MUD_BRICK_STAIRS_DECAY_4 = new BlockStairsBetweenlands(MUD_BRICKS_CARVED.getDefaultState().withProperty(BlockCarvedMudBrick.VARIANT, EnumCarvedMudBrickType.MUD_BRICKS_DECAY_4));
    public static final Block MUD_BRICK_SLAB_DECAY_1 = new BlockSlabBetweenlands(MUD_BRICKS_CARVED.getDefaultState().withProperty(BlockCarvedMudBrick.VARIANT, EnumCarvedMudBrickType.MUD_BRICKS_DECAY_1).getBlock());
    public static final Block MUD_BRICK_SLAB_DECAY_2 = new BlockSlabBetweenlands(MUD_BRICKS_CARVED.getDefaultState().withProperty(BlockCarvedMudBrick.VARIANT, EnumCarvedMudBrickType.MUD_BRICKS_DECAY_2).getBlock());
    public static final Block MUD_BRICK_SLAB_DECAY_3 = new BlockSlabBetweenlands(MUD_BRICKS_CARVED.getDefaultState().withProperty(BlockCarvedMudBrick.VARIANT, EnumCarvedMudBrickType.MUD_BRICKS_DECAY_3).getBlock());
    public static final Block MUD_BRICK_SLAB_DECAY_4 = new BlockSlabBetweenlands(MUD_BRICKS_CARVED.getDefaultState().withProperty(BlockCarvedMudBrick.VARIANT, EnumCarvedMudBrickType.MUD_BRICKS_DECAY_4).getBlock());
    public static final Block EDGE_SHROOM = new BlockEdgePlant().setSickleDrop(EnumItemPlantDrop.EDGE_SHROOM_GILLS.create(1));
    public static final Block EDGE_MOSS = new BlockEdgePlant().setSickleDrop(EnumItemPlantDrop.EDGE_MOSS_CLUMP.create(1));
    public static final Block EDGE_LEAF = new BlockEdgePlant().setSickleDrop(EnumItemPlantDrop.EDGE_LEAF_ITEM.create(1));
    public static final Block MUD_TOWER_BEAM_ORIGIN = new BlockBeamOrigin();
    public static final Block MUD_TOWER_BEAM_RELAY = new BlockBeamRelay();
    public static final Block MUD_TOWER_BEAM_TUBE = new BlockBeamTube();
    public static final Block MUD_TOWER_BEAM_LENS_SUPPORTS = new BlockBeamLensSupport();
    public static final Block DIAGONAL_ENERGY_BARRIER = new BlockDiagonalEnergyBarrier();
    public static final Block MUD_BRICK_ALCOVE = new BlockMudBrickAlcove();
    public static final Block LOOT_URN = new BlockLootUrn();
	public static final Block DUNGEON_DOOR_RUNES = new BlockDungeonDoorRunes(false, false);
	public static final Block DUNGEON_DOOR_RUNES_MIMIC = new BlockDungeonDoorRunes(true, true);
	public static final Block DUNGEON_DOOR_RUNES_CRAWLER = new BlockDungeonDoorRunes(true, false);
	public static final Block DUNGEON_DOOR_COMBINATION = new BlockDungeonDoorCombination();
	public static final Block MUD_BRICKS_CLIMBABLE = new BlockMudBricksClimbable();
	public static final Block MUD_TILES_WATER = new BlockMudTilesWater();
	public static final Block DUNGEON_WALL_CANDLE = new BlockDungeonWallCandle();
	public static final Block WOODEN_SUPPORT_BEAM_ROTTEN_1 = new BlockWoodenSupportBeam();
	public static final Block WOODEN_SUPPORT_BEAM_ROTTEN_2 = new BlockWoodenSupportBeam();
	public static final Block WOODEN_SUPPORT_BEAM_ROTTEN_3 = new BlockWoodenSupportBeam();
	public static final Block LOG_ROTTEN_BARK_CARVED_1 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_2 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_3 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_4 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_5 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_6 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_7 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_8 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_9 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_10 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_11 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_12 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_13 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_14 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_15 = new BlockRottenBarkCarved();
	public static final Block LOG_ROTTEN_BARK_CARVED_16 = new BlockRottenBarkCarved();
	public static final Block ENERGY_BARRIER_MUD = new BlockEnergyBarrierMud();
	public static final Block MUD_BRICK_SPIKE_TRAP = new BlockMudBrickSpikeTrap();
	public static final Block MUD_TILES_SPIKE_TRAP = new BlockMudTilesSpikeTrap();
	public static final Block COMPACTED_MUD_SLOPE = new BlockCompactedMudSlope();
	public static final Block COMPACTED_MUD_SLAB = new BlockSlabBetweenlands(COMPACTED_MUD);
	public static final Block COMPACTED_MUD_MIRAGE = new BlockGenericMirage(Material.CIRCUITS).setSoundType2(SoundType.GROUND).setHardness(1.5F).setResistance(10.0F);
	public static final Block DECAY_PIT_CONTROL = new BlockDecayPitControl();
	public static final Block ROTTEN_PLANKS = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(1.5F).setResistance(4.0F);
	public static final Block ROTTEN_PLANK_SLAB = new BlockSlabBetweenlands(ROTTEN_PLANKS);
	public static final Block ROTTEN_PLANK_STAIRS = new BlockStairsBetweenlands(ROTTEN_PLANKS.getDefaultState());
    public static final Block ROTTEN_PLANK_FENCE = new BlockFenceBetweenlands(ROTTEN_PLANKS.getDefaultState());
    public static final Block ROTTEN_PLANK_FENCE_GATE = new BlockFenceGateBetweenlands(WEEDWOOD_PLANKS.getDefaultState());


    public static final Block MUD_TOWER_BRAZIER = new BlockBrazier();
	public static final Block DECAY_PIT_HANGING_CHAIN = new BlockDecayPitHangingChain();
	public static final Block DECAY_PIT_GROUND_CHAIN = new BlockDecayPitGroundChain();
	public static final Block DECAY_PIT_INVISIBLE_FLOOR_BLOCK = new BlockDecayPitInvisibleFloorBlock();
	public static final Block DECAY_PIT_INVISIBLE_FLOOR_BLOCK_R_1 = new BlockDecayPitInvisibleFloorBlockR1();
	public static final Block DECAY_PIT_INVISIBLE_FLOOR_BLOCK_R_2 = new BlockDecayPitInvisibleFloorBlockR2();
	public static final Block DECAY_PIT_INVISIBLE_FLOOR_BLOCK_L_1 = new BlockDecayPitInvisibleFloorBlockL1();
	public static final Block DECAY_PIT_INVISIBLE_FLOOR_BLOCK_L_2 = new BlockDecayPitInvisibleFloorBlockL2();
	public static final Block DECAY_PIT_INVISIBLE_FLOOR_BLOCK_DIAGONAL = new BlockDecayPitInvisibleFloorBlockDiagonal();
	//Winter Event
    public static final Block PRESENT = new BlockPresent();
    
    //Plants
    public static final BlockDoublePlantBL PITCHER_PLANT = new BlockDoublePlantBL().setSickleDrop(EnumItemPlantDrop.PITCHER_PLANT_TRAP.create(1));
    public static final BlockDoublePlantBL WEEPING_BLUE = new BlockWeepingBlue();
    public static final BlockDoublePlantBL SUNDEW = new BlockSundew();
    public static final Block BLACK_HAT_MUSHROOM = new BlockBlackHatMushroom();
    public static final Block BULB_CAPPED_MUSHROOM = new BlockBulbCappedMushroom();
    public static final Block FLAT_HEAD_MUSHROOM = new BlockFlatheadMushroom();
    public static final Block VENUS_FLY_TRAP = new BlockVenusFlyTrap().setSickleDrop(EnumItemPlantDrop.VENUS_FLY_TRAP_ITEM.create(1));
    public static final BlockDoublePlantBL VOLARPAD = new BlockDoublePlantBL().setSickleDrop(EnumItemPlantDrop.VOLARPAD_ITEM.create(1));
    public static final Block SWAMP_PLANT = new BlockPlant() {
        @Override
        @SideOnly(Side.CLIENT)
        public Block.EnumOffsetType getOffsetType() {
            return Block.EnumOffsetType.XZ;
        }
    }.setSickleDrop(EnumItemPlantDrop.GENERIC_LEAF.create(1)).setReplaceable(true);
    public static final Block SWAMP_KELP = new BlockSwampKelp();
    public static final Block MIRE_CORAL = new BlockPlantUnderwater().setSickleDrop(EnumItemPlantDrop.MIRE_CORAL_ITEM.create(1)).setLightLevel(1F);
    public static final Block DEEP_WATER_CORAL = new BlockPlantUnderwater().setSickleDrop(EnumItemPlantDrop.DEEP_WATER_CORAL_ITEM.create(1)).setLightLevel(1F);
    public static final Block WATER_WEEDS = new BlockWaterWeeds();
    public static final Block BULB_CAPPED_MUSHROOM_CAP = new BlockBulbCappedMushroomCap();
    public static final Block BULB_CAPPED_MUSHROOM_STALK = new BlockBulbCappedMushroomStalk();
    public static final Block SHELF_FUNGUS = new BlockShelfFungus();
    public static final Block ALGAE = new BlockAlgae().setSickleDrop(EnumItemPlantDrop.ALGAE_ITEM.create(1));
    public static final Block POISON_IVY = new BlockPoisonIvy();
    public static final Block ROOT = new BlockRoot();
    public static final Block ROOT_UNDERWATER = new BlockRootUnderwater();
    public static final Block GIANT_ROOT = new BlockGiantRoot();
    public static final Block ARROW_ARUM = new BlockPlant().setSickleDrop(EnumItemPlantDrop.ARROW_ARUM_LEAF.create(1));
    public static final Block BLUE_EYED_GRASS = new BlockPlant().setSickleDrop(EnumItemPlantDrop.BLUE_EYED_GRASS_FLOWERS.create(1));
    public static final Block BLUE_IRIS = new BlockPlant().setSickleDrop(EnumItemPlantDrop.BLUE_IRIS_PETAL.create(1));
    public static final Block BONESET = new BlockPlant().setSickleDrop(EnumItemPlantDrop.BONESET_FLOWERS.create(1));
    public static final Block BOTTLE_BRUSH_GRASS = new BlockPlant().setSickleDrop(EnumItemPlantDrop.BOTTLE_BRUSH_GRASS_BLADES.create(1));
    public static final BlockDoublePlantBL BROOMSEDGE = new BlockDoublePlantBL().setSickleDrop(EnumItemPlantDrop.BROOM_SEDGE_LEAVES.create(1)).setReplaceable(true);
    public static final Block BUTTON_BUSH = new BlockPlant().setSickleDrop(EnumItemPlantDrop.BUTTON_BUSH_FLOWERS.create(1));
    public static final BlockDoublePlantBL CARDINAL_FLOWER = new BlockDoublePlantBL().setSickleDrop(EnumItemPlantDrop.CARDINAL_FLOWER_PETALS.create(1));
    public static final Block CATTAIL = new BlockPlant().setSickleDrop(EnumItemPlantDrop.CATTAIL_HEAD.create(1));
    public static final Block CAVE_GRASS = new BlockCaveGrass().setSickleDrop(EnumItemPlantDrop.CAVE_GRASS_BLADES.create(1)).setReplaceable(true);
    public static final Block COPPER_IRIS = new BlockPlant().setSickleDrop(EnumItemPlantDrop.COPPER_IRIS_PETALS.create(1));
    public static final Block MARSH_HIBISCUS = new BlockPlant().setSickleDrop(EnumItemPlantDrop.MARSH_HIBISCUS_FLOWER.create(1));
    public static final Block MARSH_MALLOW = new BlockPlant().setSickleDrop(EnumItemPlantDrop.MARSH_MALLOW_FLOWER.create(1));
    public static final Block BLADDERWORT_FLOWER = new BlockBladderwortFlower().setSickleDrop(EnumItemPlantDrop.BLADDERWORT_FLOWER_ITEM.create(1));
    public static final Block BLADDERWORT_STALK = new BlockBladderwortStalk().setSickleDrop(EnumItemPlantDrop.BLADDERWORT_STALK_ITEM.create(1));
    public static final Block BOG_BEAN_FLOWER = new BlockBogBeanFlower().setSickleDrop(EnumItemPlantDrop.BOG_BEAN_FLOWER_ITEM.create(1));
    public static final Block BOG_BEAN_STALK = new BlockBogBeanStalk().setSickleDrop(EnumItemPlantDrop.BOG_BEAN_FLOWER_ITEM.create(1));
    public static final Block GOLDEN_CLUB_FLOWER = new BlockGoldenClubFlower().setSickleDrop(EnumItemPlantDrop.GOLDEN_CLUB_FLOWER_ITEM.create(1));
    public static final Block GOLDEN_CLUB_STALK = new BlockGoldenClubStalk().setSickleDrop(EnumItemPlantDrop.GOLDEN_CLUB_FLOWER_ITEM.create(1));
    public static final Block MARSH_MARIGOLD_FLOWER = new BlockMarshMarigoldFlower().setSickleDrop(EnumItemPlantDrop.MARSH_MARIGOLD_FLOWER_ITEM.create(1));
    public static final Block MARSH_MARIGOLD_STALK = new BlockMarshMarigoldStalk().setSickleDrop(EnumItemPlantDrop.MARSH_MARIGOLD_FLOWER_ITEM.create(1));
    public static final BlockDoublePlantBL SWAMP_DOUBLE_TALLGRASS = new BlockDoublePlantBL().setSickleDrop(EnumItemPlantDrop.SWAMP_TALL_GRASS_BLADES.create(1)).setReplaceable(true);
    public static final Block MILKWEED = new BlockPlant().setSickleDrop(EnumItemPlantDrop.MILKWEED_ITEM.create(1));
    public static final Block NETTLE = new BlockNettle().setSickleDrop(EnumItemPlantDrop.NETTLE_LEAF.create(1));
    public static final Block NETTLE_FLOWERED = new BlockNettleFlowered().setSickleDrop(EnumItemPlantDrop.NETTLE_LEAF.create(1));
    public static final Block PICKEREL_WEED = new BlockPlant().setSickleDrop(EnumItemPlantDrop.PICKEREL_WEED_FLOWER.create(1));
    public static final BlockDoublePlantBL PHRAGMITES = new BlockPhragmites().setReplaceable(true);
    public static final Block SHOOTS = new BlockPlant().setSickleDrop(EnumItemPlantDrop.SHOOT_LEAVES.create(1)).setReplaceable(true);
    public static final Block SLUDGECREEP = new BlockPlant().setSickleDrop(EnumItemPlantDrop.SLUDGECREEP_LEAVES.create(1)).setReplaceable(true);
    public static final Block TALL_SLUDGECREEP = new BlockSludgeDungeonPlant().setSickleDrop(EnumItemPlantDrop.SLUDGECREEP_LEAVES.create(1)).setReplaceable(true);
    public static final Block SOFT_RUSH = new BlockPlant().setSickleDrop(EnumItemPlantDrop.SOFT_RUSH_LEAVES.create(1)).setReplaceable(true);
    public static final Block SWAMP_REED = new BlockSwampReed();
    public static final Block SWAMP_REED_UNDERWATER = new BlockSwampReedUnderwater();
    public static final Block THORNS = new BlockThorns();
    public static final BlockDoublePlantBL TALL_CATTAIL = new BlockDoublePlantBL().setSickleDrop(EnumItemPlantDrop.CATTAIL_HEAD.create(1));
    public static final Block SWAMP_TALLGRASS = new BlockPlant().setSickleDrop(EnumItemPlantDrop.SWAMP_TALL_GRASS_BLADES.create(1)).setReplaceable(true);
    public static final Block DEAD_WEEDWOOD_BUSH = new BlockPlant().setSickleDrop(EnumItemMisc.WEEDWOOD_STICK.create(1));
    public static final Block WEEDWOOD_BUSH = new BlockWeedwoodBush();
    public static final Block NESTING_BLOCK_STICKS = new BlockNesting(EnumItemMisc.WEEDWOOD_STICK.create(1));
    public static final Block NESTING_BLOCK_BONES = new BlockNesting(EnumItemMisc.SLIMY_BONE.create(1));
    public static final Block HOLLOW_LOG = new BlockHollowLog();
    public static final Block CAVE_MOSS = new BlockCaveMoss();
    public static final Block CRYPTWEED = new BlockSludgeDungeonHangingPlant().setSickleDrop(EnumItemPlantDrop.CRYPTWEED_BLADES.create(1));
    public static final Block STRING_ROOTS = new BlockSludgeDungeonHangingPlant().setSickleDrop(EnumItemPlantDrop.STRING_ROOT_FIBERS.create(1));
    public static final Block PALE_GRASS = new BlockSludgeDungeonPlant() {
    	@Override
        @SideOnly(Side.CLIENT)
        public BlockRenderLayer getRenderLayer() {
            return BlockRenderLayer.TRANSLUCENT;
        }
    }.setSickleDrop(EnumItemPlantDrop.PALE_GRASS_BLADES.create(1)).setReplaceable(true);
    public static final Block ROTBULB = new BlockSludgeDungeonPlant().setSickleDrop(EnumItemPlantDrop.ROTBULB_STALK.create(1)).setReplaceable(true);
    public static final Block MOSS = new BlockMoss(true).setSickleDrop(EnumItemPlantDrop.MOSS_ITEM.create(1)).setReplaceable(true);
    public static final Block DEAD_MOSS = new BlockMoss(false).setSickleDrop(EnumItemPlantDrop.MOSS_ITEM.create(1)).setReplaceable(true);
    public static final Block LICHEN = new BlockLichen(true).setSickleDrop(EnumItemPlantDrop.LICHEN_ITEM.create(1)).setReplaceable(true);
    public static final Block DEAD_LICHEN = new BlockLichen(false).setSickleDrop(EnumItemPlantDrop.LICHEN_ITEM.create(1)).setReplaceable(true);
    public static final Block HANGER = new BlockHanger();
    public static final Block MIDDLE_FRUIT_BUSH = new BlockMiddleFruitBush();
    public static final Block FUNGUS_CROP = new BlockFungusCrop();
    public static final BlockAspectrusCrop ASPECTRUS_CROP = new BlockAspectrusCrop();
    public static final Block WEEDWOOD_BUSH_INFESTED_0 = new BlockWeedwoodBushInfested(ItemStack.EMPTY, 0);
    public static final Block WEEDWOOD_BUSH_INFESTED_1 = new BlockWeedwoodBushInfested(ItemStack.EMPTY, 1);
    public static final Block WEEDWOOD_BUSH_INFESTED_2 = new BlockWeedwoodBushInfested(new ItemStack(ItemRegistry.SILK_GRUB), 2);// drop silk worm
    public static final Block WEEDWOOD_BUSH_INFESTED_3 = new BlockWeedwoodBushInfested(EnumItemMisc.SILK_GRUB_COCOON.create(1), 3);// drop silk but render cocoons
    public static final Block WEEDWOOD_BUSH_INFESTED_4 = new BlockWeedwoodBushInfested(ItemStack.EMPTY, 4);// decay 
    
    public static final Block PURIFIED_SWAMP_DIRT = new BlockSwampDirt(Material.GROUND);
    public static final Block DUG_SWAMP_DIRT = new BlockDugDirt(false).setItemDropped(() -> Item.getItemFromBlock(SWAMP_DIRT));
    public static final Block DUG_PURIFIED_SWAMP_DIRT = new BlockDugDirt(true).setItemDropped(() -> Item.getItemFromBlock(SWAMP_DIRT));
    public static final Block DUG_SWAMP_GRASS = new BlockDugGrass(false).setItemDropped(() -> Item.getItemFromBlock(SWAMP_DIRT));
    public static final Block DUG_PURIFIED_SWAMP_GRASS = new BlockDugGrass(true).setItemDropped(() -> Item.getItemFromBlock(SWAMP_DIRT));
    public static final Block BLACK_ICE = new BlockBlackIce();
    public static final Block SNOW = new BlockSnowBetweenlands();

    //Misc
    public static final Block LOG_PORTAL = new BlockLogBetweenlands() {
    	@Override
    	public int getFlammability(IBlockAccess world, BlockPos pos, EnumFacing face) {
    		return 0;
        }
    };
    public static final Block TREE_PORTAL = new BlockTreePortal();
    public static final Block PORTAL_FRAME = new BlockPortalFrame();
    public static final Block DRUID_ALTAR = new BlockDruidAltar();
    public static final Block PURIFIER = new BlockPurifier();
    public static final Block WEEDWOOD_WORKBENCH = new BlockWeedwoodWorkbench();
    public static final Block COMPOST_BIN = new BlockCompostBin();
    public static final Block WEEDWOOD_JUKEBOX = new BlockWeedwoodJukebox();
    public static final Block SULFUR_FURNACE = new BlockBLFurnace(false);
    public static final Block SULFUR_FURNACE_ACTIVE = new BlockBLFurnace(true).setLightLevel(0.875F);
    public static final Block SULFUR_FURNACE_DUAL = new BlockBLDualFurnace(false);
    public static final Block SULFUR_FURNACE_DUAL_ACTIVE = new BlockBLDualFurnace(true).setLightLevel(0.875F);
    public static final Block WEEDWOOD_CHEST = new BlockChestBetweenlands(BlockChestBetweenlands.WEEDWOOD_CHEST);
    public static final Block WEEDWOOD_RUBBER_TAP = new BlockRubberTap(BlockRegistry.WEEDWOOD_PLANKS.getDefaultState(), 540) {
        @Override
        protected ItemStack getBucket(boolean withRubber) {
            return new ItemStack(withRubber ? ItemRegistry.BL_BUCKET_RUBBER: ItemRegistry.BL_BUCKET, 1, 0);
        }
    };
    public static final Block SYRMORITE_RUBBER_TAP = new BlockRubberTap(BlockRegistry.SYRMORITE_BLOCK.getDefaultState(), 260) {
        @Override
        protected ItemStack getBucket(boolean withRubber) {
            return new ItemStack(withRubber ? ItemRegistry.BL_BUCKET_RUBBER: ItemRegistry.BL_BUCKET, 1, 1);
        }
    };
    public static final BlockSludge SLUDGE = new BlockSludge();
    public static final Block FALLEN_LEAVES = new BlockFallenLeaves("fallenLeaves");
    public static final Block ENERGY_BARRIER = new BlockEnergyBarrier();
    public static final Block WEEDWOOD_DOOR = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.WEEDWOOD_DOOR_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(2.0F).setResistance(5.0F);
    public static final Block RUBBER_TREE_PLANK_DOOR = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.RUBBER_TREE_PLANK_DOOR_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block GIANT_ROOT_PLANK_DOOR = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.GIANT_ROOT_PLANK_DOOR_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block HEARTHGROVE_PLANK_DOOR = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.HEARTHGROVE_PLANK_DOOR_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block NIBBLETWIG_PLANK_DOOR = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.NIBBLETWIG_PLANK_DOOR_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block SYRMORITE_DOOR = new BlockDoorBetweenlands(Material.IRON) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.SYRMORITE_DOOR_ITEM);
        }
    }.setSoundType(SoundType.METAL).setHardness(1.5F).setResistance(10.0F);
    public static final Block SCABYST_DOOR = new BlockDoorBetweenlands(Material.IRON) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.SCABYST_DOOR_ITEM);
        }
    }.setSoundType(SoundType.METAL).setHardness(1.5F).setResistance(10.0F);
    public static final Block ROTTEN_PLANK_DOOR = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.ROTTEN_PLANK_DOOR_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(1.0F).setResistance(5.0F);
    public static final Block WEEDWOOD_DOOR_TREATED = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.WEEDWOOD_DOOR_TREATED_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(2.0F).setResistance(5.0F);
    public static final Block RUBBER_TREE_PLANK_DOOR_TREATED = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.RUBBER_TREE_PLANK_DOOR_TREATED_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block GIANT_ROOT_PLANK_DOOR_TREATED = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.GIANT_ROOT_PLANK_DOOR_TREATED_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block HEARTHGROVE_PLANK_DOOR_TREATED = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.HEARTHGROVE_PLANK_DOOR_TREATED_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block NIBBLETWIG_PLANK_DOOR_TREATED = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.NIBBLETWIG_PLANK_DOOR_TREATED_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(1.0F).setResistance(5.0F);
    public static final Block ROTTEN_PLANK_DOOR_TREATED = new BlockDoorBetweenlands(Material.WOOD) {
        @Override
        public ItemStack getDoorItem() {
            return new ItemStack(ItemRegistry.ROTTEN_PLANK_DOOR_TREATED_ITEM);
        }
    }.setSoundType(SoundType.WOOD).setHardness(1.0F).setResistance(5.0F);
    public static final Block STANDING_WEEDWOOD_SIGN = new BlockStandingWeedwoodSign();
    public static final Block WALL_WEEDWOOD_SIGN = new BlockWallWeedwoodSign();
    public static final Block SULFUR_TORCH = new BlockSulfurTorch();
    public static final Block SULFUR_TORCH_EXTINGUISHED = new BlockSulfurTorchExtinguished();
    public static final Block WEEDWOOD_TRAPDOOR = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(2.0F).setResistance(5.0F);
    public static final Block RUBBER_TREE_PLANK_TRAPDOOR = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block SYRMORITE_TRAPDOOR = new BlockTrapDoorBetweenlands(Material.IRON).setSoundType(SoundType.METAL).setHardness(1.5F).setResistance(10.0F);
    public static final Block GIANT_ROOT_PLANK_TRAPDOOR = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block HEARTHGROVE_PLANK_TRAPDOOR = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block NIBBLETWIG_PLANK_TRAPDOOR = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block ROTTEN_PLANK_TRAPDOOR = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(1.0F).setResistance(5.0F);
    public static final Block WEEDWOOD_TRAPDOOR_TREATED = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(2.0F).setResistance(5.0F);
    public static final Block RUBBER_TREE_PLANK_TRAPDOOR_TREATED  = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block GIANT_ROOT_PLANK_TRAPDOOR_TREATED  = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block HEARTHGROVE_PLANK_TRAPDOOR_TREATED  = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block NIBBLETWIG_PLANK_TRAPDOOR_TREATED  = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
    public static final Block ROTTEN_PLANK_TRAPDOOR_TREATED  = new BlockTrapDoorBetweenlands(Material.WOOD).setSoundType(SoundType.WOOD).setHardness(1.0F).setResistance(5.0F);
    public static final Block SCABYST_TRAPDOOR = new BlockTrapDoorBetweenlands(Material.IRON).setSoundType(SoundType.STONE).setHardness(1.75F).setResistance(5.0F);
    public static final Block SYRMORITE_HOPPER = new BlockHopperBetweenlands();
    public static final Block MUD_FLOWER_POT = new BlockMudFlowerPot();
    public static final Block MUD_FLOWER_POT_CANDLE = new BlockMudFlowerPotCandle();
    public static final Block GECKO_CAGE = new BlockGeckoCage();
    public static final Block INFUSER = new BlockInfuser();
    public static final Block ASPECT_VIAL_BLOCK = new BlockAspectVial();
    public static final Block MORTAR = new BlockMortar();
    public static final Block CENSER = new BlockCenser();
    public static final Block WEEDWOOD_BARREL = new BlockBarrel(WEEDWOOD_PLANKS.getDefaultState(), false);
    public static final Block SYRMORITE_BARREL = new BlockBarrel(SYRMORITE_BLOCK.getDefaultState(), true);
    public static final Block ANIMATOR = new BlockAnimator();
    public static final Block ALEMBIC = new BlockAlembic();
    public static final Block MOSS_BED = new BlockMossBed();
    public static final Block ROPE = new BlockRope();
    public static final Block DAMP_TORCH = new BlockDampTorch();
    public static final Block WALKWAY = new BlockWalkway();
    public static final Block WOOD_CHIP_PATH = new BlockChipPath();
    public static final Block THATCH_ROOF = new BlockThatchRoof();
    public static final Block MUD_BRICK_ROOF = new BlockMudBrickRoof();
    public static final Block REPELLER = new BlockRepeller();
    public static final Block WAYSTONE = new BlockWaystone();
    public static final Block CAVING_ROPE_LIGHT = new BlockCavingRopeLight();
    public static final Block GROUND_ITEM = new BlockGroundItem();
    public static final BlockSimulacrum SIMULACRUM_DEEPMAN = new BlockSimulacrum(Material.ROCK, SoundType.STONE);
    public static final BlockSimulacrum SIMULACRUM_LAKE_CAVERN = new BlockSimulacrum(Material.ROCK, SoundType.STONE);
    public static final BlockSimulacrum SIMULACRUM_ROOTMAN = new BlockSimulacrum(Material.WOOD, SoundType.WOOD);
    public static final Block OFFERING_TABLE = new BlockOfferingTable();
    public static final Block WIND_CHIME = new BlockWindChime();
    public static final Block LANTERN_PAPER_1 = new BlockLantern();
    public static final Block LANTERN_PAPER_2 = new BlockLantern();
    public static final Block LANTERN_PAPER_3 = new BlockLantern();
    public static final Block LANTERN_SILT_GLASS = new BlockLanternSiltGlass();
    public static final Block BAUBLE = new BlockBauble();
    public static final Block FISHING_TACKLE_BOX = new BlockFishingTackleBox();
    public static final Block SMOKING_RACK = new BlockSmokingRack();
    public static final Block FISH_TRIMMING_TABLE = new BlockFishTrimmingTable();
    public static final Block CRAB_POT = new BlockCrabPot();
    public static final Block CRAB_POT_FILTER = new BlockCrabPotFilter();
    public static final Block SILT_GLASS_JAR = new BlockSiltGlassJar();
    public static final Block BETWEENSTONE_PEBBLE_PILE = new BlockBetweenstonePebblePile();
    public static final Block BETWEENSTONE_PEBBLE_PILE_WATER = new BlockBetweenstonePebblePileWater();
    public static final Block BARNACLE_1_2 = new BlockBarnacle_1_2();
    public static final Block BARNACLE_3_4 = new BlockBarnacle_3_4();
    public static final Block GLOWING_GOOP = new BlockGlowingGoop();
    public static final Block GLOWING_GOOP_UNDERWATER = new BlockGlowingGoopUnderwater();
    public static final Block REED_MAT = new BlockReedMat();
    //WIP
    //public static final Block ANIMAL_BURROW_SILT = new BlockAnimalBurrow(Material.SAND);
    //public static final Block ANIMAL_BURROW_MUD = new BlockAnimalBurrow(BLMaterialRegistry.MUD);
    //public static final Block ANIMAL_BURROW_CRAGROCK = new BlockAnimalBurrow(Material.ROCK);
    public static final Block LYESTONE = new BlockLyestone(Material.ROCK);
    public static final Block MIST_BRIDGE = new BlockMistBridge(Material.ROCK);
    public static final Block SHADOW_WALKER = new BlockShadowWalker(Material.AIR);
    
    public static final Block STEEPING_POT = new BlockSteepingPot();
    public static final Block GRUB_HUB = new BlockGrubHub();
    public static final Block WATER_FILTER = new BlockWaterFilter();
    public static final Block FILTERED_SILT_GLASS_JAR = new BlockFilteredSiltGlassJar();

    public static final Block MOTH_HOUSE = new BlockMothHouse();
    
    public static final Block SAMITE = new BlockBLColored(Material.CLOTH, SoundType.CLOTH).setHardness(0.8F);
    public static final Block SAMITE_CANVAS_PANEL = new BlockSamiteCanvasPanel(Material.CLOTH, SoundType.CLOTH).setHardness(0.8F);
    public static final Block SAMITE_CANVAS_PANEL_ROTATED = new BlockSamiteCanvasPanelRotated(Material.CLOTH, SoundType.CLOTH).setHardness(0.8F);
    public static final Block REED_MAT_COLORED = new BlockReedMatColored(Material.PLANTS, SoundType.PLANT);

    public static final Block WEEDWOOD_PLANKS_TREATED = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(2.0F).setResistance(5.0F);
	public static final Block WEEDWOOD_PLANK_SLAB_TREATED = new BlockSlabBetweenlands(WEEDWOOD_PLANKS_TREATED);
	public static final Block WEEDWOOD_PLANK_STAIRS_TREATED = new BlockStairsBetweenlands(WEEDWOOD_PLANKS_TREATED.getDefaultState());
    public static final Block WEEDWOOD_PLANK_FENCE_TREATED = new BlockFenceBetweenlands(WEEDWOOD_PLANKS_TREATED.getDefaultState());
    public static final Block WEEDWOOD_PLANK_FENCE_GATE_TREATED = new BlockFenceGateBetweenlands(WEEDWOOD_PLANKS_TREATED.getDefaultState());

    public static final Block RUBBER_TREE_PLANKS_TREATED = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
	public static final Block RUBBER_TREE_PLANK_SLAB_TREATED = new BlockSlabBetweenlands(RUBBER_TREE_PLANKS_TREATED);
	public static final Block RUBBER_TREE_PLANK_STAIRS_TREATED = new BlockStairsBetweenlands(RUBBER_TREE_PLANKS_TREATED.getDefaultState());
    public static final Block RUBBER_TREE_PLANK_FENCE_TREATED = new BlockFenceBetweenlands(RUBBER_TREE_PLANKS_TREATED.getDefaultState());
    public static final Block RUBBER_TREE_PLANK_FENCE_GATE_TREATED = new BlockFenceGateBetweenlands(RUBBER_TREE_PLANKS_TREATED.getDefaultState());

    public static final Block GIANT_ROOT_PLANKS_TREATED = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
	public static final Block GIANT_ROOT_PLANK_SLAB_TREATED = new BlockSlabBetweenlands(GIANT_ROOT_PLANKS_TREATED);
	public static final Block GIANT_ROOT_PLANK_STAIRS_TREATED = new BlockStairsBetweenlands(GIANT_ROOT_PLANKS_TREATED.getDefaultState());
    public static final Block GIANT_ROOT_PLANK_FENCE_TREATED = new BlockFenceBetweenlands(GIANT_ROOT_PLANKS_TREATED.getDefaultState());
    public static final Block GIANT_ROOT_PLANK_FENCE_GATE_TREATED = new BlockFenceGateBetweenlands(GIANT_ROOT_PLANKS_TREATED.getDefaultState());

    public static final Block HEARTHGROVE_PLANKS_TREATED = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
	public static final Block HEARTHGROVE_PLANK_SLAB_TREATED = new BlockSlabBetweenlands(HEARTHGROVE_PLANKS_TREATED);
	public static final Block HEARTHGROVE_PLANK_STAIRS_TREATED = new BlockStairsBetweenlands(HEARTHGROVE_PLANKS_TREATED.getDefaultState());
    public static final Block HEARTHGROVE_PLANK_FENCE_TREATED = new BlockFenceBetweenlands(HEARTHGROVE_PLANKS_TREATED.getDefaultState());
    public static final Block HEARTHGROVE_PLANK_FENCE_GATE_TREATED = new BlockFenceGateBetweenlands(HEARTHGROVE_PLANKS_TREATED.getDefaultState());

    public static final Block NIBBLETWIG_PLANKS_TREATED = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(1.75F).setResistance(5.0F);
	public static final Block NIBBLETWIG_PLANK_SLAB_TREATED = new BlockSlabBetweenlands(NIBBLETWIG_PLANKS_TREATED);
	public static final Block NIBBLETWIG_PLANK_STAIRS_TREATED = new BlockStairsBetweenlands(NIBBLETWIG_PLANKS_TREATED.getDefaultState());
    public static final Block NIBBLETWIG_PLANK_FENCE_TREATED = new BlockFenceBetweenlands(NIBBLETWIG_PLANKS_TREATED.getDefaultState());
    public static final Block NIBBLETWIG_PLANK_FENCE_GATE_TREATED = new BlockFenceGateBetweenlands(NIBBLETWIG_PLANKS_TREATED.getDefaultState());

    public static final Block ROTTEN_PLANKS_TREATED = new BasicBlock(Material.WOOD).setSoundType2(SoundType.WOOD).setHardness(1.5F).setResistance(4.0F);
	public static final Block ROTTEN_PLANK_SLAB_TREATED = new BlockSlabBetweenlands(ROTTEN_PLANKS_TREATED);
	public static final Block ROTTEN_PLANK_STAIRS_TREATED = new BlockStairsBetweenlands(ROTTEN_PLANKS_TREATED.getDefaultState());
    public static final Block ROTTEN_PLANK_FENCE_TREATED = new BlockFenceBetweenlands(ROTTEN_PLANKS_TREATED.getDefaultState());
    public static final Block ROTTEN_PLANK_FENCE_GATE_TREATED = new BlockFenceGateBetweenlands(ROTTEN_PLANKS_TREATED.getDefaultState());

    public static final Set<Block> BLOCKS = new LinkedHashSet<>();
    public static final List<ItemBlock> ITEM_BLOCKS = new ArrayList<ItemBlock>();

    
    private BlockRegistry() {
    }

    public static void preInit() {
        try {
            for (Field field : BlockRegistry.class.getDeclaredFields()) {
                Object obj = field.get(null);
                if (obj instanceof Block) {
                    Block block = (Block) obj;
                    String name = field.getName().toLowerCase(Locale.ENGLISH);
                    registerBlock(name, block);
                }
            }
        } catch (IllegalAccessException e) {
            throw new RuntimeException(e);
        }
    }

    public static void registerBlock(String name, Block block) {
        BLOCKS.add(block);
        block.setRegistryName(ModInfo.ID, name).setTranslationKey(ModInfo.ID + "." + name);

        ItemBlock item = null;
        if (block instanceof ICustomItemBlock)
            item = ((ICustomItemBlock) block).getItemBlock();
        else
            item = new ItemBlock(block);
        if(item != null) {
        	ITEM_BLOCKS.add(item);
        	item.setRegistryName(ModInfo.ID, name).setTranslationKey(ModInfo.ID + "." + name);
        	
        	if (BetweenlandsConfig.DEBUG.debug && FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) {
                if (block.getCreativeTab() == null)
                    TheBetweenlands.logger.warn(String.format("Block %s doesn't have a creative tab", block.getTranslationKey()));
            }
        }
    }

    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public static void registerBlockRenderers(ModelRegistryEvent event) {
        for (Block block : BlockRegistry.BLOCKS) {
            if (block instanceof IStateMappedBlock) {
                AdvancedStateMap.Builder builder = new AdvancedStateMap.Builder();
                ((IStateMappedBlock) block).setStateMapper(builder);
                ModelLoader.setCustomStateMapper(block, builder.build());
            }
            
            Item item = Item.getItemFromBlock(block);
            
            if(item != Items.AIR) {
	            if (block instanceof ICustomItemBlock) {
	                ICustomItemBlock customItemBlock = (ICustomItemBlock) block;
	                ItemStack renderedItem = customItemBlock.getRenderedItem();
	                if (!renderedItem.isEmpty()) {
	                	Map<Integer, ResourceLocation> map = TheBetweenlands.proxy.getItemModelMap(renderedItem.getItem());
	                	ModelResourceLocation model = (ModelResourceLocation) map.get(renderedItem.getMetadata());
	                    ModelLoader.setCustomModelResourceLocation(item, 0, model);
	                    continue;
	                }
	            }
	            ResourceLocation name = block.getRegistryName();
	            if (block instanceof ISubtypeItemBlockModelDefinition) {
	                ISubtypeItemBlockModelDefinition subtypeBlock = (ISubtypeItemBlockModelDefinition) block;
	                for (int i = 0; i < subtypeBlock.getSubtypeNumber(); i++) {
	                    int meta = subtypeBlock.getSubtypeMeta(i);
	                    ModelLoader.setCustomModelResourceLocation(item, meta, new ModelResourceLocation(name.getNamespace() + ":" + String.format(subtypeBlock.getSubtypeName(meta), name.getPath()), "inventory"));
	                }
	            } else {
	                ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(name, "inventory"));
	            }
        	}
        }
    }

    public interface ICustomItemBlock {
        /**
         * Returns a custom item for this block.
         *
         * @return
         */
        @Nullable
        default ItemBlock getItemBlock() {
            return getDefaultItemBlock((Block) this);
        }
        
        /**
         * Returns the default item for the specified block
         * @param block
         * @return
         */
        static ItemBlock getDefaultItemBlock(Block block) {
        	if (Item.getItemFromBlock(block) != Items.AIR)
                return (ItemBlock) Item.getItemFromBlock(block);
            else
                return new ItemBlock(block);
        }

        /**
         * Returns which item this block should be rendered as
         *
         * @return
         */
        @SideOnly(Side.CLIENT)
        default ItemStack getRenderedItem() {
            return ItemStack.EMPTY;
        }
    }

    public interface ISubtypeItemBlockModelDefinition {
        /**
         * Returns the amount of subtypes
         *
         * @return
         */
        int getSubtypeNumber();

        /**
         * Returns the name of this subtype.
         * String is formatted, use %s for the normal registry name.
         *
         * @param meta
         * @return
         */
        String getSubtypeName(int meta);

        /**
         * Returns the metadata for the specified subtype
         *
         * @param subtype
         * @return
         */
        default int getSubtypeMeta(int subtype) {
            return subtype;
        }
    }

    public interface IStateMappedBlock {
        /**
         * Sets the statemap
         *
         * @param builder
         */
        @SideOnly(Side.CLIENT)
        void setStateMapper(AdvancedStateMap.Builder builder);
    }

    @SubscribeEvent
    public static void registerBlocks(final RegistryEvent.Register<Block> event) {
        final IForgeRegistry<Block> registry = event.getRegistry();
        for (Block block : BLOCKS) {
            registry.register(block);
        }
    }
}



