From 6ea7d0ac7dfca02a2dc6355c4f9919b1918c74b9 Mon Sep 17 00:00:00 2001 From: Vidal Date: Tue, 3 Feb 2026 21:26:27 -0300 Subject: [PATCH] More trajectory changes --- src/api | 2 +- .../ability/data/EnergyTrajectoryData.java | 126 +++++++++++------- .../data/ability/type/AbilityBeam.java | 15 ++- .../data/ability/type/AbilityBeamDual.java | 49 ++++--- .../data/ability/type/AbilityDisc.java | 15 ++- .../data/ability/type/AbilityDiscDual.java | 49 ++++--- .../data/ability/type/AbilityLaserShot.java | 3 +- .../data/ability/type/AbilityOrb.java | 39 +++--- .../data/ability/type/AbilityOrbBarrage.java | 8 +- .../data/ability/type/AbilityOrbDual.java | 41 +++--- .../npcs/entity/EntityAbilityBeam.java | 4 +- .../npcs/entity/EntityAbilityDisc.java | 4 +- .../npcs/entity/EntityAbilityLaser.java | 4 +- .../kamkeel/npcs/entity/EntityAbilityOrb.java | 8 +- .../npcs/entity/EntityAbilityProjectile.java | 13 +- .../java/noppes/npcs/items/ItemStaff.java | 3 +- 16 files changed, 224 insertions(+), 159 deletions(-) diff --git a/src/api b/src/api index d70aefdd4..49ffa6a20 160000 --- a/src/api +++ b/src/api @@ -1 +1 @@ -Subproject commit d70aefdd44dfeb227684f3dbb73954a8b11008d3 +Subproject commit 49ffa6a2085e4f60e5eefa8f38afe08843b33af5 diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/data/EnergyTrajectoryData.java b/src/main/java/kamkeel/npcs/controllers/data/ability/data/EnergyTrajectoryData.java index 245b8da1d..6590598cf 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/data/EnergyTrajectoryData.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/data/EnergyTrajectoryData.java @@ -1,11 +1,14 @@ package kamkeel.npcs.controllers.data.ability.data; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.Vec3; +import net.minecraftforge.common.util.Constants; import noppes.npcs.api.IPos; import noppes.npcs.api.ability.data.IEnergyTrajectoryData; -import noppes.npcs.scripted.NpcAPI; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.function.BiConsumer; @@ -43,15 +46,15 @@ public class EnergyTrajectoryData implements IEnergyTrajectoryData { } @Override - public IPos getPos(int path) { + public boolean isConcluded(int path) { IPath p = getPath(path); - return p == null ? null : p.getPos(); + return p != null && p.isConcluded(); } @Override - public void setPos(int path, IPos pos) { + public void setConcluded(int path, boolean concluded) { IPath p = getPath(path); - if (p != null) p.setPos(pos); + if (p != null) p.setConcluded(concluded); } @Override @@ -94,16 +97,6 @@ public class EnergyTrajectoryData implements IEnergyTrajectoryData { return trajectory.get(path); } - @Override - public void setPath(int path, IPos pos) { - setPath(path, pos, 0); - } - - @Override - public void setPath(int path, IPos pos, int delay) { - setPath(path, pos.getX(), pos.getY(), pos.getZ(), delay); - } - @Override public void setPath(int path, double x, double y, double z) { setPath(path, x, y, z, 0); @@ -111,10 +104,7 @@ public class EnergyTrajectoryData implements IEnergyTrajectoryData { @Override public void setPath(int path, double x, double y, double z, int delay) { - Path newPath = new Path( - NpcAPI.Instance().getIPos(x, y, z), - delay - ); + Path newPath = new Path(x, y, z, delay); while (trajectory.size() <= path) { trajectory.add(null); @@ -123,16 +113,6 @@ public class EnergyTrajectoryData implements IEnergyTrajectoryData { trajectory.set(path, newPath); } - @Override - public IPath createPath(IPos pos) { - return new Path(pos, 0); - } - - @Override - public IPath createPath(IPos pos, int delay) { - return new Path(pos, delay); - } - @Override public IPath createPath(double x, double y, double z) { return createPath(x, y, z, 0); @@ -140,7 +120,7 @@ public class EnergyTrajectoryData implements IEnergyTrajectoryData { @Override public IPath createPath(double x, double y, double z, int delay) { - return new Path(NpcAPI.Instance().getIPos(x, y, z), delay); + return new Path(x, y, z, delay); } @Override @@ -150,25 +130,44 @@ public class EnergyTrajectoryData implements IEnergyTrajectoryData { } } + public void writeNBT(NBTTagCompound nbt) { + nbt.setInteger("currentPath", currentPath); + + for (int i = 0; i < trajectory.size(); i++) { + Path path = trajectory.get(i); + NBTTagCompound pathNbt = new NBTTagCompound(); + path.writeNBT(pathNbt); + nbt.setTag("Path_" + i, pathNbt); + } + } + + public void readNBT(NBTTagCompound nbt) { + this.currentPath = nbt.hasKey("currentPath") ? nbt.getInteger("currentPath") : 0; + + int i = 0; + while (nbt.hasKey("Path_" + i, Constants.NBT.TAG_COMPOUND)) { + NBTTagCompound pathNbt = nbt.getCompoundTag("Path_" + i); + Path path = (Path) createPath(0, 0, 0); + path.readNBT(pathNbt); + trajectory.add(path); + i++; + } + } + + public EnergyTrajectoryData copy() { + return new EnergyTrajectoryData(currentPath, Collections.singletonList(trajectory).toArray(trajectory.toArray(new Path[0]))); + } + public static class Path implements IEnergyTrajectoryData.IPath{ - public IPos pos; + public Vec3 pos; public int delayTicks; + public boolean concluded; - public Path(IPos pos, int delayTicks) { - this.pos = pos; + public Path(double x, double y, double z, int delayTicks) { + this.pos = Vec3.createVectorHelper(x,y,z); this.delayTicks = delayTicks; } - @Override - public IPos getPos() { - return pos; - } - - @Override - public void setPos(IPos pos) { - this.pos = pos; - } - @Override public int getDelay() { return delayTicks; @@ -179,34 +178,63 @@ public class EnergyTrajectoryData implements IEnergyTrajectoryData { this.delayTicks = delayTicks; } + @Override + public boolean isConcluded() { + return concluded; + } + + @Override + public void setConcluded(boolean concluded) { + this.concluded = concluded; + } + @Override public double getX() { - return pos.getX(); + return pos.xCoord; } @Override public void setX(double x) { - this.pos = NpcAPI.Instance().getIPos(x, getY(), getZ()); + this.pos.xCoord = x; } @Override public double getY() { - return pos.getY(); + return pos.yCoord; } @Override public void setY(double y) { - this.pos = NpcAPI.Instance().getIPos(getX(), y, getZ()); + this.pos.yCoord = y; } @Override public double getZ() { - return pos.getZ(); + return pos.zCoord; } @Override public void setZ(double z) { - this.pos = NpcAPI.Instance().getIPos(pos.getX(), pos.getY(), z); + this.pos.zCoord = z; + } + + public void writeNBT(NBTTagCompound nbt) { + nbt.setInteger("delay", delayTicks); + nbt.setBoolean("concluded", concluded); + nbt.setDouble("X", getX()); + nbt.setDouble("Y", getY()); + nbt.setDouble("Z", getZ()); + } + + public void readNBT(NBTTagCompound nbt) { + this.delayTicks = nbt.hasKey("delay") ? nbt.getInteger("delay") : 0; + this.concluded = nbt.hasKey("concluded") && nbt.getBoolean("concluded"); + + double x = nbt.getDouble("X"); + double y = nbt.getDouble("Y"); + double z = nbt.getDouble("Z"); + + this.pos = Vec3.createVectorHelper(x, y, z); } } } diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityBeam.java b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityBeam.java index 211a76230..495d0bdef 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityBeam.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityBeam.java @@ -37,12 +37,13 @@ public class AbilityBeam extends Ability implements IAbilityEnergyBeam { private float headSize = 0.6f; // Data classes - private EnergyDisplayData colorData = new EnergyDisplayData(0xFFFFFF, 0x00AAFF, true, 0.4f, 0.5f, 6.0f); - private EnergyCombatData combatData = new EnergyCombatData(10.0f, 1.5f, 0.2f, false, 4.0f, 0.5f); - private EnergyHomingData homingData = new EnergyHomingData(0.4f, true, 0.1f, 15.0f); - private EnergyLightningData lightningData = new EnergyLightningData(); - private EnergyLifespanData lifespanData = new EnergyLifespanData(25.0f, 200); - private EnergyAnchorData anchorData = new EnergyAnchorData(AnchorPoint.RIGHT_HAND); + private final EnergyDisplayData colorData = new EnergyDisplayData(0xFFFFFF, 0x00AAFF, true, 0.4f, 0.5f, 6.0f); + private final EnergyCombatData combatData = new EnergyCombatData(10.0f, 1.5f, 0.2f, false, 4.0f, 0.5f); + private final EnergyHomingData homingData = new EnergyHomingData(0.4f, true, 0.1f, 15.0f); + private final EnergyLightningData lightningData = new EnergyLightningData(); + private final EnergyLifespanData lifespanData = new EnergyLifespanData(25.0f, 200); + private final EnergyAnchorData anchorData = new EnergyAnchorData(AnchorPoint.RIGHT_HAND); + private final EnergyTrajectoryData trajectoryData = new EnergyTrajectoryData(); // Transient state for beam entity (used during windup charging) private transient EntityAbilityBeam beamEntity = null; @@ -103,7 +104,7 @@ public class AbilityBeam extends Ability implements IAbilityEnergyBeam { world, caster, target, spawnPos.xCoord, spawnPos.yCoord, spawnPos.zCoord, beamWidth, headSize, - colorData, combatData, homingData, lightningData, lifespanData, + colorData, combatData, homingData, lightningData, lifespanData, trajectoryData, lockMovement.locksActive()); beamEntity.setupCharging(anchorData, windUpTicks, offsetDist); diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityBeamDual.java b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityBeamDual.java index fb7478da1..bc09d4979 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityBeamDual.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityBeamDual.java @@ -32,19 +32,22 @@ public class AbilityBeamDual extends Ability { private int dualFireDelay = 0; // Data classes - private EnergyDisplayData[] colorData = new EnergyDisplayData[]{ + private final EnergyDisplayData[] displayData = new EnergyDisplayData[]{ new EnergyDisplayData(0xFFFFFF, 0x00AAFF, true, 0.4f, 0.5f, 6.0f), new EnergyDisplayData(0xFFFFFF, 0xFF0000, true, 0.4f, 0.5f, 6.0f), }; - private EnergyCombatData combatData = new EnergyCombatData(10.0f, 1.5f, 0.2f, false, 4.0f, 0.5f); - private EnergyHomingData homingData = new EnergyHomingData(0.4f, true, 0.1f, 15.0f); - private EnergyLightningData[] lightningData = new EnergyLightningData[]{ + private final EnergyCombatData combatData = new EnergyCombatData(10.0f, 1.5f, 0.2f, false, 4.0f, 0.5f); + private final EnergyHomingData homingData = new EnergyHomingData(0.4f, true, 0.1f, 15.0f); + private final EnergyLightningData[] lightningData = new EnergyLightningData[]{ new EnergyLightningData(), new EnergyLightningData() }; - private EnergyLifespanData lifespanData = new EnergyLifespanData(25.0f, 200); - private EnergyAnchorData[] anchorData = new EnergyAnchorData[]{ + private final EnergyLifespanData lifespanData = new EnergyLifespanData(25.0f, 200); + private final EnergyAnchorData[] anchorData = new EnergyAnchorData[]{ new EnergyAnchorData(AnchorPoint.RIGHT_HAND), new EnergyAnchorData(AnchorPoint.LEFT_HAND) }; + private final EnergyTrajectoryData[] trajectoryData = new EnergyTrajectoryData[]{ + new EnergyTrajectoryData(), new EnergyTrajectoryData() + }; // Transient state for beam entity (used during windup charging) private transient EntityAbilityBeam beamEntity = null; @@ -114,7 +117,7 @@ public class AbilityBeamDual extends Ability { world, caster, target, spawnPos1.xCoord, spawnPos1.yCoord, spawnPos1.zCoord, beamWidth, headSize, - colorData[0], combatData, homingData, lightningData[0], lifespanData, + displayData[0], combatData, homingData, lightningData[0], lifespanData, trajectoryData[0], lockMovement.locksActive()); Vec3 spawnPos2 = AnchorPointHelper.calculateAnchorPosition(caster, anchorData[1], offsetDist); @@ -122,7 +125,7 @@ public class AbilityBeamDual extends Ability { world, caster, target, spawnPos2.xCoord, spawnPos2.yCoord, spawnPos2.zCoord, beamWidth, headSize, - colorData[1], combatData, homingData, lightningData[1], lifespanData, + displayData[1], combatData, homingData, lightningData[1], lifespanData, trajectoryData[1], lockMovement.locksActive()); beamEntity.setSiblingEntityId(beamEntity2.getEntityId()); @@ -219,12 +222,13 @@ public class AbilityBeamDual extends Ability { NBTTagCompound beam1 = new NBTTagCompound(); NBTTagCompound beam2 = new NBTTagCompound(); - anchorData[0].writeNBT(beam1); - anchorData[1].writeNBT(beam2); - colorData[0].writeNBT(beam1); - colorData[1].writeNBT(beam2); - lightningData[0].writeNBT(beam1); - lightningData[1].writeNBT(beam2); + for (int i = 0; i < 2; i++) { + NBTTagCompound beam = i == 0 ? beam1 : beam2; + anchorData[i].writeNBT(beam); + displayData[i].writeNBT(beam); + lightningData[i].writeNBT(beam); + trajectoryData[i].writeNBT(beam); + } nbt.setTag("Beam_1", beam1); nbt.setTag("Beam_2", beam2); @@ -243,12 +247,13 @@ public class AbilityBeamDual extends Ability { homingData.readNBT(nbt); lifespanData.readNBT(nbt); - anchorData[0].readNBT(beam1); - anchorData[1].readNBT(beam2); - colorData[0].readNBT(beam1); - colorData[1].readNBT(beam2); - lightningData[0].readNBT(beam1); - lightningData[1].readNBT(beam2); + for (int i = 0; i < 2; i++) { + NBTTagCompound beam = i == 0 ? beam1 : beam2; + anchorData[i].readNBT(beam); + displayData[i].readNBT(beam); + lightningData[i].readNBT(beam); + trajectoryData[i].readNBT(beam); + } } // Getters & Setters - Standalone fields @@ -263,7 +268,7 @@ public class AbilityBeamDual extends Ability { private EnergyDisplayData getColorData(int beam) { beam = ValueUtil.clamp(beam, 0, 1); - return colorData[beam]; + return displayData[beam]; } private EnergyLightningData getLightningData(int beam) { beam = ValueUtil.clamp(beam, 0, 1); @@ -494,7 +499,7 @@ public class AbilityBeamDual extends Ability { if (npc == null || npc.worldObj == null) return null; EntityAbilityBeam beam = new EntityAbilityBeam(npc.worldObj); - beam.setupPreview(npc, beamWidth, headSize, colorData[0], lightningData[0], anchorData[0], windUpTicks, 1.0f); + beam.setupPreview(npc, beamWidth, headSize, displayData[0], lightningData[0], anchorData[0], windUpTicks, 1.0f); return beam; } diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDisc.java b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDisc.java index 4746b6ccd..f70e44ccb 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDisc.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDisc.java @@ -40,12 +40,13 @@ public class AbilityDisc extends Ability implements IAbilityDisc { private int boomerangDelay = 40; // Energy data classes - private EnergyDisplayData colorData = new EnergyDisplayData(0xFFFFFF, 0xFF8800, true, 0.4f, 0.5f, 5.0f); - private EnergyCombatData combatData = new EnergyCombatData(8.0f, 1.2f, 0.15f, false, 3.0f, 0.5f); - private EnergyHomingData homingData = new EnergyHomingData(0.6f, true, 0.12f, 18.0f); - private EnergyLightningData lightningData = new EnergyLightningData(); - private EnergyLifespanData lifespanData = new EnergyLifespanData(35.0f, 200); - private EnergyAnchorData anchorData = new EnergyAnchorData(AnchorPoint.RIGHT_HAND); + private final EnergyDisplayData colorData = new EnergyDisplayData(0xFFFFFF, 0xFF8800, true, 0.4f, 0.5f, 5.0f); + private final EnergyCombatData combatData = new EnergyCombatData(8.0f, 1.2f, 0.15f, false, 3.0f, 0.5f); + private final EnergyHomingData homingData = new EnergyHomingData(0.6f, true, 0.12f, 18.0f); + private final EnergyLightningData lightningData = new EnergyLightningData(); + private final EnergyLifespanData lifespanData = new EnergyLifespanData(35.0f, 200); + private final EnergyAnchorData anchorData = new EnergyAnchorData(AnchorPoint.RIGHT_HAND); + private final EnergyTrajectoryData trajectoryData = new EnergyTrajectoryData(); // Transient state for disc entity (used during windup charging) private transient EntityAbilityDisc discEntity = null; @@ -104,7 +105,7 @@ public class AbilityDisc extends Ability implements IAbilityDisc { world, caster, target, spawnPos.xCoord, spawnPos.yCoord, spawnPos.zCoord, discRadius, discThickness, - colorData, combatData, homingData, lightningData, lifespanData, + colorData, combatData, homingData, lightningData, lifespanData, trajectoryData, boomerang, boomerangDelay); discEntity.setupCharging(anchorData, windUpTicks); diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDiscDual.java b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDiscDual.java index 33009f982..a4e2cda4a 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDiscDual.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityDiscDual.java @@ -40,19 +40,22 @@ public class AbilityDiscDual extends Ability { private int dualFireDelay = 10; // Energy data classes - private EnergyDisplayData[] colorData = new EnergyDisplayData[]{ + private final EnergyDisplayData[] displayData = new EnergyDisplayData[]{ new EnergyDisplayData(0xFFFFFF, 0xFF8800, true, 0.4f, 0.5f, 5.0f), new EnergyDisplayData(0xFFFFFF, 0x8800FF, true, 0.4f, 0.5f, 5.0f) }; - private EnergyCombatData combatData = new EnergyCombatData(8.0f, 1.2f, 0.15f, false, 3.0f, 0.5f); - private EnergyHomingData homingData = new EnergyHomingData(0.6f, true, 0.12f, 18.0f); - public final EnergyLightningData[] lightningData = new EnergyLightningData[]{ + private final EnergyCombatData combatData = new EnergyCombatData(8.0f, 1.2f, 0.15f, false, 3.0f, 0.5f); + private final EnergyHomingData homingData = new EnergyHomingData(0.6f, true, 0.12f, 18.0f); + private final EnergyLightningData[] lightningData = new EnergyLightningData[]{ new EnergyLightningData(), new EnergyLightningData() }; - private EnergyLifespanData lifespanData = new EnergyLifespanData(35.0f, 200); - private EnergyAnchorData[] anchorData = new EnergyAnchorData[]{ + private final EnergyLifespanData lifespanData = new EnergyLifespanData(35.0f, 200); + private final EnergyAnchorData[] anchorData = new EnergyAnchorData[]{ new EnergyAnchorData(AnchorPoint.LEFT_HAND), new EnergyAnchorData(AnchorPoint.RIGHT_HAND) }; + private final EnergyTrajectoryData[] trajectoryData = new EnergyTrajectoryData[]{ + new EnergyTrajectoryData(), new EnergyTrajectoryData() + }; // Transient state for disc entity (used during windup charging) private transient EntityAbilityDisc discEntity = null; @@ -120,7 +123,7 @@ public class AbilityDiscDual extends Ability { world, caster, target, spawnPos1.xCoord, spawnPos1.yCoord, spawnPos1.zCoord, discRadius, discThickness, - colorData[0], combatData, homingData, lightningData[0], lifespanData, + displayData[0], combatData, homingData, lightningData[0], lifespanData, trajectoryData[0], boomerang, boomerangDelay); Vec3 spawnPos2 = AnchorPointHelper.calculateAnchorPosition(caster, anchorData[1]); @@ -128,7 +131,7 @@ public class AbilityDiscDual extends Ability { world, caster, target, spawnPos2.xCoord, spawnPos2.yCoord, spawnPos2.zCoord, discRadius, discThickness, - colorData[1], combatData, homingData, lightningData[1], lifespanData, + displayData[1], combatData, homingData, lightningData[1], lifespanData, trajectoryData[1], boomerang, boomerangDelay); discEntity.setSiblingEntityId(discEntity2.getEntityId()); @@ -230,12 +233,13 @@ public class AbilityDiscDual extends Ability { NBTTagCompound disc1 = new NBTTagCompound(); NBTTagCompound disc2 = new NBTTagCompound(); - anchorData[0].writeNBT(disc1); - anchorData[1].writeNBT(disc2); - colorData[0].writeNBT(disc1); - colorData[1].writeNBT(disc2); - lightningData[0].writeNBT(disc1); - lightningData[1].writeNBT(disc2); + for (int i = 0; i < 2; i++) { + NBTTagCompound disc = i == 0 ? disc1 : disc2; + anchorData[i].writeNBT(disc); + displayData[i].writeNBT(disc); + lightningData[i].writeNBT(disc); + trajectoryData[i].writeNBT(disc); + } nbt.setTag("Disc_1", disc1); nbt.setTag("Disc_2", disc2); @@ -256,18 +260,19 @@ public class AbilityDiscDual extends Ability { homingData.readNBT(nbt); lifespanData.readNBT(nbt); - anchorData[0].readNBT(disc1); - anchorData[1].readNBT(disc2); - colorData[0].readNBT(disc1); - colorData[1].readNBT(disc2); - lightningData[0].readNBT(disc1); - lightningData[1].readNBT(disc2); + for (int i = 0; i < 2; i++) { + NBTTagCompound disc = i == 0 ? disc1 : disc2; + anchorData[i].readNBT(disc); + displayData[i].readNBT(disc); + lightningData[i].readNBT(disc); + trajectoryData[i].readNBT(disc); + } } // Getters & Setters private EnergyDisplayData getColorData(int orb) { orb = ValueUtil.clamp(orb, 0, 1); - return colorData[orb]; + return displayData[orb]; } private EnergyLightningData getLightningData(int orb) { orb = ValueUtil.clamp(orb, 0, 1); @@ -504,7 +509,7 @@ public class AbilityDiscDual extends Ability { if (npc == null || npc.worldObj == null) return null; EntityAbilityDisc disc = new EntityAbilityDisc(npc.worldObj); - disc.setupPreview(npc, discRadius, discThickness, colorData[0], lightningData[0], anchorData[0], windUpTicks); + disc.setupPreview(npc, discRadius, discThickness, displayData[0], lightningData[0], anchorData[0], windUpTicks); return disc; } diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityLaserShot.java b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityLaserShot.java index 223eb2e10..13733cf5c 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityLaserShot.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityLaserShot.java @@ -41,6 +41,7 @@ public class AbilityLaserShot extends Ability implements IAbilityLaserShot { private final EnergyLightningData lightningData = new EnergyLightningData(); private final EnergyLifespanData lifespanData = new EnergyLifespanData(40.0f, 100); private final EnergyAnchorData anchorData = new EnergyAnchorData(AnchorPoint.RIGHT_HAND); + private final EnergyTrajectoryData trajectoryData = new EnergyTrajectoryData(); // Transient state for laser entity (used for movement locking) private transient EntityAbilityLaser laserEntity = null; @@ -91,7 +92,7 @@ public class AbilityLaserShot extends Ability implements IAbilityLaserShot { world, caster, target, spawnPos.xCoord, spawnPos.yCoord, spawnPos.zCoord, laserWidth, - colorData, combatData, lightningData, lifespanData, + colorData, combatData, lightningData, lifespanData, trajectoryData, expansionSpeed, lingerTicks ); diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrb.java b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrb.java index db267fe59..e3ae6c228 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrb.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrb.java @@ -36,12 +36,13 @@ public class AbilityOrb extends Ability implements IAbilityOrb { private float orbSize = 1.0f; // Data classes for energy properties - private final EnergyDisplayData colorData = new EnergyDisplayData(); + private final EnergyAnchorData anchorData = new EnergyAnchorData(AnchorPoint.RIGHT_HAND); private final EnergyCombatData combatData = new EnergyCombatData(); + private final EnergyDisplayData displayData = new EnergyDisplayData(); private final EnergyHomingData homingData = new EnergyHomingData(); private final EnergyLightningData lightningData = new EnergyLightningData(); private final EnergyLifespanData lifespanData = new EnergyLifespanData(); - private final EnergyAnchorData anchorData = new EnergyAnchorData(AnchorPoint.RIGHT_HAND); + private final EnergyTrajectoryData trajectoryData = new EnergyTrajectoryData(); // Transient state for orb entity (used during windup charging) private transient EntityAbilityOrb orbEntity = null; @@ -99,7 +100,7 @@ public class AbilityOrb extends Ability implements IAbilityOrb { orbEntity = new EntityAbilityOrb( world, caster, target, spawnPos.xCoord, spawnPos.yCoord, spawnPos.zCoord, orbSize, - colorData, combatData, homingData, lightningData, lifespanData); + displayData, combatData, homingData, lightningData, lifespanData, trajectoryData); orbEntity.setupCharging(anchorData, windUpTicks); orbEntity.setEffects(this.effects); @@ -161,11 +162,12 @@ public class AbilityOrb extends Ability implements IAbilityOrb { public void writeTypeNBT(NBTTagCompound nbt) { nbt.setFloat("orbSize", orbSize); anchorData.writeNBT(nbt); - colorData.writeNBT(nbt); combatData.writeNBT(nbt); + displayData.writeNBT(nbt); homingData.writeNBT(nbt); lightningData.writeNBT(nbt); lifespanData.writeNBT(nbt); + trajectoryData.writeNBT(nbt); // Backward compat: old key was "orbSpeed" nbt.setFloat("orbSpeed", homingData.speed); } @@ -174,11 +176,12 @@ public class AbilityOrb extends Ability implements IAbilityOrb { public void readTypeNBT(NBTTagCompound nbt) { this.orbSize = nbt.hasKey("orbSize") ? nbt.getFloat("orbSize") : 1.0f; anchorData.readNBT(nbt); - colorData.readNBT(nbt); combatData.readNBT(nbt); + displayData.readNBT(nbt); homingData.readNBT(nbt); lightningData.readNBT(nbt); lifespanData.readNBT(nbt); + trajectoryData.readNBT(nbt); // Backward compat: old key was "orbSpeed" if (nbt.hasKey("orbSpeed")) { homingData.speed = nbt.getFloat("orbSpeed"); @@ -291,51 +294,51 @@ public class AbilityOrb extends Ability implements IAbilityOrb { } public int getInnerColor() { - return colorData.innerColor; + return displayData.innerColor; } public void setInnerColor(int innerColor) { - colorData.innerColor = innerColor; + displayData.innerColor = innerColor; } public int getOuterColor() { - return colorData.outerColor; + return displayData.outerColor; } public void setOuterColor(int outerColor) { - colorData.outerColor = outerColor; + displayData.outerColor = outerColor; } public float getOuterColorWidth() { - return colorData.outerColorWidth; + return displayData.outerColorWidth; } public void setOuterColorWidth(float outerColorWidth) { - colorData.outerColorWidth = outerColorWidth; + displayData.outerColorWidth = outerColorWidth; } public float getOuterColorAlpha() { - return colorData.outerColorAlpha; + return displayData.outerColorAlpha; } public void setOuterColorAlpha(float outerColorAlpha) { - colorData.outerColorAlpha = outerColorAlpha; + displayData.outerColorAlpha = outerColorAlpha; } public boolean isOuterColorEnabled() { - return colorData.outerColorEnabled; + return displayData.outerColorEnabled; } public void setOuterColorEnabled(boolean outerColorEnabled) { - colorData.outerColorEnabled = outerColorEnabled; + displayData.outerColorEnabled = outerColorEnabled; } public float getRotationSpeed() { - return colorData.rotationSpeed; + return displayData.rotationSpeed; } public void setRotationSpeed(float rotationSpeed) { - colorData.rotationSpeed = rotationSpeed; + displayData.rotationSpeed = rotationSpeed; } public boolean hasLightningEffect() { @@ -401,7 +404,7 @@ public class AbilityOrb extends Ability implements IAbilityOrb { if (npc == null || npc.worldObj == null) return null; EntityAbilityOrb orb = new EntityAbilityOrb(npc.worldObj); - orb.setupPreview(npc, orbSize, colorData, lightningData, anchorData, windUpTicks); + orb.setupPreview(npc, orbSize, displayData, lightningData, anchorData, windUpTicks); return orb; } diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrbBarrage.java b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrbBarrage.java index ca898b44b..e158062d2 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrbBarrage.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrbBarrage.java @@ -45,6 +45,8 @@ public class AbilityOrbBarrage extends Ability { private final EnergyAnchorData[] anchorData = new EnergyAnchorData[]{ new EnergyAnchorData(AnchorPoint.RIGHT_HAND), new EnergyAnchorData(AnchorPoint.LEFT_HAND) }; + private final EnergyTrajectoryData trajectoryData = new EnergyTrajectoryData(); + // Array to store entities private transient List orbEntities = new ArrayList<>(); @@ -123,7 +125,7 @@ public class AbilityOrbBarrage extends Ability { EntityAbilityOrb orbEntity = new EntityAbilityOrb( world, caster, target, spawnPos.xCoord, spawnPos.yCoord, spawnPos.zCoord, orbSize, - colorData, combatData, homingData, lightningData, lifespanData + colorData, combatData, homingData, lightningData, lifespanData, trajectoryData ); orbEntity.setupCharging(anchorData[i], windUpTicks); @@ -174,7 +176,7 @@ public class AbilityOrbBarrage extends Ability { EntityAbilityOrb orb = new EntityAbilityOrb( world, caster, target, spawnPos.xCoord, spawnPos.yCoord, spawnPos.zCoord, - orbSize, colorData, combatData, homingData, lightningData, lifespanData + orbSize, colorData, combatData, homingData, lightningData, lifespanData, trajectoryData ); world.spawnEntityInWorld(orb); @@ -271,6 +273,7 @@ public class AbilityOrbBarrage extends Ability { homingData.writeNBT(nbt); lightningData.writeNBT(nbt); lifespanData.writeNBT(nbt); + trajectoryData.writeNBT(nbt); for (int i = 0; i < anchorData.length; i++) { NBTTagCompound comp = new NBTTagCompound(); @@ -290,6 +293,7 @@ public class AbilityOrbBarrage extends Ability { homingData.readNBT(nbt); lightningData.readNBT(nbt); lifespanData.readNBT(nbt); + trajectoryData.readNBT(nbt); for (int i = 0; i < anchorData.length; i++) { if (nbt.hasKey("Anchor_" + i, Constants.NBT.TAG_COMPOUND)) { diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrbDual.java b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrbDual.java index 4ff683aef..1d92f8f0c 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrbDual.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityOrbDual.java @@ -32,7 +32,7 @@ public class AbilityOrbDual extends Ability { private int dualFireDelay = 5; // Data classes for energy properties - public final EnergyDisplayData[] colorData = new EnergyDisplayData[]{ + public final EnergyDisplayData[] displayData = new EnergyDisplayData[]{ new EnergyDisplayData(), new EnergyDisplayData() }; public final EnergyCombatData combatData = new EnergyCombatData(); @@ -41,9 +41,12 @@ public class AbilityOrbDual extends Ability { new EnergyLightningData(), new EnergyLightningData() }; public final EnergyLifespanData lifespanData = new EnergyLifespanData(); - private EnergyAnchorData[] anchorData = new EnergyAnchorData[]{ + private final EnergyAnchorData[] anchorData = new EnergyAnchorData[]{ new EnergyAnchorData(AnchorPoint.RIGHT_HAND), new EnergyAnchorData(AnchorPoint.LEFT_HAND) }; + private EnergyTrajectoryData[] trajectoryData = new EnergyTrajectoryData[]{ + new EnergyTrajectoryData(), new EnergyTrajectoryData() + }; // Transient state for orb entity (used during windup charging) private transient EntityAbilityOrb orbEntity = null; @@ -110,13 +113,13 @@ public class AbilityOrbDual extends Ability { orbEntity = new EntityAbilityOrb( world, caster, target, spawnPos1.xCoord, spawnPos1.yCoord, spawnPos1.zCoord, orbSize, - colorData[0], combatData, homingData, lightningData[0], lifespanData); + displayData[0], combatData, homingData, lightningData[0], lifespanData, trajectoryData[0]); Vec3 spawnPos2 = AnchorPointHelper.calculateAnchorPosition(caster, anchorData[1]); orbEntity2 = new EntityAbilityOrb( world, caster, target, spawnPos2.xCoord, spawnPos2.yCoord, spawnPos2.zCoord, orbSize, - colorData[1], combatData, homingData, lightningData[1], lifespanData); + displayData[1], combatData, homingData, lightningData[1], lifespanData, trajectoryData[1]); orbEntity.setSiblingEntityId(orbEntity2.getEntityId()); orbEntity2.setSiblingEntityId(orbEntity.getEntityId()); @@ -217,12 +220,13 @@ public class AbilityOrbDual extends Ability { NBTTagCompound orb1 = new NBTTagCompound(); NBTTagCompound orb2 = new NBTTagCompound(); - anchorData[0].writeNBT(orb1); - anchorData[1].writeNBT(orb2); - colorData[0].writeNBT(orb1); - colorData[1].writeNBT(orb2); - lightningData[0].writeNBT(orb1); - lightningData[1].writeNBT(orb2); + for (int i = 0; i < 2; i++) { + NBTTagCompound orb = i == 0 ? orb1 : orb2; + anchorData[i].writeNBT(orb); + displayData[i].writeNBT(orb); + lightningData[i].writeNBT(orb); + trajectoryData[i].writeNBT(orb); + } nbt.setTag("Orb_1", orb1); nbt.setTag("Orb_2", orb2); @@ -244,18 +248,19 @@ public class AbilityOrbDual extends Ability { homingData.speed = nbt.getFloat("orbSpeed"); } - anchorData[0].readNBT(orb1); - anchorData[1].readNBT(orb2); - colorData[0].readNBT(orb1); - colorData[1].readNBT(orb2); - lightningData[0].readNBT(orb1); - lightningData[1].readNBT(orb2); + for (int i = 0; i < 2; i++) { + NBTTagCompound orb = i == 0 ? orb1 : orb2; + anchorData[i].readNBT(orb); + displayData[i].readNBT(orb); + lightningData[i].readNBT(orb); + trajectoryData[i].readNBT(orb); + } } // Getters & Setters private EnergyDisplayData getColorData(int orb) { orb = ValueUtil.clamp(orb, 0, 1); - return colorData[orb]; + return displayData[orb]; } private EnergyLightningData getLightningData(int orb) { orb = ValueUtil.clamp(orb, 0, 1); @@ -564,7 +569,7 @@ public class AbilityOrbDual extends Ability { if (npc == null || npc.worldObj == null) return null; EntityAbilityOrb orb = new EntityAbilityOrb(npc.worldObj); - orb.setupPreview(npc, orbSize, colorData[0], lightningData[0], anchorData[0], windUpTicks); + orb.setupPreview(npc, orbSize, displayData[0], lightningData[0], anchorData[0], windUpTicks); return orb; } diff --git a/src/main/java/kamkeel/npcs/entity/EntityAbilityBeam.java b/src/main/java/kamkeel/npcs/entity/EntityAbilityBeam.java index cba16d814..60175169a 100644 --- a/src/main/java/kamkeel/npcs/entity/EntityAbilityBeam.java +++ b/src/main/java/kamkeel/npcs/entity/EntityAbilityBeam.java @@ -104,12 +104,12 @@ public class EntityAbilityBeam extends EntityAbilityProjectile { float beamWidth, float headSize, EnergyDisplayData display, EnergyCombatData combat, EnergyHomingData homing, EnergyLightningData lightning, - EnergyLifespanData lifespan, + EnergyLifespanData lifespan, EnergyTrajectoryData trajectory, boolean anchoredMode) { super(world); // Initialize base properties via parent - initProjectile(owner, target, x, y, z, headSize, display, combat, lightning, lifespan); + initProjectile(owner, target, x, y, z, headSize, display, combat, lightning, lifespan, trajectory); // Beam-specific properties from homing data diff --git a/src/main/java/kamkeel/npcs/entity/EntityAbilityDisc.java b/src/main/java/kamkeel/npcs/entity/EntityAbilityDisc.java index 68523e498..bbd77abd0 100644 --- a/src/main/java/kamkeel/npcs/entity/EntityAbilityDisc.java +++ b/src/main/java/kamkeel/npcs/entity/EntityAbilityDisc.java @@ -83,12 +83,12 @@ public class EntityAbilityDisc extends EntityAbilityProjectile { float discRadius, float discThickness, EnergyDisplayData display, EnergyCombatData combat, EnergyHomingData homing, EnergyLightningData lightning, - EnergyLifespanData lifespan, + EnergyLifespanData lifespan, EnergyTrajectoryData trajectory, boolean boomerang, int boomerangDelay) { super(world); // Initialize base properties - initProjectile(owner, target, x, y, z, discRadius, display, combat, lightning, lifespan); + initProjectile(owner, target, x, y, z, discRadius, display, combat, lightning, lifespan, trajectory); this.homingData = homing; diff --git a/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java b/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java index 328825bef..f8053509b 100644 --- a/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java +++ b/src/main/java/kamkeel/npcs/entity/EntityAbilityLaser.java @@ -92,11 +92,11 @@ public class EntityAbilityLaser extends EntityAbilityProjectile { float laserWidth, EnergyDisplayData display, EnergyCombatData combat, EnergyLightningData lightning, EnergyLifespanData lifespan, - float expansionSpeed, int lingerTicks) { + EnergyTrajectoryData trajectory, float expansionSpeed, int lingerTicks) { super(world); // Initialize base properties (laser doesn't rotate) - initProjectile(owner, target, x, y, z, laserWidth, display, combat, lightning, lifespan); + initProjectile(owner, target, x, y, z, laserWidth, display, combat, lightning, lifespan, trajectory); this.displayData.rotationSpeed = 0.0f; // Laser-specific properties diff --git a/src/main/java/kamkeel/npcs/entity/EntityAbilityOrb.java b/src/main/java/kamkeel/npcs/entity/EntityAbilityOrb.java index 906f38ace..c268d712a 100644 --- a/src/main/java/kamkeel/npcs/entity/EntityAbilityOrb.java +++ b/src/main/java/kamkeel/npcs/entity/EntityAbilityOrb.java @@ -68,11 +68,11 @@ public class EntityAbilityOrb extends EntityAbilityProjectile { double x, double y, double z, float orbSize, EnergyDisplayData display, EnergyCombatData combat, EnergyHomingData homing, EnergyLightningData lightning, - EnergyLifespanData lifespan) { + EnergyLifespanData lifespan, EnergyTrajectoryData trajectory) { super(world); // Initialize base properties - initProjectile(owner, target, x, y, z, orbSize, display, combat, lightning, lifespan); + initProjectile(owner, target, x, y, z, orbSize, display, combat, lightning, lifespan, trajectory); this.homingData = homing; @@ -273,6 +273,10 @@ public class EntityAbilityOrb extends EntityAbilityProjectile { this.posZ += motionZ; } + private void updateTrajectory() { + + } + private void updateHoming() { if (!isHoming()) return; diff --git a/src/main/java/kamkeel/npcs/entity/EntityAbilityProjectile.java b/src/main/java/kamkeel/npcs/entity/EntityAbilityProjectile.java index d3405275f..fce06741b 100644 --- a/src/main/java/kamkeel/npcs/entity/EntityAbilityProjectile.java +++ b/src/main/java/kamkeel/npcs/entity/EntityAbilityProjectile.java @@ -23,6 +23,7 @@ import noppes.npcs.scripted.NpcAPI; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * Base class for all ability projectiles (Orb, Disc, Beam, Laser). @@ -63,6 +64,7 @@ public abstract class EntityAbilityProjectile extends Entity implements IEnergyP // ==================== TRAJECTORY PROPERTIES ==================== protected EnergyTrajectoryData trajectoryData = new EnergyTrajectoryData(); + protected Map pathDelays; // ==================== TRACKING ==================== protected double startX, startY, startZ; @@ -102,7 +104,8 @@ public abstract class EntityAbilityProjectile extends Entity implements IEnergyP protected void initProjectile(EntityLivingBase owner, EntityLivingBase target, EntityAbilityProjectile sibling, double x, double y, double z, float size, EnergyDisplayData display, EnergyCombatData combat, - EnergyLightningData lightning, EnergyLifespanData lifespan) { + EnergyLightningData lightning, EnergyLifespanData lifespan, + EnergyTrajectoryData trajectory) { this.setPosition(x, y, z); this.startX = x; this.startY = y; @@ -119,6 +122,7 @@ public abstract class EntityAbilityProjectile extends Entity implements IEnergyP this.combatData = combat; this.lifespanData = lifespan; // deathWorldTime will be set on first tick when world is available this.lightningData = lightning; + this.trajectoryData = trajectory; // Initialize render size this.renderCurrentSize = size; @@ -129,8 +133,9 @@ public abstract class EntityAbilityProjectile extends Entity implements IEnergyP protected void initProjectile(EntityLivingBase owner, EntityLivingBase target, double x, double y, double z, float size, EnergyDisplayData display, EnergyCombatData combat, - EnergyLightningData lightning, EnergyLifespanData lifespan) { - initProjectile(owner, target, null, x, y, z, size, display, combat, lightning, lifespan); + EnergyLightningData lightning, EnergyLifespanData lifespan, + EnergyTrajectoryData trajectory) { + initProjectile(owner, target, null, x, y, z, size, display, combat, lightning, lifespan, trajectory); } @Override @@ -694,6 +699,7 @@ public abstract class EntityAbilityProjectile extends Entity implements IEnergyP homingData.readNBT(nbt); lifespanData.readNBT(nbt); lightningData.readNBT(nbt); + trajectoryData.readNBT(nbt); } /** @@ -731,6 +737,7 @@ public abstract class EntityAbilityProjectile extends Entity implements IEnergyP homingData.writeNBT(nbt); lifespanData.writeNBT(nbt); lightningData.writeNBT(nbt); + trajectoryData.writeNBT(nbt); } /** diff --git a/src/main/java/noppes/npcs/items/ItemStaff.java b/src/main/java/noppes/npcs/items/ItemStaff.java index eb8b9b181..2a54c49a3 100644 --- a/src/main/java/noppes/npcs/items/ItemStaff.java +++ b/src/main/java/noppes/npcs/items/ItemStaff.java @@ -110,6 +110,7 @@ public class ItemStaff extends ItemNpcInterface implements IProjectileCallback { EnergyLightningData lightning = new EnergyLightningData(); EnergyLifespanData lifespan = new EnergyLifespanData(100, 72000); EnergyHomingData homing = new EnergyHomingData(); + EnergyTrajectoryData trajectory = new EnergyTrajectoryData(); homing.speed = 0.5f; homing.homingStrength = 0.35f; @@ -118,7 +119,7 @@ public class ItemStaff extends ItemNpcInterface implements IProjectileCallback { EntityAbilityOrb orb = new EntityAbilityOrb( player.worldObj, player, null, player.posX, player.posY + player.getEyeHeight(), player.posZ, - 1.0f, colorData, combat, homing, lightning, lifespan + 1.0f, colorData, combat, homing, lightning, lifespan, trajectory ); orb.setupCharging(