mirror of
https://github.com/KAMKEEL/CustomNPC-Plus.git
synced 2026-11-13 01:57:34 +00:00
More trajectory changes
This commit is contained in:
1 parent
77325428fa
commit
6ea7d0ac7d
16 files changed
+224
-159
No files matched your search
+77
-49
@@ -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(
|
||||
|
||||
Reference in new issue
Block a user