Alliance frames, crafting tooltips, visibility: fix display and tooltips
- Alliance Frames: Populate other alliances (A/B) via GetAllianceMemberByIndex flat indices (0-7, 8-15) instead of GetAllianceMemberByGroupAndIndex which returns empty in-instance; keep own party from GetPartyMemberByIndex. - Alliance Frames: Visibility: do not apply HideInDuty to Alliance Frames so they show in alliance raids when visibility rules are enabled. - Hotbars: Crafting action tooltips: fallback Action sheet lookup with +100000 offset when hotbar stores CraftAction row ID. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -1194,12 +1194,34 @@ namespace HSUI.Interface.GeneralElements
|
|||||||
slot.SlotType == RaptureHotbarModule.HotbarSlotType.CraftAction ||
|
slot.SlotType == RaptureHotbarModule.HotbarSlotType.CraftAction ||
|
||||||
slot.SlotType == RaptureHotbarModule.HotbarSlotType.PetAction)
|
slot.SlotType == RaptureHotbarModule.HotbarSlotType.PetAction)
|
||||||
{
|
{
|
||||||
var row = Plugin.DataManager.GetExcelSheet<LuminaAction>()?.GetRow(slot.ActionId);
|
uint actionIdForLookup = slot.ActionId;
|
||||||
|
LuminaAction? actionRow = null;
|
||||||
|
|
||||||
|
var actionSheet = Plugin.DataManager.GetExcelSheet<LuminaAction>();
|
||||||
|
var actionRowOpt = actionSheet?.GetRow(slot.ActionId);
|
||||||
|
if (actionRowOpt.HasValue)
|
||||||
|
{
|
||||||
|
actionRow = actionRowOpt.Value;
|
||||||
|
}
|
||||||
|
else if (slot.SlotType == RaptureHotbarModule.HotbarSlotType.CraftAction)
|
||||||
|
{
|
||||||
|
// Crafting actions: hotbar may store CraftAction sheet row ID (1-based). Action sheet uses 100000+ range (100001 = Basic Synthesis).
|
||||||
|
const uint CraftActionToActionOffset = 100000;
|
||||||
|
uint mappedId = slot.ActionId + CraftActionToActionOffset;
|
||||||
|
var mappedRow = actionSheet?.GetRow(mappedId);
|
||||||
|
if (mappedRow.HasValue)
|
||||||
|
{
|
||||||
|
actionIdForLookup = mappedId;
|
||||||
|
actionRow = mappedRow.Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var row = actionRow;
|
||||||
if (row.HasValue)
|
if (row.HasValue)
|
||||||
{
|
{
|
||||||
string name = row.Value.Name.ToString();
|
string name = row.Value.Name.ToString();
|
||||||
string desc = "";
|
string desc = "";
|
||||||
var descRow = Plugin.DataManager.GetExcelSheet<ActionTransient>()?.GetRow(slot.ActionId);
|
var descRow = Plugin.DataManager.GetExcelSheet<ActionTransient>()?.GetRow(actionIdForLookup);
|
||||||
string descRaw = "";
|
string descRaw = "";
|
||||||
if (descRow.HasValue)
|
if (descRow.HasValue)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -96,6 +96,9 @@ namespace HSUI.Interface
|
|||||||
if (element != null && element.GetType() == typeof(PlayerCastbarHud)) { return true; }
|
if (element != null && element.GetType() == typeof(PlayerCastbarHud)) { return true; }
|
||||||
if (element != null && !element.GetConfig().Enabled) { return false; }
|
if (element != null && !element.GetConfig().Enabled) { return false; }
|
||||||
|
|
||||||
|
// Alliance frames only matter in alliance raids (duty). HideInDuty would hide them exactly when needed.
|
||||||
|
bool isAllianceFrames = element != null && element.GetType() == typeof(AllianceFramesHud);
|
||||||
|
|
||||||
bool isInIslandSanctuary = IsInIslandSanctuary();
|
bool isInIslandSanctuary = IsInIslandSanctuary();
|
||||||
bool isInDuty = IsInDuty() && !isInIslandSanctuary;
|
bool isInDuty = IsInDuty() && !isInIslandSanctuary;
|
||||||
IPlayerCharacter? player = Plugin.ObjectTable.LocalPlayer;
|
IPlayerCharacter? player = Plugin.ObjectTable.LocalPlayer;
|
||||||
@@ -127,7 +130,8 @@ namespace HSUI.Interface
|
|||||||
|
|
||||||
if (HideOnFullHP && player != null && player.CurrentHp == player.MaxHp) { return false; }
|
if (HideOnFullHP && player != null && player.CurrentHp == player.MaxHp) { return false; }
|
||||||
|
|
||||||
if (HideInDuty && isInDuty) { return false; }
|
// Alliance frames only matter in alliance raids (duty). Skip HideInDuty for them.
|
||||||
|
if (HideInDuty && isInDuty && !isAllianceFrames) { return false; }
|
||||||
|
|
||||||
if (HideInIslandSanctuary && isInIslandSanctuary) { return false; }
|
if (HideInIslandSanctuary && isInIslandSanctuary) { return false; }
|
||||||
|
|
||||||
|
|||||||
@@ -280,14 +280,21 @@ namespace HSUI.Interface.Party
|
|||||||
bool anyChanged = false;
|
bool anyChanged = false;
|
||||||
ref var mainGroup = ref gm->MainGroup;
|
ref var mainGroup = ref gm->MainGroup;
|
||||||
|
|
||||||
|
// GroupManager layout: _allianceMembers flat array (indices 0-19) has groups 0 and 1.
|
||||||
|
// Group 2 (our party) is stored in _partyMembers. GetAllianceMemberByGroupAndIndex(0/1, slot)
|
||||||
|
// returns empty in-instance for some game versions; use GetAllianceMemberByIndex with flat
|
||||||
|
// indices: group 0 = indices 0-7, group 1 = indices 8-15.
|
||||||
for (int allianceIdx = 0; allianceIdx < 3; allianceIdx++)
|
for (int allianceIdx = 0; allianceIdx < 3; allianceIdx++)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
var list = new List<IPartyFramesMember>();
|
var list = new List<IPartyFramesMember>();
|
||||||
|
|
||||||
|
if (allianceIdx == 2)
|
||||||
|
{
|
||||||
|
// Our party: _partyMembers via GetPartyMemberByIndex
|
||||||
for (int slot = 0; slot < 8; slot++)
|
for (int slot = 0; slot < 8; slot++)
|
||||||
{
|
{
|
||||||
var pm = mainGroup.GetAllianceMemberByGroupAndIndex(allianceIdx, slot);
|
var pm = mainGroup.GetPartyMemberByIndex(slot);
|
||||||
if (pm == null || pm->EntityId == 0) continue;
|
if (pm == null || pm->EntityId == 0) continue;
|
||||||
var pfMember = new PartyFramesMember(
|
var pfMember = new PartyFramesMember(
|
||||||
pm->EntityId,
|
pm->EntityId,
|
||||||
@@ -303,14 +310,14 @@ namespace HSUI.Interface.Party
|
|||||||
list.Add(pfMember);
|
list.Add(pfMember);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// GroupManager stores our party in _partyMembers, not GetAllianceMemberByGroupAndIndex.
|
else
|
||||||
// When group 2 is empty, it's our alliance—populate from GetPartyMemberByIndex.
|
|
||||||
if (count == 0 && allianceIdx == 2)
|
|
||||||
{
|
{
|
||||||
|
// Other alliances: _allianceMembers flat indices. Group 0 = 0-7, group 1 = 8-15.
|
||||||
|
int baseIdx = allianceIdx * 8;
|
||||||
for (int slot = 0; slot < 8; slot++)
|
for (int slot = 0; slot < 8; slot++)
|
||||||
{
|
{
|
||||||
var pm = mainGroup.GetPartyMemberByIndex(slot);
|
var pm = mainGroup.GetAllianceMemberByIndex(baseIdx + slot);
|
||||||
if (pm == null || pm->EntityId == 0) continue;
|
if (pm == null || pm->EntityId == 0) continue;
|
||||||
var pfMember = new PartyFramesMember(
|
var pfMember = new PartyFramesMember(
|
||||||
pm->EntityId,
|
pm->EntityId,
|
||||||
@@ -340,9 +347,11 @@ namespace HSUI.Interface.Party
|
|||||||
int ourIdx = 0;
|
int ourIdx = 0;
|
||||||
for (int slot = 0; slot < 8 && ourIdx < _allianceMembers[allianceIdx].Count; slot++)
|
for (int slot = 0; slot < 8 && ourIdx < _allianceMembers[allianceIdx].Count; slot++)
|
||||||
{
|
{
|
||||||
PartyMember* pm = allianceIdx == 2
|
PartyMember* pm;
|
||||||
? mainGroup.GetPartyMemberByIndex(slot)
|
if (allianceIdx == 2)
|
||||||
: mainGroup.GetAllianceMemberByGroupAndIndex(allianceIdx, slot);
|
pm = mainGroup.GetPartyMemberByIndex(slot);
|
||||||
|
else
|
||||||
|
pm = mainGroup.GetAllianceMemberByIndex(allianceIdx * 8 + slot);
|
||||||
if (pm == null || pm->EntityId == 0) continue;
|
if (pm == null || pm->EntityId == 0) continue;
|
||||||
if (_allianceMembers[allianceIdx][ourIdx] is PartyFramesMember pfMember)
|
if (_allianceMembers[allianceIdx][ourIdx] is PartyFramesMember pfMember)
|
||||||
pfMember.Update(EnmityLevel.Last, PartyMemberStatus.None, ReadyCheckStatus.None, false, pm->ClassJob);
|
pfMember.Update(EnmityLevel.Last, PartyMemberStatus.None, ReadyCheckStatus.None, false, pm->ClassJob);
|
||||||
|
|||||||
Reference in New Issue
Block a user