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) { var idx = combatant.Name == "YOU" ? 0 : names.IndexOf(combatant.Name); if (idx == -1 || idx >= numPlayers) { continue; } if (!float.TryParse(combatant.EncDps, out var dps)) { dps = 0; } var dpsText = dps switch { float.PositiveInfinity => "0", float.NegativeInfinity => "0", < 1_000 => dps.ToString("N1"), < 1_000_000 => $"{dps / 1_000:N1}K", _ => $"{dps / 1_000_000:N1}M", }; list->PartyMembers[idx].Name->SetText(dpsText); } } }