Starsector API
Loading...
Searching...
No Matches
IonBeamEffect.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat;
2
3import org.lwjgl.util.vector.Vector2f;
4
5import com.fs.starfarer.api.combat.BeamAPI;
6import com.fs.starfarer.api.combat.BeamEffectPlugin;
7import com.fs.starfarer.api.combat.CombatEngineAPI;
8import com.fs.starfarer.api.combat.CombatEntityAPI;
9import com.fs.starfarer.api.combat.DamageType;
10import com.fs.starfarer.api.combat.ShipAPI;
11import com.fs.starfarer.api.impl.campaign.ids.Stats;
12import com.fs.starfarer.api.util.IntervalUtil;
13
14public class IonBeamEffect implements BeamEffectPlugin {
15
16 private IntervalUtil fireInterval = new IntervalUtil(0.25f, 1.75f);
17 private boolean wasZero = true;
18
19
20 public void advance(float amount, CombatEngineAPI engine, BeamAPI beam) {
21 CombatEntityAPI target = beam.getDamageTarget();
22 if (target instanceof ShipAPI && beam.getBrightness() >= 1f) {
23 float dur = beam.getDamage().getDpsDuration();
24 // needed because when the ship is in fast-time, dpsDuration will not be reset every frame as it should be
25 if (!wasZero) dur = 0;
26 wasZero = beam.getDamage().getDpsDuration() <= 0;
27 fireInterval.advance(dur);
28
29 if (fireInterval.intervalElapsed()) {
30 ShipAPI ship = (ShipAPI) target;
31 boolean hitShield = target.getShield() != null && target.getShield().isWithinArc(beam.getTo());
32 float pierceChance = ((ShipAPI)target).getHardFluxLevel() - 0.1f;
33 pierceChance *= ship.getMutableStats().getDynamic().getValue(Stats.SHIELD_PIERCED_MULT);
34
35 boolean piercedShield = hitShield && (float) Math.random() < pierceChance;
36 //piercedShield = true;
37
38 if (!hitShield || piercedShield) {
39 Vector2f point = beam.getRayEndPrevFrame();
40 float emp = beam.getDamage().getFluxComponent() * 1f;
41 float dam = beam.getDamage().getDamage() * 1f;
42 engine.spawnEmpArcPierceShields(
43 beam.getSource(), point, beam.getDamageTarget(), beam.getDamageTarget(),
44 DamageType.ENERGY,
45 dam, // damage
46 emp, // emp
47 100000f, // max range
48 "tachyon_lance_emp_impact",
49 beam.getWidth() + 9f,
50 beam.getFringeColor(),
51 beam.getCoreColor()
52 );
53 }
54 }
55 }
56// Global.getSoundPlayer().playLoop("system_emp_emitter_loop",
57// beam.getDamageTarget(), 1.5f, beam.getBrightness() * 0.5f,
58// beam.getTo(), new Vector2f());
59 }
60}
void advance(float amount, CombatEngineAPI engine, BeamAPI beam)