示例#1
0
文件: Panic.cs 项目: vercetti/Questor
        public void ProcessState()
        {
            switch (State)
            {
                case PanicState.Normal:
                    _lastNormalX = Cache.Instance.DirectEve.ActiveShip.Entity.X;
                    _lastNormalY = Cache.Instance.DirectEve.ActiveShip.Entity.Y;
                    _lastNormalZ = Cache.Instance.DirectEve.ActiveShip.Entity.Z;

                    if (Cache.Instance.DirectEve.ActiveShip.GroupId == (int) Group.Capsule)
                    {
                        Logging.Log("Panic: You are in a Capsule, you must have died :(");
                        State = PanicState.StartPanicking;
                    }
                    else if (Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage < Settings.Instance.MinimumCapacitorPct)
                    {
                        Logging.Log("Panic: Start panicking, capacitor [" + Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage + "%] below [" + Settings.Instance.MinimumCapacitorPct + "%]");
                        State = PanicState.StartPanicking;
                    }
                    else if (Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.ShieldPercentage < Settings.Instance.MinimumShieldPct)
                    {
                        Logging.Log("Panic: Start panicking, shield [" + Cache.Instance.DirectEve.ActiveShip.ShieldPercentage + "%] below [" + Settings.Instance.MinimumShieldPct + "%]");
                        State = PanicState.StartPanicking;
                    }
                    else if (Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.ArmorPercentage < Settings.Instance.MinimumArmorPct)
                    {
                        Logging.Log("Panic: Start panicking, armor [" + Cache.Instance.DirectEve.ActiveShip.ArmorPercentage + "%] below [" + Settings.Instance.MinimumArmorPct + "%]");
                        State = PanicState.StartPanicking;
                    }

                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsWarpScramblingMe), Priority.WarpScrambler);
                    if (Settings.Instance.SpeedTank)
                    {
                        Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsWebbingMe), Priority.Webbing);
                        Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsTargetPaintingMe), Priority.TargetPainting);
                    }
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsNeutralizingMe), Priority.Neutralizing);
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsJammingMe), Priority.Jamming);
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsSensorDampeningMe), Priority.Dampening);
                    if (Cache.Instance.Modules.Any(m => m.IsTurret))
                        Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsTrackingDisruptingMe), Priority.TrackingDisrupting);
                    break;

                    // NOTE: The difference between Panicking and StartPanicking is that the bot will move to "Panic" state once in warp & Panicking
                    //       and the bot wont go into Panic mode while still "StartPanicking"
                case PanicState.StartPanicking:
                case PanicState.Panicking:
                    if (Cache.Instance.InStation)
                    {
                        Logging.Log("Panic: Entered a station, lower panic mode");
                        State = PanicState.Panic;
                    }

                    // Once we have warped off 500km, assume we are "safer"
                    if (State == PanicState.StartPanicking && Cache.Instance.DistanceFromMe(_lastNormalX, _lastNormalY, _lastNormalZ) > 500000)
                    {
                        Logging.Log("Panic: We've warped off");
                        State = PanicState.Panicking;
                    }

                    // We leave the panicking state once we actually start warping off
                    var station = Cache.Instance.Stations.FirstOrDefault();
                    if (station != null)
                    {
                        if (Cache.Instance.InWarp)
                            break;

                        if (station.Distance > 150000)
                            station.WarpToAndDock();
                        else
                            station.Dock();

                        break;
                    }

                    // Whats this you say?  No star?
                    if (Cache.Instance.Star == null)
                        break;

                    if (Cache.Instance.Star.Distance > 500000000)
                    {
                        if (Cache.Instance.InWarp)
                            break;

                        Cache.Instance.Star.WarpTo();
                    }
                    else
                    {
                        Logging.Log("Panic: At the star, lower panic mode");
                        State = PanicState.Panic;
                    }
                    break;

                case PanicState.Panic:
                    // Do not resume until your no longer in a capsule
                    if (Cache.Instance.DirectEve.ActiveShip.GroupId == (int) Group.Capsule)
                        break;

                    if (Cache.Instance.InStation)
                    {
                        //var repair = Cache.Instance.DirectEve.ActiveShip.StructurePercentage < 100;
                        //repair |= Cache.Instance.DirectEve.ActiveShip.ArmorPercentage < 100;
                        //if (repair)
                        //{
                        //    State = PanicState.Repair;
                        //    break;
                        //}

                        Logging.Log("Panic: We're in a station, resume mission");
                        State = PanicState.Resume;
                    }

                    var isSafe = Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage > Settings.Instance.SafeCapacitorPct;
                    isSafe &= Cache.Instance.DirectEve.ActiveShip.ShieldPercentage > Settings.Instance.SafeShieldPct;
                    isSafe &= Cache.Instance.DirectEve.ActiveShip.ArmorPercentage > Settings.Instance.SafeArmorPct;
                    if (isSafe)
                    {
                        Logging.Log("Panic: We've recovered, resume mission");
                        State = PanicState.Resume;
                    }
                    break;

                    //case PanicState.Repair:
                    //    if (!Cache.Instance.Windows.Any(w => w.Type == "form.RepairShopWindow"))
                    //    {
                    //        if (_nextRepairAction < DateTime.Now)
                    //        {
                    //            _nextRepairAction = DateTime.Now.AddSeconds(15);
                    //        }
                    //    }
                    //    break;

                case PanicState.Resume:
                    // Dont do anything here
                    break;
            }
        }
