using Dalamud.IoC; using Dalamud.Plugin; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game.Group; using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Component.GUI; namespace PartyDamage; public class Plugin : IDalamudPlugin { [PluginService] internal static IPluginLog Log { get; private set; } [PluginService] private IClientState ClientState { get; init; } [PluginService] private IFramework Framework { get; init; } private Client Client { get; } public Plugin() { this.Client = new Client(); this.Framework!.Update += this.OnFramework; } public void Dispose() { this.Framework!.Update -= this.OnFramework; this.Client.Dispose(); } 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(); 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) { 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; } } var idx = combatant.Name == "YOU" ? 0 : names.IndexOf(combatant.Name); if (idx == -1 || idx >= numPlayers) { continue; } this.UpdateMember(list->PartyMembers[idx], combatant); } } 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); } }