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:
parent
8cd42aee81
commit
514c8dc0cd
12 changed files with 96 additions and 123 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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; });
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue