void Absorb(AuraEffect* aurEff, DamageInfo & dmgInfo, uint32 & absorbAmount) { Unit* victim = GetTarget(); int32 remainingHealth = victim->GetHealth() - dmgInfo.GetDamage(); uint32 allowedHealth = victim->CountPctFromMaxHealth(3); if (victim->ToPlayer()->duel != NULL) return; // If damage kills us if (remainingHealth <= 0 && !victim->ToPlayer()->HasSpellCooldown(SPELL_EXECUTE_CD)) { // Cast healing spell, completely avoid damage absorbAmount = dmgInfo.GetDamage(); int32 healAmount = int32(victim->CountPctFromMaxHealth(uint32(healPct))); victim->CastCustomSpell(victim, SPELL_EXECUTE_HEAL, &healAmount, NULL, NULL, true, NULL, aurEff); victim->ToPlayer()->AddSpellCooldown(SPELL_EXECUTE_HEAL, 0, time(NULL) + 120); victim->AddAura(SPELL_EXECUTE_STUN, victim); victim->ToPlayer()->AddSpellCooldown(SPELL_EXECUTE_CD, 0, time(NULL) + 600); victim->ToPlayer()->AddSpellCooldown(SPELL_EXECUTE_STUN, 0, time(NULL) + 600); victim->AddAura(SPELL_EXECUTE_CD, victim); std::stringstream message; message << "Player " << victim->ToPlayer()->GetName() << " has been stunned."; sWorld->SendGMText(LANG_GM_ANNOUNCE_COLOR, victim->GetName().c_str(), message.str().c_str()); } }
void UpdatePortals() // Here we handle the beams' behavior { for (int j=0; j<3; ++j) // j = color if (Creature *portal = Unit::GetCreature(*me, PortalGUID[j])) { // the one who's been casted upon before Unit *current = Unit::GetUnit(*portal, BeamTarget[j]); // temporary store for the best suitable beam reciever Unit *pTarget = me; if (Map* map = me->GetMap()) { Map::PlayerList const& players = map->GetPlayers(); // get the best suitable target for (Map::PlayerList::const_iterator i = players.begin(); i != players.end(); ++i) { Player* p = i->getSource(); if (p && p->isAlive() // alive && (!pTarget || pTarget->GetDistance2d(portal)>p->GetDistance2d(portal)) // closer than current best && !p->HasAura(PlayerDebuff[j],0) // not exhausted && !p->HasAura(PlayerBuff[(j+1)%3],0) // not on another beam && !p->HasAura(PlayerBuff[(j+2)%3],0) && IsBetween(me, p, portal)) // on the beam pTarget = p; } } // buff the target if (pTarget->GetTypeId() == TYPEID_PLAYER) pTarget->AddAura(PlayerBuff[j], pTarget); else pTarget->AddAura(NetherBuff[j], pTarget); // cast visual beam on the chosen target if switched // simple target switching isn't working -> using BeamerGUID to cast (workaround) if (!current || pTarget != current) { BeamTarget[j] = pTarget->GetGUID(); // remove currently beaming portal if (Creature *beamer = Unit::GetCreature(*portal, BeamerGUID[j])) { beamer->CastSpell(pTarget, PortalBeam[j], false); beamer->SetVisibility(VISIBILITY_OFF); beamer->DealDamage(beamer, beamer->GetMaxHealth()); beamer->RemoveFromWorld(); BeamerGUID[j] = 0; } // create new one and start beaming on the target if (Creature *beamer = portal->SummonCreature(PortalID[j],portal->GetPositionX(),portal->GetPositionY(),portal->GetPositionZ(),portal->GetOrientation(),TEMPSUMMON_TIMED_DESPAWN,60000)) { beamer->CastSpell(pTarget, PortalBeam[j], false); BeamerGUID[j] = beamer->GetGUID(); } } // aggro target if Red Beam if (j == RED_PORTAL && me->getVictim() != pTarget && pTarget->GetTypeId() == TYPEID_PLAYER) me->getThreatManager().addThreat(pTarget, 100000.0f+DoGetThreat(me->getVictim())); } }
void UpdateAI(const uint32 diff) { if (!Vorpil) { me->DealDamage(me, me->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); return; } if (move <= diff) { if (sacrificed) { SpellEntry *spell = (SpellEntry *)GetSpellStore()->LookupEntry(HeroicMode?H_SPELL_EMPOWERING_SHADOWS:SPELL_EMPOWERING_SHADOWS); if (spell) Vorpil->AddAura(new EmpoweringShadowsAura(spell, 0, NULL, Vorpil, me)); Vorpil->SetHealth(Vorpil->GetHealth()+Vorpil->GetMaxHealth()/25); DoCast(me, SPELL_SHADOW_NOVA, true); me->DealDamage(me, me->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); return; } me->GetMotionMaster()->MoveFollow(Vorpil, 0, 0); if (me->GetDistance(Vorpil) < 3) { DoCast(me, SPELL_SACRIFICE, false); sacrificed = true; move = 500; return; } if (!Vorpil->isInCombat() || Vorpil->isDead()) { me->DealDamage(me, me->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); return; } move = 1000; } else move -= diff; }
void HandlePeriodic(constAuraEffectPtr aurEff) { Unit* caster = GetCaster(); Unit* target = GetTarget(); const SpellInfo* spell = GetSpellInfo(); Player* linkedPlayer = sObjectAccessor->GetPlayer(*target, playerLinkedGuid); if (!caster || !target || !spell || !linkedPlayer || !linkedPlayer->isAlive() || !linkedPlayer->HasAura(spell->Id)) if (AuraPtr myaura = GetAura()) { myaura->Remove(); return; } if (target->GetDistance(linkedPlayer) > spell->Effects[EFFECT_0].BasePoints) { if (AuraPtr aura = target->GetAura(spell->Id)) { if (aura->GetStackAmount() >= 15) { aura->Remove(); return; } } caster->AddAura(spell->Id, target); target->CastSpell(linkedPlayer, SPELL_JASPER_CHAINS_DAMAGE, true); } else target->CastSpell(linkedPlayer, SPELL_JASPER_CHAINS_VISUAL, true); }
void UpdateAI(const uint32 uiDiff) { if (m_uiRangeCheckTimer < uiDiff) { if (Unit* target = me->SelectNearestTarget(3.0f)) { if (target->GetTypeId() == TYPEID_PLAYER && target->isAlive()) { if (target->HasAura(SPELL_DARK_ESSENCE)) { DoCastAOE(SPELL_UNLEASHED_LIGHT); me->GetMotionMaster()->MoveIdle(); me->DespawnOrUnsummon(); } else if (target->HasAura(SPELL_LIGHT_ESSENCE)) { std::list<Unit*> targetList; SelectTargetList(targetList, 100, SELECT_TARGET_NEAREST, 6.0f, true, SPELL_LIGHT_ESSENCE); if (!targetList.empty()) { for (std::list<Unit* >::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr) { Unit* pUnit = (*itr); if (pUnit && pUnit->isAlive()) { if (!pUnit->HasAura(SPELL_POWER_UP)) pUnit->AddAura(SPELL_POWER_UP, pUnit); if (Aura* aur = pUnit->GetAura(SPELL_POWER_UP)) { if (aur->GetStackAmount() + 6 > 100) { pUnit->RemoveAurasDueToSpell(SPELL_POWER_UP); pUnit->CastSpell(pUnit, SPELL_EMPOWERED_LIGHT, true); } else { if (urand(0, 100) <= 15) pUnit->CastSpell(pUnit, SPELL_SPEED, true); aur->SetStackAmount(aur->GetStackAmount() + 6); } } } } } me->GetMotionMaster()->MoveIdle(); me->DespawnOrUnsummon(); } } } m_uiRangeCheckTimer = 500; } else m_uiRangeCheckTimer -= uiDiff; }
void HandleAfterHit() { Unit * caster = GetCaster(); Unit * target = GetHitUnit(); if (caster && target) { caster->AddAura(SPELL_COLOSSUS_SMASH, target); } }
void HandleTriggerSpell(constAuraEffectPtr aurEff) { PreventDefaultAction(); Unit* caster = GetCaster(); if (!caster) return; std::list<Player*> playerList; GetPlayerListInGrid(playerList, caster, 200.0f); for (auto target: playerList) { if (target->HasAura(SPELL_TOTALY_PETRIFIED)) continue; uint32 triggeredSpell = GetSpellInfo()->Effects[0].TriggerSpell; if (!target->HasAura(triggeredSpell)) caster->AddAura(triggeredSpell, target); if (AuraPtr triggeredAura = target->GetAura(triggeredSpell)) { uint8 stackCount = triggeredAura->GetStackAmount(); uint8 newStackCount = (stackCount + 5 > 100) ? 100 : (stackCount + 5); triggeredAura->SetStackAmount(newStackCount); triggeredAura->RefreshDuration(); triggeredAura->RecalculateAmountOfEffects(); target->SetPower(POWER_ALTERNATE_POWER, newStackCount); if (newStackCount >= 100) caster->AddAura(SPELL_TOTALY_PETRIFIED, target); } } }
void HandleScriptEffect(SpellEffIndex /*effIndex*/) { if (GetCaster()->GetTypeId() != TYPEID_UNIT) return; Unit* caster = GetCaster(); CreatureAI* ickAI = caster->ToCreature()->AI(); if (Unit* target = ickAI->SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true)) { DoScriptText(SAY_ICK_CHASE_1, caster, target); caster->AddAura(GetSpellInfo()->Id, target); CAST_AI(boss_ick::boss_ickAI, ickAI)->SetTempThreat(caster->getThreatManager().getThreat(target)); caster->AddThreat(target, float(GetEffectValue())); target->AddThreat(caster, float(GetEffectValue())); } }
void UpdateAI(uint32 diff) { events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_IMMOLATION_TRAP_TRIGGER: //Riplimb and Rageface has a higher Priority than Players... if(GetRiplimb() && GetRiplimb()->GetDistance(me) <= 3.0f && !GetRiplimb()->HasAura(RAID_MODE(SPELL_WARY_10N, SPELL_WARY_25N, SPELL_WARY_10H, SPELL_WARY_25H)) && GetRiplimb()->IsAlive() && GetShannox()->AI()->GetData(DATA_PHASE) == PHASE_SHANNOX_HAS_SPEER) tempTarget = GetRiplimb(); else if (GetRageface() && GetRageface()->GetDistance(me) <= 3.0f && !GetRageface()->HasAura(RAID_MODE(SPELL_WARY_10N, SPELL_WARY_25N, SPELL_WARY_10H, SPELL_WARY_25H)) && GetRageface()->IsAlive()) tempTarget = GetRageface(); else tempTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 1.0f, true); if (!tempTarget || tempTarget->HasAura(CRYSTAL_PRISON_EFFECT)) // If no Target exists try to get a new Target in 0,5s events.ScheduleEvent(EVENT_IMMOLATION_TRAP_TRIGGER, 500); else { DoCast(tempTarget,RAID_MODE(SPELL_IMMOLATION_TRAP_10N, SPELL_IMMOLATION_TRAP_25N,SPELL_IMMOLATION_TRAP_10H, SPELL_IMMOLATION_TRAP_25H)); // Cast Spell Wary on Dogs if(tempTarget->GetEntry() == NPC_RIPLIMB || tempTarget->GetEntry() == NPC_RAGEFACE) tempTarget->AddAura(RAID_MODE(SPELL_WARY_10N, SPELL_WARY_25N, SPELL_WARY_10H, SPELL_WARY_25H),tempTarget); me->DisappearAndDie(); } break; default: break; } } }
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 UpdateAI(const uint32 uiDiff) { if (!m_instance || !UpdateVictim()) return; if (m_instance->GetData(DATA_HEALTH_TWIN_SHARED) != 0) me->SetHealth(m_instance->GetData(DATA_HEALTH_TWIN_SHARED)); else if (me->getVictim()) { me->LowerPlayerDamageReq(me->GetMaxHealth()); me->getVictim()->Kill(me); return; } else me->SetHealth(1); if (m_uiSpecialAbilityTimer <= uiDiff) { me->InterruptNonMeleeSpells(false); if (urand(0, 1)) { DoScriptText(m_uiVortexEmote, me); DoScriptText(m_uiVortexSay, me); DoCastAOE(m_uiVortexSpellId); std::list<Unit*> targetList; SelectTargetList(targetList, 100, SELECT_TARGET_NEAREST, 150.0f, true, m_uiMyEssenceSpellId); if (!targetList.empty()) { for (std::list<Unit* >::const_iterator itr = targetList.begin(); itr != targetList.end(); ++itr) { Unit* pUnit = (*itr); if (pUnit && pUnit->isAlive()) { if (!pUnit->HasAura(SPELL_POWER_UP)) pUnit->AddAura(SPELL_POWER_UP, pUnit); if (Aura* aur = pUnit->GetAura(SPELL_POWER_UP)) { if (aur->GetStackAmount() + 30 > 100) { pUnit->RemoveAurasDueToSpell(SPELL_POWER_UP); pUnit->CastSpell(pUnit, me->GetEntry() == NPC_LIGHTBANE ? SPELL_EMPOWERED_LIGHT : SPELL_EMPOWERED_DARK, true); } else { if (urand(0, 100) <= 15) pUnit->CastSpell(pUnit, SPELL_SPEED, true); aur->SetStackAmount(aur->GetStackAmount() + 30); } } } } } } else { DoScriptText(EMOTE_SHIELD, me); DoScriptText(SAY_SHIELD, me); if (Creature* Sister = GetSister()) Sister->CastSpell(Sister, SPELL_TWIN_POWER, true); DoCast(me, m_uiShieldSpellId); me->CastCustomSpell(me, m_uiTwinPactSpellId, 0, 0, 0, false); } m_uiSpecialAbilityTimer = 80000; } else m_uiSpecialAbilityTimer -= uiDiff; if (m_uiSpikeTimer <= uiDiff) { DoCastVictim(m_uiSpikeSpellId); m_uiSpikeTimer = 20*1000; } else m_uiSpikeTimer -= uiDiff; if (IsHeroic()) { if (m_uiTouchTimer <= uiDiff) { if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 200.0f, true, m_uiOtherEssenceSpellId)) { if (!target->HasAura(m_uiTouchSpellId)) { target->AddAura(m_uiTouchSpellId, target); } } m_uiTouchTimer = urand(10, 15)*1000; } else m_uiTouchTimer -= uiDiff; } if (m_uiColorballsTimer <= uiDiff) { if (m_uiWaveCount >= 2) { SummonColorballs(15); m_uiWaveCount = 0; } else { SummonColorballs(2); m_uiWaveCount++; } m_uiColorballsTimer = 15*1000; } else m_uiColorballsTimer -= uiDiff; if (m_uiBerserkTimer <= uiDiff) { if (!m_bIsBerserk) { DoCast(me, SPELL_BERSERK); DoScriptText(SAY_BERSERK, me); m_bIsBerserk = true; } } else m_uiBerserkTimer -= uiDiff; DoMeleeAttackIfReady(); }
void AreaTrigger::Update(uint32 p_time) { if (GetDuration() > int32(p_time)) _duration -= p_time; else Remove(); // expired WorldObject::Update(p_time); SpellInfo const* m_spellInfo = sSpellMgr->GetSpellInfo(GetUInt32Value(AREATRIGGER_SPELLID)); if (!m_spellInfo) return; if (!GetCaster()) { Remove(); return; } Unit* caster = GetCaster(); float radius = 0.0f; // Custom MoP Script switch (m_spellInfo->Id) { case 102793:// Ursol's Vortex { std::list<Unit*> targetList; radius = 8.0f; SurgeCore::NearestAttackableUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::NearestAttackableUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) for (auto itr : targetList) if (!itr->HasAura(127797)) caster->CastSpell(itr, 127797, true); break; } case 115460:// Healing Sphere { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { caster->CastSpell(itr, 115464, true); // Healing Sphere heal SetDuration(0); return; } } break; } case 115817:// Cancel Barrier { std::list<Unit*> targetList; radius = 6.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) for (auto itr : targetList) itr->CastSpell(itr, 115856, true); break; } case 116011:// Rune of Power { std::list<Unit*> targetList; bool affected = false; radius = 2.25f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { if (itr->GetGUID() == caster->GetGUID()) { caster->CastSpell(itr, 116014, true); // Rune of Power affected = true; if (caster->ToPlayer()) caster->ToPlayer()->UpdateManaRegen(); return; } } } if (!affected) caster->RemoveAura(116014); break; } case 116235:// Amethyst Pool { std::list<Unit*> targetList; radius = 10.0f; SurgeCore::NearestAttackableUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::NearestAttackableUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { // Amethyst Pool - Periodic Damage if (itr->GetDistance(this) > 3.5f) itr->RemoveAura(130774); else if (!itr->HasAura(130774)) caster->CastSpell(itr, 130774, true); } } break; } case 116546:// Draw Power { std::list<Unit*> targetList; radius = 30.0f; SurgeCore::NearestAttackableUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::NearestAttackableUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); for (auto itr : targetList) { if (itr->IsInAxe(caster, this, 2.0f)) { if (!itr->HasAura(116663)) caster->AddAura(116663, itr); } else itr->RemoveAurasDueToSpell(116663); } break; } case 117032:// Healing Sphere (Afterlife) { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { if (itr->GetGUID() == caster->GetGUID()) { caster->CastSpell(itr, 125355, true); // Heal for 15% of life SetDuration(0); return; } } } break; } case 119031:// Gift of the Serpent (Mastery) { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { caster->CastSpell(itr, 124041, true); // Gift of the Serpent heal SetDuration(0); return; } } break; } case 121286:// Chi Sphere (Afterlife) { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { if (itr->GetGUID() == caster->GetGUID()) { caster->CastSpell(itr, 121283, true); // Restore 1 Chi SetDuration(0); return; } } } break; } case 121536:// Angelic Feather { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { caster->CastSpell(itr, 121557, true); // Angelic Feather increase speed SetDuration(0); return; } } break; } case 122035:// Path of Blossom { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::NearestAttackableUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::NearestAttackableUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); if (!targetList.empty()) { for (auto itr : targetList) { caster->CastSpell(itr, 122036, true); // Path of Blossom damage SetDuration(0); return; } } break; } case 124503:// Gift of the Ox case 124506:// Gift of the Ox² { std::list<Unit*> targetList; radius = 1.0f; SurgeCore::AnyFriendlyUnitInObjectRangeCheck u_check(this, caster, radius); SurgeCore::UnitListSearcher<SurgeCore::AnyFriendlyUnitInObjectRangeCheck> searcher(this, targetList, u_check); VisitNearbyObject(radius, searcher); for (auto itr : targetList) { if (itr->GetGUID() != caster->GetGUID()) continue; caster->CastSpell(itr, 124507, true); // Gift of the Ox - Heal SetDuration(0); return; } break; } default: break; } }
void UpdateAI(uint32 diff) { events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_CRYSTAL_TRAP_TRIGGER: //Riplimb has a higher Priority than Players... if(GetRiplimb() && GetRiplimb()->GetDistance(me) <= 2.0f && (!GetRiplimb()->HasAura(RAID_MODE(SPELL_WARY_10N, SPELL_WARY_25N, SPELL_WARY_10H, SPELL_WARY_25H))) && GetRiplimb()->IsAlive() && GetShannox()->AI()->GetData(DATA_PHASE) == PHASE_SHANNOX_HAS_SPEER) tempTarget = GetRiplimb(); else if(GetRageface() && GetRageface()->GetDistance(me) <= 3.0f && !GetRageface()->HasAura(RAID_MODE(SPELL_WARY_10N, SPELL_WARY_25N, SPELL_WARY_10H, SPELL_WARY_25H)) && GetRageface()->IsAlive()) tempTarget = GetRageface(); else tempTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 2.0f, true); if (!tempTarget || tempTarget->HasAura(CRYSTAL_PRISON_EFFECT)) // If no Target exists try to get a new Target in 0,5s events.ScheduleEvent(EVENT_CRYSTAL_TRAP_TRIGGER, 500); else { // Intialize Prison if tempTarget was set DoCast(tempTarget,CRYSTAL_PRISON_EFFECT); myPrison = me->SummonCreature(NPC_CRYSTAL_PRISON,tempTarget->GetPositionX(), tempTarget->GetPositionY(), tempTarget->GetPositionZ(),0, TEMPSUMMON_MANUAL_DESPAWN); if (myPrison) { me->SetReactState(REACT_AGGRESSIVE); myPrison->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE); } events.ScheduleEvent(EVENT_CRYSTAL_PRISON_DESPAWN, 20000); } break; case EVENT_CRYSTAL_PRISON_DESPAWN: if (tempTarget) { myPrison->DisappearAndDie(); tempTarget->RemoveAurasDueToSpell(CRYSTAL_PRISON_EFFECT); // Cast Spell Wary on Dogs if(tempTarget->GetEntry() == NPC_RIPLIMB || tempTarget->GetEntry() == NPC_RAGEFACE) tempTarget->AddAura(RAID_MODE(SPELL_WARY_10N, SPELL_WARY_25N, SPELL_WARY_10H, SPELL_WARY_25H),tempTarget); me->DisappearAndDie(); } break; default: break; } } if(myPrison && myPrison->IsDead()) { myPrison->DisappearAndDie(); tempTarget->RemoveAurasDueToSpell(CRYSTAL_PRISON_EFFECT); // Cast Spell Wary on Dogs if(tempTarget->GetEntry() == NPC_RIPLIMB || tempTarget->GetEntry() == NPC_RAGEFACE) tempTarget->AddAura(RAID_MODE(SPELL_WARY_10N, SPELL_WARY_25N, SPELL_WARY_10H, SPELL_WARY_25H),tempTarget); me->DisappearAndDie(); } }
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 >= 200) { Unit* target; float radius = m_floatValues[DYNAMICOBJECT_RADIUS]*m_floatValues[DYNAMICOBJECT_RADIUS]; Object::InRangeSet::iterator itr,itr2; for( itr = GetInRangeSetBegin(); itr != GetInRangeSetEnd(); itr++) { itr2 = itr; if( !( (*itr2)->IsUnit() ) || ! TO_UNIT( *itr2 )->isAlive() || ((*itr2)->GetTypeId()==TYPEID_UNIT && TO_CREATURE(*itr2)->IsTotem() ) ) continue; target = TO_UNIT( *itr2 ); if( !isAttackable( m_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) != targets.end()) continue; if(GetDistanceSq(target) <= radius) { Aura* pAura(new Aura(m_spellProto, m_aliveDuration, m_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( m_caster->IsPlayer() ) { 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); } } // 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 -= 200; } 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) { 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(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(); } }