diff --git a/common/skill_caps.cpp b/common/skill_caps.cpp index 4be33b053..c76eab372 100644 --- a/common/skill_caps.cpp +++ b/common/skill_caps.cpp @@ -1,4 +1,5 @@ #include "skill_caps.h" +#include "timer.h" SkillCaps *SkillCaps::SetContentDatabase(Database *db) { @@ -13,39 +14,39 @@ SkillCapsRepository::SkillCaps SkillCaps::GetSkillCap(uint8 class_id, EQ::skills return SkillCapsRepository::NewEntity(); } - uint64_t key = (class_id * 1000000) + (level * 1000) + static_cast(skill_id); + const uint64_t key = (class_id * 1000000) + (level * 1000) + static_cast(skill_id); + auto pos = m_skill_caps.find(key); if (pos != m_skill_caps.end()) { return pos->second; } + return SkillCapsRepository::NewEntity(); } -uint8 SkillCaps::GetTrainLevel(uint8 class_id, EQ::skills::SkillType skill_id, uint8 level) +uint8 SkillCaps::GetSkillTrainLevel(uint8 class_id, EQ::skills::SkillType skill_id, uint8 level) { if ( !IsPlayerClass(class_id) || class_id > Class::PLAYER_CLASS_COUNT || static_cast(skill_id) > (EQ::skills::HIGHEST_SKILL + 1) - ) { + ) { return 0; } const uint8 skill_cap_max_level = ( RuleI(Character, SkillCapMaxLevel) > 0 ? - RuleI(Character, SkillCapMaxLevel) : - RuleI(Character, MaxLevel) + RuleI(Character, SkillCapMaxLevel) : + RuleI(Character, MaxLevel) ); - const uint8 max_level = level > skill_cap_max_level ? level : skill_cap_max_level; + const uint8 max_level = level > skill_cap_max_level ? level : skill_cap_max_level; + const uint64_t key = (class_id * 1000000) + (level * 1000) + static_cast(skill_id); - for (const auto &e: m_skill_caps) { - for (uint8 current_level = 1; current_level <= max_level; current_level++) { - uint64_t key = (class_id * 1000000) + (level * 1000) + static_cast(skill_id); - auto pos = m_skill_caps.find(key); - if (pos != m_skill_caps.end()) { - return current_level; - } + for (uint8 current_level = 1; current_level <= max_level; current_level++) { + auto pos = m_skill_caps.find(key); + if (pos != m_skill_caps.end()) { + return current_level; } } @@ -54,20 +55,20 @@ uint8 SkillCaps::GetTrainLevel(uint8 class_id, EQ::skills::SkillType skill_id, u void SkillCaps::LoadSkillCaps() { - const auto &l = SkillCapsRepository::All(*m_content_database); + const auto& l = SkillCapsRepository::All(*m_content_database); m_skill_caps.clear(); - for (const auto &e: l) { + for (const auto& e: l) { if ( e.level < 1 || !IsPlayerClass(e.class_id) || static_cast(e.skill_id) >= EQ::skills::SkillCount - ) { + ) { continue; } - uint64_t key = (e.class_id * 1000000) + (e.level * 1000) + e.skill_id; + const uint64_t key = (e.class_id * 1000000) + (e.level * 1000) + e.skill_id; m_skill_caps[key] = e; } diff --git a/common/skill_caps.h b/common/skill_caps.h index e7936c2be..24b278c23 100644 --- a/common/skill_caps.h +++ b/common/skill_caps.h @@ -10,7 +10,7 @@ class SkillCaps { public: inline void ClearSkillCaps() { m_skill_caps.clear(); } SkillCapsRepository::SkillCaps GetSkillCap(uint8 class_id, EQ::skills::SkillType skill_id, uint8 level); - uint8 GetTrainLevel(uint8 class_id, EQ::skills::SkillType skill_id, uint8 level); + uint8 GetSkillTrainLevel(uint8 class_id, EQ::skills::SkillType skill_id, uint8 level); void LoadSkillCaps(); void ReloadSkillCaps(); diff --git a/zone/client.cpp b/zone/client.cpp index aab46daa1..e55370ed7 100644 --- a/zone/client.cpp +++ b/zone/client.cpp @@ -2803,7 +2803,7 @@ uint16 Client::MaxSkill(EQ::skills::SkillType skill_id, uint8 class_id, uint8 le return skill_caps.GetSkillCap(class_id, skill_id, level).cap; } -uint8 Client::SkillTrainLevel(EQ::skills::SkillType skill_id, uint8 class_id) +uint8 Client::GetSkillTrainLevel(EQ::skills::SkillType skill_id, uint8 class_id) { if ( ClientVersion() < EQ::versions::ClientVersion::RoF2 && @@ -2813,7 +2813,7 @@ uint8 Client::SkillTrainLevel(EQ::skills::SkillType skill_id, uint8 class_id) skill_id = EQ::skills::Skill2HPiercing; } - return skill_caps.GetTrainLevel(class_id, skill_id, RuleI(Character, MaxLevel)); + return skill_caps.GetSkillTrainLevel(class_id, skill_id, RuleI(Character, MaxLevel)); } uint16 Client::GetMaxSkillAfterSpecializationRules(EQ::skills::SkillType skillid, uint16 maxSkill) diff --git a/zone/client.h b/zone/client.h index 3ca55331d..1859de6ad 100644 --- a/zone/client.h +++ b/zone/client.h @@ -866,7 +866,7 @@ public: uint16 MaxSkill(EQ::skills::SkillType skill_id, uint8 class_id, uint8 level) const; inline uint16 MaxSkill(EQ::skills::SkillType skill_id) const { return MaxSkill(skill_id, GetClass(), GetLevel()); } - uint8 SkillTrainLevel(EQ::skills::SkillType skill_id, uint8 class_id); + uint8 GetSkillTrainLevel(EQ::skills::SkillType skill_id, uint8 class_id); void MaxSkills(); void SendTradeskillSearchResults(const std::string &query, unsigned long objtype, unsigned long someid); diff --git a/zone/client_process.cpp b/zone/client_process.cpp index 17e2abafa..c9b42fc07 100644 --- a/zone/client_process.cpp +++ b/zone/client_process.cpp @@ -1718,7 +1718,7 @@ void Client::OPGMTrainSkill(const EQApplicationPacket *app) if (skilllevel == 0) { //this is a new skill.. - uint16 t_level = SkillTrainLevel(skill, GetClass()); + uint16 t_level = GetSkillTrainLevel(skill, GetClass()); if (t_level == 0) { LogSkills("Tried to train a new skill [{}] which is invalid for this race/class.", skill); diff --git a/zone/lua_client.cpp b/zone/lua_client.cpp index fcfdd6ba4..e25a6a37b 100644 --- a/zone/lua_client.cpp +++ b/zone/lua_client.cpp @@ -3375,6 +3375,12 @@ void Lua_Client::ResetLeadershipAA() self->ResetLeadershipAA(); } +uint8 Lua_Client::GetSkillTrainLevel(int skill_id) +{ + Lua_Safe_Call_Int(); + return self->GetSkillTrainLevel(static_cast(skill_id), self->GetClass()); +} + luabind::scope lua_register_client() { return luabind::class_("Client") .def(luabind::constructor<>()) @@ -3624,6 +3630,7 @@ luabind::scope lua_register_client() { .def("GetScribeableSpells", (luabind::object(Lua_Client::*)(lua_State* L,uint8,uint8))&Lua_Client::GetScribeableSpells) .def("GetScribedSpells", (luabind::object(Lua_Client::*)(lua_State* L))&Lua_Client::GetScribedSpells) .def("GetSkillPoints", (int(Lua_Client::*)(void))&Lua_Client::GetSkillPoints) + .def("GetSkillTrainLevel", (uint8(Lua_Client::*)(int))&Lua_Client::GetSkillTrainLevel) .def("GetSpellDamage", (int(Lua_Client::*)(void))&Lua_Client::GetSpellDamage) .def("GetSpellIDByBookSlot", (uint32(Lua_Client::*)(int))&Lua_Client::GetSpellIDByBookSlot) .def("GetSpentAA", (int(Lua_Client::*)(void))&Lua_Client::GetSpentAA) diff --git a/zone/lua_client.h b/zone/lua_client.h index 926f3230a..19ca8be08 100644 --- a/zone/lua_client.h +++ b/zone/lua_client.h @@ -504,6 +504,7 @@ public: bool SetAutoLoginCharacterName(std::string character_name); void DescribeSpecialAbilities(Lua_NPC n); void ResetLeadershipAA(); + uint8 GetSkillTrainLevel(int skill_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 8f2404306..391e82b1f 100644 --- a/zone/perl_client.cpp +++ b/zone/perl_client.cpp @@ -3173,6 +3173,11 @@ void Perl_Client_ResetLeadershipAA(Client* self) self->ResetLeadershipAA(); } +uint8 Perl_Client_GetSkillTrainLevel(Client* self, int skill_id) +{ + return self->GetSkillTrainLevel(static_cast(skill_id), self->GetClass()); +} + void perl_register_client() { perl::interpreter perl(PERL_GET_THX); @@ -3431,6 +3436,7 @@ void perl_register_client() package.add("GetTaskActivityDoneCount", &Perl_Client_GetTaskActivityDoneCount); package.add("GetThirst", &Perl_Client_GetThirst); package.add("GetTotalSecondsPlayed", &Perl_Client_GetTotalSecondsPlayed); + package.add("GetSkillTrainLevel", &Perl_Client_GetSkillTrainLevel); package.add("GetWeight", &Perl_Client_GetWeight); package.add("GetPEQZoneFlags", &Perl_Client_GetPEQZoneFlags); package.add("GetZoneFlags", &Perl_Client_GetZoneFlags);