package net.minecraft.data.models;

import javax.annotation.Nullable;
import net.minecraft.world.item.SpawnEggItem;
import net.minecraft.core.FrontAndTop;
import net.minecraft.world.level.block.state.properties.StructureMode;
import net.minecraft.data.models.blockstates.VariantProperty;
import net.minecraft.world.level.block.state.properties.PistonType;
import java.util.Arrays;
import java.util.function.UnaryOperator;
import com.google.common.collect.ImmutableList;
import java.util.function.BiFunction;
import net.minecraft.world.level.block.state.properties.ComparatorMode;
import net.minecraft.world.level.block.state.properties.RedstoneSide;
import net.minecraft.world.level.block.state.properties.BellAttachType;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import net.minecraft.world.level.block.state.properties.BambooLeaves;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.List;
import net.minecraft.data.models.model.TextureSlot;
import net.minecraft.world.level.block.state.properties.RailShape;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.properties.SlabType;
import java.util.function.Function;
import net.minecraft.data.models.model.ModelTemplate;
import net.minecraft.world.level.block.state.properties.StairsShape;
import net.minecraft.world.level.block.state.properties.Half;
import net.minecraft.world.level.block.state.properties.WallSide;
import net.minecraft.data.models.blockstates.Condition;
import net.minecraft.data.models.blockstates.MultiPartGenerator;
import net.minecraft.world.level.block.state.properties.DoorHingeSide;
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf;
import net.minecraft.world.level.block.state.properties.AttachFace;
import net.minecraft.data.models.model.TexturedModel;
import net.minecraft.world.level.block.state.properties.BooleanProperty;
import net.minecraft.data.models.blockstates.MultiVariantGenerator;
import net.minecraft.data.models.blockstates.VariantProperties;
import net.minecraft.data.models.blockstates.Variant;
import net.minecraft.world.level.block.state.properties.Property;
import net.minecraft.core.Direction;
import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.data.models.blockstates.PropertyDispatch;
import net.minecraft.world.item.Items;
import net.minecraft.data.models.model.TextureMapping;
import net.minecraft.data.models.model.ModelTemplates;
import net.minecraft.data.models.model.DelegatedModel;
import net.minecraft.data.models.model.ModelLocationUtils;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.item.Item;
import com.google.gson.JsonElement;
import java.util.function.Supplier;
import net.minecraft.resources.ResourceLocation;
import java.util.function.BiConsumer;
import net.minecraft.data.models.blockstates.BlockStateGenerator;
import java.util.function.Consumer;

public class BlockModelGenerators {
    private final Consumer<BlockStateGenerator> blockStateOutput;
    private final BiConsumer<ResourceLocation, Supplier<JsonElement>> modelOutput;
    private final Consumer<Item> skippedAutoModelsOutput;
    
    public BlockModelGenerators(final Consumer<BlockStateGenerator> consumer1, final BiConsumer<ResourceLocation, Supplier<JsonElement>> biConsumer, final Consumer<Item> consumer3) {
        this.blockStateOutput = consumer1;
        this.modelOutput = biConsumer;
        this.skippedAutoModelsOutput = consumer3;
    }
    
    private void skipAutoItemBlock(final Block bvr) {
        this.skippedAutoModelsOutput.accept(bvr.asItem());
    }
    
    private void delegateItemModel(final Block bvr, final ResourceLocation uh) {
        this.modelOutput.accept(ModelLocationUtils.getModelLocation(bvr.asItem()), new DelegatedModel(uh));
    }
    
    private void delegateItemModel(final Item bke, final ResourceLocation uh) {
        this.modelOutput.accept(ModelLocationUtils.getModelLocation(bke), new DelegatedModel(uh));
    }
    
    private void createSimpleFlatItemModel(final Item bke) {
        ModelTemplates.FLAT_ITEM.create(ModelLocationUtils.getModelLocation(bke), TextureMapping.layer0(bke), this.modelOutput);
    }
    
    private void createSimpleFlatItemModel(final Block bvr) {
        final Item bke3 = bvr.asItem();
        if (bke3 != Items.AIR) {
            ModelTemplates.FLAT_ITEM.create(ModelLocationUtils.getModelLocation(bke3), TextureMapping.layer0(bvr), this.modelOutput);
        }
    }
    
    private void createSimpleFlatItemModel(final Block bvr, final String string) {
        final Item bke4 = bvr.asItem();
        ModelTemplates.FLAT_ITEM.create(ModelLocationUtils.getModelLocation(bke4), TextureMapping.layer0(TextureMapping.getBlockTexture(bvr, string)), this.modelOutput);
    }
    
    private static PropertyDispatch createHorizontalFacingDispatch() {
        return PropertyDispatch.<Direction>property((Property<Direction>)BlockStateProperties.HORIZONTAL_FACING).select(Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, Variant.variant());
    }
    
