fix: show dps for cross world

This commit is contained in:
Anna 2024-08-01 17:39:23 -04:00
parent 1f85158c68
commit 13c004dbb2
Signed by: anna
GPG Key ID: D0943384CD9F87D1

108
Plugin.cs
View File

@ -106,7 +106,8 @@ public class Plugin : IDalamudPlugin {
this.SaveConfig(); this.SaveConfig();
} }
this.AddonLifecycle!.RegisterListener(AddonEvent.PostUpdate, "_PartyList", this.UpdateList); this.AddonLifecycle!.RegisterListener(AddonEvent.PostRequestedUpdate, "_PartyList", this.UpdateList);
this.AddonLifecycle!.RegisterListener(AddonEvent.PreDraw, "_PartyList", this.UpdateList);
this.ContextMenu!.OnMenuOpened += this.MenuOpened; this.ContextMenu!.OnMenuOpened += this.MenuOpened;
this.GameInteropProvider!.InitializeFromAttributes(this); this.GameInteropProvider!.InitializeFromAttributes(this);
@ -114,7 +115,8 @@ public class Plugin : IDalamudPlugin {
public void Dispose() { public void Dispose() {
this.ContextMenu.OnMenuOpened -= this.MenuOpened; this.ContextMenu.OnMenuOpened -= this.MenuOpened;
this.AddonLifecycle.UnregisterListener(AddonEvent.PostUpdate, "_PartyList", this.UpdateList); this.AddonLifecycle.UnregisterListener(AddonEvent.PreDraw, "_PartyList", this.UpdateList);
this.AddonLifecycle.UnregisterListener(AddonEvent.PostRequestedUpdate, "_PartyList", this.UpdateList);
this.Commands.Dispose(); this.Commands.Dispose();
this.Ui.Dispose(); this.Ui.Dispose();
this.Client.Dispose(); this.Client.Dispose();
@ -393,7 +395,6 @@ public class Plugin : IDalamudPlugin {
names.Sort((a, b) => a.PartyListIndex.CompareTo(b.PartyListIndex)); names.Sort((a, b) => a.PartyListIndex.CompareTo(b.PartyListIndex));
for (var i = 0; i < names.Count; i++) { for (var i = 0; i < names.Count; i++) {
var info = names[i]; var info = names[i];
Plugin.Log.Info($"{info.Name} at {info.PartyListIndex}");
var lookupName = info.Name == playerName var lookupName = info.Name == playerName
? "YOU" ? "YOU"
: info.Name; : info.Name;
@ -522,56 +523,67 @@ public class Plugin : IDalamudPlugin {
} }
private unsafe void ResetMembers(AddonPartyList* list) { private unsafe void ResetMembers(AddonPartyList* list) {
var members = AgentHUD.Instance()->PartyMembers; foreach (var member in list->PartyMembers) {
for (var i = 0; i < members.Length && i < list->PartyMembers.Length; i++) { if (member.TargetGlow != null) {
var member = members[i]; member.TargetGlow->SetWidth(320);
var name = MemoryHelper.ReadStringNullTerminated((nint) member.Name); }
var isChocobo = member.Object != null
&& this.ClientState.LocalPlayer is { } player
&& member.Object->GetObjectKind() == ObjectKind.BattleNpc
&& member.Object->CompanionOwnerId == player.GameObjectId;
if (isChocobo) {
name += " (YOU)";
} }
var info = new ListInfo { if (list->Chocobo.TargetGlow != null) {
Name = name, list->Chocobo.TargetGlow->SetWidth(220);
IsChocobo = isChocobo,
Mana = member.Object != null ? member.Object->Mana : null,
PartyListIndex = i,
ClassJob = member.Object != null ? member.Object->ClassJob : null,
};
this.ResetMember(list, info, true, false);
} }
list->OnRequestedUpdate(AtkStage.Instance()->GetNumberArrayData(), AtkStage.Instance()->GetStringArrayData());
// var members = AgentHUD.Instance()->PartyMembers;
// for (var i = 0; i < members.Length && i < list->PartyMembers.Length; i++) {
// var member = members[i];
// var name = MemoryHelper.ReadStringNullTerminated((nint) member.Name);
// var isChocobo = member.Object != null
// && this.ClientState.LocalPlayer is { } player
// && member.Object->GetObjectKind() == ObjectKind.BattleNpc
// && member.Object->CompanionOwnerId == player.GameObjectId;
// if (isChocobo) {
// name += " (YOU)";
// }
//
// var info = new ListInfo {
// Name = name,
// IsChocobo = isChocobo,
// Mana = member.Object != null ? member.Object->Mana : null,
// PartyListIndex = i,
// ClassJob = member.Object != null ? member.Object->ClassJob : null,
// };
//
// this.ResetMember(list, info, true, false);
// }
} }
private unsafe string[] GetPartyNames(bool alliance) { private unsafe string[] GetPartyNames(bool alliance) {
var names = new HashSet<string>();
var cross = InfoProxyCrossRealm.Instance();
if (cross->IsInCrossRealmParty != 0) {
var crossGroup = cross->CrossRealmGroups[cross->LocalPlayerGroupIndex];
foreach (var member in crossGroup.GroupMembers) {
names.Add(member.NameString);
}
}
var group = GroupManager.Instance()->GetGroup(); var group = GroupManager.Instance()->GetGroup();
if (group == null) { if (group == null) {
return []; return names.ToArray();
} }
var length = group->PartyMembers.Length; foreach (var member in group->PartyMembers) {
if (alliance) { names.Add(member.NameString);
length += group->AllianceMembers.Length;
}
var members = new string[length];
int i;
for (i = 0; i < group->PartyMembers.Length; i++) {
var member = group->PartyMembers[i];
members[i] = member.NameString;
} }
if (alliance) { if (alliance) {
for (var j = 0; j < group->AllianceMembers.Length; j++) { foreach (var member in group->AllianceMembers) {
var member = group->AllianceMembers[j]; names.Add(member.NameString);
members[i + j] = member.NameString;
} }
} }
return members; return names.ToArray();
} }
private unsafe void UpdateMember( private unsafe void UpdateMember(
@ -632,10 +644,15 @@ public class Plugin : IDalamudPlugin {
member.TargetGlow->PartId = 3; member.TargetGlow->PartId = 3;
// member.TargetGlow->SetWidth(320); // member.TargetGlow->SetWidth(320);
member.TargetGlow->SetWidth( member.TargetGlow->SetWidth(
(ushort) Math.Round(320 * (denominator == 0 (ushort) Math.Clamp(
Math.Round(320 * (denominator == 0
? 1 ? 1
: combatant.EncDps / denominator)) : combatant.EncDps / denominator)),
10,
320
)
); );
member.TargetGlow->SetPositionShort(47, 21);
} }
var inCombat = this.Condition[ConditionFlag.InCombat]; var inCombat = this.Condition[ConditionFlag.InCombat];
@ -670,6 +687,19 @@ public class Plugin : IDalamudPlugin {
return; return;
} }
if (!left->ParentNode->IsVisible() && !info.IsChocobo && InfoProxyCrossRealm.Instance()->IsInCrossRealmParty != 0) {
var gauge = left->ParentNode;
gauge->ToggleVisibility(true);
for (var sibling = left->NextSiblingNode; sibling != null; sibling = sibling->NextSiblingNode) {
if (sibling->NodeId is not (6 or 7)) {
continue;
}
sibling->ToggleVisibility(false);
}
}
if (this.Config.Alternate && (!this.Config.OnlyAlternateInCombat || inCombat) && !this._showDps && info.ClassJob is { } classJob) { if (this.Config.Alternate && (!this.Config.OnlyAlternateInCombat || inCombat) && !this._showDps && info.ClassJob is { } classJob) {
var shouldAlternate = this.Config.AlternateJobs.Contains(classJob); var shouldAlternate = this.Config.AlternateJobs.Contains(classJob);
if (shouldAlternate) { if (shouldAlternate) {