示例#2
0
文件: Panic.cs 项目: frbyles/Questor
        public void ProcessState()
        {
            switch (State)
            {
            case PanicState.Normal:
                if (Cache.Instance.DirectEve.ActiveShip.Entity != null)
                {
                    _lastNormalX = Cache.Instance.DirectEve.ActiveShip.Entity.X;
                    _lastNormalY = Cache.Instance.DirectEve.ActiveShip.Entity.Y;
                    _lastNormalZ = Cache.Instance.DirectEve.ActiveShip.Entity.Z;
                }

                if (Cache.Instance.DirectEve.ActiveShip.GroupId == (int)Group.Capsule)
                {
                    Logging.Log("Panic: You are in a Capsule, you must have died :(");
                    State = PanicState.StartPanicking;
                }
                else if (Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage < Settings.Instance.MinimumCapacitorPct)
                {
                    Logging.Log("Panic: Start panicking, capacitor [" + Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage + "%] below [" + Settings.Instance.MinimumCapacitorPct + "%]");
                    State = PanicState.StartPanicking;
                }
                else if (Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.ShieldPercentage < Settings.Instance.MinimumShieldPct)
                {
                    Logging.Log("Panic: Start panicking, shield [" + Cache.Instance.DirectEve.ActiveShip.ShieldPercentage + "%] below [" + Settings.Instance.MinimumShieldPct + "%]");
                    State = PanicState.StartPanicking;
                }
                else if (Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.ArmorPercentage < Settings.Instance.MinimumArmorPct)
                {
                    Logging.Log("Panic: Start panicking, armor [" + Cache.Instance.DirectEve.ActiveShip.ArmorPercentage + "%] below [" + Settings.Instance.MinimumArmorPct + "%]");
                    State = PanicState.StartPanicking;
                }

                Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsWarpScramblingMe), Priority.WarpScrambler);
                if (Settings.Instance.SpeedTank)
                {
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsWebbingMe), Priority.Webbing);
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsTargetPaintingMe), Priority.TargetPainting);
                }
                Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsNeutralizingMe), Priority.Neutralizing);
                Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsJammingMe), Priority.Jamming);
                Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsSensorDampeningMe), Priority.Dampening);
                if (Cache.Instance.Modules.Any(m => m.IsTurret))
                {
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsTrackingDisruptingMe), Priority.TrackingDisrupting);
                }
                break;

            // NOTE: The difference between Panicking and StartPanicking is that the bot will move to "Panic" state once in warp & Panicking
            //       and the bot wont go into Panic mode while still "StartPanicking"
            case PanicState.StartPanicking:
            case PanicState.Panicking:
                if (Cache.Instance.InStation)
                {
                    Logging.Log("Panic: Entered a station, lower panic mode");
                    State = PanicState.Panic;
                }

                // Once we have warped off 500km, assume we are "safer"
                if (State == PanicState.StartPanicking && Cache.Instance.DistanceFromMe(_lastNormalX, _lastNormalY, _lastNormalZ) > 500000)
                {
                    Logging.Log("Panic: We've warped off");
                    State = PanicState.Panicking;
                }

                // We leave the panicking state once we actually start warping off
                var station = Cache.Instance.Stations.FirstOrDefault();
                if (station != null)
                {
                    if (Cache.Instance.InWarp)
                    {
                        break;
                    }

                    if (station.Distance > 150000)
                    {
                        station.WarpToAndDock();
                    }
                    else
                    {
                        station.Dock();
                    }

                    break;
                }

                // Whats this you say?  No star?
                if (Cache.Instance.Star == null)
                {
                    break;
                }

                if (Cache.Instance.Star.Distance > 500000000)
                {
                    if (Cache.Instance.InWarp)
                    {
                        break;
                    }

                    Cache.Instance.Star.WarpTo();
                }
                else
                {
                    Logging.Log("Panic: At the star, lower panic mode");
                    State = PanicState.Panic;
                }
                break;

            case PanicState.Panic:
                // Do not resume until your no longer in a capsule
                if (Cache.Instance.DirectEve.ActiveShip.GroupId == (int)Group.Capsule)
                {
                    break;
                }

                if (Cache.Instance.InStation)
                {
                    //var repair = Cache.Instance.DirectEve.ActiveShip.StructurePercentage < 100;
                    //repair |= Cache.Instance.DirectEve.ActiveShip.ArmorPercentage < 100;
                    //if (repair)
                    //{
                    //    State = PanicState.Repair;
                    //    break;
                    //}

                    Logging.Log("Panic: We're in a station, resume mission");
                    State = PanicState.Resume;
                }

                var isSafe = Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage > Settings.Instance.SafeCapacitorPct;
                isSafe &= Cache.Instance.DirectEve.ActiveShip.ShieldPercentage > Settings.Instance.SafeShieldPct;
                isSafe &= Cache.Instance.DirectEve.ActiveShip.ArmorPercentage > Settings.Instance.SafeArmorPct;
                if (isSafe)
                {
                    Logging.Log("Panic: We've recovered, resume mission");
                    State = PanicState.Resume;
                }
                break;

            //case PanicState.Repair:
            //    if (!Cache.Instance.Windows.Any(w => w.Type == "form.RepairShopWindow"))
            //    {
            //        if (_nextRepairAction < DateTime.Now)
            //        {
            //            _nextRepairAction = DateTime.Now.AddSeconds(15);
            //        }
            //    }
            //    break;

            case PanicState.Resume:
                // Dont do anything here
                break;
            }
        }
