001package com.fs.starfarer.api.impl.campaign; 002 003import org.lwjgl.util.vector.Vector2f; 004 005import com.fs.starfarer.api.EveryFrameScript; 006import com.fs.starfarer.api.Script; 007import com.fs.starfarer.api.campaign.CampaignFleetAPI; 008import com.fs.starfarer.api.campaign.SectorEntityToken; 009import com.fs.starfarer.api.util.Misc; 010 011public class LeashScript implements EveryFrameScript { 012 013 private CampaignFleetAPI fleet; 014 private float range; 015 private Script onBroken; 016 017 private SectorEntityToken anchor; 018 private Vector2f offset; 019 020 public LeashScript(CampaignFleetAPI fleet, float range, SectorEntityToken anchor, Vector2f offset, Script onBroken) { 021 this.fleet = fleet; 022 this.range = range; 023 this.onBroken = onBroken; 024 this.anchor = anchor; 025 this.offset = offset; 026 } 027 028 private boolean broken = false; 029 public void advance(float amount) { 030 if (fleet.getContainingLocation() != anchor.getContainingLocation()) { 031 broken = true; 032 onBroken.run(); 033 } 034 if (broken) return; 035 036 037 Vector2f dest = new Vector2f(anchor.getLocation().x + offset.x, anchor.getLocation().y + offset.y); 038 float distToDest = Misc.getDistance(dest, fleet.getLocation()); 039 fleet.setMoveDestination(dest.x, dest.y); 040 if (distToDest < 2) { 041 fleet.setLocation(dest.x, dest.y); 042 } 043 044 float dist = Misc.getDistance(anchor.getLocation(), fleet.getLocation()); 045 if (dist > range + anchor.getRadius() + fleet.getRadius()) { 046 broken = true; 047 onBroken.run(); 048 } 049 050 } 051 052 public boolean isDone() { 053 return broken; 054 } 055 056 public boolean runWhilePaused() { 057 return false; 058 } 059} 060 061 062 063 064