    private static PropertyDispatch createHorizontalFacingDispatchAlt() {
        return PropertyDispatch.<Direction>property((Property<Direction>)BlockStateProperties.HORIZONTAL_FACING).select(Direction.SOUTH, Variant.variant()).select(Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.NORTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270));
    }
    
    private static PropertyDispatch createTorchHorizontalDispatch() {
        return PropertyDispatch.<Direction>property((Property<Direction>)BlockStateProperties.HORIZONTAL_FACING).select(Direction.EAST, Variant.variant()).select(Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.NORTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270));
    }
    
    private static PropertyDispatch createFacingDispatch() {
        return PropertyDispatch.<Direction>property((Property<Direction>)BlockStateProperties.FACING).select(Direction.DOWN, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90)).select(Direction.UP, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, Variant.variant()).select(Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90));
    }
    
    private static MultiVariantGenerator createRotatedVariant(final Block bvr, final ResourceLocation uh) {
        return MultiVariantGenerator.multiVariant(bvr, createRotatedVariants(uh));
    }
    
    private static Variant[] createRotatedVariants(final ResourceLocation uh) {
        return new Variant[] { Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270) };
    }
    
    private static MultiVariantGenerator createRotatedVariant(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3) {
        return MultiVariantGenerator.multiVariant(bvr, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180));
    }
    
    private static PropertyDispatch createBooleanModelDispatch(final BooleanProperty cga, final ResourceLocation uh2, final ResourceLocation uh3) {
        return PropertyDispatch.<Boolean>property((Property<Boolean>)cga).select(true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3));
    }
    
    private void createRotatedMirroredVariantBlock(final Block bvr) {
        final ResourceLocation uh3 = TexturedModel.CUBE.create(bvr, this.modelOutput);
        final ResourceLocation uh4 = TexturedModel.CUBE_MIRRORED.create(bvr, this.modelOutput);
        this.blockStateOutput.accept(createRotatedVariant(bvr, uh3, uh4));
    }
    
    private void createRotatedVariantBlock(final Block bvr) {
        final ResourceLocation uh3 = TexturedModel.CUBE.create(bvr, this.modelOutput);
        this.blockStateOutput.accept(createRotatedVariant(bvr, uh3));
    }
    
    private static BlockStateGenerator createButton(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3) {
        return MultiVariantGenerator.multiVariant(bvr).with(PropertyDispatch.<Boolean>property((Property<Boolean>)BlockStateProperties.POWERED).select(false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3))).with(PropertyDispatch.<AttachFace, Direction>properties(BlockStateProperties.ATTACH_FACE, (Property<Direction>)BlockStateProperties.HORIZONTAL_FACING).select(AttachFace.FLOOR, Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(AttachFace.FLOOR, Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(AttachFace.FLOOR, Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(AttachFace.FLOOR, Direction.NORTH, Variant.variant()).select(AttachFace.WALL, Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(AttachFace.WALL, Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(AttachFace.WALL, Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(AttachFace.WALL, Direction.NORTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(AttachFace.CEILING, Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)).select(AttachFace.CEILING, Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)).select(AttachFace.CEILING, Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)).select(AttachFace.CEILING, Direction.NORTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)));
    }
    
    private static PropertyDispatch.C4<Direction, DoubleBlockHalf, DoorHingeSide, Boolean> configureDoorHalf(final PropertyDispatch.C4<Direction, DoubleBlockHalf, DoorHingeSide, Boolean> d, final DoubleBlockHalf cgf, final ResourceLocation uh3, final ResourceLocation uh4) {
        return d.select(Direction.EAST, cgf, DoorHingeSide.LEFT, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(Direction.SOUTH, cgf, DoorHingeSide.LEFT, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, cgf, DoorHingeSide.LEFT, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.NORTH, cgf, DoorHingeSide.LEFT, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.EAST, cgf, DoorHingeSide.RIGHT, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).select(Direction.SOUTH, cgf, DoorHingeSide.RIGHT, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, cgf, DoorHingeSide.RIGHT, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.NORTH, cgf, DoorHingeSide.RIGHT, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.EAST, cgf, DoorHingeSide.LEFT, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.SOUTH, cgf, DoorHingeSide.LEFT, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.WEST, cgf, DoorHingeSide.LEFT, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, cgf, DoorHingeSide.LEFT, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).select(Direction.EAST, cgf, DoorHingeSide.RIGHT, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.SOUTH, cgf, DoorHingeSide.RIGHT, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(Direction.WEST, cgf, DoorHingeSide.RIGHT, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.NORTH, cgf, DoorHingeSide.RIGHT, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180));
    }
    
    private static BlockStateGenerator createDoor(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3, final ResourceLocation uh4, final ResourceLocation uh5) {
        return MultiVariantGenerator.multiVariant(bvr).with(configureDoorHalf(configureDoorHalf(PropertyDispatch.<Direction, DoubleBlockHalf, DoorHingeSide, Boolean>properties((Property<Direction>)BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.DOUBLE_BLOCK_HALF, BlockStateProperties.DOOR_HINGE, (Property<Boolean>)BlockStateProperties.OPEN), DoubleBlockHalf.LOWER, uh2, uh3), DoubleBlockHalf.UPPER, uh4, uh5));
    }
    
    private static BlockStateGenerator createFence(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3) {
        return MultiPartGenerator.multiPart(bvr).with(Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.EAST, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.SOUTH, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.WEST, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true));
    }
    
    private static BlockStateGenerator createWall(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3, final ResourceLocation uh4) {
        return MultiPartGenerator.multiPart(bvr).with(Condition.condition().<Boolean>term(BlockStateProperties.UP, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).with(Condition.condition().<WallSide>term(BlockStateProperties.NORTH_WALL, WallSide.LOW), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<WallSide>term(BlockStateProperties.EAST_WALL, WallSide.LOW), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<WallSide>term(BlockStateProperties.SOUTH_WALL, WallSide.LOW), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<WallSide>term(BlockStateProperties.WEST_WALL, WallSide.LOW), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<WallSide>term(BlockStateProperties.NORTH_WALL, WallSide.TALL), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<WallSide>term(BlockStateProperties.EAST_WALL, WallSide.TALL), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<WallSide>term(BlockStateProperties.SOUTH_WALL, WallSide.TALL), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<WallSide>term(BlockStateProperties.WEST_WALL, WallSide.TALL), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true));
    }
    
    private static BlockStateGenerator createFenceGate(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3, final ResourceLocation uh4, final ResourceLocation uh5) {
        return MultiVariantGenerator.multiVariant(bvr, Variant.variant().<Boolean>with(VariantProperties.UV_LOCK, true)).with(createHorizontalFacingDispatchAlt()).with(PropertyDispatch.<Boolean, Boolean>properties((Property<Boolean>)BlockStateProperties.IN_WALL, (Property<Boolean>)BlockStateProperties.OPEN).select(false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5)).select(false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)));
    }
    
    private static BlockStateGenerator createStairs(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3, final ResourceLocation uh4) {
        return MultiVariantGenerator.multiVariant(bvr).with(PropertyDispatch.<Direction, Half, StairsShape>properties((Property<Direction>)BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.HALF, BlockStateProperties.STAIRS_SHAPE).select(Direction.EAST, Half.BOTTOM, StairsShape.STRAIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(Direction.WEST, Half.BOTTOM, StairsShape.STRAIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.BOTTOM, StairsShape.STRAIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.BOTTOM, StairsShape.STRAIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.BOTTOM, StairsShape.OUTER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).select(Direction.WEST, Half.BOTTOM, StairsShape.OUTER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.BOTTOM, StairsShape.OUTER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.BOTTOM, StairsShape.OUTER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.BOTTOM, StairsShape.OUTER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.BOTTOM, StairsShape.OUTER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.BOTTOM, StairsShape.OUTER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).select(Direction.NORTH, Half.BOTTOM, StairsShape.OUTER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.BOTTOM, StairsShape.INNER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(Direction.WEST, Half.BOTTOM, StairsShape.INNER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.BOTTOM, StairsShape.INNER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.BOTTOM, StairsShape.INNER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.BOTTOM, StairsShape.INNER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.BOTTOM, StairsShape.INNER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.BOTTOM, StairsShape.INNER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(Direction.NORTH, Half.BOTTOM, StairsShape.INNER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.TOP, StairsShape.STRAIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.TOP, StairsShape.STRAIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.TOP, StairsShape.STRAIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.TOP, StairsShape.STRAIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.TOP, StairsShape.OUTER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.TOP, StairsShape.OUTER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.TOP, StairsShape.OUTER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.TOP, StairsShape.OUTER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.TOP, StairsShape.OUTER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.TOP, StairsShape.OUTER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.TOP, StairsShape.OUTER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.TOP, StairsShape.OUTER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.TOP, StairsShape.INNER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.TOP, StairsShape.INNER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.TOP, StairsShape.INNER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.TOP, StairsShape.INNER_RIGHT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.EAST, Half.TOP, StairsShape.INNER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.WEST, Half.TOP, StairsShape.INNER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.SOUTH, Half.TOP, StairsShape.INNER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).select(Direction.NORTH, Half.TOP, StairsShape.INNER_LEFT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)));
    }
    
    private static BlockStateGenerator createOrientableTrapdoor(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3, final ResourceLocation uh4) {
        return MultiVariantGenerator.multiVariant(bvr).with(PropertyDispatch.<Direction, Half, Boolean>properties((Property<Direction>)BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.HALF, (Property<Boolean>)BlockStateProperties.OPEN).select(Direction.NORTH, Half.BOTTOM, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(Direction.SOUTH, Half.BOTTOM, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Half.BOTTOM, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, Half.BOTTOM, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, Half.TOP, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(Direction.SOUTH, Half.TOP, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Half.TOP, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, Half.TOP, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, Half.BOTTOM, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).select(Direction.SOUTH, Half.BOTTOM, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Half.BOTTOM, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, Half.BOTTOM, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, Half.TOP, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.SOUTH, Half.TOP, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R0)).select(Direction.EAST, Half.TOP, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.WEST, Half.TOP, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)));
    }
    
    private static BlockStateGenerator createTrapdoor(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3, final ResourceLocation uh4) {
        return MultiVariantGenerator.multiVariant(bvr).with(PropertyDispatch.<Direction, Half, Boolean>properties((Property<Direction>)BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.HALF, (Property<Boolean>)BlockStateProperties.OPEN).select(Direction.NORTH, Half.BOTTOM, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(Direction.SOUTH, Half.BOTTOM, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(Direction.EAST, Half.BOTTOM, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(Direction.WEST, Half.BOTTOM, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(Direction.NORTH, Half.TOP, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(Direction.SOUTH, Half.TOP, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(Direction.EAST, Half.TOP, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(Direction.WEST, Half.TOP, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(Direction.NORTH, Half.BOTTOM, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).select(Direction.SOUTH, Half.BOTTOM, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Half.BOTTOM, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, Half.BOTTOM, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, Half.TOP, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).select(Direction.SOUTH, Half.TOP, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, Half.TOP, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, Half.TOP, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)));
    }
    
    private static MultiVariantGenerator createSimpleBlock(final Block bvr, final ResourceLocation uh) {
        return MultiVariantGenerator.multiVariant(bvr, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh));
    }
    
    private static PropertyDispatch createRotatedPillar() {
        return PropertyDispatch.<Direction.Axis>property(BlockStateProperties.AXIS).select(Direction.Axis.Y, Variant.variant()).select(Direction.Axis.Z, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90)).select(Direction.Axis.X, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90));
    }
    
    private static BlockStateGenerator createAxisAlignedPillarBlock(final Block bvr, final ResourceLocation uh) {
        return MultiVariantGenerator.multiVariant(bvr, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh)).with(createRotatedPillar());
    }
    
    private void createAxisAlignedPillarBlock(final Block bvr, final TexturedModel.Provider a) {
        final ResourceLocation uh4 = a.create(bvr, this.modelOutput);
        this.blockStateOutput.accept(createAxisAlignedPillarBlock(bvr, uh4));
    }
    
    private void createHorizontallyRotatedBlock(final Block bvr, final TexturedModel.Provider a) {
        final ResourceLocation uh4 = a.create(bvr, this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).with(createHorizontalFacingDispatch()));
    }
    
    private static BlockStateGenerator createRotatedPillarWithHorizontalVariant(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3) {
        return MultiVariantGenerator.multiVariant(bvr).with(PropertyDispatch.<Direction.Axis>property(BlockStateProperties.AXIS).select(Direction.Axis.Y, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(Direction.Axis.Z, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90)).select(Direction.Axis.X, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)));
    }
    
    private void createRotatedPillarWithHorizontalVariant(final Block bvr, final TexturedModel.Provider a2, final TexturedModel.Provider a3) {
        final ResourceLocation uh5 = a2.create(bvr, this.modelOutput);
        final ResourceLocation uh6 = a3.create(bvr, this.modelOutput);
        this.blockStateOutput.accept(createRotatedPillarWithHorizontalVariant(bvr, uh5, uh6));
    }
    
    private ResourceLocation createSuffixedVariant(final Block bvr, final String string, final ModelTemplate iw, final Function<ResourceLocation, TextureMapping> function) {
        return iw.createWithSuffix(bvr, string, function.apply(TextureMapping.getBlockTexture(bvr, string)), this.modelOutput);
    }
    
    private static BlockStateGenerator createPressurePlate(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3) {
        return MultiVariantGenerator.multiVariant(bvr).with(createBooleanModelDispatch(BlockStateProperties.POWERED, uh3, uh2));
    }
    
    private static BlockStateGenerator createSlab(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3, final ResourceLocation uh4) {
        return MultiVariantGenerator.multiVariant(bvr).with(PropertyDispatch.<SlabType>property(BlockStateProperties.SLAB_TYPE).select(SlabType.BOTTOM, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(SlabType.TOP, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(SlabType.DOUBLE, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)));
    }
    
    private void createTrivialCube(final Block bvr) {
        this.createTrivialBlock(bvr, TexturedModel.CUBE);
    }
    
    private void createTrivialBlock(final Block bvr, final TexturedModel.Provider a) {
        this.blockStateOutput.accept(createSimpleBlock(bvr, a.create(bvr, this.modelOutput)));
    }
    
    private void createTrivialBlock(final Block bvr, final TextureMapping iy, final ModelTemplate iw) {
        final ResourceLocation uh5 = iw.create(bvr, iy, this.modelOutput);
        this.blockStateOutput.accept(createSimpleBlock(bvr, uh5));
    }
    
    private BlockFamilyProvider family(final Block bvr, final TexturedModel ja) {
        return new BlockFamilyProvider(ja.getMapping()).fullBlock(bvr, ja.getTemplate());
    }
    
    private BlockFamilyProvider family(final Block bvr, final TexturedModel.Provider a) {
        final TexturedModel ja4 = a.get(bvr);
        return new BlockFamilyProvider(ja4.getMapping()).fullBlock(bvr, ja4.getTemplate());
    }
    
    private BlockFamilyProvider family(final Block bvr) {
        return this.family(bvr, TexturedModel.CUBE);
    }
    
    private BlockFamilyProvider family(final TextureMapping iy) {
        return new BlockFamilyProvider(iy);
    }
    
    private void createDoor(final Block bvr) {
        final TextureMapping iy3 = TextureMapping.door(bvr);
        final ResourceLocation uh4 = ModelTemplates.DOOR_BOTTOM.create(bvr, iy3, this.modelOutput);
        final ResourceLocation uh5 = ModelTemplates.DOOR_BOTTOM_HINGE.create(bvr, iy3, this.modelOutput);
        final ResourceLocation uh6 = ModelTemplates.DOOR_TOP.create(bvr, iy3, this.modelOutput);
        final ResourceLocation uh7 = ModelTemplates.DOOR_TOP_HINGE.create(bvr, iy3, this.modelOutput);
        this.createSimpleFlatItemModel(bvr.asItem());
        this.blockStateOutput.accept(createDoor(bvr, uh4, uh5, uh6, uh7));
    }
    
    private void createOrientableTrapdoor(final Block bvr) {
        final TextureMapping iy3 = TextureMapping.defaultTexture(bvr);
        final ResourceLocation uh4 = ModelTemplates.ORIENTABLE_TRAPDOOR_TOP.create(bvr, iy3, this.modelOutput);
        final ResourceLocation uh5 = ModelTemplates.ORIENTABLE_TRAPDOOR_BOTTOM.create(bvr, iy3, this.modelOutput);
        final ResourceLocation uh6 = ModelTemplates.ORIENTABLE_TRAPDOOR_OPEN.create(bvr, iy3, this.modelOutput);
        this.blockStateOutput.accept(createOrientableTrapdoor(bvr, uh4, uh5, uh6));
        this.delegateItemModel(bvr, uh5);
    }
    
    private void createTrapdoor(final Block bvr) {
        final TextureMapping iy3 = TextureMapping.defaultTexture(bvr);
        final ResourceLocation uh4 = ModelTemplates.TRAPDOOR_TOP.create(bvr, iy3, this.modelOutput);
        final ResourceLocation uh5 = ModelTemplates.TRAPDOOR_BOTTOM.create(bvr, iy3, this.modelOutput);
        final ResourceLocation uh6 = ModelTemplates.TRAPDOOR_OPEN.create(bvr, iy3, this.modelOutput);
        this.blockStateOutput.accept(createTrapdoor(bvr, uh4, uh5, uh6));
        this.delegateItemModel(bvr, uh5);
    }
    
    private WoodProvider woodProvider(final Block bvr) {
        return new WoodProvider(TextureMapping.logColumn(bvr));
    }
    
    private void createNonTemplateModelBlock(final Block bvr) {
        this.createNonTemplateModelBlock(bvr, bvr);
    }
    
    private void createNonTemplateModelBlock(final Block bvr1, final Block bvr2) {
        this.blockStateOutput.accept(createSimpleBlock(bvr1, ModelLocationUtils.getModelLocation(bvr2)));
    }
    
    private void createCrossBlockWithDefaultItem(final Block bvr, final TintState c) {
        this.createSimpleFlatItemModel(bvr);
        this.createCrossBlock(bvr, c);
    }
    
    private void createCrossBlockWithDefaultItem(final Block bvr, final TintState c, final TextureMapping iy) {
        this.createSimpleFlatItemModel(bvr);
        this.createCrossBlock(bvr, c, iy);
    }
    
    private void createCrossBlock(final Block bvr, final TintState c) {
        final TextureMapping iy4 = TextureMapping.cross(bvr);
        this.createCrossBlock(bvr, c, iy4);
    }
    
    private void createCrossBlock(final Block bvr, final TintState c, final TextureMapping iy) {
        final ResourceLocation uh5 = c.getCross().create(bvr, iy, this.modelOutput);
        this.blockStateOutput.accept(createSimpleBlock(bvr, uh5));
    }
    
    private void createPlant(final Block bvr1, final Block bvr2, final TintState c) {
        this.createCrossBlockWithDefaultItem(bvr1, c);
        final TextureMapping iy5 = TextureMapping.plant(bvr1);
        final ResourceLocation uh6 = c.getCrossPot().create(bvr2, iy5, this.modelOutput);
        this.blockStateOutput.accept(createSimpleBlock(bvr2, uh6));
    }
    
    private void createCoralFans(final Block bvr1, final Block bvr2) {
        final TexturedModel ja4 = TexturedModel.CORAL_FAN.get(bvr1);
        final ResourceLocation uh5 = ja4.create(bvr1, this.modelOutput);
        this.blockStateOutput.accept(createSimpleBlock(bvr1, uh5));
        final ResourceLocation uh6 = ModelTemplates.CORAL_WALL_FAN.create(bvr2, ja4.getMapping(), this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr2, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6)).with(createHorizontalFacingDispatch()));
        this.createSimpleFlatItemModel(bvr1);
    }
    
    private void createStems(final Block bvr1, final Block bvr2) {
        this.createSimpleFlatItemModel(bvr1.asItem());
        final TextureMapping iy4 = TextureMapping.stem(bvr1);
        final TextureMapping iy5 = TextureMapping.attachedStem(bvr1, bvr2);
        final ResourceLocation uh6 = ModelTemplates.ATTACHED_STEM.create(bvr2, iy5, this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr2, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6)).with(PropertyDispatch.<Direction>property((Property<Direction>)BlockStateProperties.HORIZONTAL_FACING).select(Direction.WEST, Variant.variant()).select(Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180))));
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr1).with(PropertyDispatch.<Comparable>property((Property<Comparable>)BlockStateProperties.AGE_7).generate(integer -> Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelTemplates.STEMS[integer].create(bvr1, iy4, this.modelOutput)))));
    }
    
    private void createCoral(final Block bvr1, final Block bvr2, final Block bvr3, final Block bvr4, final Block bvr5, final Block bvr6, final Block bvr7, final Block bvr8) {
        this.createCrossBlockWithDefaultItem(bvr1, TintState.NOT_TINTED);
        this.createCrossBlockWithDefaultItem(bvr2, TintState.NOT_TINTED);
        this.createTrivialCube(bvr3);
        this.createTrivialCube(bvr4);
        this.createCoralFans(bvr5, bvr7);
        this.createCoralFans(bvr6, bvr8);
    }
    
    private void createDoublePlant(final Block bvr, final TintState c) {
        this.createSimpleFlatItemModel(bvr, "_top");
        final ResourceLocation uh4 = this.createSuffixedVariant(bvr, "_top", c.getCross(), TextureMapping::cross);
        final ResourceLocation uh5 = this.createSuffixedVariant(bvr, "_bottom", c.getCross(), TextureMapping::cross);
        this.createDoubleBlock(bvr, uh4, uh5);
    }
    
    private void createSunflower() {
        this.createSimpleFlatItemModel(Blocks.SUNFLOWER, "_front");
        final ResourceLocation uh2 = ModelLocationUtils.getModelLocation(Blocks.SUNFLOWER, "_top");
        final ResourceLocation uh3 = this.createSuffixedVariant(Blocks.SUNFLOWER, "_bottom", TintState.NOT_TINTED.getCross(), TextureMapping::cross);
        this.createDoubleBlock(Blocks.SUNFLOWER, uh2, uh3);
    }
    
    private void createTallSeagrass() {
        final ResourceLocation uh2 = this.createSuffixedVariant(Blocks.TALL_SEAGRASS, "_top", ModelTemplates.SEAGRASS, TextureMapping::defaultTexture);
        final ResourceLocation uh3 = this.createSuffixedVariant(Blocks.TALL_SEAGRASS, "_bottom", ModelTemplates.SEAGRASS, TextureMapping::defaultTexture);
        this.createDoubleBlock(Blocks.TALL_SEAGRASS, uh2, uh3);
    }
    
    private void createDoubleBlock(final Block bvr, final ResourceLocation uh2, final ResourceLocation uh3) {
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr).with(PropertyDispatch.<DoubleBlockHalf>property(BlockStateProperties.DOUBLE_BLOCK_HALF).select(DoubleBlockHalf.LOWER, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(DoubleBlockHalf.UPPER, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2))));
    }
    
    private void createPassiveRail(final Block bvr) {
        final TextureMapping iy3 = TextureMapping.rail(bvr);
        final TextureMapping iy4 = TextureMapping.rail(TextureMapping.getBlockTexture(bvr, "_corner"));
        final ResourceLocation uh5 = ModelTemplates.RAIL_FLAT.create(bvr, iy3, this.modelOutput);
        final ResourceLocation uh6 = ModelTemplates.RAIL_CURVED.create(bvr, iy4, this.modelOutput);
        final ResourceLocation uh7 = ModelTemplates.RAIL_RAISED_NE.create(bvr, iy3, this.modelOutput);
        final ResourceLocation uh8 = ModelTemplates.RAIL_RAISED_SW.create(bvr, iy3, this.modelOutput);
        this.createSimpleFlatItemModel(bvr);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr).with(PropertyDispatch.<RailShape>property(BlockStateProperties.RAIL_SHAPE).select(RailShape.NORTH_SOUTH, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5)).select(RailShape.EAST_WEST, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(RailShape.ASCENDING_EAST, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh7).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(RailShape.ASCENDING_WEST, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh8).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(RailShape.ASCENDING_NORTH, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh7)).select(RailShape.ASCENDING_SOUTH, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh8)).select(RailShape.SOUTH_EAST, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6)).select(RailShape.SOUTH_WEST, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(RailShape.NORTH_WEST, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(RailShape.NORTH_EAST, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270))));
    }
    
    private void createActiveRail(final Block bvr) {
        final ResourceLocation uh3 = this.createSuffixedVariant(bvr, "", ModelTemplates.RAIL_FLAT, TextureMapping::rail);
        final ResourceLocation uh4 = this.createSuffixedVariant(bvr, "", ModelTemplates.RAIL_RAISED_NE, TextureMapping::rail);
        final ResourceLocation uh5 = this.createSuffixedVariant(bvr, "", ModelTemplates.RAIL_RAISED_SW, TextureMapping::rail);
        final ResourceLocation uh6 = this.createSuffixedVariant(bvr, "_on", ModelTemplates.RAIL_FLAT, TextureMapping::rail);
        final ResourceLocation uh7 = this.createSuffixedVariant(bvr, "_on", ModelTemplates.RAIL_RAISED_NE, TextureMapping::rail);
        final ResourceLocation uh8 = this.createSuffixedVariant(bvr, "_on", ModelTemplates.RAIL_RAISED_SW, TextureMapping::rail);
        final ResourceLocation resourceLocation;
        final ResourceLocation resourceLocation2;
        final ResourceLocation resourceLocation3;
        final ResourceLocation resourceLocation4;
        final ResourceLocation resourceLocation5;
        final ResourceLocation resourceLocation6;
        final PropertyDispatch io9 = PropertyDispatch.<Comparable, RailShape>properties((Property<Comparable>)BlockStateProperties.POWERED, BlockStateProperties.RAIL_SHAPE_STRAIGHT).generate((boolean7, cgm) -> {
            switch (cgm) {
                case NORTH_SOUTH: {
                    return Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, boolean7 ? resourceLocation : resourceLocation2);
                }
                case EAST_WEST: {
                    return Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, boolean7 ? resourceLocation : resourceLocation2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90);
                }
                case ASCENDING_EAST: {
                    return Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, boolean7 ? resourceLocation3 : resourceLocation4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90);
                }
                case ASCENDING_WEST: {
                    return Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, boolean7 ? resourceLocation5 : resourceLocation6).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90);
                }
                case ASCENDING_NORTH: {
                    return Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, boolean7 ? resourceLocation3 : resourceLocation4);
                }
                case ASCENDING_SOUTH: {
                    return Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, boolean7 ? resourceLocation5 : resourceLocation6);
                }
                default: {
                    throw new UnsupportedOperationException("Fix you generator!");
                }
            }
        });
        this.createSimpleFlatItemModel(bvr);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr).with(io9));
    }
    
    private BlockEntityModelGenerator blockEntityModels(final ResourceLocation uh, final Block bvr) {
        return new BlockEntityModelGenerator(uh, bvr);
    }
    
    private BlockEntityModelGenerator blockEntityModels(final Block bvr1, final Block bvr2) {
        return new BlockEntityModelGenerator(ModelLocationUtils.getModelLocation(bvr1), bvr2);
    }
    
    private void createAirLikeBlock(final Block bvr, final Item bke) {
        final ResourceLocation uh4 = ModelTemplates.PARTICLE_ONLY.create(bvr, TextureMapping.particleFromItem(bke), this.modelOutput);
        this.blockStateOutput.accept(createSimpleBlock(bvr, uh4));
    }
    
    private void createAirLikeBlock(final Block bvr, final ResourceLocation uh) {
        final ResourceLocation uh2 = ModelTemplates.PARTICLE_ONLY.create(bvr, TextureMapping.particle(uh), this.modelOutput);
        this.blockStateOutput.accept(createSimpleBlock(bvr, uh2));
    }
    
    private void createWoolBlocks(final Block bvr1, final Block bvr2) {
        this.createTrivialBlock(bvr1, TexturedModel.CUBE);
        final ResourceLocation uh4 = TexturedModel.CARPET.get(bvr1).create(bvr2, this.modelOutput);
        this.blockStateOutput.accept(createSimpleBlock(bvr2, uh4));
    }
    
    private void createColoredBlockWithRandomRotations(final TexturedModel.Provider a, final Block... arr) {
        for (final Block bvr7 : arr) {
            final ResourceLocation uh8 = a.create(bvr7, this.modelOutput);
            this.blockStateOutput.accept(createRotatedVariant(bvr7, uh8));
        }
    }
    
    private void createColoredBlockWithStateRotations(final TexturedModel.Provider a, final Block... arr) {
        for (final Block bvr7 : arr) {
            final ResourceLocation uh8 = a.create(bvr7, this.modelOutput);
            this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr7, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh8)).with(createHorizontalFacingDispatchAlt()));
        }
    }
    
    private void createGlassBlocks(final Block bvr1, final Block bvr2) {
        this.createTrivialCube(bvr1);
        final TextureMapping iy4 = TextureMapping.pane(bvr1, bvr2);
        final ResourceLocation uh5 = ModelTemplates.STAINED_GLASS_PANE_POST.create(bvr2, iy4, this.modelOutput);
        final ResourceLocation uh6 = ModelTemplates.STAINED_GLASS_PANE_SIDE.create(bvr2, iy4, this.modelOutput);
        final ResourceLocation uh7 = ModelTemplates.STAINED_GLASS_PANE_SIDE_ALT.create(bvr2, iy4, this.modelOutput);
        final ResourceLocation uh8 = ModelTemplates.STAINED_GLASS_PANE_NOSIDE.create(bvr2, iy4, this.modelOutput);
        final ResourceLocation uh9 = ModelTemplates.STAINED_GLASS_PANE_NOSIDE_ALT.create(bvr2, iy4, this.modelOutput);
        final Item bke10 = bvr2.asItem();
        ModelTemplates.FLAT_ITEM.create(ModelLocationUtils.getModelLocation(bke10), TextureMapping.layer0(bvr1), this.modelOutput);
        this.blockStateOutput.accept(MultiPartGenerator.multiPart(bvr2).with(Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5)).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6)).with(Condition.condition().<Boolean>term(BlockStateProperties.EAST, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).with(Condition.condition().<Boolean>term(BlockStateProperties.SOUTH, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh7)).with(Condition.condition().<Boolean>term(BlockStateProperties.WEST, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh7).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh8)).with(Condition.condition().<Boolean>term(BlockStateProperties.EAST, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh9)).with(Condition.condition().<Boolean>term(BlockStateProperties.SOUTH, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh9).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).with(Condition.condition().<Boolean>term(BlockStateProperties.WEST, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh8).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)));
    }
    
    private void createCommandBlock(final Block bvr) {
        final TextureMapping iy3 = TextureMapping.commandBlock(bvr);
        final ResourceLocation uh2 = ModelTemplates.COMMAND_BLOCK.create(bvr, iy3, this.modelOutput);
        final ResourceLocation uh3 = this.createSuffixedVariant(bvr, "_conditional", ModelTemplates.COMMAND_BLOCK, uh -> iy3.copyAndUpdate(TextureSlot.SIDE, uh));
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr).with(createBooleanModelDispatch(BlockStateProperties.CONDITIONAL, uh3, uh2)).with(createFacingDispatch()));
    }
    
    private void createAnvil(final Block bvr) {
        final ResourceLocation uh3 = TexturedModel.ANVIL.create(bvr, this.modelOutput);
        this.blockStateOutput.accept(createSimpleBlock(bvr, uh3).with(createHorizontalFacingDispatchAlt()));
    }
    
    private List<Variant> createBambooModels(final int integer) {
        final String string3 = "_age" + integer;
        return IntStream.range(1, 5).mapToObj(integer -> Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.BAMBOO, integer + string3))).collect(Collectors.toList());
    }
    
    private void createBamboo() {
        this.skipAutoItemBlock(Blocks.BAMBOO);
        this.blockStateOutput.accept(MultiPartGenerator.multiPart(Blocks.BAMBOO).with(Condition.condition().<Integer>term(BlockStateProperties.AGE_1, 0), this.createBambooModels(0)).with(Condition.condition().<Integer>term(BlockStateProperties.AGE_1, 1), this.createBambooModels(1)).with(Condition.condition().<BambooLeaves>term(BlockStateProperties.BAMBOO_LEAVES, BambooLeaves.SMALL), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.BAMBOO, "_small_leaves"))).with(Condition.condition().<BambooLeaves>term(BlockStateProperties.BAMBOO_LEAVES, BambooLeaves.LARGE), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.BAMBOO, "_large_leaves"))));
    }
    
    private PropertyDispatch createColumnWithFacing() {
        return PropertyDispatch.<Direction>property((Property<Direction>)BlockStateProperties.FACING).select(Direction.DOWN, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)).select(Direction.UP, Variant.variant()).select(Direction.NORTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90)).select(Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90));
    }
    
    private void createBarrel() {
        final ResourceLocation uh2 = TextureMapping.getBlockTexture(Blocks.BARREL, "_top_open");
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.BARREL).with(this.createColumnWithFacing()).with(PropertyDispatch.<Boolean>property((Property<Boolean>)BlockStateProperties.OPEN).select(false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TexturedModel.CUBE_TOP_BOTTOM.create(Blocks.BARREL, this.modelOutput))).select(true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TexturedModel.CUBE_TOP_BOTTOM.get(Blocks.BARREL).updateTextures(iy -> iy.put(TextureSlot.TOP, uh2)).createWithSuffix(Blocks.BARREL, "_open", this.modelOutput)))));
    }
    
    private static <T extends Comparable<T>> PropertyDispatch createEmptyOrFullDispatch(final Property<T> cgl, final T comparable, final ResourceLocation uh3, final ResourceLocation uh4) {
        final Variant iq5 = Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3);
        final Variant iq6 = Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4);
        final boolean boolean5;
        final Object o;
        final Object o2;
        return PropertyDispatch.<T>property(cgl).generate(comparable4 -> {
            boolean5 = (comparable4.compareTo(comparable) >= 0);
            return boolean5 ? o : o2;
        });
    }
    
    private void createBeeNest(final Block bvr, final Function<Block, TextureMapping> function) {
        final TextureMapping iy4 = function.apply(bvr).copyForced(TextureSlot.SIDE, TextureSlot.PARTICLE);
        final TextureMapping iy5 = iy4.copyAndUpdate(TextureSlot.FRONT, TextureMapping.getBlockTexture(bvr, "_front_honey"));
        final ResourceLocation uh6 = ModelTemplates.CUBE_ORIENTABLE_TOP_BOTTOM.create(bvr, iy4, this.modelOutput);
        final ResourceLocation uh7 = ModelTemplates.CUBE_ORIENTABLE_TOP_BOTTOM.createWithSuffix(bvr, "_honey", iy5, this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr).with(createHorizontalFacingDispatch()).with(BlockModelGenerators.<Integer>createEmptyOrFullDispatch(BlockStateProperties.LEVEL_HONEY, 5, uh7, uh6)));
    }
    
    private void createCropBlock(final Block bvr, final Property<Integer> cgl, final int... arr) {
        if (cgl.getPossibleValues().size() != arr.length) {
            throw new IllegalArgumentException();
        }
        final Int2ObjectMap<ResourceLocation> int2ObjectMap5 = (Int2ObjectMap<ResourceLocation>)new Int2ObjectOpenHashMap();
        final int integer2;
        final Int2ObjectMap int2ObjectMap6;
        final ResourceLocation uh7;
        final PropertyDispatch io6 = PropertyDispatch.<Integer>property(cgl).generate(integer -> {
            integer2 = arr[integer];
            uh7 = (ResourceLocation)int2ObjectMap6.computeIfAbsent(integer2, integer3 -> this.createSuffixedVariant(bvr, "_stage" + integer2, ModelTemplates.CROP, TextureMapping::crop));
            return Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh7);
        });
        this.createSimpleFlatItemModel(bvr.asItem());
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr).with(io6));
    }
    
    private void createBell() {
        final ResourceLocation uh2 = ModelLocationUtils.getModelLocation(Blocks.BELL, "_floor");
        final ResourceLocation uh3 = ModelLocationUtils.getModelLocation(Blocks.BELL, "_ceiling");
        final ResourceLocation uh4 = ModelLocationUtils.getModelLocation(Blocks.BELL, "_wall");
        final ResourceLocation uh5 = ModelLocationUtils.getModelLocation(Blocks.BELL, "_between_walls");
        this.createSimpleFlatItemModel(Items.BELL);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.BELL).with(PropertyDispatch.<Direction, BellAttachType>properties((Property<Direction>)BlockStateProperties.HORIZONTAL_FACING, BlockStateProperties.BELL_ATTACHMENT).select(Direction.NORTH, BellAttachType.FLOOR, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(Direction.SOUTH, BellAttachType.FLOOR, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, BellAttachType.FLOOR, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, BellAttachType.FLOOR, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, BellAttachType.CEILING, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(Direction.SOUTH, BellAttachType.CEILING, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.EAST, BellAttachType.CEILING, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.WEST, BellAttachType.CEILING, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.NORTH, BellAttachType.SINGLE_WALL, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.SOUTH, BellAttachType.SINGLE_WALL, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.EAST, BellAttachType.SINGLE_WALL, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).select(Direction.WEST, BellAttachType.SINGLE_WALL, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.SOUTH, BellAttachType.DOUBLE_WALL, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.NORTH, BellAttachType.DOUBLE_WALL, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(Direction.EAST, BellAttachType.DOUBLE_WALL, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5)).select(Direction.WEST, BellAttachType.DOUBLE_WALL, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180))));
    }
    
    private void createGrindstone() {
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.GRINDSTONE, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.GRINDSTONE))).with(PropertyDispatch.<AttachFace, Direction>properties(BlockStateProperties.ATTACH_FACE, (Property<Direction>)BlockStateProperties.HORIZONTAL_FACING).select(AttachFace.FLOOR, Direction.NORTH, Variant.variant()).select(AttachFace.FLOOR, Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(AttachFace.FLOOR, Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(AttachFace.FLOOR, Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(AttachFace.WALL, Direction.NORTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90)).select(AttachFace.WALL, Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(AttachFace.WALL, Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(AttachFace.WALL, Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(AttachFace.CEILING, Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)).select(AttachFace.CEILING, Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(AttachFace.CEILING, Direction.NORTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(AttachFace.CEILING, Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270))));
    }
    
    private void createFurnace(final Block bvr, final TexturedModel.Provider a) {
        final ResourceLocation uh4 = a.create(bvr, this.modelOutput);
        final ResourceLocation uh5 = TextureMapping.getBlockTexture(bvr, "_front_on");
        final ResourceLocation uh6 = a.get(bvr).updateTextures(iy -> iy.put(TextureSlot.FRONT, uh5)).createWithSuffix(bvr, "_on", this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr).with(createBooleanModelDispatch(BlockStateProperties.LIT, uh6, uh4)).with(createHorizontalFacingDispatch()));
    }
    
    private void createCampfires(final Block... arr) {
        final ResourceLocation uh3 = ModelLocationUtils.decorateBlockModelLocation("campfire_off");
        for (final Block bvr7 : arr) {
            final ResourceLocation uh4 = ModelTemplates.CAMPFIRE.create(bvr7, TextureMapping.campfire(bvr7), this.modelOutput);
            this.createSimpleFlatItemModel(bvr7.asItem());
            this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr7).with(createBooleanModelDispatch(BlockStateProperties.LIT, uh4, uh3)).with(createHorizontalFacingDispatchAlt()));
        }
    }
    
    private void createBookshelf() {
        final TextureMapping iy2 = TextureMapping.column(TextureMapping.getBlockTexture(Blocks.BOOKSHELF), TextureMapping.getBlockTexture(Blocks.OAK_PLANKS));
        final ResourceLocation uh3 = ModelTemplates.CUBE_COLUMN.create(Blocks.BOOKSHELF, iy2, this.modelOutput);
        this.blockStateOutput.accept(createSimpleBlock(Blocks.BOOKSHELF, uh3));
    }
    
    private void createRedstoneWire() {
        this.createSimpleFlatItemModel(Items.REDSTONE);
        this.blockStateOutput.accept(MultiPartGenerator.multiPart(Blocks.REDSTONE_WIRE).with(Condition.or(Condition.condition().<RedstoneSide>term(BlockStateProperties.NORTH_REDSTONE, RedstoneSide.NONE).<RedstoneSide>term(BlockStateProperties.EAST_REDSTONE, RedstoneSide.NONE).<RedstoneSide>term(BlockStateProperties.SOUTH_REDSTONE, RedstoneSide.NONE).<RedstoneSide>term(BlockStateProperties.WEST_REDSTONE, RedstoneSide.NONE), Condition.condition().<RedstoneSide>term(BlockStateProperties.NORTH_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP).<RedstoneSide>term(BlockStateProperties.EAST_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP), Condition.condition().<RedstoneSide>term(BlockStateProperties.EAST_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP).<RedstoneSide>term(BlockStateProperties.SOUTH_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP), Condition.condition().<RedstoneSide>term(BlockStateProperties.SOUTH_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP).<RedstoneSide>term(BlockStateProperties.WEST_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP), Condition.condition().<RedstoneSide>term(BlockStateProperties.WEST_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP).<RedstoneSide>term(BlockStateProperties.NORTH_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP)), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.decorateBlockModelLocation("redstone_dust_dot"))).with(Condition.condition().<RedstoneSide>term(BlockStateProperties.NORTH_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.decorateBlockModelLocation("redstone_dust_side0"))).with(Condition.condition().<RedstoneSide>term(BlockStateProperties.SOUTH_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.decorateBlockModelLocation("redstone_dust_side_alt0"))).with(Condition.condition().<RedstoneSide>term(BlockStateProperties.EAST_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.decorateBlockModelLocation("redstone_dust_side_alt1")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).with(Condition.condition().<RedstoneSide>term(BlockStateProperties.WEST_REDSTONE, RedstoneSide.SIDE, RedstoneSide.UP), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.decorateBlockModelLocation("redstone_dust_side1")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).with(Condition.condition().<RedstoneSide>term(BlockStateProperties.NORTH_REDSTONE, RedstoneSide.UP), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.decorateBlockModelLocation("redstone_dust_up"))).with(Condition.condition().<RedstoneSide>term(BlockStateProperties.EAST_REDSTONE, RedstoneSide.UP), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.decorateBlockModelLocation("redstone_dust_up")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).with(Condition.condition().<RedstoneSide>term(BlockStateProperties.SOUTH_REDSTONE, RedstoneSide.UP), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.decorateBlockModelLocation("redstone_dust_up")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).with(Condition.condition().<RedstoneSide>term(BlockStateProperties.WEST_REDSTONE, RedstoneSide.UP), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.decorateBlockModelLocation("redstone_dust_up")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)));
    }
    
    private void createComparator() {
        this.createSimpleFlatItemModel(Items.COMPARATOR);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.COMPARATOR).with(createHorizontalFacingDispatchAlt()).with(PropertyDispatch.<ComparatorMode, Boolean>properties(BlockStateProperties.MODE_COMPARATOR, (Property<Boolean>)BlockStateProperties.POWERED).select(ComparatorMode.COMPARE, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.COMPARATOR))).select(ComparatorMode.COMPARE, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.COMPARATOR, "_on"))).select(ComparatorMode.SUBTRACT, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.COMPARATOR, "_subtract"))).select(ComparatorMode.SUBTRACT, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.COMPARATOR, "_on_subtract")))));
    }
    
    private void createSmoothStoneSlab() {
        final TextureMapping iy2 = TextureMapping.cube(Blocks.SMOOTH_STONE);
        final TextureMapping iy3 = TextureMapping.column(TextureMapping.getBlockTexture(Blocks.SMOOTH_STONE_SLAB, "_side"), iy2.get(TextureSlot.TOP));
        final ResourceLocation uh4 = ModelTemplates.SLAB_BOTTOM.create(Blocks.SMOOTH_STONE_SLAB, iy3, this.modelOutput);
        final ResourceLocation uh5 = ModelTemplates.SLAB_TOP.create(Blocks.SMOOTH_STONE_SLAB, iy3, this.modelOutput);
        final ResourceLocation uh6 = ModelTemplates.CUBE_COLUMN.createWithOverride(Blocks.SMOOTH_STONE_SLAB, "_double", iy3, this.modelOutput);
        this.blockStateOutput.accept(createSlab(Blocks.SMOOTH_STONE_SLAB, uh4, uh5, uh6));
        this.blockStateOutput.accept(createSimpleBlock(Blocks.SMOOTH_STONE, ModelTemplates.CUBE_ALL.create(Blocks.SMOOTH_STONE, iy2, this.modelOutput)));
    }
    
    private void createBrewingStand() {
        this.createSimpleFlatItemModel(Items.BREWING_STAND);
        this.blockStateOutput.accept(MultiPartGenerator.multiPart(Blocks.BREWING_STAND).with(Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.BREWING_STAND))).with(Condition.condition().<Boolean>term(BlockStateProperties.HAS_BOTTLE_0, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.BREWING_STAND, "_bottle0"))).with(Condition.condition().<Boolean>term(BlockStateProperties.HAS_BOTTLE_1, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.BREWING_STAND, "_bottle1"))).with(Condition.condition().<Boolean>term(BlockStateProperties.HAS_BOTTLE_2, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.BREWING_STAND, "_bottle2"))).with(Condition.condition().<Boolean>term(BlockStateProperties.HAS_BOTTLE_0, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.BREWING_STAND, "_empty0"))).with(Condition.condition().<Boolean>term(BlockStateProperties.HAS_BOTTLE_1, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.BREWING_STAND, "_empty1"))).with(Condition.condition().<Boolean>term(BlockStateProperties.HAS_BOTTLE_2, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.BREWING_STAND, "_empty2"))));
    }
    
    private void createMushroomBlock(final Block bvr) {
        final ResourceLocation uh3 = ModelTemplates.SINGLE_FACE.create(bvr, TextureMapping.defaultTexture(bvr), this.modelOutput);
        final ResourceLocation uh4 = ModelLocationUtils.decorateBlockModelLocation("mushroom_block_inside");
        this.blockStateOutput.accept(MultiPartGenerator.multiPart(bvr).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).with(Condition.condition().<Boolean>term(BlockStateProperties.EAST, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.SOUTH, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.WEST, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.UP, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.DOWN, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).with(Condition.condition().<Boolean>term(BlockStateProperties.EAST, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, false)).with(Condition.condition().<Boolean>term(BlockStateProperties.SOUTH, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, false)).with(Condition.condition().<Boolean>term(BlockStateProperties.WEST, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, false)).with(Condition.condition().<Boolean>term(BlockStateProperties.UP, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, false)).with(Condition.condition().<Boolean>term(BlockStateProperties.DOWN, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, false)));
        this.delegateItemModel(bvr, TexturedModel.CUBE.createWithSuffix(bvr, "_inventory", this.modelOutput));
    }
    
    private void createCakeBlock() {
        this.createSimpleFlatItemModel(Items.CAKE);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.CAKE).with(PropertyDispatch.<Integer>property((Property<Integer>)BlockStateProperties.BITES).select(0, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.CAKE))).select(1, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.CAKE, "_slice1"))).select(2, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.CAKE, "_slice2"))).select(3, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.CAKE, "_slice3"))).select(4, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.CAKE, "_slice4"))).select(5, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.CAKE, "_slice5"))).select(6, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.CAKE, "_slice6")))));
    }
    
    private void createCartographyTable() {
        final TextureMapping iy2 = new TextureMapping().put(TextureSlot.PARTICLE, TextureMapping.getBlockTexture(Blocks.CARTOGRAPHY_TABLE, "_side3")).put(TextureSlot.DOWN, TextureMapping.getBlockTexture(Blocks.DARK_OAK_PLANKS)).put(TextureSlot.UP, TextureMapping.getBlockTexture(Blocks.CARTOGRAPHY_TABLE, "_top")).put(TextureSlot.NORTH, TextureMapping.getBlockTexture(Blocks.CARTOGRAPHY_TABLE, "_side3")).put(TextureSlot.EAST, TextureMapping.getBlockTexture(Blocks.CARTOGRAPHY_TABLE, "_side3")).put(TextureSlot.SOUTH, TextureMapping.getBlockTexture(Blocks.CARTOGRAPHY_TABLE, "_side1")).put(TextureSlot.WEST, TextureMapping.getBlockTexture(Blocks.CARTOGRAPHY_TABLE, "_side2"));
        this.blockStateOutput.accept(createSimpleBlock(Blocks.CARTOGRAPHY_TABLE, ModelTemplates.CUBE.create(Blocks.CARTOGRAPHY_TABLE, iy2, this.modelOutput)));
    }
    
    private void createSmithingTable() {
        final TextureMapping iy2 = new TextureMapping().put(TextureSlot.PARTICLE, TextureMapping.getBlockTexture(Blocks.SMITHING_TABLE, "_front")).put(TextureSlot.DOWN, TextureMapping.getBlockTexture(Blocks.SMITHING_TABLE, "_bottom")).put(TextureSlot.UP, TextureMapping.getBlockTexture(Blocks.SMITHING_TABLE, "_top")).put(TextureSlot.NORTH, TextureMapping.getBlockTexture(Blocks.SMITHING_TABLE, "_front")).put(TextureSlot.SOUTH, TextureMapping.getBlockTexture(Blocks.SMITHING_TABLE, "_front")).put(TextureSlot.EAST, TextureMapping.getBlockTexture(Blocks.SMITHING_TABLE, "_side")).put(TextureSlot.WEST, TextureMapping.getBlockTexture(Blocks.SMITHING_TABLE, "_side"));
        this.blockStateOutput.accept(createSimpleBlock(Blocks.SMITHING_TABLE, ModelTemplates.CUBE.create(Blocks.SMITHING_TABLE, iy2, this.modelOutput)));
    }
    
    private void createCraftingTableLike(final Block bvr1, final Block bvr2, final BiFunction<Block, Block, TextureMapping> biFunction) {
        final TextureMapping iy5 = biFunction.apply(bvr1, bvr2);
        this.blockStateOutput.accept(createSimpleBlock(bvr1, ModelTemplates.CUBE.create(bvr1, iy5, this.modelOutput)));
    }
    
    private void createPumpkins() {
        final TextureMapping iy2 = TextureMapping.column(Blocks.PUMPKIN);
        this.blockStateOutput.accept(createSimpleBlock(Blocks.PUMPKIN, ModelLocationUtils.getModelLocation(Blocks.PUMPKIN)));
        this.createPumpkinVariant(Blocks.CARVED_PUMPKIN, iy2);
        this.createPumpkinVariant(Blocks.JACK_O_LANTERN, iy2);
    }
    
    private void createPumpkinVariant(final Block bvr, final TextureMapping iy) {
        final ResourceLocation uh4 = ModelTemplates.CUBE_ORIENTABLE.create(bvr, iy.copyAndUpdate(TextureSlot.FRONT, TextureMapping.getBlockTexture(bvr)), this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).with(createHorizontalFacingDispatch()));
    }
    
    private void createCauldron() {
        this.createSimpleFlatItemModel(Items.CAULDRON);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.CAULDRON).with(PropertyDispatch.<Integer>property((Property<Integer>)BlockStateProperties.LEVEL_CAULDRON).select(0, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.CAULDRON))).select(1, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.CAULDRON, "_level1"))).select(2, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.CAULDRON, "_level2"))).select(3, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.CAULDRON, "_level3")))));
    }
    
    private void createChiseledSandsone(final Block bvr1, final Block bvr2) {
        final TextureMapping iy4 = new TextureMapping().put(TextureSlot.END, TextureMapping.getBlockTexture(bvr2, "_top")).put(TextureSlot.SIDE, TextureMapping.getBlockTexture(bvr1));
        this.createTrivialBlock(bvr1, iy4, ModelTemplates.CUBE_COLUMN);
    }
    
    private void createChorusFlower() {
        final TextureMapping iy2 = TextureMapping.defaultTexture(Blocks.CHORUS_FLOWER);
        final ResourceLocation uh2 = ModelTemplates.CHORUS_FLOWER.create(Blocks.CHORUS_FLOWER, iy2, this.modelOutput);
        final ResourceLocation uh3 = this.createSuffixedVariant(Blocks.CHORUS_FLOWER, "_dead", ModelTemplates.CHORUS_FLOWER, uh -> iy2.copyAndUpdate(TextureSlot.TEXTURE, uh));
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.CHORUS_FLOWER).with(BlockModelGenerators.<Integer>createEmptyOrFullDispatch(BlockStateProperties.AGE_5, 5, uh3, uh2)));
    }
    
    private void createDispenserBlock(final Block bvr) {
        final TextureMapping iy3 = new TextureMapping().put(TextureSlot.TOP, TextureMapping.getBlockTexture(Blocks.FURNACE, "_top")).put(TextureSlot.SIDE, TextureMapping.getBlockTexture(Blocks.FURNACE, "_side")).put(TextureSlot.FRONT, TextureMapping.getBlockTexture(bvr, "_front"));
        final TextureMapping iy4 = new TextureMapping().put(TextureSlot.SIDE, TextureMapping.getBlockTexture(Blocks.FURNACE, "_top")).put(TextureSlot.FRONT, TextureMapping.getBlockTexture(bvr, "_front_vertical"));
        final ResourceLocation uh5 = ModelTemplates.CUBE_ORIENTABLE.create(bvr, iy3, this.modelOutput);
        final ResourceLocation uh6 = ModelTemplates.CUBE_ORIENTABLE_VERTICAL.create(bvr, iy4, this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr).with(PropertyDispatch.<Direction>property((Property<Direction>)BlockStateProperties.FACING).select(Direction.DOWN, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)).select(Direction.UP, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6)).select(Direction.NORTH, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5)).select(Direction.EAST, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.SOUTH, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.WEST, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270))));
    }
    
    private void createEndPortalFrame() {
        final ResourceLocation uh2 = ModelLocationUtils.getModelLocation(Blocks.END_PORTAL_FRAME);
        final ResourceLocation uh3 = ModelLocationUtils.getModelLocation(Blocks.END_PORTAL_FRAME, "_filled");
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.END_PORTAL_FRAME).with(PropertyDispatch.<Boolean>property((Property<Boolean>)BlockStateProperties.EYE).select(false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3))).with(createHorizontalFacingDispatchAlt()));
    }
    
    private void createChorusPlant() {
        final ResourceLocation uh2 = ModelLocationUtils.getModelLocation(Blocks.CHORUS_PLANT, "_side");
        final ResourceLocation uh3 = ModelLocationUtils.getModelLocation(Blocks.CHORUS_PLANT, "_noside");
        final ResourceLocation uh4 = ModelLocationUtils.getModelLocation(Blocks.CHORUS_PLANT, "_noside1");
        final ResourceLocation uh5 = ModelLocationUtils.getModelLocation(Blocks.CHORUS_PLANT, "_noside2");
        final ResourceLocation uh6 = ModelLocationUtils.getModelLocation(Blocks.CHORUS_PLANT, "_noside3");
        this.blockStateOutput.accept(MultiPartGenerator.multiPart(Blocks.CHORUS_PLANT).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).with(Condition.condition().<Boolean>term(BlockStateProperties.EAST, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.SOUTH, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.WEST, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.UP, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.DOWN, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<Integer>with(VariantProperties.WEIGHT, 2), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6)).with(Condition.condition().<Boolean>term(BlockStateProperties.EAST, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<Integer>with(VariantProperties.WEIGHT, 2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.SOUTH, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<Integer>with(VariantProperties.WEIGHT, 2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.WEST, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<Integer>with(VariantProperties.WEIGHT, 2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.UP, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<Integer>with(VariantProperties.WEIGHT, 2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270).<Boolean>with(VariantProperties.UV_LOCK, true)).with(Condition.condition().<Boolean>term(BlockStateProperties.DOWN, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<Integer>with(VariantProperties.WEIGHT, 2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<Boolean>with(VariantProperties.UV_LOCK, true)));
    }
    
    private void createComposter() {
        this.blockStateOutput.accept(MultiPartGenerator.multiPart(Blocks.COMPOSTER).with(Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.COMPOSTER))).with(Condition.condition().<Integer>term(BlockStateProperties.LEVEL_COMPOSTER, 1), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.COMPOSTER, "_contents1"))).with(Condition.condition().<Integer>term(BlockStateProperties.LEVEL_COMPOSTER, 2), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.COMPOSTER, "_contents2"))).with(Condition.condition().<Integer>term(BlockStateProperties.LEVEL_COMPOSTER, 3), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.COMPOSTER, "_contents3"))).with(Condition.condition().<Integer>term(BlockStateProperties.LEVEL_COMPOSTER, 4), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.COMPOSTER, "_contents4"))).with(Condition.condition().<Integer>term(BlockStateProperties.LEVEL_COMPOSTER, 5), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.COMPOSTER, "_contents5"))).with(Condition.condition().<Integer>term(BlockStateProperties.LEVEL_COMPOSTER, 6), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.COMPOSTER, "_contents6"))).with(Condition.condition().<Integer>term(BlockStateProperties.LEVEL_COMPOSTER, 7), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.COMPOSTER, "_contents7"))).with(Condition.condition().<Integer>term(BlockStateProperties.LEVEL_COMPOSTER, 8), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.COMPOSTER, "_contents_ready"))));
    }
    
    private void createNyliumBlock(final Block bvr) {
        final TextureMapping iy3 = new TextureMapping().put(TextureSlot.BOTTOM, TextureMapping.getBlockTexture(Blocks.NETHERRACK)).put(TextureSlot.TOP, TextureMapping.getBlockTexture(bvr)).put(TextureSlot.SIDE, TextureMapping.getBlockTexture(bvr, "_side"));
        this.blockStateOutput.accept(createSimpleBlock(bvr, ModelTemplates.CUBE_BOTTOM_TOP.create(bvr, iy3, this.modelOutput)));
    }
    
    private void createDaylightDetector() {
        final ResourceLocation uh2 = TextureMapping.getBlockTexture(Blocks.DAYLIGHT_DETECTOR, "_side");
        final TextureMapping iy3 = new TextureMapping().put(TextureSlot.TOP, TextureMapping.getBlockTexture(Blocks.DAYLIGHT_DETECTOR, "_top")).put(TextureSlot.SIDE, uh2);
        final TextureMapping iy4 = new TextureMapping().put(TextureSlot.TOP, TextureMapping.getBlockTexture(Blocks.DAYLIGHT_DETECTOR, "_inverted_top")).put(TextureSlot.SIDE, uh2);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.DAYLIGHT_DETECTOR).with(PropertyDispatch.<Boolean>property((Property<Boolean>)BlockStateProperties.INVERTED).select(false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelTemplates.DAYLIGHT_DETECTOR.create(Blocks.DAYLIGHT_DETECTOR, iy3, this.modelOutput))).select(true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelTemplates.DAYLIGHT_DETECTOR.create(ModelLocationUtils.getModelLocation(Blocks.DAYLIGHT_DETECTOR, "_inverted"), iy4, this.modelOutput)))));
    }
    
    private void createEndRod() {
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.END_ROD, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.END_ROD))).with(this.createColumnWithFacing()));
    }
    
    private void createFarmland() {
        final TextureMapping iy2 = new TextureMapping().put(TextureSlot.DIRT, TextureMapping.getBlockTexture(Blocks.DIRT)).put(TextureSlot.TOP, TextureMapping.getBlockTexture(Blocks.FARMLAND));
        final TextureMapping iy3 = new TextureMapping().put(TextureSlot.DIRT, TextureMapping.getBlockTexture(Blocks.DIRT)).put(TextureSlot.TOP, TextureMapping.getBlockTexture(Blocks.FARMLAND, "_moist"));
        final ResourceLocation uh4 = ModelTemplates.FARMLAND.create(Blocks.FARMLAND, iy2, this.modelOutput);
        final ResourceLocation uh5 = ModelTemplates.FARMLAND.create(TextureMapping.getBlockTexture(Blocks.FARMLAND, "_moist"), iy3, this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.FARMLAND).with(BlockModelGenerators.<Integer>createEmptyOrFullDispatch(BlockStateProperties.MOISTURE, 7, uh5, uh4)));
    }
    
    private List<ResourceLocation> createFloorFireModels(final Block bvr) {
        final ResourceLocation uh3 = ModelTemplates.FIRE_FLOOR.create(ModelLocationUtils.getModelLocation(bvr, "_floor0"), TextureMapping.fire0(bvr), this.modelOutput);
        final ResourceLocation uh4 = ModelTemplates.FIRE_FLOOR.create(ModelLocationUtils.getModelLocation(bvr, "_floor1"), TextureMapping.fire1(bvr), this.modelOutput);
        return ImmutableList.<ResourceLocation>of(uh3, uh4);
    }
    
    private List<ResourceLocation> createSideFireModels(final Block bvr) {
        final ResourceLocation uh3 = ModelTemplates.FIRE_SIDE.create(ModelLocationUtils.getModelLocation(bvr, "_side0"), TextureMapping.fire0(bvr), this.modelOutput);
        final ResourceLocation uh4 = ModelTemplates.FIRE_SIDE.create(ModelLocationUtils.getModelLocation(bvr, "_side1"), TextureMapping.fire1(bvr), this.modelOutput);
        final ResourceLocation uh5 = ModelTemplates.FIRE_SIDE_ALT.create(ModelLocationUtils.getModelLocation(bvr, "_side_alt0"), TextureMapping.fire0(bvr), this.modelOutput);
        final ResourceLocation uh6 = ModelTemplates.FIRE_SIDE_ALT.create(ModelLocationUtils.getModelLocation(bvr, "_side_alt1"), TextureMapping.fire1(bvr), this.modelOutput);
        return ImmutableList.<ResourceLocation>of(uh3, uh4, uh5, uh6);
    }
    
    private List<ResourceLocation> createTopFireModels(final Block bvr) {
        final ResourceLocation uh3 = ModelTemplates.FIRE_UP.create(ModelLocationUtils.getModelLocation(bvr, "_up0"), TextureMapping.fire0(bvr), this.modelOutput);
        final ResourceLocation uh4 = ModelTemplates.FIRE_UP.create(ModelLocationUtils.getModelLocation(bvr, "_up1"), TextureMapping.fire1(bvr), this.modelOutput);
        final ResourceLocation uh5 = ModelTemplates.FIRE_UP_ALT.create(ModelLocationUtils.getModelLocation(bvr, "_up_alt0"), TextureMapping.fire0(bvr), this.modelOutput);
        final ResourceLocation uh6 = ModelTemplates.FIRE_UP_ALT.create(ModelLocationUtils.getModelLocation(bvr, "_up_alt1"), TextureMapping.fire1(bvr), this.modelOutput);
        return ImmutableList.<ResourceLocation>of(uh3, uh4, uh5, uh6);
    }
    
    private static List<Variant> wrapModels(final List<ResourceLocation> list, final UnaryOperator<Variant> unaryOperator) {
        return list.stream().map(uh -> Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh)).map(unaryOperator).collect(Collectors.toList());
    }
    
    private void createFire() {
        final Condition il2 = Condition.condition().<Boolean>term(BlockStateProperties.NORTH, false).<Boolean>term(BlockStateProperties.EAST, false).<Boolean>term(BlockStateProperties.SOUTH, false).<Boolean>term(BlockStateProperties.WEST, false).<Boolean>term(BlockStateProperties.UP, false);
        final List<ResourceLocation> list3 = this.createFloorFireModels(Blocks.FIRE);
        final List<ResourceLocation> list4 = this.createSideFireModels(Blocks.FIRE);
        final List<ResourceLocation> list5 = this.createTopFireModels(Blocks.FIRE);
        this.blockStateOutput.accept(MultiPartGenerator.multiPart(Blocks.FIRE).with(il2, wrapModels(list3, iq -> iq)).with(Condition.or(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, true), il2), wrapModels(list4, iq -> iq)).with(Condition.or(Condition.condition().<Boolean>term(BlockStateProperties.EAST, true), il2), wrapModels(list4, iq -> iq.<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90))).with(Condition.or(Condition.condition().<Boolean>term(BlockStateProperties.SOUTH, true), il2), wrapModels(list4, iq -> iq.<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180))).with(Condition.or(Condition.condition().<Boolean>term(BlockStateProperties.WEST, true), il2), wrapModels(list4, iq -> iq.<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270))).with(Condition.condition().<Boolean>term(BlockStateProperties.UP, true), wrapModels(list5, iq -> iq)));
    }
    
    private void createSoulFire() {
        final List<ResourceLocation> list2 = this.createFloorFireModels(Blocks.SOUL_FIRE);
        final List<ResourceLocation> list3 = this.createSideFireModels(Blocks.SOUL_FIRE);
        this.blockStateOutput.accept(MultiPartGenerator.multiPart(Blocks.SOUL_FIRE).with(wrapModels(list2, iq -> iq)).with(wrapModels(list3, iq -> iq)).with(wrapModels(list3, iq -> iq.<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90))).with(wrapModels(list3, iq -> iq.<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180))).with(wrapModels(list3, iq -> iq.<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270))));
    }
    
    private void createLantern(final Block bvr) {
        final ResourceLocation uh3 = TexturedModel.LANTERN.create(bvr, this.modelOutput);
        final ResourceLocation uh4 = TexturedModel.HANGING_LANTERN.create(bvr, this.modelOutput);
        this.createSimpleFlatItemModel(bvr.asItem());
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr).with(createBooleanModelDispatch(BlockStateProperties.HANGING, uh4, uh3)));
    }
    
    private void createFrostedIce() {
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.FROSTED_ICE).with(PropertyDispatch.<Integer>property((Property<Integer>)BlockStateProperties.AGE_3).select(0, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, this.createSuffixedVariant(Blocks.FROSTED_ICE, "_0", ModelTemplates.CUBE_ALL, TextureMapping::cube))).select(1, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, this.createSuffixedVariant(Blocks.FROSTED_ICE, "_1", ModelTemplates.CUBE_ALL, TextureMapping::cube))).select(2, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, this.createSuffixedVariant(Blocks.FROSTED_ICE, "_2", ModelTemplates.CUBE_ALL, TextureMapping::cube))).select(3, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, this.createSuffixedVariant(Blocks.FROSTED_ICE, "_3", ModelTemplates.CUBE_ALL, TextureMapping::cube)))));
    }
    
    private void createGrassBlocks() {
        final ResourceLocation uh2 = TextureMapping.getBlockTexture(Blocks.DIRT);
        final TextureMapping iy2 = new TextureMapping().put(TextureSlot.BOTTOM, uh2).copyForced(TextureSlot.BOTTOM, TextureSlot.PARTICLE).put(TextureSlot.TOP, TextureMapping.getBlockTexture(Blocks.GRASS_BLOCK, "_top")).put(TextureSlot.SIDE, TextureMapping.getBlockTexture(Blocks.GRASS_BLOCK, "_snow"));
        final Variant iq4 = Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelTemplates.CUBE_BOTTOM_TOP.createWithSuffix(Blocks.GRASS_BLOCK, "_snow", iy2, this.modelOutput));
        this.createGrassLikeBlock(Blocks.GRASS_BLOCK, ModelLocationUtils.getModelLocation(Blocks.GRASS_BLOCK), iq4);
        final ResourceLocation uh3 = TexturedModel.CUBE_TOP_BOTTOM.get(Blocks.MYCELIUM).updateTextures(iy -> iy.put(TextureSlot.BOTTOM, uh2)).create(Blocks.MYCELIUM, this.modelOutput);
        this.createGrassLikeBlock(Blocks.MYCELIUM, uh3, iq4);
        final ResourceLocation uh4 = TexturedModel.CUBE_TOP_BOTTOM.get(Blocks.PODZOL).updateTextures(iy -> iy.put(TextureSlot.BOTTOM, uh2)).create(Blocks.PODZOL, this.modelOutput);
        this.createGrassLikeBlock(Blocks.PODZOL, uh4, iq4);
    }
    
    private void createGrassLikeBlock(final Block bvr, final ResourceLocation uh, final Variant iq) {
        final List<Variant> list5 = Arrays.<Variant>asList(createRotatedVariants(uh));
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr).with(PropertyDispatch.<Boolean>property((Property<Boolean>)BlockStateProperties.SNOWY).select(true, iq).select(false, list5)));
    }
    
    private void createCocoa() {
        this.createSimpleFlatItemModel(Items.COCOA_BEANS);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.COCOA).with(PropertyDispatch.<Integer>property((Property<Integer>)BlockStateProperties.AGE_2).select(0, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.COCOA, "_stage0"))).select(1, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.COCOA, "_stage1"))).select(2, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.COCOA, "_stage2")))).with(createHorizontalFacingDispatchAlt()));
    }
    
    private void createGrassPath() {
        this.blockStateOutput.accept(createRotatedVariant(Blocks.GRASS_PATH, ModelLocationUtils.getModelLocation(Blocks.GRASS_PATH)));
    }
    
    private void createWeightedPressurePlate(final Block bvr1, final Block bvr2) {
        final TextureMapping iy4 = TextureMapping.defaultTexture(bvr2);
        final ResourceLocation uh5 = ModelTemplates.PRESSURE_PLATE_UP.create(bvr1, iy4, this.modelOutput);
        final ResourceLocation uh6 = ModelTemplates.PRESSURE_PLATE_DOWN.create(bvr1, iy4, this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr1).with(BlockModelGenerators.<Integer>createEmptyOrFullDispatch(BlockStateProperties.POWER, 1, uh6, uh5)));
    }
    
    private void createHopper() {
        final ResourceLocation uh2 = ModelLocationUtils.getModelLocation(Blocks.HOPPER);
        final ResourceLocation uh3 = ModelLocationUtils.getModelLocation(Blocks.HOPPER, "_side");
        this.createSimpleFlatItemModel(Items.HOPPER);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.HOPPER).with(PropertyDispatch.<Direction>property((Property<Direction>)BlockStateProperties.FACING_HOPPER).select(Direction.DOWN, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).select(Direction.NORTH, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).select(Direction.EAST, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(Direction.SOUTH, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(Direction.WEST, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270))));
    }
    
    private void copyModel(final Block bvr1, final Block bvr2) {
        final ResourceLocation uh4 = ModelLocationUtils.getModelLocation(bvr1);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr2, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)));
        this.delegateItemModel(bvr2, uh4);
    }
    
    private void createIronBars() {
        final ResourceLocation uh2 = ModelLocationUtils.getModelLocation(Blocks.IRON_BARS, "_post_ends");
        final ResourceLocation uh3 = ModelLocationUtils.getModelLocation(Blocks.IRON_BARS, "_post");
        final ResourceLocation uh4 = ModelLocationUtils.getModelLocation(Blocks.IRON_BARS, "_cap");
        final ResourceLocation uh5 = ModelLocationUtils.getModelLocation(Blocks.IRON_BARS, "_cap_alt");
        final ResourceLocation uh6 = ModelLocationUtils.getModelLocation(Blocks.IRON_BARS, "_side");
        final ResourceLocation uh7 = ModelLocationUtils.getModelLocation(Blocks.IRON_BARS, "_side_alt");
        this.blockStateOutput.accept(MultiPartGenerator.multiPart(Blocks.IRON_BARS).with(Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2)).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, false).<Boolean>term(BlockStateProperties.EAST, false).<Boolean>term(BlockStateProperties.SOUTH, false).<Boolean>term(BlockStateProperties.WEST, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh3)).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, true).<Boolean>term(BlockStateProperties.EAST, false).<Boolean>term(BlockStateProperties.SOUTH, false).<Boolean>term(BlockStateProperties.WEST, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4)).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, false).<Boolean>term(BlockStateProperties.EAST, true).<Boolean>term(BlockStateProperties.SOUTH, false).<Boolean>term(BlockStateProperties.WEST, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh4).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, false).<Boolean>term(BlockStateProperties.EAST, false).<Boolean>term(BlockStateProperties.SOUTH, true).<Boolean>term(BlockStateProperties.WEST, false), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5)).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, false).<Boolean>term(BlockStateProperties.EAST, false).<Boolean>term(BlockStateProperties.SOUTH, false).<Boolean>term(BlockStateProperties.WEST, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh5).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).with(Condition.condition().<Boolean>term(BlockStateProperties.NORTH, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6)).with(Condition.condition().<Boolean>term(BlockStateProperties.EAST, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).with(Condition.condition().<Boolean>term(BlockStateProperties.SOUTH, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh7)).with(Condition.condition().<Boolean>term(BlockStateProperties.WEST, true), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh7).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)));
        this.createSimpleFlatItemModel(Blocks.IRON_BARS);
    }
    
    private void createNonTemplateHorizontalBlock(final Block bvr) {
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(bvr))).with(createHorizontalFacingDispatch()));
    }
    
    private void createLever() {
        final ResourceLocation uh2 = ModelLocationUtils.getModelLocation(Blocks.LEVER);
        final ResourceLocation uh3 = ModelLocationUtils.getModelLocation(Blocks.LEVER, "_on");
        this.createSimpleFlatItemModel(Blocks.LEVER);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.LEVER).with(createBooleanModelDispatch(BlockStateProperties.POWERED, uh2, uh3)).with(PropertyDispatch.<AttachFace, Direction>properties(BlockStateProperties.ATTACH_FACE, (Property<Direction>)BlockStateProperties.HORIZONTAL_FACING).select(AttachFace.CEILING, Direction.NORTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(AttachFace.CEILING, Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(AttachFace.CEILING, Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180)).select(AttachFace.CEILING, Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(AttachFace.FLOOR, Direction.NORTH, Variant.variant()).select(AttachFace.FLOOR, Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(AttachFace.FLOOR, Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(AttachFace.FLOOR, Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(AttachFace.WALL, Direction.NORTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90)).select(AttachFace.WALL, Direction.EAST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(AttachFace.WALL, Direction.SOUTH, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(AttachFace.WALL, Direction.WEST, Variant.variant().<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270))));
    }
    
    private void createLilyPad() {
        this.createSimpleFlatItemModel(Blocks.LILY_PAD);
        this.blockStateOutput.accept(createRotatedVariant(Blocks.LILY_PAD, ModelLocationUtils.getModelLocation(Blocks.LILY_PAD)));
    }
    
    private void createNetherPortalBlock() {
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.NETHER_PORTAL).with(PropertyDispatch.<Direction.Axis>property(BlockStateProperties.HORIZONTAL_AXIS).select(Direction.Axis.X, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.NETHER_PORTAL, "_ns"))).select(Direction.Axis.Z, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.NETHER_PORTAL, "_ew")))));
    }
    
    private void createNetherrack() {
        final ResourceLocation uh2 = TexturedModel.CUBE.create(Blocks.NETHERRACK, this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.NETHERRACK, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R180), Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh2).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270).<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270)));
    }
    
    private void createObserver() {
        final ResourceLocation uh2 = ModelLocationUtils.getModelLocation(Blocks.OBSERVER);
        final ResourceLocation uh3 = ModelLocationUtils.getModelLocation(Blocks.OBSERVER, "_on");
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.OBSERVER).with(createBooleanModelDispatch(BlockStateProperties.POWERED, uh3, uh2)).with(createFacingDispatch()));
    }
    
    private void createPistons() {
        final TextureMapping iy2 = new TextureMapping().put(TextureSlot.BOTTOM, TextureMapping.getBlockTexture(Blocks.PISTON, "_bottom")).put(TextureSlot.SIDE, TextureMapping.getBlockTexture(Blocks.PISTON, "_side"));
        final ResourceLocation uh3 = TextureMapping.getBlockTexture(Blocks.PISTON, "_top_sticky");
        final ResourceLocation uh4 = TextureMapping.getBlockTexture(Blocks.PISTON, "_top");
        final TextureMapping iy3 = iy2.copyAndUpdate(TextureSlot.PLATFORM, uh3);
        final TextureMapping iy4 = iy2.copyAndUpdate(TextureSlot.PLATFORM, uh4);
        final ResourceLocation uh5 = ModelLocationUtils.getModelLocation(Blocks.PISTON, "_base");
        this.createPistonVariant(Blocks.PISTON, uh5, iy4);
        this.createPistonVariant(Blocks.STICKY_PISTON, uh5, iy3);
        final ResourceLocation uh6 = ModelTemplates.CUBE_BOTTOM_TOP.createWithSuffix(Blocks.PISTON, "_inventory", iy2.copyAndUpdate(TextureSlot.TOP, uh4), this.modelOutput);
        final ResourceLocation uh7 = ModelTemplates.CUBE_BOTTOM_TOP.createWithSuffix(Blocks.STICKY_PISTON, "_inventory", iy2.copyAndUpdate(TextureSlot.TOP, uh3), this.modelOutput);
        this.delegateItemModel(Blocks.PISTON, uh6);
        this.delegateItemModel(Blocks.STICKY_PISTON, uh7);
    }
    
    private void createPistonVariant(final Block bvr, final ResourceLocation uh, final TextureMapping iy) {
        final ResourceLocation uh2 = ModelTemplates.PISTON.create(bvr, iy, this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr).with(createBooleanModelDispatch(BlockStateProperties.EXTENDED, uh, uh2)).with(createFacingDispatch()));
    }
    
    private void createPistonHeads() {
        final TextureMapping iy2 = new TextureMapping().put(TextureSlot.UNSTICKY, TextureMapping.getBlockTexture(Blocks.PISTON, "_top")).put(TextureSlot.SIDE, TextureMapping.getBlockTexture(Blocks.PISTON, "_side"));
        final TextureMapping iy3 = iy2.copyAndUpdate(TextureSlot.PLATFORM, TextureMapping.getBlockTexture(Blocks.PISTON, "_top_sticky"));
        final TextureMapping iy4 = iy2.copyAndUpdate(TextureSlot.PLATFORM, TextureMapping.getBlockTexture(Blocks.PISTON, "_top"));
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.PISTON_HEAD).with(PropertyDispatch.<Boolean, PistonType>properties((Property<Boolean>)BlockStateProperties.SHORT, BlockStateProperties.PISTON_TYPE).select(false, PistonType.DEFAULT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelTemplates.PISTON_HEAD.createWithSuffix(Blocks.PISTON, "_head", iy4, this.modelOutput))).select(false, PistonType.STICKY, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelTemplates.PISTON_HEAD.createWithSuffix(Blocks.PISTON, "_head_sticky", iy3, this.modelOutput))).select(true, PistonType.DEFAULT, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelTemplates.PISTON_HEAD_SHORT.createWithSuffix(Blocks.PISTON, "_head_short", iy4, this.modelOutput))).select(true, PistonType.STICKY, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelTemplates.PISTON_HEAD_SHORT.createWithSuffix(Blocks.PISTON, "_head_short_sticky", iy3, this.modelOutput)))).with(createFacingDispatch()));
    }
    
    private void createScaffolding() {
        final ResourceLocation uh2 = ModelLocationUtils.getModelLocation(Blocks.SCAFFOLDING, "_stable");
        final ResourceLocation uh3 = ModelLocationUtils.getModelLocation(Blocks.SCAFFOLDING, "_unstable");
        this.delegateItemModel(Blocks.SCAFFOLDING, uh2);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.SCAFFOLDING).with(createBooleanModelDispatch(BlockStateProperties.BOTTOM, uh3, uh2)));
    }
    
    private void createRedstoneLamp() {
        final ResourceLocation uh2 = TexturedModel.CUBE.create(Blocks.REDSTONE_LAMP, this.modelOutput);
        final ResourceLocation uh3 = this.createSuffixedVariant(Blocks.REDSTONE_LAMP, "_on", ModelTemplates.CUBE_ALL, TextureMapping::cube);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.REDSTONE_LAMP).with(createBooleanModelDispatch(BlockStateProperties.LIT, uh3, uh2)));
    }
    
    private void createNormalTorch(final Block bvr1, final Block bvr2) {
        final TextureMapping iy4 = TextureMapping.torch(bvr1);
        this.blockStateOutput.accept(createSimpleBlock(bvr1, ModelTemplates.TORCH.create(bvr1, iy4, this.modelOutput)));
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(bvr2, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelTemplates.WALL_TORCH.create(bvr2, iy4, this.modelOutput))).with(createTorchHorizontalDispatch()));
        this.createSimpleFlatItemModel(bvr1);
        this.skipAutoItemBlock(bvr2);
    }
    
    private void createRedstoneTorch() {
        final TextureMapping iy2 = TextureMapping.torch(Blocks.REDSTONE_TORCH);
        final TextureMapping iy3 = TextureMapping.torch(TextureMapping.getBlockTexture(Blocks.REDSTONE_TORCH, "_off"));
        final ResourceLocation uh4 = ModelTemplates.TORCH.create(Blocks.REDSTONE_TORCH, iy2, this.modelOutput);
        final ResourceLocation uh5 = ModelTemplates.TORCH.createWithSuffix(Blocks.REDSTONE_TORCH, "_off", iy3, this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.REDSTONE_TORCH).with(createBooleanModelDispatch(BlockStateProperties.LIT, uh4, uh5)));
        final ResourceLocation uh6 = ModelTemplates.WALL_TORCH.create(Blocks.REDSTONE_WALL_TORCH, iy2, this.modelOutput);
        final ResourceLocation uh7 = ModelTemplates.WALL_TORCH.createWithSuffix(Blocks.REDSTONE_WALL_TORCH, "_off", iy3, this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.REDSTONE_WALL_TORCH).with(createBooleanModelDispatch(BlockStateProperties.LIT, uh6, uh7)).with(createTorchHorizontalDispatch()));
        this.createSimpleFlatItemModel(Blocks.REDSTONE_TORCH);
        this.skipAutoItemBlock(Blocks.REDSTONE_WALL_TORCH);
    }
    
    private void createRepeater() {
        this.createSimpleFlatItemModel(Items.REPEATER);
        final StringBuilder stringBuilder4;
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.REPEATER).with(PropertyDispatch.<Integer, Boolean, Boolean>properties((Property<Integer>)BlockStateProperties.DELAY, (Property<Boolean>)BlockStateProperties.LOCKED, (Property<Boolean>)BlockStateProperties.POWERED).generate((integer, boolean2, boolean3) -> {
            stringBuilder4 = new StringBuilder();
            stringBuilder4.append('_').append(integer).append("tick");
            if (boolean3) {
                stringBuilder4.append("_on");
            }
            if (boolean2) {
                stringBuilder4.append("_locked");
            }
            return Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.REPEATER, stringBuilder4.toString()));
        })).with(createHorizontalFacingDispatchAlt()));
    }
    
    private void createSeaPickle() {
        this.createSimpleFlatItemModel(Items.SEA_PICKLE);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.SEA_PICKLE).with(PropertyDispatch.<Integer, Boolean>properties((Property<Integer>)BlockStateProperties.PICKLES, (Property<Boolean>)BlockStateProperties.WATERLOGGED).select(1, false, Arrays.<Variant>asList(createRotatedVariants(ModelLocationUtils.decorateBlockModelLocation("dead_sea_pickle")))).select(2, false, Arrays.<Variant>asList(createRotatedVariants(ModelLocationUtils.decorateBlockModelLocation("two_dead_sea_pickles")))).select(3, false, Arrays.<Variant>asList(createRotatedVariants(ModelLocationUtils.decorateBlockModelLocation("three_dead_sea_pickles")))).select(4, false, Arrays.<Variant>asList(createRotatedVariants(ModelLocationUtils.decorateBlockModelLocation("four_dead_sea_pickles")))).select(1, true, Arrays.<Variant>asList(createRotatedVariants(ModelLocationUtils.decorateBlockModelLocation("sea_pickle")))).select(2, true, Arrays.<Variant>asList(createRotatedVariants(ModelLocationUtils.decorateBlockModelLocation("two_sea_pickles")))).select(3, true, Arrays.<Variant>asList(createRotatedVariants(ModelLocationUtils.decorateBlockModelLocation("three_sea_pickles")))).select(4, true, Arrays.<Variant>asList(createRotatedVariants(ModelLocationUtils.decorateBlockModelLocation("four_sea_pickles"))))));
    }
    
    private void createSnowBlocks() {
        final TextureMapping iy2 = TextureMapping.cube(Blocks.SNOW);
        final ResourceLocation uh3 = ModelTemplates.CUBE_ALL.create(Blocks.SNOW_BLOCK, iy2, this.modelOutput);
        final VariantProperty<ResourceLocation> model;
        ResourceLocation modelLocation;
        final ResourceLocation resourceLocation;
        final Variant variant;
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.SNOW).with(PropertyDispatch.<Comparable>property((Property<Comparable>)BlockStateProperties.LAYERS).generate(integer -> {
            Variant.variant();
            model = VariantProperties.MODEL;
            if (integer < 8) {
                modelLocation = ModelLocationUtils.getModelLocation(Blocks.SNOW, "_height" + integer * 2);
            }
            else {
                modelLocation = resourceLocation;
            }
            return variant.<ResourceLocation>with(model, modelLocation);
        })));
        this.delegateItemModel(Blocks.SNOW, ModelLocationUtils.getModelLocation(Blocks.SNOW, "_height2"));
        this.blockStateOutput.accept(createSimpleBlock(Blocks.SNOW_BLOCK, uh3));
    }
    
    private void createStonecutter() {
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.STONECUTTER, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.STONECUTTER))).with(createHorizontalFacingDispatch()));
    }
    
    private void createStructureBlock() {
        final ResourceLocation uh2 = TexturedModel.CUBE.create(Blocks.STRUCTURE_BLOCK, this.modelOutput);
        this.delegateItemModel(Blocks.STRUCTURE_BLOCK, uh2);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.STRUCTURE_BLOCK).with(PropertyDispatch.<StructureMode>property(BlockStateProperties.STRUCTUREBLOCK_MODE).generate(cgq -> Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, this.createSuffixedVariant(Blocks.STRUCTURE_BLOCK, "_" + cgq.getSerializedName(), ModelTemplates.CUBE_ALL, TextureMapping::cube)))));
    }
    
    private void createSweetBerryBush() {
        this.createSimpleFlatItemModel(Items.SWEET_BERRIES);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.SWEET_BERRY_BUSH).with(PropertyDispatch.<Integer>property((Property<Integer>)BlockStateProperties.AGE_3).generate(integer -> Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, this.createSuffixedVariant(Blocks.SWEET_BERRY_BUSH, "_stage" + integer, ModelTemplates.CROSS, TextureMapping::cross)))));
    }
    
    private void createTripwire() {
        this.createSimpleFlatItemModel(Items.STRING);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.TRIPWIRE).with(PropertyDispatch.<Boolean, Boolean, Boolean, Boolean, Boolean>properties((Property<Boolean>)BlockStateProperties.ATTACHED, (Property<Boolean>)BlockStateProperties.EAST, (Property<Boolean>)BlockStateProperties.NORTH, (Property<Boolean>)BlockStateProperties.SOUTH, (Property<Boolean>)BlockStateProperties.WEST).select(false, false, false, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_ns"))).select(false, true, false, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_n")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(false, false, true, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_n"))).select(false, false, false, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_n")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(false, false, false, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_n")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(false, true, true, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_ne"))).select(false, true, false, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_ne")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(false, false, false, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_ne")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(false, false, true, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_ne")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(false, false, true, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_ns"))).select(false, true, false, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_ns")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(false, true, true, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_nse"))).select(false, true, false, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_nse")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(false, false, true, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_nse")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(false, true, true, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_nse")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(false, true, true, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_nsew"))).select(true, false, false, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_ns"))).select(true, false, true, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_n"))).select(true, false, false, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_n")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(true, true, false, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_n")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(true, false, false, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_n")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(true, true, true, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_ne"))).select(true, true, false, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_ne")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(true, false, false, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_ne")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(true, false, true, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_ne")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(true, false, true, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_ns"))).select(true, true, false, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_ns")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(true, true, true, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_nse"))).select(true, true, false, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_nse")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(true, false, true, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_nse")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(true, true, true, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_nse")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(true, true, true, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.TRIPWIRE, "_attached_nsew")))));
    }
    
    private void createTripwireHook() {
        this.createSimpleFlatItemModel(Blocks.TRIPWIRE_HOOK);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.TRIPWIRE_HOOK).with(PropertyDispatch.<Boolean, Boolean>properties((Property<Boolean>)BlockStateProperties.ATTACHED, (Property<Boolean>)BlockStateProperties.POWERED).generate((boolean1, boolean2) -> Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, TextureMapping.getBlockTexture(Blocks.TRIPWIRE_HOOK, (boolean1 ? "_attached" : "") + (boolean2 ? "_on" : ""))))).with(createHorizontalFacingDispatch()));
    }
    
    private ResourceLocation createTurtleEggModel(final int integer, final String string, final TextureMapping iy) {
        switch (integer) {
            case 1: {
                return ModelTemplates.TURTLE_EGG.create(ModelLocationUtils.decorateBlockModelLocation(string + "turtle_egg"), iy, this.modelOutput);
            }
            case 2: {
                return ModelTemplates.TWO_TURTLE_EGGS.create(ModelLocationUtils.decorateBlockModelLocation("two_" + string + "turtle_eggs"), iy, this.modelOutput);
            }
            case 3: {
                return ModelTemplates.THREE_TURTLE_EGGS.create(ModelLocationUtils.decorateBlockModelLocation("three_" + string + "turtle_eggs"), iy, this.modelOutput);
            }
            case 4: {
                return ModelTemplates.FOUR_TURTLE_EGGS.create(ModelLocationUtils.decorateBlockModelLocation("four_" + string + "turtle_eggs"), iy, this.modelOutput);
            }
            default: {
                throw new UnsupportedOperationException();
            }
        }
    }
    
    private ResourceLocation createTurtleEggModel(final Integer integer1, final Integer integer2) {
        switch (integer2) {
            case 0: {
                return this.createTurtleEggModel(integer1, "", TextureMapping.cube(TextureMapping.getBlockTexture(Blocks.TURTLE_EGG)));
            }
            case 1: {
                return this.createTurtleEggModel(integer1, "slightly_cracked_", TextureMapping.cube(TextureMapping.getBlockTexture(Blocks.TURTLE_EGG, "_slightly_cracked")));
            }
            case 2: {
                return this.createTurtleEggModel(integer1, "very_cracked_", TextureMapping.cube(TextureMapping.getBlockTexture(Blocks.TURTLE_EGG, "_very_cracked")));
            }
            default: {
                throw new UnsupportedOperationException();
            }
        }
    }
    
    private void createTurtleEgg() {
        this.createSimpleFlatItemModel(Items.TURTLE_EGG);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.TURTLE_EGG).with(PropertyDispatch.<Integer, Integer>properties((Property<Integer>)BlockStateProperties.EGGS, (Property<Integer>)BlockStateProperties.HATCH).generateList((integer1, integer2) -> Arrays.<Variant>asList(createRotatedVariants(this.createTurtleEggModel(integer1, integer2))))));
    }
    
    private void createVine() {
        this.createSimpleFlatItemModel(Blocks.VINE);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.VINE).with(PropertyDispatch.<Boolean, Boolean, Boolean, Boolean, Boolean>properties((Property<Boolean>)BlockStateProperties.EAST, (Property<Boolean>)BlockStateProperties.NORTH, (Property<Boolean>)BlockStateProperties.SOUTH, (Property<Boolean>)BlockStateProperties.UP, (Property<Boolean>)BlockStateProperties.WEST).select(false, false, false, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_1"))).select(false, false, true, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_1"))).select(false, false, false, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_1")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(false, true, false, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_1")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(true, false, false, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_1")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(true, true, false, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2"))).select(true, false, true, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(false, false, true, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(false, true, false, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(true, false, false, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2_opposite"))).select(false, true, true, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2_opposite")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(true, true, true, false, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_3"))).select(true, false, true, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_3")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(false, true, true, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_3")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(true, true, false, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_3")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(true, true, true, false, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_4"))).select(false, false, false, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_u"))).select(false, false, true, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_1u"))).select(false, false, false, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_1u")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(false, true, false, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_1u")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(true, false, false, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_1u")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(true, true, false, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2u"))).select(true, false, true, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2u")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(false, false, true, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2u")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(false, true, false, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2u")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(true, false, false, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2u_opposite"))).select(false, true, true, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_2u_opposite")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(true, true, true, true, false, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_3u"))).select(true, false, true, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_3u")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90)).select(false, true, true, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_3u")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180)).select(true, true, false, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_3u")).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270)).select(true, true, true, true, true, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, ModelLocationUtils.getModelLocation(Blocks.VINE, "_4u")))));
    }
    
    private void createMagmaBlock() {
        this.blockStateOutput.accept(createSimpleBlock(Blocks.MAGMA_BLOCK, ModelTemplates.CUBE_ALL.create(Blocks.MAGMA_BLOCK, TextureMapping.cube(ModelLocationUtils.decorateBlockModelLocation("magma")), this.modelOutput)));
    }
    
    private void createShulkerBox(final Block bvr) {
        this.createTrivialBlock(bvr, TexturedModel.PARTICLE_ONLY);
        ModelTemplates.SHULKER_BOX_INVENTORY.create(ModelLocationUtils.getModelLocation(bvr.asItem()), TextureMapping.particle(bvr), this.modelOutput);
    }
    
    private void createGrowingPlant(final Block bvr1, final Block bvr2, final TintState c) {
        this.createCrossBlock(bvr1, c);
        this.createCrossBlock(bvr2, c);
    }
    
    private void createBedItem(final Block bvr1, final Block bvr2) {
        ModelTemplates.BED_INVENTORY.create(ModelLocationUtils.getModelLocation(bvr1.asItem()), TextureMapping.particle(bvr2), this.modelOutput);
    }
    
    private void createInfestedStone() {
        final ResourceLocation uh2 = ModelLocationUtils.getModelLocation(Blocks.STONE);
        final ResourceLocation uh3 = ModelLocationUtils.getModelLocation(Blocks.STONE, "_mirrored");
        this.blockStateOutput.accept(createRotatedVariant(Blocks.INFESTED_STONE, uh2, uh3));
        this.delegateItemModel(Blocks.INFESTED_STONE, uh2);
    }
    
    private void createNetherRoots(final Block bvr1, final Block bvr2) {
        this.createCrossBlockWithDefaultItem(bvr1, TintState.NOT_TINTED);
        final TextureMapping iy4 = TextureMapping.plant(TextureMapping.getBlockTexture(bvr1, "_pot"));
        final ResourceLocation uh5 = TintState.NOT_TINTED.getCrossPot().create(bvr2, iy4, this.modelOutput);
        this.blockStateOutput.accept(createSimpleBlock(bvr2, uh5));
    }
    
    private void createRespawnAnchor() {
        final ResourceLocation uh2 = TextureMapping.getBlockTexture(Blocks.RESPAWN_ANCHOR, "_bottom");
        final ResourceLocation uh3 = TextureMapping.getBlockTexture(Blocks.RESPAWN_ANCHOR, "_top_off");
        final ResourceLocation uh4 = TextureMapping.getBlockTexture(Blocks.RESPAWN_ANCHOR, "_top");
        final ResourceLocation[] arr5 = new ResourceLocation[5];
        for (int integer2 = 0; integer2 < 5; ++integer2) {
            final TextureMapping iy7 = new TextureMapping().put(TextureSlot.BOTTOM, uh2).put(TextureSlot.TOP, (integer2 == 0) ? uh3 : uh4).put(TextureSlot.SIDE, TextureMapping.getBlockTexture(Blocks.RESPAWN_ANCHOR, "_side" + integer2));
            arr5[integer2] = ModelTemplates.CUBE_BOTTOM_TOP.createWithSuffix(Blocks.RESPAWN_ANCHOR, "_" + integer2, iy7, this.modelOutput);
        }
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.RESPAWN_ANCHOR).with(PropertyDispatch.<Comparable>property((Property<Comparable>)BlockStateProperties.RESPAWN_ANCHOR_CHARGES).generate(integer -> Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, arr5[integer]))));
        this.delegateItemModel(Items.RESPAWN_ANCHOR, arr5[0]);
    }
    
    private Variant applyRotation(final FrontAndTop gb, final Variant iq) {
        switch (gb) {
            case DOWN_NORTH: {
                return iq.<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90);
            }
            case DOWN_SOUTH: {
                return iq.<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180);
            }
            case DOWN_WEST: {
                return iq.<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270);
            }
            case DOWN_EAST: {
                return iq.<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R90).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90);
            }
            case UP_NORTH: {
                return iq.<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180);
            }
            case UP_SOUTH: {
                return iq.<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270);
            }
            case UP_WEST: {
                return iq.<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90);
            }
            case UP_EAST: {
                return iq.<VariantProperties.Rotation>with(VariantProperties.X_ROT, VariantProperties.Rotation.R270).<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270);
            }
            case NORTH_UP: {
                return iq;
            }
            case SOUTH_UP: {
                return iq.<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R180);
            }
            case WEST_UP: {
                return iq.<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R270);
            }
            case EAST_UP: {
                return iq.<VariantProperties.Rotation>with(VariantProperties.Y_ROT, VariantProperties.Rotation.R90);
            }
            default: {
                throw new UnsupportedOperationException("Rotation " + gb + " can't be expressed with existing x and y values");
            }
        }
    }
    
    private void createJigsaw() {
        final ResourceLocation uh2 = TextureMapping.getBlockTexture(Blocks.JIGSAW, "_top");
        final ResourceLocation uh3 = TextureMapping.getBlockTexture(Blocks.JIGSAW, "_bottom");
        final ResourceLocation uh4 = TextureMapping.getBlockTexture(Blocks.JIGSAW, "_side");
        final ResourceLocation uh5 = TextureMapping.getBlockTexture(Blocks.JIGSAW, "_lock");
        final TextureMapping iy6 = new TextureMapping().put(TextureSlot.DOWN, uh4).put(TextureSlot.WEST, uh4).put(TextureSlot.EAST, uh4).put(TextureSlot.PARTICLE, uh2).put(TextureSlot.NORTH, uh2).put(TextureSlot.SOUTH, uh3).put(TextureSlot.UP, uh5);
        final ResourceLocation uh6 = ModelTemplates.CUBE_DIRECTIONAL.create(Blocks.JIGSAW, iy6, this.modelOutput);
        this.blockStateOutput.accept(MultiVariantGenerator.multiVariant(Blocks.JIGSAW, Variant.variant().<ResourceLocation>with(VariantProperties.MODEL, uh6)).with(PropertyDispatch.<FrontAndTop>property(BlockStateProperties.ORIENTATION).generate(gb -> this.applyRotation(gb, Variant.variant()))));
    }
    
    public void run() {
        this.createNonTemplateModelBlock(Blocks.AIR);
        this.createNonTemplateModelBlock(Blocks.CAVE_AIR, Blocks.AIR);
        this.createNonTemplateModelBlock(Blocks.VOID_AIR, Blocks.AIR);
        this.createNonTemplateModelBlock(Blocks.BEACON);
        this.createNonTemplateModelBlock(Blocks.CACTUS);
        this.createNonTemplateModelBlock(Blocks.BUBBLE_COLUMN, Blocks.WATER);
        this.createNonTemplateModelBlock(Blocks.DRAGON_EGG);
        this.createNonTemplateModelBlock(Blocks.DRIED_KELP_BLOCK);
        this.createNonTemplateModelBlock(Blocks.ENCHANTING_TABLE);
        this.createNonTemplateModelBlock(Blocks.FLOWER_POT);
        this.createSimpleFlatItemModel(Items.FLOWER_POT);
        this.createNonTemplateModelBlock(Blocks.HONEY_BLOCK);
        this.createNonTemplateModelBlock(Blocks.WATER);
        this.createNonTemplateModelBlock(Blocks.LAVA);
        this.createNonTemplateModelBlock(Blocks.SLIME_BLOCK);
        this.createNonTemplateModelBlock(Blocks.CHAIN);
        this.createSimpleFlatItemModel(Items.CHAIN);
        this.createNonTemplateModelBlock(Blocks.POTTED_BAMBOO);
        this.createNonTemplateModelBlock(Blocks.POTTED_CACTUS);
        this.createAirLikeBlock(Blocks.BARRIER, Items.BARRIER);
        this.createSimpleFlatItemModel(Items.BARRIER);
        this.createAirLikeBlock(Blocks.STRUCTURE_VOID, Items.STRUCTURE_VOID);
        this.createSimpleFlatItemModel(Items.STRUCTURE_VOID);
        this.createAirLikeBlock(Blocks.MOVING_PISTON, TextureMapping.getBlockTexture(Blocks.PISTON, "_side"));
        this.createTrivialBlock(Blocks.COAL_ORE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.COAL_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.DIAMOND_ORE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.DIAMOND_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.EMERALD_ORE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.EMERALD_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.GOLD_ORE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.NETHER_GOLD_ORE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.GOLD_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.IRON_ORE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.IRON_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.ANCIENT_DEBRIS, TexturedModel.COLUMN);
        this.createTrivialBlock(Blocks.NETHERITE_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.LAPIS_ORE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.LAPIS_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.NETHER_QUARTZ_ORE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.REDSTONE_ORE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.REDSTONE_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.GILDED_BLACKSTONE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.BLUE_ICE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.CHISELED_NETHER_BRICKS, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.CLAY, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.COARSE_DIRT, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.CRACKED_NETHER_BRICKS, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.CRACKED_STONE_BRICKS, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.CRYING_OBSIDIAN, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.END_STONE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.GLOWSTONE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.GRAVEL, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.HONEYCOMB_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.ICE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.JUKEBOX, TexturedModel.CUBE_TOP);
        this.createTrivialBlock(Blocks.LODESTONE, TexturedModel.COLUMN);
        this.createTrivialBlock(Blocks.MELON, TexturedModel.COLUMN);
        this.createTrivialBlock(Blocks.NETHER_WART_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.NOTE_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.PACKED_ICE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.OBSIDIAN, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.QUARTZ_BRICKS, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.SEA_LANTERN, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.SHROOMLIGHT, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.SOUL_SAND, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.SOUL_SOIL, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.SPAWNER, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.SPONGE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.SEAGRASS, TexturedModel.SEAGRASS);
        this.createSimpleFlatItemModel(Items.SEAGRASS);
        this.createTrivialBlock(Blocks.TNT, TexturedModel.CUBE_TOP_BOTTOM);
        this.createTrivialBlock(Blocks.TARGET, TexturedModel.COLUMN);
        this.createTrivialBlock(Blocks.WARPED_WART_BLOCK, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.WET_SPONGE, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.CRACKED_POLISHED_BLACKSTONE_BRICKS, TexturedModel.CUBE);
        this.createTrivialBlock(Blocks.CHISELED_QUARTZ_BLOCK, TexturedModel.COLUMN.updateTexture(iy -> iy.put(TextureSlot.SIDE, TextureMapping.getBlockTexture(Blocks.CHISELED_QUARTZ_BLOCK))));
        this.createTrivialBlock(Blocks.CHISELED_STONE_BRICKS, TexturedModel.CUBE);
        this.createChiseledSandsone(Blocks.CHISELED_SANDSTONE, Blocks.SANDSTONE);
        this.createChiseledSandsone(Blocks.CHISELED_RED_SANDSTONE, Blocks.RED_SANDSTONE);
        this.createTrivialBlock(Blocks.CHISELED_POLISHED_BLACKSTONE, TexturedModel.CUBE);
        this.createWeightedPressurePlate(Blocks.LIGHT_WEIGHTED_PRESSURE_PLATE, Blocks.GOLD_BLOCK);
        this.createWeightedPressurePlate(Blocks.HEAVY_WEIGHTED_PRESSURE_PLATE, Blocks.IRON_BLOCK);
        this.createBookshelf();
        this.createBrewingStand();
        this.createCakeBlock();
        this.createCampfires(Blocks.CAMPFIRE, Blocks.SOUL_CAMPFIRE);
        this.createCartographyTable();
        this.createCauldron();
        this.createChorusFlower();
        this.createChorusPlant();
        this.createComposter();
        this.createDaylightDetector();
        this.createEndPortalFrame();
        this.createEndRod();
        this.createFarmland();
        this.createFire();
        this.createSoulFire();
        this.createFrostedIce();
        this.createGrassBlocks();
        this.createCocoa();
        this.createGrassPath();
        this.createGrindstone();
        this.createHopper();
        this.createIronBars();
        this.createLever();
        this.createLilyPad();
        this.createNetherPortalBlock();
        this.createNetherrack();
        this.createObserver();
        this.createPistons();
        this.createPistonHeads();
        this.createScaffolding();
        this.createRedstoneTorch();
        this.createRedstoneLamp();
        this.createRepeater();
        this.createSeaPickle();
        this.createSmithingTable();
        this.createSnowBlocks();
        this.createStonecutter();
        this.createStructureBlock();
        this.createSweetBerryBush();
        this.createTripwire();
        this.createTripwireHook();
        this.createTurtleEgg();
        this.createVine();
        this.createMagmaBlock();
        this.createJigsaw();
        this.createNonTemplateHorizontalBlock(Blocks.LADDER);
        this.createSimpleFlatItemModel(Blocks.LADDER);
        this.createNonTemplateHorizontalBlock(Blocks.LECTERN);
        this.createNormalTorch(Blocks.TORCH, Blocks.WALL_TORCH);
        this.createNormalTorch(Blocks.SOUL_TORCH, Blocks.SOUL_WALL_TORCH);
        this.createCraftingTableLike(Blocks.CRAFTING_TABLE, Blocks.OAK_PLANKS, TextureMapping::craftingTable);
        this.createCraftingTableLike(Blocks.FLETCHING_TABLE, Blocks.BIRCH_PLANKS, TextureMapping::fletchingTable);
        this.createNyliumBlock(Blocks.CRIMSON_NYLIUM);
        this.createNyliumBlock(Blocks.WARPED_NYLIUM);
        this.createDispenserBlock(Blocks.DISPENSER);
        this.createDispenserBlock(Blocks.DROPPER);
        this.createLantern(Blocks.LANTERN);
        this.createLantern(Blocks.SOUL_LANTERN);
        this.createAxisAlignedPillarBlock(Blocks.BASALT, TexturedModel.COLUMN);
        this.createAxisAlignedPillarBlock(Blocks.POLISHED_BASALT, TexturedModel.COLUMN);
        this.createAxisAlignedPillarBlock(Blocks.BONE_BLOCK, TexturedModel.COLUMN);
        this.createRotatedVariantBlock(Blocks.DIRT);
        this.createRotatedVariantBlock(Blocks.SAND);
        this.createRotatedVariantBlock(Blocks.RED_SAND);
        this.createRotatedMirroredVariantBlock(Blocks.BEDROCK);
        this.createRotatedPillarWithHorizontalVariant(Blocks.HAY_BLOCK, TexturedModel.COLUMN, TexturedModel.COLUMN_HORIZONTAL);
        this.createRotatedPillarWithHorizontalVariant(Blocks.PURPUR_PILLAR, TexturedModel.COLUMN_ALT, TexturedModel.COLUMN_HORIZONTAL_ALT);
        this.createRotatedPillarWithHorizontalVariant(Blocks.QUARTZ_PILLAR, TexturedModel.COLUMN_ALT, TexturedModel.COLUMN_HORIZONTAL_ALT);
        this.createHorizontallyRotatedBlock(Blocks.LOOM, TexturedModel.ORIENTABLE);
        this.createPumpkins();
        this.createBeeNest(Blocks.BEE_NEST, TextureMapping::orientableCube);
        this.createBeeNest(Blocks.BEEHIVE, TextureMapping::orientableCubeSameEnds);
        this.createCropBlock(Blocks.BEETROOTS, BlockStateProperties.AGE_3, 0, 1, 2, 3);
        this.createCropBlock(Blocks.CARROTS, BlockStateProperties.AGE_7, 0, 0, 1, 1, 2, 2, 2, 3);
        this.createCropBlock(Blocks.NETHER_WART, BlockStateProperties.AGE_3, 0, 1, 1, 2);
        this.createCropBlock(Blocks.POTATOES, BlockStateProperties.AGE_7, 0, 0, 1, 1, 2, 2, 2, 3);
        this.createCropBlock(Blocks.WHEAT, BlockStateProperties.AGE_7, 0, 1, 2, 3, 4, 5, 6, 7);
        this.blockEntityModels(ModelLocationUtils.decorateBlockModelLocation("banner"), Blocks.OAK_PLANKS).createWithCustomBlockItemModel(ModelTemplates.BANNER_INVENTORY, Blocks.WHITE_BANNER, Blocks.ORANGE_BANNER, Blocks.MAGENTA_BANNER, Blocks.LIGHT_BLUE_BANNER, Blocks.YELLOW_BANNER, Blocks.LIME_BANNER, Blocks.PINK_BANNER, Blocks.GRAY_BANNER, Blocks.LIGHT_GRAY_BANNER, Blocks.CYAN_BANNER, Blocks.PURPLE_BANNER, Blocks.BLUE_BANNER, Blocks.BROWN_BANNER, Blocks.GREEN_BANNER, Blocks.RED_BANNER, Blocks.BLACK_BANNER).createWithoutBlockItem(Blocks.WHITE_WALL_BANNER, Blocks.ORANGE_WALL_BANNER, Blocks.MAGENTA_WALL_BANNER, Blocks.LIGHT_BLUE_WALL_BANNER, Blocks.YELLOW_WALL_BANNER, Blocks.LIME_WALL_BANNER, Blocks.PINK_WALL_BANNER, Blocks.GRAY_WALL_BANNER, Blocks.LIGHT_GRAY_WALL_BANNER, Blocks.CYAN_WALL_BANNER, Blocks.PURPLE_WALL_BANNER, Blocks.BLUE_WALL_BANNER, Blocks.BROWN_WALL_BANNER, Blocks.GREEN_WALL_BANNER, Blocks.RED_WALL_BANNER, Blocks.BLACK_WALL_BANNER);
        this.blockEntityModels(ModelLocationUtils.decorateBlockModelLocation("bed"), Blocks.OAK_PLANKS).createWithoutBlockItem(Blocks.WHITE_BED, Blocks.ORANGE_BED, Blocks.MAGENTA_BED, Blocks.LIGHT_BLUE_BED, Blocks.YELLOW_BED, Blocks.LIME_BED, Blocks.PINK_BED, Blocks.GRAY_BED, Blocks.LIGHT_GRAY_BED, Blocks.CYAN_BED, Blocks.PURPLE_BED, Blocks.BLUE_BED, Blocks.BROWN_BED, Blocks.GREEN_BED, Blocks.RED_BED, Blocks.BLACK_BED);
        this.createBedItem(Blocks.WHITE_BED, Blocks.WHITE_WOOL);
        this.createBedItem(Blocks.ORANGE_BED, Blocks.ORANGE_WOOL);
        this.createBedItem(Blocks.MAGENTA_BED, Blocks.MAGENTA_WOOL);
        this.createBedItem(Blocks.LIGHT_BLUE_BED, Blocks.LIGHT_BLUE_WOOL);
        this.createBedItem(Blocks.YELLOW_BED, Blocks.YELLOW_WOOL);
        this.createBedItem(Blocks.LIME_BED, Blocks.LIME_WOOL);
        this.createBedItem(Blocks.PINK_BED, Blocks.PINK_WOOL);
        this.createBedItem(Blocks.GRAY_BED, Blocks.GRAY_WOOL);
        this.createBedItem(Blocks.LIGHT_GRAY_BED, Blocks.LIGHT_GRAY_WOOL);
        this.createBedItem(Blocks.CYAN_BED, Blocks.CYAN_WOOL);
        this.createBedItem(Blocks.PURPLE_BED, Blocks.PURPLE_WOOL);
        this.createBedItem(Blocks.BLUE_BED, Blocks.BLUE_WOOL);
        this.createBedItem(Blocks.BROWN_BED, Blocks.BROWN_WOOL);
        this.createBedItem(Blocks.GREEN_BED, Blocks.GREEN_WOOL);
        this.createBedItem(Blocks.RED_BED, Blocks.RED_WOOL);
        this.createBedItem(Blocks.BLACK_BED, Blocks.BLACK_WOOL);
        this.blockEntityModels(ModelLocationUtils.decorateBlockModelLocation("skull"), Blocks.SOUL_SAND).createWithCustomBlockItemModel(ModelTemplates.SKULL_INVENTORY, Blocks.CREEPER_HEAD, Blocks.PLAYER_HEAD, Blocks.ZOMBIE_HEAD, Blocks.SKELETON_SKULL, Blocks.WITHER_SKELETON_SKULL).create(Blocks.DRAGON_HEAD).createWithoutBlockItem(Blocks.CREEPER_WALL_HEAD, Blocks.DRAGON_WALL_HEAD, Blocks.PLAYER_WALL_HEAD, Blocks.ZOMBIE_WALL_HEAD, Blocks.SKELETON_WALL_SKULL, Blocks.WITHER_SKELETON_WALL_SKULL);
        this.createShulkerBox(Blocks.SHULKER_BOX);
        this.createShulkerBox(Blocks.WHITE_SHULKER_BOX);
        this.createShulkerBox(Blocks.ORANGE_SHULKER_BOX);
        this.createShulkerBox(Blocks.MAGENTA_SHULKER_BOX);
        this.createShulkerBox(Blocks.LIGHT_BLUE_SHULKER_BOX);
        this.createShulkerBox(Blocks.YELLOW_SHULKER_BOX);
        this.createShulkerBox(Blocks.LIME_SHULKER_BOX);
        this.createShulkerBox(Blocks.PINK_SHULKER_BOX);
        this.createShulkerBox(Blocks.GRAY_SHULKER_BOX);
        this.createShulkerBox(Blocks.LIGHT_GRAY_SHULKER_BOX);
        this.createShulkerBox(Blocks.CYAN_SHULKER_BOX);
        this.createShulkerBox(Blocks.PURPLE_SHULKER_BOX);
        this.createShulkerBox(Blocks.BLUE_SHULKER_BOX);
        this.createShulkerBox(Blocks.BROWN_SHULKER_BOX);
        this.createShulkerBox(Blocks.GREEN_SHULKER_BOX);
        this.createShulkerBox(Blocks.RED_SHULKER_BOX);
        this.createShulkerBox(Blocks.BLACK_SHULKER_BOX);
        this.createTrivialBlock(Blocks.CONDUIT, TexturedModel.PARTICLE_ONLY);
        this.skipAutoItemBlock(Blocks.CONDUIT);
        this.blockEntityModels(ModelLocationUtils.decorateBlockModelLocation("chest"), Blocks.OAK_PLANKS).createWithoutBlockItem(Blocks.CHEST, Blocks.TRAPPED_CHEST);
        this.blockEntityModels(ModelLocationUtils.decorateBlockModelLocation("ender_chest"), Blocks.OBSIDIAN).createWithoutBlockItem(Blocks.ENDER_CHEST);
        this.blockEntityModels(Blocks.END_PORTAL, Blocks.OBSIDIAN).create(Blocks.END_PORTAL, Blocks.END_GATEWAY);
        this.createTrivialCube(Blocks.WHITE_CONCRETE);
        this.createTrivialCube(Blocks.ORANGE_CONCRETE);
        this.createTrivialCube(Blocks.MAGENTA_CONCRETE);
        this.createTrivialCube(Blocks.LIGHT_BLUE_CONCRETE);
        this.createTrivialCube(Blocks.YELLOW_CONCRETE);
        this.createTrivialCube(Blocks.LIME_CONCRETE);
        this.createTrivialCube(Blocks.PINK_CONCRETE);
        this.createTrivialCube(Blocks.GRAY_CONCRETE);
        this.createTrivialCube(Blocks.LIGHT_GRAY_CONCRETE);
        this.createTrivialCube(Blocks.CYAN_CONCRETE);
        this.createTrivialCube(Blocks.PURPLE_CONCRETE);
        this.createTrivialCube(Blocks.BLUE_CONCRETE);
        this.createTrivialCube(Blocks.BROWN_CONCRETE);
        this.createTrivialCube(Blocks.GREEN_CONCRETE);
        this.createTrivialCube(Blocks.RED_CONCRETE);
        this.createTrivialCube(Blocks.BLACK_CONCRETE);
        this.createColoredBlockWithRandomRotations(TexturedModel.CUBE, Blocks.WHITE_CONCRETE_POWDER, Blocks.ORANGE_CONCRETE_POWDER, Blocks.MAGENTA_CONCRETE_POWDER, Blocks.LIGHT_BLUE_CONCRETE_POWDER, Blocks.YELLOW_CONCRETE_POWDER, Blocks.LIME_CONCRETE_POWDER, Blocks.PINK_CONCRETE_POWDER, Blocks.GRAY_CONCRETE_POWDER, Blocks.LIGHT_GRAY_CONCRETE_POWDER, Blocks.CYAN_CONCRETE_POWDER, Blocks.PURPLE_CONCRETE_POWDER, Blocks.BLUE_CONCRETE_POWDER, Blocks.BROWN_CONCRETE_POWDER, Blocks.GREEN_CONCRETE_POWDER, Blocks.RED_CONCRETE_POWDER, Blocks.BLACK_CONCRETE_POWDER);
        this.createTrivialCube(Blocks.TERRACOTTA);
        this.createTrivialCube(Blocks.WHITE_TERRACOTTA);
        this.createTrivialCube(Blocks.ORANGE_TERRACOTTA);
        this.createTrivialCube(Blocks.MAGENTA_TERRACOTTA);
        this.createTrivialCube(Blocks.LIGHT_BLUE_TERRACOTTA);
        this.createTrivialCube(Blocks.YELLOW_TERRACOTTA);
        this.createTrivialCube(Blocks.LIME_TERRACOTTA);
        this.createTrivialCube(Blocks.PINK_TERRACOTTA);
        this.createTrivialCube(Blocks.GRAY_TERRACOTTA);
        this.createTrivialCube(Blocks.LIGHT_GRAY_TERRACOTTA);
        this.createTrivialCube(Blocks.CYAN_TERRACOTTA);
        this.createTrivialCube(Blocks.PURPLE_TERRACOTTA);
        this.createTrivialCube(Blocks.BLUE_TERRACOTTA);
        this.createTrivialCube(Blocks.BROWN_TERRACOTTA);
        this.createTrivialCube(Blocks.GREEN_TERRACOTTA);
        this.createTrivialCube(Blocks.RED_TERRACOTTA);
        this.createTrivialCube(Blocks.BLACK_TERRACOTTA);
        this.createGlassBlocks(Blocks.GLASS, Blocks.GLASS_PANE);
        this.createGlassBlocks(Blocks.WHITE_STAINED_GLASS, Blocks.WHITE_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.ORANGE_STAINED_GLASS, Blocks.ORANGE_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.MAGENTA_STAINED_GLASS, Blocks.MAGENTA_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.LIGHT_BLUE_STAINED_GLASS, Blocks.LIGHT_BLUE_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.YELLOW_STAINED_GLASS, Blocks.YELLOW_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.LIME_STAINED_GLASS, Blocks.LIME_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.PINK_STAINED_GLASS, Blocks.PINK_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.GRAY_STAINED_GLASS, Blocks.GRAY_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.LIGHT_GRAY_STAINED_GLASS, Blocks.LIGHT_GRAY_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.CYAN_STAINED_GLASS, Blocks.CYAN_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.PURPLE_STAINED_GLASS, Blocks.PURPLE_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.BLUE_STAINED_GLASS, Blocks.BLUE_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.BROWN_STAINED_GLASS, Blocks.BROWN_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.GREEN_STAINED_GLASS, Blocks.GREEN_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.RED_STAINED_GLASS, Blocks.RED_STAINED_GLASS_PANE);
        this.createGlassBlocks(Blocks.BLACK_STAINED_GLASS, Blocks.BLACK_STAINED_GLASS_PANE);
        this.createColoredBlockWithStateRotations(TexturedModel.GLAZED_TERRACOTTA, Blocks.WHITE_GLAZED_TERRACOTTA, Blocks.ORANGE_GLAZED_TERRACOTTA, Blocks.MAGENTA_GLAZED_TERRACOTTA, Blocks.LIGHT_BLUE_GLAZED_TERRACOTTA, Blocks.YELLOW_GLAZED_TERRACOTTA, Blocks.LIME_GLAZED_TERRACOTTA, Blocks.PINK_GLAZED_TERRACOTTA, Blocks.GRAY_GLAZED_TERRACOTTA, Blocks.LIGHT_GRAY_GLAZED_TERRACOTTA, Blocks.CYAN_GLAZED_TERRACOTTA, Blocks.PURPLE_GLAZED_TERRACOTTA, Blocks.BLUE_GLAZED_TERRACOTTA, Blocks.BROWN_GLAZED_TERRACOTTA, Blocks.GREEN_GLAZED_TERRACOTTA, Blocks.RED_GLAZED_TERRACOTTA, Blocks.BLACK_GLAZED_TERRACOTTA);
        this.createWoolBlocks(Blocks.WHITE_WOOL, Blocks.WHITE_CARPET);
        this.createWoolBlocks(Blocks.ORANGE_WOOL, Blocks.ORANGE_CARPET);
        this.createWoolBlocks(Blocks.MAGENTA_WOOL, Blocks.MAGENTA_CARPET);
        this.createWoolBlocks(Blocks.LIGHT_BLUE_WOOL, Blocks.LIGHT_BLUE_CARPET);
        this.createWoolBlocks(Blocks.YELLOW_WOOL, Blocks.YELLOW_CARPET);
        this.createWoolBlocks(Blocks.LIME_WOOL, Blocks.LIME_CARPET);
        this.createWoolBlocks(Blocks.PINK_WOOL, Blocks.PINK_CARPET);
        this.createWoolBlocks(Blocks.GRAY_WOOL, Blocks.GRAY_CARPET);
        this.createWoolBlocks(Blocks.LIGHT_GRAY_WOOL, Blocks.LIGHT_GRAY_CARPET);
        this.createWoolBlocks(Blocks.CYAN_WOOL, Blocks.CYAN_CARPET);
        this.createWoolBlocks(Blocks.PURPLE_WOOL, Blocks.PURPLE_CARPET);
        this.createWoolBlocks(Blocks.BLUE_WOOL, Blocks.BLUE_CARPET);
        this.createWoolBlocks(Blocks.BROWN_WOOL, Blocks.BROWN_CARPET);
        this.createWoolBlocks(Blocks.GREEN_WOOL, Blocks.GREEN_CARPET);
        this.createWoolBlocks(Blocks.RED_WOOL, Blocks.RED_CARPET);
        this.createWoolBlocks(Blocks.BLACK_WOOL, Blocks.BLACK_CARPET);
        this.createPlant(Blocks.FERN, Blocks.POTTED_FERN, TintState.TINTED);
        this.createPlant(Blocks.DANDELION, Blocks.POTTED_DANDELION, TintState.NOT_TINTED);
        this.createPlant(Blocks.POPPY, Blocks.POTTED_POPPY, TintState.NOT_TINTED);
        this.createPlant(Blocks.BLUE_ORCHID, Blocks.POTTED_BLUE_ORCHID, TintState.NOT_TINTED);
        this.createPlant(Blocks.ALLIUM, Blocks.POTTED_ALLIUM, TintState.NOT_TINTED);
        this.createPlant(Blocks.AZURE_BLUET, Blocks.POTTED_AZURE_BLUET, TintState.NOT_TINTED);
        this.createPlant(Blocks.RED_TULIP, Blocks.POTTED_RED_TULIP, TintState.NOT_TINTED);
        this.createPlant(Blocks.ORANGE_TULIP, Blocks.POTTED_ORANGE_TULIP, TintState.NOT_TINTED);
        this.createPlant(Blocks.WHITE_TULIP, Blocks.POTTED_WHITE_TULIP, TintState.NOT_TINTED);
        this.createPlant(Blocks.PINK_TULIP, Blocks.POTTED_PINK_TULIP, TintState.NOT_TINTED);
        this.createPlant(Blocks.OXEYE_DAISY, Blocks.POTTED_OXEYE_DAISY, TintState.NOT_TINTED);
        this.createPlant(Blocks.CORNFLOWER, Blocks.POTTED_CORNFLOWER, TintState.NOT_TINTED);
        this.createPlant(Blocks.LILY_OF_THE_VALLEY, Blocks.POTTED_LILY_OF_THE_VALLEY, TintState.NOT_TINTED);
        this.createPlant(Blocks.WITHER_ROSE, Blocks.POTTED_WITHER_ROSE, TintState.NOT_TINTED);
        this.createPlant(Blocks.RED_MUSHROOM, Blocks.POTTED_RED_MUSHROOM, TintState.NOT_TINTED);
        this.createPlant(Blocks.BROWN_MUSHROOM, Blocks.POTTED_BROWN_MUSHROOM, TintState.NOT_TINTED);
        this.createPlant(Blocks.DEAD_BUSH, Blocks.POTTED_DEAD_BUSH, TintState.NOT_TINTED);
        this.createMushroomBlock(Blocks.BROWN_MUSHROOM_BLOCK);
        this.createMushroomBlock(Blocks.RED_MUSHROOM_BLOCK);
        this.createMushroomBlock(Blocks.MUSHROOM_STEM);
        this.createCrossBlockWithDefaultItem(Blocks.GRASS, TintState.TINTED);
        this.createCrossBlock(Blocks.SUGAR_CANE, TintState.TINTED);
        this.createSimpleFlatItemModel(Items.SUGAR_CANE);
        this.createGrowingPlant(Blocks.KELP, Blocks.KELP_PLANT, TintState.TINTED);
        this.createSimpleFlatItemModel(Items.KELP);
        this.skipAutoItemBlock(Blocks.KELP_PLANT);
        this.createGrowingPlant(Blocks.WEEPING_VINES, Blocks.WEEPING_VINES_PLANT, TintState.NOT_TINTED);
        this.createGrowingPlant(Blocks.TWISTING_VINES, Blocks.TWISTING_VINES_PLANT, TintState.NOT_TINTED);
        this.createSimpleFlatItemModel(Blocks.WEEPING_VINES, "_plant");
        this.skipAutoItemBlock(Blocks.WEEPING_VINES_PLANT);
        this.createSimpleFlatItemModel(Blocks.TWISTING_VINES, "_plant");
        this.skipAutoItemBlock(Blocks.TWISTING_VINES_PLANT);
        this.createCrossBlockWithDefaultItem(Blocks.BAMBOO_SAPLING, TintState.TINTED, TextureMapping.cross(TextureMapping.getBlockTexture(Blocks.BAMBOO, "_stage0")));
        this.createBamboo();
        this.createCrossBlockWithDefaultItem(Blocks.COBWEB, TintState.NOT_TINTED);
        this.createDoublePlant(Blocks.LILAC, TintState.NOT_TINTED);
        this.createDoublePlant(Blocks.ROSE_BUSH, TintState.NOT_TINTED);
        this.createDoublePlant(Blocks.PEONY, TintState.NOT_TINTED);
        this.createDoublePlant(Blocks.TALL_GRASS, TintState.TINTED);
        this.createDoublePlant(Blocks.LARGE_FERN, TintState.TINTED);
        this.createSunflower();
        this.createTallSeagrass();
        this.createCoral(Blocks.TUBE_CORAL, Blocks.DEAD_TUBE_CORAL, Blocks.TUBE_CORAL_BLOCK, Blocks.DEAD_TUBE_CORAL_BLOCK, Blocks.TUBE_CORAL_FAN, Blocks.DEAD_TUBE_CORAL_FAN, Blocks.TUBE_CORAL_WALL_FAN, Blocks.DEAD_TUBE_CORAL_WALL_FAN);
        this.createCoral(Blocks.BRAIN_CORAL, Blocks.DEAD_BRAIN_CORAL, Blocks.BRAIN_CORAL_BLOCK, Blocks.DEAD_BRAIN_CORAL_BLOCK, Blocks.BRAIN_CORAL_FAN, Blocks.DEAD_BRAIN_CORAL_FAN, Blocks.BRAIN_CORAL_WALL_FAN, Blocks.DEAD_BRAIN_CORAL_WALL_FAN);
        this.createCoral(Blocks.BUBBLE_CORAL, Blocks.DEAD_BUBBLE_CORAL, Blocks.BUBBLE_CORAL_BLOCK, Blocks.DEAD_BUBBLE_CORAL_BLOCK, Blocks.BUBBLE_CORAL_FAN, Blocks.DEAD_BUBBLE_CORAL_FAN, Blocks.BUBBLE_CORAL_WALL_FAN, Blocks.DEAD_BUBBLE_CORAL_WALL_FAN);
        this.createCoral(Blocks.FIRE_CORAL, Blocks.DEAD_FIRE_CORAL, Blocks.FIRE_CORAL_BLOCK, Blocks.DEAD_FIRE_CORAL_BLOCK, Blocks.FIRE_CORAL_FAN, Blocks.DEAD_FIRE_CORAL_FAN, Blocks.FIRE_CORAL_WALL_FAN, Blocks.DEAD_FIRE_CORAL_WALL_FAN);
        this.createCoral(Blocks.HORN_CORAL, Blocks.DEAD_HORN_CORAL, Blocks.HORN_CORAL_BLOCK, Blocks.DEAD_HORN_CORAL_BLOCK, Blocks.HORN_CORAL_FAN, Blocks.DEAD_HORN_CORAL_FAN, Blocks.HORN_CORAL_WALL_FAN, Blocks.DEAD_HORN_CORAL_WALL_FAN);
        this.createStems(Blocks.MELON_STEM, Blocks.ATTACHED_MELON_STEM);
        this.createStems(Blocks.PUMPKIN_STEM, Blocks.ATTACHED_PUMPKIN_STEM);
        this.family(Blocks.ACACIA_PLANKS).button(Blocks.ACACIA_BUTTON).fence(Blocks.ACACIA_FENCE).fenceGate(Blocks.ACACIA_FENCE_GATE).pressurePlate(Blocks.ACACIA_PRESSURE_PLATE).sign(Blocks.ACACIA_SIGN, Blocks.ACACIA_WALL_SIGN).slab(Blocks.ACACIA_SLAB).stairs(Blocks.ACACIA_STAIRS);
        this.createDoor(Blocks.ACACIA_DOOR);
        this.createOrientableTrapdoor(Blocks.ACACIA_TRAPDOOR);
        this.woodProvider(Blocks.ACACIA_LOG).logWithHorizontal(Blocks.ACACIA_LOG).wood(Blocks.ACACIA_WOOD);
        this.woodProvider(Blocks.STRIPPED_ACACIA_LOG).logWithHorizontal(Blocks.STRIPPED_ACACIA_LOG).wood(Blocks.STRIPPED_ACACIA_WOOD);
        this.createPlant(Blocks.ACACIA_SAPLING, Blocks.POTTED_ACACIA_SAPLING, TintState.NOT_TINTED);
        this.createTrivialBlock(Blocks.ACACIA_LEAVES, TexturedModel.LEAVES);
        this.family(Blocks.BIRCH_PLANKS).button(Blocks.BIRCH_BUTTON).fence(Blocks.BIRCH_FENCE).fenceGate(Blocks.BIRCH_FENCE_GATE).pressurePlate(Blocks.BIRCH_PRESSURE_PLATE).sign(Blocks.BIRCH_SIGN, Blocks.BIRCH_WALL_SIGN).slab(Blocks.BIRCH_SLAB).stairs(Blocks.BIRCH_STAIRS);
        this.createDoor(Blocks.BIRCH_DOOR);
        this.createOrientableTrapdoor(Blocks.BIRCH_TRAPDOOR);
        this.woodProvider(Blocks.BIRCH_LOG).logWithHorizontal(Blocks.BIRCH_LOG).wood(Blocks.BIRCH_WOOD);
        this.woodProvider(Blocks.STRIPPED_BIRCH_LOG).logWithHorizontal(Blocks.STRIPPED_BIRCH_LOG).wood(Blocks.STRIPPED_BIRCH_WOOD);
        this.createPlant(Blocks.BIRCH_SAPLING, Blocks.POTTED_BIRCH_SAPLING, TintState.NOT_TINTED);
        this.createTrivialBlock(Blocks.BIRCH_LEAVES, TexturedModel.LEAVES);
        this.family(Blocks.OAK_PLANKS).button(Blocks.OAK_BUTTON).fence(Blocks.OAK_FENCE).fenceGate(Blocks.OAK_FENCE_GATE).pressurePlate(Blocks.OAK_PRESSURE_PLATE).sign(Blocks.OAK_SIGN, Blocks.OAK_WALL_SIGN).slab(Blocks.OAK_SLAB).slab(Blocks.PETRIFIED_OAK_SLAB).stairs(Blocks.OAK_STAIRS);
        this.createDoor(Blocks.OAK_DOOR);
        this.createTrapdoor(Blocks.OAK_TRAPDOOR);
        this.woodProvider(Blocks.OAK_LOG).logWithHorizontal(Blocks.OAK_LOG).wood(Blocks.OAK_WOOD);
        this.woodProvider(Blocks.STRIPPED_OAK_LOG).logWithHorizontal(Blocks.STRIPPED_OAK_LOG).wood(Blocks.STRIPPED_OAK_WOOD);
        this.createPlant(Blocks.OAK_SAPLING, Blocks.POTTED_OAK_SAPLING, TintState.NOT_TINTED);
        this.createTrivialBlock(Blocks.OAK_LEAVES, TexturedModel.LEAVES);
        this.family(Blocks.SPRUCE_PLANKS).button(Blocks.SPRUCE_BUTTON).fence(Blocks.SPRUCE_FENCE).fenceGate(Blocks.SPRUCE_FENCE_GATE).pressurePlate(Blocks.SPRUCE_PRESSURE_PLATE).sign(Blocks.SPRUCE_SIGN, Blocks.SPRUCE_WALL_SIGN).slab(Blocks.SPRUCE_SLAB).stairs(Blocks.SPRUCE_STAIRS);
        this.createDoor(Blocks.SPRUCE_DOOR);
        this.createOrientableTrapdoor(Blocks.SPRUCE_TRAPDOOR);
        this.woodProvider(Blocks.SPRUCE_LOG).logWithHorizontal(Blocks.SPRUCE_LOG).wood(Blocks.SPRUCE_WOOD);
        this.woodProvider(Blocks.STRIPPED_SPRUCE_LOG).logWithHorizontal(Blocks.STRIPPED_SPRUCE_LOG).wood(Blocks.STRIPPED_SPRUCE_WOOD);
        this.createPlant(Blocks.SPRUCE_SAPLING, Blocks.POTTED_SPRUCE_SAPLING, TintState.NOT_TINTED);
        this.createTrivialBlock(Blocks.SPRUCE_LEAVES, TexturedModel.LEAVES);
        this.family(Blocks.DARK_OAK_PLANKS).button(Blocks.DARK_OAK_BUTTON).fence(Blocks.DARK_OAK_FENCE).fenceGate(Blocks.DARK_OAK_FENCE_GATE).pressurePlate(Blocks.DARK_OAK_PRESSURE_PLATE).sign(Blocks.DARK_OAK_SIGN, Blocks.DARK_OAK_WALL_SIGN).slab(Blocks.DARK_OAK_SLAB).stairs(Blocks.DARK_OAK_STAIRS);
        this.createDoor(Blocks.DARK_OAK_DOOR);
        this.createTrapdoor(Blocks.DARK_OAK_TRAPDOOR);
        this.woodProvider(Blocks.DARK_OAK_LOG).logWithHorizontal(Blocks.DARK_OAK_LOG).wood(Blocks.DARK_OAK_WOOD);
        this.woodProvider(Blocks.STRIPPED_DARK_OAK_LOG).logWithHorizontal(Blocks.STRIPPED_DARK_OAK_LOG).wood(Blocks.STRIPPED_DARK_OAK_WOOD);
        this.createPlant(Blocks.DARK_OAK_SAPLING, Blocks.POTTED_DARK_OAK_SAPLING, TintState.NOT_TINTED);
        this.createTrivialBlock(Blocks.DARK_OAK_LEAVES, TexturedModel.LEAVES);
        this.family(Blocks.JUNGLE_PLANKS).button(Blocks.JUNGLE_BUTTON).fence(Blocks.JUNGLE_FENCE).fenceGate(Blocks.JUNGLE_FENCE_GATE).pressurePlate(Blocks.JUNGLE_PRESSURE_PLATE).sign(Blocks.JUNGLE_SIGN, Blocks.JUNGLE_WALL_SIGN).slab(Blocks.JUNGLE_SLAB).stairs(Blocks.JUNGLE_STAIRS);
        this.createDoor(Blocks.JUNGLE_DOOR);
        this.createOrientableTrapdoor(Blocks.JUNGLE_TRAPDOOR);
        this.woodProvider(Blocks.JUNGLE_LOG).logWithHorizontal(Blocks.JUNGLE_LOG).wood(Blocks.JUNGLE_WOOD);
        this.woodProvider(Blocks.STRIPPED_JUNGLE_LOG).logWithHorizontal(Blocks.STRIPPED_JUNGLE_LOG).wood(Blocks.STRIPPED_JUNGLE_WOOD);
        this.createPlant(Blocks.JUNGLE_SAPLING, Blocks.POTTED_JUNGLE_SAPLING, TintState.NOT_TINTED);
        this.createTrivialBlock(Blocks.JUNGLE_LEAVES, TexturedModel.LEAVES);
        this.family(Blocks.CRIMSON_PLANKS).button(Blocks.CRIMSON_BUTTON).fence(Blocks.CRIMSON_FENCE).fenceGate(Blocks.CRIMSON_FENCE_GATE).pressurePlate(Blocks.CRIMSON_PRESSURE_PLATE).sign(Blocks.CRIMSON_SIGN, Blocks.CRIMSON_WALL_SIGN).slab(Blocks.CRIMSON_SLAB).stairs(Blocks.CRIMSON_STAIRS);
        this.createDoor(Blocks.CRIMSON_DOOR);
        this.createOrientableTrapdoor(Blocks.CRIMSON_TRAPDOOR);
        this.woodProvider(Blocks.CRIMSON_STEM).log(Blocks.CRIMSON_STEM).wood(Blocks.CRIMSON_HYPHAE);
        this.woodProvider(Blocks.STRIPPED_CRIMSON_STEM).log(Blocks.STRIPPED_CRIMSON_STEM).wood(Blocks.STRIPPED_CRIMSON_HYPHAE);
        this.createPlant(Blocks.CRIMSON_FUNGUS, Blocks.POTTED_CRIMSON_FUNGUS, TintState.NOT_TINTED);
        this.createNetherRoots(Blocks.CRIMSON_ROOTS, Blocks.POTTED_CRIMSON_ROOTS);
        this.family(Blocks.WARPED_PLANKS).button(Blocks.WARPED_BUTTON).fence(Blocks.WARPED_FENCE).fenceGate(Blocks.WARPED_FENCE_GATE).pressurePlate(Blocks.WARPED_PRESSURE_PLATE).sign(Blocks.WARPED_SIGN, Blocks.WARPED_WALL_SIGN).slab(Blocks.WARPED_SLAB).stairs(Blocks.WARPED_STAIRS);
        this.createDoor(Blocks.WARPED_DOOR);
        this.createOrientableTrapdoor(Blocks.WARPED_TRAPDOOR);
        this.woodProvider(Blocks.WARPED_STEM).log(Blocks.WARPED_STEM).wood(Blocks.WARPED_HYPHAE);
        this.woodProvider(Blocks.STRIPPED_WARPED_STEM).log(Blocks.STRIPPED_WARPED_STEM).wood(Blocks.STRIPPED_WARPED_HYPHAE);
        this.createPlant(Blocks.WARPED_FUNGUS, Blocks.POTTED_WARPED_FUNGUS, TintState.NOT_TINTED);
        this.createNetherRoots(Blocks.WARPED_ROOTS, Blocks.POTTED_WARPED_ROOTS);
        this.createCrossBlock(Blocks.NETHER_SPROUTS, TintState.NOT_TINTED);
        this.createSimpleFlatItemModel(Items.NETHER_SPROUTS);
        final ResourceLocation uh3;
        final ResourceLocation uh4;
        this.family(TextureMapping.cube(Blocks.STONE)).fullBlock(iy -> {
            uh3 = ModelTemplates.CUBE_ALL.create(Blocks.STONE, iy, this.modelOutput);
            uh4 = ModelTemplates.CUBE_MIRRORED_ALL.create(Blocks.STONE, iy, this.modelOutput);
            this.blockStateOutput.accept(createRotatedVariant(Blocks.STONE, uh3, uh4));
            return uh3;
        }).slab(Blocks.STONE_SLAB).pressurePlate(Blocks.STONE_PRESSURE_PLATE).button(Blocks.STONE_BUTTON).stairs(Blocks.STONE_STAIRS);
        this.createDoor(Blocks.IRON_DOOR);
        this.createTrapdoor(Blocks.IRON_TRAPDOOR);
        this.family(Blocks.STONE_BRICKS).wall(Blocks.STONE_BRICK_WALL).stairs(Blocks.STONE_BRICK_STAIRS).slab(Blocks.STONE_BRICK_SLAB);
        this.family(Blocks.MOSSY_STONE_BRICKS).wall(Blocks.MOSSY_STONE_BRICK_WALL).stairs(Blocks.MOSSY_STONE_BRICK_STAIRS).slab(Blocks.MOSSY_STONE_BRICK_SLAB);
        this.family(Blocks.COBBLESTONE).wall(Blocks.COBBLESTONE_WALL).stairs(Blocks.COBBLESTONE_STAIRS).slab(Blocks.COBBLESTONE_SLAB);
        this.family(Blocks.MOSSY_COBBLESTONE).wall(Blocks.MOSSY_COBBLESTONE_WALL).stairs(Blocks.MOSSY_COBBLESTONE_STAIRS).slab(Blocks.MOSSY_COBBLESTONE_SLAB);
        this.family(Blocks.PRISMARINE).wall(Blocks.PRISMARINE_WALL).stairs(Blocks.PRISMARINE_STAIRS).slab(Blocks.PRISMARINE_SLAB);
        this.family(Blocks.PRISMARINE_BRICKS).stairs(Blocks.PRISMARINE_BRICK_STAIRS).slab(Blocks.PRISMARINE_BRICK_SLAB);
        this.family(Blocks.DARK_PRISMARINE).stairs(Blocks.DARK_PRISMARINE_STAIRS).slab(Blocks.DARK_PRISMARINE_SLAB);
        this.family(Blocks.SANDSTONE, TexturedModel.TOP_BOTTOM_WITH_WALL).wall(Blocks.SANDSTONE_WALL).stairs(Blocks.SANDSTONE_STAIRS).slab(Blocks.SANDSTONE_SLAB);
        this.family(Blocks.SMOOTH_SANDSTONE, TexturedModel.createAllSame(TextureMapping.getBlockTexture(Blocks.SANDSTONE, "_top"))).slab(Blocks.SMOOTH_SANDSTONE_SLAB).stairs(Blocks.SMOOTH_SANDSTONE_STAIRS);
        this.family(Blocks.CUT_SANDSTONE, TexturedModel.COLUMN.get(Blocks.SANDSTONE).updateTextures(iy -> iy.put(TextureSlot.SIDE, TextureMapping.getBlockTexture(Blocks.CUT_SANDSTONE)))).slab(Blocks.CUT_SANDSTONE_SLAB);
        this.family(Blocks.RED_SANDSTONE, TexturedModel.TOP_BOTTOM_WITH_WALL).wall(Blocks.RED_SANDSTONE_WALL).stairs(Blocks.RED_SANDSTONE_STAIRS).slab(Blocks.RED_SANDSTONE_SLAB);
        this.family(Blocks.SMOOTH_RED_SANDSTONE, TexturedModel.createAllSame(TextureMapping.getBlockTexture(Blocks.RED_SANDSTONE, "_top"))).slab(Blocks.SMOOTH_RED_SANDSTONE_SLAB).stairs(Blocks.SMOOTH_RED_SANDSTONE_STAIRS);
        this.family(Blocks.CUT_RED_SANDSTONE, TexturedModel.COLUMN.get(Blocks.RED_SANDSTONE).updateTextures(iy -> iy.put(TextureSlot.SIDE, TextureMapping.getBlockTexture(Blocks.CUT_RED_SANDSTONE)))).slab(Blocks.CUT_RED_SANDSTONE_SLAB);
        this.family(Blocks.BRICKS).wall(Blocks.BRICK_WALL).stairs(Blocks.BRICK_STAIRS).slab(Blocks.BRICK_SLAB);
        this.family(Blocks.NETHER_BRICKS).fence(Blocks.NETHER_BRICK_FENCE).wall(Blocks.NETHER_BRICK_WALL).stairs(Blocks.NETHER_BRICK_STAIRS).slab(Blocks.NETHER_BRICK_SLAB);
        this.family(Blocks.PURPUR_BLOCK).stairs(Blocks.PURPUR_STAIRS).slab(Blocks.PURPUR_SLAB);
        this.family(Blocks.DIORITE).wall(Blocks.DIORITE_WALL).stairs(Blocks.DIORITE_STAIRS).slab(Blocks.DIORITE_SLAB);
        this.family(Blocks.POLISHED_DIORITE).stairs(Blocks.POLISHED_DIORITE_STAIRS).slab(Blocks.POLISHED_DIORITE_SLAB);
        this.family(Blocks.GRANITE).wall(Blocks.GRANITE_WALL).stairs(Blocks.GRANITE_STAIRS).slab(Blocks.GRANITE_SLAB);
        this.family(Blocks.POLISHED_GRANITE).stairs(Blocks.POLISHED_GRANITE_STAIRS).slab(Blocks.POLISHED_GRANITE_SLAB);
        this.family(Blocks.ANDESITE).wall(Blocks.ANDESITE_WALL).stairs(Blocks.ANDESITE_STAIRS).slab(Blocks.ANDESITE_SLAB);
        this.family(Blocks.POLISHED_ANDESITE).stairs(Blocks.POLISHED_ANDESITE_STAIRS).slab(Blocks.POLISHED_ANDESITE_SLAB);
        this.family(Blocks.END_STONE_BRICKS).wall(Blocks.END_STONE_BRICK_WALL).stairs(Blocks.END_STONE_BRICK_STAIRS).slab(Blocks.END_STONE_BRICK_SLAB);
        this.family(Blocks.QUARTZ_BLOCK, TexturedModel.COLUMN).stairs(Blocks.QUARTZ_STAIRS).slab(Blocks.QUARTZ_SLAB);
        this.family(Blocks.SMOOTH_QUARTZ, TexturedModel.createAllSame(TextureMapping.getBlockTexture(Blocks.QUARTZ_BLOCK, "_bottom"))).stairs(Blocks.SMOOTH_QUARTZ_STAIRS).slab(Blocks.SMOOTH_QUARTZ_SLAB);
        this.family(Blocks.RED_NETHER_BRICKS).slab(Blocks.RED_NETHER_BRICK_SLAB).stairs(Blocks.RED_NETHER_BRICK_STAIRS).wall(Blocks.RED_NETHER_BRICK_WALL);
        this.family(Blocks.BLACKSTONE, TexturedModel.COLUMN_WITH_WALL).wall(Blocks.BLACKSTONE_WALL).stairs(Blocks.BLACKSTONE_STAIRS).slab(Blocks.BLACKSTONE_SLAB);
        this.family(Blocks.POLISHED_BLACKSTONE_BRICKS).wall(Blocks.POLISHED_BLACKSTONE_BRICK_WALL).stairs(Blocks.POLISHED_BLACKSTONE_BRICK_STAIRS).slab(Blocks.POLISHED_BLACKSTONE_BRICK_SLAB);
        this.family(Blocks.POLISHED_BLACKSTONE).wall(Blocks.POLISHED_BLACKSTONE_WALL).pressurePlate(Blocks.POLISHED_BLACKSTONE_PRESSURE_PLATE).button(Blocks.POLISHED_BLACKSTONE_BUTTON).stairs(Blocks.POLISHED_BLACKSTONE_STAIRS).slab(Blocks.POLISHED_BLACKSTONE_SLAB);
        this.createSmoothStoneSlab();
        this.createPassiveRail(Blocks.RAIL);
        this.createActiveRail(Blocks.POWERED_RAIL);
        this.createActiveRail(Blocks.DETECTOR_RAIL);
        this.createActiveRail(Blocks.ACTIVATOR_RAIL);
        this.createComparator();
        this.createCommandBlock(Blocks.COMMAND_BLOCK);
        this.createCommandBlock(Blocks.REPEATING_COMMAND_BLOCK);
        this.createCommandBlock(Blocks.CHAIN_COMMAND_BLOCK);
        this.createAnvil(Blocks.ANVIL);
        this.createAnvil(Blocks.CHIPPED_ANVIL);
        this.createAnvil(Blocks.DAMAGED_ANVIL);
        this.createBarrel();
        this.createBell();
        this.createFurnace(Blocks.FURNACE, TexturedModel.ORIENTABLE_ONLY_TOP);
        this.createFurnace(Blocks.BLAST_FURNACE, TexturedModel.ORIENTABLE_ONLY_TOP);
        this.createFurnace(Blocks.SMOKER, TexturedModel.ORIENTABLE);
        this.createRedstoneWire();
        this.createRespawnAnchor();
        this.copyModel(Blocks.CHISELED_STONE_BRICKS, Blocks.INFESTED_CHISELED_STONE_BRICKS);
        this.copyModel(Blocks.COBBLESTONE, Blocks.INFESTED_COBBLESTONE);
        this.copyModel(Blocks.CRACKED_STONE_BRICKS, Blocks.INFESTED_CRACKED_STONE_BRICKS);
        this.copyModel(Blocks.MOSSY_STONE_BRICKS, Blocks.INFESTED_MOSSY_STONE_BRICKS);
        this.createInfestedStone();
        this.copyModel(Blocks.STONE_BRICKS, Blocks.INFESTED_STONE_BRICKS);
        SpawnEggItem.eggs().forEach(blh -> this.delegateItemModel(blh, ModelLocationUtils.decorateItemModelLocation("template_spawn_egg")));
    }
    
    class BlockFamilyProvider {
        private final TextureMapping mapping;
        @Nullable
        private ResourceLocation fullBlock;
        
        public BlockFamilyProvider(final TextureMapping iy) {
            this.mapping = iy;
        }
        
        public BlockFamilyProvider fullBlock(final Block bvr, final ModelTemplate iw) {
            this.fullBlock = iw.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createSimpleBlock(bvr, this.fullBlock));
            return this;
        }
        
        public BlockFamilyProvider fullBlock(final Function<TextureMapping, ResourceLocation> function) {
            this.fullBlock = function.apply(this.mapping);
            return this;
        }
        
        public BlockFamilyProvider button(final Block bvr) {
            final ResourceLocation uh3 = ModelTemplates.BUTTON.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh4 = ModelTemplates.BUTTON_PRESSED.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createButton(bvr, uh3, uh4));
            final ResourceLocation uh5 = ModelTemplates.BUTTON_INVENTORY.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.delegateItemModel(bvr, uh5);
            return this;
        }
        
        public BlockFamilyProvider wall(final Block bvr) {
            final ResourceLocation uh3 = ModelTemplates.WALL_POST.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh4 = ModelTemplates.WALL_LOW_SIDE.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh5 = ModelTemplates.WALL_TALL_SIDE.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createWall(bvr, uh3, uh4, uh5));
            final ResourceLocation uh6 = ModelTemplates.WALL_INVENTORY.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.delegateItemModel(bvr, uh6);
            return this;
        }
        
        public BlockFamilyProvider fence(final Block bvr) {
            final ResourceLocation uh3 = ModelTemplates.FENCE_POST.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh4 = ModelTemplates.FENCE_SIDE.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createFence(bvr, uh3, uh4));
            final ResourceLocation uh5 = ModelTemplates.FENCE_INVENTORY.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.delegateItemModel(bvr, uh5);
            return this;
        }
        
        public BlockFamilyProvider fenceGate(final Block bvr) {
            final ResourceLocation uh3 = ModelTemplates.FENCE_GATE_OPEN.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh4 = ModelTemplates.FENCE_GATE_CLOSED.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh5 = ModelTemplates.FENCE_GATE_WALL_OPEN.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh6 = ModelTemplates.FENCE_GATE_WALL_CLOSED.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createFenceGate(bvr, uh3, uh4, uh5, uh6));
            return this;
        }
        
        public BlockFamilyProvider pressurePlate(final Block bvr) {
            final ResourceLocation uh3 = ModelTemplates.PRESSURE_PLATE_UP.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh4 = ModelTemplates.PRESSURE_PLATE_DOWN.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createPressurePlate(bvr, uh3, uh4));
            return this;
        }
        
        public BlockFamilyProvider sign(final Block bvr1, final Block bvr2) {
            final ResourceLocation uh4 = ModelTemplates.PARTICLE_ONLY.create(bvr1, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createSimpleBlock(bvr1, uh4));
            BlockModelGenerators.this.blockStateOutput.accept(createSimpleBlock(bvr2, uh4));
            BlockModelGenerators.this.createSimpleFlatItemModel(bvr1.asItem());
            BlockModelGenerators.this.skipAutoItemBlock(bvr2);
            return this;
        }
        
        public BlockFamilyProvider slab(final Block bvr) {
            if (this.fullBlock == null) {
                throw new IllegalStateException("Full block not generated yet");
            }
            final ResourceLocation uh3 = ModelTemplates.SLAB_BOTTOM.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh4 = ModelTemplates.SLAB_TOP.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createSlab(bvr, uh3, uh4, this.fullBlock));
            return this;
        }
        
        public BlockFamilyProvider stairs(final Block bvr) {
            final ResourceLocation uh3 = ModelTemplates.STAIRS_INNER.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh4 = ModelTemplates.STAIRS_STRAIGHT.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh5 = ModelTemplates.STAIRS_OUTER.create(bvr, this.mapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createStairs(bvr, uh3, uh4, uh5));
            return this;
        }
    }
    
    class WoodProvider {
        private final TextureMapping logMapping;
        
        public WoodProvider(final TextureMapping iy) {
            this.logMapping = iy;
        }
        
        public WoodProvider wood(final Block bvr) {
            final TextureMapping iy3 = this.logMapping.copyAndUpdate(TextureSlot.END, this.logMapping.get(TextureSlot.SIDE));
            final ResourceLocation uh4 = ModelTemplates.CUBE_COLUMN.create(bvr, iy3, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createAxisAlignedPillarBlock(bvr, uh4));
            return this;
        }
        
        public WoodProvider log(final Block bvr) {
            final ResourceLocation uh3 = ModelTemplates.CUBE_COLUMN.create(bvr, this.logMapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createAxisAlignedPillarBlock(bvr, uh3));
            return this;
        }
        
        public WoodProvider logWithHorizontal(final Block bvr) {
            final ResourceLocation uh3 = ModelTemplates.CUBE_COLUMN.create(bvr, this.logMapping, BlockModelGenerators.this.modelOutput);
            final ResourceLocation uh4 = ModelTemplates.CUBE_COLUMN_HORIZONTAL.create(bvr, this.logMapping, BlockModelGenerators.this.modelOutput);
            BlockModelGenerators.this.blockStateOutput.accept(createRotatedPillarWithHorizontalVariant(bvr, uh3, uh4));
            return this;
        }
    }
    
    enum TintState {
        TINTED, 
        NOT_TINTED;
        
        public ModelTemplate getCross() {
            return (this == TintState.TINTED) ? ModelTemplates.TINTED_CROSS : ModelTemplates.CROSS;
        }
        
        public ModelTemplate getCrossPot() {
            return (this == TintState.TINTED) ? ModelTemplates.TINTED_FLOWER_POT_CROSS : ModelTemplates.FLOWER_POT_CROSS;
        }
    }
    
    class BlockEntityModelGenerator {
        private final ResourceLocation baseModel;
        
        public BlockEntityModelGenerator(final ResourceLocation uh, final Block bvr) {
            this.baseModel = ModelTemplates.PARTICLE_ONLY.create(uh, TextureMapping.particle(bvr), BlockModelGenerators.this.modelOutput);
        }
        
        public BlockEntityModelGenerator create(final Block... arr) {
            for (final Block bvr6 : arr) {
                BlockModelGenerators.this.blockStateOutput.accept(createSimpleBlock(bvr6, this.baseModel));
            }
            return this;
        }
        
        public BlockEntityModelGenerator createWithoutBlockItem(final Block... arr) {
            for (final Block bvr6 : arr) {
                BlockModelGenerators.this.skipAutoItemBlock(bvr6);
            }
            return this.create(arr);
        }
        
        public BlockEntityModelGenerator createWithCustomBlockItemModel(final ModelTemplate iw, final Block... arr) {
            for (final Block bvr7 : arr) {
                iw.create(ModelLocationUtils.getModelLocation(bvr7.asItem()), TextureMapping.particle(bvr7), BlockModelGenerators.this.modelOutput);
            }
            return this.create(arr);
        }
    }
}
