Core/Creatures: Only use scaling data when it was actually loaded for the creature, not always if it just exists in db

Closes #27954
This commit is contained in:
Shauren
2022-05-15 22:10:18 +02:00
parent 11cf79b4e5
commit a4fba9b3c4
3 changed files with 22 additions and 19 deletions

View File

@@ -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;
}
return scaling->ContentTuningID != 0;
void Creature::ApplyLevelScaling()
{
CreatureLevelScaling const* scaling = GetCreatureTemplate()->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);
}
uint64 Creature::GetMaxHealthByLevel(uint8 level) const

View File

@@ -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;

View File

@@ -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);