From 637a82a2afcb8fe5c62d05e8a823345fd1c9414d Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Wed, 28 Oct 2026 20:10:27 +0000 Subject: [PATCH] Decompile 4 functions in Source/Contents/Messenger/ClientMessenger.cpp Batch #1683 by eAthena: 0 byte-identical, 4 confirmed by peer review. - fn_23305 SessionItemLists::ClearItems1780: logic confirmed by peer review - fn_23306 SessionItemLists::KeepEquipment: logic confirmed by peer review - fn_23307 SessionItemLists::ClearTradeItems: logic confirmed by peer review - fn_23310 SessionItemLists::RemoveEquipment: logic confirmed by peer review Reviewed-by: ragnarok-clanker --- Source/Contents/Messenger/ClientMessenger.cpp | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/Source/Contents/Messenger/ClientMessenger.cpp b/Source/Contents/Messenger/ClientMessenger.cpp index 2f0f0d3..e483f04 100644 --- a/Source/Contents/Messenger/ClientMessenger.cpp +++ b/Source/Contents/Messenger/ClientMessenger.cpp @@ -1,5 +1,34 @@ #include "Contents/Messenger/ClientMessenger.h" #include "Contents/Effects/PartyMemberEffects.h" +#include "Contents/Items/ItemInfo.h" +#include "UI/Window/UIWindowMgr.h" + +#include +#include + +void __fastcall RefreshItemWindows(UIWindowMgr* mgr); + +struct SessionItemLists { + /* 0000 */ unsigned char unknown_0000[0x1710]; + /* 1710 */ std::list inventory; + /* 1718 */ std::list items_1718; + /* 1720 */ std::list items_1720; + /* 1728 */ std::list items_1728; + /* 1730 */ std::list items_1730; + /* 1738 */ unsigned char unknown_1738[0x48]; + /* 1780 */ std::list items_1780[11]; + + void ClearItems1780(); + void KeepEquipment(); + void RemoveEquipment(); + void ClearTradeItems(); +}; + +#if defined(_WIN32) && !defined(_WIN64) +static_assert(offsetof(SessionItemLists, inventory) == 0x1710); +static_assert(offsetof(SessionItemLists, items_1730) == 0x1730); +static_assert(offsetof(SessionItemLists, items_1780) == 0x1780); +#endif // OFFSET: 0x00DDFFE0 // FUNCTION: fn_23451 @@ -376,3 +405,69 @@ int SessionMessengerContext::GetList1Size() const { int SessionMessengerContext::GetList5Size() const { return static_cast(this->lists[5].size()); } + +// OFFSET: 0x00DD8380 +// FUNCTION: fn_23305 +void SessionItemLists::ClearItems1780() { + for (std::list& items : this->items_1780) { + items.clear(); + } +} + +// OFFSET: 0x00DD8450 +// FUNCTION: fn_23306 +void SessionItemLists::KeepEquipment() { + for (auto entry = this->inventory.begin(); entry != this->inventory.end();) { + switch (entry->unknown_0000[0]) { + case 4: + case 5: + case 8: + case 9: + case 11: + case 12: + case 13: + case 14: + case 15: + ++entry; + break; + default: + entry = this->inventory.erase(entry); + break; + } + } + + RefreshItemWindows(&g_windowMgr); +} + +// OFFSET: 0x00DD8540 +// FUNCTION: fn_23307 +void SessionItemLists::ClearTradeItems() { + this->items_1720.erase(this->items_1720.begin(), this->items_1720.end()); + this->items_1730.erase(this->items_1730.begin(), this->items_1730.end()); + this->items_1718.erase(this->items_1718.begin(), this->items_1718.end()); +} + +// OFFSET: 0x00DD8660 +// FUNCTION: fn_23310 +void SessionItemLists::RemoveEquipment() { + for (auto entry = this->inventory.begin(); entry != this->inventory.end();) { + switch (entry->unknown_0000[0]) { + case 4: + case 5: + case 8: + case 9: + case 11: + case 12: + case 13: + case 14: + case 15: + entry = this->inventory.erase(entry); + break; + default: + ++entry; + break; + } + } + + RefreshItemWindows(&g_windowMgr); +}