40 public void apply(MutableShipStatsAPI stats,
final String
id, State state,
float effectLevel) {
42 if (stats.getEntity() instanceof ShipAPI) {
43 ship = (ShipAPI) stats.getEntity();
48 final String targetDataKey = ship.getId() +
"_interdictor_target_data";
51 if (state == State.IN && targetDataObj ==
null) {
54 }
else if (state == State.IDLE && targetDataObj !=
null) {
57 if (targetDataObj ==
null || ((TargetData) targetDataObj).target ==
null)
return;
59 final TargetData targetData = (TargetData) targetDataObj;
62 List<ShipAPI> targets =
new ArrayList<ShipAPI>();
63 if (targetData.target.isFighter() || targetData.target.isDrone()) {
65 List<ShipAPI> ships = engine.getShips();
66 for (ShipAPI other : ships) {
67 if (other.isShuttlePod())
continue;
68 if (other.isHulk())
continue;
69 if (!other.isDrone() && !other.isFighter())
continue;
70 if (other.getOriginalOwner() != targetData.target.getOriginalOwner())
continue;
72 float dist = Misc.getDistance(other.getLocation(), targetData.target.getLocation());
78 targets.add(targetData.target);
82 for (ShipAPI target : targets) {
83 if (effectLevel >= 1) {
85 color = Misc.setAlpha(color, 255);
88 if (target.getFluxTracker().showFloaty() ||
91 target.getFluxTracker().showOverloadFloatyIfNeeded(
"Drive Interdicted!", color, 4f,
true);
96 ShipEngineControllerAPI ec = target.getEngineController();
97 float limit = ec.getFlameoutFraction();
98 if (target.isDrone() || target.isFighter()) {
102 float disabledSoFar = 0f;
103 boolean disabledAnEngine =
false;
104 List<ShipEngineAPI> engines =
new ArrayList<ShipEngineAPI>(ec.getShipEngines());
105 Collections.shuffle(engines);
107 for (ShipEngineAPI engine : engines) {
108 if (engine.isDisabled())
continue;
109 float contrib = engine.getContribution();
110 if (disabledSoFar + contrib <= limit) {
112 disabledSoFar += contrib;
113 disabledAnEngine =
true;
116 if (!disabledAnEngine) {
117 for (ShipEngineAPI engine : engines) {
118 if (engine.isDisabled())
continue;
126 if (effectLevel > 0) {
127 float jitterLevel = effectLevel;
128 float maxRangeBonus = 20f + target.getCollisionRadius() * 0.25f;
129 float jitterRangeBonus = jitterLevel * maxRangeBonus;
130 if (state == State.OUT) {
131 jitterRangeBonus = maxRangeBonus + (1f - jitterLevel) * maxRangeBonus;
133 target.setJitter(
this,
136 jitterLevel, 6, 0f, 0 + jitterRangeBonus);
142 jitterLevel, 6, 0f, 0 + jitterRangeBonus);
162 FindShipFilter filter =
new FindShipFilter() {
163 public boolean matches(ShipAPI ship) {
164 return !ship.getEngineController().isFlamedOut();
170 ShipAPI target = ship.getShipTarget();
171 if (target !=
null) {
172 float dist = Misc.getDistance(ship.getLocation(), target.getLocation());
173 float radSum = ship.getCollisionRadius() + target.getCollisionRadius();
174 if (dist > range + radSum) target =
null;
176 if (target ==
null || target.getOwner() == ship.getOwner()) {
178 target = Misc.findClosestShipEnemyOf(ship, ship.getMouseTarget(), HullSize.FIGHTER, range,
true, filter);
180 Object test = ship.getAIFlags().getCustom(AIFlags.MANEUVER_TARGET);
181 if (test instanceof ShipAPI) {
182 target = (ShipAPI) test;
183 float dist = Misc.getDistance(ship.getLocation(), target.getLocation());
184 float radSum = ship.getCollisionRadius() + target.getCollisionRadius();
185 if (dist > range + radSum) target =
null;
189 if (target ==
null) {
190 target = Misc.findClosestShipEnemyOf(ship, ship.getLocation(), HullSize.FIGHTER, range,
true, filter);