// Path: src/api/java/com/github/atomicblom/shearmadness/api/IVariationRegistry.java
// @SideOnly(Side.CLIENT)
// public interface IVariationRegistry
// {
//     /**
//      * Registers a Model Maker that will be used when the function predicate matches
//      * @param handlesVariant a function that should return true if your IModelMaker applies to the itemStack
//      * @param variationModelMaker the model maker that will make the model for the quadruped.
//      */
//     void registerVariation(Function<ItemStack, Boolean> handlesVariant, IModelMaker variationModelMaker);
// 
//     /**
//      * Registers a Model Maker that will be used when the function predicate matches using the default model maker
//      * with custom transformations.
//      * @param handlesVariant a function that should return true if your IModelMaker applies to the itemStack
//      * @param transformDefinition the transforms for the model
//      */
//     void registerVariation(Function<ItemStack, Boolean> handlesVariant, QuadrupedTransformDefinition transformDefinition);
// }
// 
// Path: src/api/java/com/github/atomicblom/shearmadness/api/events/RegisterShearMadnessVariationEvent.java
// @SideOnly(Side.CLIENT)
// public class RegisterShearMadnessVariationEvent extends Event
// {
//     private final IVariationRegistry registry;
// 
//     public RegisterShearMadnessVariationEvent(IVariationRegistry registry) {
// 
//         this.registry = registry;
//     }
// 
//     /**
//      * @return A registry to declare variation against.
//      */
//     public IVariationRegistry getRegistry()
//     {
//         return registry;
//     }
// }
// 
// Path: src/integration/java/com/github/atomicblom/shearmadness/variations/chisel/visuals/DefaultChiselModelMaker.java
// public class DefaultChiselModelMaker implements IModelMaker
// {
//     private final QuadrupedTransformDefinition transforms;
// 
//     public DefaultChiselModelMaker() {
//         transforms = new QuadrupedTransformDefinition();
//     }
// 
//     @Override
//     public ModelQuadruped createModel(ItemStack itemStack, EntityLivingBase entity)
//     {
//         transforms.defineParts();
//         final ICarvingVariation variation = CarvingUtils.getChiselRegistry().getVariation(itemStack);
// 
//         final BlockPos position = entity.getPosition();
//         final World world = entity.getEntityWorld();
// 
//         final ModelQuadruped quadrupedModel = new ModelSheep1();
//         transforms.getBodyPartDefinition().ifPresent(definition -> quadrupedModel.body = getChiselBodyModelRenderer(variation, definition, world, position));
//         transforms.getHeadPartDefinition().ifPresent(definition -> quadrupedModel.head = getChiselBodyModelRenderer(variation, definition, world, position));
//         transforms.getLeg1PartDefinition().ifPresent(definition -> quadrupedModel.leg1 = getChiselBodyModelRenderer(variation, definition, world, position));
//         transforms.getLeg2PartDefinition().ifPresent(definition -> quadrupedModel.leg2 = getChiselBodyModelRenderer(variation, definition, world, position));
//         transforms.getLeg3PartDefinition().ifPresent(definition -> quadrupedModel.leg3 = getChiselBodyModelRenderer(variation, definition, world, position));
//         transforms.getLeg4PartDefinition().ifPresent(definition -> quadrupedModel.leg4 = getChiselBodyModelRenderer(variation, definition, world, position));
//         return quadrupedModel;
//     }
// 
//     private ModelRenderer getChiselBodyModelRenderer(ICarvingVariation variation, PartDefinition partDefinition, World world, BlockPos position)
//     {
//         final IBlockState blockState = variation.getBlockState();
//         final BlockRendererDispatcher blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
//         ChiselExtendedState chiselState = new ChiselExtendedState(blockState, world, position);
//         final IBakedModel model = blockRenderer.getModelForState(blockState);
// 
// 
//         return getModelRendererForBlockState(partDefinition, chiselState, model);
//     }
// }


import com.github.atomicblom.shearmadness.api.IVariationRegistry;
import com.github.atomicblom.shearmadness.api.events.RegisterShearMadnessVariationEvent;
import com.github.atomicblom.shearmadness.variations.chisel.visuals.DefaultChiselModelMaker;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Optional;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import team.chisel.api.carving.CarvingUtils;
package com.github.atomicblom.shearmadness.variations.chisel;


