diff options
author | SnapperRy <snapperryen@gmail.com> | 2016-09-24 03:50:20 +0200 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2017-03-03 22:01:47 +0100 |
commit | 3897de67a4c4264a2a9e86802fb50d37aac60f3c (patch) | |
tree | 333ff3bacc645a7fa1cc5c9f504afb4e7856703c | |
parent | 3b0e6250ad3e537621370f7999532907f35ff2d8 (diff) |
Core/Creature: update health/mana/damage/armor when changing a creature's entry while keeping the original level.
Fixes an issue introduced in a6ef9d4.
(cherry picked from commit 3d075da5049e382ba759b8a79d2fbd2df58da5c7)
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 1 |
2 files changed, 12 insertions, 6 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index cbb026fb665..68c0065095b 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -445,10 +445,9 @@ bool Creature::UpdateEntry(uint32 entry, CreatureData const* data /*= nullptr*/, if (updateLevel) SelectLevel(); + UpdateLevelDependantStats(); + SetMeleeDamageSchool(SpellSchools(cInfo->dmgschool)); - CreatureBaseStats const* stats = sObjectMgr->GetCreatureBaseStats(getLevel(), cInfo->unit_class); - float armor = (float)stats->GenerateArmor(cInfo); /// @todo Why is this treated as uint32 when it's a float? - SetModifierValue(UNIT_MOD_ARMOR, BASE_VALUE, armor); SetModifierValue(UNIT_MOD_RESISTANCE_HOLY, BASE_VALUE, float(cInfo->resistance[SPELL_SCHOOL_HOLY])); SetModifierValue(UNIT_MOD_RESISTANCE_FIRE, BASE_VALUE, float(cInfo->resistance[SPELL_SCHOOL_FIRE])); SetModifierValue(UNIT_MOD_RESISTANCE_NATURE, BASE_VALUE, float(cInfo->resistance[SPELL_SCHOOL_NATURE])); @@ -1190,15 +1189,18 @@ void Creature::SelectLevel() { CreatureTemplate const* cInfo = GetCreatureTemplate(); - uint32 rank = IsPet() ? 0 : cInfo->rank; - // level uint8 minlevel = std::min(cInfo->maxlevel, cInfo->minlevel); uint8 maxlevel = std::max(cInfo->maxlevel, cInfo->minlevel); uint8 level = minlevel == maxlevel ? minlevel : urand(minlevel, maxlevel); SetLevel(level); +} - CreatureBaseStats const* stats = sObjectMgr->GetCreatureBaseStats(level, cInfo->unit_class); +void Creature::UpdateLevelDependantStats() +{ + CreatureTemplate const* cInfo = GetCreatureTemplate(); + uint32 rank = IsPet() ? 0 : cInfo->rank; + CreatureBaseStats const* stats = sObjectMgr->GetCreatureBaseStats(getLevel(), cInfo->unit_class); // health float healthmod = _GetHealthMod(rank); @@ -1250,6 +1252,9 @@ void Creature::SelectLevel() SetModifierValue(UNIT_MOD_ATTACK_POWER, BASE_VALUE, stats->AttackPower); SetModifierValue(UNIT_MOD_ATTACK_POWER_RANGED, BASE_VALUE, stats->RangedAttackPower); + + float armor = (float)stats->GenerateArmor(cInfo); /// @todo Why is this treated as uint32 when it's a float? + SetModifierValue(UNIT_MOD_ARMOR, BASE_VALUE, armor); } float Creature::_GetHealthMod(int32 Rank) diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 32fbbddb2b4..8bcebd60bf7 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -718,6 +718,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, uint32 entry, float x, float y, float z, float ang, CreatureData const* data = nullptr, uint32 vehId = 0); bool LoadCreaturesAddon(); void SelectLevel(); + void UpdateLevelDependantStats(); void LoadEquipment(int8 id = 1, bool force = false); void SetSpawnHealth(); |