Skip to content

Commit

Permalink
Combat Rolls Overhaul: Utilize polymorphism for new APIs
Browse files Browse the repository at this point in the history
Move out totem-related to Totem class
  • Loading branch information
Warlockbugs authored and Fabi committed Jan 15, 2017
1 parent 325bc00 commit 202d281
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 57 deletions.
60 changes: 60 additions & 0 deletions src/game/Totem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,66 @@ void Totem::SetTypeBySummonSpell(SpellEntry const* spellProto)
m_type = TOTEM_STATUE; // Jewelery statue
}

float Totem::GetCritChance(WeaponAttackType attackType) const
{
// Totems use owner's crit chance (when owner is available)
if (const Unit* owner = GetOwner())
return owner->GetCritChance(attackType);
return Creature::GetCritChance(attackType);
}

float Totem::GetCritChance(SpellSchoolMask schoolMask) const
{
// Totems use owner's crit chance (when owner is available)
if (const Unit* owner = GetOwner())
return owner->GetCritChance(schoolMask);
return Creature::GetCritChance(schoolMask);
}

float Totem::GetCritMultiplier(SpellSchoolMask dmgSchoolMask, uint32 creatureTypeMask, const SpellEntry *spell, bool heal) const
{
// Totems use owner's crit multiplier
if (const Unit* owner = GetOwner())
return owner->GetCritMultiplier(dmgSchoolMask, creatureTypeMask, spell, heal);
return Creature::GetCritMultiplier(dmgSchoolMask, creatureTypeMask, spell, heal);
}

float Totem::GetHitChance(WeaponAttackType attackType) const
{
// Totems use owner's hit chance (when owner is available)
if (const Unit* owner = GetOwner())
return owner->GetHitChance(attackType);
return Creature::GetHitChance(attackType);
}

float Totem::GetHitChance(SpellSchoolMask schoolMask) const
{
// Totems use owner's hit chance (when owner is available)
if (const Unit* owner = GetOwner())
return owner->GetHitChance(schoolMask);
return Creature::GetHitChance(schoolMask);
}

float Totem::GetMissChance(WeaponAttackType /*attackType*/) const
{
// Totems have no inherit miss chance
return 0.0f;
}

float Totem::GetMissChance(SpellSchoolMask /*schoolMask*/) const
{
// Totems have no inherit miss chance
return 0.0f;
}

int32 Totem::GetResistancePenetration(SpellSchools school) const
{
// Totems use owner's penetration (when owner is available)
if (const Unit* owner = GetOwner())
return owner->GetResistancePenetration(school);
return Creature::GetResistancePenetration(school);
}

