aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-09-04 21:35:19 +0200
committerShauren <shauren.trinity@gmail.com>2022-09-05 22:23:02 +0200
commita7b7ad94f8e18a1c4d8bb1d806afec263c6abc7c (patch)
treec18015ea093997961b10723304922244efac78e4
parent9bfc29f4aff01cd7f366faffcda0a84071970d6a (diff)
Core/Spells: Simplify combat flagging code on spell launch and impact
(cherry picked from commit e2840a3f817ccdda416605d45f83a6c13121f435)
-rw-r--r--src/server/game/Spells/Spell.cpp62
-rw-r--r--src/server/game/Spells/Spell.h2
2 files changed, 12 insertions, 52 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index c5b7ee28286..f92c70e95b0 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -2253,37 +2253,6 @@ void Spell::CleanupTargetList()
m_delayMoment = 0;
}
-class ProcImpactDelayed : public BasicEvent
-{
-public:
- ProcImpactDelayed(Unit* owner, ObjectGuid casterGUID, const bool enterCombat, bool enablePVP) : _owner(owner), _casterGUID(casterGUID), _enterCombat(enterCombat), _enablePVP(enablePVP) { }
-
- bool Execute(uint64 /*e_time*/, uint32 /*p_time*/) override
- {
- if(!_owner)
- return true;
-
- Unit* caster = ObjectAccessor::GetUnit(*_owner, _casterGUID);
- if (!caster)
- return true;
-
- // This will only cause combat - the target will engage once the projectile hits (in DoAllEffectOnTarget)
- if (_enterCombat)
- _owner->SetInCombatWith(caster);
-
- if (_enablePVP && caster->ToPlayer())
- caster->ToPlayer()->UpdatePvP(true);
-
- return true;
- }
-
-private:
- Unit* _owner;
- ObjectGuid _casterGUID;
- bool _enterCombat;
- bool _enablePVP;
-};
-
class ProcReflectDelayed : public BasicEvent
{
public:
@@ -2353,13 +2322,8 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*=
// Calculate hit result
WorldObject* caster = m_originalCaster ? m_originalCaster : m_caster;
- Unit* unitCaster = m_caster->ToUnit();
targetInfo.MissCondition = caster->SpellHitResult(target, m_spellInfo, m_canReflect && !(IsPositive() && m_caster->IsFriendlyTo(target)));
- // This will only cause combat - the target will engage once the projectile hits (in DoAllEffectOnTarget)
- if (m_originalCaster && targetInfo.MissCondition != SPELL_MISS_EVADE && !m_originalCaster->IsFriendlyTo(target) && (!m_spellInfo->IsPositive() || m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL)) && (m_spellInfo->HasInitialAggro() || target->IsEngaged()))
- m_originalCaster->SetInCombatWith(target, true);
-
// Spell have speed - need calculate incoming time
// Incoming time is zero for self casts. At least I think so.
if (m_caster != target)
@@ -2394,15 +2358,6 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*=
}
targetInfo.TimeDelay += uint64(std::floor(hitDelay * 1000.0f));
-
- if (unitCaster && targetInfo.MissCondition != SPELL_MISS_EVADE)
- {
- bool enterCombat = !caster->IsFriendlyTo(target) && (!m_spellInfo->IsPositive() || m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL)) && (m_spellInfo->HasInitialAggro() || target->IsEngaged());
- bool enablePVP = targetInfo.IsPVPEnabling();
-
- if (enterCombat || enablePVP)
- target->m_Events.AddEvent(new ProcImpactDelayed(target, m_originalCasterGUID, enterCombat, enablePVP), target->m_Events.CalculateTime(Milliseconds(targetInfo.TimeDelay)));
- }
}
else
targetInfo.TimeDelay = 0ULL;
@@ -2411,7 +2366,7 @@ void Spell::AddUnitTarget(Unit* target, uint32 effectMask, bool checkIfValid /*=
if (targetInfo.MissCondition == SPELL_MISS_REFLECT)
{
// Calculate reflected spell result on caster (shouldn't be able to reflect gameobject spells)
- ASSERT(unitCaster);
+ Unit* unitCaster = ASSERT_NOTNULL(m_caster->ToUnit());
targetInfo.ReflectResult = unitCaster->SpellHitResult(unitCaster, m_spellInfo, false); // can't reflect twice
// Proc spell reflect aura when missile hits the original target
@@ -2620,9 +2575,8 @@ void Spell::TargetInfo::PreprocessTarget(Spell* spell)
else if (MissCondition == SPELL_MISS_REFLECT && ReflectResult == SPELL_MISS_NONE)
_spellHitTarget = spell->m_caster->ToUnit();
- // Ensure that a player target is put in combat by a taunt, even if they result immune clientside
- if ((MissCondition == SPELL_MISS_IMMUNE || MissCondition == SPELL_MISS_IMMUNE2) && spell->m_caster->GetTypeId() == TYPEID_PLAYER && unit->GetTypeId() == TYPEID_PLAYER && spell->m_caster->IsValidAttackTarget(unit, spell->GetSpellInfo()))
- unit->SetInCombatWith(spell->m_caster->ToPlayer());
+ if (spell->m_originalCaster && MissCondition != SPELL_MISS_EVADE && !spell->m_originalCaster->IsFriendlyTo(unit) && (!spell->m_spellInfo->IsPositive() || spell->m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL)) && (spell->m_spellInfo->HasInitialAggro() || unit->IsEngaged()))
+ unit->SetInCombatWith(spell->m_originalCaster);
// if target is flagged for pvp also flag caster if a player
// but respect current pvp rules (buffing/healing npcs flagged for pvp only flags you if they are in combat)
@@ -8215,10 +8169,18 @@ void Spell::HandleLaunchPhase()
void Spell::DoEffectOnLaunchTarget(TargetInfo& targetInfo, float multiplier, SpellEffectInfo const& spellEffectInfo)
{
+ Unit* targetUnit = m_caster->GetGUID() == targetInfo.TargetGUID ? m_caster->ToUnit() : ObjectAccessor::GetUnit(*m_caster, targetInfo.TargetGUID);
+ if (!targetUnit)
+ return;
+
+ // This will only cause combat - the target will engage once the projectile hits (in Spell::TargetInfo::PreprocessTarget)
+ if (m_originalCaster && targetInfo.MissCondition != SPELL_MISS_EVADE && !m_originalCaster->IsFriendlyTo(targetUnit) && (!m_spellInfo->IsPositive() || m_spellInfo->HasEffect(SPELL_EFFECT_DISPEL)) && (m_spellInfo->HasInitialAggro() || targetUnit->IsEngaged()))
+ m_originalCaster->SetInCombatWith(targetUnit, true);
+
Unit* unit = nullptr;
// In case spell hit target, do all effect on that target
if (targetInfo.MissCondition == SPELL_MISS_NONE)
- unit = m_caster->GetGUID() == targetInfo.TargetGUID ? m_caster->ToUnit() : ObjectAccessor::GetUnit(*m_caster, targetInfo.TargetGUID);
+ unit = targetUnit;
// In case spell reflect from target, do all effect on caster (if hit)
else if (targetInfo.MissCondition == SPELL_MISS_REFLECT && targetInfo.ReflectResult == SPELL_MISS_NONE)
unit = m_caster->ToUnit();
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 0e438a4f961..0fda5253439 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -742,8 +742,6 @@ class TC_GAME_API Spell
void DoTargetSpellHit(Spell* spell, SpellEffectInfo const& spellEffectInfo) override;
void DoDamageAndTriggers(Spell* spell) override;
- bool IsPVPEnabling() const { return _enablePVP; }
-
ObjectGuid TargetGUID;
uint64 TimeDelay = 0ULL;
int32 Damage = 0;