From 13623813ca47a589aeb2ae18aebb7d451209feda Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Wed, 4 Nov 2026 22:50:08 +0000 Subject: [PATCH] Decompile 12 functions in Source/Client/Mode/GameModeHandlers.cpp Batch #11259 by cremane: 3 byte-identical, 9 confirmed by peer review. - fn_21782 CGameMode::ReceivePartyBookingUpdateResult: byte-identical - fn_21787 CGameMode::ReceiveToggleNotice: byte-identical - fn_21806 CGameMode::ReceiveBookOpen: logic confirmed by peer review - fn_21807 CGameMode::ReceiveResultNotice00FC: logic confirmed by peer review - fn_21813 CGameMode::ReceiveStatusNotice: logic confirmed by peer review - fn_21819 CGameMode::sub_D40730: logic confirmed by peer review - fn_21820 CGameMode::ReceiveGroundSkill8: logic confirmed by peer review - fn_21821 CGameMode::ReceiveGroundSkill32: logic confirmed by peer review - fn_21822 CGameMode::ReceiveGroundSkillExtended: logic confirmed by peer review - fn_21823 CGameMode::sub_D41250: logic confirmed by peer review - fn_22030 CGameMode::RequestWindow169: logic confirmed by peer review - fn_22031 CGameMode::ToggleWindow169: byte-identical Peer-reviewed-by: Yommy, Tanke, StrawberrysherbetIX Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/Client/Mode/GameModeHandlers.cpp | 159 ++++++++++-------------- 1 file changed, 68 insertions(+), 91 deletions(-) diff --git a/Source/Client/Mode/GameModeHandlers.cpp b/Source/Client/Mode/GameModeHandlers.cpp index 15e5456c..0e0ef3dc 100644 --- a/Source/Client/Mode/GameModeHandlers.cpp +++ b/Source/Client/Mode/GameModeHandlers.cpp @@ -379,7 +379,8 @@ void CGameMode::ReceivePartyRoster(const unsigned char* packet) { // FUNCTION: fn_21822 void CGameMode::ReceiveGroundSkillExtended(const unsigned char* record) { const GroundSkillPacketExtended& packet = *reinterpret_cast(record); - if (packet.type == 176) { + switch (packet.type) { + case 176: { if (packet.length <= 23) { return; } @@ -393,7 +394,7 @@ void CGameMode::ReceiveGroundSkillExtended(const unsigned char* record) { this->scene->unknown_0020.push_back(skill); return; } - if (packet.type == 0x126) { + case 0x126: this->sub_D60D70(packet.aid, packet.owner, packet.x, packet.y); return; } @@ -407,24 +408,20 @@ void CGameMode::ReceiveGroundSkillExtended(const unsigned char* record) { data.skill.visible = packet.visible; data.skill.level = packet.level; data.flags = packet.flags; - if (data.skill.owner == g_session.m_aid) { - if (data.skill.visible) { - this->m_skillUnitIds.push_back(packet.aid); - } - } else if (!data.skill.visible) { + if (data.skill.owner != g_session.m_aid && !data.skill.visible) { const auto found = std::find(this->m_skillUnitIds.begin(), this->m_skillUnitIds.end(), data.skill.aid); if (found != this->m_skillUnitIds.end()) { this->m_skillUnitIds.erase(found); data.skill.visible = 0; } - } else { + } else if (data.skill.visible) { this->m_skillUnitIds.push_back(packet.aid); } CSkill* skill = static_cast(this->scene->GetSkillByAID(packet.aid)); if (!skill) { const int type = packet.type; - if (!((type >= 45 && type <= 999) || (type >= 1001 && type <= 3998) || + if (!((type >= 45 && type < 1000) || (type > 1000 && type < 3999) || static_cast(type) - 20021u <= 11978u)) { return; } @@ -532,25 +529,22 @@ void CGameMode::ReceivePartyBookingRegisterResult(const unsigned char* packet) { // FUNCTION: fn_21782 void CGameMode::ReceivePartyBookingUpdateResult(const unsigned char* packet) { const std::int16_t result = *reinterpret_cast(packet + 2); - if (result != 0) { - g_windowMgr.Confirm(LookupMessage(result == 2 ? 1941 : 1826), 0, true, false, 0, "Message", 280, 120, 0); - return; + if (result == 0) { + g_session.m_partyBooking.unknown_0034 = GetTickCount(); + g_windowMgr.EnsureWindow(164); + UISeekPartyWnd* seekWindow = static_cast(g_windowMgr.LookupWindow(164)); + if (seekWindow) { + UIWindow* jobWindow = g_windowMgr.LookupWindow(168); + if (jobWindow) { + seekWindow->SetJobs(reinterpret_cast(reinterpret_cast(jobWindow) + 0x16D)); + g_windowMgr.CloseWindow(168); + } + } + } else if (result == 2) { + g_windowMgr.Confirm(LookupMessage(1941), 0, true, false, 0, "Message", 280, 120, 0); + } else { + g_windowMgr.Confirm(LookupMessage(1826), 0, true, false, 0, "Message", 280, 120, 0); } - - g_session.m_partyBooking.unknown_0034 = GetTickCount(); - g_windowMgr.EnsureWindow(164); - UISeekPartyWnd* seekWindow = static_cast(g_windowMgr.LookupWindow(164)); - if (!seekWindow) { - return; - } - - UIWindow* jobWindow = g_windowMgr.LookupWindow(168); - if (!jobWindow) { - return; - } - - seekWindow->SetJobs(reinterpret_cast(reinterpret_cast(jobWindow) + 0x16D)); - g_windowMgr.CloseWindow(168); } // OFFSET: 0x00D3B7F0 @@ -608,7 +602,8 @@ void CGameMode::ReceivePartyBookingUpdate(const unsigned char* packet) { // FUNCTION: fn_21787 void CGameMode::ReceiveToggleNotice(const unsigned char* packet) { g_toggleNoticeState = packet[2]; - g_windowMgr.SendNotice(1, reinterpret_cast(LookupMessage(g_toggleNoticeState == 0 ? 1326 : 1325)), 0x64FFFF, 0, 0, 0); + const char* message = LookupMessage(g_toggleNoticeState == 0 ? 1326 : 1325); + g_windowMgr.SendNotice(1, reinterpret_cast(message), 0x64FFFF, 0, 0, 0); } // OFFSET: 0x00D3BF00 @@ -1079,12 +1074,12 @@ void CGameMode::ReceiveBookOpen(const unsigned char* packet) { } CFile file; - if (file.Open(path, 0, true, false)) { - g_windowMgr.EnsureWindow(106)->SendMsg(nullptr, 0x5E, reinterpret_cast(number), 287, *reinterpret_cast(packet + 6), 0); - file.Close(); - } else { + if (!file.Open(path, 0, true, false)) { g_windowMgr.SendNotice(3, 0, 0, 0, 0, 0); g_windowMgr.SendNotice(1, reinterpret_cast("책이 없습니다"), 0xFF, 0, 0, 0); + } else { + g_windowMgr.EnsureWindow(106)->SendMsg(nullptr, 0x5E, reinterpret_cast(number), 287, *reinterpret_cast(packet + 6), 0); + file.Close(); } } @@ -1093,41 +1088,36 @@ void CGameMode::ReceiveBookOpen(const unsigned char* packet) { void CGameMode::ReceiveResultNotice00FC(const unsigned char* packet) { this->unknown_00FC = 0; - int messageId; switch (packet[2]) { case 0: g_windowMgr.SendNotice(3, 0, 0, 0, 0, 0); - messageId = 0x43; + g_windowMgr.SendNotice(1, reinterpret_cast(LookupMessage(0x43)), 0xFF, 0, 0, 0); break; case 1: g_windowMgr.SendNotice(3, 0, 0, 0, 0, 0); - messageId = 7; + g_windowMgr.SendNotice(1, reinterpret_cast(LookupMessage(7)), 0xFF, 0, 0, 0); break; case 2: g_windowMgr.SendNotice(3, 0, 0, 0, 0, 0); - messageId = 0x44; + g_windowMgr.SendNotice(1, reinterpret_cast(LookupMessage(0x44)), 0xFF, 0, 0, 0); break; case 4: g_windowMgr.SendNotice(3, 0, 0, 0, 0, 0); - messageId = 0x37; + g_windowMgr.SendNotice(1, reinterpret_cast(LookupMessage(0x37)), 0xFF, 0, 0, 0); break; case 5: g_windowMgr.SendNotice(3, 0, 0, 0, 0, 0); - messageId = 0x1B0; + g_windowMgr.SendNotice(1, reinterpret_cast(LookupMessage(0x1B0)), 0xFF, 0, 0, 0); break; case 6: g_windowMgr.SendNotice(3, 0, 0, 0, 0, 0); - messageId = 0x1B1; + g_windowMgr.SendNotice(1, reinterpret_cast(LookupMessage(0x1B1)), 0xFF, 0, 0, 0); break; case 7: g_windowMgr.SendNotice(3, 0, 0, 0, 0, 0); - messageId = 0x1B2; + g_windowMgr.SendNotice(1, reinterpret_cast(LookupMessage(0x1B2)), 0xFF, 0, 0, 0); break; - default: - return; } - - g_windowMgr.SendNotice(1, reinterpret_cast(LookupMessage(messageId)), 0xFF, 0, 0, 0); } // OFFSET: 0x00D3E0B0 @@ -1375,45 +1365,45 @@ void CGameMode::ReceiveRequestResult(const unsigned char* packet) { // OFFSET: 0x00D3F760 // FUNCTION: fn_21813 void CGameMode::ReceiveStatusNotice(const unsigned char* packet) { - int message; + const char* message; switch (*reinterpret_cast(packet + 2)) { case 21: - message = 889; + message = LookupMessage(889); break; case 22: - message = 890; + message = LookupMessage(890); break; case 23: - message = 891; + message = LookupMessage(891); break; case 24: - message = 892; + message = LookupMessage(892); break; case 25: - message = 893; + message = LookupMessage(893); break; case 28: - message = 894; + message = LookupMessage(894); break; case 29: - message = 895; + message = LookupMessage(895); break; case 30: - message = 896; + message = LookupMessage(896); break; case 31: - message = 897; + message = LookupMessage(897); break; case 32: - message = 898; + message = LookupMessage(898); break; case 40: - message = 915; + message = LookupMessage(915); break; default: return; } - g_windowMgr.SendNotice(1, reinterpret_cast(LookupMessage(message)), 0x9B9BFF, 8, 0, 0); + g_windowMgr.SendNotice(1, reinterpret_cast(message), 0x9B9BFF, 8, 0, 0); } // OFFSET: 0x00D40080 @@ -2368,18 +2358,18 @@ void CGameMode::IgnoreRemovedPacket12(const unsigned char*, int, int, int, int) // FUNCTION: fn_22031 void CGameMode::ToggleWindow169(unsigned char enable) { UIWindow* window = g_windowMgr.LookupWindow(0x169); - if (enable == 0) { - if (window) { - g_windowMgr.CloseWindow(0x169); + if (enable != 0) { + if (!window) { + g_windowMgr.EnsureWindow(0x169); } - } else if (!window) { - g_windowMgr.EnsureWindow(0x169); + } else if (window) { + g_windowMgr.CloseWindow(0x169); } } #pragma pack(push, 1) struct RequestWindow169Packet { - /* 0000 */ std::uint16_t id; + /* 0000 */ std::int16_t id; /* 0002 */ unsigned char unknown_0002; }; #pragma pack(pop) @@ -2388,21 +2378,16 @@ struct RequestWindow169Packet { // FUNCTION: fn_22030 void CGameMode::RequestWindow169(unsigned char enable) { UIWindow* window = g_windowMgr.LookupWindow(0x169); - if (enable == 0) { - if (window) { - g_windowMgr.CloseWindow(0x169); + if (enable != 0) { + if (!window) { + RequestWindow169Packet packet; + packet.id = 0x0BE0; + packet.unknown_0002 = 0; + GetRagConnection().Send(g_packetLengths.FixedLength(packet.id), &packet); } - return; + } else if (window) { + g_windowMgr.CloseWindow(0x169); } - - if (window) { - return; - } - - RequestWindow169Packet packet; - packet.id = 0x0BE0; - packet.unknown_0002 = 0; - GetRagConnection().Send(g_packetLengths.FixedLength(packet.id), &packet); } // OFFSET: 0x00D66A60 @@ -2634,18 +2619,14 @@ void CGameMode::sub_D41250(const unsigned char* record) { packet.visible = 1; CSkill* skill = static_cast(this->scene->GetSkillByAID(data.aid)); - if (data.owner == g_session.m_aid) { - if (data.visible) { - this->m_skillUnitIds.push_back(packet.aid); - } - } else if (!data.visible) { + if (data.owner != g_session.m_aid && !data.visible) { const auto found = std::find(this->m_skillUnitIds.begin(), this->m_skillUnitIds.end(), packet.aid); if (found != this->m_skillUnitIds.end()) { this->m_skillUnitIds.erase(found); packet.visible = 0; data.visible = false; } - } else { + } else if (data.visible) { this->m_skillUnitIds.push_back(packet.aid); } @@ -2688,18 +2669,14 @@ void CGameMode::sub_D40730(const unsigned char* record) { } CSkill* skill = static_cast(this->scene->GetSkillByAID(data.aid)); - if (data.owner == g_session.m_aid) { - if (data.visible) { - this->m_skillUnitIds.push_back(packet.aid); - } - } else if (!data.visible) { + if (data.owner != g_session.m_aid && !data.visible) { const auto found = std::find(this->m_skillUnitIds.begin(), this->m_skillUnitIds.end(), packet.aid); if (found != this->m_skillUnitIds.end()) { this->m_skillUnitIds.erase(found); packet.visible = 0; data.visible = false; } - } else { + } else if (data.visible) { this->m_skillUnitIds.push_back(packet.aid); } @@ -2721,7 +2698,7 @@ void CGameMode::sub_D40730(const unsigned char* record) { void CGameMode::ReceiveGroundSkill8(const unsigned char* record) { const GroundSkillPacket8& packet = *reinterpret_cast(record); if (packet.type == 176) { - if (packet.length < 20) { + if (packet.length <= 19) { return; } CGraffiSkill* skill = new CGraffiSkill; @@ -2779,7 +2756,7 @@ void CGameMode::ReceiveGroundSkill8(const unsigned char* record) { void CGameMode::ReceiveGroundSkill32(const unsigned char* record) { const GroundSkillPacket32& packet = *reinterpret_cast(record); if (packet.type == 176) { - if (packet.length < 23) { + if (packet.length <= 22) { return; } CGraffiSkill* skill = new CGraffiSkill; @@ -2818,7 +2795,7 @@ void CGameMode::ReceiveGroundSkill32(const unsigned char* record) { CSkill* skill = static_cast(this->scene->GetSkillByAID(packet.aid)); if (!skill) { const int type = packet.type; - if (!((type >= 45 && type <= 999) || (type >= 1001 && type <= 3998) || + if (!((type >= 45 && type < 1000) || (type > 1000 && type < 3999) || static_cast(type) - 20021u <= 11978u)) { return; }