41 interval.advance(days);
42 if (!interval.intervalElapsed())
return;
44 final float MAX_RANGE_FROM_PLAYER = 2000;
50 if (player ==
null || player.isInHyperspace())
return;
53 List<CampaignFleetAPI> fleets = Misc.findNearbyFleets(player, MAX_RANGE_FROM_PLAYER,
new FleetFilter() {
54 public boolean accept(CampaignFleetAPI curr) {
55 if (curr.getFaction().isPlayerFaction())
return false;
56 if (curr.isHostileTo(player))
return false;
57 if (curr.isStationMode())
return false;
58 if (!curr.getMemoryWithoutUpdate().getBoolean(MemFlags.WILL_HASSLE_PLAYER))
return false;
59 if (curr.getMemoryWithoutUpdate().getBoolean(MemFlags.FLEET_SPECIAL_ACTION))
return false;
61 String type = curr.getMemoryWithoutUpdate().getString(MemFlags.HASSLE_TYPE);
62 if (type ==
null || type.isEmpty())
return false;
64 if (global.contains(timeoutKey))
return false;
66 if (curr.getAI() instanceof ModularFleetAIAPI) {
67 ModularFleetAIAPI ai = (ModularFleetAIAPI) curr.getAI();
68 if (ai.isFleeing())
return false;
69 if (curr.getInteractionTarget() instanceof CampaignFleetAPI)
return false;
72 VisibilityLevel vis = player.getVisibilityLevelTo(curr);
73 if (vis == VisibilityLevel.NONE)
return false;
78 if (fleets.isEmpty())
return;
80 float minDist = Float.MAX_VALUE;
81 CampaignFleetAPI closestHassler =
null;
82 for (CampaignFleetAPI curr : fleets) {
83 float dist = Misc.getDistance(player.getLocation(), curr.getLocation());
86 closestHassler = curr;
90 if (closestHassler ==
null)
return;
92 curr = closestHassler;
94 boolean hassle = (float) Math.random() < 0.25f;
97 currDuration = 10f + (float) Math.random() * 5f;
99 MemoryAPI mem = curr.getMemoryWithoutUpdate();
100 Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_PURSUE_PLAYER,
"hassle",
true, 1f);
101 mem.set(MemFlags.FLEET_SPECIAL_ACTION,
true, 1f);
102 Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_STICK_WITH_PLAYER_IF_ALREADY_TARGET,
"hassle",
true, currDuration);
104 startHyperLoc = curr.getLocationInHyperspace();
106 if (curr.isInHyperspace()) {
110 float timeoutDuration = 20f + (float) Math.random() * 10f;
112 String type = curr.getMemoryWithoutUpdate().getString(MemFlags.HASSLE_TYPE);
113 if (type !=
null && !type.isEmpty()) {
115 global.set(timeoutKey,
true, timeoutDuration);
124 if (!curr.isAlive()) {
134 if (currElapsed > currDuration) {
142 if (startHyperLoc !=
null) {
143 float dist = Misc.getDistanceLY(player.getLocationInHyperspace(), startHyperLoc);
144 if (dist > leashRange) {
154 MemoryAPI mem = curr.getMemoryWithoutUpdate();
159 Misc.setFlagWithReason(mem, MemFlags.FLEET_BUSY,
"hassle",
true, 1f);
160 mem.set(MemFlags.FLEET_SPECIAL_ACTION,
true, 1f);
163 VisibilityLevel vis = player.getVisibilityLevelTo(curr);
164 if (vis != VisibilityLevel.NONE) {
165 Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_PURSUE_PLAYER,
"hassle",
true, 1f);
175 FleetAssignmentDataAPI a = curr.getCurrentAssignment();
176 if (a !=
null && a.getAssignment() == FleetAssignment.INTERCEPT &&
177 a.getTarget() == pf) {
178 curr.removeFirstAssignmentIfItIs(a.getAssignment());
180 curr.setInteractionTarget(
null);
181 if (curr.getAI() instanceof ModularFleetAIAPI) {
182 ModularFleetAIAPI ai = (ModularFleetAIAPI) curr.getAI();
183 if (ai.getTacticalModule().getTarget() == pf) {
184 ai.getTacticalModule().setTarget(
null);
188 MemoryAPI mem = curr.getMemoryWithoutUpdate();
189 Misc.setFlagWithReason(mem, MemFlags.FLEET_BUSY,
"hassle",
false, 0f);
190 mem.unset(MemFlags.FLEET_SPECIAL_ACTION);
191 Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_PURSUE_PLAYER,
"hassle",
false, 0f);
192 Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_STICK_WITH_PLAYER_IF_ALREADY_TARGET,
"hassle",
false, 0f);
195 currDuration = currElapsed = 0f;
196 startHyperLoc =
null;