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