- Timestamp:
- 11/19/08 13:51:05 (17 years ago)
- Location:
- trunk/src/game
- Files:
-
- 6 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/game/Pet.cpp
r250 r253 287 287 ++iter; 288 288 m_charmInfo->GetActionBarEntry(index)->SpellOrAction = atol((*iter).c_str()); 289 // patch for old data where some spells have ACT_DECIDE but should have ACT_CAST290 // so overwrite old state291 SpellEntry const *spellInfo = sSpellStore.LookupEntry(m_charmInfo->GetActionBarEntry(index)->SpellOrAction);292 if (spellInfo && spellInfo->AttributesEx & SPELL_ATTR_EX_PET_NOT_AUTOCAST)293 m_charmInfo->GetActionBarEntry(index)->Type = ACT_CAST;294 289 } 295 290 … … 1292 1287 Field *fields = result->Fetch(); 1293 1288 1294 addSpell(fields[0].GetUInt16(), (ActiveStates)fields[2].GetUInt16(), PETSPELL_UNCHANGED, fields[1].GetUInt16());1289 addSpell(fields[0].GetUInt16(), fields[2].GetUInt16(), PETSPELL_UNCHANGED, fields[1].GetUInt16()); 1295 1290 } 1296 1291 while( result->NextRow() ); … … 1423 1418 } 1424 1419 1425 bool Pet::addSpell(uint16 spell_id, ActiveStatesactive, PetSpellState state, uint16 slot_id, PetSpellType type)1420 bool Pet::addSpell(uint16 spell_id, uint16 active, PetSpellState state, uint16 slot_id, PetSpellType type) 1426 1421 { 1427 1422 SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id); … … 1439 1434 return false; 1440 1435 } 1441 // same spells don't have autocast option1442 if (spellInfo->AttributesEx & SPELL_ATTR_EX_PET_NOT_AUTOCAST)1443 active = ACT_CAST;1444 1436 1445 1437 PetSpellMap::iterator itr = m_spells.find(spell_id); … … 1517 1509 CastSpell(this, spell_id, true); 1518 1510 else if(state == PETSPELL_NEW) 1519 m_charmInfo->AddSpellToAB(oldspell_id, spell_id , active);1511 m_charmInfo->AddSpellToAB(oldspell_id, spell_id); 1520 1512 1521 1513 if(newspell->active == ACT_ENABLED) … … 1667 1659 return; 1668 1660 1669 /*if(const SpellEntry *tempSpell = GetSpellStore()->LookupEntry(spellid))1661 if(const SpellEntry *tempSpell = GetSpellStore()->LookupEntry(spellid)) 1670 1662 if(tempSpell->EffectImplicitTargetA[0] != TARGET_ALL_AROUND_CASTER 1671 1663 && tempSpell->EffectImplicitTargetA[0] != TARGET_CHAIN_DAMAGE) 1672 return; */1664 return; 1673 1665 1674 1666 PetSpellMap::const_iterator itr = m_spells.find((uint16)spellid); -
trunk/src/game/Pet.h
r250 r253 213 213 void _SaveSpells(); 214 214 215 bool addSpell(uint16 spell_id, ActiveStatesactive = ACT_DECIDE, PetSpellState state = PETSPELL_NEW, uint16 slot_id=0xffff, PetSpellType type = PETSPELL_NORMAL);215 bool addSpell(uint16 spell_id,uint16 active = ACT_DECIDE, PetSpellState state = PETSPELL_NEW, uint16 slot_id=0xffff, PetSpellType type = PETSPELL_NORMAL); 216 216 bool learnSpell(uint16 spell_id); 217 217 void removeSpell(uint16 spell_id); -
trunk/src/game/SharedDefines.h
r250 r253 249 249 #define SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY 0x00008000 // 15 remove auras on immunity 250 250 #define SPELL_ATTR_EX_UNAFFECTED_BY_SCHOOL_IMMUNE 0x00010000 // 16 unaffected by school immunity 251 #define SPELL_ATTR_EX_ PET_NOT_AUTOCAST0x00020000 // 17251 #define SPELL_ATTR_EX_UNK17 0x00020000 // 17 252 252 #define SPELL_ATTR_EX_UNK18 0x00040000 // 18 253 253 #define SPELL_ATTR_EX_UNK19 0x00080000 // 19 -
trunk/src/game/SpellMgr.cpp
r250 r253 99 99 return (spellInfo->Attributes & SPELL_ATTR_PASSIVE) != 0; 100 100 } 101 /*not used for now so commented out 101 102 102 bool IsNoStackAuraDueToAura(uint32 spellId_1, uint32 effIndex_1, uint32 spellId_2, uint32 effIndex_2) 103 103 { … … 108 108 109 109 if (spellInfo_1->Effect[effIndex_1] != spellInfo_2->Effect[effIndex_2] || 110 spellInfo_1->EffectItemType[effIndex_1] != spellInfo_2->EffectItemType[effIndex_2] || 110 111 spellInfo_1->EffectMiscValue[effIndex_1] != spellInfo_2->EffectMiscValue[effIndex_2] || 111 112 spellInfo_1->EffectApplyAuraName[effIndex_1] != spellInfo_2->EffectApplyAuraName[effIndex_2]) … … 113 114 114 115 return true; 115 } */116 } 116 117 117 118 int32 CompareAuraRanks(uint32 spellId_1, uint32 effIndex_1, uint32 spellId_2, uint32 effIndex_2) … … 244 245 case SPELL_CURSE: 245 246 case SPELL_ASPECT: 246 case SPELL_POSITIVE_SHOUT:247 case SPELL_JUDGEMENT:248 case SPELL_WARLOCK_CORRUPTION:249 return spellSpec1==spellSpec2;250 default:251 return false;252 }253 }254 255 bool IsSingleFromSpellSpecificPerTarget(uint32 spellSpec1,uint32 spellSpec2)256 {257 switch(spellSpec1)258 {259 247 case SPELL_TRACKER: 260 248 case SPELL_WARLOCK_ARMOR: … … 262 250 case SPELL_ELEMENTAL_SHIELD: 263 251 case SPELL_MAGE_POLYMORPH: 252 case SPELL_POSITIVE_SHOUT: 253 case SPELL_JUDGEMENT: 254 case SPELL_WARLOCK_CORRUPTION: 264 255 return spellSpec1==spellSpec2; 265 256 case SPELL_BATTLE_ELIXIR: … … 1040 1031 } 1041 1032 1042 bool SpellMgr::IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2, bool isFromTheSameCaster ) const 1043 { 1033 bool SpellMgr::IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2) const 1034 { 1035 if(spellId_1 == spellId_2) // auras due to the same spell 1036 return false; 1037 1044 1038 SpellEntry const *spellInfo_1 = sSpellStore.LookupEntry(spellId_1); 1045 1039 SpellEntry const *spellInfo_2 = sSpellStore.LookupEntry(spellId_2); … … 1047 1041 if(!spellInfo_1 || !spellInfo_2) 1048 1042 return false; 1049 1050 SpellSpecific spellId_spec_1 = GetSpellSpecific(spellId_1);1051 SpellSpecific spellId_spec_2 = GetSpellSpecific(spellId_2);1052 if (spellId_spec_1 && spellId_spec_2)1053 if (IsSingleFromSpellSpecificPerTarget(spellId_spec_1,spellId_spec_2)1054 || (IsSingleFromSpellSpecificPerCaster(spellId_spec_1,spellId_spec_2) && isFromTheSameCaster))1055 return true;1056 1043 1057 1044 if(spellInfo_1->SpellFamilyName != spellInfo_2->SpellFamilyName) … … 1064 1051 return false; 1065 1052 } 1066 1067 //if both elixirs are not battle/guardian/potions/flasks then always stack1068 else if ((spellInfo_1->SpellFamilyName == SPELLFAMILY_POTION)1069 &&(spellId_spec_1 || spellId_spec_2))1070 return false;1071 1072 1053 else if (spellInfo_1->SpellFamilyFlags != spellInfo_2->SpellFamilyFlags) 1073 1054 return false; 1074 1055 1075 1056 for(uint32 i = 0; i < 3; ++i) 1076 {1077 if(spellInfo_1->Effect[i] != spellInfo_2->Effect[i])1057 if(spellInfo_1->Effect[i] != spellInfo_2->Effect[i] 1058 || spellInfo_1->EffectApplyAuraName[i] != spellInfo_2->EffectApplyAuraName[i]) 1078 1059 return false; 1079 if (spellInfo_1->EffectApplyAuraName[i] || spellInfo_2->EffectApplyAuraName[i]) 1080 { 1081 if(spellInfo_1->EffectApplyAuraName[i] != spellInfo_2->EffectApplyAuraName[i] 1082 || spellInfo_1->EffectMiscValue[i] != spellInfo_2->EffectMiscValue[i]) 1083 // need itemtype check? need to find an example 1084 return false; 1085 else if (!isFromTheSameCaster) 1086 switch(spellInfo_1->EffectApplyAuraName[i]) 1087 { 1088 //spells with these auras from different casters will stack 1089 case SPELL_AURA_PERIODIC_DAMAGE: 1090 case SPELL_AURA_PERIODIC_HEAL: 1091 case SPELL_AURA_PERIODIC_TRIGGER_SPELL: 1092 case SPELL_AURA_PERIODIC_ENERGIZE: 1093 case SPELL_AURA_PERIODIC_MANA_LEECH: 1094 case SPELL_AURA_PERIODIC_LEECH: 1095 //exception for shaman positive totems with these auras 1096 if ((spellInfo_1->SpellFamilyName != SPELLFAMILY_SHAMAN) 1097 ||(spellInfo_1->Effect[i]!=SPELL_AURA_MOD_INCREASE_ENERGY)) 1098 return false; 1099 default: 1100 break; 1101 } 1102 } 1103 } 1060 1104 1061 return true; 1105 1062 } -
trunk/src/game/SpellMgr.h
r250 r253 285 285 } 286 286 287 //bool IsNoStackAuraDueToAura(uint32 spellId_1, uint32 effIndex_1, uint32 spellId_2, uint32 effIndex_2);287 bool IsNoStackAuraDueToAura(uint32 spellId_1, uint32 effIndex_1, uint32 spellId_2, uint32 effIndex_2); 288 288 289 289 inline bool IsSealSpell(SpellEntry const *spellInfo) … … 302 302 int32 CompareAuraRanks(uint32 spellId_1, uint32 effIndex_1, uint32 spellId_2, uint32 effIndex_2); 303 303 bool IsSingleFromSpellSpecificPerCaster(uint32 spellSpec1,uint32 spellSpec2); 304 bool IsSingleFromSpellSpecificPerTarget(uint32 spellSpec1,uint32 spellSpec2);305 304 bool IsPassiveSpell(uint32 spellId); 306 305 … … 770 769 bool IsRankSpellDueToSpell(SpellEntry const *spellInfo_1,uint32 spellId_2) const; 771 770 static bool canStackSpellRanks(SpellEntry const *spellInfo); 772 bool IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2 , bool isFromTheSameCaster) const;771 bool IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2) const; 773 772 774 773 SpellEntry const* SelectAuraRankForPlayerLevel(SpellEntry const* spellInfo, uint32 playerLevel) const; -
trunk/src/game/Unit.cpp
r252 r253 3898 3898 if(!is_triggered_by_spell) 3899 3899 { 3900 bool isFromSameCaster = Aur->GetCasterGUID() == (*i).second->GetCasterGUID();3901 if( spellmgr.IsNoStackSpellDueToSpell(spellId, i_spellId, isFromSameCaster) ) 3902 {3903 //some spells should be not removed by lower rank of them 3904 if (!isFromSameCaster3905 &&(spellProto->Effect[effIndex]==SPELL_AURA_MOD_INCREASE_ENERGY)3906 &&(spellProto->DurationIndex==21)3907 &&(spellmgr.IsRankSpellDueToSpell(spellProto, i_spellId))3908 &&(CompareAuraRanks(spellId, effIndex, i_spellId, i_effIndex) < 0))3900 SpellSpecific i_spellId_spec = GetSpellSpecific(i_spellId); 3901 3902 bool is_sspc = IsSingleFromSpellSpecificPerCaster(spellId_spec,i_spellId_spec); 3903 3904 if( is_sspc && Aur->GetCasterGUID() == (*i).second->GetCasterGUID() ) 3905 { 3906 // cannot remove higher rank 3907 if (spellmgr.IsRankSpellDueToSpell(spellProto, i_spellId)) 3908 if(CompareAuraRanks(spellId, effIndex, i_spellId, i_effIndex) < 0) 3909 3909 return false; 3910 3910 3911 // Its a parent aura (create this aura in ApplyModifier)3911 // Its a parent aura (create this aura in ApplyModifier) 3912 3912 if ((*i).second->IsInUse()) 3913 3913 { … … 3921 3921 else 3922 3922 next = m_Auras.begin(); 3923 } 3924 else if( !is_sspc && spellmgr.IsNoStackSpellDueToSpell(spellId, i_spellId) ) 3925 { 3926 // Its a parent aura (create this aura in ApplyModifier) 3927 if ((*i).second->IsInUse()) 3928 { 3929 sLog.outError("Aura (Spell %u Effect %u) is in process but attempt removed at aura (Spell %u Effect %u) adding, need add stack rule for Unit::RemoveNoStackAurasDueToAura", i->second->GetId(), i->second->GetEffIndex(),Aur->GetId(), Aur->GetEffIndex()); 3930 continue; 3931 } 3932 RemoveAurasDueToSpell(i_spellId); 3933 3934 if( m_Auras.empty() ) 3935 break; 3936 else 3937 next = m_Auras.begin(); 3938 } 3939 // Potions stack aura by aura (elixirs/flask already checked) 3940 else if( spellProto->SpellFamilyName == SPELLFAMILY_POTION && i_spellProto->SpellFamilyName == SPELLFAMILY_POTION ) 3941 { 3942 if (IsNoStackAuraDueToAura(spellId, effIndex, i_spellId, i_effIndex)) 3943 { 3944 if(CompareAuraRanks(spellId, effIndex, i_spellId, i_effIndex) < 0) 3945 return false; // cannot remove higher rank 3946 3947 // Its a parent aura (create this aura in ApplyModifier) 3948 if ((*i).second->IsInUse()) 3949 { 3950 sLog.outError("Aura (Spell %u Effect %u) is in process but attempt removed at aura (Spell %u Effect %u) adding, need add stack rule for Unit::RemoveNoStackAurasDueToAura", i->second->GetId(), i->second->GetEffIndex(),Aur->GetId(), Aur->GetEffIndex()); 3951 continue; 3952 } 3953 RemoveAura(i); 3954 next = i; 3955 } 3923 3956 } 3924 3957 }