package com.minelittlepony.unicopia.projectile; import javax.annotation.Nullable; import com.minelittlepony.unicopia.mixin.MixinPersistentProjectileEntity; import net.minecraft.entity.Entity; import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.util.math.Vec3d; public interface ProjectileUtil { /** * Checks if the given entity is a projectile. */ static boolean isProjectile(Entity e) { return e instanceof ProjectileEntity; } /** * Checks if the given entity is a projectile that is not stuck in the ground. */ static boolean isFlyingProjectile(Entity e) { return isProjectile(e) && !(e instanceof MixinPersistentProjectileEntity && ((MixinPersistentProjectileEntity)e).isInGround()); } /** * Checks if the given projectile was thrown by the given entity */ static boolean isProjectileThrownBy(Entity throwable, @Nullable T e) { return e != null && isProjectile(throwable) && e.equals(((ProjectileEntity) throwable).getOwner()); } /** * Sets the velocity and heading for a projectile. * * @param throwable The projectile * @param heading The directional heaving vector * @param velocity Velocity * @param inaccuracy Inaccuracy * @return True the projectile's heading was set, false otherwise */ static void setThrowableHeading(Entity throwable, Vec3d heading, float velocity, float inaccuracy) { if (throwable instanceof ProjectileEntity) { ((ProjectileEntity)throwable).setVelocity(heading.x, heading.y, heading.z, velocity, inaccuracy); } else { heading = heading.normalize().multiply(velocity); Vec3d vel = throwable.getVelocity(); throwable.addVelocity(heading.x - vel.x, heading.y - vel.y, heading.z - vel.z); } } }