Advertisement
DarkRevenant

Untitled

Apr 26th, 2014
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.21 KB | None | 0 0
  1. package data.scripts.weapons;
  2.  
  3. import com.fs.starfarer.api.Global;
  4. import com.fs.starfarer.api.combat.CombatEntityAPI;
  5. import com.fs.starfarer.api.combat.DamageType;
  6. import com.fs.starfarer.api.combat.GuidedMissileAI;
  7. import com.fs.starfarer.api.combat.MissileAIPlugin;
  8. import com.fs.starfarer.api.combat.MissileAPI;
  9. import com.fs.starfarer.api.combat.ShipAPI;
  10. import com.fs.starfarer.api.combat.ShipCommand;
  11. import com.fs.starfarer.api.util.IntervalUtil;
  12. import java.util.*;
  13. import org.lazywizard.lazylib.CollectionUtils;
  14. import org.lazywizard.lazylib.MathUtils;
  15. import org.lazywizard.lazylib.VectorUtils;
  16. import org.lazywizard.lazylib.combat.AIUtils;
  17. import org.lazywizard.lazylib.combat.CombatUtils;
  18. import org.lwjgl.util.vector.Vector2f;
  19.  
  20. public class BallistaAI implements MissileAIPlugin, GuidedMissileAI {
  21.  
  22.     private final MissileAPI missile;
  23.     private CombatEntityAPI target;
  24.     private float offtarget = 0f;
  25.     private float baseofftarget = 0f;
  26.     private IntervalUtil Timer = new IntervalUtil(0.1f, 0.2f);
  27.  
  28.     public static ShipAPI findBestTarget(MissileAPI missile) {
  29.         ShipAPI source = missile.getSource();
  30.         if (source != null && source.getShipTarget() != null && !source.getShipTarget().isHulk()) {
  31.             return source.getShipTarget();
  32.         }
  33.  
  34.         ShipAPI closest = null;
  35.         float distance, closestDistance = Float.MAX_VALUE;
  36.  
  37.         for (ShipAPI tmp : AIUtils.getEnemiesOnMap(missile)) {
  38.             if (tmp.isFighter() || tmp.isDrone()) {
  39.                 continue;
  40.             }
  41.             distance = MathUtils.getDistance(tmp, missile.getLocation());
  42.             if (distance < closestDistance) {
  43.                 closest = tmp;
  44.                 closestDistance = distance;
  45.             }
  46.         }
  47.  
  48.         return closest;
  49.     }
  50.  
  51.     public BallistaAI(MissileAPI missile, ShipAPI launchingShip) {
  52.         this.missile = missile;
  53.         this.offtarget = 20f * (0.5f - (float) Math.random());
  54.         this.baseofftarget = 20f * (0.5f - (float) Math.random());
  55.  
  56.         List<ShipAPI> directTargets = CombatUtils.getShipsWithinRange(launchingShip.getMouseTarget(), 100f);
  57.         if (!directTargets.isEmpty()) {
  58.             Collections.sort(directTargets, new CollectionUtils.SortEntitiesByDistance(launchingShip.getMouseTarget()));
  59.             for (ShipAPI tmp : directTargets) {
  60.                 if (!tmp.isHulk() && tmp.getOwner() != launchingShip.getOwner()) {
  61.                     setTarget(tmp);
  62.                     break;
  63.                 }
  64.             }
  65.         }
  66.  
  67.         if (target == null) {
  68.             setTarget(findBestTarget(missile));
  69.         }
  70.     }
  71.  
  72.     @Override
  73.     public void advance(float amount) {
  74.         if (missile.isFading() || missile.isFizzling()) {
  75.             Global.getCombatEngine().applyDamage(missile, missile.getLocation(), missile.getHitpoints() * 2f, DamageType.FRAGMENTATION, 0f, false, false, missile);
  76.             return;
  77.         }
  78.  
  79.         Timer.advance(amount);
  80.  
  81.         // If our current target is lost, assign a new one
  82.         if (target == null || (target instanceof ShipAPI && ((ShipAPI) target).isHulk()) || (missile.getOwner() == target.getOwner()) || !Global.getCombatEngine().isEntityInPlay(target)) {
  83.             setTarget(findBestTarget(missile));
  84.             return;
  85.         }
  86.  
  87.         float angularDistance = MathUtils.getShortestRotation(missile.getFacing(), VectorUtils.getAngle(missile.getLocation(), target.getLocation()));
  88.  
  89.         if (Timer.intervalElapsed()) {
  90.             offtarget = (offtarget > 0 ? offtarget - 1 : offtarget + 1);
  91.         }
  92.  
  93.         float distance = MathUtils.getDistance(target.getLocation(), missile.getLocation());
  94.         float offtargetby = (0f + (offtarget + (baseofftarget * target.getCollisionRadius() / 75f)));
  95.  
  96.         // Make it slightly more accurate
  97.         if (distance <= target.getCollisionRadius() * 2f) {
  98.             offtargetby *= (distance - target.getCollisionRadius() * 1.5f) / target.getCollisionRadius() + 0.5f;
  99.         }
  100.  
  101.         float AbsAngD = Math.abs(angularDistance - offtargetby);
  102.  
  103.         // Point towards target  
  104.         if (AbsAngD > 0.5) {
  105.             // Makes missile fly off target
  106.             missile.giveCommand(angularDistance > offtargetby ? ShipCommand.TURN_LEFT : ShipCommand.TURN_RIGHT);
  107.         }
  108.  
  109.         // Course correction
  110.         if (AbsAngD < 5) {
  111.             float MFlightAng = VectorUtils.getAngle(new Vector2f(0, 0), missile.getVelocity());
  112.             float MFlightCC = MathUtils.getShortestRotation(missile.getFacing(), MFlightAng);
  113.             if (Math.abs(MFlightCC) > 20) {
  114.                 missile.giveCommand(MFlightCC < 0 ? ShipCommand.STRAFE_LEFT : ShipCommand.STRAFE_RIGHT);
  115.             }
  116.         }
  117.  
  118.         missile.giveCommand(ShipCommand.ACCELERATE);
  119.         /*if (AbsAngD >= 135f) {
  120.          missile.giveCommand(ShipCommand.DECELERATE);
  121.          } else {
  122.          missile.giveCommand(ShipCommand.ACCELERATE);
  123.          }*/
  124.  
  125.         if (AbsAngD < 0.4) {
  126.             missile.setAngularVelocity(0);
  127.         }
  128.     }
  129.  
  130.     @Override
  131.     public CombatEntityAPI getTarget() {
  132.         return target;
  133.     }
  134.  
  135.     @Override
  136.     public void setTarget(CombatEntityAPI target) {
  137.         this.target = target;
  138.     }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement