package choonster.testmod3.init; import choonster.testmod3.dispensebehavior.BehaviorDispenseDelegate; import net.minecraft.block.BlockColored; import net.minecraft.block.BlockDispenser; import net.minecraft.block.state.IBlockState; import net.minecraft.dispenser.IBehaviorDispenseItem; import net.minecraft.dispenser.IBlockSource; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraft.util.registry.RegistryDefaulted; import net.minecraft.world.World; /** * Registers this mod's {@link IBehaviorDispenseItem}s. * * @author Choonster */ public class ModDispenseBehaviors { private static final RegistryDefaulted<Item, IBehaviorDispenseItem> REGISTRY = BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY; /** * Register this mod's {@link IBehaviorDispenseItem}s. */ public static void registerDispenseBehaviors() { // Replace the dye behavior with one that causes Ink Sacs to place Black Wool and all other dyes to run the vanilla behavior. // http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/modification-development/2789286-override-dispenser-dispense-only-for-a-certain register(Items.DYE, new BehaviorDispenseDelegate(REGISTRY.getObject(Items.DYE)) { @Override protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) { doSoundsParticles = true; successful = true; if (EnumDyeColor.byDyeDamage(stack.getMetadata()) == EnumDyeColor.BLACK) { final EnumFacing facing = source.getBlockState().getValue(BlockDispenser.FACING); final BlockPos neighbourPos = source.getBlockPos().offset(facing); final World world = source.getWorld(); final IBlockState neighbourState = world.getBlockState(neighbourPos); successful = neighbourState.getBlock().isAir(neighbourState, world, neighbourPos) && world.setBlockState(neighbourPos, Blocks.WOOL.getDefaultState().withProperty(BlockColored.COLOR, EnumDyeColor.BLACK)); if (successful) { stack.shrink(1); } return stack; } return callDelegate(source, stack); } }); } private static void register(Item item, IBehaviorDispenseItem behaviorDispenseItem) { REGISTRY.putObject(item, behaviorDispenseItem); } }