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,135 +46,165 @@ 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)
{ {
pInstance = c->GetInstanceScript(); boss_elder_nadoxAI(Creature* creature) : ScriptedAI(creature)
}
uint32 uiPlagueTimer;
uint32 uiRagueTimer;
uint32 uiSwarmerSpawnTimer;
uint32 uiGuardSpawnTimer;
uint32 uiEnragueTimer;
bool bGuardSpawned;
InstanceScript *pInstance;
void Reset()
{
uiPlagueTimer = 13*IN_MILLISECONDS;
uiRagueTimer = 20*IN_MILLISECONDS;
uiSwarmerSpawnTimer = 10*IN_MILLISECONDS;
uiGuardSpawnTimer = 25*IN_MILLISECONDS;
uiEnragueTimer = 5*IN_MILLISECONDS;
DeadAhnkaharGuardian = false;
bGuardSpawned = false;
if (pInstance)
pInstance->SetData(DATA_ELDER_NADOX_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_DEATH, me);
if (pInstance)
pInstance->SetData(DATA_ELDER_NADOX_EVENT, IN_PROGRESS);
}
void KilledUnit(Unit* /*victim*/)
{
DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2, SAY_SLAY_3), me);
}
void JustDied(Unit* /*killer*/)
{
DoScriptText(SAY_SLAY_3, me); //SAY_SLAY_3 on death?
if (pInstance)
{ {
pInstance->SetData(DATA_ELDER_NADOX_EVENT, DONE); instance = me->GetInstanceScript();
if (IsHeroic() && !DeadAhnkaharGuardian)
pInstance->DoCompleteAchievement(ACHIEV_RESPECT_YOUR_ELDERS);
}
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (uiPlagueTimer <= diff)
{
DoCast(me->getVictim(), SPELL_BROOD_PLAGUE);
uiPlagueTimer = 15*IN_MILLISECONDS;
} else uiPlagueTimer -= diff;
if (IsHeroic())
{
if (uiRagueTimer <= diff)
{
if (Creature *pSwarmer = me->FindNearestCreature(MOB_AHNKAHAR_SWARMER, 35))
{
DoCast(pSwarmer, H_SPELL_BROOD_RAGE, true);
uiRagueTimer = 15*IN_MILLISECONDS;
}
} else uiRagueTimer -= diff;
} }
if (uiSwarmerSpawnTimer <= diff) uint32 uiPlagueTimer;
{ uint32 uiRagueTimer;
DoCast(me, SPELL_SUMMON_SWARMERS, true);
DoCast(me, SPELL_SUMMON_SWARMERS);
if (urand(1, 3) == 3) // 33% chance of dialog
DoScriptText(RAND(SAY_EGG_SAC_1, SAY_EGG_SAC_2), me);
uiSwarmerSpawnTimer = 10*IN_MILLISECONDS; uint32 uiSwarmerSpawnTimer;
} else uiSwarmerSpawnTimer -= diff; uint32 uiGuardSpawnTimer;
uint32 uiEnrageTimer;
if (!bGuardSpawned && uiGuardSpawnTimer <= diff) bool bGuardSpawned;
{ bool respectYourElders;
me->MonsterTextEmote(EMOTE_HATCHES, me->GetGUID(), true);
DoCast(me, SPELL_SUMMON_SWARM_GUARD);
bGuardSpawned = true;
} else uiGuardSpawnTimer -= diff;
if (uiEnragueTimer <= diff) InstanceScript* instance;
void Reset()
{ {
if (me->HasAura(SPELL_ENRAGE, 0)) uiPlagueTimer = 13000;
uiRagueTimer = 20000;
uiSwarmerSpawnTimer = 10000;
uiGuardSpawnTimer = 25000;
uiEnrageTimer = 5000;
bGuardSpawned = false;
respectYourElders = true;
if (instance)
instance->SetData(DATA_ELDER_NADOX_EVENT, NOT_STARTED);
}
void EnterCombat(Unit* /*who*/)
{
DoScriptText(SAY_DEATH, me);
if (instance)
instance->SetData(DATA_ELDER_NADOX_EVENT, IN_PROGRESS);
}
void KilledUnit(Unit* /*who*/)
{
DoScriptText(RAND(SAY_SLAY_1, SAY_SLAY_2, SAY_SLAY_3), me);
}
void JustDied(Unit* /*who*/)
{
DoScriptText(SAY_SLAY_3, me); //SAY_SLAY_3 on death?
if (instance)
instance->SetData(DATA_ELDER_NADOX_EVENT, DONE);
}
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())
return; return;
float x, y, z, o; if (uiPlagueTimer <= diff)
me->GetHomePosition(x, y, z, o); {
if (z < 24) DoCast(me->getVictim(), SPELL_BROOD_PLAGUE);
if (!me->IsNonMeleeSpellCasted(false)) uiPlagueTimer = 15000;
DoCast(me, SPELL_ENRAGE, true); }
else
uiPlagueTimer -= diff;
uiEnragueTimer = 5*IN_MILLISECONDS; if (IsHeroic())
} else uiEnragueTimer -= diff; {
if (uiRagueTimer <= diff)
{
if (Creature* Swarmer = me->FindNearestCreature(MOB_AHNKAHAR_SWARMER, 35.0f))
{
DoCast(Swarmer, H_SPELL_BROOD_RAGE, true);
uiRagueTimer = 15000;
}
}
else
uiRagueTimer -= diff;
}
DoMeleeAttackIfReady(); if (uiSwarmerSpawnTimer <= diff)
{
DoCast(me, SPELL_SUMMON_SWARMERS, true);
DoCast(me, SPELL_SUMMON_SWARMERS);
if (urand(1, 3) == 3) // 33% chance of dialog
DoScriptText(RAND(SAY_EGG_SAC_1, SAY_EGG_SAC_2), me);
uiSwarmerSpawnTimer = 10000;
}
else
uiSwarmerSpawnTimer -= diff;
if (!bGuardSpawned && uiGuardSpawnTimer <= diff)
{
me->MonsterTextEmote(EMOTE_HATCHES, me->GetGUID(), true);
DoCast(me, SPELL_SUMMON_SWARM_GUARD);
bGuardSpawned = true;
}
else
uiGuardSpawnTimer -= diff;
if (uiEnrageTimer <= diff)
{
if (me->HasAura(SPELL_ENRAGE, 0))
return;
float x, y, z, o;
me->GetHomePosition(x, y, z, o);
if (z < 24)
if (!me->IsNonMeleeSpellCasted(false))
DoCast(me, SPELL_ENRAGE, true);
uiEnrageTimer = 5000;
}
else
uiEnrageTimer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_elder_nadoxAI(creature);
} }
};
CreatureAI *GetAI(Creature *creature) const
{
return new boss_elder_nadoxAI(creature);
}
}; };
enum AddSpells enum AddSpells
@@ -192,67 +215,65 @@ 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)
{ {
pInstance = c->GetInstanceScript(); mob_ahnkahar_nerubianAI(Creature* creature) : ScriptedAI(creature)
}
InstanceScript *pInstance;
uint32 uiSprintTimer;
void Reset()
{
if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY) //magic numbers are bad!
DoCast(me, SPELL_GUARDIAN_AURA, true);
uiSprintTimer = 10*IN_MILLISECONDS;
}
void JustDied(Unit* /*killer*/)
{
if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY)
DeadAhnkaharGuardian = true;
}
void EnterCombat(Unit* /*who*/){}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY)
me->RemoveAurasDueToSpell(SPELL_GUARDIAN_AURA);
if (pInstance)
{ {
if (pInstance->GetData(DATA_ELDER_NADOX_EVENT) != IN_PROGRESS) instance = me->GetInstanceScript();
{
me->DisappearAndDie();
}
} }
if (!UpdateVictim()) InstanceScript* instance;
return; uint32 uiSprintTimer;
if (uiSprintTimer <= diff) void Reset()
{ {
DoCast(me, SPELL_SPRINT); if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY)
uiSprintTimer = 25*IN_MILLISECONDS; DoCast(me, SPELL_GUARDIAN_AURA, true);
} else uiSprintTimer -= diff; uiSprintTimer = 10000;
}
DoMeleeAttackIfReady(); void JustDied(Unit* /*who*/)
{
if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY)
if (Creature* Nadox = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_ELDER_NADOX)))
Nadox->AI()->DoAction(ACTION_AHNKAHAR_GUARDIAN_DEAD);
}
void EnterCombat(Unit* /*who*/)
{
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (me->GetEntry() == MOB_AHNKAHAR_GUARDIAN_ENTRY)
me->RemoveAurasDueToSpell(SPELL_GUARDIAN_AURA);
if (instance)
if (instance->GetData(DATA_ELDER_NADOX_EVENT) != IN_PROGRESS)
me->DespawnOrUnsummon();
if (uiSprintTimer <= diff)
{
DoCast(me, SPELL_SPRINT);
uiSprintTimer = 25000;
}
else
uiSprintTimer -= diff;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new mob_ahnkahar_nerubianAI(creature);
} }
};
CreatureAI *GetAI(Creature *creature) const
{
return new mob_ahnkahar_nerubianAI(creature);
}
}; };
//HACK: No, AI. Replace with proper db content? //HACK: No, AI. Replace with proper db content?
@@ -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();
} }