2018-10-15 14:45:56 -05:00
|
|
|
package net.yseven.findyourway.Client;
|
|
|
|
|
2018-11-07 11:33:15 -06:00
|
|
|
import net.minecraft.client.Minecraft;
|
2018-10-15 14:45:56 -05:00
|
|
|
import net.minecraft.entity.Entity;
|
|
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
|
|
import net.minecraft.entity.item.EntityItemFrame;
|
2018-11-07 11:33:15 -06:00
|
|
|
import net.minecraft.entity.passive.EntityChicken;
|
2018-10-15 14:45:56 -05:00
|
|
|
import net.minecraft.item.IItemPropertyGetter;
|
|
|
|
import net.minecraft.item.ItemStack;
|
|
|
|
import net.minecraft.util.math.BlockPos;
|
|
|
|
import net.minecraft.util.math.MathHelper;
|
|
|
|
import net.minecraft.world.World;
|
|
|
|
import net.minecraftforge.fml.relauncher.Side;
|
|
|
|
import net.minecraftforge.fml.relauncher.SideOnly;
|
2018-11-07 11:33:15 -06:00
|
|
|
import net.yseven.findyourway.CommonProxy;
|
2018-10-15 14:45:56 -05:00
|
|
|
|
|
|
|
import javax.annotation.Nullable;
|
|
|
|
import javax.annotation.ParametersAreNonnullByDefault;
|
|
|
|
|
|
|
|
public class AngleGetter implements IItemPropertyGetter {
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
private double prevAngle = 0.0D;
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
private double prevWobble = 0.0D;
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
private long prevWorldTime = 0L;
|
2018-10-15 15:02:15 -05:00
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
private BlockPos blockPos;
|
2018-10-15 14:45:56 -05:00
|
|
|
|
|
|
|
@Override
|
|
|
|
@ParametersAreNonnullByDefault
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
public float apply(ItemStack stack, @Nullable World worldIn, @Nullable EntityLivingBase entityIn) {
|
|
|
|
|
2018-11-07 11:33:15 -06:00
|
|
|
boolean isLiving = entityIn != null;
|
|
|
|
Entity errorChicken = new EntityChicken(Minecraft.getMinecraft().world);
|
2018-10-15 14:45:56 -05:00
|
|
|
|
2018-11-07 11:33:15 -06:00
|
|
|
Entity entity;
|
|
|
|
if(isLiving) {
|
|
|
|
entity = entityIn;
|
|
|
|
} else if(stack.getItemFrame() != null) {
|
|
|
|
entity = stack.getItemFrame();
|
|
|
|
} else {
|
|
|
|
entity = errorChicken;
|
|
|
|
}
|
2018-10-15 14:45:56 -05:00
|
|
|
|
|
|
|
if (worldIn == null) worldIn = entity.world;
|
|
|
|
|
2018-11-07 11:33:15 -06:00
|
|
|
double angle;
|
|
|
|
setBlockPos(stack);
|
|
|
|
|
|
|
|
if(blockPos != null) {
|
|
|
|
if (blockPos.getY() == 0) return 0.0F;
|
|
|
|
double entityAngle;
|
|
|
|
if(isLiving) {
|
|
|
|
entityAngle = entity.rotationYaw;
|
|
|
|
} else if(stack.getItemFrame() != null) {
|
|
|
|
entityAngle = getFrameAngle((EntityItemFrame) entity);
|
|
|
|
} else {
|
|
|
|
return 0.0F;
|
|
|
|
}
|
|
|
|
|
|
|
|
entityAngle /= 360.0D;
|
|
|
|
entityAngle = MathHelper.positiveModulo(entityAngle, 1.0D);
|
|
|
|
double posAngle = getAngle(blockPos, entity);
|
|
|
|
posAngle /= Math.PI * 2D;
|
|
|
|
angle = 0.5D - (entityAngle - 0.25D - posAngle);
|
|
|
|
} else {
|
|
|
|
if(!ClientProxy.hasAngleErrrored()) {
|
|
|
|
System.out.println("Compass angle is random due to an unexpected error");
|
|
|
|
ClientProxy.AngleHasErrored();
|
|
|
|
}
|
|
|
|
angle = 0.0D;
|
|
|
|
}
|
2018-10-15 14:45:56 -05:00
|
|
|
|
2018-11-07 11:33:15 -06:00
|
|
|
if(isLiving) {
|
|
|
|
angle = wobble(worldIn, angle);
|
|
|
|
}
|
2018-10-15 14:45:56 -05:00
|
|
|
|
|
|
|
|
2018-11-07 11:33:15 -06:00
|
|
|
return MathHelper.positiveModulo((float) angle, 1.0F);
|
2018-10-15 14:45:56 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
private double wobble(World world, double angle) {
|
|
|
|
long worldTime = world.getTotalWorldTime();
|
|
|
|
if (worldTime != prevWorldTime) {
|
|
|
|
prevWorldTime = worldTime;
|
|
|
|
double angleDifference = angle - prevAngle;
|
|
|
|
angleDifference = MathHelper.positiveModulo(angleDifference + 0.5D, 1.0D) - 0.5D;
|
|
|
|
prevWobble += angleDifference * 0.1D;
|
|
|
|
prevWobble *= 0.8D;
|
|
|
|
prevAngle = MathHelper.positiveModulo(prevAngle + prevWobble, 1.0D);
|
|
|
|
}
|
|
|
|
return prevAngle;
|
|
|
|
}
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
2018-11-07 11:33:15 -06:00
|
|
|
private void setBlockPos(ItemStack stack) {
|
|
|
|
for (int i = 0; i < CommonProxy.compassList.size(); i++) {
|
|
|
|
if (stack.getItem().getUnlocalizedName().equals(CommonProxy.compassList.get(i).getUnlocalizedName())) {
|
|
|
|
blockPos = CommonProxy.compassList.get(i).getStructurePos();
|
|
|
|
} else {
|
|
|
|
if (!ClientProxy.hasAngleErrrored()) {
|
|
|
|
System.out.println("unable to get blockPos from compassList in AngleGetter class");
|
|
|
|
}
|
|
|
|
}
|
2018-10-15 22:29:48 -05:00
|
|
|
}
|
2018-11-07 11:33:15 -06:00
|
|
|
}
|
2018-10-15 22:29:48 -05:00
|
|
|
|
2018-11-07 11:33:15 -06:00
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
private double getAngle(BlockPos pos, Entity ent) {
|
|
|
|
return MathHelper.atan2(pos.getZ() - ent.posZ, pos.getX() - ent.posX);
|
2018-10-15 14:45:56 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
|
|
private double getFrameAngle(EntityItemFrame entity) {
|
|
|
|
return (double) MathHelper.wrapDegrees(180 + (entity.facingDirection.getHorizontalIndex() * 90));
|
|
|
|
}
|
|
|
|
}
|