This commit is contained in:
Infi
2024-04-14 21:24:47 +02:00
parent 5f7199773a
commit 78e8f763e0
+160 -171
View File
@@ -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,23 +79,21 @@ 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);
Integrations(chunk, payload); Integrations(chunk, payload);
@@ -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,103 +430,94 @@ 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,7 +668,6 @@ 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");
@@ -688,6 +678,5 @@ public sealed class PayloadHandler {
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();
} }
} }