diff options
Diffstat (limited to 'src/game/Spell.cpp')
| -rw-r--r-- | src/game/Spell.cpp | 51 |
1 files changed, 31 insertions, 20 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 916bc984883..53009674d9d 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4496,26 +4496,8 @@ int16 Spell::PetCanCast(Unit* target) if(!_target->isAlive()) return SPELL_FAILED_BAD_TARGETS; - if(IsPositiveSpell(m_spellInfo->Id)) - { - if(m_caster->IsHostileTo(_target)) - return SPELL_FAILED_BAD_TARGETS; - } - else - { - bool duelvsplayertar = false; - for(int j=0;j<3;j++) - { - //TARGET_DUELVSPLAYER is positive AND negative - duelvsplayertar |= (m_spellInfo->EffectImplicitTargetA[j] == TARGET_DUELVSPLAYER); - } - // AoE spells have the caster as their target - // AOE spells should not have target - if(m_caster->IsFriendlyTo(target) /*&& m_caster != target*/ && !duelvsplayertar) - { - return SPELL_FAILED_BAD_TARGETS; - } - } + if(!IsValidSingleTargetSpell(_target)) + return SPELL_FAILED_BAD_TARGETS; } //cooldown if(((Creature*)m_caster)->HasSpellCooldown(m_spellInfo->Id)) @@ -5553,3 +5535,32 @@ bool SpellEvent::IsDeletable() const { return m_Spell->IsDeletable(); } + +bool Spell::IsValidSingleTargetEffect(Unit const* target, Targets type) const +{ + switch(type) + { + case TARGET_UNIT_TARGET_ENEMY: + return !m_caster->IsFriendlyTo(target); + case TARGET_UNIT_TARGET_ALLY: + return m_caster->IsFriendlyTo(target); + case TARGET_UNIT_TARGET_PARTY: + return m_caster->IsInPartyWith(target); + case TARGET_UNIT_TARGET_RAID: + return m_caster->IsInRaidWith(target); + } + return true; +} + +bool Spell::IsValidSingleTargetSpell(Unit const* target) const +{ + for(int i = 0; i < 3; ++i) + { + if(!IsValidSingleTargetEffect(target, Targets(m_spellInfo->EffectImplicitTargetA[i]))) + return false; + // Need to check B? + //if(!IsValidSingleTargetEffect(m_spellInfo->EffectImplicitTargetB[i], target) + // return false; + } + return true; +}
\ No newline at end of file |
