cleanup
This commit is contained in:
+172
-183
@@ -40,7 +40,8 @@ public sealed class PayloadHandler {
|
|||||||
private readonly ExcelSheet<TerritoryType> TerritorySheet;
|
private readonly ExcelSheet<TerritoryType> TerritorySheet;
|
||||||
private readonly ExcelSheet<EventItemHelp> EventItemHelpSheet;
|
private readonly ExcelSheet<EventItemHelp> EventItemHelpSheet;
|
||||||
|
|
||||||
internal PayloadHandler(ChatLogWindow logWindow) {
|
internal PayloadHandler(ChatLogWindow logWindow)
|
||||||
|
{
|
||||||
LogWindow = logWindow;
|
LogWindow = logWindow;
|
||||||
|
|
||||||
ItemSheet = Plugin.DataManager.GetExcelSheet<Item>()!;
|
ItemSheet = Plugin.DataManager.GetExcelSheet<Item>()!;
|
||||||
@@ -49,10 +50,12 @@ public sealed class PayloadHandler {
|
|||||||
EventItemHelpSheet = Plugin.DataManager.GetExcelSheet<EventItemHelp>()!;
|
EventItemHelpSheet = Plugin.DataManager.GetExcelSheet<EventItemHelp>()!;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Draw() {
|
internal void Draw()
|
||||||
|
{
|
||||||
DrawPopups();
|
DrawPopups();
|
||||||
|
|
||||||
if (_handleTooltips && ++_hoverCounter - _lastHoverCounter > 1) {
|
if (_handleTooltips && ++_hoverCounter - _lastHoverCounter > 1)
|
||||||
|
{
|
||||||
GameFunctions.GameFunctions.CloseItemTooltip();
|
GameFunctions.GameFunctions.CloseItemTooltip();
|
||||||
_hoveredItem = 0;
|
_hoveredItem = 0;
|
||||||
_hoverCounter = _lastHoverCounter = 0;
|
_hoverCounter = _lastHoverCounter = 0;
|
||||||
@@ -60,14 +63,15 @@ public sealed class PayloadHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawPopups() {
|
private void DrawPopups()
|
||||||
if (Popup == null) {
|
{
|
||||||
|
if (Popup == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
var (chunk, payload) = Popup.Value;
|
var (chunk, payload) = Popup.Value;
|
||||||
|
|
||||||
if (!ImGui.BeginPopup(PopupId)) {
|
if (!ImGui.BeginPopup(PopupId))
|
||||||
|
{
|
||||||
Popup = null;
|
Popup = null;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -75,22 +79,20 @@ public sealed class PayloadHandler {
|
|||||||
ImGui.PushID(PopupId);
|
ImGui.PushID(PopupId);
|
||||||
|
|
||||||
var drawn = false;
|
var drawn = false;
|
||||||
switch (payload) {
|
switch (payload)
|
||||||
case PlayerPayload player: {
|
{
|
||||||
|
case PlayerPayload player:
|
||||||
DrawPlayerPopup(chunk, player);
|
DrawPlayerPopup(chunk, player);
|
||||||
drawn = true;
|
drawn = true;
|
||||||
break;
|
break;
|
||||||
}
|
case ItemPayload item:
|
||||||
case ItemPayload item: {
|
|
||||||
DrawItemPopup(item);
|
DrawItemPopup(item);
|
||||||
drawn = true;
|
drawn = true;
|
||||||
break;
|
break;
|
||||||
}
|
case URIPayload uri:
|
||||||
case URIPayload uri: {
|
|
||||||
DrawUriPopup(uri);
|
DrawUriPopup(uri);
|
||||||
drawn = true;
|
drawn = true;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ContextFooter(drawn, chunk);
|
ContextFooter(drawn, chunk);
|
||||||
@@ -100,28 +102,35 @@ public sealed class PayloadHandler {
|
|||||||
ImGui.EndPopup();
|
ImGui.EndPopup();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Integrations(Chunk chunk, Payload? payload) {
|
private void Integrations(Chunk chunk, Payload? payload)
|
||||||
|
{
|
||||||
var registered = LogWindow.Plugin.Ipc.Registered;
|
var registered = LogWindow.Plugin.Ipc.Registered;
|
||||||
if (registered.Count == 0) {
|
if (registered.Count == 0)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
|
|
||||||
var contentId = chunk.Message?.ContentId ?? 0;
|
var contentId = chunk.Message?.ContentId ?? 0;
|
||||||
var sender = chunk.Message?.Sender.Select(c => c.Link).FirstOrDefault(p => p is PlayerPayload) as PlayerPayload;
|
var sender = chunk.Message?.Sender.Select(c => c.Link).FirstOrDefault(p => p is PlayerPayload) as PlayerPayload;
|
||||||
|
|
||||||
if (ImGui.BeginMenu(Language.Context_Integrations)) {
|
if (ImGui.BeginMenu(Language.Context_Integrations))
|
||||||
|
{
|
||||||
var cursor = ImGui.GetCursorPos();
|
var cursor = ImGui.GetCursorPos();
|
||||||
|
|
||||||
foreach (var id in registered) {
|
foreach (var id in registered)
|
||||||
try {
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
LogWindow.Plugin.Ipc.Invoke(id, sender, contentId, payload, chunk.Message?.SenderSource, chunk.Message?.ContentSource);
|
LogWindow.Plugin.Ipc.Invoke(id, sender, contentId, payload, chunk.Message?.SenderSource, chunk.Message?.ContentSource);
|
||||||
} catch (Exception ex) {
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
Plugin.Log.Error(ex, "Error executing integration");
|
Plugin.Log.Error(ex, "Error executing integration");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cursor == ImGui.GetCursorPos()) {
|
if (cursor == ImGui.GetCursorPos())
|
||||||
|
{
|
||||||
ImGui.PushStyleColor(ImGuiCol.Text, ImGui.GetStyle().Colors[(int) ImGuiCol.TextDisabled]);
|
ImGui.PushStyleColor(ImGuiCol.Text, ImGui.GetStyle().Colors[(int) ImGuiCol.TextDisabled]);
|
||||||
ImGui.Text("No integrations available");
|
ImGui.Text("No integrations available");
|
||||||
ImGui.PopStyleColor();
|
ImGui.PopStyleColor();
|
||||||
@@ -131,8 +140,10 @@ public sealed class PayloadHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ContextFooter(bool didCustomContext, Chunk chunk) {
|
private void ContextFooter(bool didCustomContext, Chunk chunk)
|
||||||
if (didCustomContext) {
|
{
|
||||||
|
if (didCustomContext)
|
||||||
|
{
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
|
|
||||||
// Only place these menu items in a submenu if we've already drawn
|
// Only place these menu items in a submenu if we've already drawn
|
||||||
@@ -140,27 +151,28 @@ public sealed class PayloadHandler {
|
|||||||
//
|
//
|
||||||
// It makes it much more convenient in the majority of cases to
|
// It makes it much more convenient in the majority of cases to
|
||||||
// copy the message content without having to open a submenu.
|
// copy the message content without having to open a submenu.
|
||||||
if (!ImGui.BeginMenu(Plugin.PluginName)) {
|
if (!ImGui.BeginMenu(Plugin.PluginName))
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui.Checkbox(Language.Context_ScreenshotMode, ref LogWindow.ScreenshotMode);
|
ImGui.Checkbox(Language.Context_ScreenshotMode, ref LogWindow.ScreenshotMode);
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_HideChat)) {
|
if (ImGui.Selectable(Language.Context_HideChat))
|
||||||
LogWindow.UserHide();
|
LogWindow.UserHide();
|
||||||
}
|
|
||||||
|
|
||||||
if (chunk.Message is { } message) {
|
if (chunk.Message is { } message)
|
||||||
if (ImGui.Selectable(Language.Context_Copy)) {
|
{
|
||||||
|
if (ImGui.Selectable(Language.Context_Copy))
|
||||||
|
{
|
||||||
ImGui.SetClipboardText(StringifyMessage(message, true));
|
ImGui.SetClipboardText(StringifyMessage(message, true));
|
||||||
WrapperUtil.AddNotification(Language.Context_CopySuccess, NotificationType.Info);
|
WrapperUtil.AddNotification(Language.Context_CopySuccess, NotificationType.Info);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only show a separate "Copy content" option if the message has
|
// Only show a separate "Copy content" option if the message has
|
||||||
// Sender chunks so it doesn't show for system messages.
|
// Sender chunks, so it doesn't show for system messages.
|
||||||
if (message.Sender.Count > 0 && ImGui.Selectable(Language.Context_CopyContent)) {
|
if (message.Sender.Count > 0 && ImGui.Selectable(Language.Context_CopyContent))
|
||||||
ImGui.SetClipboardText(StringifyMessage(message, false));
|
{
|
||||||
|
ImGui.SetClipboardText(StringifyMessage(message));
|
||||||
WrapperUtil.AddNotification(Language.Context_CopyContentSuccess, NotificationType.Info);
|
WrapperUtil.AddNotification(Language.Context_CopyContentSuccess, NotificationType.Info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,7 +191,7 @@ public sealed class PayloadHandler {
|
|||||||
if (didCustomContext) ImGui.EndMenu();
|
if (didCustomContext) ImGui.EndMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static string StringifyMessage(Message message, bool withSender = false)
|
private static string StringifyMessage(Message? message, bool withSender = false)
|
||||||
{
|
{
|
||||||
if (message == null)
|
if (message == null)
|
||||||
return string.Empty;
|
return string.Empty;
|
||||||
@@ -192,8 +204,10 @@ public sealed class PayloadHandler {
|
|||||||
.Aggregate(string.Concat);
|
.Aggregate(string.Concat);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void Click(Chunk chunk, Payload? payload, ImGuiMouseButton button) {
|
internal void Click(Chunk chunk, Payload? payload, ImGuiMouseButton button)
|
||||||
switch (button) {
|
{
|
||||||
|
switch (button)
|
||||||
|
{
|
||||||
case ImGuiMouseButton.Left:
|
case ImGuiMouseButton.Left:
|
||||||
LeftClickPayload(chunk, payload);
|
LeftClickPayload(chunk, payload);
|
||||||
break;
|
break;
|
||||||
@@ -206,13 +220,14 @@ public sealed class PayloadHandler {
|
|||||||
internal void Hover(Payload payload) {
|
internal void Hover(Payload payload) {
|
||||||
var hoverSize = 250f * ImGuiHelpers.GlobalScale;
|
var hoverSize = 250f * ImGuiHelpers.GlobalScale;
|
||||||
|
|
||||||
switch (payload) {
|
switch (payload)
|
||||||
case StatusPayload status: {
|
{
|
||||||
|
case StatusPayload status:
|
||||||
DoHover(() => HoverStatus(status), hoverSize);
|
DoHover(() => HoverStatus(status), hoverSize);
|
||||||
break;
|
break;
|
||||||
}
|
case ItemPayload item:
|
||||||
case ItemPayload item: {
|
if (LogWindow.Plugin.Config.NativeItemTooltips)
|
||||||
if (LogWindow.Plugin.Config.NativeItemTooltips) {
|
{
|
||||||
GameFunctions.GameFunctions.OpenItemTooltip(item.RawItemId);
|
GameFunctions.GameFunctions.OpenItemTooltip(item.RawItemId);
|
||||||
|
|
||||||
_handleTooltips = true;
|
_handleTooltips = true;
|
||||||
@@ -231,16 +246,14 @@ public sealed class PayloadHandler {
|
|||||||
|
|
||||||
DoHover(() => HoverItem(item), hoverSize);
|
DoHover(() => HoverItem(item), hoverSize);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
case URIPayload uri:
|
case URIPayload uri:
|
||||||
{
|
|
||||||
DoHover(() => HoverURI(uri), hoverSize);
|
DoHover(() => HoverURI(uri), hoverSize);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DoHover(Action inside, float width) {
|
private void DoHover(Action inside, float width)
|
||||||
|
{
|
||||||
ImGui.SetNextWindowSize(new Vector2(width, -1f));
|
ImGui.SetNextWindowSize(new Vector2(width, -1f));
|
||||||
|
|
||||||
ImGui.BeginTooltip();
|
ImGui.BeginTooltip();
|
||||||
@@ -290,7 +303,8 @@ public sealed class PayloadHandler {
|
|||||||
atk->SetPosition((short) x, (short) y);
|
atk->SetPosition((short) x, (short) y);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void InlineIcon(IDalamudTextureWrap icon) {
|
private static void InlineIcon(IDalamudTextureWrap icon)
|
||||||
|
{
|
||||||
var lineHeight = ImGui.CalcTextSize("A").Y;
|
var lineHeight = ImGui.CalcTextSize("A").Y;
|
||||||
|
|
||||||
var cursor = ImGui.GetCursorPos();
|
var cursor = ImGui.GetCursorPos();
|
||||||
@@ -300,10 +314,10 @@ public sealed class PayloadHandler {
|
|||||||
ImGui.SetCursorPos(cursor + new Vector2(size.X + 4, size.Y / 2 - lineHeight / 2));
|
ImGui.SetCursorPos(cursor + new Vector2(size.X + 4, size.Y / 2 - lineHeight / 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HoverStatus(StatusPayload status) {
|
private void HoverStatus(StatusPayload status)
|
||||||
if (LogWindow.Plugin.TextureCache.GetStatus(status.Status) is { } icon) {
|
{
|
||||||
|
if (LogWindow.Plugin.TextureCache.GetStatus(status.Status) is { } icon)
|
||||||
InlineIcon(icon);
|
InlineIcon(icon);
|
||||||
}
|
|
||||||
|
|
||||||
var name = ChunkUtil.ToChunks(status.Status.Name.ToDalamudString(), ChunkSource.None, null);
|
var name = ChunkUtil.ToChunks(status.Status.Name.ToDalamudString(), ChunkSource.None, null);
|
||||||
LogWindow.DrawChunks(name.ToList());
|
LogWindow.DrawChunks(name.ToList());
|
||||||
@@ -313,19 +327,19 @@ public sealed class PayloadHandler {
|
|||||||
LogWindow.DrawChunks(desc.ToList());
|
LogWindow.DrawChunks(desc.ToList());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HoverItem(ItemPayload item) {
|
private void HoverItem(ItemPayload item)
|
||||||
if (item.Kind == ItemPayload.ItemKind.EventItem) {
|
{
|
||||||
|
if (item.Kind == ItemPayload.ItemKind.EventItem)
|
||||||
|
{
|
||||||
HoverEventItem(item);
|
HoverEventItem(item);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.Item == null) {
|
if (item.Item == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (LogWindow.Plugin.TextureCache.GetItem(item.Item, item.IsHQ) is { } icon) {
|
if (LogWindow.Plugin.TextureCache.GetItem(item.Item, item.IsHQ) is { } icon)
|
||||||
InlineIcon(icon);
|
InlineIcon(icon);
|
||||||
}
|
|
||||||
|
|
||||||
var name = ChunkUtil.ToChunks(item.Item.Name.ToDalamudString(), ChunkSource.None, null);
|
var name = ChunkUtil.ToChunks(item.Item.Name.ToDalamudString(), ChunkSource.None, null);
|
||||||
LogWindow.DrawChunks(name.ToList());
|
LogWindow.DrawChunks(name.ToList());
|
||||||
@@ -335,87 +349,77 @@ public sealed class PayloadHandler {
|
|||||||
LogWindow.DrawChunks(desc.ToList());
|
LogWindow.DrawChunks(desc.ToList());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HoverEventItem(ItemPayload payload) {
|
private void HoverEventItem(ItemPayload payload)
|
||||||
|
{
|
||||||
var item = EventItemSheet.GetRow(payload.RawItemId);
|
var item = EventItemSheet.GetRow(payload.RawItemId);
|
||||||
if (item == null) {
|
if (item == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (LogWindow.Plugin.TextureCache.GetEventItem(item) is { } icon) {
|
if (LogWindow.Plugin.TextureCache.GetEventItem(item) is { } icon)
|
||||||
InlineIcon(icon);
|
InlineIcon(icon);
|
||||||
}
|
|
||||||
|
|
||||||
var name = ChunkUtil.ToChunks(item.Name.ToDalamudString(), ChunkSource.None, null);
|
var name = ChunkUtil.ToChunks(item.Name.ToDalamudString(), ChunkSource.None, null);
|
||||||
LogWindow.DrawChunks(name.ToList());
|
LogWindow.DrawChunks(name.ToList());
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
|
|
||||||
var help = EventItemHelpSheet.GetRow(payload.RawItemId);
|
var help = EventItemHelpSheet.GetRow(payload.RawItemId);
|
||||||
if (help != null) {
|
if (help != null)
|
||||||
|
{
|
||||||
var desc = ChunkUtil.ToChunks(help.Description.ToDalamudString(), ChunkSource.None, null);
|
var desc = ChunkUtil.ToChunks(help.Description.ToDalamudString(), ChunkSource.None, null);
|
||||||
LogWindow.DrawChunks(desc.ToList());
|
LogWindow.DrawChunks(desc.ToList());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void HoverURI(URIPayload uri) {
|
private void HoverURI(URIPayload uri)
|
||||||
|
{
|
||||||
ImGui.TextUnformatted(string.Format(Language.Context_URLDomain, uri.Uri.Authority));
|
ImGui.TextUnformatted(string.Format(Language.Context_URLDomain, uri.Uri.Authority));
|
||||||
ImGuiUtil.WarningText(Language.Context_URLWarning);
|
ImGuiUtil.WarningText(Language.Context_URLWarning);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void LeftClickPayload(Chunk chunk, Payload? payload) {
|
private void LeftClickPayload(Chunk chunk, Payload? payload)
|
||||||
switch (payload) {
|
{
|
||||||
case MapLinkPayload map: {
|
switch (payload)
|
||||||
|
{
|
||||||
|
case MapLinkPayload map:
|
||||||
Plugin.GameGui.OpenMapWithMapLink(map);
|
Plugin.GameGui.OpenMapWithMapLink(map);
|
||||||
break;
|
break;
|
||||||
}
|
case QuestPayload quest:
|
||||||
case QuestPayload quest: {
|
|
||||||
LogWindow.Plugin.Common.Functions.Journal.OpenQuest(quest.Quest);
|
LogWindow.Plugin.Common.Functions.Journal.OpenQuest(quest.Quest);
|
||||||
break;
|
break;
|
||||||
}
|
case DalamudLinkPayload link:
|
||||||
case DalamudLinkPayload link: {
|
|
||||||
ClickLinkPayload(chunk, payload, link);
|
ClickLinkPayload(chunk, payload, link);
|
||||||
break;
|
break;
|
||||||
}
|
case DalamudPartyFinderPayload pf:
|
||||||
case DalamudPartyFinderPayload pf: {
|
if (pf.LinkType == DalamudPartyFinderPayload.PartyFinderLinkType.PartyFinderNotification)
|
||||||
if (pf.LinkType == DalamudPartyFinderPayload.PartyFinderLinkType.PartyFinderNotification) {
|
|
||||||
GameFunctions.GameFunctions.OpenPartyFinder();
|
GameFunctions.GameFunctions.OpenPartyFinder();
|
||||||
} else {
|
else
|
||||||
LogWindow.Plugin.Functions.OpenPartyFinder(pf.ListingId);
|
LogWindow.Plugin.Functions.OpenPartyFinder(pf.ListingId);
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
case ChatTwoPartyFinderPayload pf:
|
||||||
case ChatTwoPartyFinderPayload pf: {
|
|
||||||
LogWindow.Plugin.Functions.OpenPartyFinder(pf.Id);
|
LogWindow.Plugin.Functions.OpenPartyFinder(pf.Id);
|
||||||
break;
|
break;
|
||||||
}
|
case AchievementPayload achievement:
|
||||||
case AchievementPayload achievement: {
|
|
||||||
LogWindow.Plugin.Functions.OpenAchievement(achievement.Id);
|
LogWindow.Plugin.Functions.OpenAchievement(achievement.Id);
|
||||||
break;
|
break;
|
||||||
}
|
case RawPayload raw:
|
||||||
case RawPayload raw: {
|
if (Equals(raw, ChunkUtil.PeriodicRecruitmentLink))
|
||||||
if (Equals(raw, ChunkUtil.PeriodicRecruitmentLink)) {
|
|
||||||
GameFunctions.GameFunctions.OpenPartyFinder();
|
GameFunctions.GameFunctions.OpenPartyFinder();
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
case URIPayload uri:
|
||||||
case URIPayload uri: {
|
|
||||||
TryOpenURI(uri.Uri);
|
TryOpenURI(uri.Uri);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ClickLinkPayload(Chunk chunk, Payload payload, DalamudLinkPayload link) {
|
private void ClickLinkPayload(Chunk chunk, Payload payload, DalamudLinkPayload link)
|
||||||
if (chunk.GetSeString() is not { } source) {
|
{
|
||||||
|
if (chunk.GetSeString() is not { } source)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
var start = source.Payloads.IndexOf(payload);
|
var start = source.Payloads.IndexOf(payload);
|
||||||
var end = source.Payloads.IndexOf(RawPayload.LinkTerminator, start == -1 ? 0 : start);
|
var end = source.Payloads.IndexOf(RawPayload.LinkTerminator, start == -1 ? 0 : start);
|
||||||
if (start == -1 || end == -1) {
|
if (start == -1 || end == -1)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
var payloads = source.Payloads.Skip(start).Take(end - start + 1).ToList();
|
var payloads = source.Payloads.Skip(start).Take(end - start + 1).ToList();
|
||||||
if (!Plugin.ChatGui.RegisteredLinkHandlers.TryGetValue((link.Plugin, link.CommandId), out var value))
|
if (!Plugin.ChatGui.RegisteredLinkHandlers.TryGetValue((link.Plugin, link.CommandId), out var value))
|
||||||
@@ -426,102 +430,93 @@ public sealed class PayloadHandler {
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Running XivCommon SendChat instantly leads to a game freeze, for whatever reason
|
// Running XivCommon SendChat instantly, without RunOnTick, leads to a game freeze, for whatever reason
|
||||||
Plugin.Framework.RunOnTick(() => value.Invoke(link.CommandId, new SeString(payloads)));
|
Plugin.Framework.RunOnTick(() => value.Invoke(link.CommandId, new SeString(payloads)));
|
||||||
} catch (Exception ex) {
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
Plugin.Log.Error(ex, "Error executing DalamudLinkPayload handler");
|
Plugin.Log.Error(ex, "Error executing DalamudLinkPayload handler");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RightClickPayload(Chunk chunk, Payload? payload) {
|
private void RightClickPayload(Chunk chunk, Payload? payload)
|
||||||
|
{
|
||||||
Popup = (chunk, payload);
|
Popup = (chunk, payload);
|
||||||
ImGui.OpenPopup(PopupId);
|
ImGui.OpenPopup(PopupId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawItemPopup(ItemPayload payload) {
|
private void DrawItemPopup(ItemPayload payload)
|
||||||
if (payload.Kind == ItemPayload.ItemKind.EventItem) {
|
{
|
||||||
|
if (payload.Kind == ItemPayload.ItemKind.EventItem)
|
||||||
|
{
|
||||||
DrawEventItemPopup(payload);
|
DrawEventItemPopup(payload);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var item = ItemSheet.GetRow(payload.ItemId);
|
var item = ItemSheet.GetRow(payload.ItemId);
|
||||||
if (item == null) {
|
if (item == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
var hq = payload.Kind == ItemPayload.ItemKind.Hq;
|
var hq = payload.Kind == ItemPayload.ItemKind.Hq;
|
||||||
|
if (LogWindow.Plugin.TextureCache.GetItem(item, hq) is { } icon)
|
||||||
if (LogWindow.Plugin.TextureCache.GetItem(item, hq) is { } icon) {
|
|
||||||
InlineIcon(icon);
|
InlineIcon(icon);
|
||||||
}
|
|
||||||
|
|
||||||
var name = item.Name.ToDalamudString();
|
var name = item.Name.ToDalamudString();
|
||||||
if (hq) {
|
// hq symbol
|
||||||
// hq symbol
|
if (hq)
|
||||||
name.Payloads.Add(new TextPayload(" "));
|
name.Payloads.Add(new TextPayload(" "));
|
||||||
} else if (payload.Kind == ItemPayload.ItemKind.Collectible) {
|
else if (payload.Kind == ItemPayload.ItemKind.Collectible)
|
||||||
name.Payloads.Add(new TextPayload(" "));
|
name.Payloads.Add(new TextPayload(" "));
|
||||||
}
|
|
||||||
|
|
||||||
LogWindow.DrawChunks(ChunkUtil.ToChunks(name, ChunkSource.None, null).ToList(), false);
|
LogWindow.DrawChunks(ChunkUtil.ToChunks(name, ChunkSource.None, null).ToList(), false);
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
|
|
||||||
var realItemId = payload.RawItemId;
|
var realItemId = payload.RawItemId;
|
||||||
if (item.EquipSlotCategory.Row != 0) {
|
if (item.EquipSlotCategory.Row != 0)
|
||||||
if (ImGui.Selectable(Language.Context_TryOn)) {
|
{
|
||||||
|
if (ImGui.Selectable(Language.Context_TryOn))
|
||||||
LogWindow.Plugin.Functions.Context.TryOn(realItemId, 0);
|
LogWindow.Plugin.Functions.Context.TryOn(realItemId, 0);
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_ItemComparison)) {
|
if (ImGui.Selectable(Language.Context_ItemComparison))
|
||||||
LogWindow.Plugin.Functions.Context.OpenItemComparison(realItemId);
|
LogWindow.Plugin.Functions.Context.OpenItemComparison(realItemId);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.ItemSearchCategory.Value?.Category == 3) {
|
if (item.ItemSearchCategory.Value?.Category == 3)
|
||||||
if (ImGui.Selectable(Language.Context_SearchRecipes)) {
|
if (ImGui.Selectable(Language.Context_SearchRecipes))
|
||||||
LogWindow.Plugin.Functions.Context.SearchForRecipesUsingItem(payload.ItemId);
|
LogWindow.Plugin.Functions.Context.SearchForRecipesUsingItem(payload.ItemId);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_SearchForItem)) {
|
if (ImGui.Selectable(Language.Context_SearchForItem))
|
||||||
LogWindow.Plugin.Functions.Context.SearchForItem(realItemId);
|
LogWindow.Plugin.Functions.Context.SearchForItem(realItemId);
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_Link)) {
|
if (ImGui.Selectable(Language.Context_Link))
|
||||||
LogWindow.Plugin.Functions.Context.LinkItem(realItemId);
|
LogWindow.Plugin.Functions.Context.LinkItem(realItemId);
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_CopyItemName)) {
|
if (ImGui.Selectable(Language.Context_CopyItemName))
|
||||||
ImGui.SetClipboardText(name.TextValue);
|
ImGui.SetClipboardText(name.TextValue);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawEventItemPopup(ItemPayload payload) {
|
private void DrawEventItemPopup(ItemPayload payload)
|
||||||
if (payload.Kind != ItemPayload.ItemKind.EventItem) {
|
{
|
||||||
|
if (payload.Kind != ItemPayload.ItemKind.EventItem)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
var item = EventItemSheet.GetRow(payload.ItemId);
|
var item = EventItemSheet.GetRow(payload.ItemId);
|
||||||
if (item == null) {
|
if (item == null)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (LogWindow.Plugin.TextureCache.GetEventItem(item) is { } icon) {
|
if (LogWindow.Plugin.TextureCache.GetEventItem(item) is { } icon)
|
||||||
InlineIcon(icon);
|
InlineIcon(icon);
|
||||||
}
|
|
||||||
|
|
||||||
var name = item.Name.ToDalamudString();
|
var name = item.Name.ToDalamudString();
|
||||||
LogWindow.DrawChunks(ChunkUtil.ToChunks(name, ChunkSource.None, null).ToList(), false);
|
LogWindow.DrawChunks(ChunkUtil.ToChunks(name, ChunkSource.None, null).ToList(), false);
|
||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
|
|
||||||
var realItemId = payload.RawItemId;
|
var realItemId = payload.RawItemId;
|
||||||
if (ImGui.Selectable(Language.Context_Link)) {
|
if (ImGui.Selectable(Language.Context_Link))
|
||||||
LogWindow.Plugin.Functions.Context.LinkItem(realItemId);
|
LogWindow.Plugin.Functions.Context.LinkItem(realItemId);
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_CopyItemName)) {
|
if (ImGui.Selectable(Language.Context_CopyItemName))
|
||||||
ImGui.SetClipboardText(name.TextValue);
|
ImGui.SetClipboardText(name.TextValue);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawPlayerPopup(Chunk chunk, PlayerPayload player)
|
private void DrawPlayerPopup(Chunk chunk, PlayerPayload player)
|
||||||
@@ -531,15 +526,15 @@ public sealed class PayloadHandler {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
var world = player.World;
|
var world = player.World;
|
||||||
if (chunk.Message?.Code.Type == ChatType.FreeCompanyLoginLogout) {
|
if (chunk.Message?.Code.Type == ChatType.FreeCompanyLoginLogout)
|
||||||
if (Plugin.ClientState.LocalPlayer?.HomeWorld.GameData is { } homeWorld) {
|
if (Plugin.ClientState.LocalPlayer?.HomeWorld.GameData is { } homeWorld)
|
||||||
world = homeWorld;
|
world = homeWorld;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var name = new List<Chunk> { new TextChunk(ChunkSource.None, null, player.PlayerName) };
|
var name = new List<Chunk> { new TextChunk(ChunkSource.None, null, player.PlayerName) };
|
||||||
if (world.IsPublic) {
|
if (world.IsPublic)
|
||||||
name.AddRange(new Chunk[] {
|
{
|
||||||
|
name.AddRange(new Chunk[]
|
||||||
|
{
|
||||||
new IconChunk(ChunkSource.None, null, BitmapFontIcon.CrossWorld),
|
new IconChunk(ChunkSource.None, null, BitmapFontIcon.CrossWorld),
|
||||||
new TextChunk(ChunkSource.None, null, world.Name),
|
new TextChunk(ChunkSource.None, null, world.Name),
|
||||||
});
|
});
|
||||||
@@ -555,9 +550,8 @@ public sealed class PayloadHandler {
|
|||||||
if (TerritorySheet.GetRow(Plugin.ClientState.TerritoryType)?.TerritoryIntendedUse != 41)
|
if (TerritorySheet.GetRow(Plugin.ClientState.TerritoryType)?.TerritoryIntendedUse != 41)
|
||||||
{
|
{
|
||||||
LogWindow.Chat = $"/tell {player.PlayerName}";
|
LogWindow.Chat = $"/tell {player.PlayerName}";
|
||||||
if (world.IsPublic) {
|
if (world.IsPublic)
|
||||||
LogWindow.Chat += $"@{world.Name}";
|
LogWindow.Chat += $"@{world.Name}";
|
||||||
}
|
|
||||||
|
|
||||||
LogWindow.Chat += " ";
|
LogWindow.Chat += " ";
|
||||||
}
|
}
|
||||||
@@ -569,7 +563,8 @@ public sealed class PayloadHandler {
|
|||||||
LogWindow.Activate = true;
|
LogWindow.Activate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (world.IsPublic) {
|
if (world.IsPublic)
|
||||||
|
{
|
||||||
var party = Plugin.PartyList;
|
var party = Plugin.PartyList;
|
||||||
var leader = (ulong?) party[(int) party.PartyLeaderIndex]?.ContentId;
|
var leader = (ulong?) party[(int) party.PartyLeaderIndex]?.ContentId;
|
||||||
var isLeader = party.Length == 0 || Plugin.ClientState.LocalContentId == leader;
|
var isLeader = party.Length == 0 || Plugin.ClientState.LocalContentId == leader;
|
||||||
@@ -577,71 +572,69 @@ public sealed class PayloadHandler {
|
|||||||
var isInParty = member != default;
|
var isInParty = member != default;
|
||||||
var inInstance = LogWindow.Plugin.Functions.IsInInstance();
|
var inInstance = LogWindow.Plugin.Functions.IsInInstance();
|
||||||
var inPartyInstance = TerritorySheet.GetRow(Plugin.ClientState.TerritoryType)?.TerritoryIntendedUse is (41 or 47 or 48 or 52 or 53);
|
var inPartyInstance = TerritorySheet.GetRow(Plugin.ClientState.TerritoryType)?.TerritoryIntendedUse is (41 or 47 or 48 or 52 or 53);
|
||||||
if (isLeader) {
|
if (isLeader)
|
||||||
if (!isInParty) {
|
{
|
||||||
if (inInstance && inPartyInstance) {
|
if (!isInParty)
|
||||||
if (validContentId && ImGui.Selectable(Language.Context_InviteToParty)) {
|
{
|
||||||
|
if (inInstance && inPartyInstance)
|
||||||
|
{
|
||||||
|
if (validContentId && ImGui.Selectable(Language.Context_InviteToParty))
|
||||||
LogWindow.Plugin.Functions.Party.InviteInInstance(chunk.Message!.ContentId);
|
LogWindow.Plugin.Functions.Party.InviteInInstance(chunk.Message!.ContentId);
|
||||||
}
|
}
|
||||||
} else if (!inInstance && ImGui.BeginMenu(Language.Context_InviteToParty)) {
|
else if (!inInstance && ImGui.BeginMenu(Language.Context_InviteToParty))
|
||||||
if (ImGui.Selectable(Language.Context_InviteToParty_SameWorld)) {
|
{
|
||||||
|
if (ImGui.Selectable(Language.Context_InviteToParty_SameWorld))
|
||||||
LogWindow.Plugin.Functions.Party.InviteSameWorld(player.PlayerName, (ushort) world.RowId, chunk.Message?.ContentId ?? 0);
|
LogWindow.Plugin.Functions.Party.InviteSameWorld(player.PlayerName, (ushort) world.RowId, chunk.Message?.ContentId ?? 0);
|
||||||
}
|
|
||||||
|
|
||||||
if (validContentId && ImGui.Selectable(Language.Context_InviteToParty_DifferentWorld)) {
|
if (validContentId && ImGui.Selectable(Language.Context_InviteToParty_DifferentWorld))
|
||||||
LogWindow.Plugin.Functions.Party.InviteOtherWorld(chunk.Message!.ContentId);
|
LogWindow.Plugin.Functions.Party.InviteOtherWorld(chunk.Message!.ContentId);
|
||||||
}
|
|
||||||
|
|
||||||
ImGui.EndMenu();
|
ImGui.EndMenu();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isInParty && member != null && (!inInstance || (inInstance && inPartyInstance))) {
|
if (isInParty && member != null && (!inInstance || (inInstance && inPartyInstance)))
|
||||||
if (ImGui.Selectable(Language.Context_Promote)) {
|
{
|
||||||
|
if (ImGui.Selectable(Language.Context_Promote))
|
||||||
LogWindow.Plugin.Functions.Party.Promote(player.PlayerName, (ulong) member.ContentId);
|
LogWindow.Plugin.Functions.Party.Promote(player.PlayerName, (ulong) member.ContentId);
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_KickFromParty)) {
|
if (ImGui.Selectable(Language.Context_KickFromParty))
|
||||||
LogWindow.Plugin.Functions.Party.Kick(player.PlayerName, (ulong) member.ContentId);
|
LogWindow.Plugin.Functions.Party.Kick(player.PlayerName, (ulong) member.ContentId);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var isFriend = LogWindow.Plugin.Common.Functions.FriendList.List.Any(friend => friend.Name.TextValue == player.PlayerName && friend.HomeWorld == world.RowId);
|
var isFriend = LogWindow.Plugin.Common.Functions.FriendList.List.Any(friend => friend.Name.TextValue == player.PlayerName && friend.HomeWorld == world.RowId);
|
||||||
if (!isFriend && ImGui.Selectable(Language.Context_SendFriendRequest)) {
|
if (!isFriend && ImGui.Selectable(Language.Context_SendFriendRequest))
|
||||||
LogWindow.Plugin.Functions.SendFriendRequest(player.PlayerName, (ushort) world.RowId);
|
LogWindow.Plugin.Functions.SendFriendRequest(player.PlayerName, (ushort) world.RowId);
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_AddToBlacklist)) {
|
if (ImGui.Selectable(Language.Context_AddToBlacklist))
|
||||||
LogWindow.Plugin.Functions.AddToBlacklist(player.PlayerName, (ushort) world.RowId);
|
LogWindow.Plugin.Functions.AddToBlacklist(player.PlayerName, (ushort) world.RowId);
|
||||||
}
|
|
||||||
|
|
||||||
if (LogWindow.Plugin.Functions.IsMentor() && ImGui.Selectable(Language.Context_InviteToNoviceNetwork)) {
|
if (LogWindow.Plugin.Functions.IsMentor() && ImGui.Selectable(Language.Context_InviteToNoviceNetwork))
|
||||||
LogWindow.Plugin.Functions.Context.InviteToNoviceNetwork(player.PlayerName, (ushort) world.RowId);
|
LogWindow.Plugin.Functions.Context.InviteToNoviceNetwork(player.PlayerName, (ushort) world.RowId);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var inputChannel = chunk.Message?.Code.Type.ToInputChannel();
|
var inputChannel = chunk.Message?.Code.Type.ToInputChannel();
|
||||||
if (inputChannel != null && ImGui.Selectable(Language.Context_ReplyInSelectedChatMode)) {
|
if (inputChannel != null && ImGui.Selectable(Language.Context_ReplyInSelectedChatMode))
|
||||||
|
{
|
||||||
LogWindow.SetChannel(inputChannel.Value);
|
LogWindow.SetChannel(inputChannel.Value);
|
||||||
LogWindow.Activate = true;
|
LogWindow.Activate = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_Target) && FindCharacterForPayload(player) is { } obj) {
|
if (ImGui.Selectable(Language.Context_Target) && FindCharacterForPayload(player) is { } obj)
|
||||||
Plugin.TargetManager.Target = obj;
|
Plugin.TargetManager.Target = obj;
|
||||||
}
|
|
||||||
|
|
||||||
if (validContentId && ImGui.Selectable(Language.Context_AdventurerPlate))
|
if (validContentId && ImGui.Selectable(Language.Context_AdventurerPlate))
|
||||||
{
|
|
||||||
if (!LogWindow.Plugin.Functions.TryOpenAdventurerPlate(chunk.Message!.ContentId))
|
if (!LogWindow.Plugin.Functions.TryOpenAdventurerPlate(chunk.Message!.ContentId))
|
||||||
WrapperUtil.AddNotification(Language.Context_AdventurerPlateError, NotificationType.Warning);
|
WrapperUtil.AddNotification(Language.Context_AdventurerPlateError, NotificationType.Warning);
|
||||||
}
|
|
||||||
|
|
||||||
// View Party Finder 0x2E
|
// View Party Finder 0x2E
|
||||||
}
|
}
|
||||||
|
|
||||||
private PlayerCharacter? FindCharacterForPayload(PlayerPayload payload) {
|
private PlayerCharacter? FindCharacterForPayload(PlayerPayload payload)
|
||||||
foreach (var obj in Plugin.ObjectTable) {
|
{
|
||||||
|
foreach (var obj in Plugin.ObjectTable)
|
||||||
|
{
|
||||||
if (obj is not PlayerCharacter character)
|
if (obj is not PlayerCharacter character)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -664,9 +657,7 @@ public sealed class PayloadHandler {
|
|||||||
ImGui.Separator();
|
ImGui.Separator();
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_OpenInBrowser))
|
if (ImGui.Selectable(Language.Context_OpenInBrowser))
|
||||||
{
|
|
||||||
TryOpenURI(uri.Uri);
|
TryOpenURI(uri.Uri);
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui.Selectable(Language.Context_CopyLink))
|
if (ImGui.Selectable(Language.Context_CopyLink))
|
||||||
{
|
{
|
||||||
@@ -677,17 +668,15 @@ public sealed class PayloadHandler {
|
|||||||
|
|
||||||
private void TryOpenURI(Uri uri)
|
private void TryOpenURI(Uri uri)
|
||||||
{
|
{
|
||||||
new Thread(() => {
|
try
|
||||||
try
|
{
|
||||||
{
|
Plugin.Log.Debug($"Opening URI {uri} in default browser");
|
||||||
Plugin.Log.Debug($"Opening URI {uri} in default browser");
|
Dalamud.Utility.Util.OpenLink(uri.ToString());
|
||||||
Dalamud.Utility.Util.OpenLink(uri.ToString());
|
}
|
||||||
}
|
catch (Exception ex)
|
||||||
catch (Exception ex)
|
{
|
||||||
{
|
Plugin.Log.Error($"Error opening URI: {ex}");
|
||||||
Plugin.Log.Error($"Error opening URI: {ex}");
|
WrapperUtil.AddNotification(Language.Context_OpenInBrowserError, NotificationType.Error);
|
||||||
WrapperUtil.AddNotification(Language.Context_OpenInBrowserError, NotificationType.Error);
|
}
|
||||||
}
|
|
||||||
}).Start();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user