Advertisement
DarkRevenant

Untitled

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