Starsector API
Loading...
Searching...
No Matches
RiftLightningEffect.java
Go to the documentation of this file.
1package com.fs.starfarer.api.impl.combat.dweller;
2
3import java.util.ArrayList;
4import java.util.List;
5
6import java.awt.Color;
7
8import org.lwjgl.util.vector.Vector2f;
9
10import com.fs.starfarer.api.Global;
11import com.fs.starfarer.api.combat.CombatEngineAPI;
12import com.fs.starfarer.api.combat.CombatEntityAPI;
13import com.fs.starfarer.api.combat.DamagingProjectileAPI;
14import com.fs.starfarer.api.combat.EmpArcEntityAPI;
15import com.fs.starfarer.api.combat.EmpArcEntityAPI.EmpArcParams;
16import com.fs.starfarer.api.combat.EveryFrameWeaponEffectPlugin;
17import com.fs.starfarer.api.combat.MissileAPI;
18import com.fs.starfarer.api.combat.OnFireEffectPlugin;
19import com.fs.starfarer.api.combat.OnHitEffectPlugin;
20import com.fs.starfarer.api.combat.ShipAPI;
21import com.fs.starfarer.api.combat.WeaponAPI;
22import com.fs.starfarer.api.combat.WeaponAPI.WeaponType;
23import com.fs.starfarer.api.combat.listeners.ApplyDamageResultAPI;
24import com.fs.starfarer.api.impl.combat.dweller.DwellerShroud.DwellerShroudParams;
25import com.fs.starfarer.api.util.Misc;
26
37
38
39
40
41 public static Color RIFT_LIGHTNING_COLOR = new Color(255,50,50,255);
42 public static float RIFT_LIGHTNING_SPEED = 10000f;
43
44// public static String RIFT_LIGHTNING_PROJ_TAG = "rift_lightning_proj_tag";
45 public static String RIFT_LIGHTNING_DAMAGE_REMOVER = "rift_lightning_damage_remover";
46 public static String RIFT_LIGHTNING_FIRED_TAG = "rift_lightning_fired_tag";
47 public static String RIFT_LIGHTNING_SOURCE_WEAPON = "rift_lightning_source_weapon";
48
49 public static class FiredLightningProjectile {
50 public DamagingProjectileAPI projectile;
51 }
52
53
54// /**
55// * The actual damage is dealt by the rift explosion.
56// * (Removing this: setting multiplier to 0 on projectile instead)
57// * @author Alex
58// *
59// */
60// public static class RiftLightningBaseDamageNegator implements DamageDealtModifier {
61// @Override
62// public String modifyDamageDealt(Object param, CombatEntityAPI target, DamageAPI damage, Vector2f point, boolean shieldHit) {
63// if (param instanceof DamagingProjectileAPI) {
64// DamagingProjectileAPI proj = (DamagingProjectileAPI) param;
65// if (proj.getCustomData().containsKey(RIFT_LIGHTNING_PROJ_TAG)) {
66// damage.getModifier().modifyMult(RIFT_LIGHTNING_PROJ_TAG, 0f);
67// return RIFT_LIGHTNING_PROJ_TAG;
68// }
69// }
70// return null;
71// }
72// }
73
74 protected List<FiredLightningProjectile> fired = new ArrayList<>();
75
76 @Override
77 public void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon) {
78// if (!fired.isEmpty()) {
79// System.out.println("FIRED");
80// }
81 List<FiredLightningProjectile> remove = new ArrayList<>();
82
83 float maxRange = weapon.getRange();
84 for (FiredLightningProjectile data : fired) {
85 float dist = Misc.getDistance(data.projectile.getSpawnLocation(), data.projectile.getLocation());
86 boolean firedAlready = data.projectile.getCustomData().containsKey(RIFT_LIGHTNING_FIRED_TAG);
87 if (dist > maxRange || firedAlready) {
88 remove.add(data);
89 if (!firedAlready) {
90 fireArc(data.projectile, weapon, null, null);
91 }
92 }
93 }
94 fired.removeAll(remove);
95 }
96
97 public void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine) {
98// if (weapon.getShip() != null &&
99// !weapon.getShip().hasListenerOfClass(RiftLightningBaseDamageNegator.class)) {
100// weapon.getShip().addListener(new RiftLightningBaseDamageNegator());
101// }
102 //projectile.setCustomData(RIFT_LIGHTNING_PROJ_TAG, true);
103
106
107 FiredLightningProjectile data = new FiredLightningProjectile();
108 data.projectile = projectile;
109 fired.add(data);
110 }
111
112
113 public void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target,
114 Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine) {
115
117 if (weapon == null) return;
118
119 fireArc(projectile, weapon, point, target);
120 }
121
122 public static void fireArc(DamagingProjectileAPI projectile, WeaponAPI weapon, Vector2f point, CombatEntityAPI target) {
123 boolean firedAlready = projectile.getCustomData().containsKey(RIFT_LIGHTNING_FIRED_TAG);
124 if (firedAlready) return;
125
126 projectile.setCustomData(RIFT_LIGHTNING_FIRED_TAG, true);
127
129
130 ShipAPI ship = weapon.getShip();
131 if (ship == null) return;
132
133 //Vector2f from = weapon.getFirePoint(0);
134 Vector2f from = projectile.getSpawnLocation();
135
136
137 float dist = Float.MAX_VALUE;
138 if (point != null) dist = Misc.getDistance(from, point);
139
140 float maxRange = weapon.getRange();
141 if (dist > maxRange || point == null) {
142 dist = maxRange * (0.5f + 0.5f * (float) Math.random());
143 if (projectile.didDamage()) {
144 dist = maxRange;
145 }
146 point = Misc.getUnitVectorAtDegreeAngle(projectile.getFacing());
147 point.scale(dist);
148 Vector2f.add(point, from, point);
149 }
150
151 float arcSpeed = RIFT_LIGHTNING_SPEED;
152
154 if (shroud != null) {
155 float angle = Misc.getAngleInDegrees(ship.getLocation(), point);
156 from = Misc.getUnitVectorAtDegreeAngle(angle + 90f - 180f * (float) Math.random());
157 from.scale((0.5f + (float) Math.random() * 0.25f) * shroud.getShroudParams().maxOffset);
158 Vector2f.add(ship.getLocation(), from, from);
159 }
160
161
162 EmpArcParams params = new EmpArcParams();
163 params.segmentLengthMult = 8f;
164 params.zigZagReductionFactor = 0.15f;
165 params.fadeOutDist = 50f;
166 params.minFadeOutMult = 10f;
167// params.flickerRateMult = 0.7f;
168 params.flickerRateMult = 0.3f;
169// params.flickerRateMult = 0.05f;
170// params.glowSizeMult = 3f;
171// params.brightSpotFullFraction = 0.5f;
172
173 params.movementDurOverride = Math.max(0.05f, dist / arcSpeed);
174
175 //Color color = weapon.getSpec().getGlowColor();
176 Color color = RIFT_LIGHTNING_COLOR;
177 EmpArcEntityAPI arc = (EmpArcEntityAPI)engine.spawnEmpArcVisual(from, ship, point, null,
178 80f, // thickness
179 color,
180 new Color(255,255,255,255),
181 params
182 );
183 arc.setCoreWidthOverride(40f);
184
185 arc.setRenderGlowAtStart(false);
186 arc.setFadedOutAtStart(true);
187 arc.setSingleFlickerMode(true);
188
189 spawnMine(ship, point, params.movementDurOverride * 0.8f); // - 0.05f);
190
191
192 if (shroud != null) {
193 DwellerShroudParams shroudParams = shroud.getShroudParams();
194 params = new EmpArcParams();
195 params.segmentLengthMult = 4f;
196 params.glowSizeMult = 4f;
197 params.flickerRateMult = 0.5f + (float) Math.random() * 0.5f;
198 params.flickerRateMult *= 1.5f;
199
200 //Color fringe = shroudParams.overloadArcFringeColor;
201 Color fringe = color;
202 Color core = Color.white;
203
204 float thickness = shroudParams.overloadArcThickness;
205
206 //Vector2f to = Misc.getPointAtRadius(from, 1f);
207
208 float angle = Misc.getAngleInDegrees(from, ship.getLocation());
209 angle = angle + 90f * ((float) Math.random() - 0.5f);
210 Vector2f dir = Misc.getUnitVectorAtDegreeAngle(angle);
211 dist = shroudParams.maxOffset;
212 dist = dist * 0.5f + dist * 0.5f * (float) Math.random();
213 //dist *= 1.5f;
214 dist *= 0.5f;
215 dir.scale(dist);
216 Vector2f to = Vector2f.add(from, dir, new Vector2f());
217
219 from, ship, to, ship, thickness, fringe, core, params);
220
221 arc.setCoreWidthOverride(shroudParams.overloadArcCoreThickness);
222 arc.setSingleFlickerMode(false);
223 //arc.setRenderGlowAtStart(false);
224 }
225
226 }
227
228 public static void spawnMine(ShipAPI source, Vector2f mineLoc, float delay) {
230
231
232 //Vector2f currLoc = mineLoc;
233 MissileAPI mine = (MissileAPI) engine.spawnProjectile(source, null,
234 "rift_lightning_minelayer",
235 mineLoc,
236 (float) Math.random() * 360f, null);
237 if (source != null) {
239 source, WeaponType.ENERGY, false, mine.getDamage());
240 }
241
242
243 float fadeInTime = 0.05f;
244 mine.getVelocity().scale(0);
245 mine.fadeOutThenIn(fadeInTime);
246
247 float liveTime = Math.max(delay, 0f);
248 mine.setFlightTime(mine.getMaxFlightTime() - liveTime);
249 mine.addDamagedAlready(source);
250 mine.setNoMineFFConcerns(true);
251 if (liveTime <= 0.016f) {
252 mine.explode();
253 }
254 }
255
256}
static CombatEngineAPI getCombatEngine()
Definition Global.java:69
void modifyMult(String source, float value)
static DwellerShroud getShroudFor(CombatEntityAPI entity)
static void fireArc(DamagingProjectileAPI projectile, WeaponAPI weapon, Vector2f point, CombatEntityAPI target)
void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine)
static void spawnMine(ShipAPI source, Vector2f mineLoc, float delay)
void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon)
void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
Definition Misc.java:1196
static float getDistance(SectorEntityToken from, SectorEntityToken to)
Definition Misc.java:599
static float getAngleInDegrees(Vector2f v)
Definition Misc.java:1126
EmpArcEntityAPI spawnEmpArcVisual(Vector2f from, CombatEntityAPI fromAnchor, Vector2f to, CombatEntityAPI toAnchor, float thickness, Color fringe, Color core)
CombatEntityAPI spawnProjectile(ShipAPI ship, WeaponAPI weapon, String weaponId, Vector2f point, float angle, Vector2f shipVelocity)
void applyDamageModifiersToSpawnedProjectileWithNullWeapon(ShipAPI source, WeaponType type, boolean isBeam, DamageAPI damage)
void setCustomData(String key, Object data)
void setFadedOutAtStart(boolean fadedOutAtStart)
void setRenderGlowAtStart(boolean renderGlowAtStart)
void setCoreWidthOverride(float coreWidthOverride)
void setNoMineFFConcerns(boolean noFFConcerns)
void setFlightTime(float flightTime)
DamagingProjectileAPI explode()