Advertisement
DarkRevenant

Untitled

May 2nd, 2014
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.74 KB | None | 0 0
  1. package data.shipsystems.scripts;
  2.  
  3. import com.fs.starfarer.api.combat.MutableShipStatsAPI;
  4. import com.fs.starfarer.api.plugins.ShipSystemStatsScript;
  5. import com.fs.starfarer.api.Global;
  6. import com.fs.starfarer.api.combat.CombatEngineAPI;
  7. import com.fs.starfarer.api.combat.EveryFrameCombatPlugin;
  8. import com.fs.starfarer.api.combat.ShipAPI;
  9. import com.fs.starfarer.api.input.InputEventAPI;
  10.  
  11. import org.lazywizard.lazylib.MathUtils;
  12. import org.lazywizard.lazylib.combat.CombatUtils;
  13.  
  14. import java.util.Iterator;
  15. import java.util.LinkedHashMap;
  16. import java.util.LinkedHashSet;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.Set;
  20.  
  21. public class flux_parasites implements ShipSystemStatsScript, EveryFrameCombatPlugin {
  22.  
  23.     private CombatEngineAPI engine;
  24.  
  25.     public static final String SYSTEM_ID = "INSERT_SHIT_HERE";
  26.  
  27.     public static final float RANGE = 2000f;
  28.     public static final float ACCURACY_BONUS = 50f;
  29.     public static final float RANGE_BONUS = 20f;
  30.  
  31.     private static final Set<ShipAPI> masters = new LinkedHashSet<>();
  32.     private static final Map<ShipAPI, ShipAPI> slaves = new LinkedHashMap<>();
  33.  
  34.     @Override
  35.     public void apply(MutableShipStatsAPI stats, String id, State state, float effectLevel) {
  36.         ShipAPI ship = (ShipAPI) stats.getEntity();
  37.  
  38.         if (!masters.contains(ship)) {
  39.             masters.add(ship);
  40.         }
  41.     }
  42.  
  43.     @Override
  44.     public void unapply(MutableShipStatsAPI stats, String id) {
  45.         ShipAPI ship = (ShipAPI) stats.getEntity();
  46.  
  47.         if (masters.contains(ship)) {
  48.             masters.remove(ship);
  49.         }
  50.     }
  51.  
  52.     @Override
  53.     public StatusData getStatusData(int index, State state, float effectLevel) {
  54.         if (index == 0) {
  55.             return new StatusData("released", false);
  56.         }
  57.         return null;
  58.     }
  59.  
  60.     @Override
  61.     public void advance(float amount, List<InputEventAPI> events) {
  62.         if (engine != Global.getCombatEngine()) {
  63.             masters.clear();
  64.             slaves.clear();
  65.             this.engine = Global.getCombatEngine();
  66.             return;
  67.         }
  68.  
  69.         // Forcefully clean up dead masters, just in case
  70.         Iterator<ShipAPI> iter1 = masters.iterator();
  71.         while (iter1.hasNext()) {
  72.             ShipAPI ship = iter1.next();
  73.  
  74.             if (ship.isHulk() || !engine.isEntityInPlay(ship)) {
  75.                 iter1.remove();
  76.             }
  77.         }
  78.  
  79.         // Unbuff ships outside of range of any master
  80.         Iterator<Map.Entry<ShipAPI, ShipAPI>> iter2 = slaves.entrySet().iterator();
  81.         while (iter2.hasNext()) {
  82.             Map.Entry<ShipAPI, ShipAPI> entry = iter2.next();
  83.  
  84.             ShipAPI ship = entry.getKey();
  85.             ShipAPI master = entry.getValue();
  86.  
  87.             if (MathUtils.getDistance(ship, master) > RANGE) {
  88.                 boolean foundMaster = false;
  89.  
  90.                 List<ShipAPI> newMasters = CombatUtils.getShipsWithinRange(ship.getLocation(), RANGE);
  91.                 for (ShipAPI newMaster : newMasters) {
  92.                     if (ship == newMaster || newMaster.getOwner() != ship.getOwner()) {
  93.                         continue;
  94.                     }
  95.  
  96.                     if (masters.contains(newMaster)) {
  97.                         entry.setValue(newMaster);
  98.                         foundMaster = true;
  99.                         break;
  100.                     }
  101.                 }
  102.  
  103.                 // No master: no more buffs
  104.                 if (!foundMaster) {
  105.                     ship.getMutableStats().getAutofireAimAccuracy().unmodify(SYSTEM_ID);
  106.                     ship.getMutableStats().getFluxCapacity().unmodify(SYSTEM_ID);
  107.                     ship.getMutableStats().getFluxDissipation().unmodify(SYSTEM_ID);
  108.  
  109.                     iter2.remove();
  110.                 }
  111.             }
  112.         }
  113.  
  114.         // Buff ships within range
  115.         for (ShipAPI master : masters) {
  116.             if (master.isHulk()) {
  117.                 continue;
  118.             }
  119.  
  120.             List<ShipAPI> ships = CombatUtils.getShipsWithinRange(master.getLocation(), RANGE);
  121.             for (ShipAPI ship : ships) {
  122.                 if (ship == master || master.getOwner() != ship.getOwner()) {
  123.                     continue;
  124.                 }
  125.  
  126.                 if (!slaves.containsKey(ship)) {
  127.                     ship.getMutableStats().getAutofireAimAccuracy().modifyPercent(SYSTEM_ID, ACCURACY_BONUS);
  128.                     ship.getMutableStats().getFluxCapacity().modifyPercent(SYSTEM_ID, RANGE_BONUS);
  129.                     ship.getMutableStats().getFluxDissipation().modifyPercent(SYSTEM_ID, RANGE_BONUS);
  130.  
  131.                     slaves.put(ship, master);
  132.                 }
  133.             }
  134.         }
  135.     }
  136.  
  137.     @Override
  138.     public void init(CombatEngineAPI engine) {
  139.     }
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement