package joshie.progression.criteria.filters.location;
import joshie.progression.Progression;
import joshie.progression.api.criteria.ProgressionRule;
import joshie.progression.api.special.ICustomDescription;
import joshie.progression.lib.WorldLocation;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
@ProgressionRule(name="playerLook", color=0xFFBBBBBB)
public class FilterPlayerLocationLooking extends FilterLocationBase implements ICustomDescription {
public boolean reachDistance = true;
public double maximumDistance = 64;
@Override
public String getDescription() {
if (reachDistance) return Progression.translate("filter.location.playerLook.reach");
else return Progression.format("filter.location.playerLook.blocks", maximumDistance);
}
protected RayTraceResult getMovingObjectPositionFromPlayer(World worldIn, EntityPlayer player) {
float f = player.rotationPitch;
float f1 = player.rotationYaw;
double d0 = player.posX;
double d1 = player.posY + (double)player.getEyeHeight();
double d2 = player.posZ;
Vec3d vec3 = new Vec3d(d0, d1, d2);
float f2 = MathHelper.cos(-f1 * 0.017453292F - (float)Math.PI);
float f3 = MathHelper.sin(-f1 * 0.017453292F - (float)Math.PI);
float f4 = -MathHelper.cos(-f * 0.017453292F);
float f5 = MathHelper.sin(-f * 0.017453292F);
float f6 = f3 * f4;
float f7 = f2 * f4;
double d3 = 5.0D;
if (reachDistance) {
if (player instanceof EntityPlayerMP) {
d3 = ((EntityPlayerMP) player).interactionManager.getBlockReachDistance();
}
} else d3 = maximumDistance;
Vec3d vec31 = vec3.addVector((double)f6 * d3, (double)f5 * d3, (double)f7 * d3);
return worldIn.rayTraceBlocks(vec3, vec31, false, true, false);
}
@Override
public WorldLocation getRandom(EntityPlayer player) {
RayTraceResult position = getMovingObjectPositionFromPlayer(player.worldObj, player);
return position == null? null: new WorldLocation(player.dimension, position.getBlockPos());
}
}