From fb63cd1811fa577d8d0f6d794fdbaede28f57fd6 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Sat, 31 Oct 2026 06:50:19 +0000 Subject: [PATCH] Decompile 3 functions in Source/Contents/Messenger/ClientMessenger.cpp, Source/Client/Mode/CGameMode.h Batch #7338 by eAthena: 0 byte-identical, 3 confirmed by peer review. - fn_06173 EquipmentProperties::CEquipmentPropertiesMgr::GetUnknown01DC: logic confirmed by peer review - fn_06292 SetEquipTempValue: logic confirmed by peer review - fn_21741 CGameMode::Zc_Mer_Init: logic confirmed by peer review Peer-reviewed-by: meitogi, gordaoprogramas, aDw Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes). --- Source/Contents/Messenger/ClientMessenger.cpp | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/Source/Contents/Messenger/ClientMessenger.cpp b/Source/Contents/Messenger/ClientMessenger.cpp index be22cf08..b392265a 100644 --- a/Source/Contents/Messenger/ClientMessenger.cpp +++ b/Source/Contents/Messenger/ClientMessenger.cpp @@ -4116,6 +4116,20 @@ void CGameMode::ReceiveShopItemList(const unsigned char* data) { } // OFFSET: 0x006AC320 +// FUNCTION: fn_06173 +int EquipmentProperties::CEquipmentPropertiesMgr::GetUnknown01DC(const int& first, const int& second, const int& third) { + auto outer = this->unknown_01DC.find(first); + if (outer != this->unknown_01DC.end()) { + auto middle = outer->second.find(second); + if (middle != outer->second.end()) { + auto inner = middle->second.find(third); + if (inner != middle->second.end()) { + return inner->second.value; + } + } + } + return 0; +} // OFFSET: 0x006BD9D0 // FUNCTION: fn_06279 @@ -4139,6 +4153,23 @@ int GetEquipTempValue(lua_State* state) { } // OFFSET: 0x006BF3F0 +// FUNCTION: fn_06292 +int SetEquipTempValue(lua_State* state) { + std::vector args; + int number = 0; + for (int index = -2; index < 0; ++index) { + if (!lua_isnumber(state, index)) { + lua_pushboolean(state, 0); + lua_pushstring(state, std::format("arg{0} is must number", number + 1).c_str()); + return 2; + } + args.push_back(static_cast(lua_tonumber(state, index))); + ++number; + } + + EquipmentProperties::CEquipmentPropertiesMgr::GetInstance()->GetUnknown019C()[args[0]].value = args[1]; + return 0; +} #pragma pack(push, 1) struct MercenaryInitPacket { @@ -4163,3 +4194,37 @@ static_assert(offsetof(MercenaryInitPacket, name) == 0x16); static_assert(offsetof(MercenaryInitPacket, attackRange) == 0x4E); // OFFSET: 0x00D322A0 +// FUNCTION: fn_21741 +void CGameMode::Zc_Mer_Init(const unsigned char* data) { + const MercenaryInitPacket* packet = reinterpret_cast(data); + g_session.m_mercSkills.clear(); + CRenderObject* actor = this->scene->GetGameActorByAID(packet->aid); + *reinterpret_cast(&g_session.unknown_5620[8]) = packet->aid; + g_session.unknown_56B0 = 1; + if (actor != nullptr) { + g_session.m_mercenaryClass = static_cast(actor)->GetEffectiveJob(-1); + } + sprintf(g_session.m_mercenaryName, packet->name); + g_session.m_mercenaryStats[0] = packet->stats[0]; + g_session.m_mercenaryStats[1] = packet->stats[1]; + g_session.m_mercenaryStats[2] = packet->stats[2]; + g_session.m_mercenaryStats[3] = packet->stats[3]; + g_session.m_mercenaryStats[4] = packet->stats[4]; + g_session.m_mercenaryStats[5] = packet->stats[5]; + g_session.m_mercenaryStats[6] = packet->stats[6]; + g_session.m_mercenaryStats[7] = packet->stats[7]; + g_session.m_mercenaryLevel = packet->level; + g_session.m_mercenaryHp = packet->hp; + g_session.RefreshMercenaryInfo(); + g_session.m_mercenarySp = packet->sp; + g_session.RefreshMercenaryInfo(); + g_session.m_mercenaryMaxHp = packet->maxHp; + g_session.RefreshMercenaryInfo(); + g_session.m_mercenaryMaxSp = packet->maxSp; + g_session.RefreshMercenaryInfo(); + g_session.m_mercenaryLoyalty = packet->loyalty; + g_session.m_mercenarySummons = packet->summons; + g_session.m_mercenaryKills = packet->kills; + *reinterpret_cast(&g_session.unknown_5690[0]) = packet->attackRange; + g_session.m_mercenaryExpiration = packet->expiration; +}