001package com.fs.starfarer.api.impl.combat.threat; 002 003import java.awt.Color; 004 005import org.lwjgl.util.vector.Vector2f; 006 007import com.fs.starfarer.api.combat.CombatEngineAPI; 008import com.fs.starfarer.api.combat.CombatEntityAPI; 009import com.fs.starfarer.api.combat.DamageAPI; 010import com.fs.starfarer.api.combat.DamagingProjectileAPI; 011import com.fs.starfarer.api.combat.EveryFrameWeaponEffectPlugin; 012import com.fs.starfarer.api.combat.OnFireEffectPlugin; 013import com.fs.starfarer.api.combat.OnHitEffectPlugin; 014import com.fs.starfarer.api.combat.ShipAPI; 015import com.fs.starfarer.api.combat.WeaponAPI; 016import com.fs.starfarer.api.combat.listeners.ApplyDamageResultAPI; 017import com.fs.starfarer.api.combat.listeners.DamageDealtModifier; 018import com.fs.starfarer.api.util.Misc; 019 020public class VoidblasterEffect implements OnHitEffectPlugin, OnFireEffectPlugin, EveryFrameWeaponEffectPlugin, 021 DamageDealtModifier { 022 023 protected String weaponId; 024 025 @Override 026 public void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon) { 027 028 } 029 030 @Override 031 public void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine) { 032 ShipAPI ship = weapon.getShip(); 033 if (!ship.hasListenerOfClass(VoidblasterEffect.class)) { 034 ship.addListener(this); 035 weaponId = weapon.getId(); 036 } 037 } 038 039 public void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, 040 Vector2f point, boolean shieldHit, ApplyDamageResultAPI damageResult, CombatEngineAPI engine) { 041 Vector2f vel = target.getVelocity(); 042 engine.addNegativeParticle(point, vel, 50f, 0f, 0.5f, Color.white); 043 engine.addNegativeParticle(point, vel, 30f, 0f, 0.5f, Color.white); 044 engine.addNegativeNebulaParticle(point, vel, 30f, 2f, 0f, 0f, 0.5f, Color.white); 045 //engine.addNegativeParticle(point, vel, 15f, 0f, 0.5f, Color.white); 046 if (!shieldHit) { 047 float dir = 0f; 048 float arc = 360f; 049 dir = Misc.getAngleInDegrees(target.getLocation(), point); 050 arc = 150f; 051 engine.spawnDebrisSmall(point, vel, 12, dir, arc, 20f, 20f, 720f); 052 engine.spawnDebrisMedium(point, vel, 4, dir, arc, 10f, 20f, 360f); 053 engine.spawnDebrisLarge(point, vel, 1, dir, arc, 10f, 10f, 180f); 054 } 055 } 056 057 058 public String modifyDamageDealt(Object param, CombatEntityAPI target, DamageAPI damage, Vector2f point, boolean shieldHit) { 059 if (param instanceof DamagingProjectileAPI) { 060 DamagingProjectileAPI p = (DamagingProjectileAPI) param; 061 if (p.getWeapon() != null && p.getWeapon().getId().equals(weaponId)) { 062 if (target instanceof ShipAPI) { 063 ((ShipAPI)target).setSkipNextDamagedExplosion(true); 064 } 065 if (shieldHit) { 066 damage.setSoftFlux(true); 067 } 068 return "voidblaster"; 069 } 070 } 071 return null; 072 } 073} 074 075 076 077 078 079 080