@SuppressWarnings({"MethodMayBeStatic", "AnonymousInnerClass"})
@Mod.EventBusSubscriber(Side.CLIENT)
public class ChiselVariations
{
    @SubscribeEvent(priority = EventPriority.LOWEST)
    @Optional.Method(modid = "shearmadness")
    @SideOnly(Side.CLIENT)
    public static void onShearMadnessRegisterVariations(RegisterShearMadnessVariationEvent event) {
// Path: src/api/java/com/github/atomicblom/shearmadness/api/IVariationRegistry.java
// @SideOnly(Side.CLIENT)
// public interface IVariationRegistry
// {
//     /**
//      * Registers a Model Maker that will be used when the function predicate matches
//      * @param handlesVariant a function that should return true if your IModelMaker applies to the itemStack
//      * @param variationModelMaker the model maker that will make the model for the quadruped.
//      */
//     void registerVariation(Function<ItemStack, Boolean> handlesVariant, IModelMaker variationModelMaker);
// 
//     /**
//      * Registers a Model Maker that will be used when the function predicate matches using the default model maker
//      * with custom transformations.
//      * @param handlesVariant a function that should return true if your IModelMaker applies to the itemStack
//      * @param transformDefinition the transforms for the model
//      */
//     void registerVariation(Function<ItemStack, Boolean> handlesVariant, QuadrupedTransformDefinition transformDefinition);
// }
// 
// Path: src/api/java/com/github/atomicblom/shearmadness/api/events/RegisterShearMadnessVariationEvent.java
// @SideOnly(Side.CLIENT)
// public class RegisterShearMadnessVariationEvent extends Event
// {
//     private final IVariationRegistry registry;
// 
//     public RegisterShearMadnessVariationEvent(IVariationRegistry registry) {
// 
//         this.registry = registry;
//     }
// 
//     /**
//      * @return A registry to declare variation against.
//      */
//     public IVariationRegistry getRegistry()
//     {
//         return registry;
//     }
// }
// 
// Path: src/integration/java/com/github/atomicblom/shearmadness/variations/chisel/visuals/DefaultChiselModelMaker.java
// public class DefaultChiselModelMaker implements IModelMaker
// {
//     private final QuadrupedTransformDefinition transforms;
// 
//     public DefaultChiselModelMaker() {
//         transforms = new QuadrupedTransformDefinition();
//     }
// 
//     @Override
//     public ModelQuadruped createModel(ItemStack itemStack, EntityLivingBase entity)
//     {
//         transforms.defineParts();
//         final ICarvingVariation variation = CarvingUtils.getChiselRegistry().getVariation(itemStack);
// 
//         final BlockPos position = entity.getPosition();
//         final World world = entity.getEntityWorld();
// 
//         final ModelQuadruped quadrupedModel = new ModelSheep1();
//         transforms.getBodyPartDefinition().ifPresent(definition -> quadrupedModel.body = getChiselBodyModelRenderer(variation, definition, world, position));
//         transforms.getHeadPartDefinition().ifPresent(definition -> quadrupedModel.head = getChiselBodyModelRenderer(variation, definition, world, position));
//         transforms.getLeg1PartDefinition().ifPresent(definition -> quadrupedModel.leg1 = getChiselBodyModelRenderer(variation, definition, world, position));
//         transforms.getLeg2PartDefinition().ifPresent(definition -> quadrupedModel.leg2 = getChiselBodyModelRenderer(variation, definition, world, position));
//         transforms.getLeg3PartDefinition().ifPresent(definition -> quadrupedModel.leg3 = getChiselBodyModelRenderer(variation, definition, world, position));
//         transforms.getLeg4PartDefinition().ifPresent(definition -> quadrupedModel.leg4 = getChiselBodyModelRenderer(variation, definition, world, position));
//         return quadrupedModel;
//     }
// 
//     private ModelRenderer getChiselBodyModelRenderer(ICarvingVariation variation, PartDefinition partDefinition, World world, BlockPos position)
//     {
//         final IBlockState blockState = variation.getBlockState();
//         final BlockRendererDispatcher blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
//         ChiselExtendedState chiselState = new ChiselExtendedState(blockState, world, position);
//         final IBakedModel model = blockRenderer.getModelForState(blockState);
// 
// 
//         return getModelRendererForBlockState(partDefinition, chiselState, model);
//     }
// }


// Path: src/integration/java/com/github/atomicblom/shearmadness/variations/chisel/ChiselVariations.java
import com.github.atomicblom.shearmadness.api.IVariationRegistry;
import com.github.atomicblom.shearmadness.api.events.RegisterShearMadnessVariationEvent;
import com.github.atomicblom.shearmadness.variations.chisel.visuals.DefaultChiselModelMaker;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Optional;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import team.chisel.api.carving.CarvingUtils;

package com.github.atomicblom.shearmadness.variations.chisel;


@SuppressWarnings({"MethodMayBeStatic", "AnonymousInnerClass"})
@Mod.EventBusSubscriber(Side.CLIENT)
public class ChiselVariations
{
    @SubscribeEvent(priority = EventPriority.LOWEST)
    @Optional.Method(modid = "shearmadness")
    @SideOnly(Side.CLIENT)
    public static void onShearMadnessRegisterVariations(RegisterShearMadnessVariationEvent event) {
        final IVariationRegistry registry = event.getRegistry();