Core/Creatures: Refactor CreatureEliteType

Port From (https://github.com/TrinityCore/TrinityCore/commit/bfbda8dcce8d19dda0ee3d8f96d176901902e102)
This commit is contained in:
hondacrx
2024-02-04 14:42:40 -05:00
parent 85d4043217
commit a46f98642b
10 changed files with 218 additions and 160 deletions
+71 -54
View File
@@ -833,22 +833,25 @@ namespace Game.Entities
if (cinfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.DungeonBoss) && map.IsDungeon())
m_respawnDelay = 0; // special value, prevents respawn for dungeon bosses unless overridden
switch (cinfo.Rank)
switch (GetCreatureClassification())
{
case CreatureEliteType.Rare:
m_corpseDelay = WorldConfig.GetUIntValue(WorldCfg.CorpseDecayRare);
break;
case CreatureEliteType.Elite:
case CreatureClassifications.Elite:
m_corpseDelay = WorldConfig.GetUIntValue(WorldCfg.CorpseDecayElite);
break;
case CreatureEliteType.RareElite:
case CreatureClassifications.RareElite:
m_corpseDelay = WorldConfig.GetUIntValue(WorldCfg.CorpseDecayRareelite);
break;
case CreatureEliteType.WorldBoss:
m_corpseDelay = WorldConfig.GetUIntValue(WorldCfg.CorpseDecayWorldboss);
case CreatureClassifications.Obsolete:
m_corpseDelay = WorldConfig.GetUIntValue(WorldCfg.CorpseDecayObsolete);
break;
default:
m_corpseDelay = WorldConfig.GetUIntValue(WorldCfg.CorpseDecayNormal);
case CreatureClassifications.Rare:
m_corpseDelay = WorldConfig.GetUIntValue(WorldCfg.CorpseDecayRare);
break;
case CreatureClassifications.Trivial:
m_corpseDelay = WorldConfig.GetUIntValue(WorldCfg.CorpseDecayTrivial);
break;
case CreatureClassifications.MinusMob:
m_corpseDelay = WorldConfig.GetUIntValue(WorldCfg.CorpseDecayMinusMob);
break;
}
@@ -1458,12 +1461,12 @@ namespace Game.Entities
void UpdateLevelDependantStats()
{
CreatureTemplate cInfo = GetCreatureTemplate();
CreatureEliteType rank = IsPet() ? 0 : cInfo.Rank;
CreatureClassifications classification = IsPet() ? CreatureClassifications.Normal : cInfo.Classification;
uint level = GetLevel();
CreatureBaseStats stats = Global.ObjectMgr.GetCreatureBaseStats(level, cInfo.UnitClass);
// health
float healthmod = GetHealthMod(rank);
float healthmod = GetHealthMod(classification);
uint basehp = (uint)GetMaxHealthByLevel(level);
uint health = (uint)(basehp * healthmod);
@@ -1526,22 +1529,26 @@ namespace Game.Entities
}
}
public float GetHealthMod(CreatureEliteType Rank)
public float GetHealthMod(CreatureClassifications classification)
{
switch (Rank) // define rates for each elite rank
switch (classification) // define rates for each elite rank
{
case CreatureEliteType.Normal:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureNormalHp);
case CreatureEliteType.Elite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteEliteHp);
case CreatureEliteType.RareElite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteRareeliteHp);
case CreatureEliteType.WorldBoss:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteWorldbossHp);
case CreatureEliteType.Rare:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteRareHp);
case CreatureClassifications.Normal:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureHpNormal);
case CreatureClassifications.Elite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureHpElite);
case CreatureClassifications.RareElite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureHpRareelite);
case CreatureClassifications.Obsolete:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureHpObsolete);
case CreatureClassifications.Rare:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureHpRare);
case CreatureClassifications.Trivial:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureHpTrivial);
case CreatureClassifications.MinusMob:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureHpMinusmob);
default:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteRareeliteHp);
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureHpElite);
}
}
@@ -1556,41 +1563,49 @@ namespace Game.Entities
}
}
public static float _GetDamageMod(CreatureEliteType Rank)
public static float GetDamageMod(CreatureClassifications classification)
{
switch (Rank) // define rates for each elite rank
switch (classification)
{
case CreatureEliteType.Normal:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureNormalDamage);
case CreatureEliteType.Elite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteEliteDamage);
case CreatureEliteType.RareElite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteRareeliteDamage);
case CreatureEliteType.WorldBoss:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteWorldbossDamage);
case CreatureEliteType.Rare:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteRareDamage);
case CreatureClassifications.Normal:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureDamageNormal);
case CreatureClassifications.Elite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureDamageElite);
case CreatureClassifications.RareElite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureDamageRareelite);
case CreatureClassifications.Obsolete:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureDamageObsolete);
case CreatureClassifications.Rare:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureDamageRare);
case CreatureClassifications.Trivial:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureDamageTrivial);
case CreatureClassifications.MinusMob:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureDamageMinusmob);
default:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteEliteDamage);
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureDamageElite);
}
}
public float GetSpellDamageMod(CreatureEliteType Rank)
public float GetSpellDamageMod(CreatureClassifications classification)
{
switch (Rank) // define rates for each elite rank
switch (classification) // define rates for each elite rank
{
case CreatureEliteType.Normal:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureNormalSpelldamage);
case CreatureEliteType.Elite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteEliteSpelldamage);
case CreatureEliteType.RareElite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteRareeliteSpelldamage);
case CreatureEliteType.WorldBoss:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteWorldbossSpelldamage);
case CreatureEliteType.Rare:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteRareSpelldamage);
case CreatureClassifications.Normal:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureSpelldamageNormal);
case CreatureClassifications.Elite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureSpelldamageElite);
case CreatureClassifications.RareElite:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureSpelldamageRareelite);
case CreatureClassifications.Obsolete:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureSpelldamageObsolete);
case CreatureClassifications.Rare:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureSpelldamageRare);
case CreatureClassifications.Trivial:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureSpelldamageTrivial);
case CreatureClassifications.MinusMob:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureSpelldamageMinusmob);
default:
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureEliteEliteSpelldamage);
return WorldConfig.GetFloatValue(WorldCfg.RateCreatureSpelldamageElite);
}
}
@@ -1729,7 +1744,7 @@ namespace Game.Entities
curhealth = m_creatureData.curhealth;
if (curhealth != 0)
{
curhealth = (uint)(curhealth * GetHealthMod(GetCreatureTemplate().Rank));
curhealth = (uint)(curhealth * GetHealthMod(GetCreatureTemplate().Classification));
if (curhealth < 1)
curhealth = 1;
}
@@ -2205,8 +2220,7 @@ namespace Game.Entities
if (IsPet())
return false;
var rank = GetCreatureTemplate().Rank;
return rank != CreatureEliteType.Elite && rank != CreatureEliteType.RareElite;
return HasClassification(CreatureClassifications.Elite) || HasClassification(CreatureClassifications.RareElite);
}
public bool IsWorldBoss()
@@ -3449,6 +3463,9 @@ namespace Game.Entities
public override MovementGeneratorType GetDefaultMovementType() { return DefaultMovementType; }
public void SetDefaultMovementType(MovementGeneratorType mgt) { DefaultMovementType = mgt; }
public CreatureClassifications GetCreatureClassification() { return GetCreatureTemplate().Classification; }
public bool HasClassification(CreatureClassifications classification) { return GetCreatureTemplate().Classification == classification; }
public long GetRespawnTime() { return m_respawnTime; }
public void SetRespawnTime(uint respawn) { m_respawnTime = respawn != 0 ? GameTime.GetGameTime() + respawn : 0; }
@@ -30,7 +30,7 @@ namespace Game.Entities
public float SpeedWalk;
public float SpeedRun;
public float Scale;
public CreatureEliteType Rank;
public CreatureClassifications Classification;
public uint DmgSchool;
public uint BaseAttackTime;
public uint RangeAttackTime;
@@ -165,7 +165,7 @@ namespace Game.Entities
stats.CreatureType = (int)CreatureType;
stats.CreatureFamily = (int)Family;
stats.Classification = (int)Rank;
stats.Classification = (int)Classification;
for (uint i = 0; i < SharedConst.MaxCreatureKillCredit; ++i)
stats.ProxyCreatureID[i] = KillCredit[i];
+1 -1
View File
@@ -654,7 +654,7 @@ namespace Game.Entities
ApplyLevelScaling();
CreatureDifficulty creatureDifficulty = GetCreatureDifficulty();
SetCreateHealth((uint)Math.Max(Global.DB2Mgr.EvaluateExpectedStat(ExpectedStatType.CreatureHealth, petlevel, creatureDifficulty.GetHealthScalingExpansion(), m_unitData.ContentTuningID, (Class)cinfo.UnitClass, 0) * creatureDifficulty.HealthModifier * GetHealthMod(cinfo.Rank), 1.0f));
SetCreateHealth((uint)Math.Max(Global.DB2Mgr.EvaluateExpectedStat(ExpectedStatType.CreatureHealth, petlevel, creatureDifficulty.GetHealthScalingExpansion(), m_unitData.ContentTuningID, (Class)cinfo.UnitClass, 0) * creatureDifficulty.HealthModifier * GetHealthMod(cinfo.Classification), 1.0f));
SetCreateMana(stats.BaseMana);
SetCreateStat(Stats.Strength, 22);
+1 -1
View File
@@ -176,7 +176,7 @@ namespace Game.Entities
// Pet damage?
if (IsTypeId(TypeId.Unit) && !IsPet())
DoneTotalMod *= ToCreature().GetSpellDamageMod(ToCreature().GetCreatureTemplate().Rank);
DoneTotalMod *= ToCreature().GetSpellDamageMod(ToCreature().GetCreatureTemplate().Classification);
// Versatility
Player modOwner = GetSpellModOwner();
+2 -2
View File
@@ -1791,7 +1791,7 @@ namespace Game
creature.SpeedWalk = fields.Read<float>(12);
creature.SpeedRun = fields.Read<float>(13);
creature.Scale = fields.Read<float>(14);
creature.Rank = (CreatureEliteType)fields.Read<uint>(15);
creature.Classification = (CreatureClassifications)fields.Read<uint>(15);
creature.DmgSchool = fields.Read<uint>(16);
creature.BaseAttackTime = fields.Read<uint>(17);
creature.RangeAttackTime = fields.Read<uint>(18);
@@ -2727,7 +2727,7 @@ namespace Game
creatureDifficulty.StaticFlags = new(result.Read<uint>(18), result.Read<uint>(19), result.Read<uint>(20), result.Read<uint>(21), result.Read<uint>(22), result.Read<uint>(23), result.Read<uint>(24), result.Read<uint>(25));
// TODO: Check if this still applies
creatureDifficulty.DamageModifier *= Creature._GetDamageMod(template.Rank);
creatureDifficulty.DamageModifier *= Creature.GetDamageMod(template.Classification);
if (creatureDifficulty.HealthScalingExpansion < (int)Expansion.LevelCurrent || creatureDifficulty.HealthScalingExpansion >= (int)Expansion.Max)
{
+28 -20
View File
@@ -86,21 +86,27 @@ namespace Game
Values[WorldCfg.RateReputationLowLevelKill] = GetDefaultValue("Rate.Reputation.LowLevel.Kill", 1.0f);
Values[WorldCfg.RateReputationLowLevelQuest] = GetDefaultValue("Rate.Reputation.LowLevel.Quest", 1.0f);
Values[WorldCfg.RateReputationRecruitAFriendBonus] = GetDefaultValue("Rate.Reputation.RecruitAFriendBonus", 0.1f);
Values[WorldCfg.RateCreatureNormalDamage] = GetDefaultValue("Rate.Creature.Normal.Damage", 1.0f);
Values[WorldCfg.RateCreatureEliteEliteDamage] = GetDefaultValue("Rate.Creature.Elite.Elite.Damage", 1.0f);
Values[WorldCfg.RateCreatureEliteRareeliteDamage] = GetDefaultValue("Rate.Creature.Elite.RAREELITE.Damage", 1.0f);
Values[WorldCfg.RateCreatureEliteWorldbossDamage] = GetDefaultValue("Rate.Creature.Elite.WORLDBOSS.Damage", 1.0f);
Values[WorldCfg.RateCreatureEliteRareDamage] = GetDefaultValue("Rate.Creature.Elite.RARE.Damage", 1.0f);
Values[WorldCfg.RateCreatureNormalHp] = GetDefaultValue("Rate.Creature.Normal.HP", 1.0f);
Values[WorldCfg.RateCreatureEliteEliteHp] = GetDefaultValue("Rate.Creature.Elite.Elite.HP", 1.0f);
Values[WorldCfg.RateCreatureEliteRareeliteHp] = GetDefaultValue("Rate.Creature.Elite.RAREELITE.HP", 1.0f);
Values[WorldCfg.RateCreatureEliteWorldbossHp] = GetDefaultValue("Rate.Creature.Elite.WORLDBOSS.HP", 1.0f);
Values[WorldCfg.RateCreatureEliteRareHp] = GetDefaultValue("Rate.Creature.Elite.RARE.HP", 1.0f);
Values[WorldCfg.RateCreatureNormalSpelldamage] = GetDefaultValue("Rate.Creature.Normal.SpellDamage", 1.0f);
Values[WorldCfg.RateCreatureEliteEliteSpelldamage] = GetDefaultValue("Rate.Creature.Elite.Elite.SpellDamage", 1.0f);
Values[WorldCfg.RateCreatureEliteRareeliteSpelldamage] = GetDefaultValue("Rate.Creature.Elite.RAREELITE.SpellDamage", 1.0f);
Values[WorldCfg.RateCreatureEliteWorldbossSpelldamage] = GetDefaultValue("Rate.Creature.Elite.WORLDBOSS.SpellDamage", 1.0f);
Values[WorldCfg.RateCreatureEliteRareSpelldamage] = GetDefaultValue("Rate.Creature.Elite.RARE.SpellDamage", 1.0f);
Values[WorldCfg.RateCreatureHpNormal] = GetDefaultValue("Rate.Creature.HP.Normal", 1.0f);
Values[WorldCfg.RateCreatureHpElite] = GetDefaultValue("Rate.Creature.HP.Elite", 1.0f);
Values[WorldCfg.RateCreatureHpRareelite] = GetDefaultValue("Rate.Creature.HP.RareElite", 1.0f);
Values[WorldCfg.RateCreatureHpObsolete] = GetDefaultValue("Rate.Creature.HP.Obsolete", 1.0f);
Values[WorldCfg.RateCreatureHpRare] = GetDefaultValue("Rate.Creature.HP.Rare", 1.0f);
Values[WorldCfg.RateCreatureHpTrivial] = GetDefaultValue("Rate.Creature.HP.Trivial", 1.0f);
Values[WorldCfg.RateCreatureHpMinusmob] = GetDefaultValue("Rate.Creature.HP.MinusMob", 1.0f);
Values[WorldCfg.RateCreatureDamageNormal] = GetDefaultValue("Rate.Creature.Damage.Normal", 1.0f);
Values[WorldCfg.RateCreatureDamageElite] = GetDefaultValue("Rate.Creature.Damage.Elite", 1.0f);
Values[WorldCfg.RateCreatureDamageRareelite] = GetDefaultValue("Rate.Creature.Damage.RareElite", 1.0f);
Values[WorldCfg.RateCreatureDamageObsolete] = GetDefaultValue("Rate.Creature.Damage.Obsolete", 1.0f);
Values[WorldCfg.RateCreatureDamageRare] = GetDefaultValue("Rate.Creature.Damage.Rare", 1.0f);
Values[WorldCfg.RateCreatureDamageTrivial] = GetDefaultValue("Rate.Creature.Damage.Trivial", 1.0f);
Values[WorldCfg.RateCreatureDamageMinusmob] = GetDefaultValue("Rate.Creature.Damage.MinusMob", 1.0f);
Values[WorldCfg.RateCreatureSpelldamageNormal] = GetDefaultValue("Rate.Creature.SpellDamage.Normal", 1.0f);
Values[WorldCfg.RateCreatureSpelldamageElite] = GetDefaultValue("Rate.Creature.SpellDamage.Elite", 1.0f);
Values[WorldCfg.RateCreatureSpelldamageRareelite] = GetDefaultValue("Rate.Creature.SpellDamage.RareElite", 1.0f);
Values[WorldCfg.RateCreatureSpelldamageObsolete] = GetDefaultValue("Rate.Creature.SpellDamage.Obsolete", 1.0f);
Values[WorldCfg.RateCreatureSpelldamageRare] = GetDefaultValue("Rate.Creature.SpellDamage.Rare", 1.0f);
Values[WorldCfg.RateCreatureSpelldamageTrivial] = GetDefaultValue("Rate.Creature.SpellDamage.Trivial", 1.0f);
Values[WorldCfg.RateCreatureSpelldamageMinusmob] = GetDefaultValue("Rate.Creature.SpellDamage.MinusMob", 1.0f);
Values[WorldCfg.RateCreatureAggro] = GetDefaultValue("Rate.Creature.Aggro", 1.0f);
Values[WorldCfg.RateRestIngame] = GetDefaultValue("Rate.Rest.InGame", 1.0f);
Values[WorldCfg.RateRestOfflineInTavernOrCity] = GetDefaultValue("Rate.Rest.Offline.InTavernOrCity", 1.0f);
@@ -688,11 +694,13 @@ namespace Game
Values[WorldCfg.ChatStrictLinkCheckingSeverity] = GetDefaultValue("ChatStrictLinkChecking.Severity", 0);
Values[WorldCfg.ChatStrictLinkCheckingKick] = GetDefaultValue("ChatStrictLinkChecking.Kick", 0);
Values[WorldCfg.CorpseDecayNormal] = GetDefaultValue("Corpse.Decay.NORMAL", 60);
Values[WorldCfg.CorpseDecayRare] = GetDefaultValue("Corpse.Decay.RARE", 300);
Values[WorldCfg.CorpseDecayElite] = GetDefaultValue("Corpse.Decay.ELITE", 300);
Values[WorldCfg.CorpseDecayRareelite] = GetDefaultValue("Corpse.Decay.RAREELITE", 300);
Values[WorldCfg.CorpseDecayWorldboss] = GetDefaultValue("Corpse.Decay.WORLDBOSS", 3600);
Values[WorldCfg.CorpseDecayNormal] = GetDefaultValue("Corpse.Decay.Normal", 60);
Values[WorldCfg.CorpseDecayElite] = GetDefaultValue("Corpse.Decay.Elite", 300);
Values[WorldCfg.CorpseDecayRareelite] = GetDefaultValue("Corpse.Decay.RareElite", 300);
Values[WorldCfg.CorpseDecayObsolete] = GetDefaultValue("Corpse.Decay.Obsolete", 3600);
Values[WorldCfg.CorpseDecayRare] = GetDefaultValue("Corpse.Decay.Rare", 300);
Values[WorldCfg.CorpseDecayTrivial] = GetDefaultValue("Corpse.Decay.Trivial", 300);
Values[WorldCfg.CorpseDecayMinusMob] = GetDefaultValue("Corpse.Decay.MinusMob", 150);
Values[WorldCfg.DeathSicknessLevel] = GetDefaultValue("Death.SicknessLevel", 11);
Values[WorldCfg.DeathCorpseReclaimDelayPvp] = GetDefaultValue("Death.CorpseReclaimDelay.PvP", true);