From 555ceb741f49222647c13a1cdad4de4f67fcb6f4 Mon Sep 17 00:00:00 2001 From: luisc Date: Thu, 13 Jan 2022 05:28:20 -0600 Subject: [PATCH] Added a modifiable and toggleable flying height limit to NPCs --- src/main/java/noppes/npcs/DataAI.java | 14 +++++++++++++ .../npcs/ai/pathfinder/FlyingMoveHelper.java | 14 ++++++++++++- .../npcs/client/gui/SubGuiNpcMovement.java | 21 ++++++++++++++++--- .../noppes/npcs/entity/EntityNPCFlying.java | 21 +++++++++++++++++-- .../npcs/scripted/entity/ScriptNpc.java | 17 +++++++++++++++ 5 files changed, 81 insertions(+), 6 deletions(-) diff --git a/src/main/java/noppes/npcs/DataAI.java b/src/main/java/noppes/npcs/DataAI.java index 19ceeaf02..787da3b42 100644 --- a/src/main/java/noppes/npcs/DataAI.java +++ b/src/main/java/noppes/npcs/DataAI.java @@ -37,6 +37,8 @@ public class DataAI { public int movementType = 0; public double flySpeed = 1.0D; public double flyGravity = 0.0D; + public boolean hasFlyLimit = true; + public int flyHeightLimit = 2; public EnumAnimation animationType = EnumAnimation.NONE; public EnumStandingType standingType = EnumStandingType.RotateBody; @@ -110,6 +112,16 @@ public class DataAI { else flyGravity = compound.getDouble("FlyGravity"); + if(!compound.hasKey("HasFlyLimit")) + hasFlyLimit = false; + else + hasFlyLimit = compound.getBoolean("HasFlyLimit"); + + if(!compound.hasKey("FlyHeightLimit")) + flyHeightLimit = 5; + else + flyHeightLimit = compound.getInteger("FlyHeightLimit"); + startPos = compound.getIntArray("StartPosNew"); if (startPos == null || startPos.length != 3){ startPos = new int[] { @@ -159,6 +171,8 @@ public class DataAI { compound.setInteger("MovingType", movementType); compound.setDouble("FlySpeed",flySpeed); compound.setDouble("FlyGravity",flyGravity); + compound.setBoolean("HasFlyLimit",hasFlyLimit); + compound.setInteger("FlyHeightLimit", flyHeightLimit); npc.setAvoidWater(avoidsWater); diff --git a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java index 2a9d40580..e316c7fb2 100644 --- a/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java +++ b/src/main/java/noppes/npcs/ai/pathfinder/FlyingMoveHelper.java @@ -2,6 +2,7 @@ package noppes.npcs.ai.pathfinder; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityMoveHelper; +import net.minecraft.init.Blocks; import net.minecraft.util.MathHelper; import noppes.npcs.entity.EntityNPCInterface; @@ -50,7 +51,18 @@ public class FlyingMoveHelper extends EntityMoveHelper{ if(verticalSpeed > Math.abs(this.entity.posY - this.posY)) verticalSpeed = Math.abs(this.entity.posY - this.posY); - this.entity.motionY -= Math.signum(this.entity.posY - this.posY) * verticalSpeed; + int blockY = (int) this.posY; + double heightOffGround = 0; + if(this.entity.ai.hasFlyLimit) { + for (blockY = (int) this.posY; blockY > 0; blockY--) { + heightOffGround = this.posY - blockY; + if (this.entity.worldObj.getBlock((int) this.posX, blockY, (int) this.posZ) != Blocks.air || heightOffGround > this.entity.ai.flyHeightLimit){ + break; + } + } + } + if(heightOffGround < this.entity.ai.flyHeightLimit || !this.entity.ai.hasFlyLimit) + this.entity.motionY -= Math.signum(this.entity.posY - this.posY) * verticalSpeed; } double d5 = MathHelper.sqrt_double(d4); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java index 86b85d3d9..15f85b70a 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcMovement.java @@ -42,6 +42,16 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList addTextField(new GuiNpcTextField(19,this, guiLeft + 80, y + 155, 40, 20, ai.flyGravity + "")); getTextField(19).doublesOnly = true; getTextField(19).setMinMaxDefaultDouble(0.0D,1.0D,0.0D); + + this.addLabel(new GuiNpcLabel(20, "Limit Height", guiLeft + 150, y + 116)); + addButton(new GuiNpcButton(20, guiLeft + 210, y + 110, 40, 20, new String[]{"gui.no","gui.yes"}, ai.hasFlyLimit?1:0)); + + if(ai.hasFlyLimit) { + this.addLabel(new GuiNpcLabel(21, "Height", guiLeft + 150, y + 140)); + addTextField(new GuiNpcTextField(21, this, guiLeft + 185, y + 135, 40, 20, ai.flyHeightLimit + "")); + getTextField(21).integersOnly = true; + getTextField(21).setMinMaxDefaultDouble(0.0D, Double.MAX_VALUE, 1.0D); + } } if(ai.movingType == EnumMovingType.Wandering){ @@ -159,10 +169,12 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList else if (button.id == 15) { ai.movementType = button.getValue(); initGui(); + } else if (button.id == 20) { + ai.hasFlyLimit = button.getValue() == 1; + initGui(); + } else if (button.id == 66) { + close(); } - else if(button.id == 66){ - close(); - } } @Override @@ -191,6 +203,9 @@ public class SubGuiNpcMovement extends SubGuiInterface implements ITextfieldList else if(textfield.id == 19){ ai.flyGravity = textfield.getDouble(); } + else if(textfield.id == 21){ + ai.flyHeightLimit = textfield.getInteger(); + } } } diff --git a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java index 5d98fd290..d8dd7e23f 100644 --- a/src/main/java/noppes/npcs/entity/EntityNPCFlying.java +++ b/src/main/java/noppes/npcs/entity/EntityNPCFlying.java @@ -3,6 +3,7 @@ package noppes.npcs.entity; import net.minecraft.entity.Entity; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.EntityAISwimming; +import net.minecraft.init.Blocks; import net.minecraft.util.MathHelper; import net.minecraft.world.World; @@ -36,10 +37,26 @@ public abstract class EntityNPCFlying extends EntityNPCInterface { return; } + int blockY = (int) this.posY; + double heightOffGround = 0; + if(this.ai.hasFlyLimit) { + for (blockY = (int) this.posY; blockY > 0; blockY--) { + heightOffGround = this.posY - blockY; + if (this.worldObj.getBlock((int) this.posX, blockY, (int) this.posZ) != Blocks.air || heightOffGround > this.ai.flyHeightLimit){ + break; + } + } + } + if (!this.onGround && !this.velocityChanged && this.motionY < 0 && this.hurtTime == 0) { - this.motionY *= this.ai.flyGravity; - this.velocityChanged = true; + if(heightOffGround >= this.ai.flyHeightLimit && this.ai.hasFlyLimit){ + this.motionY *= 0.8D; + this.velocityChanged = true; + } else { + this.motionY *= this.ai.flyGravity; + this.velocityChanged = true; + } } } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 204562ff0..bf43b5a38 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -1040,6 +1040,23 @@ public class ScriptNpc extends ScriptLiving imp return npc.ai.flyGravity; } + public void setFlyHeightLimit(int flyHeightLimit){ + if(flyHeightLimit < 0) + flyHeightLimit = 0; + + this.npc.ai.flyHeightLimit = flyHeightLimit; + } + public int getFlyHeightLimit(int flyHeightLimit){ + return this.npc.ai.flyHeightLimit; + } + + public void limitFlyHeight(boolean limit){ + this.npc.ai.hasFlyLimit = limit; + } + public boolean isFlyHeightLimited(boolean limit){ + return this.npc.ai.hasFlyLimit; + } + public void setSpeed(int speed) { npc.ai.setWalkingSpeed(speed); }