示例#3
0
文件: Panic.cs 项目: ahaw/Questor
        public void ProcessState()
        {
            switch (State)
            {
                case PanicState.Normal:
                    if (Cache.Instance.DirectEve.ActiveShip.Entity != null)
                    {
                        _lastNormalX = Cache.Instance.DirectEve.ActiveShip.Entity.X;
                        _lastNormalY = Cache.Instance.DirectEve.ActiveShip.Entity.Y;
                        _lastNormalZ = Cache.Instance.DirectEve.ActiveShip.Entity.Z;
                    }

                    if (Cache.Instance.DirectEve.ActiveShip.GroupId == (int)Group.Capsule)
                    {
                        Logging.Log("Panic: You are in a Capsule, you must have died :(");
                        State = PanicState.StartPanicking;
                    }
                    else if (InMission && Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage < Settings.Instance.MinimumCapacitorPct && Cache.Instance.DirectEve.ActiveShip.GroupId != 31)
                    {
                        // Only check for cap-panic while in a mission, not while doing anything else
                        Logging.Log("Panic: Start panicking, capacitor [" + Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage + "%] below [" + Settings.Instance.MinimumCapacitorPct + "%]");
                        //Questor.panic_attempts_this_mission;
                        Cache.Instance.panic_attempts_this_mission = (Cache.Instance.panic_attempts_this_mission + 1);
                        Cache.Instance.panic_attempts_this_pocket = (Cache.Instance.panic_attempts_this_pocket + 1);
                        State = PanicState.StartPanicking;
                    }
                    else if (Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.ShieldPercentage < Settings.Instance.MinimumShieldPct)
                    {
                        Logging.Log("Panic: Start panicking, shield [" + Cache.Instance.DirectEve.ActiveShip.ShieldPercentage + "%] below [" + Settings.Instance.MinimumShieldPct + "%]");
                        Cache.Instance.panic_attempts_this_mission = (Cache.Instance.panic_attempts_this_mission + 1);
                        Cache.Instance.panic_attempts_this_pocket = (Cache.Instance.panic_attempts_this_pocket + 1);
                        State = PanicState.StartPanicking;
                    }
                    else if (Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.ArmorPercentage < Settings.Instance.MinimumArmorPct)
                    {
                        Logging.Log("Panic: Start panicking, armor [" + Cache.Instance.DirectEve.ActiveShip.ArmorPercentage + "%] below [" + Settings.Instance.MinimumArmorPct + "%]");
                        Cache.Instance.panic_attempts_this_mission = (Cache.Instance.panic_attempts_this_mission + 1);
                        Cache.Instance.panic_attempts_this_pocket = (Cache.Instance.panic_attempts_this_pocket + 1);
                        State = PanicState.StartPanicking;
                    }

                    _delayedResume = false;
                    if (InMission)
                    {
                        var frigates = Cache.Instance.Entities.Count(e => e.IsFrigate && e.IsPlayer);
                        var cruisers = Cache.Instance.Entities.Count(e => e.IsCruiser && e.IsPlayer);
                        var battlecruisers = Cache.Instance.Entities.Count(e => e.IsBattlecruiser && e.IsPlayer);
                        var battleships = Cache.Instance.Entities.Count(e => e.IsBattleship && e.IsPlayer);

                        if (Settings.Instance.FrigateInvasionLimit > 0 && frigates >= Settings.Instance.FrigateInvasionLimit)
                        {
                            _delayedResume = true;

                            Cache.Instance.panic_attempts_this_mission = (Cache.Instance.panic_attempts_this_mission + 1);
                            Cache.Instance.panic_attempts_this_pocket = (Cache.Instance.panic_attempts_this_pocket + 1);
                            State = PanicState.StartPanicking;
                            Logging.Log("Panic: Start panicking, mission invaded by [" + frigates + "] frigates");
                        }

                        if (Settings.Instance.CruiserInvasionLimit > 0 && cruisers >= Settings.Instance.CruiserInvasionLimit)
                        {
                            _delayedResume = true;

                            Cache.Instance.panic_attempts_this_mission = (Cache.Instance.panic_attempts_this_mission + 1);
                            Cache.Instance.panic_attempts_this_pocket = (Cache.Instance.panic_attempts_this_pocket + 1);
                            State = PanicState.StartPanicking;
                            Logging.Log("Panic: Start panicking, mission invaded by [" + cruisers + "] cruisers");
                        }

                        if (Settings.Instance.BattlecruiserInvasionLimit > 0 && battlecruisers >= Settings.Instance.BattlecruiserInvasionLimit)
                        {
                            _delayedResume = true;

                            Cache.Instance.panic_attempts_this_mission = (Cache.Instance.panic_attempts_this_mission + 1);
                            Cache.Instance.panic_attempts_this_pocket = (Cache.Instance.panic_attempts_this_pocket + 1);
                            State = PanicState.StartPanicking;
                            Logging.Log("Panic: Start panicking, mission invaded by [" + battlecruisers + "] battlecruisers");
                        }

                        if (Settings.Instance.BattleshipInvasionLimit > 0 && battleships >= Settings.Instance.BattleshipInvasionLimit)
                        {
                            _delayedResume = true;

                            Cache.Instance.panic_attempts_this_mission = (Cache.Instance.panic_attempts_this_mission + 1);
                            Cache.Instance.panic_attempts_this_pocket = (Cache.Instance.panic_attempts_this_pocket + 1);
                            State = PanicState.StartPanicking;
                            Logging.Log("Panic: Start panicking, mission invaded by [" + battleships + "] battleships");
                        }

                        if (_delayedResume)
                        {
                            _randomDelay = (Settings.Instance.InvasionRandomDelay > 0 ? _random.Next(Settings.Instance.InvasionRandomDelay) : 0);
                            _randomDelay += Settings.Instance.InvasionMinimumDelay;
                        }
                    }

                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsWarpScramblingMe), Priority.WarpScrambler);
                    if (Settings.Instance.SpeedTank)
                    {
                        Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsWebbingMe), Priority.Webbing);
                        Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsTargetPaintingMe), Priority.TargetPainting);
                    }
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsNeutralizingMe), Priority.Neutralizing);
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsJammingMe), Priority.Jamming);
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsSensorDampeningMe), Priority.Dampening);
                    if (Cache.Instance.Modules.Any(m => m.IsTurret))
                        Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsTrackingDisruptingMe), Priority.TrackingDisrupting);
                    break;

                // NOTE: The difference between Panicking and StartPanicking is that the bot will move to "Panic" state once in warp & Panicking
                //       and the bot wont go into Panic mode while still "StartPanicking"
                case PanicState.StartPanicking:
                case PanicState.Panicking:
                    // Add any warp scramblers to the priority list
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsWarpScramblingMe), Priority.WarpScrambler);

                    // Failsafe, in theory would/should never happen
                    if (State == PanicState.Panicking && Cache.Instance.TargetedBy.Any(t => t.IsWarpScramblingMe))
                    {
                        // Resume is the only state that will make Questor revert to combat mode
                        State = PanicState.Resume;
                        return;
                    }

                    if (Cache.Instance.InStation)
                    {
                        Logging.Log("Panic: Entered a station, lower panic mode");
                        State = PanicState.Panic;
                    }

                    // Once we have warped off 500km, assume we are "safer"
                    if (State == PanicState.StartPanicking && Cache.Instance.DistanceFromMe(_lastNormalX, _lastNormalY, _lastNormalZ) > (int)Distance.PanicDistanceToConsiderSafelyWarpedOff)
                    {
                        Logging.Log("Panic: We've warped off");
                        State = PanicState.Panicking;
                    }

                    // We leave the panicking state once we actually start warping off
                    var station = Cache.Instance.Stations.OrderBy(x => x.Distance).FirstOrDefault();
                    if (station != null)
                    {
                        if (Cache.Instance.InWarp)
                            break;

                        if (station.Distance > (int)Distance.WarptoDistance)
                        {
                            if (DateTime.Now.Subtract(_lastWarpTo).TotalSeconds > 5)
                            {
                                station.WarpToAndDock();
                                _lastWarpTo = DateTime.Now;
                            }
                        }
                        else
                            station.Dock();
                            if (station.Distance < 1900)
                            {
                                station.Dock();

                            }
                            else
                            {
                                if (Cache.Instance.DirectEve.ActiveShip.Entity.Mode == 1)
                                {
                                    if (Cache.Instance.Approaching.Id != station.Id)
                                        station.Approach();
                                }
                                else station.Approach();
                            }
                            break;
                    }

                    // Whats this you say?  No star?
                    if (Cache.Instance.Star == null)
                        break;

                    if (Cache.Instance.Star.Distance > (int)Distance.WeCanWarpToStarFromHere)
                    {
                        if (Cache.Instance.InWarp)
                            break;

                        if (DateTime.Now.Subtract(_lastWarpTo).TotalSeconds > 5)
                        {
                            Cache.Instance.Star.WarpTo();
                            _lastWarpTo = DateTime.Now;
                        }

                    }
                    else
                    {
                        Logging.Log("Panic: At the star, lower panic mode");
                        State = PanicState.Panic;
                    }
                    break;

                case PanicState.Panic:
                    // Do not resume until you're no longer in a capsule
                    if (Cache.Instance.DirectEve.ActiveShip.GroupId == (int)Group.Capsule)
                        break;

                    if (Cache.Instance.InStation)
                    {
                        Logging.Log("Panic: We're in a station, resume mission");
                        State = _delayedResume ? PanicState.DelayedResume : PanicState.Resume;
                    }

                    var isSafe = Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage > Settings.Instance.SafeCapacitorPct;
                    isSafe &= Cache.Instance.DirectEve.ActiveShip.ShieldPercentage > Settings.Instance.SafeShieldPct;
                    isSafe &= Cache.Instance.DirectEve.ActiveShip.ArmorPercentage > Settings.Instance.SafeArmorPct;
                    if (isSafe)
                    {
                        Logging.Log("Panic: We've recovered, resume mission");
                        State = _delayedResume ? PanicState.DelayedResume : PanicState.Resume;
                    }

                    if (State == PanicState.DelayedResume)
                    {
                        Logging.Log("Panic: Delaying resume for " + _randomDelay + " seconds");
                        _resumeTime = DateTime.Now.AddSeconds(_randomDelay);
                    }
                    break;

                case PanicState.DelayedResume:
                    if (DateTime.Now > _resumeTime)
                        State = PanicState.Resume;
                    break;

                case PanicState.Resume:
                    // Dont do anything here
                    break;
            }
        }
