From 1f4b00a8489e702f2a5485dd9a9e4940f4f73e49 Mon Sep 17 00:00:00 2001 From: DiSlord Date: Sat, 3 Jan 2009 03:00:54 +0300 Subject: [PATCH] [7011] Add check Aura Spell req in Spell::CanCast Signed-off-by: DiSlord --- src/game/Spell.cpp | 12 ++++++++++++ src/game/Unit.cpp | 11 +++++++++++ src/game/Unit.h | 1 + src/shared/Database/DBCStructure.h | 8 ++++---- src/shared/Database/DBCfmt.cpp | 2 +- src/shared/revision_nr.h | 2 +- 6 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index ef4a69293..3abe79d1a 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -3516,6 +3516,12 @@ uint8 Spell::CanCast(bool strict) if(m_spellInfo->CasterAuraStateNot && m_caster->HasAuraState(AuraState(m_spellInfo->CasterAuraStateNot))) return SPELL_FAILED_CASTER_AURASTATE; + // Caster aura req check if need + if(m_spellInfo->casterAuraSpell && !m_caster->isAuraPresent(m_spellInfo->casterAuraSpell)) + return SPELL_FAILED_CASTER_AURASTATE; + if(m_spellInfo->excludeCasterAuraSpell && m_caster->isAuraPresent(m_spellInfo->excludeCasterAuraSpell)) + return SPELL_FAILED_CASTER_AURASTATE; + // cancel autorepeat spells if cast start when moving // (not wand currently autorepeat cast delayed to moving stop anyway in spell update code) if( m_caster->GetTypeId()==TYPEID_PLAYER && ((Player*)m_caster)->isMoving() ) @@ -3534,6 +3540,12 @@ uint8 Spell::CanCast(bool strict) if(m_spellInfo->TargetAuraStateNot && target->HasAuraState(AuraState(m_spellInfo->TargetAuraStateNot))) return SPELL_FAILED_TARGET_AURASTATE; + // Target aura req check if need + if(m_spellInfo->targetAuraSpell && !target->isAuraPresent(m_spellInfo->targetAuraSpell)) + return SPELL_FAILED_CASTER_AURASTATE; + if(m_spellInfo->excludeTargetAuraSpell && target->isAuraPresent(m_spellInfo->excludeTargetAuraSpell)) + return SPELL_FAILED_CASTER_AURASTATE; + if(target != m_caster) { // target state requirements (apply to non-self only), to allow cast affects to self like Dirty Deeds diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 90af6c6c3..e4725a457 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -3803,6 +3803,17 @@ Aura* Unit::GetAura(uint32 spellId, uint32 effindex) return NULL; } +bool Unit::isAuraPresent(uint32 spellId) +{ + for (int i=0; i<3; ++i) + { + AuraMap::iterator iter = m_Auras.find(spellEffectPair(spellId, i)); + if (iter != m_Auras.end()) + return true; + } + return false; +} + void Unit::AddDynObject(DynamicObject* dynObj) { m_dynObjGUIDs.push_back(dynObj->GetGUID()); diff --git a/src/game/Unit.h b/src/game/Unit.h index 2d903e6e4..94f150236 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1247,6 +1247,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject uint8 GetVisibleAurasCount() { return m_visibleAuras.size(); } Aura* GetAura(uint32 spellId, uint32 effindex); + bool isAuraPresent(uint32 spellId); AuraMap & GetAuras() { return m_Auras; } AuraMap const& GetAuras() const { return m_Auras; } AuraList const& GetAurasByType(AuraType type) const { return m_modAuras[type]; } diff --git a/src/shared/Database/DBCStructure.h b/src/shared/Database/DBCStructure.h index ebc33d629..4fc67cc01 100644 --- a/src/shared/Database/DBCStructure.h +++ b/src/shared/Database/DBCStructure.h @@ -1082,10 +1082,10 @@ struct SpellEntry uint32 TargetAuraState; // 18 m_targetAuraState uint32 CasterAuraStateNot; // 19 m_excludeCasterAuraState uint32 TargetAuraStateNot; // 20 m_excludeTargetAuraState - //uint32 casterAuraSpell; // 21 m_casterAuraSpell not used - //uint32 targetAuraSpell; // 22 m_targetAuraSpell not used - //uint32 excludeCasterAuraSpell; // 23 m_excludeCasterAuraSpell not used - //uint32 excludeTargetAuraSpell; // 24 m_excludeTargetAuraSpell not used + uint32 casterAuraSpell; // 21 m_casterAuraSpell + uint32 targetAuraSpell; // 22 m_targetAuraSpell + uint32 excludeCasterAuraSpell; // 23 m_excludeCasterAuraSpell + uint32 excludeTargetAuraSpell; // 24 m_excludeTargetAuraSpell uint32 CastingTimeIndex; // 25 m_castingTimeIndex uint32 RecoveryTime; // 26 m_recoveryTime uint32 CategoryRecoveryTime; // 27 m_categoryRecoveryTime diff --git a/src/shared/Database/DBCfmt.cpp b/src/shared/Database/DBCfmt.cpp index 00101f180..deca8d6b7 100644 --- a/src/shared/Database/DBCfmt.cpp +++ b/src/shared/Database/DBCfmt.cpp @@ -70,7 +70,7 @@ const char SkillLineAbilityfmt[]="niiiixxiiiiixx"; const char SoundEntriesfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const char SpellCastTimefmt[]="nixx"; const char SpellDurationfmt[]="niii"; -const char SpellEntryfmt[]="niiiiiiiiixiiiiiiiiiixxxxiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiix"; +const char SpellEntryfmt[]="niiiiiiiiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifxiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixssssssssssssssssxssssssssssssssssxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiixfffxxxiiiiix"; const char SpellFocusObjectfmt[]="nxxxxxxxxxxxxxxxxx"; const char SpellItemEnchantmentfmt[]="nxiiiiiixxxiiissssssssssssssssxiiiixx"; const char SpellItemEnchantmentConditionfmt[]="nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX"; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 8da13cd24..839c6d868 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "7010" + #define REVISION_NR "7011" #endif // __REVISION_NR_H__