1package com.fs.starfarer.api.impl.combat;
3import java.util.Iterator;
6import org.lwjgl.util.vector.Vector2f;
8import com.fs.starfarer.api.Global;
9import com.fs.starfarer.api.combat.BeamAPI;
10import com.fs.starfarer.api.combat.CombatEngineAPI;
11import com.fs.starfarer.api.combat.CombatEntityAPI;
12import com.fs.starfarer.api.combat.EveryFrameWeaponEffectPlugin;
13import com.fs.starfarer.api.combat.MissileAPI;
14import com.fs.starfarer.api.combat.ShipAPI;
15import com.fs.starfarer.api.combat.WeaponAPI;
16import com.fs.starfarer.api.combat.WeaponAPI.WeaponType;
17import com.fs.starfarer.api.util.IntervalUtil;
18import com.fs.starfarer.api.util.Misc;
19import com.fs.starfarer.api.util.WeightedRandomPicker;
26 protected IntervalUtil
interval =
new IntervalUtil(0.8f, 1.2f);
33 public void advance(
float amount, CombatEngineAPI engine, WeaponAPI weapon) {
34 List<BeamAPI> beams = weapon.getBeams();
35 if (beams.isEmpty())
return;
36 BeamAPI beam = beams.get(0);
37 if (beam.getBrightness() < 1f)
return;
41 if (beam.getLengthPrevFrame() < 10)
return;
44 CombatEntityAPI target =
findTarget(beam, beam.getWeapon(), engine);
48 loc = target.getLocation();
51 Vector2f from = Misc.closestPointOnSegmentToPoint(beam.getFrom(), beam.getRayEndPrevFrame(), loc);
52 Vector2f to = Misc.getUnitVectorAtDegreeAngle(Misc.getAngleInDegrees(from, loc));
54 to.scale(Math.min(Misc.getDistance(from, loc),
RIFT_RANGE));
55 Vector2f.add(from, to, to);
65 public void spawnMine(ShipAPI source, Vector2f mineLoc) {
70 MissileAPI mine = (MissileAPI) engine.spawnProjectile(source,
null,
73 (
float) Math.random() * 360f,
null);
76 source, WeaponType.MISSILE,
false, mine.getDamage());
80 float fadeInTime = 0.05f;
81 mine.getVelocity().scale(0);
82 mine.fadeOutThenIn(fadeInTime);
86 mine.setFlightTime(mine.getMaxFlightTime() - liveTime);
87 mine.addDamagedAlready(source);
88 mine.setNoMineFFConcerns(
true);
91 public Vector2f
pickNoTargetDest(BeamAPI beam, WeaponAPI weapon, CombatEngineAPI engine) {
92 Vector2f from = beam.getFrom();
93 Vector2f to = beam.getRayEndPrevFrame();
94 float length = beam.getLengthPrevFrame();
96 float f = 0.25f + (float) Math.random() * 0.75f;
97 Vector2f loc = Misc.getUnitVectorAtDegreeAngle(Misc.getAngleInDegrees(from, to));
98 loc.scale(length * f);
99 Vector2f.add(from, loc, loc);
101 return Misc.getPointWithinRadius(loc,
RIFT_RANGE);
104 public CombatEntityAPI
findTarget(BeamAPI beam, WeaponAPI weapon, CombatEngineAPI engine) {
105 Vector2f to = beam.getRayEndPrevFrame();
109 int owner = weapon.getShip().getOwner();
110 WeightedRandomPicker<CombatEntityAPI> picker =
new WeightedRandomPicker<CombatEntityAPI>();
111 while (iter.hasNext()) {
112 Object o = iter.next();
113 if (!(o instanceof MissileAPI) &&
114 !(o instanceof ShipAPI))
continue;
115 CombatEntityAPI other = (CombatEntityAPI) o;
116 if (other.getOwner() == owner)
continue;
117 if (other instanceof ShipAPI) {
118 ShipAPI ship = (ShipAPI) other;
119 if (!ship.isFighter() && !ship.isDrone())
continue;
122 float radius = Misc.getTargetingRadius(to, other,
false);
123 Vector2f p = Misc.closestPointOnSegmentToPoint(beam.getFrom(), beam.getRayEndPrevFrame(), other.getLocation());
124 float dist = Misc.getDistance(p, other.getLocation()) - radius;
130 return picker.pick();
static CombatEngineAPI getCombatEngine()
void spawnMine(ShipAPI source, Vector2f mineLoc)
Vector2f pickNoTargetDest(BeamAPI beam, WeaponAPI weapon, CombatEngineAPI engine)
static float TARGET_RANGE
void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon)
CombatEntityAPI findTarget(BeamAPI beam, WeaponAPI weapon, CombatEngineAPI engine)