コード例 #1
0
        public void Init()
        {
            PostNumber     = 43;
            PostList       = new Posts[PostNumber];
            SortedPostList = new Posts[PostNumber];

            PostList [0] = SortedPostList [0] = King.SetPost(Titles[0], 0, 100, null, null);

            PostList [1]  = SortedPostList [1] = Mentor.SetPost(Titles[1], 0, 100, null, King);
            PostList [2]  = SortedPostList [2] = PrimeMinister.SetPost(Titles[2], 0, 100, null, King);
            PostList [3]  = SortedPostList [16] = Voevoda.SetPost(Titles[3], 0, 100, null, King);
            PostList [4]  = SortedPostList [3] = Kaznachei.SetPost(Titles[4], 0, 100, null, King);
            PostList [5]  = SortedPostList [14] = Patriarch.SetPost(Titles[5], 0, 100, null, King);
            PostList [6]  = SortedPostList [4] = Dvoretzky.SetPost(Titles[7], 0, 100, null, PrimeMinister);
            PostList [7]  = SortedPostList [12] = Tiun.SetPost(Titles[6], 0, 100, null, King);
            PostList [8]  = SortedPostList [5] = Okolnichiy.SetPost(Titles[8], 0, 100, null, PrimeMinister);
            PostList [9]  = SortedPostList [6] = Questor.SetPost(Titles[9], 0, 100, null, PrimeMinister);
            PostList [10] = SortedPostList [17] = Guardian.SetPost(Titles[10], 0, 100, null, PrimeMinister);
            PostList [11] = SortedPostList [18] = Policemen.SetPost(Titles[11], 0, 100, null, PrimeMinister);
            PostList [12] = SortedPostList [19] = Druzhina.SetPost(Titles[12], 0, 100, null, Voevoda);
            PostList [13] = SortedPostList [20] = Phantoms.SetPost(Titles[13], 0, 100, null, Voevoda);
            PostList [14] = SortedPostList [21] = Captain.SetPost(Titles[14], 0, 100, null, Voevoda);
            PostList [15] = SortedPostList [22] = Spymaster.SetPost(Titles[15], 0, 100, null, PrimeMinister);
            PostList [16] = SortedPostList [23] = Mystik.SetPost(Titles[16], 0, 100, null, Spymaster);
            PostList [17] = SortedPostList [24] = Ninja.SetPost(Titles[17], 0, 100, null, Spymaster);
            PostList [18] = SortedPostList [25] = Sinobi.SetPost(Titles[18], 0, 100, null, Spymaster);
            PostList [19] = SortedPostList [26] = Orujeinichiy.SetPost(Titles[19], 0, 100, null, PrimeMinister);
            PostList [20] = SortedPostList [27] = Dozorny.SetPost(Titles[20], 0, 100, null, Voevoda);
            PostList [21] = SortedPostList [28] = Kluchnik.SetPost(Titles[21], 0, 100, null, Dvoretzky);
            PostList [22] = SortedPostList [29] = Stolnik.SetPost(Titles[22], 0, 100, null, Dvoretzky);
            PostList [23] = SortedPostList [30] = Postelnichiy.SetPost(Titles[23], 0, 100, null, Dvoretzky);
            PostList [24] = SortedPostList [31] = Konuchiy.SetPost(Titles[24], 0, 100, null, Dvoretzky);
            PostList [25] = SortedPostList [32] = Lovchiy.SetPost(Titles[25], 0, 100, null, Dvoretzky);
            PostList [26] = SortedPostList [13] = Grandmeister.SetPost(Titles[26], 0, 100, null, Patriarch);
            PostList [27] = SortedPostList [15] = Paramedik.SetPost(Titles[27], 0, 100, null, Patriarch);
            PostList [28] = SortedPostList [33] = Jurodiviy.SetPost(Titles[28], 0, 100, null, Patriarch);
            PostList [29] = SortedPostList [34] = Skomoroh.SetPost(Titles[29], 0, 100, null, PrimeMinister);
            PostList [30] = SortedPostList [7] = Trademaster.SetPost(Titles[30], 0, 100, null, Kaznachei);
            PostList [31] = SortedPostList [8] = Buildmaster.SetPost(Titles[31], 0, 100, null, Kaznachei);
            PostList [32] = SortedPostList [9] = Miner.SetPost(Titles[32], 0, 100, null, Kaznachei);
            PostList [33] = SortedPostList [10] = Agrarian.SetPost(Titles[33], 0, 100, null, Kaznachei);
            PostList [34] = SortedPostList [11] = Banker.SetPost(Titles[34], 0, 100, null, Kaznachei);
            PostList [35] = SortedPostList [35] = Tamojnya.SetPost(Titles[35], 0, 100, null, Kaznachei);
            PostList [36] = SortedPostList [36] = Courier.SetPost(Titles[36], 0, 100, null, PrimeMinister);
            PostList [37] = SortedPostList [37] = Bodyguard.SetPost(Titles[37], 0, 100, null, Guardian);
            PostList [38] = SortedPostList [38] = Commander1.SetPost(Titles[38], 0, 100, null, Voevoda);
            PostList [39] = SortedPostList [39] = Commander2.SetPost(Titles[39], 0, 100, null, Voevoda);
            PostList [40] = SortedPostList [40] = Commander3.SetPost(Titles[40], 0, 100, null, Voevoda);
            PostList [41] = SortedPostList [41] = Commander4.SetPost(Titles[41], 0, 100, null, Voevoda);
            PostList [42] = SortedPostList [42] = Commander5.SetPost(Titles[42], 0, 100, null, Voevoda);

            SetCounsillorPosts();
        }
