41 interval.advance(days);
42 if (!interval.intervalElapsed())
return;
44 final float MAX_RANGE_FROM_MARKET = 5000;
45 final float MAX_RANGE_FROM_PLAYER = 2000;
48 if (player ==
null || player.isInHyperspace())
return;
49 final MarketAPI market = Misc.findNearestLocalMarket(player, MAX_RANGE_FROM_MARKET,
new MarketFilter() {
50 public boolean acceptMarket(MarketAPI market) {
51 if (market.hasCondition(Conditions.FREE_PORT))
return false;
53 MemoryAPI mem = market.getMemoryWithoutUpdate();
59 if (market ==
null)
return;
60 if (!market.getFaction().getCustomBoolean(Factions.CUSTOM_ALLOWS_TRANSPONDER_OFF_TRADE) && !player.isTransponderOn()) {
64 if (market.getFaction().isHostileTo(player.getFaction()))
return;
66 List<CampaignFleetAPI> patrols = Misc.findNearbyFleets(player, MAX_RANGE_FROM_PLAYER,
new FleetFilter() {
67 public boolean accept(CampaignFleetAPI curr) {
68 if (curr.getFaction() != market.getFaction())
return false;
69 if (curr.getFaction().isPlayerFaction())
return false;
70 if (curr.isHostileTo(player))
return false;
71 if (curr.isStationMode())
return false;
72 if (Misc.getSourceMarket(curr) != market)
return false;
73 if (!curr.getMemoryWithoutUpdate().getBoolean(MemFlags.MEMORY_KEY_PATROL_FLEET))
return false;
74 if (curr.getAI() instanceof ModularFleetAIAPI) {
75 ModularFleetAIAPI ai = (ModularFleetAIAPI) curr.getAI();
76 if (ai.isFleeing())
return false;
77 if (curr.getInteractionTarget() instanceof CampaignFleetAPI)
return false;
79 VisibilityLevel vis = player.getVisibilityLevelTo(curr);
80 if (vis == VisibilityLevel.NONE)
return false;
85 if (patrols.isEmpty())
return;
87 float minDist = Float.MAX_VALUE;
88 CampaignFleetAPI closestPatrol =
null;
89 float closestSuspicion = 0f;
90 for (CampaignFleetAPI curr : patrols) {
91 float dist = Misc.getDistance(player.getLocation(), curr.getLocation());
92 float extra = curr.getMemoryWithoutUpdate().getFloat(MemFlags.PATROL_EXTRA_SUSPICION);
93 if (dist < minDist || extra > closestSuspicion) {
95 closestSuspicion = extra;
100 if (closestPatrol ==
null)
return;
102 curr = closestPatrol;
104 float threshold = 0.05f;
105 MemoryAPI marketMemory = market.getMemory();
106 float suspicionLevel = marketMemory.getFloat(MemFlags.MEMORY_MARKET_SMUGGLING_SUSPICION_LEVEL);
107 suspicionLevel += closestSuspicion;
109 boolean doScan = (float) Math.random() < suspicionLevel * 5f && suspicionLevel >= threshold;
113 currDuration = 10f + (float) Math.random() * 5f;
115 MemoryAPI mem = curr.getMemoryWithoutUpdate();
116 Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_PURSUE_PLAYER,
"smugglingScan",
true, 1f);
117 Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_STICK_WITH_PLAYER_IF_ALREADY_TARGET,
"smugglingScan",
true, currDuration);
123 if (suspicionLevel >= threshold) {
124 float timeoutDuration = 20f + (float) Math.random() * 10f;
130 if (!curr.isAlive()) {
140 if (currElapsed > currDuration) {
149 if (player.isInHyperspace() || player.isInHyperspaceTransition()) {
154 VisibilityLevel vis = player.getVisibilityLevelTo(curr);
156 if (vis != VisibilityLevel.NONE) {
157 MemoryAPI mem = curr.getMemoryWithoutUpdate();
163 Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_PURSUE_PLAYER,
"smugglingScan",
true, 1f);
171 FleetAssignmentDataAPI a = curr.getCurrentAssignment();
172 if (a !=
null && a.getAssignment() == FleetAssignment.INTERCEPT &&
173 a.getTarget() == pf) {
174 curr.removeFirstAssignmentIfItIs(a.getAssignment());
176 curr.setInteractionTarget(
null);
177 if (curr.getAI() instanceof ModularFleetAIAPI) {
178 ModularFleetAIAPI ai = (ModularFleetAIAPI) curr.getAI();
179 if (ai.getTacticalModule().getTarget() == pf) {
180 ai.getTacticalModule().setTarget(
null);
184 MemoryAPI mem = curr.getMemoryWithoutUpdate();
185 Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_PURSUE_PLAYER,
"smugglingScan",
false, 0f);
186 Misc.setFlagWithReason(mem, MemFlags.MEMORY_KEY_STICK_WITH_PLAYER_IF_ALREADY_TARGET,
"smugglingScan",
false, 0f);
189 currDuration = currElapsed = 0f;