From d86f571df64f255d214abbbe5c4c8df7d645e118 Mon Sep 17 00:00:00 2001 From: "Luis C.M" <42545778+c0508383@users.noreply.github.com> Date: Sat, 12 Nov 2022 15:53:20 -0600 Subject: [PATCH] PathNavigateFlying: -Fixed pathfinder running into lava & water when it shouldn't. FlyPathFinder: -Simplified nodeTypeToOffset switch statement, removed unused function, and made air always return an open path node type. EntityNPCInterface: -Fixed "In Air" drowning type. Breathes underwater now. EntityNPCFlying: -Fixed NPCs still using flight movement when not being able to breathe. ICustomNpc: -Added canBreathe() function --- .../npcs/ai/pathfinder/FlyPathFinder.java | 42 ++++++------------- .../ai/pathfinder/PathNavigateFlying.java | 11 +++-- .../noppes/npcs/entity/EntityNPCFlying.java | 2 +- .../npcs/entity/EntityNPCInterface.java | 29 +++++++++++-- .../npcs/scripted/entity/ScriptNpc.java | 4 ++ .../interfaces/entity/ICustomNpc.java | 2 + 6 files changed, 53 insertions(+), 37 deletions(-) diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyPathFinder.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyPathFinder.java index 7a7462321..46d94f044 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/FlyPathFinder.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyPathFinder.java @@ -473,40 +473,30 @@ public class FlyPathFinder extends PathFinder public int nodeTypeToOffset(PathNodeType nodeType) { switch (nodeType) { - case BLOCKED: - return 0; - case OPEN: - return 2; - case WALKABLE: - return 1; case TRAPDOOR: return -4; case FENCE: return -3; case LAVA: - return -2; - case WATER: - return -1; - case RAIL: - return 2; - case DANGER_FIRE: - return -1; case DAMAGE_FIRE: - return -2; - case DANGER_CACTUS: - return -1; case DAMAGE_CACTUS: - return -2; - case DANGER_OTHER: - return -1; case DAMAGE_OTHER: return -2; - case DOOR_OPEN: - return 1; + case WATER: + case DANGER_FIRE: + case DANGER_CACTUS: + case DANGER_OTHER: + return -1; + case BLOCKED: case DOOR_WOOD_CLOSED: - return 0; case DOOR_IRON_CLOSED: return 0; + case WALKABLE: + case DOOR_OPEN: + return 1; + case OPEN: + case RAIL: + return 2; } return 1; @@ -526,12 +516,6 @@ public class FlyPathFinder extends PathFinder return pathpoint; } - public NPCPathPoint getPointFromHash(int x, int y, int z) - { - int i = NPCPathPoint.makeHash(x, y, z); - return this.pointMap.lookup(i); - } - /** * Returns a new FlyPathEntity for a given start and end point */ @@ -721,7 +705,7 @@ public class FlyPathFinder extends PathFinder if (material == Material.air) { - return drowningType == 2 ? PathNodeType.WATER : PathNodeType.OPEN; + return PathNodeType.OPEN; } else if (block != Blocks.trapdoor && block != Blocks.waterlily) { diff --git a/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java b/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java index 740e3f92a..725ca0dc6 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/PathNavigateFlying.java @@ -1,6 +1,7 @@ package noppes.npcs.ai.pathfinder; import net.minecraft.block.Block; +import net.minecraft.block.material.Material; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLiving; import net.minecraft.entity.SharedMonsterAttributes; @@ -438,7 +439,7 @@ public class PathNavigateFlying extends PathNavigate { { Vec3 pos17 = Vec3.createVectorHelper(startPos.xCoord,startPos.yCoord, startPos.zCoord); Vec3 pos18 = Vec3.createVectorHelper(endPos.xCoord,endPos.yCoord, endPos.zCoord); - if (this.rayTraceBlocks(pos17, pos18, false, false, false, width, height)) + if (this.rayTraceBlocks(pos17, pos18, true, false, false, width, height)) return false; return true; @@ -656,15 +657,19 @@ public class PathNavigateFlying extends PathNavigate { Block block2 = this.worldObj.getBlock(l, i1, j1); int meta2 = this.worldObj.getBlockMetadata(l, i1, j1); - if (block2 != Blocks.air && (!p_147447_4_ || block2.getCollisionBoundingBoxFromPool(this.worldObj, l, i1, j1) != null) + if ((!p_147447_4_ || block2.getCollisionBoundingBoxFromPool(this.worldObj, l, i1, j1) != null) && block2.canCollideCheck(meta2, p_147447_3_)) { - if (!block2.getBlocksMovement(this.worldObj, l, i1, j1)) { + if (block2.getMaterial() == Material.lava && !this.theEntity.isImmuneToFire() || + block2.getMaterial() == Material.air && this.theEntity.stats.drowningType == 2 || + block2.getMaterial() == Material.water && this.theEntity.stats.drowningType == 1 || + !block2.getBlocksMovement(this.worldObj, l, i1, j1)) { value = true; l -= x; i1 -= y; j1 -= z; break; } + MovingObjectPosition movingobjectposition = block2.collisionRayTrace(this.worldObj, l, i1, j1, p_147447_1_, p_147447_2_); if (movingobjectposition != null && movingobjectposition.typeOfHit != MovingObjectPosition.MovingObjectType.MISS) { diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index 0d50392aa..172c62dc9 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -35,7 +35,7 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { public void moveEntityWithHeading(float p_70612_1_, float p_70612_2_) { - if(!this.canFly() || this.hurtTime != 0) { + if(!this.canFly() || this.hurtTime != 0 || !this.canBreathe()) { super.moveEntityWithHeading(p_70612_1_, p_70612_2_); return; } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java index 1a7f6a60f..e645409d5 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCInterface.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCInterface.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.util.*; import net.minecraft.block.Block; +import net.minecraft.block.material.Material; import net.minecraft.command.ICommandSender; import net.minecraft.command.IEntitySelector; import net.minecraft.entity.*; @@ -415,10 +416,14 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } } + public boolean canBreathe() { + return this.isInWater() && this.stats.drowningType == 2 || !this.isInWater() && this.stats.drowningType == 1 || this.stats.drowningType == 0; + } + @Override protected void updateAITasks() { - if (this.isInWater() || this.stats.drowningType != 2) { + if (this.canBreathe()) { this.getNavigator().onUpdateNavigation(); this.getMoveHelper().onUpdateMoveHelper(); try { @@ -1054,7 +1059,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti this.setRevengeTarget(null); this.deathTime = 0; //fleeingTick = 0; - if(ai.returnToStart && !hasOwner()) + if(ai.returnToStart && !hasOwner() && !this.isRemote()) setLocationAndAngles(getStartXPos(), getStartYPos(), getStartZPos(), rotationYaw, rotationPitch); killedtime = 0; extinguish(); @@ -1351,7 +1356,7 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti } if (yy <= 0) setDead(); - yy += 0.5; + //yy += 0.5; return yy; } @@ -1632,7 +1637,23 @@ public abstract class EntityNPCInterface extends EntityCreature implements IEnti public boolean handleWaterMovement() { - return stats.drowningType == 1 && super.handleWaterMovement(); + if (stats.drowningType != 1) { + if (this.worldObj.handleMaterialAcceleration(this.boundingBox.expand(0.0D, -0.4000000059604645D, 0.0D).contract(0.001D, 0.001D, 0.001D), Material.water, this)) { + this.fallDistance = 0.0F; + this.inWater = true; + this.setFire(0); + } else { + this.inWater = false; + } + return false; + } else { + return super.handleWaterMovement(); + } + } + + public boolean canBreatheUnderwater() + { + return stats.drowningType != 1; } public void setAvoidWater(boolean avoidWater) { diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 851bf1617..f11a93abb 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -1071,6 +1071,10 @@ public class ScriptNpc extends ScriptLiving imp npc.stats.drowningType = type; } + public boolean canBreathe() { + return npc.canBreathe(); + } + @Override public long getAge(){ return npc.totalTicksAlive; diff --git a/src/main/java/noppes/npcs/scripted/interfaces/entity/ICustomNpc.java b/src/main/java/noppes/npcs/scripted/interfaces/entity/ICustomNpc.java index 8e684cc71..6f06b4133 100644 --- a/src/main/java/noppes/npcs/scripted/interfaces/entity/ICustomNpc.java +++ b/src/main/java/noppes/npcs/scripted/interfaces/entity/ICustomNpc.java @@ -371,6 +371,8 @@ public interface ICustomNpc extends IEntityLiving { */ void setDrowningType(int type); + boolean canBreathe(); + /** * @param type The AnimationType */