From 2f5d360e53294eb96afd8178162288dec0427ce8 Mon Sep 17 00:00:00 2001 From: Kinglykrab <89047260+Kinglykrab@users.noreply.github.com> Date: Fri, 1 Oct 2021 23:14:56 -0400 Subject: [PATCH] [Quest API] Add UntrainDiscBySpellID(spell_id, update_client) to Perl/Lua. (#1565) - Add $client->UntrainDiscBySpellID(spell_id, update_client) to Perl. - Add client:UntrainDiscBySpellID(spell_id, update_client) to Lua. --- zone/client.h | 1 + zone/lua_client.cpp | 34 +++++++++++++++++++++++----------- zone/lua_client.h | 2 ++ zone/perl_client.cpp | 20 ++++++++++++++++++++ zone/spells.cpp | 10 ++++++++++ 5 files changed, 56 insertions(+), 11 deletions(-) diff --git a/zone/client.h b/zone/client.h index c53fbb21b..5e84cf96b 100644 --- a/zone/client.h +++ b/zone/client.h @@ -800,6 +800,7 @@ public: void UnscribeSpellAll(bool update_client = true); void UntrainDisc(int slot, bool update_client = true); void UntrainDiscAll(bool update_client = true); + void UntrainDiscBySpellID(uint16 spell_id, bool update_client = true); bool SpellGlobalCheck(uint16 spell_id, uint32 char_id); bool SpellBucketCheck(uint16 spell_id, uint32 char_id); uint32 GetCharMaxLevelFromQGlobal(); diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index d758dc6c8..fee64d493 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -2206,17 +2206,27 @@ int Lua_Client::CountItem(uint32 item_id) { void Lua_Client::RemoveItem(uint32 item_id) { Lua_Safe_Call_Void(); - return self->RemoveItem(item_id); + self->RemoveItem(item_id); } void Lua_Client::RemoveItem(uint32 item_id, uint32 quantity) { Lua_Safe_Call_Void(); - return self->RemoveItem(item_id, quantity); + self->RemoveItem(item_id, quantity); } void Lua_Client::SetGMStatus(uint32 newStatus) { Lua_Safe_Call_Void(); - return self->SetGMStatus(newStatus); + self->SetGMStatus(newStatus); +} + +void Lua_Client::UntrainDiscBySpellID(uint16 spell_id) { + Lua_Safe_Call_Void(); + self->UntrainDiscBySpellID(spell_id); +} + +void Lua_Client::UntrainDiscBySpellID(uint16 spell_id, bool update_client) { + Lua_Safe_Call_Void(); + self->UntrainDiscBySpellID(spell_id, update_client); } luabind::scope lua_register_client() { @@ -2475,7 +2485,7 @@ luabind::scope lua_register_client() { .def("ClearCompassMark",(void(Lua_Client::*)(void))&Lua_Client::ClearCompassMark) .def("GetNextAvailableSpellBookSlot", (int(Lua_Client::*)(void))&Lua_Client::GetNextAvailableSpellBookSlot) .def("GetNextAvailableSpellBookSlot", (int(Lua_Client::*)(int))&Lua_Client::GetNextAvailableSpellBookSlot) - .def("GetSpellIDByBookSlot", (uint32(Lua_Client::*)(int))& Lua_Client::GetSpellIDByBookSlot) + .def("GetSpellIDByBookSlot", (uint32(Lua_Client::*)(int))&Lua_Client::GetSpellIDByBookSlot) .def("FindSpellBookSlotBySpellID", (int(Lua_Client::*)(int))&Lua_Client::FindSpellBookSlotBySpellID) .def("UpdateTaskActivity", (void(Lua_Client::*)(int,int,int))&Lua_Client::UpdateTaskActivity) .def("AssignTask", (void(Lua_Client::*)(int,int))&Lua_Client::AssignTask) @@ -2580,19 +2590,21 @@ luabind::scope lua_register_client() { .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("Popup", (void(Lua_Client::*)(const char*,const char*))& Lua_Client::Popup) - .def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32))& Lua_Client::Popup) - .def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32,uint32))& Lua_Client::Popup) - .def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32,uint32,uint32))& Lua_Client::Popup) - .def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32,uint32,uint32,uint32))& Lua_Client::Popup) - .def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32,uint32,uint32,uint32,const char*,const char*))& Lua_Client::Popup) + .def("Popup", (void(Lua_Client::*)(const char*,const char*))&Lua_Client::Popup) + .def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32))&Lua_Client::Popup) + .def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32,uint32))&Lua_Client::Popup) + .def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32,uint32,uint32))&Lua_Client::Popup) + .def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32,uint32,uint32,uint32))&Lua_Client::Popup) + .def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32,uint32,uint32,uint32,const char*,const char*))&Lua_Client::Popup) .def("Popup", (void(Lua_Client::*)(const char*,const char*,uint32,uint32,uint32,uint32,const char*,const char*,uint32))&Lua_Client::Popup) .def("ResetAllDisciplineTimers", (void(Lua_Client::*)(void))&Lua_Client::ResetAllDisciplineTimers) .def("SendToInstance", (void(Lua_Client::*)(std::string,std::string,uint32,float,float,float,float,std::string,uint32))&Lua_Client::SendToInstance) .def("CountItem", (int(Lua_Client::*)(uint32))&Lua_Client::CountItem) .def("RemoveItem", (void(Lua_Client::*)(uint32))&Lua_Client::RemoveItem) .def("RemoveItem", (void(Lua_Client::*)(uint32,uint32))&Lua_Client::RemoveItem) - .def("SetGMStatus", (void(Lua_Client::*)(int32))& Lua_Client::SetGMStatus); + .def("SetGMStatus", (void(Lua_Client::*)(int32))&Lua_Client::SetGMStatus) + .def("UntrainDiscBySpellID", (void(Lua_Client::*)(uint16))&Lua_Client::UntrainDiscBySpellID) + .def("UntrainDiscBySpellID", (void(Lua_Client::*)(uint16,bool))&Lua_Client::UntrainDiscBySpellID); } luabind::scope lua_register_inventory_where() { diff --git a/zone/lua_client.h b/zone/lua_client.h index 985939834..b49cb9b31 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -183,6 +183,8 @@ public: int GetDiscSlotBySpellID(int32 spell_id); void UntrainDisc(int slot); void UntrainDisc(int slot, bool update_client); + void UntrainDiscBySpellID(uint16 spell_id); + void UntrainDiscBySpellID(uint16 spell_id, bool update_client); void UntrainDiscAll(); void UntrainDiscAll(bool update_client); bool IsStanding(); diff --git a/zone/perl_client.cpp b/zone/perl_client.cpp index 764002223..9c810c7ef 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -5693,6 +5693,25 @@ XS(XS_Client_DiaWind) { XSRETURN_EMPTY; } +XS(XS_Client_UntrainDiscBySpellID); /* prototype to pass -Wmissing-prototypes */ +XS(XS_Client_UntrainDiscBySpellID) { + dXSARGS; + if (items < 2 || items > 3) + Perl_croak(aTHX_ "Usage: Client::UntrainDiscBySpellID(THIS, uint16 spell_id, [bool update_client = true])"); // @categories Spells and Disciplines + { + Client *THIS; + uint16 spell_id = (uint16) SvUV(ST(1)); + bool update_client = true; + VALIDATE_THIS_IS_CLIENT; + if (items == 3) { + update_client = (bool) SvTRUE(ST(2)); + } + + THIS->UntrainDiscBySpellID(spell_id, update_client); + } + XSRETURN_EMPTY; +} + #ifdef __cplusplus extern "C" #endif @@ -5998,6 +6017,7 @@ XS(boot_Client) { newXSproto(strcpy(buf, "UnscribeSpellAll"), XS_Client_UnscribeSpellAll, file, "$;$"); newXSproto(strcpy(buf, "UntrainDisc"), XS_Client_UntrainDisc, file, "$$;$"); newXSproto(strcpy(buf, "UntrainDiscAll"), XS_Client_UntrainDiscAll, file, "$;$"); + newXSproto(strcpy(buf, "UntrainDiscBySpellID"), XS_Client_UntrainDiscBySpellID, file, "$$;$"); newXSproto(strcpy(buf, "UpdateAdmin"), XS_Client_UpdateAdmin, file, "$;$"); newXSproto(strcpy(buf, "SetGMStatus"), XS_Client_SetGMStatus, file, "$$"); newXSproto(strcpy(buf, "UpdateGroupAAs"), XS_Client_UpdateGroupAAs, file, "$$$"); diff --git a/zone/spells.cpp b/zone/spells.cpp index dd101ba51..2553b5e10 100644 --- a/zone/spells.cpp +++ b/zone/spells.cpp @@ -5335,6 +5335,16 @@ void Client::UntrainDiscAll(bool update_client) } } +void Client::UntrainDiscBySpellID(uint16 spell_id, bool update_client) +{ + for (int slot = 0; slot < MAX_PP_DISCIPLINES; slot++) { + if (m_pp.disciplines.values[slot] == spell_id) { + UntrainDisc(slot, update_client); + return; + } + } +} + int Client::GetNextAvailableSpellBookSlot(int starting_slot) { for (int i = starting_slot; i < EQ::spells::SPELLBOOK_SIZE; i++) { //using starting_slot should help speed this up when we're iterating through a bunch of spells if (!IsValidSpell(GetSpellByBookSlot(i)))