diff --git a/src/main/java/noppes/npcs/scripted/ScriptWorld.java b/src/main/java/noppes/npcs/scripted/ScriptWorld.java index 4234de4f4..8113737a1 100644 --- a/src/main/java/noppes/npcs/scripted/ScriptWorld.java +++ b/src/main/java/noppes/npcs/scripted/ScriptWorld.java @@ -402,6 +402,61 @@ public class ScriptWorld implements IWorld { return currentPos; } + public IEntity[] rayCastEntities(double[] startPos, double[] lookVector, + int maxDistance, double offset, double range, + boolean stopOnBlock, boolean stopOnLiquid, boolean stopOnCollision) { + ArrayList entities = new ArrayList<>(); + + Vec3 currentPos = Vec3.createVectorHelper(startPos[0], startPos[1], startPos[2]); int rep = 0; + currentPos.addVector(lookVector[0]*offset, lookVector[1]*offset, lookVector[2]*offset); + + while (rep++ < maxDistance + 10) { + currentPos = currentPos.addVector(lookVector[0], lookVector[1], lookVector[2]); + IPos pos = new ScriptBlockPos(new BlockPos(currentPos.xCoord, currentPos.yCoord, currentPos.zCoord)); + IBlock block = getBlock(pos); + + if (block != null && stopOnBlock) { + if ((!stopOnLiquid || block.getMCBlock() instanceof BlockLiquid) + && (!stopOnCollision || block.canCollide())) + return entities.toArray(new IEntity[0]); + } + + IEntity[] entitiesNear = getEntitiesNear(pos,range); + for (IEntity entity : entitiesNear) { + if (!entities.contains(entity)) { + entities.add(entity); + } + } + + 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) { + break; + } + } + + return entities.toArray(new IEntity[0]); + } + + public IEntity[] rayCastEntities(IPos startPos, IPos lookVector, + int maxDistance, double offset, double range, + boolean stopOnBlock, boolean stopOnLiquid, boolean stopOnCollision) { + return rayCastEntities(new double[] {startPos.getX(), startPos.getY(), startPos.getZ()}, lookVector.normalize(), maxDistance, offset, range, stopOnBlock, stopOnLiquid, stopOnCollision); + } + + public IEntity[] rayCastEntities(double[] startPos, double[] lookVector, + int maxDistance, double offset, double range) { + return rayCastEntities(startPos, lookVector, maxDistance, offset, range, true, false, true); + } + + public IEntity[] rayCastEntities(IPos startPos, IPos lookVector, + int maxDistance, double offset, double range) { + return rayCastEntities(new double[] {startPos.getX(), startPos.getY(), startPos.getZ()}, lookVector.normalize(), maxDistance, offset, range, true, false, true); + } + public boolean canSeeSky(int x, int y, int z) { return world.canBlockSeeTheSky(x, y, z); } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java index 56556cd8b..0ff394203 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptLivingBase.java @@ -135,48 +135,16 @@ public class ScriptLivingBase extends ScriptEntity entities = new ArrayList<>(); - - Vec3 currentPos = Vec3.createVectorHelper(startPos[0], startPos[1], startPos[2]); int rep = 0; - - while (rep++ < maxDistance + 10) { - currentPos = currentPos.addVector(lookVector[0], lookVector[1], lookVector[2]); - IPos pos = new ScriptBlockPos(new BlockPos(currentPos.xCoord, currentPos.yCoord, currentPos.zCoord)); - IBlock block = getWorld().getBlock(pos); - - if (block != null && stopOnBlock) { - if ((!stopOnLiquid || block.getMCBlock() instanceof BlockLiquid) - && (!stopOnCollision || block.canCollide())) - return entities.toArray(new IEntity[0]); - } - - IEntity[] entitiesNear = getWorld().getEntitiesNear(pos,range); - for (IEntity entity : entitiesNear) { - if (!entities.contains(entity)) { - entities.add(entity); - } - } - - 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) { - break; - } - } - - return entities.toArray(new IEntity[0]); + return getWorld().rayCastEntities(startPos,lookVector,maxDistance,offset,range,stopOnBlock,stopOnLiquid,stopOnCollision); } - public IEntity[] getLookingAtEntities(int maxDistance, int range) { - return getLookingAtEntities(maxDistance,range,true,false,true); + public IEntity[] getLookingAtEntities(int maxDistance, double offset, double range) { + return getLookingAtEntities(maxDistance,offset,range,true,false,true); } /** diff --git a/src/main/java/noppes/npcs/scripted/interfaces/IWorld.java b/src/main/java/noppes/npcs/scripted/interfaces/IWorld.java index bd2437317..81ce7eef3 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/IWorld.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/IWorld.java @@ -193,6 +193,14 @@ public interface IWorld { */ public IPos getNearestAir(IPos startPos, int maxHeight); + IEntity[] rayCastEntities(double[] startPos, double[] lookVector, int maxDistance, double offset, double range, boolean stopOnBlock, boolean stopOnLiquid, boolean stopOnCollision); + + IEntity[] rayCastEntities(IPos startPos, IPos lookVector, int maxDistance, double offset, double range, boolean stopOnBlock, boolean stopOnLiquid, boolean stopOnCollision); + + IEntity[] rayCastEntities(double[] startPos, double[] lookVector, int maxDistance, double offset, double range); + + IEntity[] rayCastEntities(IPos startPos, IPos lookVector, int maxDistance, double offset, double range); + /** * @param x * @param y diff --git a/src/main/java/noppes/npcs/scripted/interfaces/entity/IEntityLivingBase.java b/src/main/java/noppes/npcs/scripted/interfaces/entity/IEntityLivingBase.java index 6dcef4322..3acc3b7d9 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/entity/IEntityLivingBase.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/entity/IEntityLivingBase.java @@ -82,9 +82,9 @@ public interface IEntityLivingBase extends IEntity