diff options
author | megamage <none@none> | 2009-07-12 17:34:37 +0800 |
---|---|---|
committer | megamage <none@none> | 2009-07-12 17:34:37 +0800 |
commit | bd02855bb6cd044687eb55cfd707c1f0dff43d6f (patch) | |
tree | ea29c4425ada6f293a9bd9580f61fa490bc617f9 | |
parent | 63fd4eda9923dd987b766e3a11291627e494d2e6 (diff) |
*Try to fix a crash caused by charm spells. Do not allow to apply charm aura on invalid target.
--HG--
branch : trunk
-rw-r--r-- | src/game/Spell.cpp | 27 |
1 files changed, 21 insertions, 6 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index e946ac80322..fe64070caea 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -5008,13 +5008,9 @@ SpellCastResult Spell::CheckCast(bool strict) return SPELL_FAILED_ALREADY_HAVE_CHARM; } - // Skip TARGET_UNIT_PET - pet is always valid - if (m_spellInfo->EffectImplicitTargetA[i] != TARGET_UNIT_PET - && m_spellInfo->EffectImplicitTargetB[i] != TARGET_UNIT_PET) + if(Unit *target = m_targets.getUnitTarget()) { - Unit *target = m_targets.getUnitTarget(); - if(!target || target->GetTypeId() == TYPEID_UNIT - && ((Creature*)target)->isVehicle()) + if(target->GetTypeId() == TYPEID_UNIT && ((Creature*)target)->isVehicle()) return SPELL_FAILED_BAD_IMPLICIT_TARGETS; if(target->GetCharmerGUID()) @@ -6078,6 +6074,25 @@ bool Spell::CheckTarget(Unit* target, uint32 eff) return false; } + switch(m_spellInfo->EffectApplyAuraName[eff]) + { + case SPELL_AURA_NONE: + default: + break; + case SPELL_AURA_MOD_POSSESS: + case SPELL_AURA_MOD_CHARM: + case SPELL_AURA_MOD_POSSESS_PET: + case SPELL_AURA_AOE_CHARM: + if(target->GetTypeId() == TYPEID_UNIT && ((Creature*)target)->isVehicle()) + return false; + if(target->GetCharmerGUID()) + return false; + if(int32 damage = CalculateDamage(eff, target)) + if((int32)target->getLevel() > damage) + return false; + break; + } + //Do not do further checks for triggered spells if(m_IsTriggeredSpell) return true; |