From 80dcf879deb61198ff2c91d71887f0eae9acad68 Mon Sep 17 00:00:00 2001 From: Trista Date: Sat, 22 Dec 2012 04:27:02 +0200 Subject: Core/Spells: TARGET_UNIT_MASTER passenger support * what happened before was spells casted from vehicle to passenger getting blocked by general check exceptions that state passengers to be not implicitly spell hit, however they should be ignored when caster is vehicle to master passenger * fix a lot of quests that award kill credit that was blocked before * precisely closes: #8643 and makes #5254 awardable --- src/server/game/Spells/SpellInfo.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'src/server/game/Spells/SpellInfo.cpp') diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index fcfa441455e..6631a8138b4 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1546,11 +1546,18 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta if (unitTarget->HasUnitState(UNIT_STATE_IN_FLIGHT)) return SPELL_FAILED_BAD_TARGETS; - if (TargetAuraState && !unitTarget->HasAuraState(AuraStateType(TargetAuraState), this, caster)) - return SPELL_FAILED_TARGET_AURASTATE; + // TARGET_UNIT_MASTER gets blocked here for passengers, because the whole idea of this check is to + // not allow passengers to be implicitly hit by spells, however this target type should be an exception, + // if this is left it kills spells that award kill credit from vehicle to master and some or all* spells, + // the use of these 2 covers passenger target check + if (!(Targets & TARGET_UNIT_MASTER) && !caster->IsVehicle()) + { + if (TargetAuraState && !unitTarget->HasAuraState(AuraStateType(TargetAuraState), this, caster)) + return SPELL_FAILED_TARGET_AURASTATE; - if (TargetAuraStateNot && unitTarget->HasAuraState(AuraStateType(TargetAuraStateNot), this, caster)) - return SPELL_FAILED_TARGET_AURASTATE; + if (TargetAuraStateNot && unitTarget->HasAuraState(AuraStateType(TargetAuraStateNot), this, caster)) + return SPELL_FAILED_TARGET_AURASTATE; + } if (TargetAuraSpell && !unitTarget->HasAura(sSpellMgr->GetSpellIdForDifficulty(TargetAuraSpell, caster))) return SPELL_FAILED_TARGET_AURASTATE; -- cgit v1.2.3 From aabfa3afae128e5cc23852d6b9ddef145c6e360e Mon Sep 17 00:00:00 2001 From: Trista Date: Sat, 22 Dec 2012 06:32:45 +0200 Subject: Core/Spell: Properly rewrite previous change: 80dcf879deb61198ff2c91d71887f0eae9acad68 * thx to @joschiwald for noticing problem and helping, see rest info in comment or previous fix --- src/server/game/Spells/SpellInfo.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'src/server/game/Spells/SpellInfo.cpp') diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 6631a8138b4..61b92ce6f81 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -1546,11 +1546,14 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta if (unitTarget->HasUnitState(UNIT_STATE_IN_FLIGHT)) return SPELL_FAILED_BAD_TARGETS; - // TARGET_UNIT_MASTER gets blocked here for passengers, because the whole idea of this check is to - // not allow passengers to be implicitly hit by spells, however this target type should be an exception, - // if this is left it kills spells that award kill credit from vehicle to master and some or all* spells, - // the use of these 2 covers passenger target check - if (!(Targets & TARGET_UNIT_MASTER) && !caster->IsVehicle()) + /* TARGET_UNIT_MASTER gets blocked here for passengers, because the whole idea of this check is to + not allow passengers to be implicitly hit by spells, however this target type should be an exception, + if this is left it kills spells that award kill credit from vehicle to master (few spells), + the use of these 2 covers passenger target check, logically, if vehicle cast this to master it should always hit + him, because it would be it's passenger, there's no such case where this gets to fail legitimacy, this problem + cannot be solved from within the check in other way since target type cannot be called for the spell currently + Spell examples: [ID - 52864 Devour Water, ID - 52862 Devour Wind, ID - 49370 Wyrmrest Defender: Destabilize Azure Dragonshrine Effect] */ + if (!caster->IsVehicle() && !(caster->GetCharmerOrOwner() == target)) { if (TargetAuraState && !unitTarget->HasAuraState(AuraStateType(TargetAuraState), this, caster)) return SPELL_FAILED_TARGET_AURASTATE; -- cgit v1.2.3