From 09266c4e5fcf622c14c9540ac611511f62f6a8d9 Mon Sep 17 00:00:00 2001 From: Anna Date: Thu, 25 Jul 2024 02:07:07 -0400 Subject: [PATCH] fix: check if encounter is active --- CombatData.cs | 5 +- Plugin.cs | 160 ++++++++++++++++------------------------------- RawCombatData.cs | 3 + 3 files changed, 61 insertions(+), 107 deletions(-) diff --git a/CombatData.cs b/CombatData.cs index 812174c..be3626e 100644 --- a/CombatData.cs +++ b/CombatData.cs @@ -3,6 +3,7 @@ namespace PartyDamage; public class CombatData { public Encounter Encounter { get; } public Dictionary Combatants { get; } = []; + public bool IsActive { get; } public CombatData(RawCombatData raw) { foreach (var (key, value) in raw.Combatants) { @@ -16,6 +17,8 @@ public class CombatData { Title = raw.Encounter.Title, EncDps = TryFloat(raw.Encounter.EncDps), }; + + this.IsActive = raw.IsActive; } private static float TryFloat(string input, float def = float.NaN) { @@ -35,4 +38,4 @@ public class Encounter { public class Combatant { public string Name { get; init; } public float EncDps { get; init; } -} \ No newline at end of file +} diff --git a/Plugin.cs b/Plugin.cs index 8afc5f5..3e5b4c1 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -1,6 +1,5 @@ using System.Diagnostics; using System.Globalization; -using System.Numerics; using Dalamud.Game.Addon.Lifecycle; using Dalamud.Game.Addon.Lifecycle.AddonArgTypes; using Dalamud.IoC; @@ -8,14 +7,10 @@ using Dalamud.Memory; using Dalamud.Plugin; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game.Character; -using FFXIVClientStructs.FFXIV.Client.Game.Group; -using FFXIVClientStructs.FFXIV.Client.Game.UI; using FFXIVClientStructs.FFXIV.Client.Graphics; using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Client.UI.Agent; -using FFXIVClientStructs.FFXIV.Client.UI.Info; using FFXIVClientStructs.FFXIV.Component.GUI; -using ImGuiNET; namespace PartyDamage; @@ -40,91 +35,49 @@ public class Plugin : IDalamudPlugin { private Client Client { get; } + private Stopwatch Watch { get; } = Stopwatch.StartNew(); + private bool _ranLastTick; + public Plugin() { this.Client = new Client(); this.AddonLifecycle!.RegisterListener(AddonEvent.PostUpdate, "_PartyList", this.UpdateList); - // this.Interface!.UiBuilder.Draw += this.Draw; } public void Dispose() { - // this.Interface.UiBuilder.Draw -= this.Draw; this.AddonLifecycle.UnregisterListener(AddonEvent.PostUpdate, "_PartyList", this.UpdateList); this.Client.Dispose(); } - private unsafe void Draw() { - if (this.Client.Data is not { } data) { - return; - } - - var names = new List(); - foreach (var member in AgentHUD.Instance()->PartyMembers) { - if (member.Name == null) { - continue; - } - - var name = MemoryHelper.ReadStringNullTerminated((nint) member.Name); - names.Add(name); - } - + private unsafe void UpdateList(AddonEvent type, AddonArgs args) { + var ranLast = this._ranLastTick; + this._ranLastTick = false; var list = (AddonPartyList*) AtkStage.Instance()->RaptureAtkUnitManager->GetAddonByName("_PartyList"); - foreach (var combatant in data.Combatants.Values) { - var idx = combatant.Name == "YOU" - ? 0 - : names.IndexOf(combatant.Name); - if (idx == -1) { - continue; - } - - var dpsText = combatant.EncDps switch { - float.NaN => "?", - float.PositiveInfinity => "0", - float.NegativeInfinity => "0", - < 1_000 => combatant.EncDps.ToString("N1"), - < 1_000_000 => $"{combatant.EncDps / 1_000:N1}K", - < 1_000_000_000 => $"{combatant.EncDps / 1_000_000:N1}M", - _ => combatant.EncDps.ToString("N1"), - }; - - var gauge = list->PartyMembers[idx].MPGaugeBar->OwnerNode; - var pos = new Vector2( - gauge->ScreenX + gauge->Width, - gauge->ScreenY + gauge->Height / 2f + 8 - ); - var size = ImGui.CalcTextSize(dpsText); - ImGui.GetBackgroundDrawList().AddRectFilled( - pos - Vector2.One * 2, - pos + size + Vector2.One * 2, - 0xFF000000 - ); - ImGui.GetBackgroundDrawList().AddText( - pos, - 0xFFFFFFFF, - dpsText - ); + if (!this.UpdateListInner(list) && ranLast) { + this.ResetMembers(list); } } - private Stopwatch Watch { get; } = Stopwatch.StartNew(); - - private unsafe void UpdateList(AddonEvent type, AddonArgs args) { + private unsafe bool UpdateListInner(AddonPartyList* list) { if (this.Client.Data is not { } data) { - return; + return false; + } + + if (!data.IsActive) { + return false; } if (this.ClientState.LocalPlayer is not { } player) { - return; + return false; } var chara = (Character*) player.Address; var playerName = player.Name.TextValue; - var list = (AddonPartyList*) AtkStage.Instance()->RaptureAtkUnitManager->GetAddonByName("_PartyList"); if (list->HoveredIndex >= 0 || list->TargetedIndex >= 0) { - return; + return false; } - var names = new List(); + var names = new List<(string, int)>(); var members = AgentHUD.Instance()->PartyMembers; for (var i = 0; i < members.Length && i < list->PartyMembers.Length; i++) { var member = members[i]; @@ -134,15 +87,21 @@ public class Plugin : IDalamudPlugin { // controller soft target not handled by hoveredindex above if (chara->GetSoftTargetId() == member.EntityId) { - return; + return false; } var name = MemoryHelper.ReadStringNullTerminated((nint) member.Name); - names.Add(name); + names.Add((name, i)); + } + this._ranLastTick = true; + + for (var i = 0; i < names.Count; i++) { + var (name, membersIdx) = names[i]; var lookupName = name == playerName ? "YOU" : name; + var member = members[membersIdx]; if (!data.Combatants.TryGetValue(lookupName, out var combatant)) { continue; @@ -151,26 +110,37 @@ public class Plugin : IDalamudPlugin { this.UpdateMember(list->PartyMembers[i], member.Object, data.Encounter, combatant); } - // var numPlayers = list->PartyMembers.Length; - // foreach (var combatant in data.Combatants.Values) { - // if (combatant.Name.EndsWith(" (YOU)")) { - // var name = combatant.Name[..^6]; - // var chocoboName = UIState.Instance()->Buddy.CompanionInfo.NameString; - // if (chocoboName == name) { - // this.UpdateMember(list->Chocobo, data.Encounter, combatant); - // continue; - // } - // } + return true; + } - // var idx = combatant.Name == "YOU" - // ? 0 - // : names.IndexOf(combatant.Name); - // if (idx == -1 || idx >= numPlayers) { - // continue; - // } + private unsafe void ResetMembers(AddonPartyList* list) { + var members = AgentHUD.Instance()->PartyMembers; + for (var i = 0; i < members.Length && i < list->PartyMembers.Length; i++) { + var member = members[i]; + if (member.Name == null) { + continue; + } - // this.UpdateMember(list->PartyMembers[idx], data.Encounter, combatant); - // } + var unit = list->PartyMembers[i]; + if (list->TargetedIndex != i) { + unit.TargetGlow->SetAlpha(255); + unit.TargetGlow->SetScaleX(0); + unit.TargetGlow->ToggleVisibility(true); + } + + var left = (AtkTextNode*) unit.MPGaugeBar->GetTextNodeById(2); + var right = (AtkTextNode*) unit.MPGaugeBar->GetTextNodeById(3); + + left->TextColor = new ByteColor { + RGBA = 0xFFFFFFFF, + }; + right->TextColor = left->TextColor; + + + var manaString = member.Object->Mana.ToString(CultureInfo.InvariantCulture); + left->SetText(manaString[..^2]); + right->SetText(manaString[^2..]); + } } private unsafe void UpdateMember( @@ -220,27 +190,5 @@ public class Plugin : IDalamudPlugin { left->SetText($"{dps[..^1]}."); right->SetText($"{dps[^1..]}K"); } - - // var dpsText = combatant.EncDps switch { - // float.NaN => "?", - // float.PositiveInfinity => "0", - // float.NegativeInfinity => "0", - // < 1_000 => combatant.EncDps.ToString("N1"), - // < 1_000_000 => $"{combatant.EncDps / 1_000:N1}K", - // < 1_000_000_000 => $"{combatant.EncDps / 1_000_000:N1}M", - // _ => combatant.EncDps.ToString("N1"), - // }; - - // if (!member.CastingProgressBar->IsVisible()) { - // member.CastingActionName->ToggleVisibility(true); - // member.CastingActionName->SetText(dpsText); - // float x, y; - // member.CastingActionName->GetPositionFloat(&x, &y); - // member.CastingActionName->SetPositionFloat(200, 32); - // member.CastingActionName->AlignmentType = AlignmentType.Left; - // } else { - // member.CastingActionName->AlignmentType = AlignmentType.Right; - // member.CastingActionName->SetPositionFloat(0, 10); - // } } } diff --git a/RawCombatData.cs b/RawCombatData.cs index ba7038b..b0fb905 100644 --- a/RawCombatData.cs +++ b/RawCombatData.cs @@ -9,6 +9,9 @@ public class RawCombatData { [JsonProperty("Combatant")] public Dictionary Combatants; + + [JsonProperty("isActive")] + public bool IsActive; } [Serializable]