mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-17 14:31:30 +00:00
[Performance] Improve SkillCaps::GetTrainLevel() Efficiency (#4350)
* [Performance] Improve SkillCaps::GetTrainLevel() Efficiency * Finalize
This commit is contained in:
parent
1b15f16e3e
commit
c50fda0f73
@ -1,4 +1,5 @@
|
|||||||
#include "skill_caps.h"
|
#include "skill_caps.h"
|
||||||
|
#include "timer.h"
|
||||||
|
|
||||||
SkillCaps *SkillCaps::SetContentDatabase(Database *db)
|
SkillCaps *SkillCaps::SetContentDatabase(Database *db)
|
||||||
{
|
{
|
||||||
@ -13,15 +14,17 @@ SkillCapsRepository::SkillCaps SkillCaps::GetSkillCap(uint8 class_id, EQ::skills
|
|||||||
return SkillCapsRepository::NewEntity();
|
return SkillCapsRepository::NewEntity();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t key = (class_id * 1000000) + (level * 1000) + static_cast<uint32>(skill_id);
|
const uint64_t key = (class_id * 1000000) + (level * 1000) + static_cast<uint32>(skill_id);
|
||||||
|
|
||||||
auto pos = m_skill_caps.find(key);
|
auto pos = m_skill_caps.find(key);
|
||||||
if (pos != m_skill_caps.end()) {
|
if (pos != m_skill_caps.end()) {
|
||||||
return pos->second;
|
return pos->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
return SkillCapsRepository::NewEntity();
|
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 (
|
if (
|
||||||
!IsPlayerClass(class_id) ||
|
!IsPlayerClass(class_id) ||
|
||||||
@ -38,16 +41,14 @@ uint8 SkillCaps::GetTrainLevel(uint8 class_id, EQ::skills::SkillType skill_id, u
|
|||||||
);
|
);
|
||||||
|
|
||||||
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<uint32>(skill_id);
|
||||||
|
|
||||||
for (const auto &e: m_skill_caps) {
|
|
||||||
for (uint8 current_level = 1; current_level <= max_level; current_level++) {
|
for (uint8 current_level = 1; current_level <= max_level; current_level++) {
|
||||||
uint64_t key = (class_id * 1000000) + (level * 1000) + static_cast<uint32>(skill_id);
|
|
||||||
auto pos = m_skill_caps.find(key);
|
auto pos = m_skill_caps.find(key);
|
||||||
if (pos != m_skill_caps.end()) {
|
if (pos != m_skill_caps.end()) {
|
||||||
return current_level;
|
return current_level;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -67,7 +68,7 @@ void SkillCaps::LoadSkillCaps()
|
|||||||
continue;
|
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;
|
m_skill_caps[key] = e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -10,7 +10,7 @@ class SkillCaps {
|
|||||||
public:
|
public:
|
||||||
inline void ClearSkillCaps() { m_skill_caps.clear(); }
|
inline void ClearSkillCaps() { m_skill_caps.clear(); }
|
||||||
SkillCapsRepository::SkillCaps GetSkillCap(uint8 class_id, EQ::skills::SkillType skill_id, uint8 level);
|
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 LoadSkillCaps();
|
||||||
void ReloadSkillCaps();
|
void ReloadSkillCaps();
|
||||||
|
|
||||||
|
|||||||
@ -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;
|
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 (
|
if (
|
||||||
ClientVersion() < EQ::versions::ClientVersion::RoF2 &&
|
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;
|
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)
|
uint16 Client::GetMaxSkillAfterSpecializationRules(EQ::skills::SkillType skillid, uint16 maxSkill)
|
||||||
|
|||||||
@ -866,7 +866,7 @@ public:
|
|||||||
|
|
||||||
uint16 MaxSkill(EQ::skills::SkillType skill_id, uint8 class_id, uint8 level) const;
|
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()); }
|
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 MaxSkills();
|
||||||
|
|
||||||
void SendTradeskillSearchResults(const std::string &query, unsigned long objtype, unsigned long someid);
|
void SendTradeskillSearchResults(const std::string &query, unsigned long objtype, unsigned long someid);
|
||||||
|
|||||||
@ -1718,7 +1718,7 @@ void Client::OPGMTrainSkill(const EQApplicationPacket *app)
|
|||||||
|
|
||||||
if (skilllevel == 0) {
|
if (skilllevel == 0) {
|
||||||
//this is a new skill..
|
//this is a new skill..
|
||||||
uint16 t_level = SkillTrainLevel(skill, GetClass());
|
uint16 t_level = GetSkillTrainLevel(skill, GetClass());
|
||||||
|
|
||||||
if (t_level == 0) {
|
if (t_level == 0) {
|
||||||
LogSkills("Tried to train a new skill [{}] which is invalid for this race/class.", skill);
|
LogSkills("Tried to train a new skill [{}] which is invalid for this race/class.", skill);
|
||||||
|
|||||||
@ -3375,6 +3375,12 @@ void Lua_Client::ResetLeadershipAA()
|
|||||||
self->ResetLeadershipAA();
|
self->ResetLeadershipAA();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8 Lua_Client::GetSkillTrainLevel(int skill_id)
|
||||||
|
{
|
||||||
|
Lua_Safe_Call_Int();
|
||||||
|
return self->GetSkillTrainLevel(static_cast<EQ::skills::SkillType>(skill_id), self->GetClass());
|
||||||
|
}
|
||||||
|
|
||||||
luabind::scope lua_register_client() {
|
luabind::scope lua_register_client() {
|
||||||
return luabind::class_<Lua_Client, Lua_Mob>("Client")
|
return luabind::class_<Lua_Client, Lua_Mob>("Client")
|
||||||
.def(luabind::constructor<>())
|
.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("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("GetScribedSpells", (luabind::object(Lua_Client::*)(lua_State* L))&Lua_Client::GetScribedSpells)
|
||||||
.def("GetSkillPoints", (int(Lua_Client::*)(void))&Lua_Client::GetSkillPoints)
|
.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("GetSpellDamage", (int(Lua_Client::*)(void))&Lua_Client::GetSpellDamage)
|
||||||
.def("GetSpellIDByBookSlot", (uint32(Lua_Client::*)(int))&Lua_Client::GetSpellIDByBookSlot)
|
.def("GetSpellIDByBookSlot", (uint32(Lua_Client::*)(int))&Lua_Client::GetSpellIDByBookSlot)
|
||||||
.def("GetSpentAA", (int(Lua_Client::*)(void))&Lua_Client::GetSpentAA)
|
.def("GetSpentAA", (int(Lua_Client::*)(void))&Lua_Client::GetSpentAA)
|
||||||
|
|||||||
@ -504,6 +504,7 @@ public:
|
|||||||
bool SetAutoLoginCharacterName(std::string character_name);
|
bool SetAutoLoginCharacterName(std::string character_name);
|
||||||
void DescribeSpecialAbilities(Lua_NPC n);
|
void DescribeSpecialAbilities(Lua_NPC n);
|
||||||
void ResetLeadershipAA();
|
void ResetLeadershipAA();
|
||||||
|
uint8 GetSkillTrainLevel(int skill_id);
|
||||||
|
|
||||||
void ApplySpell(int spell_id);
|
void ApplySpell(int spell_id);
|
||||||
void ApplySpell(int spell_id, int duration);
|
void ApplySpell(int spell_id, int duration);
|
||||||
|
|||||||
@ -3173,6 +3173,11 @@ void Perl_Client_ResetLeadershipAA(Client* self)
|
|||||||
self->ResetLeadershipAA();
|
self->ResetLeadershipAA();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8 Perl_Client_GetSkillTrainLevel(Client* self, int skill_id)
|
||||||
|
{
|
||||||
|
return self->GetSkillTrainLevel(static_cast<EQ::skills::SkillType>(skill_id), self->GetClass());
|
||||||
|
}
|
||||||
|
|
||||||
void perl_register_client()
|
void perl_register_client()
|
||||||
{
|
{
|
||||||
perl::interpreter perl(PERL_GET_THX);
|
perl::interpreter perl(PERL_GET_THX);
|
||||||
@ -3431,6 +3436,7 @@ void perl_register_client()
|
|||||||
package.add("GetTaskActivityDoneCount", &Perl_Client_GetTaskActivityDoneCount);
|
package.add("GetTaskActivityDoneCount", &Perl_Client_GetTaskActivityDoneCount);
|
||||||
package.add("GetThirst", &Perl_Client_GetThirst);
|
package.add("GetThirst", &Perl_Client_GetThirst);
|
||||||
package.add("GetTotalSecondsPlayed", &Perl_Client_GetTotalSecondsPlayed);
|
package.add("GetTotalSecondsPlayed", &Perl_Client_GetTotalSecondsPlayed);
|
||||||
|
package.add("GetSkillTrainLevel", &Perl_Client_GetSkillTrainLevel);
|
||||||
package.add("GetWeight", &Perl_Client_GetWeight);
|
package.add("GetWeight", &Perl_Client_GetWeight);
|
||||||
package.add("GetPEQZoneFlags", &Perl_Client_GetPEQZoneFlags);
|
package.add("GetPEQZoneFlags", &Perl_Client_GetPEQZoneFlags);
|
||||||
package.add("GetZoneFlags", &Perl_Client_GetZoneFlags);
|
package.add("GetZoneFlags", &Perl_Client_GetZoneFlags);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user