From 2e21b36796b7850ff6ff759811c93089e71eb57d Mon Sep 17 00:00:00 2001 From: Kam Date: Sun, 8 Mar 2026 15:39:06 -0400 Subject: [PATCH] Fix Beam and Laser Scripting --- .../npcs/entity/EntityAbilityLaser.java | 14 ++++++++++++- .../scripted/entity/ScriptEnergyBeam.java | 19 +++++++++++++++++ .../scripted/entity/ScriptEnergyLaser.java | 21 +++++++++++++++++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java b/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java index e0a1a24d3..679fbdb84 100644 --- a/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java +++ b/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java @@ -40,6 +40,7 @@ public class EntityAbilityLaser extends EntityEnergyProjectile { private float desiredLength = 0.0f; // Intended beam reach (grows to maxLength) private float currentLength = 0.0f; // Actual length after block truncation (visual + collision) private boolean fullyExtended = false; + private boolean trackOwnerOrigin = true; // When false, laser fires independently (fireAt mode) // Direction (normalized) private double dirX, dirY, dirZ; @@ -158,7 +159,8 @@ public class EntityAbilityLaser extends EntityEnergyProjectile { // Origin/direction tracking runs on BOTH sides so the client can render the beam. // Once reflected, never resume owner-tracking — the laser flies in a fixed direction. - if (!reflected) { + // When trackOwnerOrigin is false (fireAt mode), skip owner tracking entirely. + if (!reflected && trackOwnerOrigin) { updateLaserOriginAndDirection(); } @@ -727,6 +729,14 @@ public class EntityAbilityLaser extends EntityEnergyProjectile { this.dirZ = z; } + public boolean isTrackOwnerOrigin() { + return trackOwnerOrigin; + } + + public void setTrackOwnerOrigin(boolean track) { + this.trackOwnerOrigin = track; + } + public float getCurrentLength() { return currentLength; } @@ -868,6 +878,7 @@ public class EntityAbilityLaser extends EntityEnergyProjectile { this.desiredLength = nbt.getFloat("DesiredLength"); this.currentLength = nbt.getFloat("CurrentLength"); this.fullyExtended = nbt.getBoolean("FullyExtended"); + this.trackOwnerOrigin = !nbt.hasKey("TrackOwnerOrigin") || nbt.getBoolean("TrackOwnerOrigin"); this.endX = nbt.getDouble("EndX"); this.endY = nbt.getDouble("EndY"); this.endZ = nbt.getDouble("EndZ"); @@ -886,6 +897,7 @@ public class EntityAbilityLaser extends EntityEnergyProjectile { nbt.setFloat("DesiredLength", desiredLength); nbt.setFloat("CurrentLength", currentLength); nbt.setBoolean("FullyExtended", fullyExtended); + nbt.setBoolean("TrackOwnerOrigin", trackOwnerOrigin); nbt.setDouble("EndX", endX); nbt.setDouble("EndY", endY); nbt.setDouble("EndZ", endZ); diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyBeam.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyBeam.java index 88dbdeadd..f937663e0 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyBeam.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyBeam.java @@ -3,6 +3,7 @@ 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 { @@ -62,4 +63,22 @@ public class ScriptEnergyBeam extends ScriptEnergyP protected void launchFromOwner(EntityLivingBase target) { entity.startFiring(target); } + + @Override + public void fireAt(IEntity target) { + entity.setAttachedToOwner(false); + super.fireAt(target); + } + + @Override + public void fireAt(double x, double y, double z) { + entity.setAttachedToOwner(false); + super.fireAt(x, y, z); + } + + @Override + public void fireDirection(float yaw, float pitch) { + entity.setAttachedToOwner(false); + super.fireDirection(yaw, pitch); + } } diff --git a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyLaser.java b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyLaser.java index 485f1c666..4f8bcbcd5 100644 --- a/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyLaser.java +++ b/src/main/java/noppes/npcs/scripted/entity/ScriptEnergyLaser.java @@ -3,6 +3,7 @@ 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 { @@ -95,8 +96,15 @@ public class ScriptEnergyLaser extends ScriptEnerg entity.startMoving(target); } + @Override + public void fireAt(IEntity target) { + entity.setTrackOwnerOrigin(false); + super.fireAt(target); + } + @Override public void fireAt(double x, double y, double z) { + entity.setTrackOwnerOrigin(false); double dx = x - entity.posX; double dy = y - entity.posY; double dz = z - entity.posZ; @@ -106,4 +114,17 @@ public class ScriptEnergyLaser extends ScriptEnerg } ensureSpawned(); } + + @Override + public void fireDirection(float yaw, float pitch) { + entity.setTrackOwnerOrigin(false); + float yawRad = (float) Math.toRadians(yaw); + float pitchRad = (float) Math.toRadians(pitch); + entity.setDirection( + -Math.sin(yawRad) * Math.cos(pitchRad), + -Math.sin(pitchRad), + Math.cos(yawRad) * Math.cos(pitchRad) + ); + ensureSpawned(); + } }