void SummonNPC(GameObject* go, Player* player, uint32 npc, uint32 spell) { go->CastSpell(player, spell); TempSummon* summons = go->SummonCreature(npc, go->GetPositionX(), go->GetPositionY(), go->GetPositionZ(), player->GetOrientation() - M_PI, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10 * 60 * 1000); summons->CastSpell(summons, SPELL_SPAWN_IN, false); switch (summons->GetEntry()) { case NPC_TEMPLAR_FIRE: case NPC_TEMPLAR_WATER: case NPC_TEMPLAR_AIR: case NPC_TEMPLAR_EARTH: summons->AI()->Talk(SAY_TEMPLAR_AGGRO); break; case NPC_DUKE_FIRE: case NPC_DUKE_WATER: case NPC_DUKE_EARTH: case NPC_DUKE_AIR: summons->AI()->Talk(SAY_DUKE_AGGRO); break; case NPC_ROYAL_FIRE: case NPC_ROYAL_AIR: case NPC_ROYAL_EARTH: case NPC_ROYAL_WATER: summons->AI()->Talk(YELL_ROYAL_AGGRO); break; } summons->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); summons->SendMeleeAttackStart(player); summons->CombatStart(player); }
void ActivateCrystal() { // just to make things easier we'll get the gameobject from the map GameObject* invoker = instance->GetGameObject(uiActivationCrystal[0]); if (!invoker) return; SpellInfo const* spellInfoLightning = sSpellMgr->GetSpellInfo(SPELL_ARCANE_LIGHTNING); if (!spellInfoLightning) return; // the orb TempSummon* trigger = invoker->SummonCreature(NPC_DEFENSE_SYSTEM, ArcaneSphere, TEMPSUMMON_MANUAL_DESPAWN, 0); if (!trigger) return; // visuals trigger->CastSpell(trigger, spellInfoLightning, true, 0, 0, trigger->GetGUID()); // Kill all mobs registered with SetGuidData(ADD_TRASH_MOB) for (GuidSet::const_iterator itr = trashMobs.begin(); itr != trashMobs.end();) { Creature* creature = instance->GetCreature(*itr); // Increment the iterator before killing the creature because the kill will remove itr from trashMobs ++itr; if (creature && creature->IsAlive()) trigger->Kill(creature); } }
void UpdateAI(uint32 diff) { if (wipe_timer <= diff) { if (me->GetInstanceScript() && me->GetInstanceScript()->GetData(TYPE_IS_WIPE)) { me->GetInstanceScript()->SetData(TYPE_IS_WIPE, 1); wipe_timer = 2000; } } else wipe_timer -= diff; if (!UpdateVictim()) return; events.Update(diff); if (me->GetHealthPct() < 70.f && status == PHASE_1) { me->AddAura(SPELL_JADE_ESSENCE, me); events.Reset(); events.ScheduleEvent(EVENT_JADE_SERPENT_STRIKE, 5000); events.ScheduleEvent(EVENT_JADE_SERPENT_KICK, 10000); Talk(TALK_EVENT_01); status = PHASE_2; } if (me->GetHealthPct() < 30.f && status == PHASE_2) { events.Reset(); events.ScheduleEvent(EVENT_SUMMON_YULON, 500); Talk(TALK_EVENT_02); status = PHASE_3; } while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_SERPENT_STRIKE: { me->CastSpell(me->GetVictim(), SPELL_SERPENT_STRIKE, false); Map::PlayerList const& PlayerList = me->GetInstanceScript()->instance->GetPlayers(); if (!PlayerList.isEmpty()) { for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { Player* plr = i->GetSource(); if (!plr) continue; if (plr->GetDistance2d(me) < 10.f) plr->KnockbackFrom(me->GetPositionX(), me->GetPositionY(), 10, 10); } } events.ScheduleEvent(EVENT_SERPENT_STRIKE, 10000); events.ScheduleEvent(EVENT_SERPENT_WAVE, 4000); } break; case EVENT_SERPENT_KICK: me->CastSpell(me->GetVictim(), SPELL_SERPENT_KICK, false); events.ScheduleEvent(EVENT_SERPENT_KICK, 10000); break; case EVENT_SERPENT_WAVE: { TempSummon* sum = nullptr; sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 932.775f, -2548.743f, 179.821f, 1.254f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 939.796f, -2530.586f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 940.014f, -2564.114f, 179.821f, 5.978f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 957.711f, -2570.030f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 925.971f, -2572.423f, 179.821f, 4.395f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 919.606f, -2591.245f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 918.923f, -2557.356f, 179.821f, 2.821f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 901.839f, -2551.843f, 179.941f); sum->DespawnOrUnsummon(3200); } } break; case EVENT_JADE_SERPENT_STRIKE: { me->CastSpell(me->GetVictim(), SPELL_JADE_SERPENT_STRIKE, false); Map::PlayerList const& PlayerList = me->GetInstanceScript()->instance->GetPlayers(); if (!PlayerList.isEmpty()) { for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) { Player* plr = i->GetSource(); if (!plr) continue; if (plr->GetDistance2d(me) < 10.f) plr->KnockbackFrom(me->GetPositionX(), me->GetPositionY(), 10, 10); } } events.ScheduleEvent(EVENT_JADE_SERPENT_STRIKE, 10000); events.ScheduleEvent(EVENT_JADE_SERPENT_WAVE, 4000); } break; case EVENT_JADE_SERPENT_KICK: me->CastSpell(me->GetVictim(), SPELL_JADE_SERPENT_KICK, false); events.ScheduleEvent(EVENT_JADE_SERPENT_KICK, 10000); break; case EVENT_JADE_SERPENT_WAVE: { TempSummon* sum = nullptr; sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 932.775f, -2548.743f, 179.821f, 1.254f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_JADE_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 939.796f, -2530.586f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 940.014f, -2564.114f, 179.821f, 5.978f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_JADE_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 957.711f, -2570.030f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 925.971f, -2572.423f, 179.821f, 4.395f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_JADE_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 919.606f, -2591.245f, 179.941f); sum->DespawnOrUnsummon(3200); } sum = me->SummonCreature(CREATURE_TRIGGER_WAVE, 918.923f, -2557.356f, 179.821f, 2.821f); if (sum) { sum->SetDisplayId(11686); sum->CastSpell(sum, SPELL_JADE_SERPENT_WAVE_VISUAL, false); sum->CastSpell(sum, SPELL_SERPENT_WAVE_PERIODIC, false); sum->GetMotionMaster()->MovePoint(0, 901.839f, -2551.843f, 179.941f); sum->DespawnOrUnsummon(3200); } } break; case EVENT_SUMMON_YULON: me->CastSpell(me, SPELL_SUMMON_JADE_SERPENT, false); me->CastSpell(me, SPELL_JADE_SOUL, false); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->ApplySpellImmune(SPELL_JADE_SOUL, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, true); me->ApplySpellImmune(SPELL_JADE_SOUL, IMMUNITY_DAMAGE, SPELL_SCHOOL_MASK_MAGIC, true); me->SetReactState(REACT_PASSIVE); me->AddUnitState(UNIT_STATE_ROOT); events.ScheduleEvent(EVENT_AURA_JADE, 3000); break; case EVENT_AURA_JADE: me->CastSpell(me, SPELL_JADE_SOUL, false); events.ScheduleEvent(EVENT_AURA_JADE, 2500); break; } } DoMeleeAttackIfReady(); }