From 66896a312171020ea5e80e07038ff68d11784400 Mon Sep 17 00:00:00 2001 From: Natedog2012 Date: Mon, 30 Jan 2023 00:04:06 -0600 Subject: [PATCH] =?UTF-8?q?[Quest=20API]=20Add=20GetItemCooldown=20to=20re?= =?UTF-8?q?turn=20the=20time=20remaining=20on=20items=E2=80=A6=20(#2811)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Quest API] Add GetItemCooldown to return the time remaining on items in seconds * Change GetItemCooldown to uint32 for timers up to 130 years --- zone/client.cpp | 23 +++++++++++++++++++++++ zone/client.h | 1 + zone/lua_client.cpp | 7 +++++++ zone/lua_client.h | 1 + zone/perl_client.cpp | 6 ++++++ 5 files changed, 38 insertions(+) diff --git a/zone/client.cpp b/zone/client.cpp index e3452d29b..0908c2bb6 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -10563,6 +10563,29 @@ void Client::SetItemCooldown(uint32 item_id, bool use_saved_timer, uint32 in_sec SendItemRecastTimer(recast_type, final_time, true); } +uint32 Client::GetItemCooldown(uint32 item_id) +{ + const EQ::ItemData* item_d = database.GetItem(item_id); + if (!item_d) { + return 0; + } + + int recast_type = item_d->RecastType; + auto timestamps = database.GetItemRecastTimestamps(CharacterID()); + const auto timer_type = recast_type != RECAST_TYPE_UNLINKED_ITEM ? recast_type : item_id; + uint32 total_time = 0; + uint32 current_time = static_cast(std::time(nullptr)); + uint32 final_time = 0; + + total_time = timestamps.count(timer_type) ? timestamps.at(timer_type) : 0; + + if (total_time > current_time) { + final_time = total_time - current_time; + } + + return final_time; +} + void Client::RemoveItem(uint32 item_id, uint32 quantity) { EQ::ItemInstance *item = nullptr; diff --git a/zone/client.h b/zone/client.h index 17f1bc871..66053dfaa 100644 --- a/zone/client.h +++ b/zone/client.h @@ -968,6 +968,7 @@ public: int CountItem(uint32 item_id); void ResetItemCooldown(uint32 item_id); void SetItemCooldown(uint32 item_id, bool use_saved_timer = false, uint32 in_seconds = 1); + uint32 GetItemCooldown(uint32 item_id); void RemoveItem(uint32 item_id, uint32 quantity = 1); bool SwapItem(MoveItem_Struct* move_in); void SwapItemResync(MoveItem_Struct* move_slots); diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index c1a8ee9da..9c515f6a0 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -3026,6 +3026,12 @@ void Lua_Client::SetItemCooldown(uint32 item_id, uint32 in_time) self->SetItemCooldown(item_id, false, in_time); } +uint32 Lua_Client::GetItemCooldown(uint32 item_id) +{ + Lua_Safe_Call_Int(); + return self->GetItemCooldown(item_id); +} + luabind::scope lua_register_client() { return luabind::class_("Client") .def(luabind::constructor<>()) @@ -3216,6 +3222,7 @@ luabind::scope lua_register_client() { .def("GetInventory", (Lua_Inventory(Lua_Client::*)(void))&Lua_Client::GetInventory) .def("GetInvulnerableEnvironmentDamage", (bool(Lua_Client::*)(void))&Lua_Client::GetInvulnerableEnvironmentDamage) .def("GetItemIDAt", (int(Lua_Client::*)(int))&Lua_Client::GetItemIDAt) + .def("GetItemCooldown", (uint32(Lua_Client::*)(uint32))&Lua_Client::GetItemCooldown) .def("GetLDoNLosses", (int(Lua_Client::*)(void))&Lua_Client::GetLDoNLosses) .def("GetLDoNLossesTheme", (int(Lua_Client::*)(int))&Lua_Client::GetLDoNLossesTheme) .def("GetLDoNPointsTheme", (int(Lua_Client::*)(int))&Lua_Client::GetLDoNPointsTheme) diff --git a/zone/lua_client.h b/zone/lua_client.h index 8faa2242f..5bc1d6cce 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -464,6 +464,7 @@ public: void SendPath(Lua_Mob target); void ResetItemCooldown(uint32 item_id); void SetItemCooldown(uint32 item_id, uint32 in_time); + uint32 GetItemCooldown(uint32 item_id); void ApplySpell(int spell_id); void ApplySpell(int spell_id, int duration); diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index 18c2ed80d..0bd48639f 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -2882,6 +2882,11 @@ void Perl_Client_SetItemCooldown(Client* self, uint32 item_id, uint32 in_time) self->SetItemCooldown(item_id, false, in_time); } +uint32 Perl_Client_GetItemCooldown(Client* self, uint32 item_id) +{ + return self->GetItemCooldown(item_id); +} + void perl_register_client() { perl::interpreter perl(PERL_GET_THX); @@ -3076,6 +3081,7 @@ void perl_register_client() package.add("GetInventory", &Perl_Client_GetInventory); package.add("GetInvulnerableEnvironmentDamage", &Perl_Client_GetInvulnerableEnvironmentDamage); package.add("GetItemAt", &Perl_Client_GetItemAt); + package.add("GetItemCooldown", &Perl_Client_GetItemCooldown); package.add("GetItemIDAt", &Perl_Client_GetItemIDAt); package.add("GetItemInInventory", &Perl_Client_GetItemInInventory); package.add("GetLDoNLosses", &Perl_Client_GetLDoNLosses);