aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2011_06_24_02_world_achievement_criteria_data.sql6
-rw-r--r--src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp79
2 files changed, 61 insertions, 24 deletions
diff --git a/sql/updates/world/2011_06_24_02_world_achievement_criteria_data.sql b/sql/updates/world/2011_06_24_02_world_achievement_criteria_data.sql
new file mode 100644
index 00000000000..1668e241338
--- /dev/null
+++ b/sql/updates/world/2011_06_24_02_world_achievement_criteria_data.sql
@@ -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');
diff --git a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
index 66d98186975..b93090aac31 100644
--- a/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
+++ b/src/server/scripts/Northrend/Nexus/Nexus/boss_magus_telestra.cpp
@@ -32,12 +32,14 @@ enum Spells
SPELL_FROST_MAGUS_VISUAL = 47706,
SPELL_ARCANE_MAGUS_VISUAL = 47704
};
+
enum Creatures
{
MOB_FIRE_MAGUS = 26928,
MOB_FROST_MAGUS = 26930,
MOB_ARCANE_MAGUS = 26929
};
+
enum Yells
{
SAY_AGGRO = -1576000,
@@ -47,11 +49,9 @@ enum Yells
SAY_SPLIT_1 = -1576004,
SAY_SPLIT_2 = -1576005,
};
-enum Achievements
-{
- ACHIEV_SPLIT_PERSONALITY = 2150,
- ACHIEV_TIMER = 5*IN_MILLISECONDS
-};
+
+#define ACTION_MAGUS_DEAD 1
+#define DATA_SPLIT_PERSONALITY 2
const Position CenterOfRoom = {504.80f, 89.07f, -16.12f, 6.27f};
@@ -82,17 +82,16 @@ public:
bool bFrostMagusDead;
bool bArcaneMagusDead;
bool bIsWaitingToAppear;
- bool bIsAchievementTimerRunning;
uint32 uiIsWaitingToAppearTimer;
uint32 uiIceNovaTimer;
uint32 uiFireBombTimer;
uint32 uiGravityWellTimer;
uint32 uiCooldown;
- uint32 uiAchievementTimer;
uint8 Phase;
- uint8 uiAchievementProgress;
+ uint8 splitPersonality;
+ time_t time[3];
void Reset()
{
@@ -107,10 +106,10 @@ public:
uiFrostMagusGUID = 0;
uiArcaneMagusGUID = 0;
- uiAchievementProgress = 0;
- uiAchievementTimer = 0;
+ for (uint8 n = 0; n < 3; ++n)
+ time[n] = 0;
- bIsAchievementTimerRunning = false;
+ splitPersonality = 0;
bIsWaitingToAppear = false;
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
@@ -133,11 +132,7 @@ public:
DoScriptText(SAY_DEATH, me);
if (pInstance)
- {
- if (IsHeroic() && uiAchievementProgress == 2)
- pInstance->DoCompleteAchievement(ACHIEV_SPLIT_PERSONALITY);
pInstance->SetData(DATA_MAGUS_TELESTRA_EVENT, DONE);
- }
}
void KilledUnit(Unit* /*victim*/)
@@ -145,6 +140,28 @@ public:
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)
{
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)
{
+ me->AI()->DoAction(ACTION_MAGUS_DEAD);
bFireMagusDead = true;
- bIsAchievementTimerRunning = true;
}
else if (summon->GetGUID() == uiFrostMagusGUID)
{
+ me->AI()->DoAction(ACTION_MAGUS_DEAD);
bFrostMagusDead = true;
- bIsAchievementTimerRunning = true;
}
else if (summon->GetGUID() == uiArcaneMagusGUID)
{
+ me->AI()->DoAction(ACTION_MAGUS_DEAD);
bArcaneMagusDead = true;
- bIsAchievementTimerRunning = true;
}
}
@@ -216,12 +233,10 @@ public:
if ((Phase == 1) ||(Phase == 3))
{
- if (bIsAchievementTimerRunning)
- uiAchievementTimer += diff;
if (bFireMagusDead && bFrostMagusDead && bArcaneMagusDead)
{
- if (uiAchievementTimer <= ACHIEV_TIMER)
- uiAchievementProgress +=1;
+ for (uint8 n = 0; n < 3; ++n)
+ time[n] = 0;
me->GetMotionMaster()->Clear();
me->GetMap()->CreatureRelocation(me, CenterOfRoom.GetPositionX(), CenterOfRoom.GetPositionY(), CenterOfRoom.GetPositionZ(), CenterOfRoom.GetOrientation());
DoCast(me, SPELL_TELESTRA_BACK);
@@ -236,8 +251,6 @@ public:
bIsWaitingToAppear = true;
uiIsWaitingToAppearTimer = 4*IN_MILLISECONDS;
DoScriptText(SAY_MERGE, me);
- bIsAchievementTimerRunning = false;
- uiAchievementTimer = 0;
}
else
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()
{
new boss_magus_telestra();
+ new achievement_split_personality();
}