fix: check if encounter is active
This commit is contained in:
parent
528276c414
commit
09266c4e5f
@ -3,6 +3,7 @@ namespace PartyDamage;
|
||||
public class CombatData {
|
||||
public Encounter Encounter { get; }
|
||||
public Dictionary<string, Combatant> 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) {
|
||||
|
160
Plugin.cs
160
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<string>();
|
||||
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<string>();
|
||||
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);
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
@ -9,6 +9,9 @@ public class RawCombatData {
|
||||
|
||||
[JsonProperty("Combatant")]
|
||||
public Dictionary<string, RawCombatant> Combatants;
|
||||
|
||||
[JsonProperty("isActive")]
|
||||
public bool IsActive;
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
|
Loading…
Reference in New Issue
Block a user