fix: handle cross-world correctly again

This commit is contained in:
Anna 2024-08-08 17:52:22 -04:00
parent 5e4e443e4f
commit 542c05524b
Signed by: anna
GPG Key ID: D0943384CD9F87D1

View File

@ -348,6 +348,7 @@ public class Plugin : IDalamudPlugin {
Mana = member.Object != null ? member.Object->Mana : null,
PartyListIndex = i,
ClassJob = member.Object != null ? member.Object->ClassJob : null,
IsFullMember = member.Object != null,
};
names.Add(info);
@ -357,6 +358,11 @@ public class Plugin : IDalamudPlugin {
var crossInfo = InfoProxyCrossRealm.Instance();
if (crossInfo->IsInCrossRealmParty != 0) {
var crossGroup = crossInfo->CrossRealmGroups[crossInfo->LocalPlayerGroupIndex];
var fullMembers = AgentHUD.Instance()->PartyMembers;
var fullMemberIds = new uint[fullMembers.Length];
for (var i = 0; i < fullMembers.Length; i++) {
fullMemberIds[i] = fullMembers[i].EntityId;
}
for (var i = 0; i < crossGroup.GroupMemberCount && i < list->PartyMembers.Length; i++) {
var member = crossGroup.GroupMembers[i];
@ -380,6 +386,7 @@ public class Plugin : IDalamudPlugin {
Mana = null,
PartyListIndex = member.MemberIndex,
ClassJob = member.ClassJobId,
IsFullMember = Array.IndexOf(fullMemberIds, member.EntityId) != -1,
};
names.Add(info);
@ -410,7 +417,7 @@ public class Plugin : IDalamudPlugin {
return false;
}
private unsafe (Pointer<AtkTextNode>, Pointer<AtkTextNode>) GetTextNodes(AddonPartyList.PartyListMemberStruct unit) {
private static unsafe (Pointer<AtkTextNode>, Pointer<AtkTextNode>) GetTextNodes(AddonPartyList.PartyListMemberStruct unit) {
if (unit.MPGaugeBar == null) {
return (null, null);
}
@ -427,8 +434,8 @@ public class Plugin : IDalamudPlugin {
);
}
private unsafe void ResetTextColour(AddonPartyList.PartyListMemberStruct unit) {
var (left, right) = this.GetTextNodes(unit);
private static unsafe void ResetTextColour(AddonPartyList.PartyListMemberStruct unit) {
var (left, right) = GetTextNodes(unit);
if (left.Value == null) {
return;
@ -458,26 +465,33 @@ public class Plugin : IDalamudPlugin {
right.Value->MultiplyBlue = left.Value->MultiplyBlue;
}
private unsafe void ResetManaText(AddonPartyList.PartyListMemberStruct unit, uint? mana) {
var (left, right) = this.GetTextNodes(unit);
private static unsafe void ResetManaText(AddonPartyList.PartyListMemberStruct unit, uint? mana) {
var (left, right) = GetTextNodes(unit);
if (left.Value == null) {
return;
}
var manaString = mana == null
? "???"
: mana.Value.ToString(CultureInfo.InvariantCulture);
if (right.Value != null) {
if (manaString.Length <= 1) {
if (mana == null) {
if (right.Value != null) {
left.Value->SetText("");
right.Value->SetText(manaString);
right.Value->SetText("???");
} else {
left.Value->SetText(manaString[..^2]);
right.Value->SetText(manaString[^2..]);
left.Value->SetText("???");
}
} else {
left.Value->SetText(manaString);
var manaString = mana.Value.ToString(CultureInfo.InvariantCulture);
if (right.Value != null) {
if (manaString.Length <= 1) {
left.Value->SetText("");
right.Value->SetText(manaString);
} else {
left.Value->SetText(manaString[..^2]);
right.Value->SetText(manaString[^2..]);
}
} else {
left.Value->SetText(manaString);
}
}
}
@ -521,8 +535,8 @@ public class Plugin : IDalamudPlugin {
}
}
this.ResetTextColour(unit);
this.ResetManaText(unit, info.Mana);
ResetTextColour(unit);
ResetManaText(unit, info.Mana);
}
private unsafe void ResetMembers(AddonPartyList* list) {
@ -531,7 +545,7 @@ public class Plugin : IDalamudPlugin {
member.TargetGlow->SetWidth(320);
}
this.ResetTextColour(member);
ResetTextColour(member);
}
if (list->Chocobo.TargetGlow != null) {
@ -669,7 +683,7 @@ public class Plugin : IDalamudPlugin {
var hasTimer = chocoboTimer != null && chocoboTimer->IsVisible();
var hasTimerIcon = chocoboTimerIcon != null && chocoboTimerIcon->IsVisible();
if (this.Config.Alternate && this.Config.AlternateChocobo && (!this.Config.OnlyAlternateInCombat || inCombat) && !this._showDps) {
if (this.Config is { Alternate: true, AlternateChocobo: true } && (!this.Config.OnlyAlternateInCombat || inCombat) && !this._showDps) {
this.ResetMember(list, info, false, false);
} else {
if (hasTimer) {
@ -686,15 +700,17 @@ public class Plugin : IDalamudPlugin {
if (this.Config.Mode == MeterMode.Mana && member.MPGaugeBar != null) {
var left = (AtkTextNode*) member.MPGaugeBar->GetTextNodeById(2);
var right = (AtkTextNode*) member.MPGaugeBar->GetTextNodeById(3);
var hasLeft = left != null && left->IsVisible();
var hasRight = right != null && right->IsVisible();
if (!hasLeft) {
if (left == null) {
return;
}
if (!left->ParentNode->IsVisible() && !info.IsChocobo && InfoProxyCrossRealm.Instance()->IsInCrossRealmParty != 0) {
if (info is { IsFullMember: false, IsChocobo: false } && InfoProxyCrossRealm.Instance()->IsInCrossRealmParty != 0) {
var gauge = left->ParentNode;
gauge->ToggleVisibility(true);
left->ToggleVisibility(true);
if (right != null) {
right->ToggleVisibility(true);
}
for (var sibling = left->NextSiblingNode; sibling != null; sibling = sibling->NextSiblingNode) {
if (sibling->NodeId is not (6 or 7)) {
@ -705,8 +721,14 @@ public class Plugin : IDalamudPlugin {
}
}
var hasLeft = left->IsVisible();
var hasRight = right != null && right->IsVisible();
if (!hasLeft) {
return;
}
if (this.Config.Alternate && (!this.Config.OnlyAlternateInCombat || inCombat) && !this._showDps && info.ClassJob is { } classJob) {
var shouldAlternate = this.Config.AlternateJobs.Contains(classJob);
var shouldAlternate = info.IsFullMember && this.Config.AlternateJobs.Contains(classJob);
if (shouldAlternate) {
this.ResetMember(list, info, false, false);
return;
@ -775,4 +797,5 @@ public class ListInfo {
public required int PartyListIndex { get; set; }
public required uint? Mana { get; init; }
public required byte? ClassJob { get; init; }
public required bool IsFullMember { get; init; }
}