コード例 #2
0
    void NewQuestBegin()
    {
        NewQuestText.gameObject.SetActive(true);
        questMenu.gameObject.SetActive(true);
        Next.gameObject.SetActive(true);

        NewQuestText.text = "New Quest!";

        Quest newQuest = Questor.GetQuest(location);

        questMenu.setCurrentQuest(newQuest, newQuest.checkRequirements(activePlayer));
        activePlayer.activeQuest = newQuest.ID;

        currentStep = Step.Update;
    }
コード例 #3
0
    void PlayerInUpdate()
    {
        if (Questor.IsThereAChallenge(location, activePlayer) == true) //this function always returns true - intended?
        {
            activeChallenge = Questor.GetChallenge(location, activePlayer);

            currentState = State.Challenge;
            currentStep  = Step.Begin;
        }
        else
        {
            currentState = State.Gather;
            currentStep  = Step.Begin;
        }
    }
コード例 #4
0
    void GatherBegin()
    {
        Next.gameObject.SetActive(true);

        List <Item> givenItems = Questor.GetItems(location, activePlayer);

        int i = 0;

        foreach (Item im in givenItems)
        {
            activePlayer.giveItem(im, 1);
            item[i].gameObject.SetActive(true);
            item[i].setItem(im);

            ++i;
        }

        currentStep = Step.Update;
    }
