private void doDispense(GlowBlock block, ItemStack items, int power, BlockFace facing,
Vector target) {
double x = target.getX();
double y = target.getY();
double z = target.getZ();
if (facing.getModY() != 0) {
y -= 0.125;
} else {
y -= 0.15625;
}
double velocity = ThreadLocalRandom.current().nextDouble() * 0.1 + 0.2;
double velocityX = facing.getModX() * velocity;
double velocityY = 0.2;
double velocityZ = facing.getModZ() * velocity;
velocityX += ThreadLocalRandom.current().nextGaussian() * 0.0075 * power;
velocityY += ThreadLocalRandom.current().nextGaussian() * 0.0075 * power;
velocityZ += ThreadLocalRandom.current().nextGaussian() * 0.0075 * power;
BlockDispenseEvent dispenseEvent = new BlockDispenseEvent(block, items,
new Vector(velocityX, velocityY, velocityZ));
EventFactory.getInstance().callEvent(dispenseEvent);
if (!dispenseEvent.isCancelled()) {
GlowItem item = block.getWorld().dropItem(new Location(block.getWorld(), x, y, z),
dispenseEvent.getItem());
item.setVelocity(dispenseEvent.getVelocity());
}
}