penetrate armor
http://www.tudou.com/v/jEip1MVC0yY/&rpid=4866143&resourceId=4866143_04_05_99/v.swf
package data.scripts.effect;
import java.awt.Color;
import org.lwjgl.util.vector.Vector2f;
import com.fs.starfarer.api.combat.CombatEngineAPI;
import com.fs.starfarer.api.combat.CombatEntityAPI;
import com.fs.starfarer.api.combat.DamageType;
import com.fs.starfarer.api.combat.DamagingProjectileAPI;
import com.fs.starfarer.api.combat.OnHitEffectPlugin;
import com.fs.starfarer.api.combat.ShipAPI;
import com.fs.starfarer.api.combat.WeaponAPI;
import com.fs.starfarer.api.combat.FluxTrackerAPI;
import com.fs.starfarer.api.combat.ArmorGridAPI;
public class OnHit_AP_Effect implements OnHitEffectPlugin {
public void onHit(DamagingProjectileAPI projectile, CombatEntityAPI target, Vector2f point, boolean shieldHit, CombatEngineAPI engine) {
if (target instanceof ShipAPI) {
ShipAPI sourceShip = projectile.getSource();
if(sourceShip != null){
WeaponAPI weaponFrom = projectile.getWeapon();
if(weaponFrom != null){
Vector2f projectileLocation = projectile.getLocation();
Vector2f projectileVelocity = projectile.getVelocity();
Vector2f targetLocation = target.getLocation();
Vector2f targetVelocity = target.getVelocity();
float pointRange = (float)Math.sqrt((point.getX() - targetLocation.getX()) * (point.getX() - targetLocation.getX()) + (point.getY() - targetLocation.getY()) * (point.getY() - targetLocation.getY()));
double cosValue = (double)((point.getX() - targetLocation.getX())/pointRange);
float hitAngle = (float)(Math.acos(cosValue) * (180/Math.PI));
if(point.getY() < targetLocation.getY()){
hitAngle = 360 - hitAngle;
}
pointRange = (float)Math.sqrt(projectileVelocity.getX() * projectileVelocity.getX() + projectileVelocity.getY() * projectileVelocity.getY());
cosValue = (double)(projectileVelocity.getX()/pointRange);
float fromAngle = (float)(Math.acos(cosValue) * (180/Math.PI));
if(projectileVelocity.getY() < 0){
fromAngle = 360 - fromAngle;
}
float reflectAngle = (hitAngle + hitAngle - fromAngle) % 360f + 180;
float damageAmount = projectile.getDamageAmount();
float empAmount = projectile.getEmpAmount();
DamageType damageType = projectile.getDamageType();
if(shieldHit){
float reboundAngle = (hitAngle > fromAngle)?(hitAngle - fromAngle):(fromAngle - hitAngle);
reboundAngle = reboundAngle > 180f?(360f - reboundAngle):reboundAngle;
//engine.addFloatingText(point, "" + reboundAngle, 20, new Color(255,255,255,255), target, 1f, 2f);
if(reboundAngle <= 150){
engine.spawnProjectile(null, null, weaponFrom.getId(), point, reflectAngle, null);
engine.addFloatingText(point, "
", 30, new Color(225,200,50,255), target, 1f, 2f);
//FluxTrackerAPI targetFlux = ((ShipAPI)target).getFluxTracker();
//if(targetFlux != null){
//float hardFlux = targetFlux.getHardFlux();
//targetFlux.decreaseFlux(damageAmount * 2f);
//}
}else{
engine.applyDamage(target, point, damageAmount * (float)(Math.random() * 0.25 + 0.25), damageType, empAmount, false, false, null);
}
}else{
ArmorGridAPI targetArmorGrid = ((ShipAPI)target).getArmorGrid();
float targetArmorRating = targetArmorGrid.getArmorRating();
float penetrateValue = damageAmount * 3.5f - targetArmorRating;
if((penetrateValue > 0) && (targetArmorRating > 0) && ((float)Math.random() <= (penetrateValue / targetArmorRating))){
Vector2f penetrateVelocity = new Vector2f(projectileVelocity.getX(),projectileVelocity.getY());
penetrateVelocity = penetrateVelocity.normalise(penetrateVelocity);
Vector2f penetrateLocation = new Vector2f(point.getX()+penetrateVelocity.getX()*50f , point.getY()+penetrateVelocity.getY()*50f);
engine.spawnExplosion(penetrateLocation, new Vector2f(penetrateVelocity.getX()*50f, penetrateVelocity.getY()*50f), new Color(225,200,50,200), damageAmount / 10f, 0.5f);
for(int i = 0;i < (int)(damageAmount / 50);i++){
engine.addHitParticle(penetrateLocation, new Vector2f(penetrateVelocity.getX()*200f+(float)(Math.random()*100-50), penetrateVelocity.getY()*200f+(float)(Math.random()*100-50)), (float)(damageAmount / 50), 0.5f, 3f, new Color(225,200,50,200));//Color(225,200,50,200)
}
CombatEntityAPI projectileSpawned = engine.spawnProjectile(null, null, weaponFrom.getId(), penetrateLocation, fromAngle, null);
((DamagingProjectileAPI)projectileSpawned).setSource((ShipAPI)target);
engine.applyDamage(target, point, damageAmount * (float)(Math.random() * 1 + 1), damageType, empAmount, true, true, null);
engine.addFloatingText(penetrateLocation, "
", 30, new Color(255,0,0,255), target, 1f, 2f);
}
}
}
}
}
}
}