PartyDamage/Plugin.cs

89 lines
2.7 KiB
C#
Raw Normal View History

2024-07-24 20:30:12 +00:00
using Dalamud.IoC;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
2024-07-24 21:48:24 +00:00
using FFXIVClientStructs.FFXIV.Client.Game.Group;
using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Component.GUI;
2024-07-24 20:30:12 +00:00
namespace PartyDamage;
public class Plugin : IDalamudPlugin {
[PluginService]
internal static IPluginLog Log { get; private set; }
2024-07-24 21:48:24 +00:00
[PluginService]
private IClientState ClientState { get; init; }
[PluginService]
private IFramework Framework { get; init; }
2024-07-24 20:30:12 +00:00
private Client Client { get; }
public Plugin() {
this.Client = new Client();
2024-07-24 21:48:24 +00:00
this.Framework!.Update += this.OnFramework;
2024-07-24 20:30:12 +00:00
}
public void Dispose() {
2024-07-24 21:48:24 +00:00
this.Framework!.Update -= this.OnFramework;
2024-07-24 20:30:12 +00:00
this.Client.Dispose();
}
2024-07-24 21:48:24 +00:00
private unsafe void OnFramework(IFramework framework) {
if (this.Client.Data is not { } data) {
return;
}
if (this.ClientState.LocalPlayer is not { } player) {
return;
}
var list = (AddonPartyList*) AtkStage.Instance()->RaptureAtkUnitManager->GetAddonByName("_PartyList");
var names = new List<string>();
var group = GroupManager.Instance()->GetGroup();
if (group == null) {
Plugin.Log.Info("group null");
}
for (var i = 0; i < group->MemberCount; i++) {
names.Add(group->PartyMembers[i].NameString);
}
var numPlayers = list->PartyMembers.Length;
foreach (var combatant in data.Combatants.Values) {
2024-07-24 22:04:52 +00:00
if (combatant.Name.EndsWith(" (YOU)")) {
var name = combatant.Name[..^6];
var nameNode = list->Pet.Name;
if (nameNode != null && nameNode->NodeText.ToString() == name) {
this.UpdateMember(list->Pet, combatant);
continue;
}
}
2024-07-24 21:48:24 +00:00
var idx = combatant.Name == "YOU"
? 0
: names.IndexOf(combatant.Name);
if (idx == -1 || idx >= numPlayers) {
continue;
}
2024-07-24 22:04:52 +00:00
this.UpdateMember(list->PartyMembers[idx], combatant);
2024-07-24 21:48:24 +00:00
}
}
2024-07-24 22:04:52 +00:00
private unsafe void UpdateMember(AddonPartyList.PartyListMemberStruct member, Combatant combatant) {
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"),
};
member.Name->SetText(dpsText);
}
2024-07-24 20:30:12 +00:00
}