void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); target->RemoveAura(SPELL_DK_IMPROVED_BLOOD_PRESENCE_TRIGGERED); target->RemoveAura(SPELL_DK_IMPROVED_UNHOLY_PRESENCE_TRIGGERED); target->RemoveAura(SPELL_DK_FROST_PRESENCE_TRIGGERED); target->RemoveAura(SPELL_DK_UNHOLY_PRESENCE_TRIGGERED); }
void OnApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); if (GetStackAmount() == 101) { target->RemoveAura(SPELL_RAM_LEVEL_NEUTRAL); target->RemoveAura(SPELL_RAM_TROT); target->RemoveAura(SPELL_RAM_CANTER); target->RemoveAura(SPELL_RAM_GALLOP); target->RemoveAura(SPELL_GIDDYUP); target->CastSpell(target, SPELL_EXHAUSTED_RAM, true); } }
DynamicObject::~DynamicObject() { // remove aura from all targets DynamicObjectList::iterator jtr = targets.begin(); DynamicObjectList::iterator jend = targets.end(); Unit* target; while(jtr != jend) { target = *jtr; ++jtr; target->RemoveAura(m_spellProto->Id); } if(m_caster && m_caster->dynObj == this ) m_caster->dynObj = NULL; m_parentSpell = NULL; m_aliveDuration = 0; u_caster = NULL; m_spellProto = 0; p_caster = NULL; m_caster = NULL; g_caster = NULL; }
void Destroy() { Unit *owner = objmgr.GetPlayer( _unit->GetUInt64Value( UNIT_FIELD_CREATEDBY ) ); if( owner ) owner->RemoveAura( cast_spell ); delete [] this; }
void OnPeriodic(AuraEffect const* /*aurEff*/) { // Every 5 seconds Unit* target = GetTarget(); Unit* caster = GetCaster(); // If our player is no longer sit, remove all auras if (target->getStandState() != UNIT_STAND_STATE_SIT) { target->RemoveAura(GetAura()); return; } target->CastSpell(target, SPELL_BASKET_CHECK, false); // unknown use, it targets Romantic Basket target->CastSpell(target, RAND(SPELL_MEAL_EAT_VISUAL, SPELL_DRINK_VISUAL), false); bool foundSomeone = false; // For nearby players, check if they have the same aura. If so, cast Romantic Picnic (45123) // required for "hearts" visual std::list<Player*> playerList; Trinity::AnyPlayerInObjectRangeCheck checker(target, INTERACTION_DISTANCE*2); Trinity::PlayerListSearcher<Trinity::AnyPlayerInObjectRangeCheck> searcher(target, playerList, checker); target->VisitNearbyWorldObject(INTERACTION_DISTANCE*2, searcher); for (std::list<Player*>::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) if ((*itr) != target && (*itr)->HasAura(GetId())) // && (*itr)->getStandState() == UNIT_STAND_STATE_SIT) foundSomeone = true; // break; }
void JustDied(Unit* /*killer*/) { if(target) target->RemoveAura(SPELL_FLASH_FREEZE); me->ForcedDespawn(); }
void MovementInform(uint32 type, uint32 id) { if (type != POINT_MOTION_TYPE) return; Unit* ingvar = Unit::GetUnit(*me, instance ? instance->GetData64(DATA_INGVAR) : 0); if (ingvar) { switch (id) { case 1: Talk(YELL_RESURRECT); ingvar->RemoveAura(SPELL_SUMMON_BANSHEE); ingvar->CastSpell(ingvar, SPELL_SCOURG_RESURRECTION_DUMMY, true); DoCast(ingvar, SPELL_SCOURG_RESURRECTION_BEAM); uiResurectTimer = 8000; uiResurectPhase = 1; break; case 2: me->SetVisible(false); me->DealDamage(me, me->GetHealth()); me->RemoveCorpse(); break; } } }
SPELL_EFFECT_OVERRIDE_RETURNS AH_81660( Aura *aur, bool apply, uint8 i ) { Unit *target = aur->GetTarget(); //on expire remove enabler also if( apply == false && i == 0 && target && ( aur->GetTimeLeft() < 500 || ( aur->m_flags & WAS_REMOVED_ON_PLAYER_REQUEST ) ) ) target->RemoveAura( 94709, 0, AURA_SEARCH_ALL, MAX_AURAS ); return SPELL_EFFECT_OVERRIDE_CONTINUE_EXECUTION; }
void HandleScript(SpellEffIndex /*effIndex*/) { Unit* target = GetHitUnit(); if (!target || !target->GetVehicle()) return; switch (target->GetMap()->GetDifficultyID()) { case DIFFICULTY_10_N: target->RemoveAura(GetSpellInfo()->GetEffect(EFFECT_0)->CalcValue()); break; case DIFFICULTY_25_N: target->RemoveAura(GetSpellInfo()->GetEffect(EFFECT_1)->CalcValue()); break; default: break; } }
void HandleScript(SpellEffIndex /*effIndex*/) { Unit* target = GetHitUnit(); if (!target || !target->GetVehicle()) return; switch (target->GetMap()->GetDifficulty()) { case RAID_DIFFICULTY_10MAN_NORMAL: target->RemoveAura(GetSpellInfo()->Effects[EFFECT_0].CalcValue()); break; case RAID_DIFFICULTY_25MAN_NORMAL: target->RemoveAura(GetSpellInfo()->Effects[EFFECT_1].CalcValue()); break; default: break; } }
void HandleScript(SpellEffIndex /*effIndex*/) { Unit* target = this->GetHitPlayer(); if (!target) return; if (!target->GetVehicle()) return; switch (target->GetMap()->GetDifficulty()) { case RAID_DIFFICULTY_10MAN_NORMAL: target->RemoveAura(SpellMgr::CalculateSpellEffectAmount(GetSpellInfo(), EFFECT_0)); break; case RAID_DIFFICULTY_25MAN_NORMAL: target->RemoveAura(SpellMgr::CalculateSpellEffectAmount(GetSpellInfo(), EFFECT_1)); break; } }
void function (AuraEffect* aurEff, DamageInfo& /*dmgInfo*/, uint32& /*absorbAmount*/) { Unit* caster = GetCaster(); Unit* target = GetTarget(); if(caster && target) { target->RemoveAura(GetId(), caster->GetGUID()); } }
SPELL_EFFECT_OVERRIDE_RETURNS AH_33891( Aura *aur, bool apply, uint8 i ) { Unit *target = aur->GetTarget(); if( i == 0 ) { if( apply ) { target->CastSpell( target, 5420, true ); //mod armor and healing target->CastSpell( target, 81097, true ); //boost spell 1 target->CastSpell( target, 81098, true ); //boost spell 2 } else { target->RemoveAura( 5420,0,AURA_SEARCH_ALL ); target->RemoveAura( 81097,0,AURA_SEARCH_ALL ); target->RemoveAura( 81098,0,AURA_SEARCH_ALL ); } } return SPELL_EFFECT_OVERRIDE_CONTINUE_EXECUTION; }
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE) if (target->HasAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF)) if (Creature* finklestein = GetClosestCreatureWithEntry(target, NPC_FINKLESTEIN, 100.0f)) { target->RemoveAura(SPELL_ALCHEMIST_APPRENTICE_INVISBUFF); finklestein->AI()->Talk(SAY_RUINED, target); } }
void SpellValanarKineticBombAuraScript::HandleDummyTick(AuraEffect const* /*aurEff*/) { Unit* target = GetTarget(); if (target->GetTypeId() != TYPEID_UNIT) return; if (Creature* bomb = target->FindNearestCreature(NPC_KINETIC_BOMB, 0.1f, true)) { bomb->CastSpell(bomb, SPELL_KINETIC_BOMB_EXPLOSION, true); bomb->RemoveAurasDueToSpell(SPELL_KINETIC_BOMB_VISUAL); target->RemoveAura(GetAura()); bomb->AI()->DoAction(SPELL_KINETIC_BOMB_EXPLOSION); } }
void ActivateMinion(ObjectGuid uiGuid, bool flag) { Unit* minion = ObjectAccessor::GetUnit(*me, uiGuid); if (minion && minion->IsAlive()) { DoCast(minion, SPELL_AWAKEN_VAULT_WALKER, flag); minion->CastSpell(minion, SPELL_ARCHAEDAS_AWAKEN, true); minion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); minion->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); minion->setFaction(14); minion->RemoveAura(SPELL_MINION_FREEZE_ANIM); } }
void HandleBeforeHit() { Unit* target = GetHitUnit(); if (!target) return; /* * The applied aura has a duration of 8 seconds * This prevents new applications while its active * Removing it on each new proc enables the application from different sources (different grouped players) * and on new procs after the source cooldown is finished (1 second) */ if (target->HasAura(GetSpellInfo()->Id)) target->RemoveAura(GetSpellInfo()->Id); }
SPELL_EFFECT_OVERRIDE_RETURNS AH_15473( Aura *aur, bool apply, uint8 i ) { if( i == 0 ) { Unit *target = aur->GetTarget(); //Shadowform - just visual dummy required for 4.3 uint32 SpellId = 107903; if( target->IsPlayer() && SafePlayerCast( target )->HasGlyphWithID( GLYPH_PRIEST_SHADOWFORM ) ) SpellId = 107904; if( apply ) target->CastSpell( target, SpellId, true ); else target->RemoveAura( SpellId,0,AURA_SEARCH_ALL ); } return SPELL_EFFECT_OVERRIDE_CONTINUE_EXECUTION; }
DynamicObject::~DynamicObject() { // remove aura from all targets DynamicObjectList::iterator jtr = targets.begin(); DynamicObjectList::iterator jend = targets.end(); Unit * target; while(jtr != jend) { target = *jtr; ++jtr; target->RemoveAura(m_spellProto->Id); } if(u_caster->dynObj == this) u_caster->dynObj = 0; }
void SpellFunc_Gruul_Shatter(SpellDesc* pThis, ArcTicScriptCreatureAI* pCreatureAI, Unit* pTarget, TargetType pType) { GruulTheDragonkillerAI *pGruul = (pCreatureAI != NULL) ? (GruulTheDragonkillerAI*)pCreatureAI : NULL; if (pGruul != NULL) { pGruul->CastSpell(pGruul->mShatter2); // Spell to script UnitArray TargetArray = pGruul->GetInRangePlayers(); if (TargetArray.size() > 0) { for (size_t i = 0; i < TargetArray.size(); ++i) { Unit* pTarget = TargetArray[i]; pTarget->RemoveAura(GRUUL_THE_DRAGONKILLER_STONED); } } } }
void DynamicObject::Remove() { // remove aura from all targets DynamicObjectList::iterator jtr = targets.begin(); DynamicObjectList::iterator jend = targets.end(); Unit * target; while(jtr != jend) { target = GetMapMgr() ? GetMapMgr()->GetUnit(*jtr) : NULL; ++jtr; if (target != NULL) target->RemoveAura(m_spellProto->Id); } if(IsInWorld()) RemoveFromWorld(true); delete this; }
void DynamicObject::Remove() { // remove aura from all targets Unit* target; if(!IsInWorld()) { delete this; return; } for(std::set< uint64 >::iterator itr = targets.begin(); itr != targets.end(); ++itr) { uint64 TargetGUID = *itr; target = m_mapMgr->GetUnit(TargetGUID); if(target != NULL) target->RemoveAura(m_spellProto->Id); } WorldPacket data(SMSG_GAMEOBJECT_DESPAWN_ANIM, 8); data << GetGUID(); SendMessageToSet(&data, false); if(IsInWorld()) RemoveFromWorld(true); if(u_caster != NULL && m_spellProto->ChannelInterruptFlags != 0) { u_caster->SetChannelSpellTargetGUID(0); u_caster->SetChannelSpellId(0); } delete this; }
void MovementInform(uint32 type, uint32 id) { if (type != POINT_MOTION_TYPE) return; Unit* ingvar = Unit::GetUnit((*m_creature), pInstance ? pInstance->GetData64(DATA_INGVAR) : 0); if (ingvar) { switch (id) { case 1: ingvar->RemoveAura(SPELL_SUMMON_BANSHEE); ingvar->CastSpell(ingvar,SPELL_SCOURG_RESURRECTION_DUMMY,true); DoCast(ingvar, SPELL_SCOURG_RESURRECTION_BEAM); Resurect_Timer = 8000; Resurect_Phase = 1; break; case 2: m_creature->DealDamage(m_creature,m_creature->GetHealth()); m_creature->RemoveCorpse(); break; } } }
void DynamicObject::Remove() { if(IsInWorld()) { // remove aura from all targets Unit* target; for(std::set< uint64 >::iterator itr = targets.begin(); itr != targets.end(); ++itr) { uint64 TargetGUID = *itr; target = m_mapMgr->GetUnit(TargetGUID); if(target != NULL) target->RemoveAura(m_spellProto->Id); } WorldPacket data(SMSG_DESTROY_OBJECT, 8); data << GetGUID() << uint8(1); SendMessageToSet(&data, true); if(m_spellProto->IsChannelSpell() && GUID_HIPART(casterGuid) != HIGHGUID_TYPE_GAMEOBJECT) { if(Unit* u_caster = GetMapMgr()->GetUnit(casterGuid)) { if(u_caster->GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT) == GetGUID()) { u_caster->SetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT, 0); u_caster->SetUInt32Value(UNIT_CHANNEL_SPELL, 0); } } } RemoveFromWorld(true); } Destruct(); }
void OnChange(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); if (!target->HasAura(SPELL_RENTAL_RACING_RAM)) { target->RemoveAura(GetId()); return; } if (target->HasAura(SPELL_EXHAUSTED_RAM)) return; switch (GetStackAmount()) { case 1: // green target->RemoveAura(SPELL_RAM_LEVEL_NEUTRAL); target->RemoveAura(SPELL_RAM_CANTER); target->CastSpell(target, SPELL_RAM_TROT, true); break; case 6: // yellow target->RemoveAura(SPELL_RAM_TROT); target->RemoveAura(SPELL_RAM_GALLOP); target->CastSpell(target, SPELL_RAM_CANTER, true); break; case 11: // red target->RemoveAura(SPELL_RAM_CANTER); target->CastSpell(target, SPELL_RAM_GALLOP, true); break; default: break; } if (GetTargetApplication()->GetRemoveMode() == AURA_REMOVE_BY_DEFAULT) { target->RemoveAura(SPELL_RAM_TROT); target->CastSpell(target, SPELL_RAM_LEVEL_NEUTRAL, true); } }
void UpdateAI(uint32 diff) { //Return since we have no target if (!UpdateVictim()) return; switch (Phase) { case SKELETAL: if (uiCurseOfLifeTimer < diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_CURSE_OF_LIFE); uiCurseOfLifeTimer = urand(10*IN_MILLISECONDS, 15*IN_MILLISECONDS); } else uiCurseOfLifeTimer -= diff; if (uiShadowVolleyTimer < diff) { DoCastVictim(SPELL_SHADOW_VOLLEY); uiShadowVolleyTimer = urand(8*IN_MILLISECONDS, 10*IN_MILLISECONDS); } else uiShadowVolleyTimer -= diff; if (uiRainOfFireTimer < diff) { DoCastAOE(SPELL_RAIN_OF_FIRE); uiRainOfFireTimer = urand(14*IN_MILLISECONDS, 18*IN_MILLISECONDS); } else uiRainOfFireTimer -= diff; if (uiPhaseTimer < diff) { DoCast(SPELL_DECAY_FLESH); Phase = GOING_FLESH; uiPhaseTimer = 6*IN_MILLISECONDS; } else uiPhaseTimer -= diff; DoMeleeAttackIfReady(); break; case GOING_FLESH: if (uiPhaseTimer < diff) { Talk(SAY_FLESH); me->SetDisplayId(MODEL_FLESH); std::list<Unit*> playerList; SelectTargetList(playerList, 5, SELECT_TARGET_TOPAGGRO, 0, true); for (std::list<Unit*>::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) { Unit* temp = (*itr); me->AddAura(SPELL_GIFT_OF_THARON_JA, temp); temp->SetDisplayId(MODEL_SKELETON); } uiPhaseTimer = 20*IN_MILLISECONDS; uiLightningBreathTimer = urand(3*IN_MILLISECONDS, 4*IN_MILLISECONDS); uiEyeBeamTimer = urand(4*IN_MILLISECONDS, 8*IN_MILLISECONDS); uiPoisonCloudTimer = urand(6*IN_MILLISECONDS, 7*IN_MILLISECONDS); Phase = FLESH; } else uiPhaseTimer -= diff; break; case FLESH: if (uiLightningBreathTimer < diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_LIGHTNING_BREATH); uiLightningBreathTimer = urand(6*IN_MILLISECONDS, 7*IN_MILLISECONDS); } else uiLightningBreathTimer -= diff; if (uiEyeBeamTimer < diff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_EYE_BEAM); uiEyeBeamTimer = urand(4*IN_MILLISECONDS, 6*IN_MILLISECONDS); } else uiEyeBeamTimer -= diff; if (uiPoisonCloudTimer < diff) { DoCastAOE(SPELL_POISON_CLOUD); uiPoisonCloudTimer = urand(10*IN_MILLISECONDS, 12*IN_MILLISECONDS); } else uiPoisonCloudTimer -= diff; if (uiPhaseTimer < diff) { DoCast(SPELL_RETURN_FLESH); Phase = GOING_SKELETAL; uiPhaseTimer = 6*IN_MILLISECONDS; } else uiPhaseTimer -= diff; DoMeleeAttackIfReady(); break; case GOING_SKELETAL: if (uiPhaseTimer < diff) { Talk(SAY_SKELETON); me->DeMorph(); Phase = SKELETAL; uiPhaseTimer = 20*IN_MILLISECONDS; uiCurseOfLifeTimer = 1*IN_MILLISECONDS; uiRainOfFireTimer = urand(14*IN_MILLISECONDS, 18*IN_MILLISECONDS); uiShadowVolleyTimer = urand(8*IN_MILLISECONDS, 10*IN_MILLISECONDS); std::list<Unit*> playerList; SelectTargetList(playerList, 5, SELECT_TARGET_TOPAGGRO, 0, true); for (std::list<Unit*>::const_iterator itr = playerList.begin(); itr != playerList.end(); ++itr) { Unit* temp = (*itr); if (temp->HasAura(SPELL_GIFT_OF_THARON_JA)) temp->RemoveAura(SPELL_GIFT_OF_THARON_JA); temp->DeMorph(); } } else uiPhaseTimer -= diff; break; } }
void HandleEffectRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* target = GetTarget(); if (!target->HasAura(DK_SPELL_BLOOD_PRESENCE)) target->RemoveAura(DK_SPELL_IMPROVED_BLOOD_PRESENCE_TRIGGERED); }
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() { 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(); } }