From 4b0d412e42b074ee16e24d31b4956b2877eea555 Mon Sep 17 00:00:00 2001 From: thenecromancer Date: Wed, 13 Jan 2010 11:45:54 +0100 Subject: [PATCH] Some more casting requirements *Not allow cast on invisible/stealth target if not detected *Not allow banish/cyclone tapped unit *Not allow pickpocket players and units that can never be pickpocketed *Not allow disarm unarmed units --HG-- branch : trunk --- src/game/Spell.cpp | 33 +++++++++++++++++++++++++++++++++ src/game/SpellMgr.cpp | 3 +++ src/game/SpellMgr.h | 1 + 3 files changed, 37 insertions(+) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 7f4b8bedc7..14d6f7ba81 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -4441,6 +4441,39 @@ SpellCastResult Spell::CheckCast(bool strict) if (target->hasUnitState(UNIT_STAT_UNATTACKABLE)) return SPELL_FAILED_BAD_TARGETS; + if(!m_IsTriggeredSpell && (target->HasAuraType(SPELL_AURA_MOD_STEALTH) + || target->m_invisibilityMask) && !m_caster->canSeeOrDetect(target, true)) + return SPELL_FAILED_BAD_TARGETS; + + if (m_caster->GetTypeId() == TYPEID_PLAYER) + { + // Not allow banish not self target + if (m_spellInfo->Mechanic == MECHANIC_BANISH) + if (target->GetTypeId() == TYPEID_UNIT && + !((Player*)m_caster)->isAllowedToLoot((Creature*)target)) + return SPELL_FAILED_CANT_CAST_ON_TAPPED; + + if (m_customAttr & SPELL_ATTR_CU_PICKPOCKET) + { + if (target->GetTypeId() == TYPEID_PLAYER) + return SPELL_FAILED_BAD_TARGETS; + else if ((target->GetCreatureTypeMask() & CREATURE_TYPEMASK_HUMANOID_OR_UNDEAD) == 0) + return SPELL_FAILED_TARGET_NO_POCKETS; + } + + // Not allow disarm unarmed player + if (m_spellInfo->Mechanic == MECHANIC_DISARM) + { + if (target->GetTypeId() == TYPEID_PLAYER) + { + if(!((Player*)target)->GetWeaponForAttack(BASE_ATTACK) || !((Player*)target)->IsUseEquipedWeapon(true)) + return SPELL_FAILED_TARGET_NO_WEAPONS; + } + else if (!target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID)) + return SPELL_FAILED_TARGET_NO_WEAPONS; + } + } + if(!m_IsTriggeredSpell && VMAP::VMapFactory::checkSpellForLoS(m_spellInfo->Id) && !m_caster->IsWithinLOSInMap(target)) return SPELL_FAILED_LINE_OF_SIGHT; diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index d39b47a925..b934b9823d 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -3542,6 +3542,9 @@ void SpellMgr::LoadSpellCustomAttr() mSpellCustomAttr[i] |= SPELL_ATTR_CU_CHARGE; count++; break; + case SPELL_EFFECT_PICKPOCKET: + mSpellCustomAttr[i] |= SPELL_ATTR_CU_PICKPOCKET; + break; case SPELL_EFFECT_TRIGGER_SPELL: if (IsPositionTarget(spellInfo->EffectImplicitTargetA[j]) || spellInfo->Targets & (TARGET_FLAG_SOURCE_LOCATION|TARGET_FLAG_DEST_LOCATION)) diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index a31c4c5434..6f865ef30d 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -825,6 +825,7 @@ inline bool IsProfessionSkill(uint32 skill) #define SPELL_ATTR_CU_LINK_HIT 0x00000800 #define SPELL_ATTR_CU_LINK_AURA 0x00001000 #define SPELL_ATTR_CU_LINK_REMOVE 0x00002000 +#define SPELL_ATTR_CU_PICKPOCKET 0x00004000 #define SPELL_ATTR_CU_EXCLUDE_SELF 0x00008000 #define SPELL_ATTR_CU_NEGATIVE_EFF0 0x00010000 #define SPELL_ATTR_CU_NEGATIVE_EFF1 0x00020000