From a8a05282753b24083a4a38d80ecf82f3b4bd2077 Mon Sep 17 00:00:00 2001 From: "Luis C.M" <42545778+c0508383@users.noreply.github.com> Date: Wed, 31 May 2023 23:59:11 -0500 Subject: [PATCH] ScriptWorld: -Increased the accuracy of rayCastPos(). --- .../java/noppes/npcs/scripted/NpcAPI.java | 19 +- .../noppes/npcs/scripted/ScriptWorld.java | 241 ++++++++++++++++-- .../scripted/entity/ScriptLivingBase.java | 6 +- 3 files changed, 234 insertions(+), 32 deletions(-) diff --git a/src/main/java/noppes/npcs/scripted/NpcAPI.java b/src/main/java/noppes/npcs/scripted/NpcAPI.java index 05aea2598..264f1fbb7 100644 --- a/src/main/java/noppes/npcs/scripted/NpcAPI.java +++ b/src/main/java/noppes/npcs/scripted/NpcAPI.java @@ -248,10 +248,14 @@ public class NpcAPI extends AbstractNpcAPI { } public IBlock getIBlock(IWorld world, IPos pos) { - return this.getIBlock(world, pos.getX(),pos.getY(),pos.getZ()); + return pos == null ? null : this.getIBlock(world, pos.getX(),pos.getY(),pos.getZ()); } public ITileEntity getITileEntity(IWorld world, IPos pos) { + if (pos == null) { + return null; + } + TileEntity tileEntity = world.getMCWorld().getTileEntity(pos.getX(), pos.getY(),pos.getZ()); return this.getITileEntity(tileEntity); } @@ -282,11 +286,13 @@ public class NpcAPI extends AbstractNpcAPI { } public IPos[] getAllInBox(IPos from, IPos to, boolean sortByDistance) { - Iterator posIterable = BlockPos.getAllInBox(from.getMCPos(),to.getMCPos()).iterator(); ArrayList list = new ArrayList<>(); - posIterable.forEachRemaining(BlockPos -> list.add(this.getIPos(BlockPos))); - if (sortByDistance) { - list.sort(Comparator.comparingDouble(pos -> pos.distanceTo(from))); + if (from != null && to != null) { + Iterator posIterable = BlockPos.getAllInBox(from.getMCPos(),to.getMCPos()).iterator(); + posIterable.forEachRemaining(BlockPos -> list.add(this.getIPos(BlockPos))); + if (sortByDistance) { + list.sort(Comparator.comparingDouble(pos -> pos.distanceTo(from))); + } } return list.toArray(new IPos[0]); } @@ -333,6 +339,9 @@ public class NpcAPI extends AbstractNpcAPI { } public ICustomNpc spawnNPC(IWorld world, IPos pos) { + if (pos == null) { + return null; + } return this.spawnNPC(world, pos.getX(), pos.getY(), pos.getZ()); } diff --git a/src/main/java/noppes/npcs/scripted/ScriptWorld.java b/src/main/java/noppes/npcs/scripted/ScriptWorld.java index eddce617c..03ae89023 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptWorld.java +++ b/src/main/java/noppes/npcs/scripted/ScriptWorld.java @@ -1,7 +1,9 @@ package noppes.npcs.scripted; import net.minecraft.block.Block; +import net.minecraft.block.BlockAir; import net.minecraft.block.BlockLiquid; +import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.effect.EntityLightningBolt; import net.minecraft.entity.player.EntityPlayer; @@ -15,6 +17,8 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntitySign; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraft.world.WorldServer; @@ -520,36 +524,229 @@ public class ScriptWorld implements IWorld { return this.isBreakCancelled(pos.getX(),pos.getY(),pos.getZ()); } + public MovingObjectPosition func_147447_a(Vec3 startVec, Vec3 endVec, boolean stopOnBlock, boolean stopOnLiquid, boolean stopOnCollision) + { + if (!Double.isNaN(startVec.xCoord) && !Double.isNaN(startVec.yCoord) && !Double.isNaN(startVec.zCoord)) + { + if (!Double.isNaN(endVec.xCoord) && !Double.isNaN(endVec.yCoord) && !Double.isNaN(endVec.zCoord)) + { + int endX = MathHelper.floor_double(endVec.xCoord); + int endY = MathHelper.floor_double(endVec.yCoord); + int endZ = MathHelper.floor_double(endVec.zCoord); + int l = MathHelper.floor_double(startVec.xCoord); + int i1 = MathHelper.floor_double(startVec.yCoord); + int j1 = MathHelper.floor_double(startVec.zCoord); + Block block = this.world.getBlock(l, i1, j1); + int k1 = this.world.getBlockMetadata(l, i1, j1); + + if (block.canCollideCheck(k1, false)) + { + MovingObjectPosition movingobjectposition = block.collisionRayTrace(this.world, l, i1, j1, startVec, endVec); + + if (movingobjectposition != null) + { + return movingobjectposition; + } + } + + k1 = 200; + + while (k1-- >= 0) + { + if (Double.isNaN(startVec.xCoord) || Double.isNaN(startVec.yCoord) || Double.isNaN(startVec.zCoord)) + { + return null; + } + + if (l == endX && i1 == endY && j1 == endZ) + { + return null; + } + + boolean flag6 = true; + boolean flag3 = true; + boolean flag4 = true; + double d0 = 999.0D; + double d1 = 999.0D; + double d2 = 999.0D; + + if (endX > l) + { + d0 = (double)l + 1.0D; + } + else if (endX < l) + { + d0 = (double)l + 0.0D; + } + else + { + flag6 = false; + } + + if (endY > i1) + { + d1 = (double)i1 + 1.0D; + } + else if (endY < i1) + { + d1 = (double)i1 + 0.0D; + } + else + { + flag3 = false; + } + + if (endZ > j1) + { + d2 = (double)j1 + 1.0D; + } + else if (endZ < j1) + { + d2 = (double)j1 + 0.0D; + } + else + { + flag4 = false; + } + + double d3 = 999.0D; + double d4 = 999.0D; + double d5 = 999.0D; + double d6 = endVec.xCoord - startVec.xCoord; + double d7 = endVec.yCoord - startVec.yCoord; + double d8 = endVec.zCoord - startVec.zCoord; + + if (flag6) + { + d3 = (d0 - startVec.xCoord) / d6; + } + + if (flag3) + { + d4 = (d1 - startVec.yCoord) / d7; + } + + if (flag4) + { + d5 = (d2 - startVec.zCoord) / d8; + } + + byte b0; + + if (d3 < d4 && d3 < d5) + { + if (endX > l) + { + b0 = 4; + } + else + { + b0 = 5; + } + + startVec.xCoord = d0; + startVec.yCoord += d7 * d3; + startVec.zCoord += d8 * d3; + } + else if (d4 < d5) + { + if (endY > i1) + { + b0 = 0; + } + else + { + b0 = 1; + } + + startVec.xCoord += d6 * d4; + startVec.yCoord = d1; + startVec.zCoord += d8 * d4; + } + else + { + if (endZ > j1) + { + b0 = 2; + } + else + { + b0 = 3; + } + + startVec.xCoord += d6 * d5; + startVec.yCoord += d7 * d5; + startVec.zCoord = d2; + } + + Vec3 vec32 = Vec3.createVectorHelper(startVec.xCoord, startVec.yCoord, startVec.zCoord); + l = (int)(vec32.xCoord = (double)MathHelper.floor_double(startVec.xCoord)); + + if (b0 == 5) + { + --l; + ++vec32.xCoord; + } + + i1 = (int)(vec32.yCoord = (double)MathHelper.floor_double(startVec.yCoord)); + + if (b0 == 1) + { + --i1; + ++vec32.yCoord; + } + + j1 = (int)(vec32.zCoord = (double)MathHelper.floor_double(startVec.zCoord)); + + if (b0 == 3) + { + --j1; + ++vec32.zCoord; + } + + Block block1 = this.world.getBlock(l, i1, j1); + int l1 = this.world.getBlockMetadata(l, i1, j1); + + MovingObjectPosition movingobjectposition1 = block1.collisionRayTrace(this.world, l, i1, j1, startVec, endVec); + if (movingobjectposition1 != null) + { + if (block1.canCollideCheck(l1, false) && stopOnBlock || + block1.getMaterial().isLiquid() && stopOnLiquid || + !(block1 instanceof BlockAir) && block1.getCollisionBoundingBoxFromPool(this.world,l,i1,j1) == null && !stopOnCollision) + { + return movingobjectposition1; + } + } + } + + return null; + } + else + { + return null; + } + } + else + { + return null; + } + } + public IPos rayCastPos(double[] startPos, double[] lookVector, int maxDistance, boolean stopOnBlock, boolean stopOnLiquid, boolean stopOnCollision) { if (startPos.length != 3 || lookVector.length != 3) { return null; } - IPos pos; - Vec3 currentPos = Vec3.createVectorHelper(startPos[0], startPos[1], startPos[2]); int rep = 0; + Vec3 startVec = Vec3.createVectorHelper(startPos[0], startPos[1], startPos[2]); + Vec3 endVec = startVec.addVector(lookVector[0]*maxDistance,lookVector[1]*maxDistance,lookVector[2]*maxDistance); - while (rep++ < maxDistance + 10) { - currentPos = currentPos.addVector(lookVector[0], lookVector[1], lookVector[2]); - pos = NpcAPI.Instance().getIPos(currentPos.xCoord, currentPos.yCoord, currentPos.zCoord); - - IBlock block = getBlock((int)currentPos.xCoord, (int)currentPos.yCoord, (int)currentPos.zCoord); - if (block != null && stopOnBlock) { - if ((!stopOnLiquid || block.getMCBlock() instanceof BlockLiquid) - && (!stopOnCollision || block.canCollide())) - return pos; - } - - double distance = Math.pow( - Math.pow(currentPos.xCoord-startPos[0],2) - +Math.pow(currentPos.yCoord-startPos[1],2) - +Math.pow(currentPos.zCoord-startPos[2],2) - , 0.5); - if (distance > maxDistance) { - return pos; - } + IPos endPos = NpcAPI.Instance().getIPos(endVec.xCoord,endVec.yCoord,endVec.zCoord); + if (!stopOnBlock && !stopOnLiquid && !stopOnCollision) { + return endPos; } - return null; + MovingObjectPosition mob = this.func_147447_a(startVec,endVec,stopOnBlock,stopOnLiquid,stopOnCollision); + return mob != null ? NpcAPI.Instance().getIPos(mob.blockX,mob.blockY,mob.blockZ) : endPos; } public IPos rayCastPos(double[] startPos, double[] lookVector, int maxDistance) { diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java index 88c877018..484fa7d6a 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java @@ -162,11 +162,7 @@ public class ScriptLivingBase extends ScriptEntity