Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package data.scripts.weapons;
- import com.fs.starfarer.api.Global;
- import com.fs.starfarer.api.combat.CombatEntityAPI;
- import com.fs.starfarer.api.combat.DamageType;
- import com.fs.starfarer.api.combat.GuidedMissileAI;
- import com.fs.starfarer.api.combat.MissileAIPlugin;
- import com.fs.starfarer.api.combat.MissileAPI;
- import com.fs.starfarer.api.combat.ShipAPI;
- import com.fs.starfarer.api.combat.ShipCommand;
- import com.fs.starfarer.api.util.IntervalUtil;
- import java.util.*;
- import org.lazywizard.lazylib.CollectionUtils;
- import org.lazywizard.lazylib.MathUtils;
- import org.lazywizard.lazylib.VectorUtils;
- import org.lazywizard.lazylib.combat.AIUtils;
- import org.lazywizard.lazylib.combat.CombatUtils;
- import org.lwjgl.util.vector.Vector2f;
- public class BallistaAI implements MissileAIPlugin, GuidedMissileAI {
- private final MissileAPI missile;
- private CombatEntityAPI target;
- private float offtarget = 0f;
- private float baseofftarget = 0f;
- private IntervalUtil Timer = new IntervalUtil(0.1f, 0.2f);
- public static ShipAPI findBestTarget(MissileAPI missile) {
- ShipAPI source = missile.getSource();
- if (source != null && source.getShipTarget() != null && !source.getShipTarget().isHulk()) {
- return source.getShipTarget();
- }
- ShipAPI closest = null;
- float distance, closestDistance = Float.MAX_VALUE;
- for (ShipAPI tmp : AIUtils.getEnemiesOnMap(missile)) {
- if (tmp.isFighter() || tmp.isDrone()) {
- continue;
- }
- distance = MathUtils.getDistance(tmp, missile.getLocation());
- if (distance < closestDistance) {
- closest = tmp;
- closestDistance = distance;
- }
- }
- return closest;
- }
- public BallistaAI(MissileAPI missile, ShipAPI launchingShip) {
- this.missile = missile;
- this.offtarget = 20f * (0.5f - (float) Math.random());
- this.baseofftarget = 20f * (0.5f - (float) Math.random());
- List<ShipAPI> directTargets = CombatUtils.getShipsWithinRange(launchingShip.getMouseTarget(), 100f);
- if (!directTargets.isEmpty()) {
- Collections.sort(directTargets, new CollectionUtils.SortEntitiesByDistance(launchingShip.getMouseTarget()));
- for (ShipAPI tmp : directTargets) {
- if (!tmp.isHulk() && tmp.getOwner() != launchingShip.getOwner()) {
- setTarget(tmp);
- break;
- }
- }
- }
- if (target == null) {
- setTarget(findBestTarget(missile));
- }
- }
- @Override
- public void advance(float amount) {
- if (missile.isFading() || missile.isFizzling()) {
- Global.getCombatEngine().applyDamage(missile, missile.getLocation(), missile.getHitpoints() * 2f, DamageType.FRAGMENTATION, 0f, false, false, missile);
- return;
- }
- Timer.advance(amount);
- // If our current target is lost, assign a new one
- if (target == null || (target instanceof ShipAPI && ((ShipAPI) target).isHulk()) || (missile.getOwner() == target.getOwner()) || !Global.getCombatEngine().isEntityInPlay(target)) {
- setTarget(findBestTarget(missile));
- return;
- }
- float angularDistance = MathUtils.getShortestRotation(missile.getFacing(), VectorUtils.getAngle(missile.getLocation(), target.getLocation()));
- if (Timer.intervalElapsed()) {
- offtarget = (offtarget > 0 ? offtarget - 1 : offtarget + 1);
- }
- float distance = MathUtils.getDistance(target.getLocation(), missile.getLocation());
- float offtargetby = (0f + (offtarget + (baseofftarget * target.getCollisionRadius() / 75f)));
- // Make it slightly more accurate
- if (distance <= target.getCollisionRadius() * 2f) {
- offtargetby *= (distance - target.getCollisionRadius() * 1.5f) / target.getCollisionRadius() + 0.5f;
- }
- float AbsAngD = Math.abs(angularDistance - offtargetby);
- // Point towards target
- if (AbsAngD > 0.5) {
- // Makes missile fly off target
- missile.giveCommand(angularDistance > offtargetby ? ShipCommand.TURN_LEFT : ShipCommand.TURN_RIGHT);
- }
- // Course correction
- if (AbsAngD < 5) {
- float MFlightAng = VectorUtils.getAngle(new Vector2f(0, 0), missile.getVelocity());
- float MFlightCC = MathUtils.getShortestRotation(missile.getFacing(), MFlightAng);
- if (Math.abs(MFlightCC) > 20) {
- missile.giveCommand(MFlightCC < 0 ? ShipCommand.STRAFE_LEFT : ShipCommand.STRAFE_RIGHT);
- }
- }
- missile.giveCommand(ShipCommand.ACCELERATE);
- /*if (AbsAngD >= 135f) {
- missile.giveCommand(ShipCommand.DECELERATE);
- } else {
- missile.giveCommand(ShipCommand.ACCELERATE);
- }*/
- if (AbsAngD < 0.4) {
- missile.setAngularVelocity(0);
- }
- }
- @Override
- public CombatEntityAPI getTarget() {
- return target;
- }
- @Override
- public void setTarget(CombatEntityAPI target) {
- this.target = target;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement