diff --git a/common/repositories/character_exp_modifiers_repository.h b/common/repositories/character_exp_modifiers_repository.h index 437806cc6..71d8f1c6b 100644 --- a/common/repositories/character_exp_modifiers_repository.h +++ b/common/repositories/character_exp_modifiers_repository.h @@ -74,9 +74,11 @@ public: }; } + const auto& m = l.front(); + return EXPModifier{ - .aa_modifier = l[0].aa_modifier, - .exp_modifier = l[0].exp_modifier + .aa_modifier = m.aa_modifier, + .exp_modifier = m.exp_modifier }; } diff --git a/zone/zone.cpp b/zone/zone.cpp index 2ec67403a..883b29f02 100644 --- a/zone/zone.cpp +++ b/zone/zone.cpp @@ -3165,6 +3165,11 @@ void Zone::ClearEXPModifier(Client* c) exp_modifiers.erase(c->CharacterID()); } +void Zone::ClearEXPModifierByCharacterID(const uint32 character_id) +{ + exp_modifiers.erase(character_id); +} + float Zone::GetAAEXPModifier(Client* c) { const auto& l = exp_modifiers.find(c->CharacterID()); @@ -3177,6 +3182,18 @@ float Zone::GetAAEXPModifier(Client* c) return v.aa_modifier; } +float Zone::GetAAEXPModifierByCharacterID(const uint32 character_id) +{ + const auto& l = exp_modifiers.find(character_id); + if (l == exp_modifiers.end()) { + return 1.0f; + } + + const auto& v = l->second; + + return v.aa_modifier; +} + float Zone::GetEXPModifier(Client* c) { const auto& l = exp_modifiers.find(c->CharacterID()); @@ -3189,6 +3206,18 @@ float Zone::GetEXPModifier(Client* c) return v.exp_modifier; } +float Zone::GetEXPModifierByCharacterID(const uint32 character_id) +{ + const auto& l = exp_modifiers.find(character_id); + if (l == exp_modifiers.end()) { + return 1.0f; + } + + const auto& v = l->second; + + return v.exp_modifier; +} + void Zone::SetAAEXPModifier(Client* c, float aa_modifier) { auto l = exp_modifiers.find(c->CharacterID()); @@ -3209,6 +3238,26 @@ void Zone::SetAAEXPModifier(Client* c, float aa_modifier) ); } +void Zone::SetAAEXPModifierByCharacterID(const uint32 character_id, float aa_modifier) +{ + auto l = exp_modifiers.find(character_id); + if (l == exp_modifiers.end()) { + return; + } + + auto& m = l->second; + + m.aa_modifier = aa_modifier; + + CharacterExpModifiersRepository::SetEXPModifier( + database, + character_id, + GetZoneID(), + GetInstanceVersion(), + m + ); +} + void Zone::SetEXPModifier(Client* c, float exp_modifier) { auto l = exp_modifiers.find(c->CharacterID()); @@ -3229,6 +3278,26 @@ void Zone::SetEXPModifier(Client* c, float exp_modifier) ); } +void Zone::SetEXPModifierByCharacterID(const uint32 character_id, float exp_modifier) +{ + auto l = exp_modifiers.find(character_id); + if (l == exp_modifiers.end()) { + return; + } + + auto& m = l->second; + + m.exp_modifier = exp_modifier; + + CharacterExpModifiersRepository::SetEXPModifier( + database, + character_id, + GetZoneID(), + GetInstanceVersion(), + m + ); +} + bool Zone::IsIdleWhenEmpty() const { return m_idle_when_empty; diff --git a/zone/zone.h b/zone/zone.h index 40ae68ce1..946b14347 100755 --- a/zone/zone.h +++ b/zone/zone.h @@ -269,10 +269,15 @@ public: void SendReloadMessage(std::string reload_type); void ClearEXPModifier(Client* c); + void ClearEXPModifierByCharacterID(const uint32 character_id); float GetAAEXPModifier(Client* c); + float GetAAEXPModifierByCharacterID(const uint32 character_id); float GetEXPModifier(Client* c); + float GetEXPModifierByCharacterID(const uint32 character_id); void SetAAEXPModifier(Client* c, float aa_modifier); + void SetAAEXPModifierByCharacterID(const uint32 character_id, float aa_modifier); void SetEXPModifier(Client* c, float exp_modifier); + void SetEXPModifierByCharacterID(const uint32 character_id, float exp_modifier); void AddAggroMob() { aggroedmobs++; } void AddAuth(ServerZoneIncomingClient_Struct *szic); diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index d1e75f876..2c22b9143 100644 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -4270,7 +4270,7 @@ void ZoneDatabase::SetAAEXPModifierByCharID( instance_version, EXPModifier{ .aa_modifier = aa_modifier, - .exp_modifier = -1.0f + .exp_modifier = zone->GetEXPModifierByCharacterID(character_id) } ); } @@ -4288,7 +4288,7 @@ void ZoneDatabase::SetEXPModifierByCharID( zone_id, instance_version, EXPModifier{ - .aa_modifier = -1.0f, + .aa_modifier = zone->GetAAEXPModifierByCharacterID(character_id), .exp_modifier = exp_modifier } );