From bfc439459ad2266689ad7d5c69dbcd0deefc2d39 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Sat, 31 Oct 2026 08:23:16 +0000 Subject: [PATCH] Decompile fn_21706 (CGameMode::ReceiveFriendList) Batch #7491 by eAthena: 0 byte-identical, 1 confirmed by peer review. - fn_21706 CGameMode::ReceiveFriendList: logic confirmed by peer review Peer-reviewed-by: meitogi, gordaoprogramas, Romain Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/Client/Mode/GameModePackets.cpp | 33 ++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Source/Client/Mode/GameModePackets.cpp b/Source/Client/Mode/GameModePackets.cpp index c62cc18f..96254216 100644 --- a/Source/Client/Mode/GameModePackets.cpp +++ b/Source/Client/Mode/GameModePackets.cpp @@ -2945,6 +2945,39 @@ namespace { } // OFFSET: 0x00D2AB70 +// FUNCTION: fn_21706 +void CGameMode::ReceiveFriendList(const unsigned char* packet) { + ClientMessenger messenger{g_session.m_partyMembers, g_session.m_friends}; + messenger.ClearFriends(); + + const std::int64_t length = *reinterpret_cast(packet + 2); + if (length == 4) { + return; + } + + const std::int64_t count = (length - 4) / static_cast(sizeof(FriendRecord)); + const FriendRecord* records = reinterpret_cast(packet + 4); + for (std::int64_t index = 0; index < count; ++index) { + FriendRecord record; + memcpy_s(&record, sizeof(record), &records[index], sizeof(record)); + + char name[25] = {}; + StringFormat(name, sizeof(name), static_cast(-1), "%s", record.name); + if (!g_playerNameDictionary->Contains(record.characterId)) { + std::string text(name, sizeof(name)); + SetPlayerName(record.characterId, text.c_str()); + } + + MessengerMember member; + member.name = name; + member.accountId = record.accountId; + member.characterId = record.characterId; + member.offline = 1; + messenger.AddFriend(member); + } + + g_session.RefreshWindow02C8(); +} namespace { #pragma pack(push, 1)