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