aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/rosegoldaddons/utils/BlockUtils.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/rosegoldaddons/utils/BlockUtils.java')
-rw-r--r--src/main/java/rosegoldaddons/utils/BlockUtils.java155
1 files changed, 155 insertions, 0 deletions
diff --git a/src/main/java/rosegoldaddons/utils/BlockUtils.java b/src/main/java/rosegoldaddons/utils/BlockUtils.java
new file mode 100644
index 0000000..12ad293
--- /dev/null
+++ b/src/main/java/rosegoldaddons/utils/BlockUtils.java
@@ -0,0 +1,155 @@
+package rosegoldaddons.utils;
+
+import net.minecraft.block.Block;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.client.Minecraft;
+import net.minecraft.util.*;
+import rosegoldaddons.Main;
+
+import java.util.ArrayList;
+
+public class BlockUtils {
+ public static Vec3 bp = null;
+
+ public static ArrayList<Vec3> whereToMineBlock(BlockPos pos) {
+ Vec3 center = new Vec3(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5);
+ ArrayList<Vec3> vec3s = new ArrayList<>();
+ MovingObjectPosition position = rayTrace(center, 4.5F);
+ if (position != null && position.getBlockPos().equals(pos))
+ //return position.hitVec;
+ vec3s.add(position.hitVec);
+ for (int x = 1; x < 5; x++) {
+ for (int y = 1; y < 5; y++) {
+ for (int z = 1; z < 5; z++) {
+ Vec3 vec = new Vec3(pos.getX() + x / 4.0D - 0.125D, pos.getY() + y / 4.0D - 0.125D, pos.getZ() + z / 4.0D - 0.125D);
+ position = rayTrace(vec, 4.5F);
+ if (position != null) {
+ bp = position.hitVec;
+ if (position.getBlockPos().equals(pos))
+ //return position.hitVec;
+ vec3s.add(position.hitVec);
+ }
+ }
+ }
+ }
+ return vec3s;
+ }
+
+
+ public static MovingObjectPosition rayTrace(Vec3 target, float range) {
+ Vec3 vec3 = Main.mc.thePlayer.getPositionEyes(1f);
+ Vec3 vec31 = getLook(target);
+ return fastRayTrace(vec3, vec3.addVector(vec31.xCoord * (double)range, vec31.yCoord * (double)range, vec31.zCoord * (double)range));
+ }
+
+ public static Vec3 getLook(Vec3 vec) {
+ double diffX = vec.xCoord - Main.mc.thePlayer.posX;
+ double diffY = vec.yCoord - (Main.mc.thePlayer.posY + (double)Main.mc.thePlayer.getEyeHeight());
+ double diffZ = vec.zCoord - Main.mc.thePlayer.posZ;
+ double dist = Math.sqrt(diffX * diffX + diffZ * diffZ);
+ return getVectorForRotation((float)(-(Math.atan2(diffY, dist) * 180.0 / Math.PI)), (float)(Math.atan2(diffZ, diffX) * 180.0 / Math.PI - 90.0));
+ }
+
+ public static Vec3 getVectorForRotation(float pitch, float yaw) {
+ double f2 = -Math.cos(-pitch * ((float)Math.PI / 180));
+ return new Vec3(Math.sin(-yaw * ((float)Math.PI / 180) - (float)Math.PI) * f2, Math.sin(-pitch * ((float)Math.PI / 180)), Math.cos(-yaw * ((float)Math.PI / 180) - (float)Math.PI) * f2);
+ }
+
+ private static MovingObjectPosition fastRayTrace(Vec3 vec31, Vec3 vec32) {
+ MovingObjectPosition movingobjectposition;
+ int j1;
+ int i1;
+ int i = (int) Math.floor(vec32.xCoord);
+ int j = (int) Math.floor(vec32.yCoord);
+ int k = (int) Math.floor(vec32.zCoord);
+ int l = (int) Math.floor(vec31.xCoord);
+ BlockPos blockpos = new BlockPos(l, i1 = (int) Math.floor(vec31.yCoord), j1 = (int) Math.floor(vec31.zCoord));
+ IBlockState iblockstate = Main.mc.theWorld.getBlockState(blockpos);
+ Block block = iblockstate.getBlock();
+ if (block.canCollideCheck(iblockstate, false) && (movingobjectposition = block.collisionRayTrace(Main.mc.theWorld, blockpos, vec31, vec32)) != null) {
+ return movingobjectposition;
+ }
+ MovingObjectPosition movingobjectposition2 = null;
+ int k1 = 200;
+ while (k1-- >= 0) {
+ EnumFacing enumfacing;
+ if (l == i && i1 == j && j1 == k) {
+ return movingobjectposition2;
+ }
+ boolean flag2 = true;
+ boolean flag = true;
+ boolean flag1 = true;
+ double d0 = 999.0;
+ double d1 = 999.0;
+ double d2 = 999.0;
+ if (i > l) {
+ d0 = (double)l + 1.0;
+ } else if (i < l) {
+ d0 = (double)l + 0.0;
+ } else {
+ flag2 = false;
+ }
+ if (j > i1) {
+ d1 = (double)i1 + 1.0;
+ } else if (j < i1) {
+ d1 = (double)i1 + 0.0;
+ } else {
+ flag = false;
+ }
+ if (k > j1) {
+ d2 = (double)j1 + 1.0;
+ } else if (k < j1) {
+ d2 = (double)j1 + 0.0;
+ } else {
+ flag1 = false;
+ }
+ double d3 = 999.0;
+ double d4 = 999.0;
+ double d5 = 999.0;
+ double d6 = vec32.xCoord - vec31.xCoord;
+ double d7 = vec32.yCoord - vec31.yCoord;
+ double d8 = vec32.zCoord - vec31.zCoord;
+ if (flag2) {
+ d3 = (d0 - vec31.xCoord) / d6;
+ }
+ if (flag) {
+ d4 = (d1 - vec31.yCoord) / d7;
+ }
+ if (flag1) {
+ d5 = (d2 - vec31.zCoord) / d8;
+ }
+ if (d3 == -0.0) {
+ d3 = -1.0E-4;
+ }
+ if (d4 == -0.0) {
+ d4 = -1.0E-4;
+ }
+ if (d5 == -0.0) {
+ d5 = -1.0E-4;
+ }
+ if (d3 < d4 && d3 < d5) {
+ enumfacing = i > l ? EnumFacing.WEST : EnumFacing.EAST;
+ vec31 = new Vec3(d0, vec31.yCoord + d7 * d3, vec31.zCoord + d8 * d3);
+ } else if (d4 < d5) {
+ enumfacing = j > i1 ? EnumFacing.DOWN : EnumFacing.UP;
+ vec31 = new Vec3(vec31.xCoord + d6 * d4, d1, vec31.zCoord + d8 * d4);
+ } else {
+ enumfacing = k > j1 ? EnumFacing.NORTH : EnumFacing.SOUTH;
+ vec31 = new Vec3(vec31.xCoord + d6 * d5, vec31.yCoord + d7 * d5, d2);
+ }
+ l = MathHelper.floor_double((double)vec31.xCoord) - (enumfacing == EnumFacing.EAST ? 1 : 0);
+ i1 = MathHelper.floor_double((double)vec31.yCoord) - (enumfacing == EnumFacing.UP ? 1 : 0);
+ j1 = MathHelper.floor_double((double)vec31.zCoord) - (enumfacing == EnumFacing.SOUTH ? 1 : 0);
+ blockpos = new BlockPos(l, i1, j1);
+ IBlockState iblockstate1 = Main.mc.theWorld.getBlockState(blockpos);
+ Block block1 = iblockstate1.getBlock();
+ if (block1.canCollideCheck(iblockstate1, false)) {
+ MovingObjectPosition movingobjectposition1 = block1.collisionRayTrace(Main.mc.theWorld, blockpos, vec31, vec32);
+ if (movingobjectposition1 == null) continue;
+ return movingobjectposition1;
+ }
+ movingobjectposition2 = new MovingObjectPosition(MovingObjectPosition.MovingObjectType.MISS, vec31, enumfacing, blockpos);
+ }
+ return movingobjectposition2;
+ }
+}