diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 60 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellMgr.cpp | 50 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellMgr.h | 2 |
3 files changed, 65 insertions, 47 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index b6e4fa8452a..5c7a8825917 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4802,8 +4802,8 @@ SpellCastResult Spell::CheckCast(bool strict) } } - //check creature type - //ignore self casts (including area casts when caster selected as target) + // check creature type + // ignore self casts (including area casts when caster selected as target) if (non_caster_target) { if (!CheckTargetCreatureType(target)) @@ -4813,58 +4813,24 @@ SpellCastResult Spell::CheckCast(bool strict) else return SPELL_FAILED_BAD_TARGETS; } - } - // who can give me an example to show what is the use of this - // even if we need check, check by effect rather than whole spell, otherwise 57108, 57143 are broken - /* - // TODO: this check can be applied and for player to prevent cheating when IsPositiveSpell will return always correct result. - // check target for pet/charmed casts (not self targeted), self targeted cast used for area effects and etc - if (non_caster_target && m_caster->GetTypeId() == TYPEID_UNIT && m_caster->GetCharmerOrOwnerGUID()) - { - // check correctness positive/negative cast target (pet cast real check and cheating check) - if (IsPositiveSpell(m_spellInfo->Id)) - { - //dispel positivity is dependant on target, don't check it - if (m_caster->IsHostileTo(target) && !IsDispel(m_spellInfo)) - return SPELL_FAILED_BAD_TARGETS; - } - else - { - if (m_caster->IsFriendlyTo(target)) - return SPELL_FAILED_BAD_TARGETS; - } + // Must be behind the target + if ((m_customAttr & SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET) && target->HasInArc(static_cast<float>(M_PI), m_caster)) + return SPELL_FAILED_NOT_BEHIND; + + // Target must be facing you + if ((m_customAttr & SPELL_ATTR0_CU_REQ_TAGRET_FACING_CASTER) && !target->HasInArc(static_cast<float>(M_PI), m_caster)) + return SPELL_FAILED_NOT_INFRONT; + + // Target must not be in combat + if (m_spellInfo->AttributesEx & SPELL_ATTR1_NOT_IN_COMBAT_TARGET && target->isInCombat()) + return SPELL_FAILED_TARGET_AFFECTING_COMBAT; } - */ if (target) if (IsPositiveSpell(m_spellInfo->Id)) if (target->IsImmunedToSpell(m_spellInfo)) return SPELL_FAILED_TARGET_AURASTATE; - - //Must be behind the target. - if (m_spellInfo->AttributesEx2 == SPELL_ATTR2_UNK20 && m_spellInfo->AttributesEx & SPELL_ATTR1_UNK9 && target->HasInArc(static_cast<float>(M_PI), m_caster) - //Exclusion for Pounce: Facing Limitation was removed in 2.0.1, but it still uses the same, old Ex-Flags - && (!(m_spellInfo->SpellFamilyName == SPELLFAMILY_DRUID && m_spellInfo->SpellFamilyFlags.IsEqual(0x20000, 0, 0))) - //Mutilate no longer requires you be behind the target as of patch 3.0.3 - && (!(m_spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && m_spellInfo->SpellFamilyFlags[1] & 0x200000)) - //Exclusion for Throw: Facing limitation was added in 3.2.x, but that shouldn't be - && (!(m_spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE && m_spellInfo->SpellFamilyFlags[0] & 0x00000001))) - { - SendInterrupted(2); - return SPELL_FAILED_NOT_BEHIND; - } - - // Target must be facing you. - if ((m_spellInfo->Attributes == (SPELL_ATTR0_ABILITY | SPELL_ATTR0_NOT_SHAPESHIFT | SPELL_ATTR0_DONT_AFFECT_SHEATH_STATE | SPELL_ATTR0_STOP_ATTACK_TARGET)) && !target->HasInArc(static_cast<float>(M_PI), m_caster)) - { - SendInterrupted(2); - return SPELL_FAILED_NOT_INFRONT; - } - - // check if target is in combat - if (non_caster_target && (m_spellInfo->AttributesEx & SPELL_ATTR1_NOT_IN_COMBAT_TARGET) && target->isInCombat()) - return SPELL_FAILED_TARGET_AFFECTING_COMBAT; } // Spell casted only on battleground diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 46addae73a3..2e6e7fa7a03 100755 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3785,8 +3785,58 @@ void SpellMgr::LoadSpellCustomAttr() ++count; } + // TODO: this REALLY needs to be moved to db (so it can be blamed on db guys) switch (i) { + case 1776: // Gouge + case 1777: + case 8629: + case 11285: + case 11286: + case 12540: + case 13579: + case 24698: + case 28456: + case 29425: + case 34940: + case 36862: + case 38764: + case 38863: + case 52743: // Head Smack + mSpellCustomAttr[i] |= SPELL_ATTR0_CU_REQ_TAGRET_FACING_CASTER; + ++count; + break; + case 53: // Backstab + case 2589: + case 2590: + case 2591: + case 8721: + case 11279: + case 11280: + case 11281: + case 25300: + case 26863: + case 48656: + case 48657: + case 5221: // Shred + case 6800: + case 8992: + case 9829: + case 9830: + case 27001: + case 27002: + case 48571: + case 48572: + case 21987: // Lash of Pain + case 23959: // Test Stab R50 + case 24825: // Test Backstab + mSpellCustomAttr[i] |= SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET; + ++count; + break; + case 58563: // Assassinate Restless Lookout + mSpellCustomAttr[i] |= SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET; + ++count; + break; case 36350: //They Must Burn Bomb Aura (self) spellInfo->EffectTriggerSpell[0] = 36325; // They Must Burn Bomb Drop (DND) ++count; diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index c6d875bf0cf..06828178997 100755 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -1024,6 +1024,8 @@ enum SpellCustomAttributes SPELL_ATTR0_CU_NEGATIVE_EFF1 = 0x00020000, SPELL_ATTR0_CU_NEGATIVE_EFF2 = 0x00040000, SPELL_ATTR0_CU_IGNORE_ARMOR = 0x00080000, + SPELL_ATTR0_CU_REQ_TAGRET_FACING_CASTER = 0x00100000, + SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET = 0x00200000, SPELL_ATTR0_CU_NEGATIVE = SPELL_ATTR0_CU_NEGATIVE_EFF0 | SPELL_ATTR0_CU_NEGATIVE_EFF1 | SPELL_ATTR0_CU_NEGATIVE_EFF2, }; |