Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*####
- ## Quest 12713: Betrayal
- ## npc_overlord_drakuru_enemy
- ## npc_lich_king_betrayal_quest
- ####*/
- enum QuestBetrayal
- {
- NPC_ENEMY_DRAKURU = 28998,
- NPC_BLIGHTBLOOD_TROLL = 28931,
- NPC_LICH_KING = 1010656,
- NPC_TOTALLY_GENERIC_BUNNY = 28960,
- NPC_DRAKURUS_SKULL_TRIGGER = 1010657,
- GO_DRAKURUS_LAST_WISH = 202357,
- GO_DRAKURUS_SKULL = 191458,
- SPELL_DRAKURU_SHADOW_BOLT = 54113,
- SPELL_THROW_BLIGHT_CRYSTAL = 54087,
- SPELL_DRAKURUS_DEATH = 54248,
- // SPELL_SPAWN_DRAKURUS_SKULL = 54253,
- // SPELL_SCOURGE_DISGUISE = 51966
- EVENT_TALK_1 = 1,
- EVENT_TALK_2 = 2,
- EVENT_SPAWN_TROLLS = 3,
- EVENT_FAIL_DISGUISE_WARNING = 4,
- EVENT_FAIL_DISGUISE = 5,
- EVENT_TALK_3 = 6,
- EVENT_TALK_4 = 7,
- // EVENT_TALK_5 = 8,
- EVENT_TALK_6 = 9,
- EVENT_TALK_7 = 10,
- EVENT_CAST_SPELL = 11,
- EVENT_LICHKING_WALK = 12,
- EVENT_LICHKING_TALK_1 = 13,
- EVENT_LICHKING_TALK_2 = 14,
- EVENT_LICHKING_KILL_DRAKURU = 15,
- EVENT_LICHKING_TALK_3 = 16,
- EVENT_LICHKING_TALK_4 = 17,
- EVENT_LICHKING_TALK_5 = 18,
- EVENT_LICHKING_TALK_6 = 19,
- SAY_FAIL_DISGUISE_WARNING = 0,
- DRAKURU_SAY_1 = 1,
- DRAKURU_SAY_2 = 2,
- DRAKURU_SAY_3 = 3,
- DRAKURU_SAY_4 = 4,
- DRAKURU_SAY_5 = 5,
- DRAKURU_SAY_6 = 6,
- DRAKURU_SAY_7 = 7,
- LICHKING_SAY_1 = 0,
- LICHKING_SAY_2 = 1,
- LICHKING_SAY_3 = 2,
- LICHKING_SAY_4 = 3,
- LICHKING_SAY_5 = 4,
- LICHKING_SAY_6 = 5
- };
- Position BlightbloodTrollSpawnPos[] =
- {
- {6222.93f, -2026.46f, 586.76f, 2.938f},
- {6166.21f, -2065.61f, 586.76f, 1.367f},
- {6127.46f, -2008.76f, 586.76f, 6.126f},
- {6184.25f, -1969.81f, 586.76f, 4.579f},
- };
- class npc_overlord_drakuru_enemy : public CreatureScript
- {
- public:
- npc_overlord_drakuru_enemy() : CreatureScript("npc_overlord_drakuru_enemy") { }
- struct npc_overlord_drakuru_enemyAI : public ScriptedAI
- {
- npc_overlord_drakuru_enemyAI(Creature* creature) : ScriptedAI(creature) { }
- EventMap events;
- void InitializeAI()
- {
- // there should only be one enemy Drakuru at a time
- std::list<Creature*> creaturelist;
- me->GetCreatureListWithEntryInGrid(creaturelist, NPC_ENEMY_DRAKURU, 1000.0f);
- if (creaturelist.size() > 1)
- {
- me->DespawnOrUnsummon(0);
- return;
- }
- // despawn eventually existing skull and last wish when starting a new event
- if (Creature* trigger = me->FindNearestCreature(NPC_DRAKURUS_SKULL_TRIGGER, 1000.0f))
- {
- trigger->DespawnOrUnsummon();
- }
- if (GameObject* skull = me->FindNearestGameObject(GO_DRAKURUS_SKULL, 1000.0f))
- {
- skull->Delete();
- }
- if (GameObject* wish = me->FindNearestGameObject(GO_DRAKURUS_LAST_WISH, 1000.0f))
- {
- wish->Delete();
- }
- events.ScheduleEvent(EVENT_TALK_1, 10000);
- }
- void UpdateAI(uint32 diff)
- {
- events.Update(diff);
- switch (events.ExecuteEvent())
- {
- case EVENT_TALK_1:
- Talk(DRAKURU_SAY_1);
- events.ScheduleEvent(EVENT_TALK_2, 10000);
- events.ScheduleEvent(EVENT_SPAWN_TROLLS, 3000);
- break;
- case EVENT_TALK_2:
- Talk(DRAKURU_SAY_2);
- events.ScheduleEvent(EVENT_FAIL_DISGUISE_WARNING, 7000);
- break;
- case EVENT_TALK_3:
- Talk(DRAKURU_SAY_3);
- break;
- case EVENT_SPAWN_TROLLS:
- SpawnTrolls();
- break;
- case EVENT_FAIL_DISGUISE_WARNING:
- HandleDisguise(false);
- events.ScheduleEvent(EVENT_TALK_3, 1500);
- events.ScheduleEvent(EVENT_FAIL_DISGUISE, 3000);
- break;
- case EVENT_FAIL_DISGUISE:
- HandleDisguise(false);
- if (Player* player = me->FindNearestPlayer(90.0f))
- {
- me->SetInCombatWith(player);
- me->AddThreat(player, 1.0f);
- }
- events.ScheduleEvent(EVENT_CAST_SPELL, urand(3000, 5000));
- events.ScheduleEvent(EVENT_TALK_4, 15000);
- break;
- case EVENT_TALK_4:
- Talk(DRAKURU_SAY_4);
- events.RescheduleEvent(EVENT_TALK_4, 15000);
- break;
- case EVENT_TALK_6:
- Talk(DRAKURU_SAY_6);
- me->SummonCreature(NPC_LICH_KING, 6169.84f, -2035.72f, 590.88f, 1.25f);
- events.ScheduleEvent(EVENT_TALK_7, 5000);
- break;
- case EVENT_TALK_7:
- Talk(DRAKURU_SAY_7);
- break;
- case EVENT_CAST_SPELL:
- if (Unit* victim = me->GetVictim())
- {
- if (Player* player = victim->ToPlayer()) // if victim is player: shadow bolt
- {
- DoCast(player, SPELL_DRAKURU_SHADOW_BOLT);
- }
- else // if victim is not player, throw blight crystal to nearby player
- {
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 90, true))
- {
- DoCast(target, SPELL_THROW_BLIGHT_CRYSTAL);
- }
- }
- }
- events.RescheduleEvent(EVENT_CAST_SPELL, urand(5, 15)*IN_MILLISECONDS);
- break;
- }
- if (UpdateVictim())
- {
- DoMeleeAttackIfReady();
- }
- }
- void DamageTaken(Unit* /*who*/, uint32 &damage)
- {
- if (damage >= me->GetHealth())
- {
- damage = 0;
- if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
- {
- Talk(DRAKURU_SAY_5);
- events.ScheduleEvent(EVENT_TALK_6, 5000);
- }
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- events.CancelEvent(EVENT_CAST_SPELL);
- events.CancelEvent(EVENT_TALK_4);
- me->setFaction(35);
- DespawnTrolls();
- }
- }
- void HandleDisguise(bool warning)
- {
- std::list<Player*> players = me->GetNearestPlayersList(100.0f);
- for (std::list<Player*>::const_iterator pitr = players.begin(); pitr != players.end(); ++pitr)
- {
- Player* player = *pitr;
- if (player->GetPositionZ() > 580.0f) // only players on the roof
- {
- if (player->HasAura(SPELL_SCOURGE_DISGUISE))
- {
- if (warning)
- {
- player->RemoveAura(SPELL_SCOURGE_DISGUISE);
- }
- else
- {
- Talk(SAY_FAIL_DISGUISE_WARNING, player->GetGUID());
- }
- }
- }
- }
- }
- void DespawnTrolls()
- {
- std::list<Creature*> creaturelist;
- me->GetCreatureListWithEntryInGrid(creaturelist, NPC_BLIGHTBLOOD_TROLL, 1000.0f);
- for (std::list<Creature*>::const_iterator itr = creaturelist.begin(); itr != creaturelist.end(); ++itr)
- {
- Creature* troll = *itr;
- if (troll->GetPositionZ() > 580.0f)
- {
- troll->DespawnOrUnsummon();
- }
- }
- }
- void SpawnTrolls()
- {
- // first despawn old trolls on the roof
- DespawnTrolls();
- // now spawn new trolls
- for (uint8 i = 0; i < 4; ++i)
- {
- me->SummonCreature(NPC_BLIGHTBLOOD_TROLL, BlightbloodTrollSpawnPos[i]);
- }
- }
- };
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_overlord_drakuru_enemyAI(creature);
- }
- };
- class npc_lich_king_betrayal_quest : public CreatureScript
- {
- public:
- npc_lich_king_betrayal_quest() : CreatureScript("npc_lich_king_betrayal_quest") { }
- struct npc_lich_king_betrayal_questAI : public ScriptedAI
- {
- npc_lich_king_betrayal_questAI(Creature* creature) : ScriptedAI(creature) { }
- EventMap events;
- void Reset()
- {
- events.ScheduleEvent(EVENT_LICHKING_WALK, 3000);
- }
- void UpdateAI(uint32 diff)
- {
- events.Update(diff);
- switch (events.ExecuteEvent())
- {
- case EVENT_LICHKING_WALK:
- if (Creature* drakuru = me->FindNearestCreature(NPC_ENEMY_DRAKURU, 1000.0f))
- {
- me->GetMotionMaster()->MoveFollow(drakuru, 5.0f, me->GetAngle(drakuru->GetPositionX(), drakuru->GetPositionY()));
- }
- events.ScheduleEvent(EVENT_LICHKING_TALK_1, 10000);
- break;
- case EVENT_LICHKING_TALK_1:
- Talk(LICHKING_SAY_1);
- events.ScheduleEvent(EVENT_LICHKING_TALK_2, 5000);
- break;
- case EVENT_LICHKING_TALK_2:
- Talk(LICHKING_SAY_2);
- events.ScheduleEvent(EVENT_LICHKING_KILL_DRAKURU, 8000);
- break;
- case EVENT_LICHKING_KILL_DRAKURU:
- if (Creature* drakuru = me->FindNearestCreature(NPC_ENEMY_DRAKURU, 1000.0f))
- {
- drakuru->CastSpell(drakuru, SPELL_DRAKURUS_DEATH);
- //drakuru->CastSpell(drakuru, SPELL_SPAWN_DRAKURUS_SKULL);
- if (Creature* bunny = me->FindNearestCreature(NPC_TOTALLY_GENERIC_BUNNY, 200.0f))
- {
- // the GO must be spawned by a permanent trigger NPC, because it will despawn when the summoner despawns
- bunny->SummonGameObject(GO_DRAKURUS_LAST_WISH, drakuru->GetPositionX(), drakuru->GetPositionY(), drakuru->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 180000);
- bunny->SummonCreature(NPC_DRAKURUS_SKULL_TRIGGER, drakuru->GetPositionX(), drakuru->GetPositionY(), drakuru->GetPositionZ(), 0.0f, TEMPSUMMON_TIMED_DESPAWN, 190000);
- }
- me->Kill(drakuru);
- }
- events.ScheduleEvent(EVENT_LICHKING_TALK_3, 4000);
- break;
- case EVENT_LICHKING_TALK_3:
- Talk(LICHKING_SAY_3);
- events.ScheduleEvent(EVENT_LICHKING_TALK_4, 5000);
- break;
- case EVENT_LICHKING_TALK_4:
- Talk(LICHKING_SAY_4);
- events.ScheduleEvent(EVENT_LICHKING_TALK_5, 12000);
- break;
- case EVENT_LICHKING_TALK_5:
- Talk(LICHKING_SAY_5);
- events.ScheduleEvent(EVENT_LICHKING_TALK_6, 5000);
- break;
- case EVENT_LICHKING_TALK_6:
- Talk(LICHKING_SAY_6);
- me->DespawnOrUnsummon(10000);
- break;
- }
- }
- };
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_lich_king_betrayal_questAI(creature);
- }
- };
- class npc_drakurus_skull_trigger : public CreatureScript
- {
- public:
- npc_drakurus_skull_trigger() : CreatureScript("npc_drakurus_skull_trigger") { }
- struct npc_drakurus_skull_triggerAI : public ScriptedAI
- {
- npc_drakurus_skull_triggerAI(Creature* creature) : ScriptedAI(creature) { }
- uint32 time;
- bool done;
- void Reset()
- {
- time = 0;
- done = false;
- }
- void UpdateAI(uint32 diff)
- {
- time += diff;
- if (time < 180000)
- {
- if (!done)
- {
- if (!me->FindNearestGameObject(GO_DRAKURUS_SKULL, 100.0f))
- {
- me->SummonGameObject(GO_DRAKURUS_SKULL, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 180000);
- done = true;
- }
- }
- }
- else
- {
- if (GameObject* skull = me->FindNearestGameObject(GO_DRAKURUS_SKULL, 100.0f))
- {
- skull->Delete();
- done = false;
- }
- me->DespawnOrUnsummon();
- }
- }
- };
- CreatureAI* GetAI(Creature* creature) const
- {
- return new npc_drakurus_skull_triggerAI(creature);
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement