aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorTeleqraph <nyrdeveloper@gmail.com>2023-12-28 19:11:54 +0100
committerGitHub <noreply@github.com>2023-12-28 19:11:54 +0100
commitbfbda8dcce8d19dda0ee3d8f96d176901902e102 (patch)
tree91b64aff7b61803bb6d4bb31d5eecde169a683ba /src/server/game/Entities
parent9c24f3ecd3053c47f07eedff33ce2be2103fa4f6 (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.cpp129
-rw-r--r--src/server/game/Entities/Creature/Creature.h11
-rw-r--r--src/server/game/Entities/Creature/CreatureData.h2
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp2
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp2
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())