Skip to content

Commit

Permalink
[Character] Character EXP Modifiers in Memory (#3934)
Browse files Browse the repository at this point in the history
* Cleanup

* Final push.

* Update zonedb.cpp

* Update zone.h

* Update exp.cpp

* Update zonedb.cpp

---------

Co-authored-by: Chris Miles <[email protected]>
  • Loading branch information
Kinglykrab and Akkadius authored Jan 13, 2024
1 parent 77c0eb3 commit 73a099c
Show file tree
Hide file tree
Showing 16 changed files with 443 additions and 179 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "../../strings.h"
#include <ctime>


class BaseCharacterExpModifiersRepository {
public:
struct CharacterExpModifiers {
Expand Down
54 changes: 54 additions & 0 deletions common/repositories/character_exp_modifiers_repository.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,61 @@ class CharacterExpModifiersRepository: public BaseCharacterExpModifiersRepositor
*/

// Custom extended repository methods here
static EXPModifier GetEXPModifier(
Database& db,
uint32 character_id,
uint32 zone_id,
int16 instance_version
)
{
const auto& l = CharacterExpModifiersRepository::GetWhere(
db,
fmt::format(
SQL(
`character_id` = {} AND
(`zone_id` = {} OR `zone_id` = 0) AND
(`instance_version` = {} OR `instance_version` = -1)
ORDER BY `zone_id`, `instance_version` DESC
LIMIT 1
),
character_id,
zone_id,
instance_version
)
);

if (l.empty()) {
return EXPModifier{
.aa_modifier = 1.0f,
.exp_modifier = 1.0f
};
}

return EXPModifier{
.aa_modifier = l[0].aa_modifier,
.exp_modifier = l[0].exp_modifier
};
}

static void SetEXPModifier(
Database& db,
uint32 character_id,
uint32 zone_id,
int16 instance_version,
EXPModifier m
)
{
CharacterExpModifiersRepository::ReplaceOne(
db,
CharacterExpModifiersRepository::CharacterExpModifiers{
.character_id = static_cast<int32_t>(character_id),
.zone_id = static_cast<int32_t>(zone_id),
.instance_version = instance_version,
.aa_modifier = m.aa_modifier,
.exp_modifier = m.exp_modifier
}
);
}
};

#endif //EQEMU_CHARACTER_EXP_MODIFIERS_REPOSITORY_H
48 changes: 48 additions & 0 deletions zone/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -388,6 +388,10 @@ Client::~Client() {
Bot::ProcessBotOwnerRefDelete(this);
}

if (zone) {
zone->ClearEXPModifier(this);
}

if(IsInAGuild())
guild_mgr.SendGuildMemberUpdateToWorld(GetName(), GuildID(), 0, time(nullptr));

Expand Down Expand Up @@ -742,6 +746,8 @@ bool Client::Save(uint8 iCommitNow) {

database.SaveCharacterData(this, &m_pp, &m_epp); /* Save Character Data */

database.SaveCharacterEXPModifier(this);

return true;
}

Expand Down Expand Up @@ -11951,3 +11957,45 @@ void Client::ClearXTargets()
}
}
}

float Client::GetAAEXPModifier(uint32 zone_id, int16 instance_version)
{
return database.GetAAEXPModifierByCharID(
CharacterID(),
zone_id,
instance_version
);
}

float Client::GetEXPModifier(uint32 zone_id, int16 instance_version)
{
return database.GetEXPModifierByCharID(
CharacterID(),
zone_id,
instance_version
);
}

void Client::SetAAEXPModifier(uint32 zone_id, float aa_modifier, int16 instance_version)
{
database.SetAAEXPModifierByCharID(
CharacterID(),
zone_id,
aa_modifier,
instance_version
);

database.LoadCharacterEXPModifier(this);
}

void Client::SetEXPModifier(uint32 zone_id, float exp_modifier, int16 instance_version)
{
database.SetEXPModifierByCharID(
CharacterID(),
zone_id,
exp_modifier,
instance_version
);

database.LoadCharacterEXPModifier(this);
}
13 changes: 9 additions & 4 deletions zone/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,9 @@ class Client : public Mob
bool IsEXPEnabled() const;
void SetEXPEnabled(bool is_exp_enabled);

std::vector<EXPModifier> GetEXPModifiers();
void SetEXPModifiers(std::vector<EXPModifier> exp_modifiers);

void SetPrimaryWeaponOrnamentation(uint32 model_id);
void SetSecondaryWeaponOrnamentation(uint32 model_id);

Expand Down Expand Up @@ -602,10 +605,10 @@ class Client : public Mob

inline uint32 GetEXP() const { return m_pp.exp; }

