Scripts/The Old Kingdom: Properly fixed achievement Respect Your Elders and small cleanup

This commit is contained in:
Lopin
2011-06-23 10:18:53 +02:00
parent f7b0e58a14
commit 9a5279079a
2 changed files with 216 additions and 170 deletions
@@ -0,0 +1,6 @@
DELETE FROM `disables` WHERE `entry`=7317 AND `sourceType`=4;
DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=7317 AND `type`=11;
INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`)
VALUES
(7317,11,0,0,'achievement_respect_your_elders');
@@ -18,13 +18,6 @@
#include "ScriptPCH.h" #include "ScriptPCH.h"
#include "ahnkahet.h" #include "ahnkahet.h"
bool DeadAhnkaharGuardian; // needed for achievement: Respect Your Elders(2038)
enum Achievements
{
ACHIEV_RESPECT_YOUR_ELDERS = 2038
};
//not in db //not in db
enum Yells enum Yells
{ {
@@ -53,18 +46,21 @@ enum Creatures
MOB_AHNKAHAR_GUARDIAN_ENTRY = 30176 MOB_AHNKAHAR_GUARDIAN_ENTRY = 30176
}; };
#define ACTION_AHNKAHAR_GUARDIAN_DEAD 1
#define DATA_RESPECT_YOUR_ELDERS 2
#define EMOTE_HATCHES "An Ahn'kahar Guardian hatches!" #define EMOTE_HATCHES "An Ahn'kahar Guardian hatches!"
class boss_elder_nadox : public CreatureScript class boss_elder_nadox : public CreatureScript
{ {
public: public:
boss_elder_nadox() : CreatureScript("boss_elder_nadox") { } boss_elder_nadox() : CreatureScript("boss_elder_nadox") { }
struct boss_elder_nadoxAI : public ScriptedAI struct boss_elder_nadoxAI : public ScriptedAI
{ {
boss_elder_nadoxAI(Creature *c) : ScriptedAI(c) boss_elder_nadoxAI(Creature* creature) : ScriptedAI(creature)
{ {
pInstance = c->GetInstanceScript(); instance = me->GetInstanceScript();
} }
uint32 uiPlagueTimer; uint32 uiPlagueTimer;
@@ -72,55 +68,72 @@ public:
uint32 uiSwarmerSpawnTimer; uint32 uiSwarmerSpawnTimer;
uint32 uiGuardSpawnTimer; uint32 uiGuardSpawnTimer;
uint32 uiEnragueTimer; uint32 uiEnrageTimer;
bool bGuardSpawned; bool bGuardSpawned;
bool respectYourElders;
InstanceScript *pInstance; InstanceScript* instance;
void Reset() void Reset()
{ {
uiPlagueTimer = 13*IN_MILLISECONDS; uiPlagueTimer = 13000;
uiRagueTimer = 20*IN_MILLISECONDS; uiRagueTimer = 20000;
uiSwarmerSpawnTimer = 10*IN_MILLISECONDS; uiSwarmerSpawnTimer = 10000;
uiGuardSpawnTimer = 25*IN_MILLISECONDS; uiGuardSpawnTimer = 25000;
uiEnragueTimer = 5*IN_MILLISECONDS; uiEnrageTimer = 5000;
DeadAhnkaharGuardian = false;
bGuardSpawned = false; bGuardSpawned = false;
respectYourElders = true;
if (pInstance) if (instance)
pInstance->SetData(DATA_ELDER_NADOX_EVENT, NOT_STARTED); instance->SetData(DATA_ELDER_NADOX_EVENT, NOT_STARTED);
} }
void EnterCombat(Unit* /*who*/) void EnterCombat(Unit* /*who*/)
{ {
DoScriptText(SAY_DEATH, me); DoScriptText(SAY_DEATH, me);
if (pInstance) if (instance)
pInstance->SetData(DATA_ELDER_NADOX_EVENT, IN_PROGRESS); instance->SetData(DATA_ELDER_NADOX_EVENT, IN_PROGRESS);
} }
void KilledUnit(Unit* /*victim*/) void KilledUnit(Unit* /*who*/)
{ {
DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2, SAY_SLAY_3), me); DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2, SAY_SLAY_3), me);
} }
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*who*/)
{ {
DoScriptText(SAY_SLAY_3, me); //SAY_SLAY_3 on death? DoScriptText(SAY_SLAY_3, me); //SAY_SLAY_3 on death?
if (pInstance) if (instance)
{ instance->SetData(DATA_ELDER_NADOX_EVENT, DONE);
pInstance->SetData(DATA_ELDER_NADOX_EVENT, DONE);
if (IsHeroic() && !DeadAhnkaharGuardian)
pInstance->DoCompleteAchievement(ACHIEV_RESPECT_YOUR_ELDERS);
}
} }
void UpdateAI(const uint32 diff) void DoAction(int32 const action)
{
if (action == ACTION_AHNKAHAR_GUARDIAN_DEAD)
respectYourElders = false;
}
uint32 GetData(uint32 type)
{
if (type == DATA_RESPECT_YOUR_ELDERS)
return respectYourElders ? 1 : 0;
return 0;
}
void SetData(uint32 id, uint32 data)
{
if (id == DATA_RESPECT_YOUR_ELDERS)
respectYourElders = data ? true : false;
}
void UpdateAI(uint32 const diff)
{ {
if (!UpdateVictim()) if (!UpdateVictim())
return; return;
@@ -128,19 +141,23 @@ public:
if (uiPlagueTimer <= diff) if (uiPlagueTimer <= diff)
{ {
DoCast(me->getVictim(), SPELL_BROOD_PLAGUE); DoCast(me->getVictim(), SPELL_BROOD_PLAGUE);
uiPlagueTimer = 15*IN_MILLISECONDS; uiPlagueTimer = 15000;
} else uiPlagueTimer -= diff; }
else
uiPlagueTimer -= diff;
if (IsHeroic()) if (IsHeroic())
{ {
if (uiRagueTimer <= diff) if (uiRagueTimer <= diff)
{ {
if (Creature *pSwarmer = me->FindNearestCreature(MOB_AHNKAHAR_SWARMER, 35)) if (Creature* Swarmer = me->FindNearestCreature(MOB_AHNKAHAR_SWARMER, 35.0f))
{ {
DoCast(pSwarmer, H_SPELL_BROOD_RAGE, true); DoCast(Swarmer, H_SPELL_BROOD_RAGE, true);
uiRagueTimer = 15*IN_MILLISECONDS; uiRagueTimer = 15000;
} }
} else uiRagueTimer -= diff; }
else
uiRagueTimer -= diff;
} }
if (uiSwarmerSpawnTimer <= diff) if (uiSwarmerSpawnTimer <= diff)
@@ -150,17 +167,21 @@ public:
if (urand(1, 3) == 3) // 33% chance of dialog if (urand(1, 3) == 3) // 33% chance of dialog
DoScriptText(RAND(SAY_EGG_SAC_1, SAY_EGG_SAC_2), me); DoScriptText(RAND(SAY_EGG_SAC_1, SAY_EGG_SAC_2), me);
uiSwarmerSpawnTimer = 10*IN_MILLISECONDS; uiSwarmerSpawnTimer = 10000;
} else uiSwarmerSpawnTimer -= diff; }
else
uiSwarmerSpawnTimer -= diff;
if (!bGuardSpawned && uiGuardSpawnTimer <= diff) if (!bGuardSpawned && uiGuardSpawnTimer <= diff)
{ {
me->MonsterTextEmote(EMOTE_HATCHES, me->GetGUID(), true); me->MonsterTextEmote(EMOTE_HATCHES, me->GetGUID(), true);
DoCast(me, SPELL_SUMMON_SWARM_GUARD); DoCast(me, SPELL_SUMMON_SWARM_GUARD);
bGuardSpawned = true; bGuardSpawned = true;
} else uiGuardSpawnTimer -= diff; }
else
uiGuardSpawnTimer -= diff;
if (uiEnragueTimer <= diff) if (uiEnrageTimer <= diff)
{ {
if (me->HasAura(SPELL_ENRAGE, 0)) if (me->HasAura(SPELL_ENRAGE, 0))
return; return;
@@ -171,14 +192,16 @@ public:
if (!me->IsNonMeleeSpellCasted(false)) if (!me->IsNonMeleeSpellCasted(false))
DoCast(me, SPELL_ENRAGE, true); DoCast(me, SPELL_ENRAGE, true);
uiEnragueTimer = 5*IN_MILLISECONDS; uiEnrageTimer = 5000;
} else uiEnragueTimer -= diff; }
else
uiEnrageTimer -= diff;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
CreatureAI *GetAI(Creature *creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new boss_elder_nadoxAI(creature); return new boss_elder_nadoxAI(creature);
} }
@@ -192,33 +215,36 @@ enum AddSpells
class mob_ahnkahar_nerubian : public CreatureScript class mob_ahnkahar_nerubian : public CreatureScript
{ {
public: public:
mob_ahnkahar_nerubian() : CreatureScript("mob_ahnkahar_nerubian") { } mob_ahnkahar_nerubian() : CreatureScript("mob_ahnkahar_nerubian") { }
struct mob_ahnkahar_nerubianAI : public ScriptedAI struct mob_ahnkahar_nerubianAI : public ScriptedAI
{ {
mob_ahnkahar_nerubianAI(Creature *c) : ScriptedAI(c) mob_ahnkahar_nerubianAI(Creature* creature) : ScriptedAI(creature)
{ {
pInstance = c->GetInstanceScript(); instance = me->GetInstanceScript();
} }
InstanceScript *pInstance; InstanceScript* instance;
uint32 uiSprintTimer; uint32 uiSprintTimer;
void Reset() void Reset()
{ {
if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY) //magic numbers are bad! if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY)
DoCast(me, SPELL_GUARDIAN_AURA, true); DoCast(me, SPELL_GUARDIAN_AURA, true);
uiSprintTimer = 10*IN_MILLISECONDS; uiSprintTimer = 10000;
} }
void JustDied(Unit* /*killer*/) void JustDied(Unit* /*who*/)
{ {
if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY) if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY)
DeadAhnkaharGuardian = true; if (Creature* Nadox = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ELDER_NADOX)))
Nadox->AI()->DoAction(ACTION_AHNKAHAR_GUARDIAN_DEAD);
} }
void EnterCombat(Unit* /*who*/){} void EnterCombat(Unit* /*who*/)
{
}
void UpdateAI(const uint32 diff) void UpdateAI(const uint32 diff)
{ {
@@ -228,28 +254,23 @@ public:
if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY) if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY)
me->RemoveAurasDueToSpell(SPELL_GUARDIAN_AURA); me->RemoveAurasDueToSpell(SPELL_GUARDIAN_AURA);
if (pInstance) if (instance)
{ if (instance->GetData(DATA_ELDER_NADOX_EVENT) != IN_PROGRESS)
if (pInstance->GetData(DATA_ELDER_NADOX_EVENT) != IN_PROGRESS) me->DespawnOrUnsummon();
{
me->DisappearAndDie();
}
}
if (!UpdateVictim())
return;
if (uiSprintTimer <= diff) if (uiSprintTimer <= diff)
{ {
DoCast(me, SPELL_SPRINT); DoCast(me, SPELL_SPRINT);
uiSprintTimer = 25*IN_MILLISECONDS; uiSprintTimer = 25000;
} else uiSprintTimer -= diff; }
else
uiSprintTimer -= diff;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };
CreatureAI *GetAI(Creature *creature) const CreatureAI* GetAI(Creature* creature) const
{ {
return new mob_ahnkahar_nerubianAI(creature); return new mob_ahnkahar_nerubianAI(creature);
} }
@@ -281,9 +302,28 @@ public:
} }
}; };
class achievement_respect_your_elders : public AchievementCriteriaScript
{
public:
achievement_respect_your_elders() : AchievementCriteriaScript("achievement_respect_your_elders")
{
}
bool OnCheck(Player* /*player*/, Unit* target)
{
sLog->outString("OnCheck()");
if (Creature* Nadox = target->ToCreature())
if (Nadox->AI()->GetData(DATA_RESPECT_YOUR_ELDERS))
return true;
return false;
}
};
void AddSC_boss_elder_nadox() void AddSC_boss_elder_nadox()
{ {
new boss_elder_nadox; new boss_elder_nadox;
new mob_ahnkahar_nerubian; new mob_ahnkahar_nerubian;
new mob_nadox_eggs; new mob_nadox_eggs;
new achievement_respect_your_elders();
} }