diff --git a/Source/Client/ReplayPacketRecorder.h b/Source/Client/ReplayPacketRecorder.h index 1c6d9b2..6f0b8c2 100644 --- a/Source/Client/ReplayPacketRecorder.h +++ b/Source/Client/ReplayPacketRecorder.h @@ -5,7 +5,7 @@ #include #include -struct PacketLengths; +class PacketLengths; struct ReplayPacketRecorder { const PacketLengths& lengths; diff --git a/Source/Contents/Emblems/EmblemUpload.h b/Source/Contents/Emblems/EmblemUpload.h index 8acd6f9..361440a 100644 --- a/Source/Contents/Emblems/EmblemUpload.h +++ b/Source/Contents/Emblems/EmblemUpload.h @@ -4,7 +4,7 @@ #include class CConnection; -struct PacketLengths; +class PacketLengths; struct WindowDialogs; struct EmblemUploadContext { diff --git a/Source/Contents/World/WorldProximity.h b/Source/Contents/World/WorldProximity.h index 5f85263..3bbab78 100644 --- a/Source/Contents/World/WorldProximity.h +++ b/Source/Contents/World/WorldProximity.h @@ -5,7 +5,7 @@ #include class CConnection; -struct PacketLengths; +class PacketLengths; void UpdateWorldProximityNotification( unsigned char& notified, std::function nearby, CConnection& connection, const PacketLengths& lengths, const std::uint32_t& accountId diff --git a/Source/Network/Connection/Connection.h b/Source/Network/Connection/Connection.h index 33b0aef..0276682 100644 --- a/Source/Network/Connection/Connection.h +++ b/Source/Network/Connection/Connection.h @@ -7,7 +7,7 @@ #include class CRenderSystemBase; -struct PacketLengths; +class PacketLengths; struct ConnectionEndpoint { const char* address; diff --git a/Source/Network/Packets/PacketLengths.cpp b/Source/Network/Packets/PacketLengths.cpp index 308efc6..a2aaa0c 100644 --- a/Source/Network/Packets/PacketLengths.cpp +++ b/Source/Network/Packets/PacketLengths.cpp @@ -2,11 +2,14 @@ #include +// GLOBAL: gl_24489 +PacketLengths g_packetLengths; + // OFFSET: 0x00B09E50 // FUNCTION: fn_18388 PacketLengthResult PacketLengths::Lookup(int id) const { - const auto entry = this->values.find(id); - if (entry == this->values.end()) { + const auto entry = this->m_values.find(id); + if (entry == this->m_values.end()) { return {-1, 4}; } @@ -32,7 +35,7 @@ int PacketLengths::FixedLength(int id) const { return 4; } - return std::max(this->Lookup(id).length, 2); + return std::max(g_packetLengths.Lookup(id).length, 2); } namespace { @@ -51,15 +54,21 @@ namespace { // OFFSET: 0x00B02260 // FUNCTION: fn_18387 -void PacketLengths::Initialize(std::map& values) { +void PacketLengths::Initialize() { for (const PacketRegistration& value : registrations) { - values.try_emplace(value.id, PacketLengthValue{value.length, value.variable, value.record}); + this->m_values.try_emplace(value.id, PacketLengthValue{value.length, value.variable, value.record}); } } +// OFFSET: 0x00B01E70 +// FUNCTION: fn_18383 +PacketLengths::PacketLengths() { + this->Initialize(); +} + // OFFSET: 0x00B02210 // FUNCTION: fn_18386 int PacketLengths::IsRecorded(int id) const { - const auto entry = this->values.find(id); - return entry == this->values.end() ? 0 : entry->second.record; + const auto entry = this->m_values.find(id); + return entry == this->m_values.end() ? 0 : entry->second.record; } diff --git a/Source/Network/Packets/PacketLengths.h b/Source/Network/Packets/PacketLengths.h index 6d132d4..80ff8a5 100644 --- a/Source/Network/Packets/PacketLengths.h +++ b/Source/Network/Packets/PacketLengths.h @@ -15,20 +15,27 @@ struct PacketLengthResult { /* 0004 */ int length; }; -struct PacketLengths { - const std::map& values; +class PacketLengths { +public: + PacketLengths(); PacketLengthResult Lookup(int id) const; int FixedLength(int id) const; int IsRecorded(int id) const; - static void Initialize(std::map& values); + +private: + /* 0000 */ std::map m_values; + void Initialize(); }; +extern PacketLengths g_packetLengths; + #if defined(_WIN32) && !defined(_WIN64) static_assert(sizeof(PacketLengthValue) == 0x0C); static_assert(offsetof(PacketLengthValue, variable) == 0x04); static_assert(offsetof(PacketLengthValue, record) == 0x08); static_assert(sizeof(PacketLengthResult) == 0x08); static_assert(offsetof(PacketLengthResult, length) == 0x04); +static_assert(sizeof(PacketLengths) == 0x08); #endif #endif diff --git a/Source/Network/Packets/PartyJoinPacket.h b/Source/Network/Packets/PartyJoinPacket.h index 6f14a3b..1bc1241 100644 --- a/Source/Network/Packets/PartyJoinPacket.h +++ b/Source/Network/Packets/PartyJoinPacket.h @@ -10,7 +10,7 @@ #include class CConnection; -struct PacketLengths; +class PacketLengths; class WindowManagerWindows; void SendPartyJoin(CConnection& connection, const PacketLengths& lengths, const std::uint32_t* accountId, const std::uint32_t* characterId); diff --git a/Source/Network/Packets/ShortcutPacket.h b/Source/Network/Packets/ShortcutPacket.h index f3e9f1e..09ea380 100644 --- a/Source/Network/Packets/ShortcutPacket.h +++ b/Source/Network/Packets/ShortcutPacket.h @@ -10,7 +10,7 @@ struct NormalItemSlot; class CConnection; -struct PacketLengths; +class PacketLengths; void SendShortcutUpdate( CConnection& connection, const PacketLengths& lengths, int index, int bank, const NormalItemSlot* bank0, const NormalItemSlot* bank1, diff --git a/Source/Resource/ResourceFailures.cpp b/Source/Resource/ResourceFailures.cpp index ea9320a..95c6f5f 100644 --- a/Source/Resource/ResourceFailures.cpp +++ b/Source/Resource/ResourceFailures.cpp @@ -1,16 +1,16 @@ #include "Resource/ResourceFailures.h" +#include "UI/Window/UIWindowMgr.h" #include "Utility/Threading/NSyncObject.h" +#include #include -// INLINED -ResourceFailures::ResourceFailures(ResourceMessages& messages) : m_messages(&messages) { - InitializeCriticalSection(&this->m_lock); -} +// GLOBAL: gl_24582 +ResourceFailures g_resourceFailures; // INLINED -ResourceFailures::~ResourceFailures() { - DeleteCriticalSection(&this->m_lock); +ResourceFailures::ResourceFailures() { + InitializeCriticalSection(&this->m_lock); } // OFFSET: 0x00AEE310 @@ -27,8 +27,8 @@ void ResourceFailures::Report(std::string requested, std::string resolved) { report = this->m_reported.insert(resolved).second; } if (report) { - this->m_messages->Message("Resource File Loading fail", 255); - this->m_messages->Message(requested.c_str(), 255); - this->m_messages->Message(resolved.c_str(), 255); + g_windowMgr.SendMsg(1, reinterpret_cast("Resource File Loading fail"), 255, 0, 0, 0); + g_windowMgr.SendMsg(1, reinterpret_cast(requested.c_str()), 255, 0, 0, 0); + g_windowMgr.SendMsg(1, reinterpret_cast(resolved.c_str()), 255, 0, 0, 0); } } diff --git a/Source/Resource/ResourceFailures.h b/Source/Resource/ResourceFailures.h index fc7978a..7bb6d15 100644 --- a/Source/Resource/ResourceFailures.h +++ b/Source/Resource/ResourceFailures.h @@ -1,6 +1,7 @@ #ifndef RAGNAROK_SOURCE_RESOURCE_RESOURCEFAILURES_H #define RAGNAROK_SOURCE_RESOURCE_RESOURCEFAILURES_H +#include #include #include #include @@ -13,16 +14,27 @@ protected: ~ResourceMessages() = default; }; +// VTABLE: vt_01619 class ResourceFailures { public: - explicit ResourceFailures(ResourceMessages& messages); - ~ResourceFailures(); + ResourceFailures(); + virtual ~ResourceFailures() = default; void Report(std::string requested, std::string resolved); + /* 0004 */ CRITICAL_SECTION m_lock; + /* 001C */ std::set m_reported; + private: - CRITICAL_SECTION m_lock; - std::set m_reported; - ResourceMessages* m_messages; + ResourceFailures(const ResourceFailures&) = delete; + ResourceFailures& operator=(const ResourceFailures&) = delete; }; +extern ResourceFailures g_resourceFailures; + +#if defined(_WIN32) && !defined(_WIN64) +static_assert(offsetof(ResourceFailures, m_lock) == 0x04); +static_assert(offsetof(ResourceFailures, m_reported) == 0x1C); +static_assert(sizeof(ResourceFailures) == 0x24); +#endif + #endif diff --git a/Source/Resource/ResourceMgr.cpp b/Source/Resource/ResourceMgr.cpp index 625a2bd..b85c372 100644 --- a/Source/Resource/ResourceMgr.cpp +++ b/Source/Resource/ResourceMgr.cpp @@ -153,7 +153,7 @@ __forceinline CRes* ResourceMgr::LoadNamed(const char* name) { lock.reset(); if (resolved.find("\\map\\") == std::string::npos) { - this->m_failures->Report(name, resolved); + g_resourceFailures.Report(name, resolved); } return nullptr; diff --git a/Source/Resource/ResourceMgr.h b/Source/Resource/ResourceMgr.h index 79d95cc..452c99a 100644 --- a/Source/Resource/ResourceMgr.h +++ b/Source/Resource/ResourceMgr.h @@ -9,8 +9,6 @@ #include #include -class ResourceFailures; - struct ResourceNameLess { bool operator()(const ResourceName* left, const ResourceName* right) const; }; @@ -41,7 +39,6 @@ private: std::vector> m_resources; CRITICAL_SECTION m_lock; std::vector m_transient; - ResourceFailures* m_failures; std::uint32_t unknown_004C[17]; void EraseTransient(CRes* resource); CRes* LoadNamed(const char* name); diff --git a/Source/UI/Window/UIWindowMgr.h b/Source/UI/Window/UIWindowMgr.h index 8e1fd2b..9fcc139 100644 --- a/Source/UI/Window/UIWindowMgr.h +++ b/Source/UI/Window/UIWindowMgr.h @@ -434,6 +434,7 @@ public: char UpdateSnapRectangles(); bool ProcessDialogKey(int unused, int key); void NotifyMode(); + int SendMsg(int message, std::intptr_t argument1, std::intptr_t argument2, std::intptr_t argument3, std::intptr_t argument4, std::intptr_t argument5); }; extern UIWindowMgr g_windowMgr;