inline double GetAAEXPModifier(uint32 zone_id, int16 instance_version = -1) const { return database.GetAAEXPModifier(CharacterID(), zone_id, instance_version); };
inline double GetEXPModifier(uint32 zone_id, int16 instance_version = -1) const { return database.GetEXPModifier(CharacterID(), zone_id, instance_version); };
inline void SetAAEXPModifier(uint32 zone_id, double aa_modifier, int16 instance_version = -1) { database.SetAAEXPModifier(CharacterID(), zone_id, aa_modifier, instance_version); };
inline void SetEXPModifier(uint32 zone_id, double exp_modifier, int16 instance_version = -1) { database.SetEXPModifier(CharacterID(), zone_id, exp_modifier, instance_version); };
float GetAAEXPModifier(uint32 zone_id, int16 instance_version = -1);
float GetEXPModifier(uint32 zone_id, int16 instance_version = -1);
void SetAAEXPModifier(uint32 zone_id, float aa_modifier, int16 instance_version = -1);
void SetEXPModifier(uint32 zone_id, float exp_modifier, int16 instance_version = -1);

bool UpdateLDoNPoints(uint32 theme_id, int points);
void SetLDoNPoints(uint32 theme_id, uint32 points);
Expand Down Expand Up @@ -1953,6 +1956,8 @@ class Client : public Mob

bool m_exp_enabled;

std::vector<EXPModifier> m_exp_modifiers;

//Anti Spam Stuff
Timer *KarmaUpdateTimer;
uint32 TotalKarma;
Expand Down
1 change: 1 addition & 0 deletions zone/client_packet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1284,6 +1284,7 @@ void Client::Handle_Connect_OP_ZoneEntry(const EQApplicationPacket *app)
database.LoadCharacterLanguages(cid, &m_pp); /* Load Character Languages */
database.LoadCharacterLeadershipAbilities(cid, &m_pp); /* Load Character Leadership AA's */
database.LoadCharacterTribute(this); /* Load CharacterTribute */
database.LoadCharacterEXPModifier(this); /* Load Character EXP Modifier */

// this pattern is strange
// this is remnants of the old way of doing things
Expand Down
6 changes: 3 additions & 3 deletions zone/exp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ uint64 Client::CalcEXP(uint8 consider_level, bool ignore_modifiers) {
}

if (RuleB(Character, EnableCharacterEXPMods)) {
in_add_exp *= GetEXPModifier(zone->GetZoneID(), zone->GetInstanceVersion());
in_add_exp *= zone->GetEXPModifier(this);
}
}

Expand Down Expand Up @@ -317,7 +317,7 @@ void Client::CalculateStandardAAExp(uint64 &add_aaxp, uint8 conlevel, bool resex
}

if (RuleB(Character, EnableCharacterEXPMods)) {
add_aaxp *= GetAAEXPModifier(zone->GetZoneID(), zone->GetInstanceVersion());
add_aaxp *= zone->GetAAEXPModifier(this);
}

add_aaxp = (uint64)(RuleR(Character, AAExpMultiplier) * add_aaxp * aatotalmod);
Expand Down Expand Up @@ -480,7 +480,7 @@ void Client::CalculateExp(uint64 in_add_exp, uint64 &add_exp, uint64 &add_aaxp,
}

if (RuleB(Character, EnableCharacterEXPMods)) {
add_exp *= GetEXPModifier(zone->GetZoneID(), zone->GetInstanceVersion());
add_exp *= zone->GetEXPModifier(this);
}

//Enforce Percent XP Cap per kill, if rule is enabled
Expand Down
56 changes: 40 additions & 16 deletions zone/lua_client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2164,42 +2164,62 @@ void Lua_Client::Fling(float value, float target_x, float target_y, float target
self->Fling(value, target_x, target_y, target_z, ignore_los, clip_through_walls);
}

