Maintenance: [forced, user-approved] Family S3: remove ShortcutCooldowns (17 reinterpret_cast<ShortcutCooldowns&>(g_session.m_request

Batch #10274 by ragnarok-clanker: forced by an admin (3 lower score(s), 9 changed function(s)); checked with 348 compiled unit(s), including every includer of Source/Client/Mode/CGameMode.h, Source/Client/Session.h, Source/UI/Shortcuts/ShortcutCooldowns.h.
This commit is contained in:
ragnarok-clanker 2026-11-03 15:12:40 +00:00
commit 514c8dc0cd
12 changed files with 96 additions and 123 deletions

View file

@ -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

View file

@ -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);

View file

@ -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<SessionRequestTimer>::iterator it = g_session.m_requestTimers.begin();
std::list<ShortcutCooldownRecord>::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) {

View file

@ -2329,13 +2329,13 @@ ITEM_INFO CSession::GetItem61B8(int index) const {
// OFFSET: 0x00E31DE0
// FUNCTION: fn_24177
bool CSession::IsRequestReady(int requestId) {
std::list<SessionRequestTimer>::iterator it = this->m_requestTimers.begin();
std::list<ShortcutCooldownRecord>::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;

View file

@ -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<CooldownState> main;
/* 0014 */ std::list<CooldownState> 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<SessionRequestTimer> m_requestTimers;
/* 5440 */ std::list<ShortcutCooldownRecord> m_requestTimers;
/* 5448 */ int unknown_5448;
/* 544C */ unsigned char unknown_544C[0x04];
/* 5450 */ int unknown_5450;

View file

@ -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<ShortcutCooldowns&>(this->m_requestTimers);
std::list<ShortcutCooldownRecord>& 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()) {

View file

@ -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<ShortcutCooldownIcon>& mainIcons, const std::list<ShortcutCooldownIcon>& 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<const unsigned char*>(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<ShortcutCooldownIcon>& mainIcons, const std::list<ShortcutCooldownIcon>& alternateIcons, int replayMode,
const std::uint32_t& serverTick
) {
void CGameMode::ApplyCooldownStart(const void* packet) {
const auto* bytes = static_cast<const unsigned char*>(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<ShortcutCooldownRecord>& records, const std::list<ShortcutCooldownIcon>& icons, std::list<CooldownState> 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<ShortcutCooldownRecord>& 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<ShortcutCooldownIcon>& icons, int rows, int x, int y, CooldownDrawing& drawing
void PaintMainCooldowns(
std::list<ShortcutCooldownRecord>& records, const std::list<ShortcutCooldownIcon>& 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<ShortcutCooldownIcon>& icons, int x, int y, CooldownDrawing& drawing
void PaintAlternateCooldowns(
std::list<ShortcutCooldownRecord>& records, const std::list<ShortcutCooldownIcon>& 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<ShortcutCooldownIcon>& icons, std::list<CooldownState> ShortcutCooldownRecord::* values, int limit, int x, int y, CooldownDrawing& drawing
void PaintCooldowns(
std::list<ShortcutCooldownRecord>& records, const std::list<ShortcutCooldownIcon>& icons, std::list<CooldownState> 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<ShortcutCooldowns&>(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<const unsigned char*>(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);
}
}

View file

@ -21,37 +21,17 @@ struct ShortcutCooldownRecord {
/* 0014 */ std::list<CooldownState> alternate;
};
struct ShortcutCooldowns {
/* 0000 */ std::list<ShortcutCooldownRecord> records;
void LoadSnapshot(
const void* packet, const std::list<ShortcutCooldownIcon>& mainIcons, const std::list<ShortcutCooldownIcon>& alternateIcons, int replayMode,
const std::uint32_t& serverTick
);
void ApplyStart(
const void* packet, const std::list<ShortcutCooldownIcon>& mainIcons, const std::list<ShortcutCooldownIcon>& 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<ShortcutCooldownIcon>& icons, int rows, int x, int y, CooldownDrawing& drawing
);
void PaintAlternate(
const std::list<ShortcutCooldownIcon>& icons, int x, int y, CooldownDrawing& drawing
);
private:
void Paint(
const std::list<ShortcutCooldownIcon>& icons, std::list<CooldownState> ShortcutCooldownRecord::* values, int limit, int x, int y, CooldownDrawing& drawing
);
};
bool RotateCooldownRows(std::list<ShortcutCooldownRecord>& records, int amount, int bank, int& rotation0, int& rotation1);
void PaintMainCooldowns(
std::list<ShortcutCooldownRecord>& records, const std::list<ShortcutCooldownIcon>& icons, int rows, int x, int y, CooldownDrawing& drawing
);
void PaintAlternateCooldowns(
std::list<ShortcutCooldownRecord>& records, const std::list<ShortcutCooldownIcon>& 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

View file

@ -25,8 +25,8 @@ namespace {
}
// INLINED
void RemoveFirst(ShortcutCooldowns& cooldowns, int slot) {
for (ShortcutCooldownRecord& record : cooldowns.records) {
void RemoveFirst(std::list<ShortcutCooldownRecord>& 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<ShortcutCooldowns&>(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<ShortcutCooldowns&>(g_session.m_requestTimers).records.begin(), reinterpret_cast<ShortcutCooldowns&>(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<ShortcutCooldowns&>(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<ShortcutCooldowns&>(g_session.m_requestTimers).records.begin(), reinterpret_cast<ShortcutCooldowns&>(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<ShortcutCooldowns&>(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<std::uint32_t>(item.GetItemId()), 0, index, bank);
if (value.slot != index) {
RemoveFirst(reinterpret_cast<ShortcutCooldowns&>(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<ShortcutCooldownRecord>& 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<const ModeDragState*>(argument);
std::list<ShortcutCooldownRecord>& records = reinterpret_cast<ShortcutCooldowns&>(g_session.m_requestTimers).records;
std::list<ShortcutCooldownRecord>& 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<ShortcutCooldowns&>(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<ShortcutCooldownRecord>::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<ShortcutCooldowns&>(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();
}

View file

@ -178,6 +178,5 @@ void UIShortCutWnd::Paint() {
window.DrawTextAt(6, ((row * 33) + 13), text, 0, 0, 11, 0x2F4A4A, 0, 0);
}
reinterpret_cast<ShortcutCooldowns&>(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());
}

View file

@ -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<ShortcutCooldownRecord>& records = reinterpret_cast<ShortcutCooldowns&>(g_session.m_requestTimers).records;
std::list<ShortcutCooldownRecord>& 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; });

View file

@ -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<ShortcutCooldowns&>(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<ShortcutCooldowns&>(g_session.m_requestTimers);
std::list<ShortcutCooldownRecord>& 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<ShortcutCooldowns&>(g_session.m_requestTimers).RotateRows(static_cast<int>(a), static_cast<int>(b), g_session.unknown_06FC, g_session.unknown_06A8)) {
if (RotateCooldownRows(g_session.m_requestTimers, static_cast<int>(a), static_cast<int>(b), g_session.unknown_06FC, g_session.unknown_06A8)) {
this->SendMsg(nullptr, 23, 0, 0, 0, 0);
}