From f7fb1c9fe1e2ace71c7e0d796bae1568462c74cb Mon Sep 17 00:00:00 2001 From: Alex King <89047260+Kinglykrab@users.noreply.github.com> Date: Tue, 6 Dec 2022 08:46:21 -0500 Subject: [PATCH] [Quest API] Add MaxSkills() to Perl/Lua. (#2621) * [Quest API] Add MaxSkills() to Perl/Lua. # Perl - Add `$client->MaxSkills()`. # Lua - Add `client:MaxSkills()`. # Notes - Allows operators an easy short hand for maxing a player's skills for their level without needing to do all the looping and stuff on their own. * Cleanup. * Only set if it's higher than skill level player has. * Add constant. --- zone/client.cpp | 15 +++++++++++++++ zone/client.h | 2 ++ zone/command.cpp | 2 +- zone/gm_commands/max_all_skills.cpp | 26 +++++++++++++------------- zone/lua_client.cpp | 7 +++++++ zone/lua_client.h | 1 + zone/perl_client.cpp | 6 ++++++ 7 files changed, 45 insertions(+), 14 deletions(-) diff --git a/zone/client.cpp b/zone/client.cpp index 62b27ba4f..7595d8f15 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -12013,3 +12013,18 @@ std::string Client::GetGuildPublicNote() return gci.public_note; } + +void Client::MaxSkills() +{ + for (const auto &s : EQ::skills::GetSkillTypeMap()) { + auto current_skill_value = ( + EQ::skills::IsSpecializedSkill(s.first) ? + MAX_SPECIALIZED_SKILL : + content_db.GetSkillCap(GetClass(), s.first, GetLevel()) + ); + + if (GetSkill(s.first) < current_skill_value) { + SetSkill(s.first, current_skill_value); + } + } +} diff --git a/zone/client.h b/zone/client.h index f2c68238c..d9672c812 100644 --- a/zone/client.h +++ b/zone/client.h @@ -87,6 +87,7 @@ namespace EQ #define CLIENT_LD_TIMEOUT 30000 // length of time client stays in zone after LDing #define TARGETING_RANGE 200 // range for /assist and /target #define XTARGET_HARDCAP 20 +#define MAX_SPECIALIZED_SKILL 50 extern Zone* zone; extern TaskManager *task_manager; @@ -783,6 +784,7 @@ public: uint16 MaxSkill(EQ::skills::SkillType skillid, uint16 class_, uint16 level) const; inline uint16 MaxSkill(EQ::skills::SkillType skillid) const { return MaxSkill(skillid, GetClass(), GetLevel()); } uint8 SkillTrainLevel(EQ::skills::SkillType skillid, uint16 class_); + void MaxSkills(); void SendTradeskillSearchResults(const std::string &query, unsigned long objtype, unsigned long someid); void SendTradeskillDetails(uint32 recipe_id); diff --git a/zone/command.cpp b/zone/command.cpp index 37f5571d0..fcdb48564 100644 --- a/zone/command.cpp +++ b/zone/command.cpp @@ -210,7 +210,7 @@ int command_init(void) command_add("logs", "Manage anything to do with logs", AccountStatus::GMImpossible, command_logs) || command_add("makepet", "[Pet Name] - Make a pet", AccountStatus::Guide, command_makepet) || command_add("mana", "Fill your or your target's mana", AccountStatus::Guide, command_mana) || - command_add("maxskills", "Maxes skills for you.", AccountStatus::GMMgmt, command_max_all_skills) || + command_add("maxskills", "Maxes skills for you or your player target.", AccountStatus::GMMgmt, command_max_all_skills) || command_add("memspell", "[Spell ID] [Spell Gem] - Memorize a Spell by ID to the specified Spell Gem for you or your target", AccountStatus::Guide, command_memspell) || command_add("merchant_close_shop", "Closes a merchant shop", AccountStatus::GMAdmin, command_merchantcloseshop) || command_add("merchant_open_shop", "Opens a merchants shop", AccountStatus::GMAdmin, command_merchantopenshop) || diff --git a/zone/gm_commands/max_all_skills.cpp b/zone/gm_commands/max_all_skills.cpp index 6c63c60ca..d032265ec 100755 --- a/zone/gm_commands/max_all_skills.cpp +++ b/zone/gm_commands/max_all_skills.cpp @@ -2,19 +2,19 @@ void command_max_all_skills(Client *c, const Seperator *sep) { - if (c) { - Client *client_target = (c->GetTarget() ? (c->GetTarget()->IsClient() ? c->GetTarget()->CastToClient() : c) - : c); - auto Skills = EQ::skills::GetSkillTypeMap(); - for (auto &skills_iter : Skills) { - auto skill_id = skills_iter.first; - auto current_skill_value = ( - (EQ::skills::IsSpecializedSkill(skill_id)) ? - 50 : - content_db.GetSkillCap(client_target->GetClass(), skill_id, client_target->GetLevel()) - ); - client_target->SetSkill(skill_id, current_skill_value); - } + auto t = c; + if (c->GetTarget() && c->GetTarget()->IsClient()) { + t = c->GetTarget()->CastToClient(); } + + t->MaxSkills(); + + c->Message( + Chat::White, + fmt::format( + "Maxed skills for {}.", + c->GetTargetDescription(t) + ).c_str() + ); } diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index 7590e54d9..00394d93f 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -2886,6 +2886,12 @@ std::string Lua_Client::GetGuildPublicNote() return self->GetGuildPublicNote(); } +void Lua_Client::MaxSkills() +{ + Lua_Safe_Call_Void(); + self->MaxSkills(); +} + #ifdef BOTS int Lua_Client::GetBotRequiredLevel() @@ -3251,6 +3257,7 @@ luabind::scope lua_register_client() { .def("Marquee", (void(Lua_Client::*)(uint32, std::string, uint32))&Lua_Client::SendMarqueeMessage) .def("Marquee", (void(Lua_Client::*)(uint32, uint32, uint32, uint32, uint32, std::string))&Lua_Client::SendMarqueeMessage) .def("MaxSkill", (int(Lua_Client::*)(int))&Lua_Client::MaxSkill) + .def("MaxSkills", (void(Lua_Client::*)(void))&Lua_Client::MaxSkills) .def("MemSpell", (void(Lua_Client::*)(int,int))&Lua_Client::MemSpell) .def("MemSpell", (void(Lua_Client::*)(int,int,bool))&Lua_Client::MemSpell) .def("MemmedCount", (int(Lua_Client::*)(void))&Lua_Client::MemmedCount) diff --git a/zone/lua_client.h b/zone/lua_client.h index 105b405bd..1fed5e9d9 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -453,6 +453,7 @@ public: void SendPayload(int payload_id); void SendPayload(int payload_id, std::string payload_value); std::string GetGuildPublicNote(); + void MaxSkills(); 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 44df9f09c..9287bea8d 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -2767,6 +2767,11 @@ std::string Perl_Client_GetGuildPublicNote(Client* self) return self->GetGuildPublicNote(); } +void Perl_Client_MaxSkills(Client* self) +{ + self->MaxSkills(); +} + #ifdef BOTS int Perl_Client_GetBotRequiredLevel(Client* self) @@ -3126,6 +3131,7 @@ void perl_register_client() package.add("MaxSkill", (int(*)(Client*, uint16))&Perl_Client_MaxSkill); package.add("MaxSkill", (int(*)(Client*, uint16, uint16))&Perl_Client_MaxSkill); package.add("MaxSkill", (int(*)(Client*, uint16, uint16, uint16))&Perl_Client_MaxSkill); + package.add("MaxSkills", &Perl_Client_MaxSkills); package.add("MemSpell", (void(*)(Client*, uint16, int))&Perl_Client_MemSpell); package.add("MemSpell", (void(*)(Client*, uint16, int, bool))&Perl_Client_MemSpell); package.add("MemmedCount", &Perl_Client_MemmedCount);