From 393abc08edb70fbb46f6dbdf936830a1044ae2bf Mon Sep 17 00:00:00 2001 From: Kam Date: Sat, 7 Mar 2026 15:30:11 -0500 Subject: [PATCH] Fix some Firing Script Behavior for Energy Projectiles --- src/api | 2 +- .../scripted/entity/ScriptEnergyBeam.java | 25 +-------- .../scripted/entity/ScriptEnergyDisc.java | 25 +-------- .../scripted/entity/ScriptEnergyLaser.java | 13 ++--- .../npcs/scripted/entity/ScriptEnergyOrb.java | 25 +-------- .../entity/ScriptEnergyProjectile.java | 54 +++++++++++++++---- .../scripted/entity/ScriptEnergySlicer.java | 25 +-------- 7 files changed, 56 insertions(+), 113 deletions(-) diff --git a/src/api b/src/api index 5eb98d172..6faa544f6 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit 5eb98d172eedfa0727e8ec9769bc2edad36a1ce4 +Subproject commit 6faa544f6f481690dfcbf55af130978a9402c35f diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyBeam.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyBeam.java index 787c27ee3..88dbdeadd 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyBeam.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyBeam.java @@ -3,7 +3,6 @@ package noppes.npcs.scripted.entity; import kamkeel.npcs.entity.EntityAbilityBeam; import net.minecraft.entity.EntityLivingBase; import noppes.npcs.api.entity.IEnergyBeam; -import noppes.npcs.api.entity.IEntity; import noppes.npcs.scripted.constants.EntityType; public class ScriptEnergyBeam extends ScriptEnergyProjectile implements IEnergyBeam { @@ -60,27 +59,7 @@ public class ScriptEnergyBeam extends ScriptEnergyP // ==================== FIRE ==================== @Override - public void fireAt(IEntity target) { - ensureSpawned(); - EntityLivingBase mcTarget = null; - if (target != null && target.getMCEntity() instanceof EntityLivingBase) { - mcTarget = (EntityLivingBase) target.getMCEntity(); - } - entity.startFiring(mcTarget); - } - - @Override - public void fireAt(double x, double y, double z) { - ensureSpawned(); - double dx = x - entity.posX; - double dy = y - entity.posY; - double dz = z - entity.posZ; - double len = Math.sqrt(dx * dx + dy * dy + dz * dz); - if (len > 0) { - entity.motionX = (dx / len) * entity.getSpeed(); - entity.motionY = (dy / len) * entity.getSpeed(); - entity.motionZ = (dz / len) * entity.getSpeed(); - } - entity.startFiring(null); + protected void launchFromOwner(EntityLivingBase target) { + entity.startFiring(target); } } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyDisc.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyDisc.java index 34ebb6305..66244c2fd 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyDisc.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyDisc.java @@ -3,7 +3,6 @@ package noppes.npcs.scripted.entity; import kamkeel.npcs.entity.EntityAbilityDisc; import net.minecraft.entity.EntityLivingBase; import noppes.npcs.api.entity.IEnergyDisc; -import noppes.npcs.api.entity.IEntity; import noppes.npcs.scripted.constants.EntityType; public class ScriptEnergyDisc extends ScriptEnergyProjectile implements IEnergyDisc { @@ -76,27 +75,7 @@ public class ScriptEnergyDisc extends ScriptEnergyP // ==================== FIRE ==================== @Override - public void fireAt(IEntity target) { - ensureSpawned(); - EntityLivingBase mcTarget = null; - if (target != null && target.getMCEntity() instanceof EntityLivingBase) { - mcTarget = (EntityLivingBase) target.getMCEntity(); - } - entity.startMoving(mcTarget); - } - - @Override - public void fireAt(double x, double y, double z) { - ensureSpawned(); - double dx = x - entity.posX; - double dy = y - entity.posY; - double dz = z - entity.posZ; - double len = Math.sqrt(dx * dx + dy * dy + dz * dz); - if (len > 0) { - entity.motionX = (dx / len) * entity.getSpeed(); - entity.motionY = (dy / len) * entity.getSpeed(); - entity.motionZ = (dz / len) * entity.getSpeed(); - } - entity.startMoving(null); + protected void launchFromOwner(EntityLivingBase target) { + entity.startMoving(target); } } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyLaser.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyLaser.java index eb6159bf5..485f1c666 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyLaser.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyLaser.java @@ -3,7 +3,6 @@ package noppes.npcs.scripted.entity; import kamkeel.npcs.entity.EntityAbilityLaser; import net.minecraft.entity.EntityLivingBase; import noppes.npcs.api.entity.IEnergyLaser; -import noppes.npcs.api.entity.IEntity; import noppes.npcs.scripted.constants.EntityType; public class ScriptEnergyLaser extends ScriptEnergyProjectile implements IEnergyLaser { @@ -92,18 +91,12 @@ public class ScriptEnergyLaser extends ScriptEnerg // ==================== FIRE ==================== @Override - public void fireAt(IEntity target) { - ensureSpawned(); - EntityLivingBase mcTarget = null; - if (target != null && target.getMCEntity() instanceof EntityLivingBase) { - mcTarget = (EntityLivingBase) target.getMCEntity(); - } - entity.startMoving(mcTarget); + protected void launchFromOwner(EntityLivingBase target) { + entity.startMoving(target); } @Override public void fireAt(double x, double y, double z) { - ensureSpawned(); double dx = x - entity.posX; double dy = y - entity.posY; double dz = z - entity.posZ; @@ -111,6 +104,6 @@ public class ScriptEnergyLaser extends ScriptEnerg if (len > 0) { entity.setDirection(dx / len, dy / len, dz / len); } - entity.startMoving(null); + ensureSpawned(); } } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyOrb.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyOrb.java index 3821190cb..af290b8b3 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyOrb.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyOrb.java @@ -3,7 +3,6 @@ package noppes.npcs.scripted.entity; import kamkeel.npcs.entity.EntityAbilityOrb; import net.minecraft.entity.EntityLivingBase; import noppes.npcs.api.entity.IEnergyOrb; -import noppes.npcs.api.entity.IEntity; import noppes.npcs.scripted.constants.EntityType; public class ScriptEnergyOrb extends ScriptEnergyProjectile implements IEnergyOrb { @@ -28,27 +27,7 @@ public class ScriptEnergyOrb extends ScriptEnergyPro } @Override - public void fireAt(IEntity target) { - ensureSpawned(); - EntityLivingBase mcTarget = null; - if (target != null && target.getMCEntity() instanceof EntityLivingBase) { - mcTarget = (EntityLivingBase) target.getMCEntity(); - } - entity.startMoving(mcTarget); - } - - @Override - public void fireAt(double x, double y, double z) { - ensureSpawned(); - double dx = x - entity.posX; - double dy = y - entity.posY; - double dz = z - entity.posZ; - double len = Math.sqrt(dx * dx + dy * dy + dz * dz); - if (len > 0) { - entity.motionX = (dx / len) * entity.getSpeed(); - entity.motionY = (dy / len) * entity.getSpeed(); - entity.motionZ = (dz / len) * entity.getSpeed(); - } - entity.startMoving(null); + protected void launchFromOwner(EntityLivingBase target) { + entity.startMoving(target); } } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyProjectile.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyProjectile.java index a4ca6697b..2397f2a2e 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyProjectile.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyProjectile.java @@ -1,7 +1,6 @@ package noppes.npcs.scripted.entity; import kamkeel.npcs.entity.EntityEnergyProjectile; -import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import noppes.npcs.EventHooks; import noppes.npcs.api.entity.IEnergyProjectile; @@ -261,8 +260,14 @@ public class ScriptEnergyProjectile extends Sc public void fireAt(IEntity target) { if (target != null) { - Entity mcTarget = target.getMCEntity(); - setMotionToward(mcTarget.posX, mcTarget.posY + mcTarget.getEyeHeight(), mcTarget.posZ); + EntityLivingBase living = resolveLivingTarget(target); + if (living != null) { + entity.setTargetEntityId(living.getEntityId()); + setMotionToward(living.posX, living.posY + living.getEyeHeight(), living.posZ); + } else { + net.minecraft.entity.Entity mcTarget = target.getMCEntity(); + setMotionToward(mcTarget.posX, mcTarget.posY + mcTarget.getEyeHeight(), mcTarget.posZ); + } } ensureSpawned(); } @@ -273,24 +278,22 @@ public class ScriptEnergyProjectile extends Sc } public void fireDirection(float yaw, float pitch) { - float yawRad = (float) Math.toRadians(yaw); - float pitchRad = (float) Math.toRadians(pitch); - entity.motionX = -Math.sin(yawRad) * Math.cos(pitchRad) * entity.getSpeed(); - entity.motionY = -Math.sin(pitchRad) * entity.getSpeed(); - entity.motionZ = Math.cos(yawRad) * Math.cos(pitchRad) * entity.getSpeed(); + setMotionFromDirection(yaw, pitch); ensureSpawned(); } public void fireFrom(IEntityLivingBase caster) { if (caster == null) return; initFromCaster(caster); - fireDirection(caster.getRotation(), caster.getPitch()); + launchFromOwner(null); + ensureSpawned(); } public void fireFrom(IEntityLivingBase caster, IEntity target) { if (caster == null) return; initFromCaster(caster); - fireAt(target); + launchFromOwner(resolveLivingTarget(target)); + ensureSpawned(); } /** @@ -304,6 +307,37 @@ public class ScriptEnergyProjectile extends Sc entity.setStartPosition(mc.posX, eyeY, mc.posZ); } + /** + * Hook for subclasses to call their entity's full launch sequence (startMoving/startFiring). + * Called by fireFrom methods — handles look-vector snap, charge exit, homing init, etc. + * Default: sets motion toward target, or along owner's look direction if target is null. + */ + protected void launchFromOwner(EntityLivingBase target) { + if (target != null) { + setMotionToward(target.posX, target.posY + target.getEyeHeight(), target.posZ); + } else { + net.minecraft.entity.Entity owner = entity.getOwnerEntity(); + if (owner != null) { + setMotionFromDirection(owner.rotationYaw, owner.rotationPitch); + } + } + } + + private void setMotionFromDirection(float yaw, float pitch) { + float yawRad = (float) Math.toRadians(yaw); + float pitchRad = (float) Math.toRadians(pitch); + entity.motionX = -Math.sin(yawRad) * Math.cos(pitchRad) * entity.getSpeed(); + entity.motionY = -Math.sin(pitchRad) * entity.getSpeed(); + entity.motionZ = Math.cos(yawRad) * Math.cos(pitchRad) * entity.getSpeed(); + } + + protected static EntityLivingBase resolveLivingTarget(IEntity target) { + if (target != null && target.getMCEntity() instanceof EntityLivingBase) { + return (EntityLivingBase) target.getMCEntity(); + } + return null; + } + /** * Calculates and sets motion from the projectile's current position toward a target point. */ diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergySlicer.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergySlicer.java index 7614939dd..42ea79203 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergySlicer.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergySlicer.java @@ -3,7 +3,6 @@ package noppes.npcs.scripted.entity; import kamkeel.npcs.entity.EntityEnergySlicer; import net.minecraft.entity.EntityLivingBase; import noppes.npcs.api.entity.IEnergySlicer; -import noppes.npcs.api.entity.IEntity; import noppes.npcs.scripted.constants.EntityType; public class ScriptEnergySlicer extends ScriptEnergyProjectile implements IEnergySlicer { @@ -48,27 +47,7 @@ public class ScriptEnergySlicer extends ScriptEner // ==================== FIRE ==================== @Override - public void fireAt(IEntity target) { - ensureSpawned(); - EntityLivingBase mcTarget = null; - if (target != null && target.getMCEntity() instanceof EntityLivingBase) { - mcTarget = (EntityLivingBase) target.getMCEntity(); - } - entity.startMoving(mcTarget); - } - - @Override - public void fireAt(double x, double y, double z) { - ensureSpawned(); - double dx = x - entity.posX; - double dy = y - entity.posY; - double dz = z - entity.posZ; - double len = Math.sqrt(dx * dx + dy * dy + dz * dz); - if (len > 0) { - entity.motionX = (dx / len) * entity.getSpeed(); - entity.motionY = (dy / len) * entity.getSpeed(); - entity.motionZ = (dz / len) * entity.getSpeed(); - } - entity.startMoving(null); + protected void launchFromOwner(EntityLivingBase target) { + entity.startMoving(target); } }