aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/Spell.cpp39
-rw-r--r--src/game/SpellAuras.cpp6
-rw-r--r--src/game/SpellEffects.cpp2
-rw-r--r--src/game/SpellMgr.cpp128
-rw-r--r--src/game/SpellMgr.h31
-rw-r--r--src/game/World.cpp2
6 files changed, 99 insertions, 109 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 770d0fd8bff..37b1139077f 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -1046,8 +1046,9 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
// Get multiplier
float multiplier = m_spellInfo->DmgMultiplier[effectNumber];
// Apply multiplier mods
- if(Player* modOwner = m_originalCaster->GetSpellModOwner())
- modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_EFFECT_PAST_FIRST, multiplier,this);
+ if(m_originalCaster)
+ if(Player* modOwner = m_originalCaster->GetSpellModOwner())
+ modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_EFFECT_PAST_FIRST, multiplier,this);
m_damageMultipliers[effectNumber] *= multiplier;
}
}
@@ -1069,6 +1070,15 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
unit->CastSpell(unit, *i, true, 0, 0, m_caster->GetGUID());
}
}
+
+ if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) && m_originalCaster)
+ {
+ uint32 flag = spellmgr.GetSpellCustomAttr(m_spellInfo->Id);
+ if(flag & SPELL_ATTR_CU_EFFECT_HEAL)
+ m_originalCaster->ProcDamageAndSpell(unit, PROC_FLAG_HEAL, PROC_FLAG_NONE, 0, GetSpellSchoolMask(m_spellInfo), m_spellInfo);
+ if(m_originalCaster != unit && (flag & SPELL_ATTR_CU_EFFECT_DAMAGE))
+ m_originalCaster->ProcDamageAndSpell(unit, PROC_FLAG_HIT_SPELL, PROC_FLAG_STRUCK_SPELL, 0, GetSpellSchoolMask(m_spellInfo), m_spellInfo);
+ }
}
void Spell::DoAllEffectOnTarget(GOTargetInfo *target)
@@ -1282,7 +1292,7 @@ void Spell::SearchAreaTarget(std::list<Unit*> &TagUnitMap, float radius, const u
TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, WorldTypeMapContainer > world_object_notifier(notifier);
cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
}
- if(!spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS))
+ if(!(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_PLAYERS_ONLY))
{
TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer > grid_object_notifier(notifier);
cell_lock->Visit(cell_lock, grid_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster));
@@ -1342,8 +1352,7 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
uint32 EffectChainTarget = m_spellInfo->EffectChainTarget[i];
uint32 unMaxTargets = m_spellInfo->MaxAffectedTargets;
- if(!unMaxTargets)
- unMaxTargets = spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS);
+
if(m_originalCaster)
{
if(Player* modOwner = m_originalCaster->GetSpellModOwner())
@@ -1503,19 +1512,13 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,std::list<Unit*> &TagUnitMap)
}break;
case TARGET_IN_FRONT_OF_CASTER:
case TARGET_UNIT_CONE_ENEMY_UNKNOWN:
- switch(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_CONE_TYPE))
- {
- default:
- case 0:
- SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE);
- break;
- case 1:
- SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_AOE_DAMAGE);
- break;
- case 2:
- SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE);
- break;
- }break;
+ if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_CONE_BACK)
+ SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_AOE_DAMAGE);
+ else if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_CONE_LINE)
+ SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE);
+ else
+ SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE);
+ break;
case TARGET_UNIT_CONE_ALLY:
SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_FRIENDLY);
break;
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 1d7df27a76f..8a2eb28ceed 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -5623,7 +5623,7 @@ void Aura::PeriodicTick()
// DO NOT ACCESS MEMBERS OF THE AURA FROM NOW ON (DealDamage can delete aura)
- pCaster->ProcDamageAndSpell(target, PROC_FLAG_HIT_SPELL, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), GetSpellSchoolMask(spellProto), spellProto);
+ pCaster->ProcDamageAndSpell(target, PROC_FLAG_NONE, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), GetSpellSchoolMask(spellProto), spellProto);
break;
}
case SPELL_AURA_PERIODIC_LEECH:
@@ -5736,7 +5736,7 @@ void Aura::PeriodicTick()
// DO NOT ACCESS MEMBERS OF THE AURA FROM NOW ON (DealDamage can delete aura)
- pCaster->ProcDamageAndSpell(target, PROC_FLAG_HIT_SPELL, PROC_FLAG_TAKE_DAMAGE, new_damage, GetSpellSchoolMask(spellProto), spellProto);
+ pCaster->ProcDamageAndSpell(target, PROC_FLAG_HEALED, PROC_FLAG_TAKE_DAMAGE, new_damage, GetSpellSchoolMask(spellProto), spellProto);
if (!target->isAlive() && pCaster->IsNonMeleeSpellCasted(false))
{
for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; i++)
@@ -5839,7 +5839,7 @@ void Aura::PeriodicTick()
// ignore item heals
if(procSpell && !haveCastItem)
- pCaster->ProcDamageAndSpell(target,PROC_FLAG_HEAL, PROC_FLAG_HEALED, pdamage, SPELL_SCHOOL_MASK_NONE, spellProto);
+ pCaster->ProcDamageAndSpell(target,PROC_FLAG_NONE, PROC_FLAG_HEALED, pdamage, SPELL_SCHOOL_MASK_NONE, spellProto);
break;
}
case SPELL_AURA_PERIODIC_MANA_LEECH:
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 01fcbd87d45..2a3823118cb 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -311,7 +311,7 @@ void Spell::EffectSchoolDMG(uint32 effect_idx)
}
// Meteor like spells (divided damage to targets)
- if(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_SHARE_DAMAGE))
+ if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_SHARE_DAMAGE)
{
uint32 count = 0;
for(std::list<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin();ihit != m_UniqueTargetInfo.end();++ihit)
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index ec67d55e645..ae09d9e0650 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -1969,82 +1969,74 @@ void SpellMgr::LoadSpellPetAuras()
}
// set data in core for now
-void SpellMgr::LoadSpellExtraAttr()
+void SpellMgr::LoadSpellCustomAttr()
{
- SpellExtraAttribute tempAttr;
- tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0;
- tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0;
- tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0;
-
- tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 1;
- {
- SpellEntry const* tempSpell;
- for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i)
- {
- tempSpell = GetSpellStore()->LookupEntry(i);
- if(tempSpell && tempSpell->SpellVisual == 3879)
- mSpellExtraAttrMap[tempSpell->Id] = tempAttr;
- }
- }
- tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 2;
- mSpellExtraAttrMap[26029] = tempAttr; // dark glare
- mSpellExtraAttrMap[37433] = tempAttr; // spout
- mSpellExtraAttrMap[43140] = tempAttr; // flame breath
- mSpellExtraAttrMap[43215] = tempAttr; // flame breath
- tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0;
-
- tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 1;
- for(uint32 i = 0; i < 46000; ++i)
+ SpellEntry *tempSpell;
+ for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i)
{
- switch(i)
+ tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(i);
+ if(!tempSpell)
+ continue;
+
+ mSpellCustomAttrMap[tempSpell->Id] = 0;
+
+ for(uint32 i = 0; i < 3; ++i)
{
- case 24340: case 26558: case 28884: // Meteor
- case 36837: case 38903: case 41276: // Meteor
- case 26789: // Shard of the Fallen Star
- case 31436: // Malevolent Cleave
- case 35181: // Dive Bomb
- case 40810: case 43267: case 43268: // Saber Lash
- case 42384: // Brutal Swipe
- case 45150: // Meteor Slash
- mSpellExtraAttrMap[i] = tempAttr;
- break;
- default:
- break;
+ switch(tempSpell->EffectApplyAuraName[i])
+ {
+ case SPELL_AURA_PERIODIC_DAMAGE:
+ case SPELL_AURA_PERIODIC_DAMAGE_PERCENT:
+ case SPELL_AURA_PERIODIC_LEECH:
+ mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_EFFECT_DAMAGE;
+ break;
+ case SPELL_AURA_PERIODIC_HEAL:
+ case SPELL_AURA_OBS_MOD_HEALTH:
+ mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_EFFECT_HEAL;
+ break;
+ default:
+ break;
+ }
}
- }
- tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0;
- tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 1;
- for(uint32 i = 0; i < 46000; ++i)
- {
- switch(i)
+ if(tempSpell->SpellVisual == 3879)
+ mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_CONE_BACK;
+
+ switch(tempSpell->Id)
{
- case 44978: case 45001: case 45002: // Wild Magic
- case 45004: case 45006: case 45010: // Wild Magic
- case 31347: // Doom
- case 41635: // Prayer of Mending
- mSpellExtraAttrMap[i] = tempAttr;
- break;
- default:
- break;
+ case 26029: // dark glare
+ case 37433: // spout
+ case 43140: case 43215: // flame breath
+ mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_CONE_LINE;
+ break;
+ case 24340: case 26558: case 28884: // Meteor
+ case 36837: case 38903: case 41276: // Meteor
+ case 26789: // Shard of the Fallen Star
+ case 31436: // Malevolent Cleave
+ case 35181: // Dive Bomb
+ case 40810: case 43267: case 43268: // Saber Lash
+ case 42384: // Brutal Swipe
+ case 45150: // Meteor Slash
+ mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_SHARE_DAMAGE;
+ break;
+ case 44978: case 45001: case 45002: // Wild Magic
+ case 45004: case 45006: case 45010: // Wild Magic
+ case 31347: // Doom
+ case 41635: // Prayer of Mending
+ mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_PLAYERS_ONLY;
+ tempSpell->MaxAffectedTargets = 1;
+ break;
+ case 41376: // Spite
+ case 39992: // Needle Spine
+ mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_PLAYERS_ONLY;
+ tempSpell->MaxAffectedTargets = 3;
+ break;
+ case 8122: case 8124: case 10888: case 10890: // Psychic Scream
+ tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
+ break;
+ default:
+ break;
}
}
- tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 3;
- mSpellExtraAttrMap[41376] = tempAttr; //Spite
- mSpellExtraAttrMap[39992] = tempAttr; //Needle Spine
- tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0;
-
- //hack here, only for those strange exceptions!
- // Psychic Scream
- SpellEntry *tempSpell;
- if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8122))
- tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
- if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8124))
- tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
- if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10888))
- tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
- if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10890))
- tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE;
}
void SpellMgr::LoadSpellLinked()
diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h
index 4006fff3b59..1a13b73194b 100644
--- a/src/game/SpellMgr.h
+++ b/src/game/SpellMgr.h
@@ -634,19 +634,14 @@ inline bool IsProfessionSkill(uint32 skill)
return IsPrimaryProfessionSkill(skill) || skill == SKILL_FISHING || skill == SKILL_COOKING || skill == SKILL_FIRST_AID;
}
-enum SpellExtraAttributeType
-{
- SPELL_EXTRA_ATTR_MAX_TARGETS,
- SPELL_EXTRA_ATTR_CONE_TYPE,
- SPELL_EXTRA_ATTR_SHARE_DAMAGE
-};
-
-struct SpellExtraAttribute
-{
- uint32 attr[3];
-};
+#define SPELL_ATTR_CU_PLAYERS_ONLY 0x00000001
+#define SPELL_ATTR_CU_CONE_BACK 0x00000002
+#define SPELL_ATTR_CU_CONE_LINE 0x00000004
+#define SPELL_ATTR_CU_SHARE_DAMAGE 0x00000008
+#define SPELL_ATTR_CU_EFFECT_HEAL 0x00000010
+#define SPELL_ATTR_CU_EFFECT_DAMAGE 0x00000020
-typedef std::map<uint32, SpellExtraAttribute> SpellExtraAttrMap;
+typedef std::map<uint32, uint32> SpellCustomAttrMap;
typedef std::map<int32, std::vector<int32> > SpellLinkedMap;
@@ -848,11 +843,11 @@ class SpellMgr
return NULL;
}
- uint32 GetSpellExtraAttr(uint32 spell_id, uint32 type) const
+ uint32 GetSpellCustomAttr(uint32 spell_id) const
{
- SpellExtraAttrMap::const_iterator itr = mSpellExtraAttrMap.find(spell_id);
- if(itr != mSpellExtraAttrMap.end())
- return itr->second.attr[type];
+ SpellCustomAttrMap::const_iterator itr = mSpellCustomAttrMap.find(spell_id);
+ if(itr != mSpellCustomAttrMap.end())
+ return itr->second;
else
return 0;
}
@@ -879,7 +874,7 @@ class SpellMgr
void LoadSpellThreats();
void LoadSkillLineAbilityMap();
void LoadSpellPetAuras();
- void LoadSpellExtraAttr();
+ void LoadSpellCustomAttr();
void LoadSpellLinked();
private:
@@ -894,7 +889,7 @@ class SpellMgr
SpellProcEventMap mSpellProcEventMap;
SkillLineAbilityMap mSkillLineAbilityMap;
SpellPetAuraMap mSpellPetAuraMap;
- SpellExtraAttrMap mSpellExtraAttrMap;
+ SpellCustomAttrMap mSpellCustomAttrMap;
SpellLinkedMap mSpellLinkedMap;
};
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 6e1de2d8567..ad99e676ee7 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -1095,7 +1095,7 @@ void World::SetInitialWorldSettings()
spellmgr.LoadSpellPetAuras();
sLog.outString( "Loading spell extra attributes...(TODO)" );
- spellmgr.LoadSpellExtraAttr();
+ spellmgr.LoadSpellCustomAttr();
sLog.outString( "Loading linked spells..." );
spellmgr.LoadSpellLinked();