Fix Beam and Laser Scripting

This commit is contained in:
Kam committed 2026-03-08 15:39:06 -04:00
1 parent f546bd72b8
commit 2e21b36796
3 files changed
+53 -1

No files matched your search

@@ -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);
@@ -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<T extends EntityAbilityBeam> extends ScriptEnergyProjectile<T> implements IEnergyBeam {
@@ -62,4 +63,22 @@ public class ScriptEnergyBeam<T extends EntityAbilityBeam> 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);
}
}
@@ -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<T extends EntityAbilityLaser> extends ScriptEnergyProjectile<T> implements IEnergyLaser {
@@ -95,8 +96,15 @@ public class ScriptEnergyLaser<T extends EntityAbilityLaser> 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<T extends EntityAbilityLaser> 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();
}
}