diff options
| author | Teleqraph <nyrdeveloper@gmail.com> | 2023-12-28 19:11:54 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-28 19:11:54 +0100 |
| commit | bfbda8dcce8d19dda0ee3d8f96d176901902e102 (patch) | |
| tree | 91b64aff7b61803bb6d4bb31d5eecde169a683ba /src/server/game/Entities | |
| parent | 9c24f3ecd3053c47f07eedff33ce2be2103fa4f6 (diff) | |
Core/Creatures: Refactor CreatureEliteType (#29525)
* Turn into enum class with official names
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 129 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 11 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/CreatureData.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/StatSystem.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 2 |
6 files changed, 84 insertions, 64 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 884d48f6f7e..48be8874ff8 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -192,7 +192,7 @@ WorldPacket CreatureTemplate::BuildQueryData(LocaleConstant loc, Difficulty diff stats.CreatureType = type; stats.CreatureFamily = family; - stats.Classification = rank; + stats.Classification = uint32(Classification); for (uint32 i = 0; i < MAX_KILL_CREDIT; ++i) stats.ProxyCreatureID[i] = KillCredit[i]; @@ -1114,19 +1114,25 @@ bool Creature::Create(ObjectGuid::LowType guidlow, Map* map, uint32 entry, Posit if (cinfo->flags_extra & CREATURE_FLAG_EXTRA_DUNGEON_BOSS && map->IsDungeon()) m_respawnDelay = 0; // special value, prevents respawn for dungeon bosses unless overridden - switch (cinfo->rank) + switch (GetCreatureClassification()) { - case CREATURE_ELITE_RARE: - m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_RARE); - break; - case CREATURE_ELITE_ELITE: + case CreatureClassifications::Elite: m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_ELITE); break; - case CREATURE_ELITE_RAREELITE: + case CreatureClassifications::RareElite: m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_RAREELITE); break; - case CREATURE_ELITE_WORLDBOSS: - m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_WORLDBOSS); + case CreatureClassifications::Obsolete: + m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_OBSOLETE); + break; + case CreatureClassifications::Rare: + m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_RARE); + break; + case CreatureClassifications::Trivial: + m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_TRIVIAL); + break; + case CreatureClassifications::MinusMob: + m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_MINUSMOB); break; default: m_corpseDelay = sWorld->getIntConfig(CONFIG_CORPSE_DECAY_NORMAL); @@ -1574,12 +1580,12 @@ void Creature::SelectLevel() void Creature::UpdateLevelDependantStats() { CreatureTemplate const* cInfo = GetCreatureTemplate(); - uint32 rank = IsPet() ? 0 : cInfo->rank; + CreatureClassifications classification = IsPet() ? CreatureClassifications::Normal : cInfo->Classification; uint8 level = GetLevel(); CreatureBaseStats const* stats = sObjectMgr->GetCreatureBaseStats(level, cInfo->unit_class); // health - float healthmod = _GetHealthMod(rank); + float healthmod = GetHealthMod(classification); uint32 basehp = GetMaxHealthByLevel(level); uint32 health = uint32(basehp * healthmod); @@ -1641,22 +1647,26 @@ void Creature::SelectWildBattlePetLevel() } } -float Creature::_GetHealthMod(int32 Rank) +float Creature::GetHealthMod(CreatureClassifications classification) { - switch (Rank) // define rates for each elite rank + switch (classification) { - case CREATURE_ELITE_NORMAL: - return sWorld->getRate(RATE_CREATURE_NORMAL_HP); - case CREATURE_ELITE_ELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_HP); - case CREATURE_ELITE_RAREELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_RAREELITE_HP); - case CREATURE_ELITE_WORLDBOSS: - return sWorld->getRate(RATE_CREATURE_ELITE_WORLDBOSS_HP); - case CREATURE_ELITE_RARE: - return sWorld->getRate(RATE_CREATURE_ELITE_RARE_HP); + case CreatureClassifications::Normal: + return sWorld->getRate(RATE_CREATURE_HP_NORMAL); + case CreatureClassifications::Elite: + return sWorld->getRate(RATE_CREATURE_HP_ELITE); + case CreatureClassifications::RareElite: + return sWorld->getRate(RATE_CREATURE_HP_RAREELITE); + case CreatureClassifications::Obsolete: + return sWorld->getRate(RATE_CREATURE_HP_OBSOLETE); + case CreatureClassifications::Rare: + return sWorld->getRate(RATE_CREATURE_HP_RARE); + case CreatureClassifications::Trivial: + return sWorld->getRate(RATE_CREATURE_HP_TRIVIAL); + case CreatureClassifications::MinusMob: + return sWorld->getRate(RATE_CREATURE_HP_MINUSMOB); default: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_HP); + return sWorld->getRate(RATE_CREATURE_HP_ELITE); } } @@ -1666,41 +1676,49 @@ void Creature::LowerPlayerDamageReq(uint64 unDamage) m_PlayerDamageReq > unDamage ? m_PlayerDamageReq -= unDamage : m_PlayerDamageReq = 0; } -float Creature::_GetDamageMod(int32 Rank) -{ - switch (Rank) // define rates for each elite rank - { - case CREATURE_ELITE_NORMAL: - return sWorld->getRate(RATE_CREATURE_NORMAL_DAMAGE); - case CREATURE_ELITE_ELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_DAMAGE); - case CREATURE_ELITE_RAREELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_RAREELITE_DAMAGE); - case CREATURE_ELITE_WORLDBOSS: - return sWorld->getRate(RATE_CREATURE_ELITE_WORLDBOSS_DAMAGE); - case CREATURE_ELITE_RARE: - return sWorld->getRate(RATE_CREATURE_ELITE_RARE_DAMAGE); +float Creature::GetDamageMod(CreatureClassifications classification) +{ + switch (classification) + { + case CreatureClassifications::Normal: + return sWorld->getRate(RATE_CREATURE_DAMAGE_NORMAL); + case CreatureClassifications::Elite: + return sWorld->getRate(RATE_CREATURE_DAMAGE_ELITE); + case CreatureClassifications::RareElite: + return sWorld->getRate(RATE_CREATURE_DAMAGE_RAREELITE); + case CreatureClassifications::Obsolete: + return sWorld->getRate(RATE_CREATURE_DAMAGE_OBSOLETE); + case CreatureClassifications::Rare: + return sWorld->getRate(RATE_CREATURE_DAMAGE_RARE); + case CreatureClassifications::Trivial: + return sWorld->getRate(RATE_CREATURE_DAMAGE_TRIVIAL); + case CreatureClassifications::MinusMob: + return sWorld->getRate(RATE_CREATURE_DAMAGE_MINUSMOB); default: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_DAMAGE); + return sWorld->getRate(RATE_CREATURE_DAMAGE_ELITE); } } -float Creature::GetSpellDamageMod(int32 Rank) const +float Creature::GetSpellDamageMod(CreatureClassifications classification) const { - switch (Rank) // define rates for each elite rank + switch (classification) { - case CREATURE_ELITE_NORMAL: - return sWorld->getRate(RATE_CREATURE_NORMAL_SPELLDAMAGE); - case CREATURE_ELITE_ELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE); - case CREATURE_ELITE_RAREELITE: - return sWorld->getRate(RATE_CREATURE_ELITE_RAREELITE_SPELLDAMAGE); - case CREATURE_ELITE_WORLDBOSS: - return sWorld->getRate(RATE_CREATURE_ELITE_WORLDBOSS_SPELLDAMAGE); - case CREATURE_ELITE_RARE: - return sWorld->getRate(RATE_CREATURE_ELITE_RARE_SPELLDAMAGE); + case CreatureClassifications::Normal: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_NORMAL); + case CreatureClassifications::Elite: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_ELITE); + case CreatureClassifications::RareElite: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_RAREELITE); + case CreatureClassifications::Obsolete: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_OBSOLETE); + case CreatureClassifications::Rare: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_RARE); + case CreatureClassifications::Trivial: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_TRIVIAL); + case CreatureClassifications::MinusMob: + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_MINUSMOB); default: - return sWorld->getRate(RATE_CREATURE_ELITE_ELITE_SPELLDAMAGE); + return sWorld->getRate(RATE_CREATURE_SPELLDAMAGE_ELITE); } } @@ -1948,7 +1966,7 @@ void Creature::SetSpawnHealth() curhealth = m_creatureData->curhealth; if (curhealth) { - curhealth = uint32(curhealth*_GetHealthMod(GetCreatureTemplate()->rank)); + curhealth = uint32(curhealth*GetHealthMod(GetCreatureTemplate()->Classification)); if (curhealth < 1) curhealth = 1; } @@ -2444,13 +2462,12 @@ bool Creature::IsImmunedToSpellEffect(SpellInfo const* spellInfo, SpellEffectInf return Unit::IsImmunedToSpellEffect(spellInfo, spellEffectInfo, caster, requireImmunityPurgesEffectAttribute); } -bool Creature::isElite() const +bool Creature::IsElite() const { if (IsPet()) return false; - uint32 rank = GetCreatureTemplate()->rank; - return rank != CREATURE_ELITE_NORMAL && rank != CREATURE_ELITE_RARE; + return HasClassification(CreatureClassifications::Elite) || HasClassification(CreatureClassifications::RareElite); } bool Creature::isWorldBoss() const diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 46aa837a386..8c77b6dd3eb 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -129,6 +129,9 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma MovementGeneratorType GetDefaultMovementType() const override { return m_defaultMovementType; } void SetDefaultMovementType(MovementGeneratorType mgt) { m_defaultMovementType = mgt; } + CreatureClassifications GetCreatureClassification() const { return GetCreatureTemplate()->Classification; } + bool HasClassification(CreatureClassifications classification) const { return GetCreatureTemplate()->Classification == classification; } + bool IsDungeonBoss() const { return (GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_DUNGEON_BOSS) != 0; } bool IsAffectedByDiminishingReturns() const override { return Unit::IsAffectedByDiminishingReturns() || (GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH) != 0; } @@ -157,7 +160,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool CanCreatureAttack(Unit const* victim, bool force = true) const; void LoadTemplateImmunities(); bool IsImmunedToSpellEffect(SpellInfo const* spellInfo, SpellEffectInfo const& spellEffectInfo, WorldObject const* caster, bool requireImmunityPurgesEffectAttribute = false) const override; - bool isElite() const; + bool IsElite() const; bool isWorldBoss() const; bool HasScalableLevels() const; @@ -208,7 +211,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma uint8 GetCurrentEquipmentId() const { return m_equipmentId; } void SetCurrentEquipmentId(uint8 id) { m_equipmentId = id; } - float GetSpellDamageMod(int32 Rank) const; + float GetSpellDamageMod(CreatureClassifications classification) const; VendorItemData const* GetVendorItems() const; uint32 GetVendorItemCurrentCount(VendorItem const* vItem); @@ -366,7 +369,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma void SetRespawnCompatibilityMode(bool mode = true) { m_respawnCompatibilityMode = mode; } bool GetRespawnCompatibilityMode() { return m_respawnCompatibilityMode; } - static float _GetDamageMod(int32 Rank); + static float GetDamageMod(CreatureClassifications classification); float m_SightDistance, m_CombatDistance; @@ -436,7 +439,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma // vendor items VendorItemCounts m_vendorItemCounts; - static float _GetHealthMod(int32 Rank); + static float GetHealthMod(CreatureClassifications classification); GuidUnorderedSet m_tapList; bool m_dontClearTapListOnEvade; diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index 31961aa04c9..1f706e5c8d2 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -518,7 +518,7 @@ struct TC_GAME_API CreatureTemplate float speed_walk; float speed_run; float scale; - uint32 rank; + CreatureClassifications Classification; uint32 dmgschool; uint32 BaseAttackTime; uint32 RangeAttackTime; diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 067b2f6b74f..35da121270d 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -908,7 +908,7 @@ bool Guardian::InitStatsForLevel(uint8 petlevel) ApplyLevelScaling(); CreatureDifficulty const* creatureDifficulty = GetCreatureDifficulty(); - SetCreateHealth(std::max(sDB2Manager.EvaluateExpectedStat(ExpectedStatType::CreatureHealth, petlevel, creatureDifficulty->GetHealthScalingExpansion(), m_unitData->ContentTuningID, Classes(cinfo->unit_class), 0) * creatureDifficulty->HealthModifier * _GetHealthMod(cinfo->rank), 1.0f)); + SetCreateHealth(std::max(sDB2Manager.EvaluateExpectedStat(ExpectedStatType::CreatureHealth, petlevel, creatureDifficulty->GetHealthScalingExpansion(), m_unitData->ContentTuningID, Classes(cinfo->unit_class), 0) * creatureDifficulty->HealthModifier * GetHealthMod(cinfo->Classification), 1.0f)); SetCreateMana(stats->BaseMana); SetCreateStat(STAT_STRENGTH, 22); SetCreateStat(STAT_AGILITY, 22); diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 3373462cba6..5f97bb49a7c 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -1034,7 +1034,7 @@ void Creature::CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, float basePct = GetPctModifierValue(unitMod, BASE_PCT) * attackSpeedMulti; float totalValue = GetFlatModifierValue(unitMod, TOTAL_VALUE); float totalPct = addTotalPct ? GetPctModifierValue(unitMod, TOTAL_PCT) : 1.0f; - float dmgMultiplier = GetCreatureDifficulty()->DamageModifier; // = DamageModifier * _GetDamageMod(rank); + float dmgMultiplier = GetCreatureDifficulty()->DamageModifier; // = DamageModifier * GetDamageMod(rank); minDamage = ((weaponMinDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct; maxDamage = ((weaponMaxDamage + baseValue) * dmgMultiplier * basePct + totalValue) * totalPct; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a6742b85860..c805ba9025e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -6635,7 +6635,7 @@ float Unit::SpellDamagePctDone(Unit* victim, SpellInfo const* spellProto, Damage // Pet damage? if (GetTypeId() == TYPEID_UNIT && !IsPet()) - DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank); + DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->Classification); // Versatility if (Player* modOwner = GetSpellModOwner()) |
