aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp107
1 files changed, 93 insertions, 14 deletions
diff --git a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
index 6257bd28f5d..529458ab9cf 100644
--- a/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
+++ b/src/server/scripts/EasternKingdoms/zone_eversong_woods.cpp
@@ -18,8 +18,8 @@
/* ScriptData
SDName: Eversong_Woods
-SD%Complete: 100
-SDComment: Quest support: 8488, 8490
+SD%Complete: 95
+SDComment: Quest support: 8487, 8488, 8490
SDCategory: Eversong Woods
EndScriptData */
@@ -37,11 +37,29 @@ EndContentData */
enum UnexpectedResults
{
// Quest
+ QUEST_CORRUPTED_SOIL = 8487,
QUEST_UNEXPECTED_RESULT = 8488,
// Creatures
- NPC_GHARZUL = 15958,
- NPC_ANGERSHADE = 15656
+ NPC_GHARZUL = 15958, // Quest 8488
+ NPC_ANGERSHADE = 15656, // Quest 8488
+
+ // Factions
+ FACTION_NORMAL = 1604, // Quest 8488
+ FACTION_COMBAT = 232, // Quest 8488
+
+ // Spells
+ SPELL_TEST_SOIL = 29535, // Quest 8487
+ SPELL_FIREBALL = 20811, // Quest 8488
+
+ // Text
+ SAY_TEST_SOIL = 0, // Quest 8487
+
+ // Events
+ EVENT_TALK = 1, // Quest 8487
+ EVENT_ADD_QUEST_GIVER_FLAG = 2, // Quest 8487
+ EVENT_SUMMON = 3, // Quest 8488
+ EVENT_FIREBALL = 4 // Quest 8488
};
class npc_apprentice_mirveda : public CreatureScript
@@ -49,10 +67,25 @@ class npc_apprentice_mirveda : public CreatureScript
public:
npc_apprentice_mirveda() : CreatureScript("npc_apprentice_mirveda") { }
+ bool OnQuestReward(Player* player, Creature* creature, const Quest *_Quest, uint32 /*slot*/) OVERRIDE
+ {
+ if (_Quest->GetQuestId() == QUEST_CORRUPTED_SOIL)
+ {
+ CAST_AI(npc_apprentice_mirveda::npc_apprentice_mirvedaAI, creature->AI())->me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
+ CAST_AI(npc_apprentice_mirveda::npc_apprentice_mirvedaAI, creature->AI())->events.ScheduleEvent(EVENT_TALK, 2000);
+ CAST_AI(npc_apprentice_mirveda::npc_apprentice_mirvedaAI, creature->AI())->CorruptedSoil = true;
+ }
+ return true;
+ }
+
bool OnQuestAccept(Player* player, Creature* creature, Quest const* quest) OVERRIDE
{
if (quest->GetQuestId() == QUEST_UNEXPECTED_RESULT)
{
+ CAST_AI(npc_apprentice_mirveda::npc_apprentice_mirvedaAI, creature->AI())->me->setFaction(FACTION_COMBAT);
+ CAST_AI(npc_apprentice_mirveda::npc_apprentice_mirvedaAI, creature->AI())->me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
+
+ CAST_AI(npc_apprentice_mirveda::npc_apprentice_mirvedaAI, creature->AI())->events.ScheduleEvent(EVENT_SUMMON, 1000);
CAST_AI(npc_apprentice_mirveda::npc_apprentice_mirvedaAI, creature->AI())->Summon = true;
CAST_AI(npc_apprentice_mirveda::npc_apprentice_mirvedaAI, creature->AI())->PlayerGUID = player->GetGUID();
}
@@ -70,26 +103,35 @@ public:
uint32 KillCount;
uint64 PlayerGUID;
+ bool CorruptedSoil;
bool Summon;
SummonList Summons;
+ EventMap events;
void Reset() OVERRIDE
{
+ SetCombatMovement(false);
KillCount = 0;
PlayerGUID = 0;
Summons.DespawnAll();
+ CorruptedSoil = false;
Summon = false;
}
- void EnterCombat(Unit* /*who*/) OVERRIDE { }
+ void EnterCombat(Unit* /*who*/) OVERRIDE
+ {
+ events.ScheduleEvent(EVENT_FIREBALL, 1000);
+ }
void JustSummoned(Creature* summoned) OVERRIDE
{
- summoned->AI()->AttackStart(me);
+ // This is the best I can do because AttackStart does nothing
+ summoned->GetMotionMaster()->MovePoint(1, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ());
+ // summoned->AI()->AttackStart(me);
Summons.Summon(summoned);
}
- void SummonedCreatureDespawn(Creature* summoned) OVERRIDE
+ void SummonedCreatureDies(Creature* summoned, Unit* who) OVERRIDE
{
Summons.Despawn(summoned);
++KillCount;
@@ -97,24 +139,61 @@ public:
void JustDied(Unit* /*killer*/) OVERRIDE
{
+ me->setFaction(FACTION_NORMAL);
+
if (PlayerGUID)
if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID))
player->FailQuest(QUEST_UNEXPECTED_RESULT);
}
- void UpdateAI(uint32 /*diff*/) OVERRIDE
+ void UpdateAI(uint32 diff) OVERRIDE
{
if (KillCount >= 3 && PlayerGUID)
if (Player* player = ObjectAccessor::GetPlayer(*me, PlayerGUID))
- player->CompleteQuest(QUEST_UNEXPECTED_RESULT);
+ if (player->GetQuestStatus(QUEST_UNEXPECTED_RESULT) == QUEST_STATUS_INCOMPLETE)
+ {
+ player->CompleteQuest(QUEST_UNEXPECTED_RESULT);
+ me->setFaction(FACTION_NORMAL);
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
+ }
+
+ events.Update(diff);
- if (Summon)
+ while (uint32 eventId = events.ExecuteEvent())
{
- me->SummonCreature(NPC_GHARZUL, 8745, -7134.32f, 35.22f, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
- me->SummonCreature(NPC_ANGERSHADE, 8745, -7134.32f, 35.22f, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
- me->SummonCreature(NPC_ANGERSHADE, 8745, -7134.32f, 35.22f, 0, TEMPSUMMON_CORPSE_DESPAWN, 4000);
- Summon = false;
+ switch (eventId)
+ {
+ case EVENT_TALK:
+ if (!CorruptedSoil)
+ continue;
+ Talk(SAY_TEST_SOIL);
+ events.ScheduleEvent(EVENT_ADD_QUEST_GIVER_FLAG, 7000);
+ break;
+ case EVENT_ADD_QUEST_GIVER_FLAG:
+ if (!CorruptedSoil)
+ continue;
+ me->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER);
+ CorruptedSoil = false;
+ break;
+ case EVENT_SUMMON:
+ if (!Summon)
+ continue;
+ me->SummonCreature(NPC_GHARZUL, 8749.505f, -7132.595f, 35.31983f, 3.816502f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 180000);
+ me->SummonCreature(NPC_ANGERSHADE, 8755.38f, -7131.521f, 35.30957f, 3.816502f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 180000);
+ me->SummonCreature(NPC_ANGERSHADE, 8753.199f, -7125.975f, 35.31986f, 3.816502f, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 180000);
+ Summon = false;
+ break;
+ case EVENT_FIREBALL:
+ if (!UpdateVictim())
+ continue;
+ DoCastVictim(SPELL_FIREBALL, true);
+ events.ScheduleEvent(EVENT_FIREBALL, 3000);
+ break;
+ default:
+ break;
+ }
}
+ DoMeleeAttackIfReady();
}
};
};