void AuraInterface::UpdateAuraStateAuras(uint32 oldflag) { if( oldflag == AURASTATE_FLAG_STUNNED && m_Unit->IsPlayer() && m_Unit->HasDummyAura(SPELL_HASH_PRIMAL_TENACITY) && TO_PLAYER(m_Unit)->GetShapeShift() == FORM_CAT ) { for(uint32 i = 0; i < TOTAL_AURAS; i++) { if(m_auras.find(i) != m_auras.end()) { if( m_auras.at(i)->GetSpellProto()->NameHash == SPELL_HASH_PRIMAL_TENACITY ) { Aura* aura = new Aura(m_auras.at(i)->GetSpellProto(), -1, TO_OBJECT(this), TO_UNIT(this)); RemoveAuraBySlot(i); aura->AddMod(232, -31, 5, 0); aura->AddMod(SPELL_AURA_DUMMY, 0, 0, 2); aura->AddMod(SPELL_AURA_ADD_PCT_MODIFIER, -51, 14, 2); AddAura(aura); continue; } if( m_auras.at(i)->m_applied) // try to apply m_auras.at(i)->ApplyModifiers(true); if( m_auras.at(i)->m_applied) // try to remove, if we lack the aurastate m_auras.at(i)->RemoveIfNecessary(); } } } else { for(uint32 i = 0; i < TOTAL_AURAS; i++) { if(m_auras.find(i) != m_auras.end()) { if( !m_auras.at(i)->m_applied) // try to apply m_auras.at(i)->ApplyModifiers(true); if( m_auras.at(i)->m_applied) // try to remove, if we lack the aurastate m_auras.at(i)->RemoveIfNecessary(); } } } }
void AuraInterface::SpellStealAuras(Unit* caster, int32 MaxSteals) { Aura* aur = NULL; int32 spells_to_steal = MaxSteals > 1 ? MaxSteals : 1; for(uint32 x = 0; x < MAX_POSITIVE_AURAS; x++) { if(m_auras.find(x) != m_auras.end()) { aur = m_auras.at(x); if(aur != NULL && aur->GetSpellId() != 15007 && !aur->IsPassive() && aur->IsPositive()) //Nothing can dispel resurrection sickness { if(aur->GetSpellProto()->DispelType == DISPEL_MAGIC && aur->GetDuration() > 0) { WorldPacket data(SMSG_SPELLDISPELLOG, 16); data << caster->GetNewGUID(); data << m_Unit->GetNewGUID(); data << uint32(1); data << aur->GetSpellId(); caster->SendMessageToSet(&data,true); Aura* aura = new Aura(aur->GetSpellProto(), (aur->GetDuration()>120000) ? 120000 : aur->GetDuration(), caster, caster); aura->stackSize = aur->stackSize; // copy the mods across for( uint32 m = 0; m < aur->GetModCount(); ++m ) { Modifier *mod = aur->GetMod(m); aura->AddMod(mod->m_type, mod->m_baseAmount, mod->m_miscValue, mod->i); } caster->AddAura(aura); RemoveAuraBySlot(x); if( --spells_to_steal <= 0 ) break; //exit loop now } } } } }
bool SkyShatterRegalia(uint32 i, Spell* s) { // Shaman - Skyshatter Regalia - Two Piece Bonus // it checks for earth, air, water, fire totems and triggers Totemic Mastery spell 38437. if(!s->p_caster) return false; if(s->p_caster->summonhandler.HasSummonInSlot(0) && s->p_caster->summonhandler.HasSummonInSlot(1) && s->p_caster->summonhandler.HasSummonInSlot(2) && s->p_caster->summonhandler.HasSummonInSlot(3)) { Aura* aur = sSpellFactoryMgr.NewAura(dbcSpell.LookupEntry(38437), 5000, s->p_caster, s->p_caster, true); for(uint32 j = 0; j < 3; j++) aur->AddMod(aur->GetSpellProto()->eff[j].EffectApplyAuraName, aur->GetSpellProto()->eff[j].EffectBasePoints + 1, aur->GetSpellProto()->eff[j].EffectMiscValue, j); s->p_caster->AddAura(aur); } return true; }
void DynamicObject::UpdateTargets() { if(m_aliveDuration == 0) return; if(m_aliveDuration >= 100) { FactionRangeList::iterator itr = m_inRangeOppFactions.begin(); FactionRangeList::iterator iend = m_inRangeOppFactions.end(); Unit * target; Aura * pAura; float radius = powf(m_floatValues[DYNAMICOBJECT_RADIUS], 2); while(itr != iend) { target = *itr; ++itr; // skip units already hit, their range will be tested later if(targets.find(target) != targets.end()) continue; if(GetDistanceSq(target) <= radius) { pAura = new Aura(m_spellProto, m_aliveDuration, u_caster, target); for(uint32 i = 0; i < 3; ++i) { if(m_spellProto->Effect[i] == 27) { pAura->AddMod(m_spellProto->EffectApplyAuraName[i], m_spellProto->EffectBasePoints[i]+1, m_spellProto->EffectMiscValue[i], i); } } target->AddAura(pAura); if(p_caster) p_caster->HandleProc(PROC_ON_CAST_SPECIFIC_SPELL | PROC_ON_CAST_SPELL,target, m_spellProto); // add to target list targets.insert(target); } } // loop the targets, check the range of all of them DynamicObjectList::iterator jtr = targets.begin(); DynamicObjectList::iterator jtr2; DynamicObjectList::iterator jend = targets.end(); while(jtr != jend) { target = *jtr; jtr2 = jtr; ++jtr; if(GetDistanceSq(target) > radius) { targets.erase(jtr2); target->RemoveAura(m_spellProto->Id); } } m_aliveDuration -= 100; } else { m_aliveDuration = 0; } if(m_aliveDuration == 0) { DynamicObjectList::iterator jtr = targets.begin(); DynamicObjectList::iterator jend = targets.end(); Unit * target; while(jtr != jend) { target = *jtr; ++jtr; target->RemoveAura(m_spellProto->Id); } Remove(); } }
void DynamicObject::UpdateTargets() { if(m_aliveDuration == 0) return; if(m_aliveDuration >= 100) { Unit* target; Aura* pAura; float radius = m_floatValues[ DYNAMICOBJECT_RADIUS ] * m_floatValues[ DYNAMICOBJECT_RADIUS ]; // Looking for targets in the Object set for(std::set< Object* >::iterator itr = m_objectsInRange.begin(); itr != m_objectsInRange.end(); ++itr) { Object* o = *itr; if(!o->IsUnit() || !TO< Unit* >(o)->isAlive()) continue; target = TO< Unit* >(o); if(!isAttackable(u_caster, target, !(m_spellProto->c_is_flags & SPELL_FLAG_IS_TARGETINGSTEALTHED))) continue; // skip units already hit, their range will be tested later if(targets.find(target->GetGUID()) != targets.end()) continue; if(GetDistanceSq(target) <= radius) { pAura = sSpellFactoryMgr.NewAura(m_spellProto, m_aliveDuration, u_caster, target, true); for(uint32 i = 0; i < 3; ++i) { if(m_spellProto->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA) { pAura->AddMod(m_spellProto->EffectApplyAuraName[i], m_spellProto->EffectBasePoints[i] + 1, m_spellProto->EffectMiscValue[i], i); } } target->AddAura(pAura); if(p_caster) { p_caster->HandleProc(PROC_ON_CAST_SPECIFIC_SPELL | PROC_ON_CAST_SPELL, target, m_spellProto); p_caster->m_procCounter = 0; } // add to target list targets.insert(target->GetGUID()); } } // loop the targets, check the range of all of them DynamicObjectList::iterator jtr = targets.begin(); DynamicObjectList::iterator jtr2; DynamicObjectList::iterator jend = targets.end(); while(jtr != jend) { target = GetMapMgr() ? GetMapMgr()->GetUnit(*jtr) : NULL; jtr2 = jtr; ++jtr; if((target != NULL) && (GetDistanceSq(target) > radius)) { target->RemoveAura(m_spellProto->Id); targets.erase(jtr2); } } m_aliveDuration -= 100; } else { m_aliveDuration = 0; } if(m_aliveDuration == 0) { Remove(); } }
void DynamicObject::UpdateTargets() { if(m_aliveDuration == 0) return; if(m_aliveDuration >= 100) { std::set<Object*>::iterator itr = GetInRangeSetBegin(),itr2; std::set<Object*>::iterator iend = GetInRangeSetEnd(); Unit * target; Aura * pAura; float radius = m_floatValues[DYNAMICOBJECT_RADIUS]*m_floatValues[DYNAMICOBJECT_RADIUS]; this->AquireInrangeLock(); //make sure to release lock before exit function ! while(itr != iend) { // target = *itr; // ++itr; itr2 = itr; ++itr; if( !( (*itr2)->IsUnit() ) || ! static_cast< Unit* >( *itr2 )->isAlive() || ( static_cast< Creature* >( *itr2 )->IsTotem() && !static_cast< Unit* >( *itr2 )->IsPlayer() ) ) continue; target = static_cast< Unit* >( *itr2 ); if( !isAttackable( p_caster, target, !(m_spellProto->c_is_flags & SPELL_FLAG_IS_TARGETINGSTEALTHED) ) ) continue; // skip units already hit, their range will be tested later if(targets.find(target->GetGUID()) != targets.end()) continue; if(GetDistanceSq(target) <= radius) { pAura = AuraPool.PooledNew(); pAura->Init(m_spellProto, m_aliveDuration, u_caster, target, true); for(uint32 i = 0; i < 3; ++i) { if(m_spellProto->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA) { pAura->AddMod(m_spellProto->EffectApplyAuraName[i], m_spellProto->EffectBasePoints[i]+1, m_spellProto->EffectMiscValue[i], i); } } target->AddAura(pAura, m_spellScript); if(p_caster) { p_caster->HandleProc(PROC_ON_CAST_SPECIFIC_SPELL | PROC_ON_CAST_SPELL,target, m_spellProto); p_caster->m_procCounter = 0; } // add to target list targets.insert(target->GetGUID()); } } this->ReleaseInrangeLock(); // loop the targets, check the range of all of them DynamicObjectList::iterator jtr = targets.begin(); DynamicObjectList::iterator jtr2; DynamicObjectList::iterator jend = targets.end(); while(jtr != jend) { target = GetMapMgr() ? GetMapMgr()->GetUnit(*jtr) : NULL; jtr2 = jtr; ++jtr; if(GetDistanceSq(target) > radius) { target->RemoveAura(m_spellProto->Id); targets.erase(jtr2); } } m_aliveDuration -= 100; } else { m_aliveDuration = 0; } if(m_aliveDuration == 0) { Remove(); } }
void DynamicObject::UpdateTargets(uint32 p_time) { Unit* u_caster = NULL; if(GUID_HIPART(casterGuid) == HIGHGUID_TYPE_GAMEOBJECT) { GameObject* goCaster = GetMapMgr()->GetGameObject(casterGuid); if(goCaster == NULL || !goCaster->IsInWorld()) m_aliveDuration = 0; // Set alive duration to 0 else if(goCaster->m_summoner) u_caster = goCaster->m_summoner; } else { u_caster = GetMapMgr()->GetUnit(casterGuid); if(u_caster == NULL || !u_caster->IsInWorld()) m_aliveDuration = 0; // Set alive duration to 0 } // If we're a channelled spell, we are required to be the caster channel target if(m_spellProto->IsChannelSpell() && u_caster) { if(u_caster->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT) != GetGUID()) m_aliveDuration = 0; } if(m_aliveDuration > 0) { if(m_aliveDuration < p_time) m_aliveDuration = 0; else m_aliveDuration -= p_time; } if(m_aliveDuration && u_caster) { Aura* pAura; Unit* target; float radius = m_floatValues[DYNAMICOBJECT_RADIUS] * m_floatValues[DYNAMICOBJECT_RADIUS]; // Looking for targets in the Object set for(std::unordered_set< Unit* >::iterator itr = m_unitsInRange.begin(); itr != m_unitsInRange.end(); ++itr) { target = *itr; if(!target->isAlive()) continue; if(!sFactionSystem.isAttackable(u_caster, target, !(m_spellProto->c_is_flags & SPELL_FLAG_IS_TARGETINGSTEALTHED))) continue; // skip units already hit, their range will be tested later if(targets.find(target->GetGUID()) != targets.end()) continue; if(GetDistanceSq(target) <= radius) { pAura = new Aura(m_spellProto, m_aliveDuration, u_caster, target); for(uint32 i = 0; i < 3; ++i) { if(m_spellProto->Effect[i] == SPELL_EFFECT_PERSISTENT_AREA_AURA) { pAura->AddMod(m_spellProto->EffectApplyAuraName[i], m_spellProto->EffectBasePoints[i]+1, m_spellProto->EffectMiscValue[i], i); } } target->AddAura(pAura); u_caster->HandleProc(PROC_ON_CAST_SPECIFIC_SPELL | PROC_ON_CAST_SPELL, NULL, target, m_spellProto); // add to target list targets.insert(target->GetGUID()); } } // loop the targets, check the range of all of them DynamicObjectList::iterator jtr = targets.begin(), jtr2, jend = targets.end(); while(jtr != jend) { jtr2 = jtr; ++jtr; target = GetMapMgr() ? GetMapMgr()->GetUnit(*jtr2) : NULL; if(target == NULL || GetDistanceSq(target) > radius) { if(target) target->RemoveAura(m_spellProto->Id); targets.erase(jtr2); } } } else { // call remove here Remove(); } }