1package com.fs.starfarer.api.impl.combat.dweller;
3import java.util.ArrayList;
8import org.lwjgl.util.vector.Vector2f;
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;
49 public static class FiredLightningProjectile {
74 protected List<FiredLightningProjectile>
fired =
new ArrayList<>();
81 List<FiredLightningProjectile>
remove =
new ArrayList<>();
84 for (FiredLightningProjectile data :
fired) {
85 float dist =
Misc.
getDistance(data.projectile.getSpawnLocation(), data.projectile.getLocation());
87 if (dist > maxRange || firedAlready) {
90 fireArc(data.projectile, weapon,
null,
null);
94 fired.removeAll(
remove);
107 FiredLightningProjectile data =
new FiredLightningProjectile();
108 data.projectile = projectile;
117 if (weapon ==
null)
return;
119 fireArc(projectile, weapon, point, target);
124 if (firedAlready)
return;
131 if (ship ==
null)
return;
137 float dist = Float.MAX_VALUE;
141 if (dist > maxRange || point ==
null) {
142 dist = maxRange * (0.5f + 0.5f * (float) Math.random());
148 Vector2f.add(point, from, point);
154 if (shroud !=
null) {
157 from.scale((0.5f + (
float) Math.random() * 0.25f) * shroud.
getShroudParams().maxOffset);
162 EmpArcParams params =
new EmpArcParams();
163 params.segmentLengthMult = 8f;
164 params.zigZagReductionFactor = 0.15f;
165 params.fadeOutDist = 50f;
166 params.minFadeOutMult = 10f;
168 params.flickerRateMult = 0.3f;
173 params.movementDurOverride = Math.max(0.05f, dist / arcSpeed);
180 new Color(255,255,255,255),
189 spawnMine(ship, point, params.movementDurOverride * 0.8f);
192 if (shroud !=
null) {
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;
201 Color fringe = color;
202 Color core = Color.white;
204 float thickness = shroudParams.overloadArcThickness;
209 angle = angle + 90f * ((float) Math.random() - 0.5f);
211 dist = shroudParams.maxOffset;
212 dist = dist * 0.5f + dist * 0.5f * (float) Math.random();
216 Vector2f to = Vector2f.add(from, dir,
new Vector2f());
219 from, ship, to, ship, thickness, fringe, core, params);
234 "rift_lightning_minelayer",
236 (
float) Math.random() * 360f,
null);
237 if (source !=
null) {
239 source, WeaponType.ENERGY,
false, mine.
getDamage());
243 float fadeInTime = 0.05f;
247 float liveTime = Math.max(delay, 0f);
251 if (liveTime <= 0.016f) {
static CombatEngineAPI getCombatEngine()
void modifyMult(String source, float value)
DwellerShroudParams getShroudParams()
static DwellerShroud getShroudFor(CombatEntityAPI entity)
static void fireArc(DamagingProjectileAPI projectile, WeaponAPI weapon, Vector2f point, CombatEntityAPI target)
static String RIFT_LIGHTNING_DAMAGE_REMOVER
void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine)
static String RIFT_LIGHTNING_FIRED_TAG
List< FiredLightningProjectile > fired
static float RIFT_LIGHTNING_SPEED
static Color RIFT_LIGHTNING_COLOR
static void spawnMine(ShipAPI source, Vector2f mineLoc, float delay)
void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon)
static String RIFT_LIGHTNING_SOURCE_WEAPON
void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine)
static Vector2f getUnitVectorAtDegreeAngle(float degrees)
static float getDistance(SectorEntityToken from, SectorEntityToken to)
static float getAngleInDegrees(Vector2f v)
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)
Map< String, Object > getCustomData()
MutableStat getModifier()
void addDamagedAlready(CombatEntityAPI c)
Vector2f getSpawnLocation()
void setSingleFlickerMode()
void setFadedOutAtStart(boolean fadedOutAtStart)
void setRenderGlowAtStart(boolean renderGlowAtStart)
void setCoreWidthOverride(float coreWidthOverride)
void fadeOutThenIn(float inDur)
void setNoMineFFConcerns(boolean noFFConcerns)
void setFlightTime(float flightTime)
DamagingProjectileAPI explode()