aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp340
1 files changed, 181 insertions, 159 deletions
diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp
index 99ce7967770..72fd6017482 100644
--- a/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp
+++ b/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp
@@ -16,8 +16,8 @@
/* ScriptData
SDName: Boss_Nightbane
-SD%Complete: 50
-SDComment: skelleton adds, optimice some "if"s, timers, rain of bones applied self(!?)
+SD%Complete: 70
+SDComment: SDComment: skelleton adds need 2 more, timers,
SDCategory: Karazhan
EndScriptData */
@@ -35,6 +35,14 @@ EndScriptData */
#define SPELL_SMOKING_BLAST 37057
#define SPELL_FIREBALL_BARRAGE 30282
#define SPELL_SEARING_CINDERS 30127
+#define SPELL_SUMMON_SKELETON 30170
+
+#define EMOTE_SUMMON "An ancient being awakens in the distance..."
+#define YELL_AGGRO "What fools! I shall bring a quick end to your suffering!"
+#define YELL_FLY_PHASE "Miserable vermin. I shall exterminate you from the air!"
+#define YELL_LAND_PHASE_1 "Enough! I shall land and crush you myself!"
+#define YELL_LAND_PHASE_2 "Insects! Let me show you my strength up close!"
+#define EMOTE_BREATH "takes a deep breath."
float IntroWay[8][3] =
{
@@ -62,78 +70,97 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
boss_nightbaneAI(Creature* c) : ScriptedAI(c)
{
pInstance = ((ScriptedInstance*)c->GetInstanceData());
- intro = true;
+ Intro = true;
Reset();
}
ScriptedInstance* pInstance;
- uint32 phase;
+ uint32 Phase;
+
+ bool RainBones;
+ bool Skeletons;
- bool rainbones;
+ uint32 BellowingRoarTimer;
+ uint32 CharredEarthTimer;
+ uint32 DistractingAshTimer;
+ uint32 SmolderingBreathTimer;
+ uint32 TailSweepTimer;
+ uint32 RainofBonesTimer;
+ uint32 SmokingBlastTimer;
+ uint32 FireballBarrageTimer;
+ uint32 SearingCindersTimer;
- uint32 bellowingroar_timer;
- uint32 charredearth_timer;
- uint32 distractingash_timer;
- uint32 smolderingbreath_timer;
- uint32 tailsweep_timer;
- uint32 rainofbones_timer;
- uint32 smokingblast_timer;
- uint32 fireballbarrage_timer;
- uint32 searingcinders_timer;
+ uint32 FlyCount;
+ uint32 FlyTimer;
- uint32 fly_count;
- uint32 fly_timer;
+ bool Intro;
+ bool Flying;
+ bool Movement;
- bool intro;
- bool flying;
- bool movement;
- uint32 wait_timer;
+ uint32 WaitTimer;
uint32 MovePhase;
void Reset()
{
- phase =1;
- bellowingroar_timer = 30000;
- charredearth_timer = 15000;
- distractingash_timer = 20000;
- smolderingbreath_timer = 10000;
- tailsweep_timer = 12000;
- rainofbones_timer = 10000;
- smokingblast_timer = 20000;
- fireballbarrage_timer = 13000;
- searingcinders_timer = 14000;
-
- fly_count = 0;
+ BellowingRoarTimer = 30000;
+ CharredEarthTimer = 15000;
+ DistractingAshTimer = 20000;
+ SmolderingBreathTimer = 10000;
+ TailSweepTimer = 12000;
+ RainofBonesTimer = 10000;
+ SmokingBlastTimer = 20000;
+ FireballBarrageTimer = 13000;
+ SearingCindersTimer = 14000;
+ WaitTimer = 1000;
+
+ Phase =1;
+ FlyCount = 0;
+ MovePhase = 0;
- m_creature->SetSpeed(MOVE_RUN,2);
+ m_creature->SetSpeed(MOVE_RUN, 2.0f);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
m_creature->setActive(true);
- wait_timer = 1000;
- MovePhase = 0;
if(pInstance)
pInstance->SetData(DATA_NIGHTBANE_EVENT, NOT_STARTED);
- flying = false;
- movement = false;
+ if(pInstance->GetData(DATA_NIGHTBANE_EVENT) == DONE)
+ m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
+
+ HandleTerraceDoors(true);
- if(!intro)
+ Flying = false;
+ Movement = false;
+
+ if(!Intro)
{
m_creature->SetHomePosition(IntroWay[7][0],IntroWay[7][1],IntroWay[7][2],0);
m_creature->GetMotionMaster()->MoveTargetedHome();
}
}
+ void HandleTerraceDoors(bool open)
+ {
+ //if(GameObject *Door = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_MASTERS_TERRACE_DOOR_1)))
+ // Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ //if(GameObject *Door = GameObject::GetGameObject((*m_creature),pInstance->GetData64(DATA_MASTERS_TERRACE_DOOR_2)))
+ // Door->SetUInt32Value(GAMEOBJECT_STATE, open ? 0 : 1);
+ }
+
void Aggro(Unit *who)
{
if(pInstance)
pInstance->SetData(DATA_NIGHTBANE_EVENT, IN_PROGRESS);
+
+ HandleTerraceDoors(false);
+ DoYell(YELL_AGGRO, LANG_UNIVERSAL, NULL);
}
+
void AttackStart(Unit* who)
{
- if(!intro && !flying)
+ if(!Intro && !Flying)
ScriptedAI::AttackStart(who);
}
@@ -141,10 +168,13 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
{
if(pInstance)
pInstance->SetData(DATA_NIGHTBANE_EVENT, DONE);
+
+ HandleTerraceDoors(true);
}
+
void MoveInLineOfSight(Unit *who)
{
- if(!intro && !flying)
+ if(!Intro && !Flying)
{
if(!m_creature->getVictim() && m_creature->canStartAttack(who))
ScriptedAI::AttackStart(who);
@@ -156,50 +186,78 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
if(type != POINT_MOTION_TYPE)
return;
- if(intro)
+ if(Intro)
{
if(id >= 8)
{
- intro = false;
+ Intro = false;
m_creature->SetHomePosition(IntroWay[7][0],IntroWay[7][1],IntroWay[7][2],0);
return;
}
- wait_timer = 1;
+ WaitTimer = 1;
}
- if(flying)
+ if(Flying)
{
if(id == 0)
{
- flying = false;
- phase = 2;
+ DoTextEmote(EMOTE_BREATH, NULL, true);
+ Flying = false;
+ Phase = 2;
return;
}
+
if(id == 3)
{
MovePhase = 4;
- wait_timer = 1;
+ WaitTimer = 1;
return;
}
+
if(id == 8)
{
- flying = false;
- phase = 1;
- movement = true;
+ Flying = false;
+ Phase = 1;
+ Movement = true;
return;
}
- wait_timer = 1;
+ WaitTimer = 1;
}
}
+ void JustSummoned(Creature *summoned)
+ {
+ summoned->AI()->AttackStart(m_creature->getVictim());
+ }
+
+ void TakeOff()
+ {
+ DoYell(YELL_FLY_PHASE, LANG_UNIVERSAL, NULL);
+
+ m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
+ m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
+ m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
+ (*m_creature).GetMotionMaster()->Clear(false);
+ (*m_creature).GetMotionMaster()->MovePoint(0,IntroWay[2][0],IntroWay[2][1],IntroWay[2][2]);
+
+ Flying = true;
+
+ FlyTimer = 45000+rand()%15000; //timer wrong between 45 and 60 seconds
+ ++FlyCount;
+
+ RainofBonesTimer = 5000; //timer wrong (maybe)
+ RainBones = false;
+ Skeletons = false;
+ }
+
void UpdateAI(const uint32 diff)
{
- if(wait_timer)
- if(wait_timer < diff)
+ if(WaitTimer)
+ if(WaitTimer < diff)
{
- if(intro)
+ if(Intro)
{
if(MovePhase >= 7)
{
@@ -210,12 +268,11 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
else
{
m_creature->GetMotionMaster()->MovePoint(MovePhase,IntroWay[MovePhase][0],IntroWay[MovePhase][1],IntroWay[MovePhase][2]);
- MovePhase++;
+ ++MovePhase;
}
}
-
- if(flying)
+ if(Flying)
{
if(MovePhase >= 7)
{
@@ -226,173 +283,138 @@ struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI
else
{
m_creature->GetMotionMaster()->MovePoint(MovePhase,IntroWay[MovePhase][0],IntroWay[MovePhase][1],IntroWay[MovePhase][2]);
- MovePhase++;
+ ++MovePhase;
}
}
- wait_timer = 0;
- }else wait_timer -= diff;
+ WaitTimer = 0;
+ }else WaitTimer -= diff;
if(!m_creature->SelectHostilTarget())
return;
- if(flying)
+ if(Flying)
return;
// Phase 1 "GROUND FIGHT"
- if(phase == 1)
+ if(Phase == 1)
{
- if(movement)
+ if(Movement)
{
DoStartMovement(m_creature->getVictim());
- movement = false;
+ Movement = false;
}
- if (bellowingroar_timer < diff)
+ if (BellowingRoarTimer < diff)
{
DoCast(m_creature->getVictim(),SPELL_BELLOWING_ROAR);
- bellowingroar_timer = 30000+rand()%10000 ; //Timer
- }else bellowingroar_timer -= diff;
+ BellowingRoarTimer = 30000+rand()%10000 ; //Timer
+ }else BellowingRoarTimer -= diff;
- if (smolderingbreath_timer < diff)
+ if (SmolderingBreathTimer < diff)
{
DoCast(m_creature->getVictim(),SPELL_SMOLDERING_BREATH);
- smolderingbreath_timer = 20000;//timer
-
- }else smolderingbreath_timer -= diff;
+ SmolderingBreathTimer = 20000;//timer
+ }else SmolderingBreathTimer -= diff;
- if (charredearth_timer < diff)
+ if (CharredEarthTimer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
DoCast(target,SPELL_CHARRED_EARTH);
- charredearth_timer = 20000; //timer
- }else charredearth_timer -= diff;
+ CharredEarthTimer = 20000; //timer
+ }else CharredEarthTimer -= diff;
- if (tailsweep_timer < diff)
+ if (TailSweepTimer < diff)
{
Unit* target = NULL;
- target = SelectUnit(SELECT_TARGET_RANDOM,0);
-
+ target = SelectUnit(SELECT_TARGET_RANDOM,0);
if (!m_creature->HasInArc( M_PI, target))
DoCast(target,SPELL_TAIL_SWEEP);
- tailsweep_timer = 15000;//timer
- }else tailsweep_timer -= diff;
+ TailSweepTimer = 15000;//timer
+ }else TailSweepTimer -= diff;
- if (searingcinders_timer < diff)
+ if (SearingCindersTimer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
-
DoCast(target,SPELL_SEARING_CINDERS);
- searingcinders_timer = 10000; //timer
- }else searingcinders_timer -= diff;
+ SearingCindersTimer = 10000; //timer
+ }else SearingCindersTimer -= diff;
- uint32 prozent;
- prozent = (m_creature->GetHealth()*100) / m_creature->GetMaxHealth();
+ uint32 Prozent;
+ Prozent = (m_creature->GetHealth()*100) / m_creature->GetMaxHealth();
- if (prozent < 75 && fly_count == 0) // first take off 75%
- {
- m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
- (*m_creature).GetMotionMaster()->Clear(false);
- (*m_creature).GetMotionMaster()->MovePoint(0,IntroWay[2][0],IntroWay[2][1],IntroWay[2][2]);
- flying = true;
+ if (Prozent < 75 && FlyCount == 0) // first take off 75%
+ TakeOff();
- fly_timer = 45000+rand()%15000;
- fly_count++;
-
- rainofbones_timer = 5000;
- rainbones = false;
- }
-
- if (prozent < 50 && fly_count == 1) // secound take off 50%
- {
- m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
- (*m_creature).GetMotionMaster()->Clear(false);
- (*m_creature).GetMotionMaster()->MovePoint(0,IntroWay[2][0],IntroWay[2][1],IntroWay[2][2]);
-
- flying = true;
- fly_timer = 45000+rand()%15000;
- fly_count++;
-
- rainofbones_timer = 5000;
- rainbones = false;
- }
-
- if (prozent < 25 && fly_count == 2) // third take off 25%
- {
- m_creature->InterruptSpell(CURRENT_GENERIC_SPELL);
- m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
- m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
- (*m_creature).GetMotionMaster()->Clear(false);
- (*m_creature).GetMotionMaster()->MovePoint(0,IntroWay[2][0],IntroWay[2][1],IntroWay[2][2]);
-
- flying = true;
- //phase = 2;
- fly_timer = 45000+rand()%15000;
- fly_count++;
-
- rainofbones_timer = 5000;
- rainbones = false;
- }
+ if (Prozent < 50 && FlyCount == 1) // secound take off 50%
+ TakeOff();
+ if (Prozent < 25 && FlyCount == 2) // third take off 25%
+ TakeOff();
+
DoMeleeAttackIfReady();
}
//Phase 2 "FLYING FIGHT"
- if (phase == 2)
+ if (Phase == 2)
{
- if (!rainbones)
+ if (!RainBones)
{
- if (rainofbones_timer < diff && !rainbones) // only once at the beginning of phase 2
+ if (!Skeletons)
+ {
+ DoCast(m_creature->getVictim(), SPELL_SUMMON_SKELETON);
+ DoCast(m_creature->getVictim(), SPELL_SUMMON_SKELETON);
+ DoCast(m_creature->getVictim(), SPELL_SUMMON_SKELETON);
+ Skeletons = true;
+ }
+
+ if (RainofBonesTimer < diff && !RainBones) // only once at the beginning of phase 2
{
- DoCast(m_creature->getVictim(),SPELL_RAIN_OF_BONES);
- rainbones = true;
- smokingblast_timer = 20000;
- }else rainofbones_timer -= diff;
+ DoCast(m_creature->getVictim(),SPELL_RAIN_OF_BONES);
+ RainBones = true;
+ SmokingBlastTimer = 20000;
+ }else RainofBonesTimer -= diff;
- if (distractingash_timer < diff)
+ if (DistractingAshTimer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_RANDOM,0);
-
DoCast(target,SPELL_DISTRACTING_ASH);
- distractingash_timer = 2000;//timer wrong
- }else distractingash_timer -= diff;
+ DistractingAshTimer = 2000;//timer wrong
+ }else DistractingAshTimer -= diff;
}
- if (rainbones)
+ if (RainBones)
{
- if (smokingblast_timer < diff)
+ if (SmokingBlastTimer < diff)
{
DoCast(m_creature->getVictim(),SPELL_SMOKING_BLAST);
- smokingblast_timer = 1500 ; //timer wrong
- }else smokingblast_timer -= diff;
+ SmokingBlastTimer = 1500 ; //timer wrong
+ }else SmokingBlastTimer -= diff;
}
- if (fireballbarrage_timer < diff)
+ if (FireballBarrageTimer < diff)
{
Unit* target = NULL;
target = SelectUnit(SELECT_TARGET_FARTHEST,0);
-
DoCast(target,SPELL_FIREBALL_BARRAGE);
- fireballbarrage_timer = 20000; //Timer
- }else fireballbarrage_timer -= diff;
+ FireballBarrageTimer = 20000; //Timer
+ }else FireballBarrageTimer -= diff;
- if (fly_timer < diff) //landing
+ if (FlyTimer < diff) //landing
{
- //m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
- //m_creature->SetHover(false);
+ if(rand()%2 == 0)
+ DoYell(YELL_LAND_PHASE_1, LANG_UNIVERSAL, NULL);
+ else
+ DoYell(YELL_LAND_PHASE_2, LANG_UNIVERSAL, NULL);
+
(*m_creature).GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MovePoint(3,IntroWay[3][0],IntroWay[3][1],IntroWay[3][2]);
- flying = true;
- //wait_timer = 1;
- //phase = 1;
- }else fly_timer -= diff;
+
+ Flying = true;
+ }else FlyTimer -= diff;
}
}
};
@@ -407,6 +429,6 @@ void AddSC_boss_nightbane()
Script *newscript;
newscript = new Script;
newscript->Name="boss_nightbane";
- newscript->GetAI = GetAI_boss_nightbane;
+ newscript->GetAI = &GetAI_boss_nightbane;
newscript->RegisterSelf();
} \ No newline at end of file