From bf22aa5b62fc0737628f33e7d9784ce17ace0d47 Mon Sep 17 00:00:00 2001 From: ragnarok-clanker Date: Fri, 6 Nov 2026 19:10:41 +0000 Subject: [PATCH] Maintenance: Forced (approved by the maintainer: small score loss accepted for correct behaviour). Resubmission of 13479. CSession+0x Batch #13484 by ragnarok-clanker: forced by an admin (1 lower score(s), 3 changed function(s)); checked with 266 compiled unit(s), including every includer of Source/Client/Session.h. --- Source/Client/Mode/GameModeNotices.cpp | 14 +++++++------- Source/Client/Mode/GameModePackets.cpp | 2 +- Source/Client/Session.cpp | 7 ++++++- Source/Client/Session.h | 11 ++++++++++- Source/Contents/Messenger/ClientMessenger.cpp | 2 +- Source/Contents/ShowRankingScheduler.cpp | 2 +- Source/UI/Acceptance/UIChooseSellBuyWnd.cpp | 10 +++++----- 7 files changed, 31 insertions(+), 17 deletions(-) diff --git a/Source/Client/Mode/GameModeNotices.cpp b/Source/Client/Mode/GameModeNotices.cpp index debc64efa..b226c6d1a 100644 --- a/Source/Client/Mode/GameModeNotices.cpp +++ b/Source/Client/Mode/GameModeNotices.cpp @@ -380,22 +380,22 @@ void CGameMode::ReceiveStatusChange(const unsigned char* data) { reinterpret_cast(g_session.unknown_169C)[5] = packet->value; break; case 0xF7: - reinterpret_cast(&g_session.unknown_7FC0[0x20])[0] = packet->value; + g_session.m_traits.points[0] = packet->value; break; case 0xF8: - reinterpret_cast(&g_session.unknown_7FC0[0x20])[1] = packet->value; + g_session.m_traits.points[1] = packet->value; break; case 0xF9: - reinterpret_cast(&g_session.unknown_7FC0[0x20])[2] = packet->value; + g_session.m_traits.points[2] = packet->value; break; case 0xFA: - reinterpret_cast(&g_session.unknown_7FC0[0x20])[3] = packet->value; + g_session.m_traits.points[3] = packet->value; break; case 0xFB: - reinterpret_cast(&g_session.unknown_7FC0[0x20])[4] = packet->value; + g_session.m_traits.points[4] = packet->value; break; case 0xFC: - reinterpret_cast(&g_session.unknown_7FC0[0x20])[5] = packet->value; + g_session.m_traits.points[5] = packet->value; break; default: if (UIWindow* window = reinterpret_cast(g_windowMgr.unknown_01C4)) { @@ -3926,7 +3926,7 @@ void CGameMode::ReceiveVendingItemSoldNow(const unsigned char* data) { void CGameMode::ReceiveTraitStatusChangeAck(unsigned char result, unsigned short statusId, unsigned char value) { this->unknown_02D4 = 0; if (result == 1) { - std::map& traitStats = reinterpret_cast&>(g_session.unknown_7FC0); + std::map& traitStats = g_session.m_traits.stats; traitStats[statusId] = value; if (UIStatusWnd* window = reinterpret_cast(g_windowMgr.unknown_01C4)) { window->ValidatePlacement(); diff --git a/Source/Client/Mode/GameModePackets.cpp b/Source/Client/Mode/GameModePackets.cpp index 5f1aaf44d..1b651f485 100644 --- a/Source/Client/Mode/GameModePackets.cpp +++ b/Source/Client/Mode/GameModePackets.cpp @@ -4211,7 +4211,7 @@ public: // FUNCTION: fn_21869 void CGameMode::ReceiveStatusBonus(const unsigned char* data) { const StatusBonusPacket* packet = reinterpret_cast(data); - int* traitBonus = reinterpret_cast(g_session.unknown_7FC0 + 8); + int* traitBonus = g_session.m_traits.bonus; switch (packet->type) { case 13: g_session.m_standardStats[0] = packet->value; diff --git a/Source/Client/Session.cpp b/Source/Client/Session.cpp index c562554f4..aecb3b4e5 100644 --- a/Source/Client/Session.cpp +++ b/Source/Client/Session.cpp @@ -3160,7 +3160,7 @@ void CSession::ResetCharacterState() { std::memset(&this->unknown_07F4[0x40], 0, 0x660); this->unknown_5C1C = 0; - std::map& traitStats = reinterpret_cast&>(this->unknown_7FC0); + std::map& traitStats = this->m_traits.stats; traitStats[0xE7] = 0; traitStats[0xDB] = 0; traitStats[0xDC] = 0; @@ -4662,6 +4662,11 @@ EncryptedName<13, 0x4B670715D543C1C3ULL>& DruidRidingName(); EncryptedName<14, 0x7155E5EF0DFB0D03ULL>& KarnosRidingName(); EncryptedName<14, 0x4B1D078937DB892BULL>& AliteaRidingName(); +// OFFSET: 0x00DC2710 +// FUNCTION: fn_22757 +SessionTraits::SessionTraits() { +} + // OFFSET: 0x00DC2B20 // FUNCTION: fn_22763 CSession::CSession() { diff --git a/Source/Client/Session.h b/Source/Client/Session.h index 46d00e292..6c7ecdcbb 100644 --- a/Source/Client/Session.h +++ b/Source/Client/Session.h @@ -165,6 +165,15 @@ struct SessionEntry00A4 { /* 0024 */ std::vector values; }; +struct SessionTraits { + SessionTraits(); + + /* 0000 */ std::map stats; + /* 0008 */ int bonus[6]; + /* 0020 */ std::int64_t points[6]; +}; +static_assert(sizeof(SessionTraits) == 0x50); + class CSession { public: void IconPath(char* output, const char* id, int identified); @@ -601,7 +610,7 @@ public: /* 7FA8 */ CInstantVar m_options; /* 7FB4 */ AutomaticSkills m_automaticSkills; /* 7FBC */ int unknown_7FBC; - /* 7FC0 */ unsigned char unknown_7FC0[0x50]; + /* 7FC0 */ SessionTraits m_traits; /* 8010 */ CMCStoreInfoBackup m_storeInfoBackup; /* 8074 */ int unknown_8074; /* 8078 */ const char* const* m_jobSpriteNames; diff --git a/Source/Contents/Messenger/ClientMessenger.cpp b/Source/Contents/Messenger/ClientMessenger.cpp index c503c767e..77b87d7f7 100644 --- a/Source/Contents/Messenger/ClientMessenger.cpp +++ b/Source/Contents/Messenger/ClientMessenger.cpp @@ -4794,7 +4794,7 @@ int GetPlayerValue(lua_State* state) { ++number; } - std::map& traitStats = reinterpret_cast&>(g_session.unknown_7FC0); + std::map& traitStats = g_session.m_traits.stats; int value = 0; switch (args[0]) { case 7: diff --git a/Source/Contents/ShowRankingScheduler.cpp b/Source/Contents/ShowRankingScheduler.cpp index 8c9b2b70f..022bd231d 100644 --- a/Source/Contents/ShowRankingScheduler.cpp +++ b/Source/Contents/ShowRankingScheduler.cpp @@ -167,6 +167,6 @@ void CSession::SetShowRankingSchedule(bool show, const void* data) { // OFFSET: 0x00D18AB0 // FUNCTION: fn_21599 void CSession::SetTraitStat(int type, int value) { - std::map& traitStats = reinterpret_cast&>(this->unknown_7FC0); + std::map& traitStats = this->m_traits.stats; traitStats[type] = value; } diff --git a/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp b/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp index acd6c520e..5ce3685a3 100644 --- a/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp +++ b/Source/UI/Acceptance/UIChooseSellBuyWnd.cpp @@ -1612,8 +1612,8 @@ void UIStatusWnd::Paint() { return; } - const int* traitBonus = reinterpret_cast(g_session.unknown_7FC0 + 8); - const std::int64_t* traitPoints = reinterpret_cast(&g_session.unknown_7FC0[0x20]); + const int* traitBonus = g_session.m_traits.bonus; + const std::int64_t* traitPoints = g_session.m_traits.points; const int bonuses[6] = {traitBonus[0], traitBonus[1], traitBonus[2], traitBonus[3], traitBonus[4], traitBonus[5]}; const std::int64_t points[6] = {traitPoints[0], traitPoints[1], traitPoints[2], traitPoints[3], traitPoints[4], traitPoints[5]}; const int types[6] = {219, 220, 221, 222, 223, 224}; @@ -8418,7 +8418,7 @@ static __forceinline void RequestStatusPointUp(UIStatusWnd* window, CMode* mode, // INLINED static __forceinline void RequestTraitPointUp(CMode* mode, int index) { - if (g_session.GetTraitStat(231) > 0 && reinterpret_cast(&g_session.unknown_7FC0[0x20])[index] > 0) { + if (g_session.GetTraitStat(231) > 0 && g_session.m_traits.points[index] > 0) { mode->SendMsg(314, 219 + index, 1, 0, 0); } } @@ -8543,7 +8543,7 @@ int UIStatusWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std::in } } else { std::int64_t traitCosts[6]; - std::memcpy(traitCosts, &g_session.unknown_7FC0[0x20], sizeof(traitCosts)); + std::memcpy(traitCosts, g_session.m_traits.points, sizeof(traitCosts)); y = 145; for (int i = 0; i < 6; ++i, y += 16) { if (traitCosts[i] != 0) { @@ -9651,7 +9651,7 @@ std::string CartTypeName(int type) { // OFFSET: 0x008D7460 // FUNCTION: fn_12119 int CSession::GetTraitStat(int type) { - std::map& traitStats = reinterpret_cast&>(this->unknown_7FC0); + std::map& traitStats = this->m_traits.stats; return traitStats[type]; }