v1.0.8.6: Fix crafting action tooltips - use CraftAction.Description instead of ActionTransient

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-08 00:47:35 -05:00
parent cb3d6b5e0b
commit 01426d3c30
4 changed files with 106 additions and 32 deletions
+99 -28
View File
@@ -1196,21 +1196,63 @@ namespace HSUI.Interface.GeneralElements
LuminaAction? actionRow = null;
var actionSheet = Plugin.DataManager.GetExcelSheet<LuminaAction>();
var actionRowOpt = actionSheet?.GetRow(slot.ActionId);
if (actionRowOpt.HasValue)
if (actionSheet != null)
{
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)
if (actionSheet.TryGetRow(slot.ActionId, out var actionRowOpt))
{
actionIdForLookup = mappedId;
actionRow = mappedRow.Value;
actionRow = actionRowOpt;
}
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;
if (actionSheet.TryGetRow(mappedId, out var mappedRow))
{
actionIdForLookup = mappedId;
actionRow = mappedRow;
}
}
}
// CraftAction fallback: when Action sheet lookup failed, try CraftAction sheet directly (hotbar stores CraftAction row ID).
if (!actionRow.HasValue && slot.SlotType == RaptureHotbarModule.HotbarSlotType.CraftAction)
{
var craftSheet = Plugin.DataManager.GetExcelSheet<Lumina.Excel.Sheets.CraftAction>();
if (craftSheet != null && craftSheet.TryGetRow(slot.ActionId, out var craftRow))
{
try
{
var nameSe = craftRow.Name;
string name = nameSe.ToString();
if (string.IsNullOrWhiteSpace(name))
name = nameSe.ToDalamudString().ToString();
if (!string.IsNullOrWhiteSpace(name))
{
// CraftAction sheet has its own Description column with the full text
string desc = "";
try
{
var descSe = craftRow.Description;
var descRaw = descSe.ToDalamudString().ToString();
if (!string.IsNullOrEmpty(descRaw))
{
try
{
var evaluated = Plugin.SeStringEvaluator.Evaluate(descSe.AsSpan());
desc = evaluated.ExtractText();
if (string.IsNullOrEmpty(desc)) desc = descRaw;
}
catch { desc = descRaw; }
if (!string.IsNullOrEmpty(desc))
desc = EncryptedStringsHelper.GetString(desc);
}
}
catch { /* ignore */ }
return (name, desc);
}
}
catch { /* ignore */ }
}
}
@@ -1219,28 +1261,57 @@ namespace HSUI.Interface.GeneralElements
{
string name = row.Value.Name.ToString();
string desc = "";
var descRow = Plugin.DataManager.GetExcelSheet<ActionTransient>()?.GetRow(actionIdForLookup);
string descRaw = "";
if (descRow.HasValue)
// For CraftAction, use CraftAction.Description; ActionTransient returns the name instead of the full description
if (slot.SlotType == RaptureHotbarModule.HotbarSlotType.CraftAction)
{
try
var craftSheet = Plugin.DataManager.GetExcelSheet<Lumina.Excel.Sheets.CraftAction>();
if (craftSheet != null && craftSheet.TryGetRow(actionIdForLookup, out var craftRow))
{
var descSeStr = descRow.Value.Description;
descRaw = descRow.Value.Description.ToDalamudString().ToString();
try
{
var evaluated = Plugin.SeStringEvaluator.Evaluate(descSeStr.AsSpan());
desc = evaluated.ExtractText();
if (string.IsNullOrEmpty(desc)) desc = descRaw;
var descSe = craftRow.Description;
var craftDescRaw = descSe.ToDalamudString().ToString();
if (!string.IsNullOrEmpty(craftDescRaw))
{
try
{
var evaluated = Plugin.SeStringEvaluator.Evaluate(descSe.AsSpan());
desc = evaluated.ExtractText();
if (string.IsNullOrEmpty(desc)) desc = craftDescRaw;
}
catch { desc = craftDescRaw; }
if (!string.IsNullOrEmpty(desc))
desc = EncryptedStringsHelper.GetString(desc);
}
}
catch
{
desc = descRaw;
}
if (!string.IsNullOrEmpty(desc))
desc = EncryptedStringsHelper.GetString(desc);
catch { /* ignore */ }
}
}
else
{
var descSheet = Plugin.DataManager.GetExcelSheet<ActionTransient>();
if (descSheet != null && descSheet.TryGetRow(actionIdForLookup, out var descRow))
{
try
{
var descSeStr = descRow.Description;
descRaw = descRow.Description.ToDalamudString().ToString();
try
{
var evaluated = Plugin.SeStringEvaluator.Evaluate(descSeStr.AsSpan());
desc = evaluated.ExtractText();
if (string.IsNullOrEmpty(desc)) desc = descRaw;
}
catch
{
desc = descRaw;
}
if (!string.IsNullOrEmpty(desc))
desc = EncryptedStringsHelper.GetString(desc);
}
catch { /* ignore */ }
}
catch { /* ignore */ }
}
bool isCombatAction = IsCombatAction(slot.SlotType, row.Value);
int? potencyValue = isCombatAction ? TryGetPotencyValue(row.Value) : null;