// Path: src/api/java/com/github/atomicblom/shearmadness/api/Capability.java
// public final class Capability {
//     @CapabilityInject(IChiseledSheepCapability.class)
//     public static final net.minecraftforge.common.capabilities.Capability<IChiseledSheepCapability> CHISELED_SHEEP;
// 
//     static {
//         CHISELED_SHEEP = null;
//     }
// }
// 
// Path: src/api/java/com/github/atomicblom/shearmadness/api/behaviour/BehaviourBase.java
// @SuppressWarnings({"NoopMethodInAbstractClass", "ClassHasNoToStringMethod", "WeakerAccess"})
// public abstract class BehaviourBase<T extends BehaviourBase> {
//     private final EntitySheep entity;
//     private final Supplier<Boolean> configuration;
// 
//     protected BehaviourBase(EntitySheep sheep) {
//         this(sheep, () -> true);
//     }
// 
//     protected BehaviourBase(EntitySheep entity, Supplier<Boolean> configuration)
//     {
//         this.entity = entity;
//         this.configuration = configuration;
//     }
// 
//     public boolean isBehaviourEnabled() {
//         return configuration.get();
//     }
// 
//     public void onSheepMovedBlock(BlockPos previousLocation, BlockPos newLocation) {}
// 
//     public void onBehaviourStarted(BlockPos currentPos) {}
// 
//     public void onBehaviourStopped(BlockPos previousPos) {}
// 
//     public void updateTask() {}
// 
//     public boolean isEquivalentTo(T other) {
//         return entity.getUniqueID().equals(other.getEntity().getUniqueID());
//     }
// 
//     public EntitySheep getEntity()
//     {
//         return entity;
//     }
// }
// 
// Path: src/api/java/com/github/atomicblom/shearmadness/api/capability/IChiseledSheepCapability.java
// public interface IChiseledSheepCapability
// {
//     boolean isChiseled();
// 
//     void unChisel();
// 
//     void chisel(ItemStack itemStack);
// 
//     ItemStack getChiselItemStack();
// 
//     int getItemIdentifier();
// 
//     NBTTagCompound getExtraData();
// }


import com.github.atomicblom.shearmadness.api.Capability;
import com.github.atomicblom.shearmadness.api.behaviour.BehaviourBase;
import com.github.atomicblom.shearmadness.api.capability.IChiseledSheepCapability;
import net.minecraft.block.BlockNote;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.passive.EntitySheep;
import net.minecraft.init.Blocks;
import net.minecraft.init.SoundEvents;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.world.NoteBlockEvent;
import java.util.function.Supplier;
package com.github.atomicblom.shearmadness.variations.vanilla.behaviour;



public class NoteBlockBehaviour extends BehaviourBase<NoteBlockBehaviour> {

    private final World world;
    private final IChiseledSheepCapability capability;
    private boolean isTriggered = false;
    private BlockPos currentLocation = null;

    public NoteBlockBehaviour(EntitySheep entity, Supplier<Boolean> configuration) {
        super(entity, configuration);
        world = entity.getEntityWorld();
        capability = entity.getCapability(Capability.CHISELED_SHEEP, null);
    }


    @Override
    public void onBehaviourStarted(BlockPos currentPos) {
        currentLocation = currentPos;
    }

    @Override
    public void onSheepMovedBlock(BlockPos previousLocation, BlockPos newLocation) {
// Path: src/api/java/com/github/atomicblom/shearmadness/api/Capability.java
// public final class Capability {
//     @CapabilityInject(IChiseledSheepCapability.class)
//     public static final net.minecraftforge.common.capabilities.Capability<IChiseledSheepCapability> CHISELED_SHEEP;
// 
//     static {
//         CHISELED_SHEEP = null;
//     }
// }
// 
// Path: src/api/java/com/github/atomicblom/shearmadness/api/behaviour/BehaviourBase.java
// @SuppressWarnings({"NoopMethodInAbstractClass", "ClassHasNoToStringMethod", "WeakerAccess"})
// public abstract class BehaviourBase<T extends BehaviourBase> {
//     private final EntitySheep entity;
//     private final Supplier<Boolean> configuration;
// 
//     protected BehaviourBase(EntitySheep sheep) {
//         this(sheep, () -> true);
//     }
// 
//     protected BehaviourBase(EntitySheep entity, Supplier<Boolean> configuration)
//     {
//         this.entity = entity;
//         this.configuration = configuration;
//     }
// 
//     public boolean isBehaviourEnabled() {
//         return configuration.get();
//     }
// 
//     public void onSheepMovedBlock(BlockPos previousLocation, BlockPos newLocation) {}
// 
//     public void onBehaviourStarted(BlockPos currentPos) {}
// 
//     public void onBehaviourStopped(BlockPos previousPos) {}
// 
//     public void updateTask() {}
// 
//     public boolean isEquivalentTo(T other) {
//         return entity.getUniqueID().equals(other.getEntity().getUniqueID());
//     }
// 
//     public EntitySheep getEntity()
//     {
//         return entity;
//     }
// }
// 
// Path: src/api/java/com/github/atomicblom/shearmadness/api/capability/IChiseledSheepCapability.java
// public interface IChiseledSheepCapability
// {
//     boolean isChiseled();
// 
//     void unChisel();
// 
//     void chisel(ItemStack itemStack);
// 
//     ItemStack getChiselItemStack();
// 
//     int getItemIdentifier();
// 
//     NBTTagCompound getExtraData();
// }


// Path: src/integration/java/com/github/atomicblom/shearmadness/variations/vanilla/behaviour/NoteBlockBehaviour.java
import com.github.atomicblom.shearmadness.api.Capability;
import com.github.atomicblom.shearmadness.api.behaviour.BehaviourBase;
import com.github.atomicblom.shearmadness.api.capability.IChiseledSheepCapability;
import net.minecraft.block.BlockNote;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.passive.EntitySheep;
import net.minecraft.init.Blocks;
import net.minecraft.init.SoundEvents;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.world.NoteBlockEvent;
import java.util.function.Supplier;

package com.github.atomicblom.shearmadness.variations.vanilla.behaviour;



public class NoteBlockBehaviour extends BehaviourBase<NoteBlockBehaviour> {

    private final World world;
    private final IChiseledSheepCapability capability;
    private boolean isTriggered = false;
    private BlockPos currentLocation = null;

    public NoteBlockBehaviour(EntitySheep entity, Supplier<Boolean> configuration) {
        super(entity, configuration);
        world = entity.getEntityWorld();
        capability = entity.getCapability(Capability.CHISELED_SHEEP, null);
    }


    @Override
    public void onBehaviourStarted(BlockPos currentPos) {
        currentLocation = currentPos;
    }

    @Override
    public void onSheepMovedBlock(BlockPos previousLocation, BlockPos newLocation) {
        isTriggered = false;