bool Totem::IsImmuneToSpellEffect(SpellEntry const* spellInfo, SpellEffectIndex index, bool castOnSelf) const
{
// Totem may affected by some specific spells
Expand Down
11 changes: 10 additions & 1 deletion src/game/Totem.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ class Totem : public Creature
{
public:
explicit Totem();
virtual ~Totem() {};
virtual ~Totem() {}
bool Create(uint32 guidlow, CreatureCreatePos& cPos, CreatureInfo const* cinfo, Unit* owner);
void Update(uint32 update_diff, uint32 time) override;
void Summon(Unit* owner);
Expand All @@ -45,6 +45,15 @@ class Totem : public Creature
void SetDuration(uint32 dur) { m_duration = dur; }
void SetOwner(Unit* owner);

float GetCritChance(WeaponAttackType attackType) const override;
float GetCritChance(SpellSchoolMask schoolMask) const override;
float GetCritMultiplier(SpellSchoolMask dmgSchoolMask, uint32 creatureTypeMask, const SpellEntry* spell = nullptr, bool heal = false) const override;
float GetHitChance(WeaponAttackType attackType) const override;
float GetHitChance(SpellSchoolMask schoolMask) const override;
float GetMissChance(WeaponAttackType attackType) const override;
float GetMissChance(SpellSchoolMask schoolMask) const override;
int32 GetResistancePenetration(SpellSchools school) const override;

bool UpdateStats(Stats /*stat*/) override { return true; }
bool UpdateAllStats() override { return true; }
void UpdateResistances(uint32 /*school*/) override {}
Expand Down
43 changes: 0 additions & 43 deletions src/game/Unit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3782,16 +3782,8 @@ float Unit::GetCritChance(WeaponAttackType attType) const
{
float chance = 0.0f;
if (GetTypeId() == TYPEID_UNIT)
{
// Totems use owner's crit chance (when owner is available)
if (((const Creature*)this)->IsTotem())
{
if (const Unit* owner = GetOwner())
return owner->GetCritChance(attType);
}
// Base crit chance (needed for units only, already included for players)
chance += 5.0f;
}
chance += m_modCritChance[attType];
return chance;
}
Expand All @@ -3805,16 +3797,8 @@ float Unit::GetCritChance(SpellSchoolMask schoolMask) const
return 0.0f;

if (GetTypeId() == TYPEID_UNIT)
{
// Totems use owner's crit chance (when owner is available)
if (((const Creature*)this)->IsTotem())
{
if (const Unit* owner = GetOwner())
return owner->GetCritChance(schoolMask);
}
// Base crit chance (needed for units only, already included for players)
chance += 5.0f;
}
// Pick highest spell crit available for given school mask
for (uint8 school = 0; mask; ++school)
{
Expand Down Expand Up @@ -3882,15 +3866,6 @@ float Unit::GetCritTakenChance(SpellSchoolMask dmgSchoolMask, SpellDmgClass dmgC

float Unit::GetCritMultiplier(SpellSchoolMask dmgSchoolMask, uint32 creatureTypeMask, const SpellEntry *spell, bool heal) const
{
if (GetTypeId() == TYPEID_UNIT)
{
// Totems use owner's crit multiplier
if (((const Creature*)this)->IsTotem())
{
if (const Unit* owner = GetOwner())
return owner->GetCritMultiplier(dmgSchoolMask, creatureTypeMask, spell, heal);
}
}
// Default crit multiplier (attacks): 2x
float multiplier = 2.0f;
// Default crit multiplier for spells: 1.5x
Expand Down Expand Up @@ -4005,12 +3980,6 @@ uint32 Unit::CalculateCritAmount(CalcDamageInfo *meleeInfo) const

float Unit::GetHitChance(WeaponAttackType attackType) const
{
// Totems use owner's hit chance (when owner is available)
if (GetTypeId() == TYPEID_UNIT && ((const Creature*)this)->IsTotem())
{
if (const Unit* owner = GetOwner())
return owner->GetHitChance(attackType);
}
if (attackType == RANGED_ATTACK)
return m_modRangedHitChance;
return m_modMeleeHitChance;
Expand All @@ -4023,12 +3992,6 @@ float Unit::GetHitChance(SpellSchoolMask schoolMask) const
if (!uint32(schoolMask))
return 0.0f;

// Totems use owner's hit chance (when owner is available)
if (GetTypeId() == TYPEID_UNIT && ((const Creature*)this)->IsTotem())
{
if (const Unit* owner = GetOwner())
return owner->GetHitChance(schoolMask);
}
chance += m_modSpellHitChance;
// Pick highest spell hit available for given school mask
chance += GetTotalAuraModifierByMiscMask(SPELL_AURA_160, schoolMask);
Expand Down Expand Up @@ -4416,12 +4379,6 @@ float Unit::GetExpertisePercent(WeaponAttackType attType) const

int32 Unit::GetResistancePenetration(SpellSchools school) const
{
// Totems use owner's penetration (when owner is available)
if (GetTypeId() == TYPEID_UNIT && ((const Creature*)this)->IsTotem())
{
if (const Unit* owner = GetOwner())
return owner->GetResistancePenetration(school);
}
// Technically, it is target resistance mod, but it's used as penetration (negative sign) 99.9% of the time
// So, let's logically reverse the sign and use it as such
return -(GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, (1 << school)));
Expand Down
26 changes: 13 additions & 13 deletions src/game/Unit.h
Original file line number Diff line number Diff line change
Expand Up @@ -1717,24 +1717,24 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
bool CanCrit(SpellSchoolMask schoolMask) const { return (GetCritChance(schoolMask) >= 0.01f); }
bool CanCrit(const SpellEntry* entry, SpellSchoolMask schoolMask, WeaponAttackType attType) const;

float GetCritChance(WeaponAttackType attackType) const;
float GetCritChance(SpellSchoolMask schoolMask) const;
float GetCritChance(const SpellEntry* entry, SpellSchoolMask schoolMask) const;
virtual float GetCritChance(WeaponAttackType attackType) const;
virtual float GetCritChance(SpellSchoolMask schoolMask) const;
virtual float GetCritChance(const SpellEntry* entry, SpellSchoolMask schoolMask) const;

float GetCritTakenChance(SpellSchoolMask dmgSchoolMask, SpellDmgClass dmgClass, bool heal = false) const;
virtual float GetCritTakenChance(SpellSchoolMask dmgSchoolMask, SpellDmgClass dmgClass, bool heal = false) const;

float GetCritMultiplier(SpellSchoolMask dmgSchoolMask, uint32 creatureTypeMask, const SpellEntry* spell = nullptr, bool heal = false) const;
float GetCritTakenMultiplier(SpellSchoolMask dmgSchoolMask, SpellDmgClass dmgClass, float ignorePct = 0.0f, bool heal = false) const;
virtual float GetCritMultiplier(SpellSchoolMask dmgSchoolMask, uint32 creatureTypeMask, const SpellEntry* spell = nullptr, bool heal = false) const;
virtual float GetCritTakenMultiplier(SpellSchoolMask dmgSchoolMask, SpellDmgClass dmgClass, float ignorePct = 0.0f, bool heal = false) const;
uint32 CalculateCritAmount(const Unit* victim, uint32 amount, const SpellEntry* entry, bool heal = false) const;
uint32 CalculateCritAmount(CalcDamageInfo* meleeInfo) const;

float GetHitChance(WeaponAttackType attackType) const;
float GetHitChance(SpellSchoolMask schoolMask) const;
float GetHitChance(const SpellEntry* entry, SpellSchoolMask schoolMask) const;
virtual float GetHitChance(WeaponAttackType attackType) const;
virtual float GetHitChance(SpellSchoolMask schoolMask) const;
virtual float GetHitChance(const SpellEntry* entry, SpellSchoolMask schoolMask) const;

float GetMissChance(WeaponAttackType attackType) const;
float GetMissChance(SpellSchoolMask schoolMask) const;
float GetMissChance(const SpellEntry* entry, SpellSchoolMask schoolMask) const;
virtual float GetMissChance(WeaponAttackType attackType) const;
virtual float GetMissChance(SpellSchoolMask schoolMask) const;
virtual float GetMissChance(const SpellEntry* entry, SpellSchoolMask schoolMask) const;

float CalculateEffectiveCritChance(const Unit* victim, WeaponAttackType attType, const SpellEntry *ability = nullptr) const;
float CalculateEffectiveMissChance(const Unit* victim, WeaponAttackType attType, const SpellEntry *ability = nullptr) const;
Expand All @@ -1744,7 +1744,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject

float GetExpertisePercent(WeaponAttackType attType) const;

int32 GetResistancePenetration(SpellSchools school) const;
virtual int32 GetResistancePenetration(SpellSchools school) const;

float CalculateEffectiveMagicResistancePercent(const Unit* attacker, SpellSchoolMask schoolMask, bool binary = false) const;

Expand Down

0 comments on commit 202d281

Please sign in to comment.