package com.thebrokenrail.slightlyvanilla.dispenser; import com.thebrokenrail.slightlyvanilla.SlightlyVanilla; import com.thebrokenrail.slightlyvanilla.entity.SpawnEggEntity; import net.minecraft.block.DispenserBlock; import net.minecraft.block.dispenser.DispenserBehavior; import net.minecraft.block.dispenser.ItemDispenserBehavior; import net.minecraft.block.dispenser.ProjectileDispenserBehavior; import net.minecraft.entity.EntityType; import net.minecraft.entity.SpawnType; import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.item.ItemStack; import net.minecraft.item.SpawnEggItem; import net.minecraft.util.math.BlockPointer; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Position; import net.minecraft.world.World; public class SpawnEggDispenserBehavior implements DispenserBehavior { private static class Default extends ItemDispenserBehavior { @Override protected ItemStack dispenseSilently(BlockPointer pointer, ItemStack stack) { Direction direction = pointer.getBlockState().get(DispenserBlock.FACING); EntityType entityType = ((SpawnEggItem)stack.getItem()).getEntityType(stack.getTag()); entityType.spawnFromItemStack(pointer.getWorld(), stack, null, pointer.getBlockPos().offset(direction), SpawnType.DISPENSER, direction != Direction.UP, false); stack.decrement(1); return stack; } } private static class Modified extends ProjectileDispenserBehavior { @Override protected ProjectileEntity createProjectile(World position, Position stack, ItemStack itemStack) { SpawnEggEntity entity = new SpawnEggEntity(position, stack.getX(), stack.getY(), stack.getZ()); entity.setItem(itemStack); return entity; } } @Override public ItemStack dispense(BlockPointer pointer, ItemStack stack) { if (SlightlyVanilla.getConfig().throwableSpawnEggs.dispenser) { return new Modified().dispense(pointer, stack); } else { return new Default().dispense(pointer, stack); } } }