diff --git a/ChatTwo/GameFunctions.cs b/ChatTwo/GameFunctions.cs index 40a0c51..5b83064 100755 --- a/ChatTwo/GameFunctions.cs +++ b/ChatTwo/GameFunctions.cs @@ -428,4 +428,23 @@ internal unsafe class GameFunctions : IDisposable { var itemFinder = Framework.Instance()->GetUiModule()->GetItemFinderModule(); this._searchForItem(itemFinder, itemId, 1); } + + internal static void OpenPartyFinder() { + // this whole method: 6.05: 84433A + var lfg = Framework.Instance()->GetUiModule()->GetAgentModule()->GetAgentByInternalId(AgentId.LookingForGroup); + if (lfg->IsAgentActive()) { + var addonId = lfg->GetAddonID(); + var atkModule = Framework.Instance()->GetUiModule()->GetRaptureAtkModule(); + var atkModuleVtbl = (void**) atkModule->AtkModule.vtbl; + var vf27 = (delegate* unmanaged) atkModuleVtbl[27]; + vf27(atkModule, addonId, 1); + } else { + // 6.05: 8443DD + if (*(uint*) ((IntPtr) lfg + 0x2AB8) > 0) { + lfg->Hide(); + } else { + lfg->Show(); + } + } + } } diff --git a/ChatTwo/PayloadHandler.cs b/ChatTwo/PayloadHandler.cs index 3143652..65e47b8 100755 --- a/ChatTwo/PayloadHandler.cs +++ b/ChatTwo/PayloadHandler.cs @@ -175,6 +175,13 @@ internal sealed class PayloadHandler { this.ClickLinkPayload(chunk, payload, link); break; } + case RawPayload raw: { + if (Equals(raw, ChunkUtil.PeriodicRecruitmentLink)) { + GameFunctions.OpenPartyFinder(); + } + + break; + } } } diff --git a/ChatTwo/Util/ChunkUtil.cs b/ChatTwo/Util/ChunkUtil.cs index 57ec3e3..56e6264 100755 --- a/ChatTwo/Util/ChunkUtil.cs +++ b/ChatTwo/Util/ChunkUtil.cs @@ -70,6 +70,8 @@ internal static class ChunkUtil { glow.Pop(); } else if (Equals(rawPayload, RawPayload.LinkTerminator)) { link = null; + } else if (Equals(rawPayload, PeriodicRecruitmentLink)) { + link = rawPayload; } break; @@ -84,4 +86,8 @@ internal static class ChunkUtil { return chunks; } + + internal static readonly RawPayload PeriodicRecruitmentLink = new(new byte[] { + 0x02, 0x27, 0x07, 0x08, 0x01, 0x01, 0x01, 0xFF, 0x01, 0x03, + }); }