From 9fef44790f1b8f0557ba17e4c94f2883e001f1fa Mon Sep 17 00:00:00 2001 From: megamage Date: Sat, 2 May 2009 13:42:36 -0500 Subject: *Update spell selection. --HG-- branch : trunk --- src/game/Spell.cpp | 56 ++++++++++++++++++++++++++++-------------------------- src/game/Spell.h | 2 +- 2 files changed, 30 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 622ca263adf..9c9fde63796 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1431,34 +1431,38 @@ void Spell::SearchChainTarget(std::list &TagUnitMap, float max_range, uin void Spell::SearchAreaTarget(std::list &TagUnitMap, float radius, const uint32 type, SpellTargets TargetType, uint32 entry) { float x, y, z; - if(type == PUSH_DST_CENTER) - { - if(!m_targets.HasDst()) - { - sLog.outError( "SPELL: cannot find destination for spell ID %u\n", m_spellInfo->Id ); - return; - } - x = m_targets.m_destX; - y = m_targets.m_destY; - z = m_targets.m_destZ; - } - else if(type == PUSH_CHAIN) + switch(type) { - Unit *target = m_targets.getUnitTarget(); - if(!target) + case PUSH_DST_CENTER: + CheckDst(); + x = m_targets.m_destX; + y = m_targets.m_destY; + z = m_targets.m_destZ; + break; + case PUSH_SRC_CENTER: + CheckSrc(); + x = m_targets.m_srcX; + y = m_targets.m_srcY; + z = m_targets.m_srcZ; + break; + case PUSH_CHAIN: { - sLog.outError( "SPELL: cannot find unit target for spell ID %u\n", m_spellInfo->Id ); - return; + Unit *target = m_targets.getUnitTarget(); + if(!target) + { + sLog.outError( "SPELL: cannot find unit target for spell ID %u\n", m_spellInfo->Id ); + return; + } + x = target->GetPositionX(); + y = target->GetPositionY(); + z = target->GetPositionZ(); + break; } - x = target->GetPositionX(); - y = target->GetPositionY(); - z = target->GetPositionZ(); - } - else - { - x = m_caster->GetPositionX(); - y = m_caster->GetPositionY(); - z = m_caster->GetPositionZ(); + default: + x = m_caster->GetPositionX(); + y = m_caster->GetPositionY(); + z = m_caster->GetPositionZ(); + break; } Trinity::SpellNotifierCreatureAndPlayer notifier(*this, TagUnitMap, radius, type, TargetType, entry, x, y, z); @@ -1672,12 +1676,10 @@ void Spell::SetTargetMap(uint32 i, uint32 cur) } case TARGET_TYPE_AREA_SRC: - CheckSrc(); pushType = PUSH_SRC_CENTER; break; case TARGET_TYPE_AREA_DST: - CheckDst(); pushType = PUSH_DST_CENTER; break; diff --git a/src/game/Spell.h b/src/game/Spell.h index 346dc421e2d..94166425675 100644 --- a/src/game/Spell.h +++ b/src/game/Spell.h @@ -81,7 +81,7 @@ enum SpellNotifyPushType PUSH_IN_LINE, PUSH_SRC_CENTER, PUSH_DST_CENTER, - PUSH_CASTER_CENTER, + PUSH_CASTER_CENTER, //this is never used in grid search PUSH_CHAIN, }; -- cgit v1.2.3 From 60ba92c02f715aa1a6c12df47841934df34546d4 Mon Sep 17 00:00:00 2001 From: megamage Date: Sat, 2 May 2009 14:22:25 -0500 Subject: *Fix the bug that mobs attack player again when player use Vanish. By thenecromancer --HG-- branch : trunk --- src/game/SpellEffects.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index dd6169c3b3c..efdcf30a1f9 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -1960,7 +1960,9 @@ void Spell::EffectTriggerSpell(uint32 i) bool instant = false; for(uint32 j = i+1; j < 3; ++j) { - if(m_spellInfo->Effect[j]==SPELL_EFFECT_INSTAKILL && m_spellInfo->EffectImplicitTargetA[j]==TARGET_UNIT_CASTER) + if(m_spellInfo->EffectImplicitTargetA[j] == TARGET_UNIT_CASTER + && (m_spellInfo->Effect[j]==SPELL_EFFECT_INSTAKILL + || m_spellInfo->Effect[j]==SPELL_EFFECT_SANCTUARY)) { instant = true; break; -- cgit v1.2.3 From 83a383a4604591b2eaa5c258c4ecf118b12ff7de Mon Sep 17 00:00:00 2001 From: megamage Date: Sat, 2 May 2009 18:04:22 -0500 Subject: *Check originalCaster for TARGET_TYPE_CHANNEL spells. --HG-- branch : trunk --- src/game/Spell.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 9c9fde63796..36a73ba3109 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1856,7 +1856,7 @@ void Spell::SetTargetMap(uint32 i, uint32 cur) case TARGET_TYPE_CHANNEL: { - if(!m_caster->m_currentSpells[CURRENT_CHANNELED_SPELL]) + if(!m_originalCaster || !m_originalCaster->m_currentSpells[CURRENT_CHANNELED_SPELL]) { sLog.outError( "SPELL: no current channeled spell for spell ID %u", m_spellInfo->Id ); break; @@ -1865,14 +1865,14 @@ void Spell::SetTargetMap(uint32 i, uint32 cur) switch(cur) { case TARGET_UNIT_CHANNEL: - if(Unit* target = m_caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_targets.getUnitTarget()) + if(Unit* target = m_originalCaster->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_targets.getUnitTarget()) AddUnitTarget(target, i); else sLog.outError( "SPELL: cannot find channel spell target for spell ID %u", m_spellInfo->Id ); break; case TARGET_DEST_CHANNEL: - if(m_caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_targets.HasDst()) - m_targets = m_caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_targets; + if(m_originalCaster->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_targets.HasDst()) + m_targets = m_originalCaster->m_currentSpells[CURRENT_CHANNELED_SPELL]->m_targets; else sLog.outError( "SPELL: cannot find channel spell destination for spell ID %u", m_spellInfo->Id ); break; -- cgit v1.2.3 From 6703500a9d12c89907432b75ec050c9a1b0a3f2f Mon Sep 17 00:00:00 2001 From: QAston Date: Sun, 3 May 2009 01:35:34 +0200 Subject: Do not allow finishing moves to proc from selfcast effects - original patch by freeganja --HG-- branch : trunk --- src/game/SharedDefines.h | 2 +- src/game/Spell.cpp | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index c62551e0932..15009304c70 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -349,7 +349,7 @@ enum SpellCategory #define SPELL_ATTR_EX4_UNK0 0x00000001 // 0 #define SPELL_ATTR_EX4_UNK1 0x00000002 // 1 proc on finishing move? #define SPELL_ATTR_EX4_UNK2 0x00000004 // 2 -#define SPELL_ATTR_EX4_UNK3 0x00000008 // 3 +#define SPELL_ATTR_EX4_CANT_PROC_FROM_SELFCAST 0x00000008 // 3 #define SPELL_ATTR_EX4_UNK4 0x00000010 // 4 #define SPELL_ATTR_EX4_UNK5 0x00000020 // 5 #define SPELL_ATTR_EX4_UNK6 0x00000040 // 6 diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 9c9fde63796..65b073f0565 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -976,6 +976,10 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) uint32 procVictim = m_procVictim; uint32 procEx = PROC_EX_NONE; + //Spells with this flag cannot trigger if effect is casted on self + bool canEffectTrigger = (m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_CANT_PROC_FROM_SELFCAST ? m_caster!=unitTarget : true) + && m_canTrigger; + if (missInfo==SPELL_MISS_NONE) // In case spell hit target, do all effect on that target DoSpellHitOnUnit(unit, mask); else if (missInfo == SPELL_MISS_REFLECT) // In case spell reflect from target, do all effect on caster (if hit) @@ -1011,7 +1015,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) caster->SendHealSpellLog(unitTarget, m_spellInfo->Id, addhealth, crit); // Do triggers for unit (reflect triggers passed on hit phase for correct drop charge) - if (m_canTrigger && missInfo != SPELL_MISS_REFLECT) + if (canEffectTrigger && missInfo != SPELL_MISS_REFLECT) caster->ProcDamageAndSpell(unitTarget, procAttacker, procVictim, procEx, addhealth, m_attackType, m_spellInfo); int32 gain = unitTarget->ModifyHealth( int32(addhealth) ); @@ -1037,7 +1041,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) procVictim |= PROC_FLAG_TAKEN_ANY_DAMAGE; // Do triggers for unit (reflect triggers passed on hit phase for correct drop charge) - if (m_canTrigger && missInfo != SPELL_MISS_REFLECT) + if (canEffectTrigger && missInfo != SPELL_MISS_REFLECT) caster->ProcDamageAndSpell(unitTarget, procAttacker, procVictim, procEx, damageInfo.damage, m_attackType, m_spellInfo); caster->DealSpellDamage(&damageInfo, true); @@ -1088,7 +1092,7 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) SpellNonMeleeDamage damageInfo(caster, unitTarget, m_spellInfo->Id, m_spellSchoolMask); procEx = createProcExtendMask(&damageInfo, missInfo); // Do triggers for unit (reflect triggers passed on hit phase for correct drop charge) - if (m_canTrigger && missInfo != SPELL_MISS_REFLECT) + if (canEffectTrigger && missInfo != SPELL_MISS_REFLECT) caster->ProcDamageAndSpell(unit, procAttacker, procVictim, procEx, 0, m_attackType, m_spellInfo); } @@ -1216,7 +1220,8 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask) if(m_caster->GetTypeId() == TYPEID_UNIT && ((Creature*)m_caster)->IsAIEnabled) ((Creature*)m_caster)->AI()->SpellHitTarget(unit, m_spellInfo); - if (m_ChanceTriggerSpells.size()) + // spells with this flag can trigger only if not selfcast (eviscerate for example) + if (m_ChanceTriggerSpells.size() && (!m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_CANT_PROC_FROM_SELFCAST || unit!=m_caster) { int _duration=0; for(ChanceTriggerSpells::const_iterator i = m_ChanceTriggerSpells.begin(); i != m_ChanceTriggerSpells.end(); ++i) -- cgit v1.2.3 From 87db7d64f9cc6b4337829ce96b008b84e9891002 Mon Sep 17 00:00:00 2001 From: QAston Date: Sun, 3 May 2009 01:45:52 +0200 Subject: Fix compile. --HG-- branch : trunk --- src/game/Spell.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 65b073f0565..89f1091505f 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1221,7 +1221,7 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask) ((Creature*)m_caster)->AI()->SpellHitTarget(unit, m_spellInfo); // spells with this flag can trigger only if not selfcast (eviscerate for example) - if (m_ChanceTriggerSpells.size() && (!m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_CANT_PROC_FROM_SELFCAST || unit!=m_caster) + if (m_ChanceTriggerSpells.size() && (!(m_spellInfo->AttributesEx4 & SPELL_ATTR_EX4_CANT_PROC_FROM_SELFCAST) || unit!=m_caster)) { int _duration=0; for(ChanceTriggerSpells::const_iterator i = m_ChanceTriggerSpells.begin(); i != m_ChanceTriggerSpells.end(); ++i) -- cgit v1.2.3 From cbc3d1580470d80080b42695e2a037d5be12d6f6 Mon Sep 17 00:00:00 2001 From: megamage Date: Sat, 2 May 2009 19:19:54 -0500 Subject: *Fix a typo in settargetmap. --HG-- branch : trunk --- src/game/Spell.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 36a73ba3109..a5014a3403a 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -1993,9 +1993,9 @@ void Spell::SetTargetMap(uint32 i, uint32 cur) sLog.outErrorDb("Spell (ID: %u) (caster Entry: %u) does not have record in `spell_script_target`", m_spellInfo->Id, m_caster->GetEntry()); if(IsPositiveEffect(m_spellInfo->Id, i)) - SearchAreaTarget(unitList, radius, PUSH_DST_CENTER, SPELL_TARGETS_ALLY); + SearchAreaTarget(unitList, radius, pushType, SPELL_TARGETS_ALLY); else - SearchAreaTarget(unitList, radius, PUSH_DST_CENTER, SPELL_TARGETS_ENEMY); + SearchAreaTarget(unitList, radius, pushType, SPELL_TARGETS_ENEMY); } // let it be done in one check? else @@ -2003,7 +2003,7 @@ void Spell::SetTargetMap(uint32 i, uint32 cur) for(SpellScriptTarget::const_iterator i_spellST = lower; i_spellST != upper; ++i_spellST) { if(i_spellST->second.type == SPELL_TARGET_TYPE_CREATURE) - SearchAreaTarget(unitList, radius, PUSH_DST_CENTER, SPELL_TARGETS_ENTRY, i_spellST->second.targetEntry); + SearchAreaTarget(unitList, radius, pushType, SPELL_TARGETS_ENTRY, i_spellST->second.targetEntry); } } break; -- cgit v1.2.3