Esempio n. 1
0
        public void ProcessState()
        {
            // Nothing to salvage in stations
            if (Cache.Instance.InStation)
                return;

            var cargo = Cache.Instance.DirectEve.GetShipsCargo();
            switch (State)
            {
                case SalvageState.TargetWrecks:
                    TargetWrecks();

                    // Next state
                    State = SalvageState.LootWrecks;
                    break;

                case SalvageState.LootWrecks:
                    LootWrecks();

                    State = SalvageState.SalvageWrecks;
                    break;

                case SalvageState.SalvageWrecks:
                    ActivateTractorBeams();
                    ActivateSalvagers();

                    // Default action
                    State = SalvageState.TargetWrecks;
                    if (cargo.IsReady && cargo.Items.Any() && _nextSalvageAction < DateTime.Now)
                    {
                        // Check if there are actually duplicates
                        var duplicates = cargo.Items.Where(i => i.Quantity > 0).GroupBy(i => i.TypeId).Any(t => t.Count() > 1);
                        if (duplicates)
                            State = SalvageState.StackItems;
                        else
                            _nextSalvageAction = DateTime.Now.AddSeconds((int)Time.SalvageStackItems_seconds);
                    }
                    break;

                case SalvageState.StackItems:
                    Logging.Log("Salvage: Stacking items");

                    if (cargo.IsReady)
                        cargo.StackAll();

                    _nextSalvageAction = DateTime.Now.AddSeconds((int)Time.SalvageStackItemsDelayBeforeResuming_seconds);
                    State = SalvageState.WaitForStacking;
                    break;

                case SalvageState.WaitForStacking:
                    // Wait 5 seconds after stacking
                    if (_nextSalvageAction > DateTime.Now)
                        break;

                    if (Cache.Instance.DirectEve.GetLockedItems().Count == 0)
                    {
                        Logging.Log("Salvage: Done stacking");
                        State = SalvageState.TargetWrecks;
                        break;
                    }

                    if (DateTime.Now.Subtract(_nextSalvageAction).TotalSeconds > 120)
                    {
                        Logging.Log("Salvage: Stacking items timed out, clearing item locks");
                        Cache.Instance.DirectEve.UnlockItems();

                        Logging.Log("Salvage: Done stacking");
                        State = SalvageState.TargetWrecks;
                        break;
                    }
                    break;

                default:
                    // Unknown state, goto first state
                    State = SalvageState.TargetWrecks;
                    break;
            }
        }
