diff --git a/Source/Client/Session.h b/Source/Client/Session.h index 1cd946cb..9003e8a1 100644 --- a/Source/Client/Session.h +++ b/Source/Client/Session.h @@ -433,9 +433,11 @@ public: /* 807C */ unsigned char unknown_807C[0x38]; /* 80B4 */ std::map m_nameToId; /* 80BC */ std::map m_shops; - /* 80C4 */ unsigned char unknown_80C4[4]; + /* 80C4 */ int m_damageSkinIndex; /* 80C8 */ int unknown_80C8; - /* 80CC */ unsigned char unknown_80CC[0x20]; + /* 80CC */ int m_damageSkinMode; + /* 80D0 */ int m_damageMillionUnit; + /* 80D4 */ std::string m_damageResourceName; /* 80EC */ std::string unknown_80EC; /* 8104 */ std::string unknown_8104; /* 811C */ std::vector m_cardItems; @@ -471,6 +473,8 @@ public: void LoadNavigationScripts(); bool IsNavigationAllowed() const; void LoadRobeAlpha(); + void LoadDamageSkinSettings(); + void ClearHomunStatus(); std::pair* InsertPair(int key, int value); int SetPairValue(int value, int slot); int GetPairValue() const; @@ -659,6 +663,7 @@ public: std::uint32_t ReadReplayShops(const std::vector& data); std::uint32_t ReadReplayExtra(const std::vector& data); std::uint32_t ReadReplayReserved(const std::vector& data); + std::uint32_t ReadReplayEntryQueue(const std::vector& data); void SetHomunculusAutoFeed(bool enabled); void SetPetAutoFeed(bool enabled); void SendHomunculusAutoFeedOption(unsigned char enabled); diff --git a/Source/Contents/ClientState.cpp b/Source/Contents/ClientState.cpp index a24fb27c..2bce25e3 100644 --- a/Source/Contents/ClientState.cpp +++ b/Source/Contents/ClientState.cpp @@ -4,8 +4,10 @@ #include "Client/Mode/ModeMgr.h" #include "Client/Session.h" #include "Contents/Actors/Pc.h" +#include "Contents/EntryQueueMgr.h" #include "Contents/MessageTable.h" #include "Contents/World/World.h" +#include "UI/EntryQueue/UIEntryQueueWnd.h" #include "UI/Window/UIWindow.h" #include "UI/Window/UIWindowMgr.h" @@ -944,3 +946,99 @@ void CSession::SetUnknown5BC0(int value) { void AppendBytes(std::vector& output, const std::vector& bytes) { output.insert(output.end(), bytes.begin(), bytes.end()); } + +// OFFSET: 0x00E44EE0 +// FUNCTION: fn_24208 +std::uint32_t CSession::ReadReplayEntryQueue(const std::vector& data) { + if (data.begin() == data.end()) { + return 0xFFFFFFFF; + } + + int waiting; + int ranking; + std::uint32_t offset = 6; + ReplayBlockHeader header{}; + std::memcpy(&header, data.data(), sizeof(header)); + if (header.id != 6500) { + return 0xFFFFFFFF; + } + + while (offset < data.size()) { + header = {}; + std::memcpy(&header, data.data() + offset, sizeof(header)); + offset += 6; + const unsigned char* source = data.data() + offset; + switch (header.id) { + case 6501: + return offset; + case 6511: { + int queueId = 0; + std::memcpy(&queueId, source, header.bytes); + offset += header.bytes; + for (const auto& entry : g_entryQueueList) { + if (queueId == entry.second->id) { + g_entryQueueMgr->current = entry.second; + } + } + break; + } + case 6512: { + unsigned char ready = 1; + std::memcpy(&ready, source, header.bytes); + offset += header.bytes; + g_entryQueueMgr->ready = ready; + break; + } + case 6513: { + char queueName[0x30]; + std::memset(queueName, 0, sizeof(queueName)); + std::memcpy(queueName, source, header.bytes); + offset += header.bytes; + g_entryQueueMgr->SetQueueName(*reinterpret_cast(queueName)); + break; + } + case 6514: { + char characterName[0x30]; + std::memset(characterName, 0, sizeof(characterName)); + std::memcpy(characterName, source, header.bytes); + offset += header.bytes; + g_entryQueueMgr->SetCharacterName(*reinterpret_cast(characterName)); + break; + } + case 6515: { + int value; + std::memcpy(&value, source, header.bytes); + offset += header.bytes; + UIEntryQueueWnd* window = dynamic_cast(g_windowMgr.LookupWindow(157)); + if (window) { + window->SendMsg(nullptr, 135, 0, value, 0, 0); + } + break; + } + case 6516: { + char queueText[100]; + std::memset(queueText, 0, sizeof(queueText)); + std::memcpy(queueText, source, header.bytes); + offset += header.bytes; + UIEntryQueueStandByWnd* window = dynamic_cast(g_windowMgr.LookupWindow(209)); + if (window) { + window->SetInfo(queueText, waiting, ranking); + } + break; + } + case 6517: + std::memcpy(&waiting, source, header.bytes); + offset += header.bytes; + break; + case 6518: + std::memcpy(&ranking, source, header.bytes); + offset += header.bytes; + break; + default: + offset += header.bytes; + break; + } + } + + return offset; +} diff --git a/Source/Contents/ClientTiming.cpp b/Source/Contents/ClientTiming.cpp index ae62e0f4..92440563 100644 --- a/Source/Contents/ClientTiming.cpp +++ b/Source/Contents/ClientTiming.cpp @@ -728,3 +728,41 @@ std::uint32_t CSession::SyncServerTime(std::uint32_t serverTime) { this->m_serverTimeAdjustCount = 0; return serverTime + 144; } + +// OFFSET: 0x00DE4D80 +// FUNCTION: fn_23490 +void CSession::LoadDamageSkinSettings() { + g_luaScript->Call("GetDamageSkinSize", ">d", &this->unknown_80C8); + if (this->m_damageSkinIndex < 0 || this->m_damageSkinIndex >= this->unknown_80C8) { + this->m_damageSkinIndex = 0; + } + if (this->m_damageSkinMode < 0 || this->m_damageSkinMode >= 4) { + this->m_damageSkinMode = 0; + } + + const char* resourceName = nullptr; + const char* name80EC = nullptr; + const char* name8104 = nullptr; + g_luaScript->Call("GetDamageResourceName", "d>sss", this->m_damageSkinIndex, &resourceName, &name80EC, &name8104); + if (resourceName) { + this->m_damageResourceName = resourceName; + } + if (name80EC) { + this->unknown_80EC = name80EC; + } + if (name8104) { + this->unknown_8104 = name8104; + } + g_luaScript->Call("GetDamageMillionUnit", "d>d", this->m_damageSkinIndex, &this->m_damageMillionUnit); +} + +// OFFSET: 0x00DE5B40 +// FUNCTION: fn_23493 +void CSession::ClearHomunStatus() { + this->unknown_5608 = 0; + this->unknown_560C = 0; + this->unknown_5610 = 0; + this->unknown_55FC = 0; + this->unknown_5600 = 0; + this->unknown_5604 = 0; +}