- Timestamp:
- 11/19/08 13:45:21 (17 years ago)
- Location:
- trunk/src/game
- Files:
-
- 6 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/game/Spell.cpp
r194 r196 1047 1047 float multiplier = m_spellInfo->DmgMultiplier[effectNumber]; 1048 1048 // Apply multiplier mods 1049 if(Player* modOwner = m_originalCaster->GetSpellModOwner()) 1050 modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_EFFECT_PAST_FIRST, multiplier,this); 1049 if(m_originalCaster) 1050 if(Player* modOwner = m_originalCaster->GetSpellModOwner()) 1051 modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_EFFECT_PAST_FIRST, multiplier,this); 1051 1052 m_damageMultipliers[effectNumber] *= multiplier; 1052 1053 } … … 1069 1070 unit->CastSpell(unit, *i, true, 0, 0, m_caster->GetGUID()); 1070 1071 } 1072 } 1073 1074 if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) && m_originalCaster) 1075 { 1076 uint32 flag = spellmgr.GetSpellCustomAttr(m_spellInfo->Id); 1077 if(flag & SPELL_ATTR_CU_EFFECT_HEAL) 1078 m_originalCaster->ProcDamageAndSpell(unit, PROC_FLAG_HEAL, PROC_FLAG_NONE, 0, GetSpellSchoolMask(m_spellInfo), m_spellInfo); 1079 if(m_originalCaster != unit && (flag & SPELL_ATTR_CU_EFFECT_DAMAGE)) 1080 m_originalCaster->ProcDamageAndSpell(unit, PROC_FLAG_HIT_SPELL, PROC_FLAG_STRUCK_SPELL, 0, GetSpellSchoolMask(m_spellInfo), m_spellInfo); 1071 1081 } 1072 1082 } … … 1283 1293 cell_lock->Visit(cell_lock, world_object_notifier, *MapManager::Instance().GetMap(m_caster->GetMapId(), m_caster)); 1284 1294 } 1285 if(! spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS))1295 if(!(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_PLAYERS_ONLY)) 1286 1296 { 1287 1297 TypeContainerVisitor<Trinity::SpellNotifierCreatureAndPlayer, GridTypeMapContainer > grid_object_notifier(notifier); … … 1343 1353 uint32 EffectChainTarget = m_spellInfo->EffectChainTarget[i]; 1344 1354 uint32 unMaxTargets = m_spellInfo->MaxAffectedTargets; 1345 if(!unMaxTargets) 1346 unMaxTargets = spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_MAX_TARGETS); 1355 1347 1356 if(m_originalCaster) 1348 1357 { … … 1504 1513 case TARGET_IN_FRONT_OF_CASTER: 1505 1514 case TARGET_UNIT_CONE_ENEMY_UNKNOWN: 1506 switch(spellmgr.GetSpellExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_CONE_TYPE)) 1507 { 1508 default: 1509 case 0: 1510 SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE); 1511 break; 1512 case 1: 1513 SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_AOE_DAMAGE); 1514 break; 1515 case 2: 1516 SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE); 1517 break; 1518 }break; 1515 if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_CONE_BACK) 1516 SearchAreaTarget(TagUnitMap, radius, PUSH_IN_BACK, SPELL_TARGETS_AOE_DAMAGE); 1517 else if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_CONE_LINE) 1518 SearchAreaTarget(TagUnitMap, radius, PUSH_IN_LINE, SPELL_TARGETS_AOE_DAMAGE); 1519 else 1520 SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_AOE_DAMAGE); 1521 break; 1519 1522 case TARGET_UNIT_CONE_ALLY: 1520 1523 SearchAreaTarget(TagUnitMap, radius, PUSH_IN_FRONT, SPELL_TARGETS_FRIENDLY); -
trunk/src/game/SpellAuras.cpp
r178 r196 5624 5624 // DO NOT ACCESS MEMBERS OF THE AURA FROM NOW ON (DealDamage can delete aura) 5625 5625 5626 pCaster->ProcDamageAndSpell(target, PROC_FLAG_ HIT_SPELL, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), GetSpellSchoolMask(spellProto), spellProto);5626 pCaster->ProcDamageAndSpell(target, PROC_FLAG_NONE, PROC_FLAG_TAKE_DAMAGE, (pdamage <= absorb+resist) ? 0 : (pdamage-absorb-resist), GetSpellSchoolMask(spellProto), spellProto); 5627 5627 break; 5628 5628 } … … 5737 5737 // DO NOT ACCESS MEMBERS OF THE AURA FROM NOW ON (DealDamage can delete aura) 5738 5738 5739 pCaster->ProcDamageAndSpell(target, PROC_FLAG_H IT_SPELL, PROC_FLAG_TAKE_DAMAGE, new_damage, GetSpellSchoolMask(spellProto), spellProto);5739 pCaster->ProcDamageAndSpell(target, PROC_FLAG_HEALED, PROC_FLAG_TAKE_DAMAGE, new_damage, GetSpellSchoolMask(spellProto), spellProto); 5740 5740 if (!target->isAlive() && pCaster->IsNonMeleeSpellCasted(false)) 5741 5741 { … … 5840 5840 // ignore item heals 5841 5841 if(procSpell && !haveCastItem) 5842 pCaster->ProcDamageAndSpell(target,PROC_FLAG_ HEAL, PROC_FLAG_HEALED, pdamage, SPELL_SCHOOL_MASK_NONE, spellProto);5842 pCaster->ProcDamageAndSpell(target,PROC_FLAG_NONE, PROC_FLAG_HEALED, pdamage, SPELL_SCHOOL_MASK_NONE, spellProto); 5843 5843 break; 5844 5844 } -
trunk/src/game/SpellEffects.cpp
r186 r196 312 312 313 313 // Meteor like spells (divided damage to targets) 314 if(spellmgr.GetSpell ExtraAttr(m_spellInfo->Id, SPELL_EXTRA_ATTR_SHARE_DAMAGE))314 if(spellmgr.GetSpellCustomAttr(m_spellInfo->Id) & SPELL_ATTR_CU_SHARE_DAMAGE) 315 315 { 316 316 uint32 count = 0; -
trunk/src/game/SpellMgr.cpp
r186 r196 1970 1970 1971 1971 // set data in core for now 1972 void SpellMgr::LoadSpellExtraAttr() 1973 { 1974 SpellExtraAttribute tempAttr; 1975 tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0; 1976 tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0; 1977 tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0; 1978 1979 tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 1; 1980 { 1981 SpellEntry const* tempSpell; 1982 for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i) 1983 { 1984 tempSpell = GetSpellStore()->LookupEntry(i); 1985 if(tempSpell && tempSpell->SpellVisual == 3879) 1986 mSpellExtraAttrMap[tempSpell->Id] = tempAttr; 1987 } 1988 } 1989 tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 2; 1990 mSpellExtraAttrMap[26029] = tempAttr; // dark glare 1991 mSpellExtraAttrMap[37433] = tempAttr; // spout 1992 mSpellExtraAttrMap[43140] = tempAttr; // flame breath 1993 mSpellExtraAttrMap[43215] = tempAttr; // flame breath 1994 tempAttr.attr[SPELL_EXTRA_ATTR_CONE_TYPE] = 0; 1995 1996 tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 1; 1997 for(uint32 i = 0; i < 46000; ++i) 1998 { 1999 switch(i) 2000 { 2001 case 24340: case 26558: case 28884: // Meteor 2002 case 36837: case 38903: case 41276: // Meteor 2003 case 26789: // Shard of the Fallen Star 2004 case 31436: // Malevolent Cleave 2005 case 35181: // Dive Bomb 2006 case 40810: case 43267: case 43268: // Saber Lash 2007 case 42384: // Brutal Swipe 2008 case 45150: // Meteor Slash 2009 mSpellExtraAttrMap[i] = tempAttr; 2010 break; 2011 default: 2012 break; 2013 } 2014 } 2015 tempAttr.attr[SPELL_EXTRA_ATTR_SHARE_DAMAGE] = 0; 2016 2017 tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 1; 2018 for(uint32 i = 0; i < 46000; ++i) 2019 { 2020 switch(i) 2021 { 2022 case 44978: case 45001: case 45002: // Wild Magic 2023 case 45004: case 45006: case 45010: // Wild Magic 2024 case 31347: // Doom 2025 case 41635: // Prayer of Mending 2026 mSpellExtraAttrMap[i] = tempAttr; 2027 break; 2028 default: 2029 break; 2030 } 2031 } 2032 tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 3; 2033 mSpellExtraAttrMap[41376] = tempAttr; //Spite 2034 mSpellExtraAttrMap[39992] = tempAttr; //Needle Spine 2035 tempAttr.attr[SPELL_EXTRA_ATTR_MAX_TARGETS] = 0; 2036 2037 //hack here, only for those strange exceptions! 2038 // Psychic Scream 1972 void SpellMgr::LoadSpellCustomAttr() 1973 { 2039 1974 SpellEntry *tempSpell; 2040 if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8122)) 2041 tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; 2042 if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(8124)) 2043 tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; 2044 if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10888)) 2045 tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; 2046 if(tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(10890)) 2047 tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; 1975 for(uint32 i = 0; i < GetSpellStore()->GetNumRows(); ++i) 1976 { 1977 tempSpell = (SpellEntry*)GetSpellStore()->LookupEntry(i); 1978 if(!tempSpell) 1979 continue; 1980 1981 mSpellCustomAttrMap[tempSpell->Id] = 0; 1982 1983 for(uint32 i = 0; i < 3; ++i) 1984 { 1985 switch(tempSpell->EffectApplyAuraName[i]) 1986 { 1987 case SPELL_AURA_PERIODIC_DAMAGE: 1988 case SPELL_AURA_PERIODIC_DAMAGE_PERCENT: 1989 case SPELL_AURA_PERIODIC_LEECH: 1990 mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_EFFECT_DAMAGE; 1991 break; 1992 case SPELL_AURA_PERIODIC_HEAL: 1993 case SPELL_AURA_OBS_MOD_HEALTH: 1994 mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_EFFECT_HEAL; 1995 break; 1996 default: 1997 break; 1998 } 1999 } 2000 2001 if(tempSpell->SpellVisual == 3879) 2002 mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_CONE_BACK; 2003 2004 switch(tempSpell->Id) 2005 { 2006 case 26029: // dark glare 2007 case 37433: // spout 2008 case 43140: case 43215: // flame breath 2009 mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_CONE_LINE; 2010 break; 2011 case 24340: case 26558: case 28884: // Meteor 2012 case 36837: case 38903: case 41276: // Meteor 2013 case 26789: // Shard of the Fallen Star 2014 case 31436: // Malevolent Cleave 2015 case 35181: // Dive Bomb 2016 case 40810: case 43267: case 43268: // Saber Lash 2017 case 42384: // Brutal Swipe 2018 case 45150: // Meteor Slash 2019 mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_SHARE_DAMAGE; 2020 break; 2021 case 44978: case 45001: case 45002: // Wild Magic 2022 case 45004: case 45006: case 45010: // Wild Magic 2023 case 31347: // Doom 2024 case 41635: // Prayer of Mending 2025 mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_PLAYERS_ONLY; 2026 tempSpell->MaxAffectedTargets = 1; 2027 break; 2028 case 41376: // Spite 2029 case 39992: // Needle Spine 2030 mSpellCustomAttrMap[tempSpell->Id] |= SPELL_ATTR_CU_PLAYERS_ONLY; 2031 tempSpell->MaxAffectedTargets = 3; 2032 break; 2033 case 8122: case 8124: case 10888: case 10890: // Psychic Scream 2034 tempSpell->Attributes |= SPELL_ATTR_BREAKABLE_BY_DAMAGE; 2035 break; 2036 default: 2037 break; 2038 } 2039 } 2048 2040 } 2049 2041 -
trunk/src/game/SpellMgr.h
r157 r196 635 635 } 636 636 637 enum SpellExtraAttributeType 638 { 639 SPELL_EXTRA_ATTR_MAX_TARGETS, 640 SPELL_EXTRA_ATTR_CONE_TYPE, 641 SPELL_EXTRA_ATTR_SHARE_DAMAGE 642 }; 643 644 struct SpellExtraAttribute 645 { 646 uint32 attr[3]; 647 }; 648 649 typedef std::map<uint32, SpellExtraAttribute> SpellExtraAttrMap; 637 #define SPELL_ATTR_CU_PLAYERS_ONLY 0x00000001 638 #define SPELL_ATTR_CU_CONE_BACK 0x00000002 639 #define SPELL_ATTR_CU_CONE_LINE 0x00000004 640 #define SPELL_ATTR_CU_SHARE_DAMAGE 0x00000008 641 #define SPELL_ATTR_CU_EFFECT_HEAL 0x00000010 642 #define SPELL_ATTR_CU_EFFECT_DAMAGE 0x00000020 643 644 typedef std::map<uint32, uint32> SpellCustomAttrMap; 650 645 651 646 typedef std::map<int32, std::vector<int32> > SpellLinkedMap; … … 849 844 } 850 845 851 uint32 GetSpell ExtraAttr(uint32 spell_id, uint32 type) const852 { 853 Spell ExtraAttrMap::const_iterator itr = mSpellExtraAttrMap.find(spell_id);854 if(itr != mSpell ExtraAttrMap.end())855 return itr->second .attr[type];846 uint32 GetSpellCustomAttr(uint32 spell_id) const 847 { 848 SpellCustomAttrMap::const_iterator itr = mSpellCustomAttrMap.find(spell_id); 849 if(itr != mSpellCustomAttrMap.end()) 850 return itr->second; 856 851 else 857 852 return 0; … … 880 875 void LoadSkillLineAbilityMap(); 881 876 void LoadSpellPetAuras(); 882 void LoadSpell ExtraAttr();877 void LoadSpellCustomAttr(); 883 878 void LoadSpellLinked(); 884 879 … … 895 890 SkillLineAbilityMap mSkillLineAbilityMap; 896 891 SpellPetAuraMap mSpellPetAuraMap; 897 Spell ExtraAttrMap mSpellExtraAttrMap;892 SpellCustomAttrMap mSpellCustomAttrMap; 898 893 SpellLinkedMap mSpellLinkedMap; 899 894 }; -
trunk/src/game/World.cpp
r181 r196 1096 1096 1097 1097 sLog.outString( "Loading spell extra attributes...(TODO)" ); 1098 spellmgr.LoadSpell ExtraAttr();1098 spellmgr.LoadSpellCustomAttr(); 1099 1099 1100 1100 sLog.outString( "Loading linked spells..." );