fix: check if encounter is active

This commit is contained in:
Anna 2024-07-25 02:07:07 -04:00
parent 528276c414
commit 09266c4e5f
Signed by: anna
GPG Key ID: D0943384CD9F87D1
3 changed files with 61 additions and 107 deletions

View File

@ -3,6 +3,7 @@ namespace PartyDamage;
public class CombatData { public class CombatData {
public Encounter Encounter { get; } public Encounter Encounter { get; }
public Dictionary<string, Combatant> Combatants { get; } = []; public Dictionary<string, Combatant> Combatants { get; } = [];
public bool IsActive { get; }
public CombatData(RawCombatData raw) { public CombatData(RawCombatData raw) {
foreach (var (key, value) in raw.Combatants) { foreach (var (key, value) in raw.Combatants) {
@ -16,6 +17,8 @@ public class CombatData {
Title = raw.Encounter.Title, Title = raw.Encounter.Title,
EncDps = TryFloat(raw.Encounter.EncDps), EncDps = TryFloat(raw.Encounter.EncDps),
}; };
this.IsActive = raw.IsActive;
} }
private static float TryFloat(string input, float def = float.NaN) { private static float TryFloat(string input, float def = float.NaN) {

166
Plugin.cs
View File

@ -1,6 +1,5 @@
using System.Diagnostics; using System.Diagnostics;
using System.Globalization; using System.Globalization;
using System.Numerics;
using Dalamud.Game.Addon.Lifecycle; using Dalamud.Game.Addon.Lifecycle;
using Dalamud.Game.Addon.Lifecycle.AddonArgTypes; using Dalamud.Game.Addon.Lifecycle.AddonArgTypes;
using Dalamud.IoC; using Dalamud.IoC;
@ -8,14 +7,10 @@ using Dalamud.Memory;
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Character; 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.Graphics;
using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Client.UI.Agent; using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using FFXIVClientStructs.FFXIV.Client.UI.Info;
using FFXIVClientStructs.FFXIV.Component.GUI; using FFXIVClientStructs.FFXIV.Component.GUI;
using ImGuiNET;
namespace PartyDamage; namespace PartyDamage;
@ -40,91 +35,49 @@ public class Plugin : IDalamudPlugin {
private Client Client { get; } private Client Client { get; }
private Stopwatch Watch { get; } = Stopwatch.StartNew();
private bool _ranLastTick;
public Plugin() { public Plugin() {
this.Client = new Client(); this.Client = new Client();
this.AddonLifecycle!.RegisterListener(AddonEvent.PostUpdate, "_PartyList", this.UpdateList); this.AddonLifecycle!.RegisterListener(AddonEvent.PostUpdate, "_PartyList", this.UpdateList);
// this.Interface!.UiBuilder.Draw += this.Draw;
} }
public void Dispose() { public void Dispose() {
// this.Interface.UiBuilder.Draw -= this.Draw;
this.AddonLifecycle.UnregisterListener(AddonEvent.PostUpdate, "_PartyList", this.UpdateList); this.AddonLifecycle.UnregisterListener(AddonEvent.PostUpdate, "_PartyList", this.UpdateList);
this.Client.Dispose(); this.Client.Dispose();
} }
private unsafe void Draw() {
if (this.Client.Data is not { } data) {
return;
}
var names = new List<string>();
foreach (var member in AgentHUD.Instance()->PartyMembers) {
if (member.Name == null) {
continue;
}
var name = MemoryHelper.ReadStringNullTerminated((nint) member.Name);
names.Add(name);
}
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
);
}
}
private Stopwatch Watch { get; } = Stopwatch.StartNew();
private unsafe void UpdateList(AddonEvent type, AddonArgs args) { private unsafe void UpdateList(AddonEvent type, AddonArgs args) {
var ranLast = this._ranLastTick;
this._ranLastTick = false;
var list = (AddonPartyList*) AtkStage.Instance()->RaptureAtkUnitManager->GetAddonByName("_PartyList");
if (!this.UpdateListInner(list) && ranLast) {
this.ResetMembers(list);
}
}
private unsafe bool UpdateListInner(AddonPartyList* list) {
if (this.Client.Data is not { } data) { if (this.Client.Data is not { } data) {
return; return false;
}
if (!data.IsActive) {
return false;
} }
if (this.ClientState.LocalPlayer is not { } player) { if (this.ClientState.LocalPlayer is not { } player) {
return; return false;
} }
var chara = (Character*) player.Address; var chara = (Character*) player.Address;
var playerName = player.Name.TextValue; var playerName = player.Name.TextValue;
var list = (AddonPartyList*) AtkStage.Instance()->RaptureAtkUnitManager->GetAddonByName("_PartyList");
if (list->HoveredIndex >= 0 || list->TargetedIndex >= 0) { if (list->HoveredIndex >= 0 || list->TargetedIndex >= 0) {
return; return false;
} }
var names = new List<string>(); var names = new List<(string, int)>();
var members = AgentHUD.Instance()->PartyMembers; var members = AgentHUD.Instance()->PartyMembers;
for (var i = 0; i < members.Length && i < list->PartyMembers.Length; i++) { for (var i = 0; i < members.Length && i < list->PartyMembers.Length; i++) {
var member = members[i]; var member = members[i];
@ -134,15 +87,21 @@ public class Plugin : IDalamudPlugin {
// controller soft target not handled by hoveredindex above // controller soft target not handled by hoveredindex above
if (chara->GetSoftTargetId() == member.EntityId) { if (chara->GetSoftTargetId() == member.EntityId) {
return; return false;
} }
var name = MemoryHelper.ReadStringNullTerminated((nint) member.Name); 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 var lookupName = name == playerName
? "YOU" ? "YOU"
: name; : name;
var member = members[membersIdx];
if (!data.Combatants.TryGetValue(lookupName, out var combatant)) { if (!data.Combatants.TryGetValue(lookupName, out var combatant)) {
continue; continue;
@ -151,26 +110,37 @@ public class Plugin : IDalamudPlugin {
this.UpdateMember(list->PartyMembers[i], member.Object, data.Encounter, combatant); this.UpdateMember(list->PartyMembers[i], member.Object, data.Encounter, combatant);
} }
// var numPlayers = list->PartyMembers.Length; return true;
// 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;
// }
// }
// var idx = combatant.Name == "YOU" private unsafe void ResetMembers(AddonPartyList* list) {
// ? 0 var members = AgentHUD.Instance()->PartyMembers;
// : names.IndexOf(combatant.Name); for (var i = 0; i < members.Length && i < list->PartyMembers.Length; i++) {
// if (idx == -1 || idx >= numPlayers) { var member = members[i];
// continue; 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( private unsafe void UpdateMember(
@ -220,27 +190,5 @@ public class Plugin : IDalamudPlugin {
left->SetText($"{dps[..^1]}."); left->SetText($"{dps[..^1]}.");
right->SetText($"{dps[^1..]}K"); 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);
// }
} }
} }

View File

@ -9,6 +9,9 @@ public class RawCombatData {
[JsonProperty("Combatant")] [JsonProperty("Combatant")]
public Dictionary<string, RawCombatant> Combatants; public Dictionary<string, RawCombatant> Combatants;
[JsonProperty("isActive")]
public bool IsActive;
} }
[Serializable] [Serializable]