Scripts/Nexus: Properly fixed achievement Split Personality

This commit is contained in:
Lopin
2011-06-24 14:41:42 +02:00
parent 9582f596e2
commit 2e1542d738
2 changed files with 61 additions and 24 deletions
@@ -0,0 +1,6 @@
DELETE FROM `disables` WHERE `entry`=7577 AND `sourceType`=4;
DELETE FROM `achievement_criteria_data` WHERE `criteria_id`=7577 AND `type`=11;
INSERT INTO `achievement_criteria_data` (`criteria_id`,`type`,`value1`,`value2`,`ScriptName`)
VALUES
(7577,11,0,0,'achievement_split_personality');
@@ -32,12 +32,14 @@ enum Spells
SPELL_FROST_MAGUS_VISUAL = 47706, SPELL_FROST_MAGUS_VISUAL = 47706,
SPELL_ARCANE_MAGUS_VISUAL = 47704 SPELL_ARCANE_MAGUS_VISUAL = 47704
}; };
enum Creatures enum Creatures
{ {
MOB_FIRE_MAGUS = 26928, MOB_FIRE_MAGUS = 26928,
MOB_FROST_MAGUS = 26930, MOB_FROST_MAGUS = 26930,
MOB_ARCANE_MAGUS = 26929 MOB_ARCANE_MAGUS = 26929
}; };
enum Yells enum Yells
{ {
SAY_AGGRO = -1576000, SAY_AGGRO = -1576000,
@@ -47,11 +49,9 @@ enum Yells
SAY_SPLIT_1 = -1576004, SAY_SPLIT_1 = -1576004,
SAY_SPLIT_2 = -1576005, SAY_SPLIT_2 = -1576005,
}; };
enum Achievements
{ #define ACTION_MAGUS_DEAD 1
ACHIEV_SPLIT_PERSONALITY = 2150, #define DATA_SPLIT_PERSONALITY 2
ACHIEV_TIMER = 5*IN_MILLISECONDS
};
const Position CenterOfRoom = {504.80f, 89.07f, -16.12f, 6.27f}; const Position CenterOfRoom = {504.80f, 89.07f, -16.12f, 6.27f};
@@ -82,17 +82,16 @@ public:
bool bFrostMagusDead; bool bFrostMagusDead;
bool bArcaneMagusDead; bool bArcaneMagusDead;
bool bIsWaitingToAppear; bool bIsWaitingToAppear;
bool bIsAchievementTimerRunning;
uint32 uiIsWaitingToAppearTimer; uint32 uiIsWaitingToAppearTimer;
uint32 uiIceNovaTimer; uint32 uiIceNovaTimer;
uint32 uiFireBombTimer; uint32 uiFireBombTimer;
uint32 uiGravityWellTimer; uint32 uiGravityWellTimer;
uint32 uiCooldown; uint32 uiCooldown;
uint32 uiAchievementTimer;
uint8 Phase; uint8 Phase;
uint8 uiAchievementProgress; uint8 splitPersonality;
time_t time[3];
void Reset() void Reset()
{ {
@@ -107,10 +106,10 @@ public:
uiFrostMagusGUID = 0; uiFrostMagusGUID = 0;
uiArcaneMagusGUID = 0; uiArcaneMagusGUID = 0;
uiAchievementProgress = 0; for (uint8 n = 0; n < 3; ++n)
uiAchievementTimer = 0; time[n] = 0;
bIsAchievementTimerRunning = false; splitPersonality = 0;
bIsWaitingToAppear = false; bIsWaitingToAppear = false;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -133,18 +132,36 @@ public:
DoScriptText(SAY_DEATH, me); DoScriptText(SAY_DEATH, me);
if (pInstance) if (pInstance)
{
if (IsHeroic() && uiAchievementProgress == 2)
pInstance->DoCompleteAchievement(ACHIEV_SPLIT_PERSONALITY);
pInstance->SetData(DATA_MAGUS_TELESTRA_EVENT, DONE); pInstance->SetData(DATA_MAGUS_TELESTRA_EVENT, DONE);
} }
}
void KilledUnit(Unit* /*victim*/) void KilledUnit(Unit* /*victim*/)
{ {
DoScriptText(SAY_KILL, me); DoScriptText(SAY_KILL, me);
} }
void DoAction(int32 const action)
{
if (action == ACTION_MAGUS_DEAD)
{
uint8 i = 0;
while (time[i] != 0)
++i;
time[i] = sWorld->GetGameTime();
if (i == 2 && (time[2] - time[1] < 5) && (time[1] - time[0] < 5))
++splitPersonality;
}
}
uint32 GetData(uint32 type)
{
if (type == DATA_SPLIT_PERSONALITY)
return splitPersonality;
return 0;
}
uint64 SplitPersonality(uint32 entry) uint64 SplitPersonality(uint32 entry)
{ {
if (Creature* Summoned = me->SummonCreature(entry, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1*IN_MILLISECONDS)) if (Creature* Summoned = me->SummonCreature(entry, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), me->GetOrientation(), TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 1*IN_MILLISECONDS))
@@ -181,18 +198,18 @@ public:
if (summon->GetGUID() == uiFireMagusGUID) if (summon->GetGUID() == uiFireMagusGUID)
{ {
me->AI()->DoAction(ACTION_MAGUS_DEAD);
bFireMagusDead = true; bFireMagusDead = true;
bIsAchievementTimerRunning = true;
} }
else if (summon->GetGUID() == uiFrostMagusGUID) else if (summon->GetGUID() == uiFrostMagusGUID)
{ {
me->AI()->DoAction(ACTION_MAGUS_DEAD);
bFrostMagusDead = true; bFrostMagusDead = true;
bIsAchievementTimerRunning = true;
} }
else if (summon->GetGUID() == uiArcaneMagusGUID) else if (summon->GetGUID() == uiArcaneMagusGUID)
{ {
me->AI()->DoAction(ACTION_MAGUS_DEAD);
bArcaneMagusDead = true; bArcaneMagusDead = true;
bIsAchievementTimerRunning = true;
} }
} }
@@ -216,12 +233,10 @@ public:
if ((Phase == 1) ||(Phase == 3)) if ((Phase == 1) ||(Phase == 3))
{ {
if (bIsAchievementTimerRunning)
uiAchievementTimer += diff;
if (bFireMagusDead && bFrostMagusDead && bArcaneMagusDead) if (bFireMagusDead && bFrostMagusDead && bArcaneMagusDead)
{ {
if (uiAchievementTimer <= ACHIEV_TIMER) for (uint8 n = 0; n < 3; ++n)
uiAchievementProgress +=1; time[n] = 0;
me->GetMotionMaster()->Clear(); me->GetMotionMaster()->Clear();
me->GetMap()->CreatureRelocation(me, CenterOfRoom.GetPositionX(), CenterOfRoom.GetPositionY(), CenterOfRoom.GetPositionZ(), CenterOfRoom.GetOrientation()); me->GetMap()->CreatureRelocation(me, CenterOfRoom.GetPositionX(), CenterOfRoom.GetPositionY(), CenterOfRoom.GetPositionZ(), CenterOfRoom.GetOrientation());
DoCast(me, SPELL_TELESTRA_BACK); DoCast(me, SPELL_TELESTRA_BACK);
@@ -236,8 +251,6 @@ public:
bIsWaitingToAppear = true; bIsWaitingToAppear = true;
uiIsWaitingToAppearTimer = 4*IN_MILLISECONDS; uiIsWaitingToAppearTimer = 4*IN_MILLISECONDS;
DoScriptText(SAY_MERGE, me); DoScriptText(SAY_MERGE, me);
bIsAchievementTimerRunning = false;
uiAchievementTimer = 0;
} }
else else
return; return;
@@ -324,7 +337,25 @@ public:
}; };
class achievement_split_personality : public AchievementCriteriaScript
{
public:
achievement_split_personality() : AchievementCriteriaScript("achievement_split_personality")
{
}
bool OnCheck(Player* /*player*/, Unit* target)
{
if (Creature* Telestra = target->ToCreature())
if (Telestra->AI()->GetData(DATA_SPLIT_PERSONALITY) == 2)
return true;
return false;
}
};
void AddSC_boss_magus_telestra() void AddSC_boss_magus_telestra()
{ {
new boss_magus_telestra(); new boss_magus_telestra();
new achievement_split_personality();
} }