001package com.fs.starfarer.api.impl.campaign.fleets; 002 003import java.util.Iterator; 004 005import com.fs.starfarer.api.Global; 006import com.fs.starfarer.api.campaign.CampaignFleetAPI; 007import com.fs.starfarer.api.campaign.CampaignEventListener.FleetDespawnReason; 008import com.fs.starfarer.api.util.IntervalUtil; 009import com.fs.starfarer.api.util.Misc; 010 011 012public abstract class PlayerVisibleFleetManager extends BaseLimitedFleetManager { 013 014 protected IntervalUtil despawnTracker = new IntervalUtil(0.75f, 1.25f); 015 016 protected Object readResolve() { 017 super.readResolve(); 018 if (despawnTracker == null) { 019 despawnTracker = new IntervalUtil(0.75f, 1.25f); 020 } 021 return this; 022 } 023 024 @Override 025 public void advance(float amount) { 026 super.advance(amount); 027 028 boolean reset = false; 029 //reset = true; 030 031 if (reset) { 032 if (this instanceof DisposableFleetManager) { 033 DisposableFleetManager dfm = (DisposableFleetManager) this; 034 dfm.recentSpawns.clear(); 035 } 036 } 037 038 float days = Global.getSector().getClock().convertToDays(amount); 039 despawnTracker.advance(days); 040 if (despawnTracker.intervalElapsed()) { 041 Iterator<ManagedFleetData> iter = active.iterator(); 042 while (iter.hasNext()) { 043 ManagedFleetData curr = iter.next(); 044 if (reset || 045 (!isVisibleToPlayer(curr.fleet) && isOkToDespawnAssumingNotPlayerVisible(curr.fleet))) { 046 if (curr.fleet.getBattle() == null) { 047 curr.fleet.despawn(FleetDespawnReason.PLAYER_FAR_AWAY, null); 048 iter.remove(); 049 } 050 // can't just directly despawn as it might be involved in a battle or something else 051// if (curr.fleet.getAI() != null) { 052// curr.fleet.getAI().clearAssignments(); 053// curr.fleet.getAI().addAssignmentAtStart(FleetAssignment.GO_TO_LOCATION_AND_DESPAWN, curr.fleet, 100f, null); 054// } 055 } 056 } 057 } 058 } 059 060 protected abstract boolean isOkToDespawnAssumingNotPlayerVisible(CampaignFleetAPI fleet); 061 062 protected boolean isVisibleToPlayer(CampaignFleetAPI fleet) { 063 CampaignFleetAPI player = Global.getSector().getPlayerFleet(); 064 if (player == null) return false; 065 066 if (player.getContainingLocation() != fleet.getContainingLocation()) { 067 float dist = Misc.getDistance(player.getLocationInHyperspace(), fleet.getLocationInHyperspace()); 068 return dist < getHyperspaceCullRange(); 069 } 070 071 float cullRange = player.getMaxSensorRangeToDetect(fleet) + getInSystemCullRange(); 072 float dist = Misc.getDistance(player.getLocation(), fleet.getLocation()); 073 return dist < cullRange; 074 } 075 076 protected float getHyperspaceCullRange() { 077 return 1500; 078 } 079 080 protected float getInSystemCullRange() { 081 return 500; 082 } 083} 084 085 086 087 088 089 090 091 092 093 094 095 096 097 098 099 100 101