aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Unit
diff options
context:
space:
mode:
authorModoX <moardox@gmail.com>2023-04-06 01:01:02 +0200
committerGitHub <noreply@github.com>2023-04-06 01:01:02 +0200
commit0750b7f8455df39a64462636ca296c6f2aa2b048 (patch)
tree935678cc42b5829dff44efababb3133c9df4e27a /src/server/game/Entities/Unit
parent20a1e21cc5dc890d858a4a8dceba16a4fc3caa72 (diff)
Core/Creature: Implemented sparring with max health percent thresholds (#27198)
Co-authored-by: Ovah <dreadkiller@gmx.de>
Diffstat (limited to 'src/server/game/Entities/Unit')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index e3d661a54d2..dda5fb90848 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -752,6 +752,10 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons
{
uint32 tmpDamage = damageTaken;
+ // sparring
+ if (Creature* victimCreature = victim->ToCreature())
+ tmpDamage = victimCreature->CalculateDamageForSparring(attacker, tmpDamage);
+
if (UnitAI* victimAI = victim->GetAI())
victimAI->DamageTaken(attacker, tmpDamage, damagetype, spellProto);
@@ -1969,6 +1973,13 @@ void Unit::HandleEmoteCommand(Emote emoteId, Player* target /*=nullptr*/, Trinit
uint32 split_absorb = 0;
Unit::DealDamageMods(damageInfo.GetAttacker(), caster, splitDamage, &split_absorb);
+ // sparring
+ if (Creature* victimCreature = damageInfo.GetVictim()->ToCreature())
+ {
+ if (victimCreature->ShouldFakeDamageFrom(damageInfo.GetAttacker()))
+ damageInfo.ModifyDamage(damageInfo.GetDamage() * -1);
+ }
+
SpellNonMeleeDamage log(damageInfo.GetAttacker(), caster, (*itr)->GetSpellInfo(), (*itr)->GetBase()->GetSpellVisual(), damageInfo.GetSchoolMask(), (*itr)->GetBase()->GetCastId());
CleanDamage cleanDamage = CleanDamage(splitDamage, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
Unit::DealDamage(damageInfo.GetAttacker(), caster, splitDamage, &cleanDamage, DIRECT_DAMAGE, damageInfo.GetSchoolMask(), (*itr)->GetSpellInfo(), false);
@@ -2133,6 +2144,14 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType, bool extr
CalculateMeleeDamage(victim, &damageInfo, attType);
// Send log damage message to client
Unit::DealDamageMods(damageInfo.Attacker, victim, damageInfo.Damage, &damageInfo.Absorb);
+
+ // sparring
+ if (Creature* victimCreature = victim->ToCreature())
+ {
+ if (victimCreature->ShouldFakeDamageFrom(damageInfo.Attacker))
+ damageInfo.HitInfo |= HITINFO_FAKE_DAMAGE;
+ }
+
SendAttackStateUpdate(&damageInfo);
_lastDamagedTargetGuid = victim->GetGUID();