public void AddDrone(ConquestDrone drone)
        {
            foreach (var squad in _squads)
            {
                if (squad.DroneCount() < DronesPerConquestSquad)
                {
                    Util.GetInstance().Log("[ConquestDronemanager.AddDrone] drone added!");
                    squad.AddDrone(drone);
                    return;
                }
            }

            if (_squads.Count < MaxNumConquestSquads)
            {
                var sq = new ConquestDroneSquad(drone.GetOwnerId());
                sq.AddDrone(drone);
                Util.GetInstance().Log("[ConquestDronemanager.AddDrone] squad created: drone added!");
                _squads.Add(sq);
                sq.SetOwner(drone.GetOwnerId());
            }
        }
        private ConquestMission GenerateMission(ConquestDroneSquad squad, bool assistOnly = false)
        {
            bool readyForNewMission = squad.ReadyForNewMission(ticks);
            bool previousMissionGuard = squad.Mission() != null && squad.Mission().MissionType == ActionTypes.Guard;

            if (!readyForNewMission && !assistOnly)
                return null;

            if (!previousMissionGuard)
                Util.GetInstance().Log("[ConquestDroneManager.GenerateMission] PreviousMission Expired " + squad.myid, logpath);

            if (squad.Mission() != null && squad.Mission().IsAsteroid)
                _asteroids[squad.Mission().asteroid] = _asteroids[squad.Mission().asteroid] + 1;

            bool ong = false;
            Vector3D loc = Vector3D.Zero;
            int start = ticks;
            ConquestMission mission = null;

            if(!assistOnly)
            //try to patrol around the mothership if there are open positions
            if (NumGuardingDroneSquads < MaxNumGuardingDroneSquads)
            {
                loc = _mothershipLocation;
                // the 0 is to make this mission always last only one command cycle, so if the squad dies I wont have to so multipule updates removing it as a guarding squad
                mission = new ConquestMission(ong, loc, start, ActionTypes.Guard);
                //Util.GetInstance().Log("[ConquestDroneManager.GenerateMission] guard Home "+squad.myid, logpath);
                NumGuardingDroneSquads++;
                return mission;
            }

            //if any drones are in need of assistance then assist them
            foreach (var pair in _combatSites)
            {
                if (!(CalculateTargetPriority(pair.Key) >= _combatSites[pair.Key] + 1))
                    continue;

                Util.GetInstance()
                    .Log(
                        "[ConquestDroneManager.GenerateMission] Number of combat sites in need of help " +
                        _combatSites.Count(), logpath);
                loc = pair.Key*3000;
                _combatSites[pair.Key] = _combatSites[pair.Key] + 1;
                mission = new ConquestMission(ong, loc, start, ActionTypes.Assist);
                Util.GetInstance()
                    .Log("[ConquestDroneManager.GenerateMission] joining in combat " + squad.myid, logpath);

                return mission;

            }

            //i dont think visiting asteroids is nessessary, they explore enough to find players as is
            //if (!assistOnly)
            //{
            //    var asteroids =
            //        _asteroids.OrderBy(x => x.Value)
            //            .Where(y => (y.Key.GetPosition() - squad.GetLocation()).Length() < DroneMaxRange);
            //    //if there are nearby unexplored asteroids explore them
            //    foreach (var pair in asteroids)
            //    {
            //        int max = _asteroids.Values.Max();
            //        if (pair.Value < max || _asteroids.Count == _asteroids.Count(x=>x.Value == max))
            //        {
            //            loc = pair.Key.GetPosition();
            //            mission = new ConquestMission(ong, loc, start, ActionTypes.Assist, DroneMaxRange/15, true,
            //                pair.Key);
            //            Util.GetInstance()
            //                .Log("[ConquestDroneManager.GenerateMission] orbit asteroid " + squad.myid, logpath);
            //        }
            //        return mission;
            //    }
            //}

            if (assistOnly)
                return mission;
            //generate a random patrol route

            int X = r.Next(-DroneMaxRange,DroneMaxRange);
            int Y = r.Next(-DroneMaxRange,DroneMaxRange);
            int Z = r.Next(-DroneMaxRange, DroneMaxRange);

            loc = _mothershipLocation + new Vector3D(X, Y, Z);
            Util.GetInstance().Log("[ConquestDroneManager.GenerateMission] Patrol loc:" +loc+" "+ squad.myid, logpath);
            mission = new ConquestMission(ong, loc, start, ActionTypes.Patrol, DroneMaxRange/1000*60);

            return mission;
        }
        public void UpdateSquadMission(ConquestDroneSquad squad)
        {
            ConquestMission mission = null;
            if (squad.Mission()!=null && squad.Mission().MissionType == ActionTypes.Patrol)
            {
                mission = GenerateMission(squad,true);
                if (mission != null)
                {
                    squad.IssueMission(mission);
                    squad.SetOwner(GetMothershipID());
                    Util.GetInstance().Log("[ConquestDroneManager.UpdateSquadMission] Switching from patrol mission to assist Mission " + squad.myid, logpath);
                }

            }

            if (mission == null)
            {
                mission = squad.ReadyForNewMission(ticks) ? GenerateMission(squad) : squad.Mission();
                squad.IssueMission(mission);
                squad.SetOwner(GetMothershipID());
            }
        }