From 577812ff6eca3311f53bc4130ede620134e6b547 Mon Sep 17 00:00:00 2001 From: Laise Date: Mon, 3 May 2010 11:14:11 +0300 Subject: [PATCH] [9828] Fix TARGET_AREAEFFECT_CUSTOM --- src/game/Spell.cpp | 39 ++++++++++++++++++++++++++++++++++++++- src/game/Spell.h | 5 ++++- src/game/SpellMgr.cpp | 4 +++- src/shared/revision_nr.h | 2 +- 4 files changed, 46 insertions(+), 4 deletions(-) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 55a593bde..2dc14ca54 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1496,7 +1496,6 @@ void Spell::SetTargetMap(SpellEffectIndex effIndex, uint32 targetMode, UnitList& case TARGET_TOTEM_FIRE: case TARGET_SELF: case TARGET_SELF2: - case TARGET_AREAEFFECT_CUSTOM: case TARGET_AREAEFFECT_CUSTOM_2: targetUnitMap.push_back(m_caster); break; @@ -1707,6 +1706,44 @@ void Spell::SetTargetMap(SpellEffectIndex effIndex, uint32 targetMode, UnitList& targetUnitMap.remove(m_caster); break; } + case TARGET_AREAEFFECT_CUSTOM: + { + if (m_spellInfo->Effect[effIndex] == SPELL_EFFECT_PERSISTENT_AREA_AURA) + break; + else if (m_spellInfo->Effect[effIndex] == SPELL_EFFECT_SUMMON) + { + targetUnitMap.push_back(m_caster); + break; + } + + std::list tempTargetUnitMap; + SpellScriptTargetBounds bounds = sSpellMgr.GetSpellScriptTargetBounds(m_spellInfo->Id); + // fill real target list if no spell script target defined + FillAreaTargets(bounds.first != bounds.second ? tempTargetUnitMap : targetUnitMap, m_targets.m_destX, m_targets.m_destY, radius, PUSH_DEST_CENTER, SPELL_TARGETS_ALL); + + if (!tempTargetUnitMap.empty()) + { + for (std::list::const_iterator iter = tempTargetUnitMap.begin(); iter != tempTargetUnitMap.end(); ++iter) + { + if ((*iter)->GetTypeId() != TYPEID_UNIT) + continue; + + for(SpellScriptTarget::const_iterator i_spellST = bounds.first; i_spellST != bounds.second; ++i_spellST) + { + // only creature entries supported for this target type + if (i_spellST->second.type == SPELL_TARGET_TYPE_GAMEOBJECT) + continue; + + if ((*iter)->GetEntry() == i_spellST->second.targetEntry) + { + targetUnitMap.push_back((*iter)); + break; + } + } + } + } + break; + } case TARGET_ALL_ENEMY_IN_AREA_INSTANT: { // targets the ground, not the units in the area diff --git a/src/game/Spell.h b/src/game/Spell.h index cd1b28da1..85ddace34 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -230,7 +230,8 @@ enum SpellTargets SPELL_TARGETS_NOT_FRIENDLY, SPELL_TARGETS_NOT_HOSTILE, SPELL_TARGETS_FRIENDLY, - SPELL_TARGETS_AOE_DAMAGE + SPELL_TARGETS_AOE_DAMAGE, + SPELL_TARGETS_ALL }; #define SPELL_SPELL_CHANNEL_UPDATE_INTERVAL (1*IN_MILLISECONDS) @@ -748,6 +749,8 @@ namespace MaNGOS } } break; + case SPELL_TARGETS_ALL: + break; default: continue; } diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index d1dd4e86b..b3deeb43c 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -2295,7 +2295,9 @@ void SpellMgr::LoadSpellScriptTarget() spellProto->EffectImplicitTargetA[i] == TARGET_SCRIPT_COORDINATES || spellProto->EffectImplicitTargetB[i] == TARGET_SCRIPT_COORDINATES || spellProto->EffectImplicitTargetA[i] == TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT || - spellProto->EffectImplicitTargetB[i] == TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT ) + spellProto->EffectImplicitTargetB[i] == TARGET_FOCUS_OR_SCRIPTED_GAMEOBJECT || + spellProto->EffectImplicitTargetA[i] == TARGET_AREAEFFECT_CUSTOM || + spellProto->EffectImplicitTargetB[i] == TARGET_AREAEFFECT_CUSTOM) { targetfound = true; break; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 06368c79f..d4d4e1283 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 "9827" + #define REVISION_NR "9828" #endif // __REVISION_NR_H__