示例#4
0
文件: Panic.cs 项目: Phygar/Questor
        public void ProcessState()
        {
            switch (State)
            {
                case PanicState.Normal:
                    if (Cache.Instance.DirectEve.ActiveShip.Entity != null)
                    {
                        _lastNormalX = Cache.Instance.DirectEve.ActiveShip.Entity.X;
                        _lastNormalY = Cache.Instance.DirectEve.ActiveShip.Entity.Y;
                        _lastNormalZ = Cache.Instance.DirectEve.ActiveShip.Entity.Z;
                    }

                    if (Cache.Instance.DirectEve.ActiveShip.GroupId == (int) Group.Capsule)
                    {
                        Logging.Log("Panic: You are in a Capsule, you must have died :(");
                        State = PanicState.StartPanicking;
                    }
                    else if (Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage < Settings.Instance.MinimumCapacitorPct)
                    {
                        Logging.Log("Panic: Start panicking, capacitor [" + Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage + "%] below [" + Settings.Instance.MinimumCapacitorPct + "%]");
                        State = PanicState.StartPanicking;
                    }
                    else if (Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.ShieldPercentage < Settings.Instance.MinimumShieldPct)
                    {
                        Logging.Log("Panic: Start panicking, shield [" + Cache.Instance.DirectEve.ActiveShip.ShieldPercentage + "%] below [" + Settings.Instance.MinimumShieldPct + "%]");
                        State = PanicState.StartPanicking;
                    }
                    else if (Cache.Instance.InSpace && Cache.Instance.DirectEve.ActiveShip.ArmorPercentage < Settings.Instance.MinimumArmorPct)
                    {
                        Logging.Log("Panic: Start panicking, armor [" + Cache.Instance.DirectEve.ActiveShip.ArmorPercentage + "%] below [" + Settings.Instance.MinimumArmorPct + "%]");
                        State = PanicState.StartPanicking;
                    }

                    _delayedResume = false;
                    if(InMission)
                    {
                        var frigates = Cache.Instance.Entities.Count(e => e.IsFrigate && e.IsPlayer);
                        var cruisers = Cache.Instance.Entities.Count(e => e.IsCruiser && e.IsPlayer);
                        var battlecruisers = Cache.Instance.Entities.Count(e => e.IsBattlecruiser && e.IsPlayer);
                        var battleships = Cache.Instance.Entities.Count(e => e.IsBattleship && e.IsPlayer);

                        if (Settings.Instance.FrigateInvasionLimit > 0 && frigates >= Settings.Instance.FrigateInvasionLimit)
                        {
                            _delayedResume = true;

                            State = PanicState.StartPanicking;
                            Logging.Log("Panic: Start panicking, mission invaded by [" + frigates + "] frigates");
                        }

                        if (Settings.Instance.CruiserInvasionLimit > 0 && cruisers >= Settings.Instance.CruiserInvasionLimit)
                        {
                            _delayedResume = true;

                            State = PanicState.StartPanicking;
                            Logging.Log("Panic: Start panicking, mission invaded by [" + cruisers + "] cruisers");
                        }

                        if (Settings.Instance.BattlecruiserInvasionLimit > 0 && battlecruisers >= Settings.Instance.BattlecruiserInvasionLimit)
                        {
                            _delayedResume = true;

                            State = PanicState.StartPanicking;
                            Logging.Log("Panic: Start panicking, mission invaded by [" + battlecruisers + "] battlecruisers");
                        }

                        if (Settings.Instance.BattleshipInvasionLimit > 0 && battleships >= Settings.Instance.BattleshipInvasionLimit)
                        {
                            _delayedResume = true;

                            State = PanicState.StartPanicking;
                            Logging.Log("Panic: Start panicking, mission invaded by [" + battleships + "] battleships");
                        }

                        if (_delayedResume)
                        {
                            _randomDelay = (Settings.Instance.InvasionRandomDelay > 0 ? _random.Next(Settings.Instance.InvasionRandomDelay) : 0);
                            _randomDelay += Settings.Instance.InvasionMinimumDelay;
                        }
                    }

                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsWarpScramblingMe), Priority.WarpScrambler);
                    if (Settings.Instance.SpeedTank)
                    {
                        Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsWebbingMe), Priority.Webbing);
                        Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsTargetPaintingMe), Priority.TargetPainting);
                    }
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsNeutralizingMe), Priority.Neutralizing);
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsJammingMe), Priority.Jamming);
                    Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsSensorDampeningMe), Priority.Dampening);
                    if (Cache.Instance.Modules.Any(m => m.IsTurret))
                        Cache.Instance.AddPriorityTargets(Cache.Instance.TargetedBy.Where(t => t.IsTrackingDisruptingMe), Priority.TrackingDisrupting);
                    break;

                    // NOTE: The difference between Panicking and StartPanicking is that the bot will move to "Panic" state once in warp & Panicking
                    //       and the bot wont go into Panic mode while still "StartPanicking"
                case PanicState.StartPanicking:
                case PanicState.Panicking:
                    if (Cache.Instance.InStation)
                    {
                        Logging.Log("Panic: Entered a station, lower panic mode");
                        State = PanicState.Panic;
                    }

                    // Once we have warped off 500km, assume we are "safer"
                    if (State == PanicState.StartPanicking && Cache.Instance.DistanceFromMe(_lastNormalX, _lastNormalY, _lastNormalZ) > 500000)
                    {
                        Logging.Log("Panic: We've warped off");
                        State = PanicState.Panicking;
                    }

                    // We leave the panicking state once we actually start warping off
                    var station = Cache.Instance.Stations.FirstOrDefault();
                    if (station != null)
                    {
                        if (Cache.Instance.InWarp)
                            break;

                        if (station.Distance > 150000)
                            station.WarpToAndDock();
                        else
                            station.Dock();

                        break;
                    }

                    // Whats this you say?  No star?
                    if (Cache.Instance.Star == null)
                        break;

                    if (Cache.Instance.Star.Distance > 500000000)
                    {
                        if (Cache.Instance.InWarp)
                            break;

                        Cache.Instance.Star.WarpTo();
                    }
                    else
                    {
                        Logging.Log("Panic: At the star, lower panic mode");
                        State = PanicState.Panic;
                    }
                    break;

                case PanicState.Panic:
                    // Do not resume until your no longer in a capsule
                    if (Cache.Instance.DirectEve.ActiveShip.GroupId == (int) Group.Capsule)
                        break;

                    if (Cache.Instance.InStation)
                    {
                        Logging.Log("Panic: We're in a station, resume mission");
                        State = _delayedResume ? PanicState.DelayedResume : PanicState.Resume;
                    }

                    var isSafe = Cache.Instance.DirectEve.ActiveShip.CapacitorPercentage > Settings.Instance.SafeCapacitorPct;
                    isSafe &= Cache.Instance.DirectEve.ActiveShip.ShieldPercentage > Settings.Instance.SafeShieldPct;
                    isSafe &= Cache.Instance.DirectEve.ActiveShip.ArmorPercentage > Settings.Instance.SafeArmorPct;
                    if (isSafe)
                    {
                        Logging.Log("Panic: We've recovered, resume mission");
                        State = _delayedResume ? PanicState.DelayedResume : PanicState.Resume;
                    }

                    if (State == PanicState.DelayedResume)
                    {
                        Logging.Log("Panic: Delaying resume for " + _delayedResume + " seconds");
                        _resumeTime = DateTime.Now.AddSeconds(_randomDelay);
                    }
                    break;

                case PanicState.DelayedResume:
                    if (DateTime.Now > _resumeTime)
                        State = PanicState.Resume;
                    break;

                case PanicState.Resume:
                    // Dont do anything here
                    break;
            }
        }