aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-05-15 22:10:18 +0200
committerShauren <shauren.trinity@gmail.com>2022-05-15 22:10:18 +0200
commita4fba9b3c461676622079b166a376e29685d2ca7 (patch)
tree23d9087e1799bc7690ba63b177856059931e48fd /src
parent11cf79b4e5e5ab96ff6aae436b0e082cefdf3f51 (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
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp36
-rw-r--r--src/server/game/Entities/Creature/Creature.h1
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp4
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);