From cac5a539971531f2ea9e3c494d127de9d9f3b60a Mon Sep 17 00:00:00 2001 From: Kam Date: Wed, 19 Mar 2025 17:38:06 -0400 Subject: [PATCH] Add a new Aim While Shooting Type --- src/api | 2 +- src/main/java/noppes/npcs/DataStats.java | 6 +++--- .../java/noppes/npcs/VersionCompatibility.java | 8 +++++++- .../java/noppes/npcs/ai/EntityAIAnimation.java | 13 +++++++++++-- .../noppes/npcs/ai/EntityAIRangedAttack.java | 7 +++++++ .../client/gui/SubGuiNpcRangeProperties.java | 4 ++-- .../npcs/client/gui/SubGuiScriptParticle.java | 8 +++++++- .../noppes/npcs/scripted/entity/ScriptNpc.java | 16 +++++++++++++--- .../resources/assets/customnpcs/lang/en_US.lang | 1 + 9 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/api b/src/api index dfa15687d..b3031b2f7 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit dfa15687d0ab3cf2c544824b83d5b70338fad510 +Subproject commit b3031b2f71cd8b0a128633747709db42902259f7 diff --git a/src/main/java/noppes/npcs/DataStats.java b/src/main/java/noppes/npcs/DataStats.java index f0fb3ae4c..78cdacf50 100644 --- a/src/main/java/noppes/npcs/DataStats.java +++ b/src/main/java/noppes/npcs/DataStats.java @@ -49,7 +49,7 @@ public class DataStats { public ScriptParticle pCustom = new ScriptParticle(""); public int pEffAmp = 0; public String fireSound = "random.bow"; - public boolean aimWhileShooting = false; + public byte aimType = 0; public boolean projectilesKeepTerrain = false; public EnumCreatureAttribute creatureType = EnumCreatureAttribute.UNDEFINED; @@ -110,7 +110,7 @@ public class DataStats { compound.setInteger("pTrail", pTrail.ordinal()); compound.setInteger("pEffAmp", pEffAmp); compound.setString("FiringSound", fireSound); - compound.setBoolean("AimWhileShooting", aimWhileShooting); + compound.setByte("AimType", aimType); compound.setBoolean("ProjectilesKeepTerrain", projectilesKeepTerrain); if(pTrail == EnumParticleType.Custom) compound.setTag("pCustom", pCustom.writeToNBT()); @@ -176,7 +176,7 @@ public class DataStats { pTrail = EnumParticleType.values()[compound.getInteger("pTrail") % EnumParticleType.values().length]; pEffAmp = compound.getInteger("pEffAmp"); fireSound = compound.getString("FiringSound"); - aimWhileShooting = compound.getBoolean("AimWhileShooting"); + aimType = compound.getByte("AimType"); projectilesKeepTerrain = compound.getBoolean("ProjectilesKeepTerrain"); if(pTrail == EnumParticleType.Custom){ pCustom = ScriptParticle.fromNBT(compound.getCompoundTag("pCustom")); diff --git a/src/main/java/noppes/npcs/VersionCompatibility.java b/src/main/java/noppes/npcs/VersionCompatibility.java index 94a1b28d9..98dd6c20e 100644 --- a/src/main/java/noppes/npcs/VersionCompatibility.java +++ b/src/main/java/noppes/npcs/VersionCompatibility.java @@ -13,11 +13,17 @@ import java.util.Collection; import java.util.List; public class VersionCompatibility { - public static int ModRev = 22; + public static int ModRev = 23; public static void CheckNpcCompatibility(EntityNPCInterface npc, NBTTagCompound compound) { if (npc.npcVersion == ModRev) return; + if (npc.npcVersion < 23) { + if (compound.hasKey("AimWhileShooting")) { + boolean aimShot = compound.getBoolean("AimWhileShooting"); + compound.setInteger("AimType", !aimShot ? 0 : 1); + } + } if (npc.npcVersion < 22) { if (compound.hasKey("CanLeap")) { boolean canLeap = compound.getBoolean("CanLeap"); diff --git a/src/main/java/noppes/npcs/ai/EntityAIAnimation.java b/src/main/java/noppes/npcs/ai/EntityAIAnimation.java index 6ce7c4687..e2f34b449 100644 --- a/src/main/java/noppes/npcs/ai/EntityAIAnimation.java +++ b/src/main/java/noppes/npcs/ai/EntityAIAnimation.java @@ -24,8 +24,12 @@ public class EntityAIAnimation extends EntityAIBase { if (isDead) return npc.currentAnimation != EnumAnimation.LYING; - if (npc.stats.aimWhileShooting && npc.isAttacking()) + if (npc.stats.aimType == 1 && npc.isAttacking()) return npc.currentAnimation != EnumAnimation.AIMING; + + if(npc.stats.aimType == 2 && npc.isAttacking() && npc.getRangedTask() != null && npc.getRangedTask().isShooting()) + return npc.currentAnimation != EnumAnimation.AIMING; + if (npc.ais.animationType == EnumAnimation.NONE) return npc.currentAnimation != EnumAnimation.NONE; isAttacking = npc.isAttacking(); @@ -42,10 +46,15 @@ public class EntityAIAnimation extends EntityAIBase { @Override public void updateTask() { - if (npc.stats.aimWhileShooting && npc.isAttacking()) { + if (npc.stats.aimType == 1 && npc.isAttacking()) { setAnimation(EnumAnimation.AIMING); return; } + if (npc.stats.aimType == 2 && npc.isAttacking() && npc.getRangedTask() != null && npc.getRangedTask().isShooting()) { + setAnimation(EnumAnimation.AIMING); + return; + } + EnumAnimation type = npc.ais.animationType; if (isDead) type = EnumAnimation.LYING; diff --git a/src/main/java/noppes/npcs/ai/EntityAIRangedAttack.java b/src/main/java/noppes/npcs/ai/EntityAIRangedAttack.java index 51f28f709..00c2eaaac 100644 --- a/src/main/java/noppes/npcs/ai/EntityAIRangedAttack.java +++ b/src/main/java/noppes/npcs/ai/EntityAIRangedAttack.java @@ -31,6 +31,7 @@ public class EntityAIRangedAttack extends EntityAIBase { private int attackTick = 0; private boolean hasFired = false; private boolean navOverride = false; + private boolean isShooting = false; public EntityAIRangedAttack(IRangedAttackMob par1IRangedAttackMob) { if (!(par1IRangedAttackMob instanceof EntityLivingBase)) { @@ -113,10 +114,12 @@ public class EntityAIRangedAttack extends EntityAIBase { if (var1 <= (double) field_82642_h && (this.entityHost.getEntitySenses().canSee(this.attackTarget) || this.entityHost.ais.canFireIndirect == 2)) { if (this.field_70846_g++ <= this.entityHost.stats.burstCount) { this.rangedAttackTime = this.entityHost.stats.fireRate; + this.isShooting = true; } else { this.field_70846_g = 0; this.hasFired = true; this.rangedAttackTime = (this.entityHost.stats.maxDelay - MathHelper.floor_float(this.entityHost.getRNG().nextFloat() * (this.entityHost.stats.maxDelay - this.entityHost.stats.minDelay))); + this.isShooting = false; } if (this.field_70846_g > 1) { @@ -143,6 +146,10 @@ public class EntityAIRangedAttack extends EntityAIBase { return this.hasFired; } + public boolean isShooting() { + return this.isShooting; + } + public void navOverride(boolean nav) { this.navOverride = nav; this.setMutexBits(this.navOverride ? AiMutex.PATHING : AiMutex.LOOK + AiMutex.PASSIVE); diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java b/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java index 5d376f9bf..bfe68f168 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiNpcRangeProperties.java @@ -61,7 +61,7 @@ public class SubGuiNpcRangeProperties extends SubGuiInterface implements ITextfi addLabel(new GuiNpcLabel(7, "stats.firesound:", guiLeft + 5, y + 5)); addButton(new GuiNpcButton(7, guiLeft + 187, y, 60, 20, "gui.select")); - addButton(new GuiNpcButtonYesNo(9, guiLeft + 100, y += 22, stats.aimWhileShooting)); + addButton(new GuiNpcButton(9, guiLeft + 100, y += 22, 70, 20, new String[]{"gui.no", "gui.yes", "stats.onShot"}, stats.aimType)); addLabel(new GuiNpcLabel(9, "stats.aimWhileShooting", guiLeft + 5, y + 5)); addButton(new GuiNpcButton(66, guiLeft + 190, guiTop + 190, 60, 20, "gui.done")); @@ -107,7 +107,7 @@ public class SubGuiNpcRangeProperties extends SubGuiInterface implements ITextfi if (id == 66) { close(); } else if (id == 9) { - stats.aimWhileShooting = ((GuiNpcButtonYesNo) guibutton).getBoolean(); + stats.aimType = (byte) ((GuiNpcButton) guibutton).getValue(); } } diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiScriptParticle.java b/src/main/java/noppes/npcs/client/gui/SubGuiScriptParticle.java index 056335dfe..95559b42a 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiScriptParticle.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiScriptParticle.java @@ -1,6 +1,7 @@ package noppes.npcs.client.gui; import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiTextField; import noppes.npcs.client.gui.util.*; import noppes.npcs.scripted.ScriptParticle; @@ -20,7 +21,6 @@ public class SubGuiScriptParticle extends SubGuiInterface implements ITextfieldL public void initGui() { super.initGui(); int y = guiTop + 10; - // Directory (long textfield) addLabel(new GuiNpcLabel(1, "display.texture", guiLeft + 5, y)); addTextField(new GuiNpcTextField(1, this, fontRendererObj, guiLeft + 70, y - 5, 260, 20, particle.directory)); @@ -104,4 +104,10 @@ public class SubGuiScriptParticle extends SubGuiInterface implements ITextfieldL close(); } } + + @Override + public void close(){ + GuiNpcTextField.unfocus(); + super.close(); + } } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java index 85830225b..8ffb84820 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptNpc.java @@ -519,11 +519,21 @@ public class ScriptNpc extends ScriptLiving imp } public boolean canAimWhileShooting() { - return !npc.stats.aimWhileShooting; + return npc.stats.aimType == 1; } - public void aimWhileShooting(boolean aimWhileShooting) { - npc.stats.aimWhileShooting = aimWhileShooting; + public void aimWhileShooting(boolean aimWhileShooting){ + npc.stats.aimType = (byte) (aimWhileShooting ? 1 : 0); + } + + public void setAimType(byte aimWhileShooting) { + if(aimWhileShooting < 0 || aimWhileShooting > 2) + return; + npc.stats.aimType = aimWhileShooting; + } + + public byte getAimType() { + return npc.stats.aimType; } public void setMinProjectileDelay(int minDelay) { diff --git a/src/main/resources/assets/customnpcs/lang/en_US.lang b/src/main/resources/assets/customnpcs/lang/en_US.lang index aeb6cf125..a8d264953 100644 --- a/src/main/resources/assets/customnpcs/lang/en_US.lang +++ b/src/main/resources/assets/customnpcs/lang/en_US.lang @@ -470,6 +470,7 @@ stats.stick=Sticks stats.regular=No Amp stats.amplified=Amp stats.explosion=Explosion +stats.onShot=On Shot ai.standing=Standing ai.wandering=Wandering