Esempio n. 1
0
        private void RefreshCurrentEnmityModelList(
            IEnumerable <EnmityEntry> enmityEntryList)
        {
            lock (this.CurrentEnmityModelList)
            {
                this.CurrentEnmityModelList.Clear();

                if (enmityEntryList == null)
                {
                    return;
                }

                var config      = Settings.Instance.Enmity;
                var pcNameStyle = ConfigBridge.Instance.PCNameStyle;

                var count = 0;
                foreach (var entry in enmityEntryList)
                {
                    if (entry.ID == 0)
                    {
                        continue;
                    }

                    count++;

                    if (count > config.MaxCountOfDisplay)
                    {
                        break;
                    }

                    var name = entry.Name;
                    if (string.IsNullOrEmpty(name))
                    {
                        name = CombatantEx.UnknownName;
                    }
                    else
                    {
                        name = config.IsSelfDisplayYou && entry.IsMe ?
                               "YOU" :
                               CombatantEx.NameToInitial(entry.Name, pcNameStyle);
                    }

                    var model = new EnmityModel();
                    model.Index    = count;
                    model.ID       = entry.ID;
                    model.Name     = name;
                    model.JobID    = (JobIDs)entry.Job;
                    model.Enmity   = (double)entry.Enmity;
                    model.HateRate = entry.HateRate / 100f;
                    model.IsMe     = entry.IsMe;
                    model.IsPet    = entry.IsPet;
                    model.IsTop    = count <= 1;
                    this.CurrentEnmityModelList.Add(model);

                    Thread.Yield();
                }

                // EPSを更新する
                var isRefreshed = this.RefreshEPS();

                // ログを出力する
                if (isRefreshed)
                {
                    this.WriteEnmityLog(enmityEntryList);
                }
            }
        }
