aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/rosegoldaddons/utils/ShadyRotation.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/rosegoldaddons/utils/ShadyRotation.java')
-rw-r--r--src/main/java/rosegoldaddons/utils/ShadyRotation.java118
1 files changed, 118 insertions, 0 deletions
diff --git a/src/main/java/rosegoldaddons/utils/ShadyRotation.java b/src/main/java/rosegoldaddons/utils/ShadyRotation.java
new file mode 100644
index 0000000..fdacc59
--- /dev/null
+++ b/src/main/java/rosegoldaddons/utils/ShadyRotation.java
@@ -0,0 +1,118 @@
+package rosegoldaddons.utils;
+
+import net.minecraft.entity.Entity;
+import net.minecraft.util.BlockPos;
+import net.minecraft.util.Vec3;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
+import net.minecraftforge.fml.common.gameevent.TickEvent;
+import rosegoldaddons.Main;
+
+public class ShadyRotation {
+ private static float pitchDifference;
+ public static float yawDifference;
+ private static int ticks = -1;
+ private static int tickCounter = 0;
+ private static Runnable callback = null;
+
+ public static boolean running = false;
+
+ public static class Rotation {
+ public float pitch;
+ public float yaw;
+
+ public Rotation(float pitch, float yaw) {
+ this.pitch = pitch;
+ this.yaw = yaw;
+ }
+ }
+
+ private static double wrapAngleTo180(double angle) {
+ return angle - Math.floor(angle / 360 + 0.5) * 360;
+ }
+
+ public static Rotation getRotationToBlock(BlockPos block) {
+ double diffX = block.getX() - Main.mc.thePlayer.posX + 0.5;
+ double diffY = block.getY() - Main.mc.thePlayer.posY + 0.5 - Main.mc.thePlayer.getEyeHeight();
+ double diffZ = block.getZ() - Main.mc.thePlayer.posZ + 0.5;
+ double dist = Math.sqrt(diffX * diffX + diffZ * diffZ);
+
+ float pitch = (float) -Math.atan2(dist, diffY);
+ float yaw = (float) Math.atan2(diffZ, diffX);
+ pitch = (float) wrapAngleTo180((pitch * 180F / Math.PI + 90)*-1);
+ yaw = (float) wrapAngleTo180((yaw * 180 / Math.PI) - 90);
+
+ return new Rotation(pitch, yaw);
+ }
+
+ public static Rotation getRotationToEntity(Entity entity) {
+ double diffX = entity.posX - Main.mc.thePlayer.posX;
+ double diffY = entity.posY + entity.getEyeHeight() - Main.mc.thePlayer.posY - Main.mc.thePlayer.getEyeHeight();
+ double diffZ = entity.posZ - Main.mc.thePlayer.posZ;
+ double dist = Math.sqrt(diffX * diffX + diffZ * diffZ);
+
+ float pitch = (float) -Math.atan2(dist, diffY);
+ float yaw = (float) Math.atan2(diffZ, diffX);
+ pitch = (float) wrapAngleTo180((pitch * 180F / Math.PI + 90)*-1);
+ yaw = (float) wrapAngleTo180((yaw * 180 / Math.PI) - 90);
+
+ return new Rotation(pitch, yaw);
+ }
+
+ public static Rotation vec3ToRotation(Vec3 vec) {
+ double diffX = vec.xCoord - Main.mc.thePlayer.posX;
+ double diffY = vec.yCoord - Main.mc.thePlayer.posY - Main.mc.thePlayer.getEyeHeight();
+ double diffZ = vec.zCoord - Main.mc.thePlayer.posZ;
+ double dist = Math.sqrt(diffX * diffX + diffZ * diffZ);
+
+ float pitch = (float) -Math.atan2(dist, diffY);
+ float yaw = (float) Math.atan2(diffZ, diffX);
+ pitch = (float) wrapAngleTo180((pitch * 180F / Math.PI + 90)*-1);
+ yaw = (float) wrapAngleTo180((yaw * 180 / Math.PI) - 90);
+
+ return new Rotation(pitch, yaw);
+ }
+
+ public static void smoothLook(Rotation rotation, int ticks, Runnable callback) {
+ if(ticks == 0) {
+ look(rotation);
+ callback.run();
+ return;
+ }
+
+ ShadyRotation.callback = callback;
+
+ pitchDifference = rotation.pitch - Main.mc.thePlayer.rotationPitch;
+ yawDifference = rotation.yaw - Main.mc.thePlayer.rotationYaw;
+
+ ShadyRotation.ticks = ticks * 20;
+ ShadyRotation.tickCounter = 0;
+ }
+
+ public static void smartLook(Rotation rotation, int ticksPer180, Runnable callback) {
+ float rotationDifference = Math.max(
+ Math.abs(rotation.pitch - Main.mc.thePlayer.rotationPitch),
+ Math.abs(rotation.yaw - Main.mc.thePlayer.rotationYaw)
+ );
+ smoothLook(rotation, (int) (rotationDifference / 180 * ticksPer180), callback);
+ }
+
+ public static void look(Rotation rotation) {
+ Main.mc.thePlayer.rotationPitch = rotation.pitch;
+ Main.mc.thePlayer.rotationYaw = rotation.yaw;
+ }
+
+ @SubscribeEvent
+ public void onTick(TickEvent event) {
+ if(Main.mc.thePlayer == null) return;
+ if(tickCounter < ticks) {
+ running = true;
+ Main.mc.thePlayer.rotationPitch += pitchDifference / ticks;
+ Main.mc.thePlayer.rotationYaw += yawDifference / ticks;
+ tickCounter++;
+ } else if(callback != null) {
+ running = false;
+ callback.run();
+ callback = null;
+ }
+ }
+}