コード例 #5
0
        public void ProcessState()
        {
            // Invalid settings, quit while we're ahead
            if (!ValidSettings)
            {
                if (DateTime.UtcNow.Subtract(LastAction).TotalSeconds < Time.Instance.ValidateSettings_seconds) //default is a 15 second interval
                {
                    ValidateDedicatedSalvageSettings();
                    LastAction = DateTime.UtcNow;
                }
                return;
            }

            //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            //this local is safe check is useless as their is no LocalWatch processstate running every tick...
            //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            //If local unsafe go to base and do not start mission again
            if (Settings.Instance.FinishWhenNotSafe && (_States.CurrentDedicatedBookmarkSalvagerBehaviorState != DedicatedBookmarkSalvagerBehaviorState.GotoNearestStation /*|| State!=QuestorState.GotoBase*/))
            {
                //need to remove spam
                if (Cache.Instance.InSpace && !Cache.Instance.LocalSafe(Settings.Instance.LocalBadStandingPilotsToTolerate, Settings.Instance.LocalBadStandingLevelToConsiderBad))
                {
                    EntityCache station = null;
                    if (Cache.Instance.Stations != null && Cache.Instance.Stations.Any())
                    {
                        station = Cache.Instance.Stations.OrderBy(x => x.Distance).FirstOrDefault();
                    }

                    if (station != null)
                    {
                        Logging.Log("Local not safe", "Station found. Going to nearest station", Logging.White);
                        _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.GotoNearestStation;
                    }
                    else
                    {
                        Logging.Log("Local not safe", "Station not found. Going back to base", Logging.White);
                        _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.GotoBase;
                    }
                    Cache.Instance.StopBot = true;
                }
            }

            if (Cache.Instance.SessionState == "Quitting")
            {
                BeginClosingQuestor();
            }

            if (Cache.Instance.GotoBaseNow)
            {
                _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.GotoBase;
            }

            if ((DateTime.UtcNow.Subtract(Cache.Instance.QuestorStarted_DateTime).TotalSeconds > 10) && (DateTime.UtcNow.Subtract(Cache.Instance.QuestorStarted_DateTime).TotalSeconds < 60))
            {
                if (Cache.Instance.QuestorJustStarted)
                {
                    Cache.Instance.QuestorJustStarted = false;
                    Cache.Instance.SessionState       = "Starting Up";

                    // write session log
                    Statistics.WriteSessionLogStarting();
                }
            }

            //
            // Panic always runs, not just in space
            //
            DebugPerformanceClearandStartTimer();
            _panic.ProcessState();
            DebugPerformanceStopandDisplayTimer("Panic.ProcessState");
            if (_States.CurrentPanicState == PanicState.Panic || _States.CurrentPanicState == PanicState.Panicking)
            {
                DebugDedicatedBookmarkSalvagerBehaviorStates();
                if (PanicStateReset)
                {
                    _States.CurrentPanicState = PanicState.Normal;
                    PanicStateReset           = false;
                }
            }
            else if (_States.CurrentPanicState == PanicState.Resume)
            {
                // Reset panic state
                _States.CurrentPanicState = PanicState.Normal;
            }
            DebugPanicstates();

            switch (_States.CurrentDedicatedBookmarkSalvagerBehaviorState)
            {
            case DedicatedBookmarkSalvagerBehaviorState.Idle:

                if (Cache.Instance.StopBot)
                {
                    return;
                }

                _States.CurrentAgentInteractionState = AgentInteractionState.Idle;
                _States.CurrentArmState        = ArmState.Idle;
                _States.CurrentDroneState      = DroneState.Idle;
                _States.CurrentSalvageState    = SalvageState.Idle;
                _States.CurrentStorylineState  = StorylineState.Idle;
                _States.CurrentTravelerState   = TravelerState.Idle;
                _States.CurrentUnloadLootState = UnloadLootState.Idle;
                _States.CurrentTravelerState   = TravelerState.AtDestination;

                if (Cache.Instance.InSpace)
                {
                    // Questor does not handle in space starts very well, head back to base to try again
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "Started questor while in space, heading back to base in 15 seconds", Logging.White);
                    LastAction = DateTime.UtcNow;
                    Cache.Instance.NextSalvageTrip = DateTime.UtcNow;
                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.CheckBookmarkAge;
                    break;
                }

                // only attempt to write the mission statistics logs if one of the mission stats logs is enabled in settings
                //if (Settings.Instance.SalvageStats1Log)
                //{
                //    if (!Statistics.Instance.SalvageLoggingCompleted)
                //    {
                //        Statistics.WriteSalvagerStatistics();
                //        break;
                //    }
                //}

                if (Settings.Instance.AutoStart)
                {
                    //we know we are connected here
                    Cache.Instance.LastKnownGoodConnectedTime = DateTime.UtcNow;
                    Cache.Instance.MyWalletBalance            = Cache.Instance.DirectEve.Me.Wealth;

                    // Don't start a new action an hour before downtime
                    if (DateTime.UtcNow.Hour == 10)
                    {
                        if (Settings.Instance.DebugAutoStart)
                        {
                            Logging.Log("DedicatedBookmarkSalvagerBehavior", "Autostart: if (DateTime.UtcNow.Hour == 10)", Logging.White);
                        }
                        break;
                    }

                    // Don't start a new action near downtime
                    if (DateTime.UtcNow.Hour == 11 && DateTime.UtcNow.Minute < 15)
                    {
                        if (Settings.Instance.DebugAutoStart)
                        {
                            Logging.Log("DedicatedBookmarkSalvagerBehavior", "if (DateTime.UtcNow.Hour == 11 && DateTime.UtcNow.Minute < 15)", Logging.White);
                        }
                        break;
                    }

                    //Logging.Log("DedicatedBookmarkSalvagerBehavior::: _nextBookmarksrefresh.subtract(DateTime.UtcNow).totalminutes [" +
                    //            Math.Round(DateTime.UtcNow.Subtract(_nextBookmarkRefreshCheck).TotalMinutes,0) + "]");

                    //Logging.Log("DedicatedBookmarkSalvagerBehavior::: Next Salvage Trip Scheduled in [" +
                    //            _Cache.Instance.NextSalvageTrip.ToString(CultureInfo.InvariantCulture) + "min]");

                    if (DateTime.UtcNow > _nextBookmarkRefreshCheck)
                    {
                        _nextBookmarkRefreshCheck = DateTime.UtcNow.AddMinutes(1);
                        if (Cache.Instance.InStation && (DateTime.UtcNow > _nextBookmarksrefresh))
                        {
                            _nextBookmarksrefresh = DateTime.UtcNow.AddMinutes(Cache.Instance.RandomNumber(18, 24));
                            Logging.Log("DedicatedBookmarkSalvagerBehavior", "Next Bookmark refresh in [" +
                                        Math.Round(_nextBookmarksrefresh.Subtract(DateTime.UtcNow).TotalMinutes, 0) + "min]", Logging.White);
                            Cache.Instance.DirectEve.RefreshBookmarks();
                        }
                        else
                        {
                            Logging.Log("DedicatedBookmarkSalvagerBehavior", "Next Bookmark refresh in [" +
                                        Math.Round(_nextBookmarksrefresh.Subtract(DateTime.UtcNow).TotalMinutes, 0) + "min]", Logging.White);

                            Logging.Log("DedicatedBookmarkSalvagerBehavior", "Next Salvage Trip Scheduled in [" +
                                        Math.Round(Cache.Instance.NextSalvageTrip.Subtract(DateTime.UtcNow).TotalMinutes, 0) + "min]", Logging.White);
                        }
                    }

                    if (DateTime.UtcNow > Cache.Instance.NextSalvageTrip)
                    {
                        Logging.Log("DedicatedBookmarkSalvagerBehavior.BeginAftermissionSalvaging", "Starting Another Salvage Trip", Logging.White);
                        LastAction = DateTime.UtcNow;
                        _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.Start;
                        return;
                    }
                }
                else
                {
                    Cache.Instance.LastScheduleCheck = DateTime.UtcNow;
                    Questor.TimeCheck();       //Should we close questor due to stoptime or runtime?
                }
                break;

            case DedicatedBookmarkSalvagerBehaviorState.DelayedGotoBase:
                if (DateTime.UtcNow.Subtract(LastAction).TotalSeconds < Time.Instance.DelayedGotoBase_seconds)
                {
                    break;
                }

                Logging.Log("DedicatedBookmarkSalvagerBehavior", "Heading back to base", Logging.White);
                _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.GotoBase;
                break;

            case DedicatedBookmarkSalvagerBehaviorState.Start:
                Cache.Instance.OpenWrecks = true;
                ValidateDedicatedSalvageSettings();
                _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.UnloadLoot;
                break;

            case DedicatedBookmarkSalvagerBehaviorState.LocalWatch:
                if (Settings.Instance.UseLocalWatch)
                {
                    Cache.Instance.LastLocalWatchAction = DateTime.UtcNow;
                    if (Cache.Instance.LocalSafe(Settings.Instance.LocalBadStandingPilotsToTolerate, Settings.Instance.LocalBadStandingLevelToConsiderBad))
                    {
                        Logging.Log("DedicatedBookmarkSalvagerBehavior.LocalWatch", "local is clear", Logging.White);
                        _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.BeginAfterMissionSalvaging;
                    }
                    else
                    {
                        Logging.Log("DedicatedBookmarkSalvagerBehavior.LocalWatch", "Bad standings pilots in local: We will stay 5 minutes in the station and then we will check if it is clear again", Logging.White);
                        _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.WaitingforBadGuytoGoAway;
                        Cache.Instance.LastKnownGoodConnectedTime             = DateTime.UtcNow;
                        Cache.Instance.MyWalletBalance = Cache.Instance.DirectEve.Me.Wealth;
                    }
                }
                else
                {
                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.BeginAfterMissionSalvaging;
                }
                break;

            case DedicatedBookmarkSalvagerBehaviorState.WaitingforBadGuytoGoAway:
                Cache.Instance.LastKnownGoodConnectedTime = DateTime.UtcNow;
                Cache.Instance.MyWalletBalance            = Cache.Instance.DirectEve.Me.Wealth;
                if (DateTime.UtcNow.Subtract(Cache.Instance.LastLocalWatchAction).TotalMinutes < Time.Instance.WaitforBadGuytoGoAway_minutes)
                {
                    //TODO: add debug logging here
                    break;
                }
                _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.LocalWatch;
                break;

            case DedicatedBookmarkSalvagerBehaviorState.GotoBase:
                Cache.Instance.CurrentlyShouldBeSalvaging = false;
                if (Settings.Instance.DebugGotobase)
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "GotoBase: AvoidBumpingThings()", Logging.White);
                }
                NavigateOnGrid.AvoidBumpingThings(Cache.Instance.BigObjects.FirstOrDefault(), "DedicatedBookmarkSalvagerBehaviorState.GotoBase");
                if (Settings.Instance.DebugGotobase)
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "GotoBase: Traveler.TravelHome()", Logging.White);
                }
                Traveler.TravelHome("DedicatedBookmarkSalvagerBehavior");

                if (_States.CurrentTravelerState == TravelerState.AtDestination)     // || DateTime.UtcNow.Subtract(Cache.Instance.EnteredCloseQuestor_DateTime).TotalMinutes > 10)
                {
                    if (Settings.Instance.DebugGotobase)
                    {
                        Logging.Log("DedicatedBookmarkSalvagerBehavior", "GotoBase: We are at destination", Logging.White);
                    }
                    Cache.Instance.GotoBaseNow = false;     //we are there - turn off the 'forced' gotobase
                    Cache.Instance.Mission     = Cache.Instance.GetAgentMission(AgentID, false);
                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.UnloadLoot;
                    Traveler.Destination = null;
                }
                break;

            case DedicatedBookmarkSalvagerBehaviorState.UnloadLoot:
                if (_States.CurrentUnloadLootState == UnloadLootState.Idle)
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "UnloadLoot: Begin", Logging.White);
                    _States.CurrentUnloadLootState = UnloadLootState.Begin;
                }

                _unloadLoot.ProcessState();

                if (Settings.Instance.DebugStates)
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "UnloadLoot.State = " + _States.CurrentUnloadLootState, Logging.White);
                }

                if (_States.CurrentUnloadLootState == UnloadLootState.Done)
                {
                    Cache.Instance.LootAlreadyUnloaded = true;
                    _States.CurrentUnloadLootState     = UnloadLootState.Idle;
                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.CheckBookmarkAge;
                }
                break;

            case DedicatedBookmarkSalvagerBehaviorState.CheckBookmarkAge:

                if (DateTime.UtcNow >= Cache.Instance.NextSalvageTrip || Cache.Instance.InSpace)
                {
                    if (Cache.Instance.GetSalvagingBookmark == null)
                    {
                        BookmarksThatAreNotReadyYet = Cache.Instance.BookmarksByLabel(Settings.Instance.BookmarkPrefix + " ");
                        if (BookmarksThatAreNotReadyYet != null && BookmarksThatAreNotReadyYet.Any())
                        {
                            Logging.Log("DedicatedBookmarkSalvagerBehavior", "CheckBookmarkAge: There are [" + BookmarksThatAreNotReadyYet.Count() + "] Salvage Bookmarks that have not yet aged [" + Settings.Instance.AgeofBookmarksForSalvageBehavior + "] min.", Logging.White);
                        }
                        Logging.Log("DedicatedBookmarkSalvagerBehavior", "CheckBookmarkAge: Character mode is BookmarkSalvager and no bookmarks are ready to salvage.", Logging.White);

                        //We just need a NextSalvagerSession timestamp to key off of here to add the delay
                        if (Cache.Instance.InSpace)
                        {
                            // Questor does not handle in space starts very well, head back to base to try again
                            LastAction = DateTime.UtcNow;
                            Cache.Instance.NextSalvageTrip = DateTime.UtcNow.AddMinutes(Time.Instance.DelayBetweenSalvagingSessions_minutes);
                            _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.GotoBase;
                            break;
                        }

                        _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.Idle;
                        _States.CurrentQuestorState    = QuestorState.Idle;
                        Cache.Instance.NextSalvageTrip = DateTime.UtcNow.AddMinutes(Time.Instance.DelayBetweenSalvagingSessions_minutes);

                        break;
                    }

                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "CheckBookmarkAge: There are [ " + Cache.Instance.AfterMissionSalvageBookmarks.Count() + " ] more salvage bookmarks older then:" + Cache.Instance.AgedDate.ToString(CultureInfo.InvariantCulture) + ", left to process", Logging.White);
                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.BeginAfterMissionSalvaging;
                    Statistics.Instance.StartedSalvaging = DateTime.UtcNow;
                }
                else
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "CheckBookmarkAge: next salvage timer not expired. Waiting...", Logging.White);
                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.Idle;
                    _States.CurrentQuestorState = QuestorState.Idle;
                    return;
                }
                break;

            case DedicatedBookmarkSalvagerBehaviorState.BeginAfterMissionSalvaging:

                if (DateTime.UtcNow > Statistics.Instance.StartedSalvaging.AddMinutes(2))
                {
                    Logging.Log("DedicatedBookmarkSalvagebehavior", "Found [" + Cache.Instance.AfterMissionSalvageBookmarks.Count() + "] salvage bookmarks ready to process.", Logging.White);
                    Statistics.Instance.StartedSalvaging = DateTime.UtcNow;     //this will be reset for each "run" between the station and the field if using <unloadLootAtStation>true</unloadLootAtStation>
                    Cache.Instance.NextSalvageTrip       = DateTime.UtcNow.AddMinutes(Time.Instance.DelayBetweenSalvagingSessions_minutes);
                }
                //we know we are connected here
                Cache.Instance.LastKnownGoodConnectedTime = DateTime.UtcNow;
                Cache.Instance.MyWalletBalance            = Cache.Instance.DirectEve.Me.Wealth;

                Cache.Instance.OpenWrecks = true;
                if (Cache.Instance.InStation)
                {
                    if (_States.CurrentArmState == ArmState.Idle)
                    {
                        _States.CurrentArmState = ArmState.SwitchToSalvageShip;
                    }

                    Arm.ProcessState();
                }
                if (_States.CurrentArmState == ArmState.Done || Cache.Instance.InSpace)
                {
                    _States.CurrentArmState = ArmState.Idle;

                    if (_afterMissionSalvageBookmarks == null || Cache.Instance.InStation)
                    {
                        _afterMissionSalvageBookmarks = Cache.Instance.AfterMissionSalvageBookmarks.OrderBy(b => b.CreatedOn).ToList();
                    }

                    _afterMissionSalvageBookmarks = _afterMissionSalvageBookmarks.OrderBy(b => b.CreatedOn).ToList();
                    if (DateTime.UtcNow < Cache.Instance.LastAccelerationGateDetected.AddSeconds(10))     //long enough that the timer should expire if we have to warp even small distances to the next bm
                    {
                        _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.GotoBase;
                        Cache.Instance.NextSalvageTrip = DateTime.UtcNow.AddMinutes(Time.Instance.DelayBetweenSalvagingSessions_minutes);
                        return;

                        //Logging.Log("DedicatedBookmarkSalvagerBehavior.Salvager", "There is a gate on grid with us: deferring processing any bookmarks within CloseRangeScan because those are likely behind this gate and might have NPCs still there", Logging.White);
                        //_afterMissionSalvageBookmarks = new List<DirectBookmark>(_afterMissionSalvageBookmarks.Where(b => Cache.Instance.DistanceFromMe(b.X ?? 0, b.Y ?? 0, b.Z ?? 0) > (int)Distance.DirectionalScannerCloseRange)).OrderBy(b => b.CreatedOn).ToList();

                        //int i = 1;
                        //Logging.Log("DedicatedBookmarkSalvagerBehavior.Salvager", "Listing bookmarks in: _afterMissionSalvageBookmarks, they should be all more than CloseRangeScan [" + Distance.DirectionalScannerCloseRange + "] away.", Logging.Red);
                        //foreach (var bm in _afterMissionSalvageBookmarks)
                        //{
                        //    Logging.Log("", "[" + i + "] BM Name: [" + bm.Title + "]" + "] Distance: [" + Cache.Instance.DistanceFromMe(bm.X ?? 0, bm.Y ?? 0, bm.Z ?? 0) + "]", Logging.Red);
                        //    i++;
                        //}

                        //if (_afterMissionSalvageBookmarks.Any())
                        //{
                        //    Logging.Log("DedicatedBookmarkSalvagerBehavior.Salvager", "_afterMissionSalvageBookmarks contains [" + _afterMissionSalvageBookmarks.Count() + "] bookmarks", Logging.White);
                        //}
                        //else
                        //{
                        //    Logging.Log("DedicatedBookmarkSalvagerBehavior.Salvager", "_afterMissionSalvageBookmarks contains [ Zero ] bookmarks", Logging.White);
                        //    Logging.Log("DedicatedBookmarkSalvagerBehavior.Salvager", "AfterMissionSalvageBookmarks (including BMs we cant process yet) contains [" + Cache.Instance.AfterMissionSalvageBookmarks + "]", Logging.White);
                        //}
                    }

                    DirectBookmark bookmark = _afterMissionSalvageBookmarks.OrderBy(b => b.CreatedOn).FirstOrDefault();

                    if (bookmark == null)
                    {
                        _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.GotoBase;
                        Cache.Instance.NextSalvageTrip = DateTime.UtcNow.AddMinutes(Time.Instance.DelayBetweenSalvagingSessions_minutes);
                        return;
                    }
                    Logging.Log("DedicatedBookmarkSalvagerBehavior.Salvager", "Salvaging at first oldest bookmarks created on: " + bookmark.CreatedOn.ToString(), Logging.White);

                    List <DirectBookmark> bookmarksInLocal = new List <DirectBookmark>(_afterMissionSalvageBookmarks.Where(b => b.LocationId == Cache.Instance.DirectEve.Session.SolarSystemId).
                                                                                       OrderBy(b => b.CreatedOn));
                    DirectBookmark localBookmark = bookmarksInLocal.FirstOrDefault();
                    if (localBookmark != null)
                    {
                        Traveler.Destination = new BookmarkDestination(localBookmark);
                    }
                    else
                    {
                        Traveler.Destination = new BookmarkDestination(bookmark);
                    }
                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.GotoSalvageBookmark;

                    //we know we are connected here
                    Cache.Instance.LastKnownGoodConnectedTime = DateTime.UtcNow;
                    Cache.Instance.LastInWarp      = DateTime.UtcNow;
                    Cache.Instance.MyWalletBalance = Cache.Instance.DirectEve.Me.Wealth;
                    return;
                }
                break;

            case DedicatedBookmarkSalvagerBehaviorState.GotoSalvageBookmark:
                Traveler.ProcessState();
                if (Cache.Instance.GateInGrid())
                {
                    //Logging.Log("DedicatedBookmarkSalvagerBehavior", "GotoSalvageBookmark: We found gate in salvage bookmark. Going back to Base", Logging.White);
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "GotoSalvageBookmark: We found gate in salvage bookmark. Skipping this bookmark.", Logging.White);
                    Cache.Instance.LastAccelerationGateDetected = DateTime.UtcNow;

                    //we know we are connected here
                    Cache.Instance.LastKnownGoodConnectedTime             = DateTime.UtcNow;
                    Cache.Instance.MyWalletBalance                        = Cache.Instance.DirectEve.Me.Wealth;
                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.BeginAfterMissionSalvaging;
                    Traveler.Destination           = null;
                    Cache.Instance.NextSalvageTrip = DateTime.UtcNow.AddMinutes(Time.Instance.DelayBetweenSalvagingSessions_minutes);
                    return;
                }

                if (_States.CurrentTravelerState == TravelerState.AtDestination)
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "GotoSalvageBookmark: Gate not found, we can start salvaging", Logging.White);

                    //we know we are connected here
                    Cache.Instance.LastKnownGoodConnectedTime = DateTime.UtcNow;
                    Cache.Instance.MyWalletBalance            = Cache.Instance.DirectEve.Me.Wealth;
                    Cache.Instance.LastInWarp = DateTime.UtcNow;

                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.Salvage;
                    Traveler.Destination = null;
                    return;
                }

                if (Settings.Instance.DebugStates)
                {
                    Logging.Log("Traveler.State is ", _States.CurrentTravelerState.ToString(), Logging.White);
                }
                break;

            case DedicatedBookmarkSalvagerBehaviorState.Salvage:
                if (Settings.Instance.DebugSalvage)
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "salvage::: attempting to open cargo hold", Logging.White);
                }
                if (Cache.Instance.CurrentShipsCargo == null)
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "salvage:: if (Cache.Instance.CurrentShipsCargo == null)", Logging.Teal);
                    return;
                }

                if (Settings.Instance.DebugSalvage)
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "salvage::: done opening cargo hold", Logging.White);
                }
                Cache.Instance.SalvageAll = true;
                Cache.Instance.OpenWrecks = true;
                Cache.Instance.CurrentlyShouldBeSalvaging = true;

                const int distanceToCheck = (int)Distances.OnGridWithMe;

                // is there any NPCs within distanceToCheck?
                EntityCache deadlyNPC = Cache.Instance.EntitiesOnGrid.Where(t => t.Distance < distanceToCheck && !t.IsEntityIShouldLeaveAlone && !t.IsContainer && t.IsNpc && t.CategoryId == (int)CategoryID.Entity && !t.IsLargeCollidable).OrderBy(t => t.Distance).FirstOrDefault();

                if (deadlyNPC != null)
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior.Salvage", "Npc name:[" + deadlyNPC.Name + "] with groupId:[" + deadlyNPC.GroupId + "].", Logging.White);

                    // found NPCs that will likely kill out fragile salvage boat!

                    DirectBookmark bookmark = Cache.Instance.AfterMissionSalvageBookmarks.OrderBy(b => b.CreatedOn).FirstOrDefault();
                    if (bookmark != null)
                    {
                        Cache.Instance.DeleteBookmarksOnGrid("DedicatedBookmarkSalvageBehavior");
                        return;
                    }

                    Statistics.Instance.FinishedSalvaging = DateTime.UtcNow;
                    Cache.Instance.NextSalvageTrip        = DateTime.UtcNow;
                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.GotoBase;
                    return;
                }

                if (Cache.Instance.CurrentShipsCargo.IsValid && (Cache.Instance.CurrentShipsCargo.Capacity - Cache.Instance.CurrentShipsCargo.UsedCapacity) < Settings.Instance.ReserveCargoCapacity + 10)
                {
                    Logging.Log("DedicatedBookmarkSalvageBehavior.Salvage", "We are full, go to base to unload", Logging.White);
                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.GotoBase;
                    break;
                }
                else if (Cache.Instance.CurrentShipsCargo.IsValid)
                {
                    if (Settings.Instance.DebugSalvage)
                    {
                        Logging.Log("DedicatedSalvager", "CurrentCapacity [" + Cache.Instance.CurrentShipsCargo.Capacity + "] UsedCapacity [" + Cache.Instance.CurrentShipsCargo.UsedCapacity + "][" + Settings.Instance.ReserveCargoCapacity + "]", Logging.Debug);
                    }
                }

                if (!Cache.Instance.UnlootedContainers.Any())
                {
                    if (!Cache.Instance.DeleteBookmarksOnGrid("DedicatedBookmarkSalvageBehavior"))
                    {
                        return;
                    }
                    // this can eventually be moved to somewhere else like unloadloot BUT...
                    // that will mean keeping track of bookmarks we delete and such in this local list.
                    _afterMissionSalvageBookmarks = Cache.Instance.AfterMissionSalvageBookmarks.OrderBy(b => b.CreatedOn).ToList();

                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.CheckBookmarkAge;
                    return;
                }

                if (DateTime.UtcNow > Cache.Instance.LastInWarp.AddMinutes(20))
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "It has been over 20 min since we were last in warp. Assuming something went wrong: setting GoToBase", Logging.Orange);
                    _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.GotoBase;
                    return;
                }

                if (Settings.Instance.DebugSalvage)
                {
                    Logging.Log("DedicatedBookmarkSalvagerBehavior", "salvage: we have more wrecks to salvage", Logging.White);
                }
                //we __cannot ever__ approach in salvage.cs so this section _is_ needed.
                Salvage.MoveIntoRangeOfWrecks();
                try
                {
                    // Overwrite settings, as the 'normal' settings do not apply
                    Salvage.MaximumWreckTargets  = Cache.Instance.MaxLockedTargets;
                    Salvage.ReserveCargoCapacity = 80;
                    Salvage.LootEverything       = true;
                    Salvage.ProcessState();
                    //Logging.Log("number of max cache ship: " + Cache.Instance.ActiveShip.MaxLockedTargets);
                    //Logging.Log("number of max cache me: " + Cache.Instance.DirectEve.Me.MaxLockedTargets);
                    //Logging.Log("number of max math.min: " + _salvage.MaximumWreckTargets);
                }
                finally
                {
                    ApplySalvageSettings();
                }
                break;

            case DedicatedBookmarkSalvagerBehaviorState.Default:
                _States.CurrentDedicatedBookmarkSalvagerBehaviorState = DedicatedBookmarkSalvagerBehaviorState.Idle;
                break;
            }
        }