Changeset 250 for trunk/src/game
- Timestamp:
- 11/19/08 13:50:41 (17 years ago)
- Location:
- trunk/src/game
- Files:
-
- 6 modified
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/game/Pet.cpp
r218 r250 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_CAST 290 // so overwrite old state 291 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; 289 294 } 290 295 … … 1287 1292 Field *fields = result->Fetch(); 1288 1293 1289 addSpell(fields[0].GetUInt16(), fields[2].GetUInt16(), PETSPELL_UNCHANGED, fields[1].GetUInt16());1294 addSpell(fields[0].GetUInt16(), (ActiveStates)fields[2].GetUInt16(), PETSPELL_UNCHANGED, fields[1].GetUInt16()); 1290 1295 } 1291 1296 while( result->NextRow() ); … … 1418 1423 } 1419 1424 1420 bool Pet::addSpell(uint16 spell_id, uint16active, PetSpellState state, uint16 slot_id, PetSpellType type)1425 bool Pet::addSpell(uint16 spell_id, ActiveStates active, PetSpellState state, uint16 slot_id, PetSpellType type) 1421 1426 { 1422 1427 SpellEntry const *spellInfo = sSpellStore.LookupEntry(spell_id); … … 1434 1439 return false; 1435 1440 } 1441 // same spells don't have autocast option 1442 if (spellInfo->AttributesEx & SPELL_ATTR_EX_PET_NOT_AUTOCAST) 1443 active = ACT_CAST; 1436 1444 1437 1445 PetSpellMap::iterator itr = m_spells.find(spell_id); … … 1509 1517 CastSpell(this, spell_id, true); 1510 1518 else if(state == PETSPELL_NEW) 1511 m_charmInfo->AddSpellToAB(oldspell_id, spell_id );1519 m_charmInfo->AddSpellToAB(oldspell_id, spell_id, active); 1512 1520 1513 1521 if(newspell->active == ACT_ENABLED) … … 1659 1667 return; 1660 1668 1661 if(const SpellEntry *tempSpell = GetSpellStore()->LookupEntry(spellid))1669 /*if(const SpellEntry *tempSpell = GetSpellStore()->LookupEntry(spellid)) 1662 1670 if(tempSpell->EffectImplicitTargetA[0] != TARGET_ALL_AROUND_CASTER 1663 1671 && tempSpell->EffectImplicitTargetA[0] != TARGET_CHAIN_DAMAGE) 1664 return; 1672 return; */ 1665 1673 1666 1674 PetSpellMap::const_iterator itr = m_spells.find((uint16)spellid); -
trunk/src/game/Pet.h
r206 r250 213 213 void _SaveSpells(); 214 214 215 bool addSpell(uint16 spell_id, uint16active = ACT_DECIDE, PetSpellState state = PETSPELL_NEW, uint16 slot_id=0xffff, PetSpellType type = PETSPELL_NORMAL);215 bool addSpell(uint16 spell_id, ActiveStates 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
r230 r250 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_ UNK170x00020000 // 17251 #define SPELL_ATTR_EX_PET_NOT_AUTOCAST 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
r236 r250 99 99 return (spellInfo->Attributes & SPELL_ATTR_PASSIVE) != 0; 100 100 } 101 101 /*not used for now so commented out 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] ||111 110 spellInfo_1->EffectMiscValue[effIndex_1] != spellInfo_2->EffectMiscValue[effIndex_2] || 112 111 spellInfo_1->EffectApplyAuraName[effIndex_1] != spellInfo_2->EffectApplyAuraName[effIndex_2]) … … 114 113 115 114 return true; 116 } 115 }*/ 117 116 118 117 int32 CompareAuraRanks(uint32 spellId_1, uint32 effIndex_1, uint32 spellId_2, uint32 effIndex_2) … … 245 244 case SPELL_CURSE: 246 245 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 { 247 259 case SPELL_TRACKER: 248 260 case SPELL_WARLOCK_ARMOR: … … 250 262 case SPELL_ELEMENTAL_SHIELD: 251 263 case SPELL_MAGE_POLYMORPH: 252 case SPELL_POSITIVE_SHOUT:253 case SPELL_JUDGEMENT:254 case SPELL_WARLOCK_CORRUPTION:255 264 return spellSpec1==spellSpec2; 256 265 case SPELL_BATTLE_ELIXIR: … … 1031 1040 } 1032 1041 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 1042 bool SpellMgr::IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2, bool isFromTheSameCaster ) const 1043 { 1038 1044 SpellEntry const *spellInfo_1 = sSpellStore.LookupEntry(spellId_1); 1039 1045 SpellEntry const *spellInfo_2 = sSpellStore.LookupEntry(spellId_2); … … 1041 1047 if(!spellInfo_1 || !spellInfo_2) 1042 1048 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; 1043 1056 1044 1057 if(spellInfo_1->SpellFamilyName != spellInfo_2->SpellFamilyName) … … 1051 1064 return false; 1052 1065 } 1066 1067 //if both elixirs are not battle/guardian/potions/flasks then always stack 1068 else if ((spellInfo_1->SpellFamilyName == SPELLFAMILY_POTION) 1069 &&(spellId_spec_1 || spellId_spec_2)) 1070 return false; 1071 1053 1072 else if (spellInfo_1->SpellFamilyFlags != spellInfo_2->SpellFamilyFlags) 1054 1073 return false; 1055 1074 1056 1075 for(uint32 i = 0; i < 3; ++i) 1057 if(spellInfo_1->Effect[i] != spellInfo_2->Effect[i]1058 || spellInfo_1->EffectApplyAuraName[i] != spellInfo_2->EffectApplyAuraName[i])1076 { 1077 if(spellInfo_1->Effect[i] != spellInfo_2->Effect[i]) 1059 1078 return false; 1060 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 } 1061 1104 return true; 1062 1105 } -
trunk/src/game/SpellMgr.h
r229 r250 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); 304 305 bool IsPassiveSpell(uint32 spellId); 305 306 … … 769 770 bool IsRankSpellDueToSpell(SpellEntry const *spellInfo_1,uint32 spellId_2) const; 770 771 static bool canStackSpellRanks(SpellEntry const *spellInfo); 771 bool IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2 ) const;772 bool IsNoStackSpellDueToSpell(uint32 spellId_1, uint32 spellId_2, bool isFromTheSameCaster ) const; 772 773 773 774 SpellEntry const* SelectAuraRankForPlayerLevel(SpellEntry const* spellInfo, uint32 playerLevel) const; -
trunk/src/game/Unit.cpp
r248 r250 3898 3898 if(!is_triggered_by_spell) 3899 3899 { 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 rank3907 if(spellmgr.IsRankSpellDueToSpell(spellProto, i_spellId))3908 if(CompareAuraRanks(spellId, effIndex, i_spellId, i_effIndex) < 0)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 (!isFromSameCaster 3905 &&(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)) 3909 3909 return false; 3910 3910 3911 // 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 else3937 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 rank3946 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 }3956 3923 } 3957 3924 }