Esempio n. 2
0
        /// <summary>
        ///   Activates tractorbeam on targeted wrecks
        /// </summary>
        private void ActivateTractorBeams()
        {
            if (_nextSalvageAction > DateTime.Now) return;

            var tractorBeams = Cache.Instance.Modules.Where(m => TractorBeams.Contains(m.TypeId)).ToList();
            if (tractorBeams.Count == 0)
                return;

            var tractorBeamRange = tractorBeams.Min(t => t.OptimalRange);
            var wrecks = Cache.Instance.Targets.Where(t => (t.GroupId == (int)Group.Wreck || t.GroupId == (int)Group.CargoContainer) && t.Distance < tractorBeamRange).ToList();

            Logging.Log(Cache.Instance.DirectEve.ActiveShip.Entity.Mode.ToString());
            if (wrecks.FirstOrDefault() == null)
            {
                var wrecksFar = Cache.Instance.Entities.Where(t => (t.GroupId == (int)Group.Wreck || t.GroupId == (int)Group.CargoContainer) && t.Distance > tractorBeamRange).ToList();
                if (wrecksFar.Count > 0)
                    if (Cache.Instance.DirectEve.ActiveShip.Entity.Mode != 1)
                    {
                        if (_nextApproachAction < DateTime.Now)
                        {
                            _nextApproachAction = DateTime.Now.AddSeconds((int)Time.ApproachDelay_seconds);
                            wrecksFar.FirstOrDefault().Approach();
                        }
                    }
                State = SalvageState.TargetWrecks;
                return;
            };

            for (var i = tractorBeams.Count - 1; i >= 0; i--)
            {
                var tractorBeam = tractorBeams[i];
                if (!tractorBeam.IsActive && !tractorBeam.IsDeactivating)
                    continue;

                var wreck = wrecks.FirstOrDefault(w => w.Id == tractorBeam.TargetId);
                // If the wreck no longer exists, or its within loot range then disable the tractor beam
                if (tractorBeam.IsActive && (wreck == null || wreck.Distance <= (int)Distance.SafeScoopRange))
                {
                    tractorBeam.Deactivate();
                    _nextSalvageAction = DateTime.Now.AddMilliseconds((int)Time.SalvageDelayBetweenActions_miliseconds);
                    return;
                    //More human behaviour
                    //System.Threading.Thread.Sleep(333);
                }
                // Remove the tractor beam as a possible beam to activate
                tractorBeams.RemoveAt(i);
                wrecks.RemoveAll(w => w.Id == tractorBeam.TargetId);
            }

            foreach (var wreck in wrecks)
            {
                // This velocity check solves some bugs where velocity showed up as 150000000m/s
                if (wreck.Velocity != 0 && wreck.Velocity < (int)Distance.SafeScoopRange)
                    continue;

                // Is this wreck within range?
                if (wreck.Distance < (int)Distance.SafeScoopRange)
                    continue;

                if (tractorBeams.Count == 0)
                    return;

                var tractorBeam = tractorBeams[0];
                tractorBeams.RemoveAt(0);
                tractorBeam.Activate(wreck.Id);

                Logging.Log("Salvage: Activating tractorbeam [" + tractorBeam.ItemId + "] on [" + wreck.Name + "][" + wreck.Id + "]");
                //More human behaviour
                //System.Threading.Thread.Sleep(333);
                _nextSalvageAction = DateTime.Now.AddMilliseconds((int)Time.SalvageDelayBetweenActions_miliseconds);
                return;

            }
        }
Esempio n. 3
0
        public void ProcessState()
        {
            // Nothing to salvage in stations
            if (Cache.Instance.InStation)
            {
                return;
            }

            var cargo = Cache.Instance.DirectEve.GetShipsCargo();

            switch (State)
            {
            case SalvageState.TargetWrecks:
                TargetWrecks();

                // Next state
                State = SalvageState.LootWrecks;
                break;

            case SalvageState.LootWrecks:
                LootWrecks();

                State = SalvageState.SalvageWrecks;
                break;

            case SalvageState.SalvageWrecks:
                ActivateTractorBeams();
                ActivateSalvagers();

                // Default action
                State = SalvageState.TargetWrecks;
                if (cargo.IsReady && cargo.Items.Any() && _nextAction < DateTime.Now)
                {
                    // Check if there are actually duplicates
                    var duplicates = cargo.Items.Where(i => i.Quantity > 0).GroupBy(i => i.TypeId).Any(t => t.Count() > 1);
                    if (duplicates)
                    {
                        State = SalvageState.StackItems;
                    }
                    else
                    {
                        _nextAction = DateTime.Now.AddSeconds(150);
                    }
                }
                break;

            case SalvageState.StackItems:
                Logging.Log("Salvage: Stacking items");

                if (cargo.IsReady)
                {
                    cargo.StackAll();
                }

                _nextAction = DateTime.Now.AddSeconds(5);
                State       = SalvageState.WaitForStacking;
                break;

            case SalvageState.WaitForStacking:
                // Wait 5 seconds after stacking
                if (_nextAction > DateTime.Now)
                {
                    break;
                }

                if (Cache.Instance.DirectEve.GetLockedItems().Count == 0)
                {
                    Logging.Log("Salvage: Done stacking");
                    State = SalvageState.TargetWrecks;
                    break;
                }

                if (DateTime.Now.Subtract(_nextAction).TotalSeconds > 120)
                {
                    Logging.Log("Salvage: Stacking items timed out, clearing item locks");
                    Cache.Instance.DirectEve.UnlockItems();

                    Logging.Log("Salvage: Done stacking");
                    State = SalvageState.TargetWrecks;
                    break;
                }
                break;

            default:
                // Unknown state, goto first state
                State = SalvageState.TargetWrecks;
                break;
            }
        }