Esempio n. 2
0
        protected override void GetCombatant()
        {
            lock (this.TargetInfoLock)
            {
                var now = DateTime.Now;
                if ((now - this.combatantsTimestamp).TotalMilliseconds
                    < Settings.Instance.MobList.RefreshRateMin)
                {
                    return;
                }

                this.combatantsTimestamp = now;
            }

            #region Test Mode

            // テストモード?
            if (Settings.Instance.MobList.TestMode)
            {
                var dummyTargets = new List <MobInfo>();

                dummyTargets.Add(new MobInfo()
                {
                    Name      = "TEST:シルバーの吉田直樹",
                    Rank      = "EX",
                    Combatant = new CombatantEx()
                    {
                        ID    = 1,
                        Name  = "TEST:シルバーの吉田直樹",
                        Type  = (byte)Actor.Type.Monster,
                        MaxHP = 1,
                        PosX  = 0,
                        PosY  = 10,
                        PosZ  = 10,
                    },
                });

                dummyTargets.Add(new MobInfo()
                {
                    Name      = "TEST:イクシオン",
                    Rank      = "EX",
                    Combatant = new CombatantEx()
                    {
                        ID    = 2,
                        Name  = "TEST:イクシオン",
                        Type  = (byte)Actor.Type.Monster,
                        MaxHP = 1,
                        PosX  = 100,
                        PosY  = 100,
                        PosZ  = -10,
                    },
                });

                dummyTargets.Add(new MobInfo()
                {
                    Name      = "TEST:イクシオン",
                    Rank      = "EX",
                    Combatant = new CombatantEx()
                    {
                        ID    = 21,
                        Name  = "TEST:イクシオン",
                        Type  = (byte)Actor.Type.Monster,
                        MaxHP = 1,
                        PosX  = 100,
                        PosY  = 100,
                        PosZ  = -10,
                    },
                });

                dummyTargets.Add(new MobInfo()
                {
                    Name      = "TEST:ソルト・アンド・ライト",
                    Rank      = "S",
                    Combatant = new CombatantEx()
                    {
                        ID    = 3,
                        Name  = "TEST:ソルト・アンド・ライト",
                        Type  = (byte)Actor.Type.Monster,
                        MaxHP = 1,
                        PosX  = 10,
                        PosY  = 0,
                        PosZ  = 0,
                    },
                });

                dummyTargets.Add(new MobInfo()
                {
                    Name      = "TEST:オルクス",
                    Rank      = "A",
                    Combatant = new CombatantEx()
                    {
                        ID    = 4,
                        Name  = "TEST:オルクス",
                        Type  = (byte)Actor.Type.Monster,
                        MaxHP = 1,
                        PosX  = 100,
                        PosY  = -100,
                        PosZ  = 0,
                    },
                });

                dummyTargets.Add(new MobInfo()
                {
                    Name      = "TEST:宵闇のヤミニ",
                    Rank      = "B",
                    Combatant = new CombatantEx()
                    {
                        ID    = 5,
                        Name  = "TEST:宵闇のヤミニ",
                        Type  = (byte)Actor.Type.Monster,
                        MaxHP = 1,
                        PosX  = 0,
                        PosY  = -100,
                        PosZ  = 0,
                    },
                });

                dummyTargets.Add(new MobInfo()
                {
                    Name      = CombatantEx.NameToInitial("TEST:Hime Hana", ConfigBridge.Instance.PCNameStyle),
                    Rank      = "DEAD",
                    Combatant = new CombatantEx()
                    {
                        ID    = 7,
                        Name  = CombatantEx.NameToInitial("TEST:Hime Hana", ConfigBridge.Instance.PCNameStyle),
                        Type  = (byte)Actor.Type.Monster,
                        Job   = (byte)JobIDs.BLM,
                        MaxHP = 43462,
                        PosX  = -100,
                        PosY  = -100,
                        PosZ  = 0,
                    },
                });

                lock (this.TargetInfoLock)
                {
                    this.TargetInfo    = dummyTargets.First().Combatant;
                    this.targetMobList = dummyTargets;
                }

                return;
            }

            #endregion Test Mode

            if ((CombatantsManager.Instance.CombatantsMainCount + CombatantsManager.Instance.CombatantsOtherCount) <= 0)
            {
                return;
            }

            var targets    = default(IEnumerable <MobInfo>);
            var combatants = CombatantsManager.Instance.GetCombatants();

            // モブを検出する
            IEnumerable <MobInfo> GetTargetMobs()
            {
                foreach (var x in combatants)
                {
                    if (string.IsNullOrEmpty(x?.Name))
                    {
                        continue;
                    }

                    if (x.ActorType == Actor.Type.PC ||
                        x.ActorType == Actor.Type.Monster)
                    {
                        if (x.MaxHP <= 0 ||
                            (x.MaxHP > 0 && x.CurrentHP <= 0))
                        {
                            continue;
                        }
                    }

                    var targetInfo = Settings.Instance.MobList.GetTargetMobInfo(x.Name);
                    if (string.IsNullOrEmpty(targetInfo.Name))
                    {
                        continue;
                    }

                    yield return(new MobInfo()
                    {
                        Name = x.Name,
                        Combatant = x,
                        Rank = targetInfo.Rank,
                        MaxDistance = targetInfo.MaxDistance,
                        TTSEnabled = targetInfo.TTSEnabled,
                    });
                }
            }

            targets = GetTargetMobs();

            // 戦闘不能者を検出する?
            var deadmenInfo = Settings.Instance.MobList.GetDetectDeadmenInfo;
            if (!string.IsNullOrEmpty(deadmenInfo.Name))
            {
                var party   = CombatantsManager.Instance.GetPartyList();
                var deadmen =
                    from x in party
                    where
                    x != null &&
                    !x.IsPlayer &&
                    x.ActorType == Actor.Type.PC &&
                    x.MaxHP > 0 && x.CurrentHP <= 0
                    select new MobInfo()
                {
                    Name        = x.NameForDisplay,
                    Combatant   = x,
                    Rank        = deadmenInfo.Rank,
                    MaxDistance = deadmenInfo.MaxDistance,
                    TTSEnabled  = deadmenInfo.TTSEnabled,
                };

                targets = targets.Concat(deadmen);
            }

            // クエリを実行する
            targets = targets.ToArray();

            lock (this.TargetInfoLock)
            {
                this.targetMobList = targets
                                     .Where(x => x.Distance <= x.MaxDistance)
                                     .ToList();

                this.TargetInfo = this.targetMobList.FirstOrDefault()?.Combatant;

                if (this.TargetInfo == null)
                {
                    var model = this.Model as MobListModel;
                    if (model != null &&
                        model.MobList.Any())
                    {
                        WPFHelper.BeginInvoke(model.ClearMobList);
                    }
                }
            }

            if (combatants != null)
            {
                CombatantsViewModel.RefreshCombatants(combatants.ToArray());
            }
        }