void JustDied(Unit* Killer) { DoScriptText(SAY_DEATH, m_creature); if (Creature* lakka = GetClosestCreatureWithEntry(me, NPC_LAKKA, 25.0f)) DoScriptText(SAY_LAKKA, lakka); //despawn der adds for (int i = 0; i < 16; ++i) { Unit *elec = Unit::GetUnit(*m_creature, elementarc[i]); if (elec && elec->isAlive()) elec->DealDamage(elec, elec->GetHealth(), DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); elementarc[i] = 0; Unit *ele = Unit::GetUnit(*m_creature, elementar[i]); if (ele && ele->isAlive()) ele->DealDamage(ele, ele->GetHealth(), DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); elementar[i] = 0; Unit *elea = Unit::GetUnit(*m_creature, elementara[i]); if (elea && elea->isAlive()) elea->DealDamage(elea, elea->GetHealth(), DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); elementara[i] = 0; Unit *eleb = Unit::GetUnit(*m_creature, elementarb[i]); if (eleb && eleb->isAlive()) eleb->DealDamage(eleb, eleb->GetHealth(), DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); elementarb[i] = 0; } if(pInstance) pInstance->SetData(DATA_DARKWEAVEREVENT, DONE); }
void BeginOutro() { debug_log("SD2: KALEC: Beginning Outro"); if (!pInstance) { error_log(ERROR_INST_DATA); return; } Unit* Sathrovarr = Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_SATHROVARR)); if (Sathrovarr) { Sathrovarr->DealDamage(Sathrovarr, Sathrovarr->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); Sathrovarr->Relocate(KALECGOS_ARENA_X, KALECGOS_ARENA_Y, KALECGOS_ARENA_Z); Sathrovarr->SendMonsterMove(KALECGOS_ARENA_X, KALECGOS_ARENA_Y, KALECGOS_ARENA_Z, 0, 0, 0); } Creature* Kalec = ((Creature*)Unit::GetUnit(*m_creature, pInstance->GetData64(DATA_KALECGOS_HUMAN))); if (Kalec) { Kalec->DeleteThreatList(); Kalec->SetVisibility(VISIBILITY_OFF); } m_creature->GetMotionMaster()->MoveIdle(); m_creature->setFaction(35); }
void Reset() { FrostBolt_Timer = (rand()%60)*1000; //It won't be more than a minute without cast it FrostBoltNova_Timer = 15000; //Cast every 15 seconds ChainsOfKelthuzad_Timer = (rand()%30+30)*1000; //Cast no sooner than once every 30 seconds ManaDetonation_Timer = 20000; //Seems to cast about every 20 seconds ShadowFisure_Timer = 25000; //25 seconds FrostBlast_Timer = (rand()%30+30)*1000; //Random time between 30-60 seconds GuardiansOfIcecrown_Timer = 5000; //5 seconds for summoning each Guardian of Icecrown in phase 3 for (int i=0; i<5; i++) { if (GuardiansOfIcecrown[i]) { //delete creature Unit* pUnit = Unit::GetUnit((*me), GuardiansOfIcecrown[i]); if (pUnit && pUnit->isAlive()) pUnit->DealDamage(pUnit, pUnit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); GuardiansOfIcecrown[i] = 0; } } Phase1_Timer = 310000; //Phase 1 lasts 5 minutes and 10 seconds Phase2 = false; Phase3 = false; }
void UpdateAI(const uint32 diff) { //Check if we have a target if (!UpdateVictim()) return; //EvadeTimer if (!me->IsWithinMeleeRange(me->getVictim())) { if (EvadeTimer <= diff) { Unit* p = Unit::GetUnit(*me, Portal); if (p) p->DealDamage(p, me->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); //Dissapear and reappear at new position me->SetVisibility(VISIBILITY_OFF); Unit* pTarget = NULL; pTarget = SelectUnit(SELECT_TARGET_RANDOM,0); if (!pTarget) { me->DealDamage(me, me->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); return; } if (!pTarget->HasAura(SPELL_DIGESTIVE_ACID, 0)) { me->GetMap()->CreatureRelocation(me, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0); Unit* p = DoSpawnCreature(MOB_SMALL_PORTAL,0,0,0,0,TEMPSUMMON_CORPSE_DESPAWN, 0); if (p) Portal = p->GetGUID(); GroundRuptureTimer = 500; HamstringTimer = 2000; EvadeTimer = 5000; AttackStart(pTarget); } me->SetVisibility(VISIBILITY_ON); } else EvadeTimer -= diff; } //GroundRuptureTimer if (GroundRuptureTimer <= diff) { DoCast(me->getVictim(),SPELL_GROUND_RUPTURE); GroundRuptureTimer = 30000; } else GroundRuptureTimer -= diff; //HamstringTimer if (HamstringTimer <= diff) { DoCast(me->getVictim(),SPELL_HAMSTRING); HamstringTimer = 5000; } else HamstringTimer -= diff; DoMeleeAttackIfReady(); }
/* Actual Spell Code */ bool HandleDummySpell(uint32 uSpellId, uint32 i, Spell *pSpell) { script_debuglog("Dummy spell call for spell %u = Life Tap, dmg: %u", uSpellId, pSpell->damage); // obtain our target Unit *target = pSpell->GetUnitTarget(); if(target == NULL) { script_errorlog("Dummy spell %u (Life Tap) called with null unittarget!", uSpellId); return false; } // take the health from the player (20, etc) target->DealDamage(target, pSpell->damage, 0, 0, 0); // add the mana to the players mana (but check if we're bigger than max mana) // UNIT_FIELD_POWER1 == Mana uint32 new_val = target->GetUInt32Value(UNIT_FIELD_POWER1); uint32 max_val = target->GetUInt32Value(UNIT_FIELD_MAXPOWER1); new_val += pSpell->damage; // (new_val > max_val ? max_val : new_val) // means: if(new_val > max_val) use max_val as mana value // else use new_val as the mana val target->SetUInt32Value(UNIT_FIELD_POWER1, (new_val > max_val ? max_val : new_val)); // success. return true; }
void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { sLog->outString("Perioidic Aura Effect is does a tick on target!"); Unit* target = GetTarget(); // aura targets damage self on tick target->DealDamage(target, 100); }
void HandleScript(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); Unit* target = GetHitUnit(); if (!caster || !target) return; if (AuraPtr smash = caster->GetAura(SPELL_SMASH_AURA)) { int32 stacks = smash->GetStackAmount(); if (stacks) { if (stacks > 1) smash->SetStackAmount(stacks - 1); else caster->RemoveAurasDueToSpell(SPELL_SMASH_AURA); } } const SpellInfo* SmashSpell = sSpellMgr->GetSpellInfo(SPELL_SMASH, caster->GetMap()->GetDifficulty()); if (SmashSpell) { std::list<Creature*> verminList; GetCreatureListWithEntryInGrid(verminList, caster, NPC_BOPPER, 6.0f); GetCreatureListWithEntryInGrid(verminList, caster, NPC_HOPPER, 6.0f); GetCreatureListWithEntryInGrid(verminList, caster, NPC_HOPPLING, 6.0f); if (!verminList.empty()) for (auto vermin: verminList) caster->DealDamage(vermin, vermin->GetHealth(), NULL, SPELL_DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SmashSpell); } }
void DestroyVoidZone() { for(int i= 0; i<7;i++) { if(VoidZone[i]) { Unit* uVoidZone = Unit::GetUnit((*m_creature), VoidZone[i]); if(uVoidZone) uVoidZone->DealDamage(uVoidZone, uVoidZone->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); VoidZone[i] = NULL; } } }
void AxesCleanup() { for(int i=0; i<2;++i) { Unit *axe = Unit::GetUnit(*m_creature, axes[i]); if (axe && axe->isAlive()) axe->DealDamage(axe, axe->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); axes[i] = 0; } }
void JustDied(Unit *killer) { std::vector<uint64>::iterator itr; for(itr=addsGuid.begin(); itr!=addsGuid.end(); itr++) { Unit* zombie = Unit::GetUnit((*m_creature), (*itr)); if(zombie && zombie->isAlive()) zombie->DealDamage(zombie, zombie->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } addsGuid.clear(); if(pInstance) pInstance->SetData(TYPE_GLUTH, DONE); }
bool Hysteria(uint32 i, Aura* pAura, bool apply) { if(! apply) return true; Unit* target = pAura->GetTarget(); uint32 dmg = (uint32) target->GetMaxHealth() * (pAura->GetSpellProto()->EffectBasePoints[i] + 1) / 100; target->DealDamage(target, dmg, 0, 0, 0); return true; }
void DeSpawnAdds() { for(uint8 i = 0; i < 4 ; ++i) { Unit* Temp = NULL; if (AddGUID[i]) { Temp = Unit::GetUnit((*m_creature),AddGUID[i]); if (Temp && Temp->isAlive()) Temp->DealDamage(Temp, Temp->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } } }
void destroyPortals() { if (sumportals) { for (uint8 i = 0; i < 5; ++i) { Unit *Portal = Unit::GetUnit((*me), PortalsGuid[i]); if (Portal && Portal->isAlive()) Portal->DealDamage(Portal, Portal->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); PortalsGuid[i] = 0; } sumportals = false; } }
void ShieldScript::HandleOnEffectAbsorb(AuraEffect* /*aurEff*/, DamageInfo & dmgInfo, uint32 & absorbAmount) { Unit* caster = GetCaster(); Unit* attacker = dmgInfo.GetAttacker(); if (!caster || !attacker) return; absorbAmount = dmgInfo.GetDamage(); // Deal the damage and show it on caster's log caster->DealDamage(attacker, (uint32)(absorbAmount*0.25f), NULL, dmgInfo.GetDamageType(), dmgInfo.GetSchoolMask()); caster->SendSpellNonMeleeDamageLog(attacker, GetSpellInfo()->Id, (uint32) (absorbAmount*0.25f), dmgInfo.GetSchoolMask(), 0, 0, true, 0); }
void JustDied(Unit* /*victim*/) { if (instance) instance->SetData(DATA_HEXLORDEVENT, DONE); me->MonsterYell(YELL_DEATH, LANG_UNIVERSAL, 0); DoPlaySoundToSet(me, SOUND_YELL_DEATH); for (uint8 i = 0; i < 4 ; ++i) { Unit* Temp = Unit::GetUnit((*me), AddGUID[i]); if (Temp && Temp->isAlive()) Temp->DealDamage(Temp, Temp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } }
void JustDied(Unit *victim) { DoYell(SAY_DEATH, LANG_UNIVERSAL, NULL); DoPlaySoundToSet(m_creature, SOUND_DEATH); //despawn copy if(Demon) { Unit *pUnit = NULL; pUnit = Unit::GetUnit((*m_creature), Demon); if(pUnit) pUnit->DealDamage(pUnit, pUnit->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } if(pInstance) pInstance->SetData(DATA_LEOTHERASTHEBLINDEVENT, 0); }
void JustDied(Unit *killer) { for(uint8 i = 0; i < 2; ++i) { if(PortalGUID[i]) { Unit* Portal = Unit::GetUnit((*me), PortalGUID[i]); if(Portal) Portal->DealDamage(Portal, Portal->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); PortalGUID[i] = 0; } } DoScriptText(SAY_DEATH, me); if(pInstance) pInstance->SetData(DATA_TERESTIAN, DONE); }
uint32 NextStep(uint32 Step) { Unit* Spark = Unit::GetUnit((*me), SparkGUID); switch(Step) { case 0: return 99999; case 1: //DespawnNagaFlag(true); DoScriptText(EMOTE_SPARK, Spark); return 1000; case 2: DoScriptText(GEEZLE_SAY_1, me, Spark); if (Spark) { Spark->SetInFront(me); me->SetInFront(Spark); } return 5000; case 3: DoScriptText(SPARK_SAY_2, Spark); return 7000; case 4: DoScriptText(SPARK_SAY_3, Spark); return 8000; case 5: DoScriptText(GEEZLE_SAY_4, me, Spark); return 8000; case 6: DoScriptText(SPARK_SAY_5, Spark); return 9000; case 7: DoScriptText(SPARK_SAY_6, Spark); return 8000; case 8: DoScriptText(GEEZLE_SAY_7, me, Spark); return 2000; case 9: me->GetMotionMaster()->MoveTargetedHome(); if (Spark) Spark->GetMotionMaster()->MovePoint(0, -5030.95f, -11291.99f, 7.97f); return 20000; case 10: if (Spark) Spark->DealDamage(Spark,Spark->GetHealth(),NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); //DespawnNagaFlag(false); me->SetVisibility(VISIBILITY_OFF); default: return 99999999; } }
void Reset() { for(uint8 i = 0; i < 2; ++i) { if(PortalGUID[i]) { Unit* Portal = Unit::GetUnit((*me), PortalGUID[i]); if(Portal) Portal->DealDamage(Portal, Portal->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); PortalGUID[i] = 0; } } CheckKilrekTimer = 30000; SacrificeTimer = 30000; ShadowboltTimer = 5000; SummonTimer = 10000; BerserkTimer = 600000; SummonedPortals = false; Berserk = false; if (pInstance) pInstance->SetData(TYPE_TERESTIAN, NOT_STARTED); me->RemoveAurasDueToSpell(SPELL_BROKEN_PACT); if (Minion* Kilrek = me->GetFirstMinion()) { if (!Kilrek->isAlive()) { Kilrek->UnSummon(); DoCast(me, SPELL_SUMMON_IMP, true); } } else DoCast(me, SPELL_SUMMON_IMP, true); }
void DestroyPortals() { //we destroy portals during banish phase or when we die Unit* BeamerD = NULL; Unit* BeamerDhelp = NULL; BeamerD = Unit::GetUnit((*m_creature), BeamerGUID[0]); BeamerDhelp = Unit::GetUnit((*m_creature), BeamerhelpGUID[0]); if (BeamerD && BeamerD->isAlive()) { BeamerD->DealDamage(BeamerD, BeamerD->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); BeamerGUID[0] = 0; } if (BeamerDhelp && BeamerDhelp->isAlive()) { BeamerDhelp->DealDamage(BeamerDhelp, BeamerDhelp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); BeamerhelpGUID[0] = 0; } Unit* BeamerS = NULL; Unit* BeamerShelp = NULL; BeamerS = Unit::GetUnit((*m_creature), BeamerGUID[1]); BeamerShelp = Unit::GetUnit((*m_creature), BeamerhelpGUID[1]); if (BeamerS && BeamerS->isAlive()) { BeamerS->DealDamage(BeamerS, BeamerS->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); BeamerGUID[1] = 0; } if (BeamerShelp && BeamerShelp->isAlive()) { BeamerShelp->DealDamage(BeamerShelp, BeamerShelp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); BeamerhelpGUID[1] = 0; } Unit* BeamerP = NULL; Unit* BeamerPhelp = NULL; BeamerP = Unit::GetUnit((*m_creature), BeamerGUID[2]); BeamerPhelp = Unit::GetUnit((*m_creature), BeamerhelpGUID[2]); if (BeamerP && BeamerP->isAlive()) { BeamerP->DealDamage(BeamerP, BeamerP->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); BeamerGUID[2] = 0; } if (BeamerPhelp && BeamerPhelp->isAlive()) { BeamerPhelp->DealDamage(BeamerPhelp, BeamerPhelp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); BeamerhelpGUID[2] = 0; } }
uint32 NextStep(uint32 Step) { Unit* arca = Unit::GetUnit(*me, ArcanagosGUID); Map* map = me->GetMap(); switch (Step) { case 0: return 9999999; case 1: me->MonsterYell(SAY_DIALOG_MEDIVH_1, LANG_UNIVERSAL, 0); return 10000; case 2: if (arca) CAST_CRE(arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_2, LANG_UNIVERSAL, 0); return 20000; case 3: me->MonsterYell(SAY_DIALOG_MEDIVH_3, LANG_UNIVERSAL, 0); return 10000; case 4: if (arca) CAST_CRE(arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_4, LANG_UNIVERSAL, 0); return 20000; case 5: me->MonsterYell(SAY_DIALOG_MEDIVH_5, LANG_UNIVERSAL, 0); return 20000; case 6: if (arca) CAST_CRE(arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_6, LANG_UNIVERSAL, 0); return 10000; case 7: FireArcanagosTimer = 500; return 5000; case 8: FireMedivhTimer = 500; DoCast(me, SPELL_MANA_SHIELD); return 10000; case 9: me->MonsterTextEmote(EMOTE_DIALOG_MEDIVH_7, 0, false); return 10000; case 10: if (arca) DoCast(arca, SPELL_CONFLAGRATION_BLAST, false); return 1000; case 11: if (arca) CAST_CRE(arca)->MonsterYell(SAY_DIALOG_ARCANAGOS_8, LANG_UNIVERSAL, 0); return 5000; case 12: arca->GetMotionMaster()->MovePoint(0, -11010.82f, -1761.18f, 156.47f); arca->setActive(true); arca->InterruptNonMeleeSpells(true); arca->SetSpeed(MOVE_FLIGHT, 2.0f); return 10000; case 13: me->MonsterYell(SAY_DIALOG_MEDIVH_9, LANG_UNIVERSAL, 0); return 10000; case 14: me->SetVisible(false); me->ClearInCombat(); if (map->IsDungeon()) { InstanceMap::PlayerList const &PlayerList = map->GetPlayers(); for (InstanceMap::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { if (i->getSource()->isAlive()) { if (i->getSource()->GetQuestStatus(9645) == QUEST_STATUS_INCOMPLETE) i->getSource()->CompleteQuest(9645); } } } return 50000; case 15: arca->DealDamage(arca, arca->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); return 5000; default : return 9999999; } }
void JustDied(Unit*) { Unit* p = Unit::GetUnit(*me, Portal); if (p) p->DealDamage(p, p->GetMaxHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false); }
bool NetherBeam(int beamerID) { if(beamerID < 0 || beamerID > 2) return false; Map *map = m_creature->GetMap(); if(!map->IsDungeon()) return false; Unit* uBeamer = Unit::GetUnit(*m_creature, BeamerGUID[beamerID]); if(!uBeamer) return false; Unit* uBeamerHelp = Unit::GetUnit(*m_creature, BeamerhelpGUID[beamerID]); if(!uBeamerHelp) return false; CandidatesGUID[beamerID] = m_creature->GetGUID(); Unit* uCandidate = Unit::GetUnit(*m_creature, CandidatesGUID[beamerID]); if(!uCandidate) return false; int spell_exhaustion = -1; Unit* uLastCandidate = NULL; int creature_portal = -1; int spell_plr = -1; int spell_creature = -1; int spell_beam = -1; // switch beam specific settings/variables uLastCandidate = Unit::GetUnit(*m_creature, LastCandidatesGUID[beamerID]); switch(beamerID) { case 0: // blue spell_exhaustion = SPELL_EXHAUSTION_DOM; //uLastCandidate = lastDOMcandidate; creature_portal = CREATURE_BLUEPORTAL; spell_plr = SPELL_DOMINANCE_PLR; spell_creature = SPELL_DOMINANCE_NS; spell_beam = SPELL_BEAM_DOM; break; case 1: // green spell_exhaustion = SPELL_EXHAUSTION_SER; //uLastCandidate = lastSERcandidate; creature_portal = CREATURE_GREENPORTAL; spell_plr = SPELL_SERENITY_PLR; spell_creature = SPELL_SERENITY_NS; spell_beam = SPELL_BEAM_SER; break; case 2: // red spell_exhaustion = SPELL_EXHAUSTION_PER; //uLastCandidate = lastPERcandidate; creature_portal = CREATURE_REDPORTAL; spell_plr = SPELL_PERSEVERENCE_PLR; spell_creature = SPELL_PERSEVERENCE_NS; spell_beam = SPELL_BEAM_PER; break; default: return false; // oO? something got wrong... } // step throught each player in the list and check, if he is in the beam Map::PlayerList const &PlayerList = map->GetPlayers(); for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { if(i->getSource() && i->getSource()->isAlive()) { plr = Unit::GetUnit(*m_creature, i->getSource()->GetGUID()); BossDist = m_creature->GetDistance2d(uBeamer); BossAngle = m_creature->GetAngle(uBeamer); PlrDist = plr->GetDistance2d(uBeamer); PlrAngle = plr->GetAngle(uBeamer); if((BossAngle - degrad10) < PlrAngle // is in range? && PlrAngle < (BossAngle + degrad10) // is in range? && PlrDist < BossDist // is in range? && !plr->HasAura(spell_exhaustion,0) // hasn't yet the spell? && plr->isAlive()) { // is alive? uCandidate = plr; // ok, take him as candidate if(beamerID==2) // red beam PLRonRedBeam = true; } } } if(uCandidate == m_creature) { if(uCandidate != uLastCandidate) { if(uBeamer) { uBeamer->DealDamage(uBeamerHelp, uBeamerHelp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); if(uBeamerHelp) { BeamerhelpGUID[beamerID] = 0; uBeamerHelp = NULL; uBeamerHelp = uBeamer->SummonCreature(creature_portal,RandomedCoords[beamerID][0],RandomedCoords[beamerID][1],RandomedCoords[beamerID][2],0,TEMPSUMMON_CORPSE_DESPAWN,0); BeamerhelpGUID[beamerID] = uBeamerHelp->GetGUID(); uBeamerHelp->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686); uBeamerHelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); uBeamerHelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } } uLastCandidate = uCandidate; } uBeamerHelp = Unit::GetUnit(*m_creature, BeamerhelpGUID[beamerID]); if(uBeamer) uBeamer->CastSpell(m_creature,spell_creature,true); if(uBeamerHelp) uBeamerHelp->CastSpell(uCandidate,spell_beam,true); } else { if(uCandidate != uLastCandidate) { if(uBeamer) { uBeamer->DealDamage(uBeamerHelp, uBeamerHelp->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); if(uBeamerHelp) { BeamerhelpGUID[beamerID] = 0; uBeamerHelp = NULL; uBeamerHelp = uBeamer->SummonCreature(creature_portal,RandomedCoords[beamerID][0],RandomedCoords[beamerID][1],RandomedCoords[beamerID][2],0,TEMPSUMMON_CORPSE_DESPAWN,0); BeamerhelpGUID[beamerID] = uBeamerHelp->GetGUID(); uBeamerHelp->SetUInt32Value(UNIT_FIELD_DISPLAYID, 11686); uBeamerHelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); uBeamerHelp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); } } uLastCandidate = uCandidate; ExhaustHandler(uCandidate,beamerID); } uBeamerHelp = Unit::GetUnit(*m_creature, BeamerhelpGUID[beamerID]); if(uBeamer) uBeamer->CastSpell(uCandidate,spell_plr,true); if(uBeamerHelp) uBeamerHelp->CastSpell(uCandidate,spell_beam,true); } LastCandidatesGUID[beamerID] = uLastCandidate->GetGUID(); CandidatesGUID[beamerID] = uCandidate->GetGUID(); return true; }
void UpdateAI(const uint32 diff) { if (!m_creature->SelectHostileTarget() || !m_creature->getVictim()) return; if (!DrainingCrystal) { uint32 maxPowerMana = m_creature->GetMaxPower(POWER_MANA); if (maxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / maxPowerMana) < 10)) { if (DrainLifeTimer < diff) { DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DRAIN_LIFE); DrainLifeTimer = 10000; }else DrainLifeTimer -= diff; // Heroic only if (!m_bIsRegularMode) { if (DrainManaTimer < diff) { DoCast(SelectUnit(SELECT_TARGET_RANDOM, 1), SPELL_DRAIN_MANA); DrainManaTimer = 10000; }else DrainManaTimer -= diff; } } if (FelExplosionTimer < diff) { if (!m_creature->IsNonMeleeSpellCasted(false)) { DoCast(m_creature, SPELL_FEL_EXPLOSION); FelExplosionTimer = 2000; } }else FelExplosionTimer -= diff; // If below 10% mana, start recharging maxPowerMana = m_creature->GetMaxPower(POWER_MANA); if (maxPowerMana && ((m_creature->GetPower(POWER_MANA)*100 / maxPowerMana) < 10)) { if (DrainCrystalTimer < diff) { SelectNearestCrystal(); if (m_bIsRegularMode) DrainCrystalTimer = urand(20000, 25000); else DrainCrystalTimer = urand(10000, 15000); }else DrainCrystalTimer -= diff; } }else { if (IsDraining) { if (EmpowerTimer < diff) { IsDraining = false; DrainingCrystal = false; DoScriptText(SAY_EMPOWERED, m_creature); Unit* CrystalChosen = Unit::GetUnit(*m_creature, CrystalGUID); if (CrystalChosen && CrystalChosen->isAlive()) // Use Deal Damage to kill it, not setDeathState. CrystalChosen->DealDamage(CrystalChosen, CrystalChosen->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); CrystalGUID = 0; m_creature->GetMotionMaster()->Clear(); m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); }else EmpowerTimer -= diff; } } DoMeleeAttackIfReady(); // No need to check if we are draining crystal here, as the spell has a stun. }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (!DrainingCrystal) { uint32 maxPowerMana = me->GetMaxPower(POWER_MANA); if (maxPowerMana && ((me->GetPower(POWER_MANA)*100 / maxPowerMana) < 10)) { if (DrainLifeTimer <= diff) { DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DRAIN_LIFE); DrainLifeTimer = 10000; } else DrainLifeTimer -= diff; // Heroic only if (Heroic) { if (DrainManaTimer <= diff) { DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_DRAIN_MANA); DrainManaTimer = 10000; } else DrainManaTimer -= diff; } } if (FelExplosionTimer <= diff) { if (!me->IsNonMeleeSpellCasted(false)) { DoCast(me, SPELL_FEL_EXPLOSION); FelExplosionTimer = 2000; } } else FelExplosionTimer -= diff; // If below 10% mana, start recharging maxPowerMana = me->GetMaxPower(POWER_MANA); if (maxPowerMana && ((me->GetPower(POWER_MANA)*100 / maxPowerMana) < 10)) { if (DrainCrystalTimer <= diff) { SelectNearestCrystal(); if (Heroic) DrainCrystalTimer = 10000 + rand()%5000; else DrainCrystalTimer = 20000 + rand()%5000; } else DrainCrystalTimer -= diff; } } else { if (IsDraining) { if (CheckTimer <= diff) { Unit* CrystalChosen = Unit::GetUnit(*me, CrystalGUID); if (CrystalChosen) { if (CrystalChosen->GetUInt32Value(UNIT_CHANNEL_SPELL) == SPELL_MANA_RAGE) { me->StopMoving(); } else{ IsDraining = false; DrainingCrystal = false; DoScriptText(SAY_EMPOWERED, me); Unit* CrystalChosen = Unit::GetUnit(*me, CrystalGUID); if (CrystalChosen && CrystalChosen->isAlive()) // Use Deal Damage to kill it, not setDeathState. CrystalChosen->DealDamage(CrystalChosen, CrystalChosen->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); CrystalGUID = 0; me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(me->getVictim()); } } CheckTimer = 1000; } else CheckTimer -= diff; } } DoMeleeAttackIfReady(); // No need to check if we are draining crystal here, as the spell has a stun. }