diff --git a/Source/Client/Mode/CGameMode.h b/Source/Client/Mode/CGameMode.h index 4a9a7459..db8ab039 100644 --- a/Source/Client/Mode/CGameMode.h +++ b/Source/Client/Mode/CGameMode.h @@ -735,6 +735,9 @@ public: void ReceiveActorStatusValue(std::uint32_t aid, int status, int amount, int option); void ReceiveActorSkillResult(const unsigned char* packet); void UpdateSkillCooldown(std::uint16_t skill, std::uint32_t remaining, std::uint32_t duration); + void LoadCooldownSnapshot(const void* packet); + void ApplyCooldownStart(const void* packet); + void LoadCooldownRecords(const void* packet); void sub_D5B030( std::uint32_t source, std::uint32_t target, std::uint16_t skill, std::uint16_t x, std::uint16_t y, int tick, int level, unsigned char flag, int result diff --git a/Source/Client/Mode/GameModeHandlers.cpp b/Source/Client/Mode/GameModeHandlers.cpp index da919fd0..253af6b9 100644 --- a/Source/Client/Mode/GameModeHandlers.cpp +++ b/Source/Client/Mode/GameModeHandlers.cpp @@ -2600,26 +2600,26 @@ void CGameMode::ReceiveSimulationResult(const unsigned char* packet) { // OFFSET: 0x00D415C0 // FUNCTION: fn_21825 void CGameMode::UpdateSkillCooldown(std::uint16_t skill, std::uint32_t remaining, std::uint32_t duration) { - SessionRequestTimer value; - value.requestId = skill; + ShortcutCooldownRecord value; + value.id = skill; const std::uint32_t now = g_replayAnimationScaling == 1 ? Replay::Instance().elapsed : timeGetTime(); - value.readyTime = now + remaining; + value.end = now + remaining; value.duration = duration; for (const ShortcutCooldownIcon& icon : g_session.m_mainCooldownIcons) { if (icon.id == skill) { - value.main.push_back(CooldownState(icon.slot, icon.x, icon.y, duration, value.readyTime - remaining, duration - remaining, 0)); + value.main.push_back(CooldownState(icon.slot, icon.x, icon.y, duration, value.end - remaining, duration - remaining, 0)); } } for (const ShortcutCooldownIcon& icon : g_session.m_alternateCooldownIcons) { if (icon.id == skill) { - value.alternate.push_back(CooldownState(icon.slot, icon.x, icon.y, duration, value.readyTime - remaining, duration - remaining, 0)); + value.alternate.push_back(CooldownState(icon.slot, icon.x, icon.y, duration, value.end - remaining, duration - remaining, 0)); } } - const auto found = std::find_if(g_session.m_requestTimers.begin(), g_session.m_requestTimers.end(), [skill](const SessionRequestTimer& timer) { - return timer.requestId == skill; + const auto found = std::find_if(g_session.m_requestTimers.begin(), g_session.m_requestTimers.end(), [skill](const ShortcutCooldownRecord& timer) { + return timer.id == skill; }); if (found == g_session.m_requestTimers.end()) { g_session.m_requestTimers.push_back(value); diff --git a/Source/Client/Mode/GameModePackets.cpp b/Source/Client/Mode/GameModePackets.cpp index b254a9f7..add9717a 100644 --- a/Source/Client/Mode/GameModePackets.cpp +++ b/Source/Client/Mode/GameModePackets.cpp @@ -4906,34 +4906,34 @@ void CGameMode::ApplyStatusChange( this->scene->player->SetUnknown0305(1, value2); } } else if (type == 46) { - SessionRequestTimer timer; - timer.requestId = 577; - timer.readyTime = now + remaining; + ShortcutCooldownRecord timer; + timer.id = 577; + timer.end = now + remaining; timer.duration = total; g_session.m_requestTimers.push_back(timer); } else if (type == 684) { - SessionRequestTimer timer; - timer.requestId = 9999; - timer.readyTime = now + remaining; + ShortcutCooldownRecord timer; + timer.id = 9999; + timer.end = now + remaining; timer.duration = total; g_session.m_requestTimers.push_back(timer); } else if (type == 175) { - SessionRequestTimer timer; + ShortcutCooldownRecord timer; for (int requestId = 10000; requestId < 10020; ++requestId) { - std::list::iterator it = g_session.m_requestTimers.begin(); + std::list::iterator it = g_session.m_requestTimers.begin(); for (; it != g_session.m_requestTimers.end(); ++it) { - if (it->requestId == requestId) { + if (it->id == requestId) { break; } } - timer.requestId = requestId; - timer.readyTime = now + remaining; + timer.id = requestId; + timer.end = now + remaining; timer.duration = total; if (it == g_session.m_requestTimers.end()) { g_session.m_requestTimers.push_back(timer); } else { - it->readyTime = timer.readyTime; + it->end = timer.end; } } } else if (type == 824) { diff --git a/Source/Client/Session.cpp b/Source/Client/Session.cpp index beb2bcbc..74d33235 100644 --- a/Source/Client/Session.cpp +++ b/Source/Client/Session.cpp @@ -2329,13 +2329,13 @@ ITEM_INFO CSession::GetItem61B8(int index) const { // OFFSET: 0x00E31DE0 // FUNCTION: fn_24177 bool CSession::IsRequestReady(int requestId) { - std::list::iterator it = this->m_requestTimers.begin(); + std::list::iterator it = this->m_requestTimers.begin(); for (; it != this->m_requestTimers.end(); ++it) { - if (requestId == it->requestId || it->requestId == 0x241) { + if (requestId == it->id || it->id == 0x241) { break; } } - if (it != this->m_requestTimers.end() && it->readyTime - 100 > timeGetTime()) { + if (it != this->m_requestTimers.end() && it->end - 100 > timeGetTime()) { return false; } return true; diff --git a/Source/Client/Session.h b/Source/Client/Session.h index a603b8e1..5ac9d914 100644 --- a/Source/Client/Session.h +++ b/Source/Client/Session.h @@ -107,14 +107,6 @@ struct ProhibitionLogEntry { /* 0034 */ char ownerName[32]; }; -struct SessionRequestTimer { - /* 0000 */ int requestId; - /* 0004 */ unsigned long readyTime; - /* 0008 */ std::uint32_t duration; - /* 000C */ std::list main; - /* 0014 */ std::list alternate; -}; - struct SessionRecord0734 { /* 0000 */ std::uint32_t unknown_0000 = 0; /* 0004 */ int id; @@ -384,7 +376,7 @@ public: /* 53A0 */ unsigned char unknown_53A0[0x30]; /* 53D0 */ unsigned char unknown_53D0[0x30]; /* 5400 */ unsigned char unknown_5400[0x40]; - /* 5440 */ std::list m_requestTimers; + /* 5440 */ std::list m_requestTimers; /* 5448 */ int unknown_5448; /* 544C */ unsigned char unknown_544C[0x04]; /* 5450 */ int unknown_5450; diff --git a/Source/UI/Shortcuts/ShortcutBindings.cpp b/Source/UI/Shortcuts/ShortcutBindings.cpp index 24796660..02e1dc8b 100644 --- a/Source/UI/Shortcuts/ShortcutBindings.cpp +++ b/Source/UI/Shortcuts/ShortcutBindings.cpp @@ -30,12 +30,12 @@ void CSession::AssignShortcut(unsigned char type, std::uint32_t id, int level, i const int rowStart = this->RotateShortcut(9 * this->m_hotkeyPage, bank); const int destination = this->RotateShortcut(slot, bank); CMode* modeEvents = g_modeMgr.GetGameMode(); - ShortcutCooldowns& cooldowns = reinterpret_cast(this->m_requestTimers); + std::list& cooldowns = this->m_requestTimers; if (id == 0) { if (type != 0) { bool erased = false; - for (ShortcutCooldownRecord& record : cooldowns.records) { + for (ShortcutCooldownRecord& record : cooldowns) { const auto value = std::find_if(record.main.begin(), record.main.end(), [&](const CooldownState& state) { return state.slot == slot; }); if (value != record.main.end()) { record.main.erase(value); @@ -75,8 +75,8 @@ void CSession::AssignShortcut(unsigned char type, std::uint32_t id, int level, i } const auto record = - std::find_if(cooldowns.records.begin(), cooldowns.records.end(), [&](const ShortcutCooldownRecord& value) { return value.id == id; }); - if (record != cooldowns.records.end() && record->end > timeGetTime()) { + std::find_if(cooldowns.begin(), cooldowns.end(), [&](const ShortcutCooldownRecord& value) { return value.id == id; }); + if (record != cooldowns.end() && record->end > timeGetTime()) { const int position = index + 9 * this->m_hotkeyPage - rowStart; const auto value = std::find_if(record->main.begin(), record->main.end(), [&](const CooldownState& state) { return state.slot == position; }); if (value != record->main.end()) { diff --git a/Source/UI/Shortcuts/ShortcutCooldowns.cpp b/Source/UI/Shortcuts/ShortcutCooldowns.cpp index ab84a884..0a313480 100644 --- a/Source/UI/Shortcuts/ShortcutCooldowns.cpp +++ b/Source/UI/Shortcuts/ShortcutCooldowns.cpp @@ -25,6 +25,8 @@ #include "Network/Packets/PacketLengths.h" #include "Utility/Text/FormatString.h" #include "UI/Shortcuts/ShortcutCooldowns.h" +#include "Client/Mode/CGameMode.h" +#include "Client/Replay.h" #include "Contents/Party/PartyBookingMgr.h" #include "Render/Text/FontCache.h" #include "Render/Text/TextContext.h" @@ -92,11 +94,8 @@ int CSession::IsSkillIdInRange6001(unsigned id) const { // OFFSET: 0x00D42070 // FUNCTION: fn_21827 -void ShortcutCooldowns::LoadSnapshot( - const void* packet, const std::list& mainIcons, const std::list& alternateIcons, int replayMode, - const std::uint32_t& serverTick -) { - this->records.clear(); +void CGameMode::LoadCooldownSnapshot(const void* packet) { + g_session.m_requestTimers.clear(); const auto* bytes = static_cast(packet); std::int16_t size; std::memcpy(&size, bytes + 2, sizeof(size)); @@ -110,74 +109,75 @@ void ShortcutCooldowns::LoadSnapshot( std::memcpy(&id, source, sizeof(id)); std::memcpy(&duration, source + 2, sizeof(duration)); std::memcpy(&remaining, source + 6, sizeof(remaining)); - const std::uint32_t now = replayMode == 1 ? serverTick : timeGetTime(); + const std::uint32_t now = g_replayAnimationScaling == 1 ? Replay::Instance().elapsed : timeGetTime(); ShortcutCooldownRecord value{id, now + remaining, duration, {}, {}}; - for (const ShortcutCooldownIcon& icon : mainIcons) { + for (const ShortcutCooldownIcon& icon : g_session.m_mainCooldownIcons) { if (icon.id == id) { value.main.emplace_back(icon.slot, icon.x, icon.y, duration, now, duration - remaining, 0); } } - for (const ShortcutCooldownIcon& icon : alternateIcons) { + for (const ShortcutCooldownIcon& icon : g_session.m_alternateCooldownIcons) { if (icon.id == id) { value.alternate.emplace_back(icon.slot, icon.x, icon.y, duration, now, duration - remaining, 0); } } - this->records.push_back(value); + g_session.m_requestTimers.push_back(value); } } // OFFSET: 0x00D41990 // FUNCTION: fn_21826 -void ShortcutCooldowns::ApplyStart( - const void* packet, const std::list& mainIcons, const std::list& alternateIcons, int replayMode, - const std::uint32_t& serverTick -) { +void CGameMode::ApplyCooldownStart(const void* packet) { const auto* bytes = static_cast(packet); std::uint16_t id; std::uint32_t duration; std::memcpy(&id, bytes + 2, sizeof(id)); std::memcpy(&duration, bytes + 4, sizeof(duration)); - const std::uint32_t now = replayMode == 1 ? serverTick : timeGetTime(); + const std::uint32_t now = g_replayAnimationScaling == 1 ? Replay::Instance().elapsed : timeGetTime(); ShortcutCooldownRecord value{id, now + duration, duration, {}, {}}; const auto find = [&]() { - return std::find_if(this->records.begin(), this->records.end(), [&](const ShortcutCooldownRecord& record) { return record.id == id; }); + return std::find_if(g_session.m_requestTimers.begin(), g_session.m_requestTimers.end(), [&](const ShortcutCooldownRecord& record) { return record.id == id; }); }; - for (const ShortcutCooldownIcon& icon : mainIcons) { + for (const ShortcutCooldownIcon& icon : g_session.m_mainCooldownIcons) { if (icon.id != id) { continue; } const auto entry = find(); - if (entry == this->records.end()) { + if (entry == g_session.m_requestTimers.end()) { value.main.push_back(CooldownState(icon.slot, icon.x, icon.y, duration, now, 0, 0)); - this->records.push_back(value); + g_session.m_requestTimers.push_back(value); } else { const auto slot = std::find_if(entry->main.begin(), entry->main.end(), [&](const CooldownState& state) { return state.slot == icon.slot; }); if (slot == entry->main.end()) { entry->main.push_back(CooldownState(icon.slot, icon.x, icon.y, duration, now, 0, 0)); } else { - this->records.erase(entry); + g_session.m_requestTimers.erase(entry); value.main.push_back(CooldownState(icon.slot, icon.x, icon.y, duration, now, 0, 0)); - this->records.push_back(value); + g_session.m_requestTimers.push_back(value); } } } - for (const ShortcutCooldownIcon& icon : alternateIcons) { - if (icon.id == id && find() == this->records.end()) { + for (const ShortcutCooldownIcon& icon : g_session.m_alternateCooldownIcons) { + if (icon.id == id && find() == g_session.m_requestTimers.end()) { value.alternate.push_back(CooldownState(icon.slot, icon.x, icon.y, duration, now, 0, 0)); - this->records.push_back(value); + g_session.m_requestTimers.push_back(value); } } } +void PaintCooldowns( + std::list& records, const std::list& icons, std::list ShortcutCooldownRecord::* values, int limit, int x, int y, CooldownDrawing& drawing +); + // INLINED -bool ShortcutCooldowns::RotateRows(int amount, int bank, int& rotation0, int& rotation1) { +bool RotateCooldownRows(std::list& records, int amount, int bank, int& rotation0, int& rotation1) { const int rows = amount < 4 ? amount : amount % 4; if (rows <= 0) { return false; @@ -193,9 +193,9 @@ bool ShortcutCooldowns::RotateRows(int amount, int bank, int& rotation0, int& ro const std::uint32_t now = CooldownNow(); - for (auto entry = this->records.begin(); entry != this->records.end();) { + for (auto entry = records.begin(); entry != records.end();) { if (entry->end <= now) { - entry = this->records.erase(entry); + entry = records.erase(entry); continue; } @@ -215,29 +215,29 @@ bool ShortcutCooldowns::RotateRows(int amount, int bank, int& rotation0, int& ro } // INLINED -void ShortcutCooldowns::PaintMain( - const std::list& icons, int rows, int x, int y, CooldownDrawing& drawing +void PaintMainCooldowns( + std::list& records, const std::list& icons, int rows, int x, int y, CooldownDrawing& drawing ) { const int limit = rows * 33 + 4; - this->Paint(icons, &ShortcutCooldownRecord::main, limit, x, y, drawing); + PaintCooldowns(records, icons, &ShortcutCooldownRecord::main, limit, x, y, drawing); } // INLINED -void ShortcutCooldowns::PaintAlternate( - const std::list& icons, int x, int y, CooldownDrawing& drawing +void PaintAlternateCooldowns( + std::list& records, const std::list& icons, int x, int y, CooldownDrawing& drawing ) { - this->Paint(icons, &ShortcutCooldownRecord::alternate, 0, x, y, drawing); + PaintCooldowns(records, icons, &ShortcutCooldownRecord::alternate, 0, x, y, drawing); } // INLINED -void ShortcutCooldowns::Paint( - const std::list& icons, std::list ShortcutCooldownRecord::* values, int limit, int x, int y, CooldownDrawing& drawing +void PaintCooldowns( + std::list& records, const std::list& icons, std::list ShortcutCooldownRecord::* values, int limit, int x, int y, CooldownDrawing& drawing ) { const std::uint32_t now = CooldownNow(); - for (auto entry = this->records.begin(); entry != this->records.end();) { + for (auto entry = records.begin(); entry != records.end();) { if (entry->end <= now) { - entry = this->records.erase(entry); + entry = records.erase(entry); continue; } @@ -445,7 +445,7 @@ void UIQuickSlotWnd::Paint() { } } - reinterpret_cast(g_session.m_requestTimers).PaintAlternate(g_session.m_alternateCooldownIcons, this->geometry.x, this->geometry.y, g_cooldownOwner->Drawing()); + PaintAlternateCooldowns(g_session.m_requestTimers, g_session.m_alternateCooldownIcons, this->geometry.x, this->geometry.y, g_cooldownOwner->Drawing()); } // OFFSET: 0x00924A50 @@ -618,7 +618,7 @@ void UISeekPartyListWnd::Slot11() { // OFFSET: 0x00D42590 // FUNCTION: fn_21828 -void ShortcutCooldowns::LoadRecords(const void* packet) { +void CGameMode::LoadCooldownRecords(const void* packet) { const auto* bytes = static_cast(packet); std::int16_t size; std::memcpy(&size, bytes + 2, sizeof(size)); @@ -633,7 +633,7 @@ void ShortcutCooldowns::LoadRecords(const void* packet) { std::memcpy(&remaining, source + 2, sizeof(remaining)); value.id = id; value.end = timeGetTime() + remaining; - this->records.push_back(value); + g_session.m_requestTimers.push_back(value); } } diff --git a/Source/UI/Shortcuts/ShortcutCooldowns.h b/Source/UI/Shortcuts/ShortcutCooldowns.h index fbf2bc21..57e903ec 100644 --- a/Source/UI/Shortcuts/ShortcutCooldowns.h +++ b/Source/UI/Shortcuts/ShortcutCooldowns.h @@ -21,37 +21,17 @@ struct ShortcutCooldownRecord { /* 0014 */ std::list alternate; }; -struct ShortcutCooldowns { - /* 0000 */ std::list records; - - void LoadSnapshot( - const void* packet, const std::list& mainIcons, const std::list& alternateIcons, int replayMode, - const std::uint32_t& serverTick - ); - void ApplyStart( - const void* packet, const std::list& mainIcons, const std::list& alternateIcons, int replayMode, - const std::uint32_t& serverTick - ); - void LoadRecords(const void* packet); - bool RotateRows(int amount, int bank, int& rotation0, int& rotation1); - - void PaintMain( - const std::list& icons, int rows, int x, int y, CooldownDrawing& drawing - ); - void PaintAlternate( - const std::list& icons, int x, int y, CooldownDrawing& drawing - ); - -private: - void Paint( - const std::list& icons, std::list ShortcutCooldownRecord::* values, int limit, int x, int y, CooldownDrawing& drawing - ); -}; +bool RotateCooldownRows(std::list& records, int amount, int bank, int& rotation0, int& rotation1); +void PaintMainCooldowns( + std::list& records, const std::list& icons, int rows, int x, int y, CooldownDrawing& drawing +); +void PaintAlternateCooldowns( + std::list& records, const std::list& icons, int x, int y, CooldownDrawing& drawing +); static_assert(sizeof(ShortcutCooldownIcon) == 16); #if defined(_WIN32) && !defined(_WIN64) static_assert(sizeof(ShortcutCooldownRecord) == 28); -static_assert(sizeof(ShortcutCooldowns) == 8); static_assert(offsetof(ShortcutCooldownIcon, id) == 0x0000); static_assert(offsetof(ShortcutCooldownIcon, slot) == 0x0004); static_assert(offsetof(ShortcutCooldownIcon, x) == 0x0008); @@ -61,7 +41,6 @@ static_assert(offsetof(ShortcutCooldownRecord, end) == 0x0004); static_assert(offsetof(ShortcutCooldownRecord, duration) == 0x0008); static_assert(offsetof(ShortcutCooldownRecord, main) == 0x000C); static_assert(offsetof(ShortcutCooldownRecord, alternate) == 0x0014); -static_assert(offsetof(ShortcutCooldowns, records) == 0x0000); #endif #endif diff --git a/Source/UI/Shortcuts/ShortcutDrop.cpp b/Source/UI/Shortcuts/ShortcutDrop.cpp index 6168423a..db511be2 100644 --- a/Source/UI/Shortcuts/ShortcutDrop.cpp +++ b/Source/UI/Shortcuts/ShortcutDrop.cpp @@ -25,8 +25,8 @@ namespace { } // INLINED - void RemoveFirst(ShortcutCooldowns& cooldowns, int slot) { - for (ShortcutCooldownRecord& record : cooldowns.records) { + void RemoveFirst(std::list& cooldowns, int slot) { + for (ShortcutCooldownRecord& record : cooldowns) { const auto value = std::find_if(record.main.begin(), record.main.end(), [&](const CooldownState& state) { return state.slot == slot; }); if (value != record.main.end()) { record.main.erase(value); @@ -70,17 +70,17 @@ void UIShortCutWnd::Slot10(int x, int y, std::intptr_t argument) { g_session.AssignShortcut(1, skill.id, value.skillLevel, index, bank); if (originalSlot != index) { - RemoveFirst(reinterpret_cast(g_session.m_requestTimers), index); + RemoveFirst(g_session.m_requestTimers, index); } const std::uint32_t key = Grouped(skill.id) ? 9999 : skill.id; const auto record = - std::find_if(reinterpret_cast(g_session.m_requestTimers).records.begin(), reinterpret_cast(g_session.m_requestTimers).records.end(), [&](const ShortcutCooldownRecord& entry) { + std::find_if(g_session.m_requestTimers.begin(), g_session.m_requestTimers.end(), [&](const ShortcutCooldownRecord& entry) { return entry.id == key; }); - if (record != reinterpret_cast(g_session.m_requestTimers).records.end() && record->end > timeGetTime()) { + if (record != g_session.m_requestTimers.end() && record->end > timeGetTime()) { const auto previous = std::find_if(record->main.begin(), record->main.end(), [&](const CooldownState& state) { return state.slot == originalSlot; }); const int targetX = 29 * column + 16; const int targetY = 33 * g_session.m_hotkeyPage + 4; @@ -98,11 +98,11 @@ void UIShortCutWnd::Slot10(int x, int y, std::intptr_t argument) { CSkillInfo skill = g_session.LookupSkill(id); const std::uint32_t key = Grouped(skill.id) ? 9999 : skill.id; const auto record = - std::find_if(reinterpret_cast(g_session.m_requestTimers).records.begin(), reinterpret_cast(g_session.m_requestTimers).records.end(), [&](const ShortcutCooldownRecord& entry) { + std::find_if(g_session.m_requestTimers.begin(), g_session.m_requestTimers.end(), [&](const ShortcutCooldownRecord& entry) { return entry.id == key; }); - if (record != reinterpret_cast(g_session.m_requestTimers).records.end()) { + if (record != g_session.m_requestTimers.end()) { const auto previous = std::find_if(record->main.begin(), record->main.end(), [&](const CooldownState& state) { return state.slot == originalSlot; }); if (previous != record->main.end()) { record->main.erase(previous); @@ -155,7 +155,7 @@ void UIShortCutWnd::Slot10(int x, int y, std::intptr_t argument) { const int index = 9 * g_session.m_hotkeyPage + column; g_session.AssignShortcut(0, static_cast(item.GetItemId()), 0, index, bank); if (value.slot != index) { - RemoveFirst(reinterpret_cast(g_session.m_requestTimers), index); + RemoveFirst(g_session.m_requestTimers, index); } Refresh(window); @@ -168,8 +168,8 @@ void UIShortCutWnd::Slot10(int x, int y, std::intptr_t argument) { namespace { // INLINED - void RemoveAlternate(ShortcutCooldowns& cooldowns, int source, int slot) { - for (ShortcutCooldownRecord& record : cooldowns.records) { + void RemoveAlternate(std::list& cooldowns, int source, int slot) { + for (ShortcutCooldownRecord& record : cooldowns) { if (source == slot) { continue; } @@ -188,7 +188,7 @@ namespace { // FUNCTION: fn_12588 void UIQuickSlotWnd::Slot10(int x, int y, std::intptr_t argument) { const ModeDragState& value = *reinterpret_cast(argument); - std::list& records = reinterpret_cast(g_session.m_requestTimers).records; + std::list& records = g_session.m_requestTimers; if (value.skill != 0) { const std::string copiedName(value.skillName.c_str(), value.skillName.size()); @@ -197,7 +197,7 @@ void UIQuickSlotWnd::Slot10(int x, int y, std::intptr_t argument) { CSkillInfo skill = g_session.LookupSkill(value.id); if (skill.level != 0 && skill.available != 0) { g_session.SetHotkeyEntry(1, skill.id, value.skillLevel, slot); - RemoveAlternate(reinterpret_cast(g_session.m_requestTimers), value.slot, slot); + RemoveAlternate(g_session.m_requestTimers, value.slot, slot); const std::uint32_t key = Grouped(skill.id) ? 9999 : skill.id; const std::list::iterator record = @@ -266,7 +266,7 @@ void UIQuickSlotWnd::Slot10(int x, int y, std::intptr_t argument) { const int slot = this->SlotAt(x, y); if (slot != -1) { g_session.SetHotkeyEntry(0, item.GetItemId(), 0, slot); - RemoveAlternate(reinterpret_cast(g_session.m_requestTimers), value.slot, slot); + RemoveAlternate(g_session.m_requestTimers, value.slot, slot); this->SendMsg(nullptr, 23, 0, 0, 0, 0); this->Invalidate(); } diff --git a/Source/UI/Shortcuts/ShortcutPainting.cpp b/Source/UI/Shortcuts/ShortcutPainting.cpp index c690be0b..15cae20d 100644 --- a/Source/UI/Shortcuts/ShortcutPainting.cpp +++ b/Source/UI/Shortcuts/ShortcutPainting.cpp @@ -178,6 +178,5 @@ void UIShortCutWnd::Paint() { window.DrawTextAt(6, ((row * 33) + 13), text, 0, 0, 11, 0x2F4A4A, 0, 0); } - reinterpret_cast(g_session.m_requestTimers) - .PaintMain(g_session.m_mainCooldownIcons, grid.rows, window.geometry.x, window.geometry.y, g_cooldownOwner->Drawing()); + PaintMainCooldowns(g_session.m_requestTimers, g_session.m_mainCooldownIcons, grid.rows, window.geometry.x, window.geometry.y, g_cooldownOwner->Drawing()); } diff --git a/Source/UI/Shortcuts/UIQuickSlotWnd.cpp b/Source/UI/Shortcuts/UIQuickSlotWnd.cpp index 8c417d94..f039c820 100644 --- a/Source/UI/Shortcuts/UIQuickSlotWnd.cpp +++ b/Source/UI/Shortcuts/UIQuickSlotWnd.cpp @@ -209,7 +209,7 @@ int UIQuickSlotWnd::SendMsg(UIWindow* sender, int message, std::intptr_t argumen CSkillInfo skill = g_session.m_skillBundle.Lookup(source.itemId); if (skill.available == 0) { - std::list& records = reinterpret_cast(g_session.m_requestTimers).records; + std::list& records = g_session.m_requestTimers; const auto record = std::find_if(records.begin(), records.end(), [&](const ShortcutCooldownRecord& value) { return value.id == source.itemId; }); if (record != records.end()) { const auto state = std::find_if(record->alternate.begin(), record->alternate.end(), [&](const CooldownState& value) { return value.slot == index; }); diff --git a/Source/UI/Shortcuts/UIShortCutWnd.cpp b/Source/UI/Shortcuts/UIShortCutWnd.cpp index 0ee26fa8..f59c735b 100644 --- a/Source/UI/Shortcuts/UIShortCutWnd.cpp +++ b/Source/UI/Shortcuts/UIShortCutWnd.cpp @@ -202,7 +202,7 @@ inline void UIShortCutWnd::ClickControl(int id) { this->m_bank->geometry.unknown_0030 = checked ? 1 : 0; this->m_bank->Invalidate(); - for (ShortcutCooldownRecord& record : reinterpret_cast(g_session.m_requestTimers).records) { + for (ShortcutCooldownRecord& record : g_session.m_requestTimers) { record.main.clear(); } @@ -371,7 +371,7 @@ int UIShortCutWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std:: return 0; case 23: { - ShortcutCooldowns& cooldowns = reinterpret_cast(g_session.m_requestTimers); + std::list& cooldowns = g_session.m_requestTimers; for (int index = 0; index < 36; ++index) { const int source = g_session.RotateShortcut(index, g_session.unknown_06FC); if (g_session.unknown_06FC == 0 || g_session.unknown_06FC == 1) { @@ -385,10 +385,10 @@ int UIShortCutWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std:: CSkillInfo skill = g_session.m_skillBundle.Lookup(slot.itemId); if (skill.available == 0) { - const auto record = std::find_if(cooldowns.records.begin(), cooldowns.records.end(), [&](const ShortcutCooldownRecord& value) { + const auto record = std::find_if(cooldowns.begin(), cooldowns.end(), [&](const ShortcutCooldownRecord& value) { return value.id == slot.itemId; }); - if (record != cooldowns.records.end()) { + if (record != cooldowns.end()) { const auto value = std::find_if(record->main.begin(), record->main.end(), [&](const CooldownState& state) { return state.slot == index; }); if (value != record->main.end()) { record->main.erase(value); @@ -428,7 +428,7 @@ int UIShortCutWnd::SendMsg(UIWindow* sender, int message, std::intptr_t a, std:: } case 143: - if (reinterpret_cast(g_session.m_requestTimers).RotateRows(static_cast(a), static_cast(b), g_session.unknown_06FC, g_session.unknown_06A8)) { + if (RotateCooldownRows(g_session.m_requestTimers, static_cast(a), static_cast(b), g_session.unknown_06FC, g_session.unknown_06A8)) { this->SendMsg(nullptr, 23, 0, 0, 0, 0); }