Core/Creatures: added sparring system for creatures

This commit is contained in:
Ovalord committed 2017-12-22 11:45:48 +01:00
1 parent 7f79bd8aec
commit 454c3ce065
8 files changed
+150

No files matched your search

+26
View File
@@ -675,6 +675,17 @@ void Unit::DealDamageMods(Unit const* victim, uint32 &damage, uint32* absorb) co
uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss)
{
// Sparring Checks
if (Creature* me = ToCreature())
if (Creature* target = victim->ToCreature())
if (me->CanSparrWith(target))
{
if (damage >= victim->GetHealth()) // safety check to prevent creatures getting accidentally killed when the percentage is small
damage = victim->GetHealth() - 1;
else if (target->GetHealthPct() <= me->GetSparringHealthLimitPctFor(target))
damage = 0;
}
if (victim->IsAIEnabled)
victim->GetAI()->DamageTaken(this, damage);
@@ -1871,6 +1882,13 @@ void Unit::CalcAbsorbResist(DamageInfo& damageInfo)
uint32 split_absorb = 0;
DealDamageMods(caster, splitDamage, &split_absorb);
// Sparring Checks
if (Creature* me = caster->ToCreature())
if (Creature* target = damageInfo.GetVictim()->ToCreature())
if (me->CanSparrWith(target))
if (target->GetHealthPct() <= me->GetSparringHealthLimitPctFor(target))
damageInfo.ModifyDamage(damageInfo.GetDamage() * -1);
SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo()->Id, splitDamage, damageInfo.GetSchoolMask(), split_absorb, 0, false, 0, false);
CleanDamage cleanDamage = CleanDamage(splitDamage, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
@@ -1977,6 +1995,14 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType, bool extr
CalculateMeleeDamage(victim, 0, &damageInfo, attType);
// Send log damage message to client
DealDamageMods(victim, damageInfo.damage, &damageInfo.absorb);
// Sparring Checks
if (Creature* me = ToCreature())
if (Creature* target = victim->ToCreature())
if (me->CanSparrWith(target))
if (target->GetHealthPct() <= me->GetSparringHealthLimitPctFor(target))
damageInfo.HitInfo |= HITINFO_FAKE_DAMAGE;
SendAttackStateUpdate(&damageInfo);
DealMeleeDamage(&damageInfo, true);