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 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
166
Plugin.cs
@ -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);
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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]
|
||||||
|
Loading…
Reference in New Issue
Block a user