This commit is contained in:
Kam committed 2026-02-03 19:30:59 -05:00
commit 8ed8b55bdc
16 files changed
+224 -159

No files matched your search

@@ -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);
}
}
}
@@ -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);
@@ -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;
}
@@ -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);
@@ -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;
}
@@ -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
);
@@ -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;
}
@@ -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<EntityAbilityOrb> 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)) {
@@ -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;
}
@@ -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
@@ -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;
@@ -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
@@ -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;
@@ -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<Integer, Integer> 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);
}
/**
@@ -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(