Fix some context menu things.

This commit is contained in:
Ottermandias 2024-11-24 12:18:04 +01:00
parent 40a684ff46
commit 22c7e32760

View file

@ -11,27 +11,24 @@ namespace Glamourer.Interop;
public class ContextMenuService : IDisposable public class ContextMenuService : IDisposable
{ {
public const int ItemSearchContextItemId = 0x1738; public const int ChatLogContextItemId = 0x958;
public const int ChatLogContextItemId = 0x950;
private readonly ItemManager _items; private readonly ItemManager _items;
private readonly IContextMenu _contextMenu; private readonly IContextMenu _contextMenu;
private readonly StateManager _state; private readonly StateManager _state;
private readonly ObjectManager _objects; private readonly ObjectManager _objects;
private readonly IGameGui _gameGui;
private EquipItem _lastItem; private EquipItem _lastItem;
private readonly StainId[] _lastStains = new StainId[StainId.NumStains]; private readonly StainId[] _lastStains = new StainId[StainId.NumStains];
private readonly MenuItem _inventoryItem; private readonly MenuItem _inventoryItem;
public ContextMenuService(ItemManager items, StateManager state, ObjectManager objects, IGameGui gameGui, Configuration config, public ContextMenuService(ItemManager items, StateManager state, ObjectManager objects, Configuration config,
IContextMenu context) IContextMenu context)
{ {
_contextMenu = context; _contextMenu = context;
_items = items; _items = items;
_state = state; _state = state;
_objects = objects; _objects = objects;
_gameGui = gameGui;
if (config.EnableGameContextMenu) if (config.EnableGameContextMenu)
Enable(); Enable();
@ -55,7 +52,7 @@ public class ContextMenuService : IDisposable
if (arg.TargetItem.HasValue && HandleItem(arg.TargetItem.Value.ItemId)) if (arg.TargetItem.HasValue && HandleItem(arg.TargetItem.Value.ItemId))
{ {
for (var i = 0; i < arg.TargetItem.Value.Stains.Length; ++i) for (var i = 0; i < arg.TargetItem.Value.Stains.Length; ++i)
_lastStains[i] = (StainId)arg.TargetItem.Value.Stains[i]; _lastStains[i] = arg.TargetItem.Value.Stains[i];
args.AddMenuItem(_inventoryItem); args.AddMenuItem(_inventoryItem);
} }
} }
@ -72,8 +69,8 @@ public class ContextMenuService : IDisposable
} }
case "ChatLog": case "ChatLog":
{ {
var agent = _gameGui.FindAgentInterface("ChatLog"); var agent = AgentChatLog.Instance();
if (agent == nint.Zero || !ValidateChatLogContext(agent)) if (agent == null || !ValidateChatLogContext(agent))
return; return;
if (HandleItem(*(ItemId*)(agent + ChatLogContextItemId))) if (HandleItem(*(ItemId*)(agent + ChatLogContextItemId)))
@ -83,6 +80,36 @@ public class ContextMenuService : IDisposable
args.AddMenuItem(_inventoryItem); args.AddMenuItem(_inventoryItem);
} }
break;
}
case "RecipeNote":
{
var agent = AgentRecipeNote.Instance();
if (agent == null)
return;
if (HandleItem(agent->ContextMenuResultItemId))
{
for (var i = 0; i < _lastStains.Length; ++i)
_lastStains[i] = 0;
args.AddMenuItem(_inventoryItem);
}
break;
}
case "InclusionShop":
{
var agent = AgentRecipeItemContext.Instance();
if (agent == null)
return;
if (HandleItem(agent->ResultItemId))
{
for (var i = 0; i < _lastStains.Length; ++i)
_lastStains[i] = 0;
args.AddMenuItem(_inventoryItem);
}
break; break;
} }
} }
@ -125,6 +152,6 @@ public class ContextMenuService : IDisposable
return _items.ItemData.TryGetValue(itemId, EquipSlot.MainHand, out _lastItem); return _items.ItemData.TryGetValue(itemId, EquipSlot.MainHand, out _lastItem);
} }
private static unsafe bool ValidateChatLogContext(nint agent) private static unsafe bool ValidateChatLogContext(AgentChatLog* agent)
=> *(uint*)(agent + ChatLogContextItemId + 8) == 3; => *(&agent->ContextItemId + 8) == 3;
} }