diff --git a/zone/client.h b/zone/client.h index c48ea2237..beaf191b4 100644 --- a/zone/client.h +++ b/zone/client.h @@ -985,6 +985,7 @@ public: bool MemorizeSpellFromItem(uint32 item_id); void TrainDiscBySpellID(int32 spell_id); uint32 GetDisciplineTimer(uint32 timer_id); + void ResetAllDisciplineTimers(); int GetDiscSlotBySpellID(int32 spellid); void ResetDisciplineTimer(uint32 timer_id); void SendDisciplineUpdate(); diff --git a/zone/effects.cpp b/zone/effects.cpp index b68887ad9..17a600634 100644 --- a/zone/effects.cpp +++ b/zone/effects.cpp @@ -722,7 +722,7 @@ bool Client::UseDiscipline(uint32 spell_id, uint32 target) { uint32 Client::GetDisciplineTimer(uint32 timer_id) { pTimerType disc_timer_id = pTimerDisciplineReuseStart + timer_id; uint32 disc_timer = 0; - if (GetPTimers().Enabled((uint32)disc_timer_id)) { + if (GetPTimers().Enabled(disc_timer_id)) { disc_timer = GetPTimers().GetRemainingTime(disc_timer_id); } return disc_timer; @@ -730,12 +730,22 @@ uint32 Client::GetDisciplineTimer(uint32 timer_id) { void Client::ResetDisciplineTimer(uint32 timer_id) { pTimerType disc_timer_id = pTimerDisciplineReuseStart + timer_id; - if (GetPTimers().Enabled((uint32)disc_timer_id)) { - GetPTimers().Clear(&database, (uint32)disc_timer_id); + if (GetPTimers().Enabled(disc_timer_id)) { + GetPTimers().Clear(&database, disc_timer_id); } SendDisciplineTimer(timer_id, 0); } +void Client::ResetAllDisciplineTimers() { + for (pTimerType disc_timer_id = pTimerDisciplineReuseStart; disc_timer_id <= pTimerDisciplineReuseEnd; disc_timer_id++) { + uint32 current_timer_id = (disc_timer_id - pTimerDisciplineReuseStart); + if (GetPTimers().Enabled(disc_timer_id)) { + GetPTimers().Clear(&database, disc_timer_id); + } + SendDisciplineTimer(current_timer_id, 0); + } +} + bool Client::HasDisciplineLearned(uint16 spell_id) { bool has_learned = false; for (auto index = 0; index < MAX_PP_DISCIPLINES; ++index) { diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index 6d700a689..501b9d5de 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -2098,6 +2098,11 @@ void Lua_Client::SetHideMe(bool hide_me_state) { self->SetHideMe(hide_me_state); } +void Lua_Client::ResetAllDisciplineTimers() { + Lua_Safe_Call_Void(); + self->ResetAllDisciplineTimers(); +} + luabind::scope lua_register_client() { return luabind::class_("Client") .def(luabind::constructor<>()) @@ -2453,7 +2458,8 @@ luabind::scope lua_register_client() { .def("SetEXPModifier", (void(Lua_Client::*)(uint32,double))&Lua_Client::SetEXPModifier) .def("AddLDoNLoss", (void(Lua_Client::*)(uint32))&Lua_Client::AddLDoNLoss) .def("AddLDoNWin", (void(Lua_Client::*)(uint32))&Lua_Client::AddLDoNWin) - .def("SetHideMe", (void(Lua_Client::*)(bool))&Lua_Client::SetHideMe); + .def("SetHideMe", (void(Lua_Client::*)(bool))&Lua_Client::SetHideMe) + .def("ResetAllDisciplineTimers", (void(Lua_Client::*)(void))&Lua_Client::ResetAllDisciplineTimers); } luabind::scope lua_register_inventory_where() { diff --git a/zone/lua_client.h b/zone/lua_client.h index 60c11fbbb..28465d57a 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -230,6 +230,7 @@ public: void ResetTrade(); uint32 GetDisciplineTimer(uint32 timer_id); void ResetDisciplineTimer(uint32 timer_id); + void ResetAllDisciplineTimers(); bool UseDiscipline(int spell_id, int target_id); bool HasDisciplineLearned(uint16 spell_id); int GetCharacterFactionLevel(int faction_id); diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index 60efbf787..034611fb4 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -5332,6 +5332,19 @@ XS(XS_Client_SetHideMe) { XSRETURN_EMPTY; } +XS(XS_Client_ResetAllDisciplineTimers); +XS(XS_Client_ResetAllDisciplineTimers) { + dXSARGS; + if (items != 1) + Perl_croak(aTHX_ "Usage: Client::ResetAllDisciplineTimers(THIS)"); // @categories Spells and Disciplines + { + Client *THIS; + VALIDATE_THIS_IS_CLIENT; + THIS->ResetAllDisciplineTimers(); + } + XSRETURN_EMPTY; +} + #ifdef __cplusplus extern "C" #endif @@ -5552,6 +5565,7 @@ XS(boot_Client) { newXSproto(strcpy(buf, "RemoveExpeditionLockout"), XS_Client_RemoveExpeditionLockout, file, "$$$"); newXSproto(strcpy(buf, "RemoveNoRent"), XS_Client_RemoveNoRent, file, "$"); newXSproto(strcpy(buf, "ResetAA"), XS_Client_ResetAA, file, "$"); + newXSproto(strcpy(buf, "ResetAllDisciplineTimers"), XS_Client_ResetAllDisciplineTimers, file, "$"); newXSproto(strcpy(buf, "ResetDisciplineTimer"), XS_Client_ResetDisciplineTimer, file, "$$"); newXSproto(strcpy(buf, "ResetTrade"), XS_Client_ResetTrade, file, "$"); newXSproto(strcpy(buf, "Save"), XS_Client_Save, file, "$$");