001package com.fs.starfarer.api.impl.combat; 002 003import java.util.HashMap; 004import java.util.LinkedHashMap; 005 006import java.awt.Color; 007 008import org.lwjgl.util.vector.Vector2f; 009 010import com.fs.starfarer.api.Global; 011import com.fs.starfarer.api.combat.CombatEngineAPI; 012import com.fs.starfarer.api.combat.DamagingProjectileAPI; 013import com.fs.starfarer.api.combat.OnFireEffectPlugin; 014import com.fs.starfarer.api.combat.ShipAPI; 015import com.fs.starfarer.api.combat.WeaponAPI; 016import com.fs.starfarer.api.loading.MuzzleFlashSpec; 017import com.fs.starfarer.api.loading.ProjectileWeaponSpecAPI; 018import com.fs.starfarer.api.util.Misc; 019 020public class HeavyAdjudicatorEffect implements OnFireEffectPlugin { 021 022 /** 023 * Key is <hullId>_<slot id>. 024 */ 025 public static HashMap<String, Vector2f> SECOND_MUZZLE_FLASH_OFFSET_MAP = new LinkedHashMap<>(); 026 027 static { 028 SECOND_MUZZLE_FLASH_OFFSET_MAP.put("onslaught_mk1_WS 016", new Vector2f(-39, 17)); 029 SECOND_MUZZLE_FLASH_OFFSET_MAP.put("onslaught_mk1_WS 017", new Vector2f(-39, -18)); 030 } 031 032 033 public HeavyAdjudicatorEffect() { 034 } 035 036 public void onFire(DamagingProjectileAPI projectile, WeaponAPI weapon, CombatEngineAPI engine) { 037 ShipAPI ship = projectile.getSource(); 038 if (ship == null) return; 039 040 MuzzleFlashSpec spec = ((ProjectileWeaponSpecAPI)weapon.getSpec()).getMuzzleFlashSpec().clone(); 041 042 spec.setLength(30f); 043 spec.setParticleCount(30); 044 spec.setSpread(90f); 045// spec.setParticleSizeMin(3); 046// spec.setParticleSizeRange(0f); 047 048 Vector2f p = projectile.getLocation(); 049 float angle = weapon.getCurrAngle(); 050 051 spawnMuzzleFlash(((ProjectileWeaponSpecAPI)weapon.getSpec()).getMuzzleFlashSpec(), p, angle, ship.getVelocity(), 1f, 0f); 052 053 String slotId = weapon.getSlot().getId(); 054 String id = ship.getHullSpec().getBaseHullId() + "_" + slotId; 055 056 Vector2f offset = SECOND_MUZZLE_FLASH_OFFSET_MAP.get(id); 057 if (offset != null) { 058 float sign = Math.signum(offset.y); 059 offset = new Vector2f(offset); 060 offset = Misc.rotateAroundOrigin(offset, angle); 061 Vector2f.add(offset, p, offset); 062 spawnMuzzleFlash(spec, offset, angle + sign * 90f, ship.getVelocity(), 2f, 20f); 063 } 064 065 } 066 067 public static void spawnMuzzleFlash(MuzzleFlashSpec spec, Vector2f point, float angle, Vector2f shipVel, 068 float velMult, float velAdd) { 069 if (spec == null) return; 070 071 CombatEngineAPI engine = Global.getCombatEngine(); 072 073 Color color = spec.getParticleColor(); 074 float min = spec.getParticleSizeMin(); 075 float range = spec.getParticleSizeRange(); 076 float spread = spec.getSpread(); 077 float length = spec.getLength(); 078 for (int i = 0; i < spec.getParticleCount(); i++) { 079 float size = range * (float) Math.random() + min; 080 float theta = (float) (Math.random() * Math.toRadians(spread) + Math.toRadians(angle - spread/2f)); 081 float r = (float) (Math.random() * length); 082 Vector2f dir = new Vector2f((float)Math.cos(theta), (float)Math.sin(theta)); 083 float x = dir.x * r; 084 float y = dir.y * r; 085 Vector2f loc = new Vector2f(point.x + x, point.y + y); 086 Vector2f vel = new Vector2f(x * velMult + shipVel.x + dir.x * velAdd, 087 y * velMult + shipVel.y + dir.y * velAdd); 088 if (velAdd > 0 || true) { 089 Vector2f rand = Misc.getPointWithinRadius(new Vector2f(), spec.getLength() * 0.5f); 090 Vector2f.add(vel, rand, vel); 091 } 092 //engine.addSmoothParticle(loc, vel, size, 1f, spec.getParticleDuration(), color); 093 float dur = spec.getParticleDuration(); 094 dur *= 0.75f + (float) Math.random() * 0.5f; 095 size *= 1.25f; 096 engine.addNebulaParticle(loc, vel, size, 097 0.67f, // end size 098 //2f, // end size 099 0f, // ramp up 100 0f, // full brightness 101 dur, color); 102 } 103 } 104 105} 106 107 108 109