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.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.GameInteropProvider!.InitializeFromAttributes(this);
@ -114,7 +115,8 @@ public class Plugin : IDalamudPlugin {
public void Dispose() {
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.Ui.Dispose();
this.Client.Dispose();
@ -393,7 +395,6 @@ public class Plugin : IDalamudPlugin {
names.Sort((a, b) => a.PartyListIndex.CompareTo(b.PartyListIndex));
for (var i = 0; i < names.Count; i++) {
var info = names[i];
Plugin.Log.Info($"{info.Name} at {info.PartyListIndex}");
var lookupName = info.Name == playerName
? "YOU"
: info.Name;
@ -522,56 +523,67 @@ public class Plugin : IDalamudPlugin {
}
private unsafe void ResetMembers(AddonPartyList* list) {
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)";
foreach (var member in list->PartyMembers) {
if (member.TargetGlow != null) {
member.TargetGlow->SetWidth(320);
}
}
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);
if (list->Chocobo.TargetGlow != null) {
list->Chocobo.TargetGlow->SetWidth(220);
}
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) {
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();
if (group == null) {
return [];
return names.ToArray();
}
var length = group->PartyMembers.Length;
if (alliance) {
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;
foreach (var member in group->PartyMembers) {
names.Add(member.NameString);
}
if (alliance) {
for (var j = 0; j < group->AllianceMembers.Length; j++) {
var member = group->AllianceMembers[j];
members[i + j] = member.NameString;
foreach (var member in group->AllianceMembers) {
names.Add(member.NameString);
}
}
return members;
return names.ToArray();
}
private unsafe void UpdateMember(
@ -632,10 +644,15 @@ public class Plugin : IDalamudPlugin {
member.TargetGlow->PartId = 3;
// member.TargetGlow->SetWidth(320);
member.TargetGlow->SetWidth(
(ushort) Math.Round(320 * (denominator == 0
(ushort) Math.Clamp(
Math.Round(320 * (denominator == 0
? 1
: combatant.EncDps / denominator))
: combatant.EncDps / denominator)),
10,
320
)
);
member.TargetGlow->SetPositionShort(47, 21);
}
var inCombat = this.Condition[ConditionFlag.InCombat];
@ -670,6 +687,19 @@ public class Plugin : IDalamudPlugin {
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) {
var shouldAlternate = this.Config.AlternateJobs.Contains(classJob);
if (shouldAlternate) {