diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-05-15 22:10:18 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-05-15 22:10:18 +0200 |
commit | a4fba9b3c461676622079b166a376e29685d2ca7 (patch) | |
tree | 23d9087e1799bc7690ba63b177856059931e48fd | |
parent | 11cf79b4e5e5ab96ff6aae436b0e082cefdf3f51 (diff) |
Core/Creatures: Only use scaling data when it was actually loaded for the creature, not always if it just exists in db
Closes #27954
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 4 |
3 files changed, 22 insertions, 19 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 03f2b9f783e..3bb3e37389b 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1526,20 +1526,7 @@ void Creature::SelectLevel() uint8 level = minlevel == maxlevel ? minlevel : urand(minlevel, maxlevel); SetLevel(level); - CreatureLevelScaling const* scaling = cInfo->GetLevelScaling(GetMap()->GetDifficultyID()); - - if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(scaling->ContentTuningID, 0)) - { - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ScalingLevelMin), levels->MinLevel); - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ScalingLevelMax), levels->MaxLevel); - } - - int32 mindelta = std::min(scaling->DeltaLevelMax, scaling->DeltaLevelMin); - int32 maxdelta = std::max(scaling->DeltaLevelMax, scaling->DeltaLevelMin); - int32 delta = mindelta == maxdelta ? mindelta : irand(mindelta, maxdelta); - - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ScalingLevelDelta), delta); - SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ContentTuningID), scaling->ContentTuningID); + ApplyLevelScaling(); UpdateLevelDependantStats(); } @@ -2881,10 +2868,25 @@ void Creature::AllLootRemovedFromCorpse() bool Creature::HasScalableLevels() const { - CreatureTemplate const* cinfo = GetCreatureTemplate(); - CreatureLevelScaling const* scaling = cinfo->GetLevelScaling(GetMap()->GetDifficultyID()); + return m_unitData->ContentTuningID != 0; +} + +void Creature::ApplyLevelScaling() +{ + CreatureLevelScaling const* scaling = GetCreatureTemplate()->GetLevelScaling(GetMap()->GetDifficultyID()); - return scaling->ContentTuningID != 0; + if (Optional<ContentTuningLevels> levels = sDB2Manager.GetContentTuningData(scaling->ContentTuningID, 0)) + { + SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ScalingLevelMin), levels->MinLevel); + SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ScalingLevelMax), levels->MaxLevel); + } + + int32 mindelta = std::min(scaling->DeltaLevelMax, scaling->DeltaLevelMin); + int32 maxdelta = std::max(scaling->DeltaLevelMax, scaling->DeltaLevelMin); + int32 delta = mindelta == maxdelta ? mindelta : irand(mindelta, maxdelta); + + SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ScalingLevelDelta), delta); + SetUpdateFieldValue(m_values.ModifyValue(&Unit::m_unitData).ModifyValue(&UF::UnitData::ContentTuningID), scaling->ContentTuningID); } uint64 Creature::GetMaxHealthByLevel(uint8 level) const diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index a746021f3d3..0f5e4882ced 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -155,6 +155,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool isWorldBoss() const; bool HasScalableLevels() const; + void ApplyLevelScaling(); uint8 GetLevelForTarget(WorldObject const* target) const override; uint64 GetMaxHealthByLevel(uint8 level) const; diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index a3c2313e63f..2544886ff87 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -914,9 +914,9 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) { // remove elite bonuses included in DB values CreatureBaseStats const* stats = sObjectMgr->GetCreatureBaseStats(petlevel, cinfo->unit_class); - CreatureLevelScaling const* scaling = cinfo->GetLevelScaling(GetMap()->GetDifficultyID()); + ApplyLevelScaling(); - SetCreateHealth(sDB2Manager.EvaluateExpectedStat(ExpectedStatType::CreatureHealth, petlevel, cinfo->GetHealthScalingExpansion(), scaling->ContentTuningID, Classes(cinfo->unit_class)) * cinfo->ModHealth * cinfo->ModHealthExtra * _GetHealthMod(cinfo->rank)); + SetCreateHealth(sDB2Manager.EvaluateExpectedStat(ExpectedStatType::CreatureHealth, petlevel, cinfo->GetHealthScalingExpansion(), m_unitData->ContentTuningID, Classes(cinfo->unit_class)) * cinfo->ModHealth * cinfo->ModHealthExtra * _GetHealthMod(cinfo->rank)); SetCreateMana(stats->GenerateMana(cinfo)); SetCreateStat(STAT_STRENGTH, 22); SetCreateStat(STAT_AGILITY, 22); |