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); } } }
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()); } }