コード例 #1
0
        public static void UpdateEnemyInfo()
        {
            ThreadSafeObservableCollection <EnemyInfo> collectionEnemyOverlyInfo;

            if (!Core.Me.InCombat)
            {
                if (EnemyOverlayInfos != null && EnemyOverlayInfos.Count > 0)
                {
                    EnemyOverlayInfos.Clear();
                    collectionEnemyOverlyInfo = new ThreadSafeObservableCollection <EnemyInfo>(EnemyOverlayInfos);
                    EnemyOverlayViewModel.Instance.EnemyInfoCollection = collectionEnemyOverlyInfo;
                }

                return;
            }

            try
            {
                MonitoredEnemies = PartyManager.IsInParty ? (from r in GameObjectManager.GetObjectsOfType <BattleCharacter>()
                                                             where r.TaggerType == 2
                                                             select r).ToList() : GameObjectManager.Attackers.ToList();
            }
            catch (Exception exception)
            {
                Logging.Write(exception);
            }

            foreach (var monitoredEnemy in MonitoredEnemies)
            {
                Aura aura1 = null;
                Aura aura2 = null;
                Aura aura3 = null;
                foreach (var characterAura in monitoredEnemy.CharacterAuras)
                {
                    if (characterAura.CasterId == Core.Me.ObjectId)
                    {
                        switch (Core.Me.CurrentJob)
                        {
                        case ClassJobType.Arcanist:
                        case ClassJobType.Summoner:
                        case ClassJobType.Scholar:
                            switch (characterAura.Id)
                            {
                            case Auras.Bio:
                            case Auras.BioIII:
                                aura1 = characterAura;
                                break;

                            case Auras.BioII:
                                aura2 = characterAura;
                                break;

                            case Auras.Miasma:
                            case Auras.MiasmaIII:
                                aura3 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.Archer:
                        case ClassJobType.Bard:
                            switch (characterAura.Id)
                            {
                            case Auras.VenomousBite:
                            case Auras.CausticBite:
                                aura1 = characterAura;
                                break;

                            case Auras.Windbite:
                            case Auras.StormBite:
                                aura2 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.Conjurer:
                        case ClassJobType.WhiteMage:
                            switch (characterAura.Id)
                            {
                            case Auras.Aero:
                                aura1 = characterAura;
                                break;

                            case Auras.AeroII:
                                aura2 = characterAura;
                                break;

                            case Auras.AeroIII:
                                aura3 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.Gladiator:
                        case ClassJobType.Paladin:
                            switch (characterAura.Id)
                            {
                            case Auras.GoringBlade:
                                aura1 = characterAura;
                                break;

                            case Auras.StrengthDown:
                                aura2 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.Lancer:
                        case ClassJobType.Dragoon:
                            switch (characterAura.Id)
                            {
                            case Auras.Phlebotomize:
                                aura1 = characterAura;
                                break;

                            case Auras.Disembowel:
                                aura2 = characterAura;
                                break;

                            case Auras.ChaosThrust:
                                aura3 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.Marauder:
                        case ClassJobType.Warrior:
                            switch (characterAura.Id)
                            {
                            case Auras.StormsEye:
                                aura1 = characterAura;
                                break;

                            case Auras.StormsPath:
                                aura2 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.Pugilist:
                        case ClassJobType.Monk:
                            switch (characterAura.Id)
                            {
                            case Auras.TouchofDeath:
                                aura1 = characterAura;
                                break;

                            case Auras.Demolish:
                                aura2 = characterAura;
                                break;

                            case Auras.DragonKick:
                                aura3 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.Rogue:
                        case ClassJobType.Ninja:
                            switch (characterAura.Id)
                            {
                            case Auras.ShadowFang:
                                aura1 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.Thaumaturge:
                        case ClassJobType.BlackMage:
                            switch (characterAura.Id)
                            {
                            case Auras.Thunder:
                                aura1 = characterAura;
                                break;

                            case Auras.ThunderII:
                                aura2 = characterAura;
                                break;

                            case Auras.ThunderIII:
                                aura3 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.Machinist:
                            switch (characterAura.Id)
                            {
                            case Auras.Wildfire:
                                aura1 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.DarkKnight:
                            switch (characterAura.Id)
                            {
                            case Auras.Scourge:
                                aura1 = characterAura;
                                break;

                            case Auras.Delirium:
                                aura2 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.Astrologian:
                            switch (characterAura.Id)
                            {
                            case Auras.Combust:
                                aura1 = characterAura;
                                break;

                            case Auras.CombustII:
                                aura2 = characterAura;
                                break;

                            case Auras.Heavy:
                                aura3 = characterAura;
                                break;
                            }
                            break;

                        case ClassJobType.Samurai:
                            switch (characterAura.Id)
                            {
                            case Auras.Higanbana:
                                aura1 = characterAura;
                                break;
                            }
                            break;
                        }
                    }
                }
                if (EnemyOverlayInfos.Any(r => r.Unit == monitoredEnemy))
                {
                    var target = EnemyOverlayInfos.FirstOrDefault(r => r.Unit == monitoredEnemy);
                    if (target != null)
                    {
                        if (target.NeedToTarget)
                        {
                            target.Unit.Target();
                            target.NeedToTarget = false;
                        }
                        target.Aura1TimeLeft = aura1?.TimespanLeft.Seconds ?? 0;
                        target.Aura2TimeLeft = aura2?.TimespanLeft.Seconds ?? 0;
                        target.Aura3TimeLeft = aura3?.TimespanLeft.Seconds ?? 0;
                        if (target.Unit.CurrentHealthPercent > target.LastTickHealthPct + 5)
                        {
                            target.CombatStart = DateTime.Now;
                            target.StartHealth = target.Unit.CurrentHealth;
                        }
                        var startHealth = target.StartHealth - monitoredEnemy.CurrentHealth;
                        var timeSpan    = DateTime.Now - target.CombatStart;
                        target.CurrentDps         = (int)(startHealth / timeSpan.TotalSeconds);
                        target.LastTickHealthPct  = target.Unit.CurrentHealthPercent;
                        target.CurrentlyTargeting = Core.Me.HasTarget && Core.Me.CurrentTarget == monitoredEnemy;

                        if (((100 - target.LastTickHealthPct) / 100) != 0)
                        {
                            var timeSinceStart = DateTime.Now.Subtract(target.CombatStart);
                            var totalTime      = TimeSpan.FromSeconds(timeSinceStart.TotalSeconds / ((100 - target.LastTickHealthPct) / 100));
                            var timeLeft       = totalTime - timeSinceStart;

                            target.TimeToDeath = (int)timeLeft.TotalSeconds;
                        }
                    }
                }
                else
                {
                    var enemyInfo = new EnemyInfo
                    {
                        Unit               = monitoredEnemy,
                        CombatStart        = DateTime.Now,
                        StartHealth        = monitoredEnemy.CurrentHealth,
                        LastTickHealthPct  = monitoredEnemy.CurrentHealth,
                        Aura1TimeLeft      = aura1?.TimespanLeft.Seconds ?? 0,
                        Aura2TimeLeft      = aura2?.TimespanLeft.Seconds ?? 0,
                        Aura3TimeLeft      = aura3?.TimespanLeft.Seconds ?? 0,
                        CurrentlyTargeting = Core.Me.HasTarget && Core.Me.CurrentTarget == monitoredEnemy,
                        TimeToDeath        = 0
                    };
                    EnemyOverlayInfos.Add(enemyInfo);
                }
            }

            var removeEnemyArray = (
                from r in EnemyOverlayInfos
                where !MonitoredEnemies.Contains(r.Unit) || r.Unit.IsDead || !r.Unit.IsValid
                select r).ToArray();

            foreach (var enemy in removeEnemyArray)
            {
                EnemyOverlayInfos.Remove(enemy);
            }

            collectionEnemyOverlyInfo = new ThreadSafeObservableCollection <EnemyInfo>(EnemyOverlayInfos);
            EnemyOverlayViewModel.Instance.EnemyInfoCollection = collectionEnemyOverlyInfo;
        }
コード例 #2
0
            private int _enumeratingCurrentSnapshot;                                  // # enumerating snapshot with current ID; reset when a snapshot is created

            public ThreadView(ThreadSafeObservableCollection <T> owner)
            {
                _owner    = owner;
                _threadId = Thread.CurrentThread.ManagedThreadId;
                _snapshot = new WeakReference <List <T> >(null);
            }