Esempio n. 4
0
        /// <summary>
        ///   Activates tractorbeam on targeted wrecks
        /// </summary>
        private void ActivateTractorBeams()
        {
            if (_nextSalvageAction > DateTime.Now)
            {
                return;
            }

            var tractorBeams = Cache.Instance.Modules.Where(m => TractorBeams.Contains(m.TypeId)).ToList();

            if (tractorBeams.Count == 0)
            {
                return;
            }

            var tractorBeamRange = tractorBeams.Min(t => t.OptimalRange);
            var wrecks           = Cache.Instance.Targets.Where(t => (t.GroupId == (int)Group.Wreck || t.GroupId == (int)Group.CargoContainer) && t.Distance < tractorBeamRange).ToList();

            Logging.Log(Cache.Instance.DirectEve.ActiveShip.Entity.Mode.ToString());
            if (wrecks.FirstOrDefault() == null)
            {
                var wrecksFar = Cache.Instance.Entities.Where(t => (t.GroupId == (int)Group.Wreck || t.GroupId == (int)Group.CargoContainer) && t.Distance > tractorBeamRange).ToList();
                if (wrecksFar.Count > 0)
                {
                    if (Cache.Instance.DirectEve.ActiveShip.Entity.Mode != 1)
                    {
                        if (_nextApproachAction < DateTime.Now)
                        {
                            _nextApproachAction = DateTime.Now.AddSeconds((int)Time.ApproachDelay_seconds);
                            wrecksFar.FirstOrDefault().Approach();
                        }
                    }
                }
                State = SalvageState.TargetWrecks;
                return;
            }
            ;

            for (var i = tractorBeams.Count - 1; i >= 0; i--)
            {
                var tractorBeam = tractorBeams[i];
                if (!tractorBeam.IsActive && !tractorBeam.IsDeactivating)
                {
                    continue;
                }

                var wreck = wrecks.FirstOrDefault(w => w.Id == tractorBeam.TargetId);
                // If the wreck no longer exists, or its within loot range then disable the tractor beam
                if (tractorBeam.IsActive && (wreck == null || wreck.Distance <= (int)Distance.SafeScoopRange))
                {
                    tractorBeam.Deactivate();
                    _nextSalvageAction = DateTime.Now.AddMilliseconds((int)Time.SalvageDelayBetweenActions_miliseconds);
                    return;
                    //More human behaviour
                    //System.Threading.Thread.Sleep(333);
                }
                // Remove the tractor beam as a possible beam to activate
                tractorBeams.RemoveAt(i);
                wrecks.RemoveAll(w => w.Id == tractorBeam.TargetId);
            }

            foreach (var wreck in wrecks)
            {
                // This velocity check solves some bugs where velocity showed up as 150000000m/s
                if (wreck.Velocity != 0 && wreck.Velocity < (int)Distance.SafeScoopRange)
                {
                    continue;
                }

                // Is this wreck within range?
                if (wreck.Distance < (int)Distance.SafeScoopRange)
                {
                    continue;
                }

                if (tractorBeams.Count == 0)
                {
                    return;
                }

                var tractorBeam = tractorBeams[0];
                tractorBeams.RemoveAt(0);
                tractorBeam.Activate(wreck.Id);

                Logging.Log("Salvage: Activating tractorbeam [" + tractorBeam.ItemId + "] on [" + wreck.Name + "][" + wreck.Id + "]");
                //More human behaviour
                //System.Threading.Thread.Sleep(333);
                _nextSalvageAction = DateTime.Now.AddMilliseconds((int)Time.SalvageDelayBetweenActions_miliseconds);
                return;
            }
        }