diff --git a/RotationSolver.Basic/Actions/BaseAction_Target.cs b/RotationSolver.Basic/Actions/BaseAction_Target.cs index c74c1b0ab..372f83731 100644 --- a/RotationSolver.Basic/Actions/BaseAction_Target.cs +++ b/RotationSolver.Basic/Actions/BaseAction_Target.cs @@ -268,7 +268,6 @@ private bool TargetHostile(float range, bool mustUse, int aoeCount, out BattleCh return false; } - //判断一下AOE攻击的时候如果有攻击目标标记目标 if (_action.CastType > 1 && NoAOE) { target = null; diff --git a/RotationSolver.Basic/Data/ActionEffectSet.cs b/RotationSolver.Basic/Data/ActionEffectSet.cs index 3cb54da0a..a9888a490 100644 --- a/RotationSolver.Basic/Data/ActionEffectSet.cs +++ b/RotationSolver.Basic/Data/ActionEffectSet.cs @@ -1,4 +1,5 @@ using FFXIVClientStructs.FFXIV.Client.Game; +using System.Collections; using Action = Lumina.Excel.GeneratedSheets.Action; namespace RotationSolver.Basic.Data; diff --git a/RotationSolver.Basic/Data/ActionRec.cs b/RotationSolver.Basic/Data/ActionRec.cs index 7eeb5341f..414008b1f 100644 --- a/RotationSolver.Basic/Data/ActionRec.cs +++ b/RotationSolver.Basic/Data/ActionRec.cs @@ -2,3 +2,5 @@ using Action = Lumina.Excel.GeneratedSheets.Action; public record ActionRec(DateTime UsedTime, Action Action); + +public record DamageRec(DateTime ReceiveTime, float Ratio); diff --git a/RotationSolver.Basic/DataCenter.cs b/RotationSolver.Basic/DataCenter.cs index a9d26ce53..f271e3cee 100644 --- a/RotationSolver.Basic/DataCenter.cs +++ b/RotationSolver.Basic/DataCenter.cs @@ -257,6 +257,23 @@ public static float RatioOfMembersIn2minsBurst #region Action Record const int QUEUECAPACITY = 32; private static Queue _actions = new Queue(QUEUECAPACITY); + private static Queue _damages = new Queue(QUEUECAPACITY); + + public static float DPSTaken + { + get + { + var recs = _damages.Where(r => DateTime.Now - r.ReceiveTime < TimeSpan.FromMilliseconds(5)); + + if(!recs.Any()) return 0; + + var damages = recs.Sum(r => r.Ratio); + + var time = recs.Last().ReceiveTime - recs.First().ReceiveTime + TimeSpan.FromMilliseconds(2.5f); + + return damages / (float)time.TotalSeconds; + } + } public static ActionRec[] RecordActions => _actions.Reverse().ToArray(); private static DateTime _timeLastActionUsed = DateTime.Now; @@ -292,5 +309,14 @@ public static void AddActionRec(Action act) _timeLastActionUsed = DateTime.Now; _actions.Enqueue(new ActionRec(_timeLastActionUsed, act)); } + + public static void AddDamageRec(float damageRatio) + { + if (_damages.Count >= QUEUECAPACITY) + { + _damages.Dequeue(); + } + _damages.Enqueue(new DamageRec(DateTime.Now, damageRatio)); + } #endregion } diff --git a/RotationSolver/UI/RotationConfigWindow_Debug.cs b/RotationSolver/UI/RotationConfigWindow_Debug.cs index d5f95e802..3f78847d7 100644 --- a/RotationSolver/UI/RotationConfigWindow_Debug.cs +++ b/RotationSolver/UI/RotationConfigWindow_Debug.cs @@ -46,6 +46,7 @@ private unsafe void DrawStatus() ImGui.Text("Fate: " + DataCenter.FateId.ToString()); } ImGui.Text("TerritoryType: " + DataCenter.TerritoryContentType.ToString()); + ImGui.Text("DPSTaken: " + DataCenter.DPSTaken.ToString()); ImGui.Text("Have pet: " + DataCenter.HasPet.ToString()); ImGui.Text("Hostile Near Count: " + DataCenter.NumberOfHostilesInRange.ToString()); diff --git a/RotationSolver/Watcher.cs b/RotationSolver/Watcher.cs index 946e458c9..5b087ef17 100644 --- a/RotationSolver/Watcher.cs +++ b/RotationSolver/Watcher.cs @@ -49,6 +49,7 @@ private static unsafe void ReceiveAbilityEffect(uint sourceId, IntPtr sourceChar private static void ActionFromEnemy(uint sourceId, ActionEffectSet set) { + //Check Source. var source = Service.ObjectTable.SearchById(sourceId); if (source == null) return; if (source is not BattleChara battle) return; @@ -56,7 +57,18 @@ private static void ActionFromEnemy(uint sourceId, ActionEffectSet set) if (battle.SubKind == 9) return; //Friend! if (Service.ObjectTable.SearchById(battle.ObjectId) is PlayerCharacter) return; - ShowStrEnemy = set.ToString(); + var damageRatio = set.TargetEffects + .Where(e => e.Target == Service.Player) + .SelectMany(e => new ActionEffect[] + { + e[0], e[1], e[2], e[3], e[4], e[5], e[6], e[7] + }) + .Where(e => e.Type == ActionEffectType.Damage) + .Sum(e => (float)e.Value / Service.Player.MaxHp); + + DataCenter.AddDamageRec(damageRatio); + + ShowStrEnemy = $"Damage Ratio: {damageRatio}\n{set}"; } private static void ActionFromSelf(uint sourceId, ActionEffectSet set)