double Lua_Client::GetAAEXPModifier(uint32 zone_id) {
float Lua_Client::GetAAEXPModifier() {
Lua_Safe_Call_Real();
return zone->GetAAEXPModifier(self);
}

float Lua_Client::GetAAEXPModifier(uint32 zone_id) {
Lua_Safe_Call_Real();
return self->GetAAEXPModifier(zone_id);
}

double Lua_Client::GetAAEXPModifier(uint32 zone_id, int16 instance_version) {
float Lua_Client::GetAAEXPModifier(uint32 zone_id, int16 instance_version) {
Lua_Safe_Call_Real();
return self->GetAAEXPModifier(zone_id, instance_version);
}

double Lua_Client::GetEXPModifier(uint32 zone_id) {
float Lua_Client::GetEXPModifier() {
Lua_Safe_Call_Real();
return zone->GetEXPModifier(self);
}

float Lua_Client::GetEXPModifier(uint32 zone_id) {
Lua_Safe_Call_Real();
return self->GetEXPModifier(zone_id);
}

double Lua_Client::GetEXPModifier(uint32 zone_id, int16 instance_version) {
float Lua_Client::GetEXPModifier(uint32 zone_id, int16 instance_version) {
Lua_Safe_Call_Real();
return self->GetEXPModifier(zone_id, instance_version);
}

void Lua_Client::SetAAEXPModifier(uint32 zone_id, double aa_modifier) {
void Lua_Client::SetAAEXPModifier(float aa_modifier) {
Lua_Safe_Call_Void();
zone->SetAAEXPModifier(self, aa_modifier);
}

void Lua_Client::SetAAEXPModifier(uint32 zone_id, float aa_modifier) {
Lua_Safe_Call_Void();
self->SetAAEXPModifier(zone_id, aa_modifier);
}

void Lua_Client::SetAAEXPModifier(uint32 zone_id, double aa_modifier, int16 instance_version) {
void Lua_Client::SetAAEXPModifier(uint32 zone_id, float aa_modifier, int16 instance_version) {
Lua_Safe_Call_Void();
self->SetAAEXPModifier(zone_id, aa_modifier, instance_version);
}

void Lua_Client::SetEXPModifier(uint32 zone_id, double exp_modifier) {
void Lua_Client::SetEXPModifier(float exp_modifier) {
Lua_Safe_Call_Void();
zone->SetEXPModifier(self, exp_modifier);
}

void Lua_Client::SetEXPModifier(uint32 zone_id, float exp_modifier) {
Lua_Safe_Call_Void();
self->SetEXPModifier(zone_id, exp_modifier);
}

void Lua_Client::SetEXPModifier(uint32 zone_id, double exp_modifier, int16 instance_version) {
void Lua_Client::SetEXPModifier(uint32 zone_id, float exp_modifier, int16 instance_version) {
Lua_Safe_Call_Void();
self->SetEXPModifier(zone_id, exp_modifier, instance_version);
}
Expand Down Expand Up @@ -3377,8 +3397,9 @@ luabind::scope lua_register_client() {
.def("ForageItem", (void(Lua_Client::*)(bool))&Lua_Client::ForageItem)
.def("ForageItem", (void(Lua_Client::*)(void))&Lua_Client::ForageItem)
.def("Freeze", (void(Lua_Client::*)(void))&Lua_Client::Freeze)
.def("GetAAEXPModifier", (double(Lua_Client::*)(uint32))&Lua_Client::GetAAEXPModifier)
.def("GetAAEXPModifier", (double(Lua_Client::*)(uint32,int16))&Lua_Client::GetAAEXPModifier)
.def("GetAAEXPModifier", (float(Lua_Client::*)(void))&Lua_Client::GetAAEXPModifier)
.def("GetAAEXPModifier", (float(Lua_Client::*)(uint32))&Lua_Client::GetAAEXPModifier)
.def("GetAAEXPModifier", (float(Lua_Client::*)(uint32,int16))&Lua_Client::GetAAEXPModifier)
.def("GetAAExp", (uint32(Lua_Client::*)(void))&Lua_Client::GetAAExp)
.def("GetAAPercent", (uint32(Lua_Client::*)(void))&Lua_Client::GetAAPercent)
.def("GetAAPoints", (int(Lua_Client::*)(void))&Lua_Client::GetAAPoints)
Expand Down Expand Up @@ -3435,8 +3456,9 @@ luabind::scope lua_register_client() {
.def("GetDuelTarget", (int(Lua_Client::*)(void))&Lua_Client::GetDuelTarget)
.def("GetEXP", (uint32(Lua_Client::*)(void))&Lua_Client::GetEXP)
.def("GetEXPForLevel", (uint32(Lua_Client::*)(uint16))&Lua_Client::GetEXPForLevel)
.def("GetEXPModifier", (double(Lua_Client::*)(uint32))&Lua_Client::GetEXPModifier)
.def("GetEXPModifier", (double(Lua_Client::*)(uint32,int16))&Lua_Client::GetEXPModifier)
.def("GetEXPModifier", (float(Lua_Client::*)(void))&Lua_Client::GetEXPModifier)
.def("GetEXPModifier", (float(Lua_Client::*)(uint32))&Lua_Client::GetEXPModifier)
.def("GetEXPModifier", (float(Lua_Client::*)(uint32,int16))&Lua_Client::GetEXPModifier)
.def("GetEbonCrystals", (uint32(Lua_Client::*)(void))&Lua_Client::GetEbonCrystals)
.def("GetEndurance", (int(Lua_Client::*)(void))&Lua_Client::GetEndurance)
.def("GetEndurancePercent", (int(Lua_Client::*)(void))&Lua_Client::GetEndurancePercent)
Expand Down Expand Up @@ -3667,8 +3689,9 @@ luabind::scope lua_register_client() {
.def("SendPayload", (void(Lua_Client::*)(int,std::string))&Lua_Client::SendPayload)
.def("SendWebLink", (void(Lua_Client::*)(const char *))&Lua_Client::SendWebLink)
.def("SendZoneFlagInfo", (void(Lua_Client::*)(Lua_Client))&Lua_Client::SendZoneFlagInfo)
.def("SetAAEXPModifier", (void(Lua_Client::*)(uint32,double))&Lua_Client::SetAAEXPModifier)
.def("SetAAEXPModifier", (void(Lua_Client::*)(uint32,double,int16))&Lua_Client::SetAAEXPModifier)
.def("SetAAEXPModifier", (void(Lua_Client::*)(float))&Lua_Client::SetAAEXPModifier)
.def("SetAAEXPModifier", (void(Lua_Client::*)(uint32,float))&Lua_Client::SetAAEXPModifier)
.def("SetAAEXPModifier", (void(Lua_Client::*)(uint32,float,int16))&Lua_Client::SetAAEXPModifier)
.def("SetAAPoints", (void(Lua_Client::*)(int))&Lua_Client::SetAAPoints)
.def("SetAATitle", (void(Lua_Client::*)(std::string))&Lua_Client::SetAATitle)
.def("SetAATitle", (void(Lua_Client::*)(std::string,bool))&Lua_Client::SetAATitle)
Expand Down Expand Up @@ -3702,8 +3725,9 @@ luabind::scope lua_register_client() {
.def("SetEXP", (void(Lua_Client::*)(uint64,uint64))&Lua_Client::SetEXP)
.def("SetEXP", (void(Lua_Client::*)(uint64,uint64,bool))&Lua_Client::SetEXP)
.def("SetEXPEnabled", (void(Lua_Client::*)(bool))&Lua_Client::SetEXPEnabled)
.def("SetEXPModifier", (void(Lua_Client::*)(uint32,double))&Lua_Client::SetEXPModifier)
.def("SetEXPModifier", (void(Lua_Client::*)(uint32,double,int16))&Lua_Client::SetEXPModifier)
.def("SetEXPModifier", (void(Lua_Client::*)(float))&Lua_Client::SetEXPModifier)
.def("SetEXPModifier", (void(Lua_Client::*)(uint32,float))&Lua_Client::SetEXPModifier)
.def("SetEXPModifier", (void(Lua_Client::*)(uint32,float,int16))&Lua_Client::SetEXPModifier)
.def("SetEbonCrystals", (void(Lua_Client::*)(uint32))&Lua_Client::SetEbonCrystals)
.def("SetEndurance", (void(Lua_Client::*)(int))&Lua_Client::SetEndurance)
.def("SetEnvironmentDamageModifier", (void(Lua_Client::*)(int))&Lua_Client::SetEnvironmentDamageModifier)
Expand Down
20 changes: 12 additions & 8 deletions zone/lua_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,18 @@ class Lua_Client : public Lua_Mob
int GetBaseWIS();
int GetWeight();
uint32 GetEXP();
double GetEXPModifier(uint32 zone_id);
double GetEXPModifier(uint32 zone_id, int16 instance_version);
double GetAAEXPModifier(uint32 zone_id);
double GetAAEXPModifier(uint32 zone_id, int16 instance_version);
void SetAAEXPModifier(uint32 zone_id, double aa_modifier);
void SetAAEXPModifier(uint32 zone_id, double aa_modifier, int16 instance_version);
void SetEXPModifier(uint32 zone_id, double exp_modifier);
void SetEXPModifier(uint32 zone_id, double exp_modifier, int16 instance_version);
float GetEXPModifier();
float GetEXPModifier(uint32 zone_id);
float GetEXPModifier(uint32 zone_id, int16 instance_version);
float GetAAEXPModifier();
float GetAAEXPModifier(uint32 zone_id);
float GetAAEXPModifier(uint32 zone_id, int16 instance_version);
void SetAAEXPModifier(float aa_modifier);
void SetAAEXPModifier(uint32 zone_id, float aa_modifier);
void SetAAEXPModifier(uint32 zone_id, float aa_modifier, int16 instance_version);
void SetEXPModifier(float exp_modifier);
void SetEXPModifier(uint32 zone_id, float exp_modifier);
void SetEXPModifier(uint32 zone_id, float exp_modifier, int16 instance_version);
uint32 GetAAExp();
uint32 GetAAPercent();
uint32 GetTotalSecondsPlayed();
Expand Down
Loading

0 comments on commit 73a099c

Please sign in to comment.