diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bindings/scripts/ScriptMgr.cpp | 2 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp | 379 | ||||
-rw-r--r-- | src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp | 7 |
3 files changed, 383 insertions, 5 deletions
diff --git a/src/bindings/scripts/ScriptMgr.cpp b/src/bindings/scripts/ScriptMgr.cpp index 8fb5bdb1021..651bc6a95f6 100644 --- a/src/bindings/scripts/ScriptMgr.cpp +++ b/src/bindings/scripts/ScriptMgr.cpp @@ -342,6 +342,7 @@ extern void AddSC_boss_moroes(); extern void AddSC_bosses_opera(); extern void AddSC_instance_karazhan(); extern void AddSC_karazhan(); +extern void AddSC_boss_nightbane(); //Loch Modan extern void AddSC_loch_modan(); @@ -1547,6 +1548,7 @@ void ScriptsInit() AddSC_bosses_opera(); AddSC_instance_karazhan(); AddSC_karazhan(); + AddSC_boss_nightbane(); //Loch Modan AddSC_loch_modan(); diff --git a/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp b/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp index bffb418980a..17fec0d2e75 100644 --- a/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp +++ b/src/bindings/scripts/scripts/zone/karazhan/boss_nightbane.cpp @@ -16,18 +16,389 @@ /* ScriptData SDName: Boss_Nightbane -SD%Complete: 0 -SDComment: Place holder +SD%Complete: 50 +SDComment: skelleton adds, optimice some "if"s, timers, rain of bones applied self(!?) SDCategory: Karazhan EndScriptData */ #include "precompiled.h" - +#include "def_karazhan.h" + +//phase 1 #define SPELL_BELLOWING_ROAR 39427 -#define SPELL_CHARRED_EARTH 30129 //Also 30209 (Target Charred Earth) triggers this +#define SPELL_CHARRED_EARTH 30129 //Also 30209 (Target Charred Earth) triggers this #define SPELL_DISTRACTING_ASH 30130 #define SPELL_SMOLDERING_BREATH 30210 #define SPELL_TAIL_SWEEP 25653 +//phase 2 #define SPELL_RAIN_OF_BONES 37098 #define SPELL_SMOKING_BLAST 37057 #define SPELL_FIREBALL_BARRAGE 30282 +#define SPELL_SEARING_CINDERS 30127 + +float IntroWay[8][3] = +{ + {-11053.37,-1794.48,149}, + {-11141.07,-1841.40,125}, + {-11187.28,-1890.23,125}, + {-11189.20,-1931.25,125}, + {-11153.76,-1948.93,125}, + {-11128.73,-1929.75,125}, + {-11140 , -1915 ,122}, + {-11163 , -1903 ,91.473} +}; + +//float IntroWay[5][3] = +//{ +// {-11000.00, -1765.75, 140.40}, +// {-11000.00, -1765.75, 171.00}, +// {-11173.67, -1832.26, 117.76}, +// {-11142.75, -1916.78, 119.769}, +// {-11161.91, -1911.148, 91.473} +//}; + +struct TRINITY_DLL_DECL boss_nightbaneAI : public ScriptedAI +{ + boss_nightbaneAI(Creature* c) : ScriptedAI(c) + { + pInstance = ((ScriptedInstance*)c->GetInstanceData()); + intro = true; + Reset(); + } + + ScriptedInstance* pInstance; + + uint32 phase; + + bool rainbones; + + 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 fly_count; + uint32 fly_timer; + + bool intro; + bool flying; + uint32 wait_timer; + 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; + + m_creature->SetSpeed(MOVE_RUN,2); + 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; + + if(!intro) + { + m_creature->SetHomePosition(IntroWay[7][0],IntroWay[7][1],IntroWay[7][2],0); + m_creature->GetMotionMaster()->MoveTargetedHome(); + } + } + + void Aggro(Unit *who) + { + if(pInstance) + pInstance->SetData(DATA_NIGHTBANE_EVENT, IN_PROGRESS); + } + void AttackStart(Unit* who) + { + if(!intro && !flying) + ScriptedAI::AttackStart(who); + } + + void JustDied(Unit* killer) + { + if(pInstance) + pInstance->SetData(DATA_NIGHTBANE_EVENT, DONE); + } + void MoveInLineOfSight(Unit *who) + { + if(!intro && !flying) + { + if(!m_creature->getVictim() && m_creature->canStartAttack(who)) + ScriptedAI::AttackStart(who); + } + } + + void MovementInform(uint32 type, uint32 id) + { + if(type != POINT_MOTION_TYPE) + return; + + if(intro) + { + if(id >= 8) + { + intro = false; + m_creature->SetHomePosition(IntroWay[7][0],IntroWay[7][1],IntroWay[7][2],0); + return; + } + + wait_timer = 1; + } + + if(flying) + { + if(id == 0) + { + flying = false; + phase = 2; + return; + } + if(id == 3) + { + MovePhase = 4; + wait_timer = 1; + return; + } + if(id == 8) + { + flying = false; + phase = 1; + return; + } + + wait_timer = 1; + } + } + + void UpdateAI(const uint32 diff) + { + if(wait_timer) + if(wait_timer < diff) + { + if(intro) + { + if(MovePhase >= 7) + { + m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING); + m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND); + m_creature->GetMotionMaster()->MovePoint(8,IntroWay[7][0],IntroWay[7][1],IntroWay[7][2]); + } + else + { + m_creature->GetMotionMaster()->MovePoint(MovePhase,IntroWay[MovePhase][0],IntroWay[MovePhase][1],IntroWay[MovePhase][2]); + MovePhase++; + } + } + + + if(flying) + { + if(MovePhase >= 7) + { + m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING); + m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND); + m_creature->GetMotionMaster()->MovePoint(8,IntroWay[7][0],IntroWay[7][1],IntroWay[7][2]); + } + else + { + m_creature->GetMotionMaster()->MovePoint(MovePhase,IntroWay[MovePhase][0],IntroWay[MovePhase][1],IntroWay[MovePhase][2]); + MovePhase++; + } + } + + wait_timer = 0; + }else wait_timer -= diff; + + if(!m_creature->SelectHostilTarget()) + return; + + if(flying) + return; + + // Phase 1 "GROUND FIGHT" + if(phase == 1) + { + m_creature->GetMotionMaster()->MoveChase(m_creature->getVictim()); + if (bellowingroar_timer < diff) + { + DoCast(m_creature->getVictim(),SPELL_BELLOWING_ROAR); + bellowingroar_timer = 30000+rand()%10000 ; //Timer + }else bellowingroar_timer -= diff; + + if (smolderingbreath_timer < diff) + { + DoCast(m_creature->getVictim(),SPELL_SMOLDERING_BREATH); + smolderingbreath_timer = 20000;//timer + + }else smolderingbreath_timer -= diff; + + if (charredearth_timer < diff) + { + Unit* target = NULL; + target = SelectUnit(SELECT_TARGET_RANDOM,0); + DoCast(target,SPELL_CHARRED_EARTH); + charredearth_timer = 20000; //timer + }else charredearth_timer -= diff; + + if (tailsweep_timer < diff) + { + Unit* target = NULL; + 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; + + if (searingcinders_timer < diff) + { + Unit* target = NULL; + target = SelectUnit(SELECT_TARGET_RANDOM,0); + + DoCast(target,SPELL_SEARING_CINDERS); + searingcinders_timer = 10000; //timer + }else searingcinders_timer -= diff; + + 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; + + 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; + } + + DoMeleeAttackIfReady(); + } + + //Phase 2 "FLYING FIGHT" + if (phase == 2) + { + if (!rainbones) + { + if (rainofbones_timer < 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; + + if (distractingash_timer < diff) + { + Unit* target = NULL; + target = SelectUnit(SELECT_TARGET_RANDOM,0); + + DoCast(target,SPELL_DISTRACTING_ASH); + distractingash_timer = 2000;//timer wrong + }else distractingash_timer -= diff; + } + + if (rainbones) + { + if (smokingblast_timer < diff) + { + DoCast(m_creature->getVictim(),SPELL_SMOKING_BLAST); + smokingblast_timer = 1500 ; //timer wrong + }else smokingblast_timer -= diff; + } + + if (fireballbarrage_timer < diff) + { + Unit* target = NULL; + target = SelectUnit(SELECT_TARGET_FARTHEST,0); + + DoCast(target,SPELL_FIREBALL_BARRAGE); + fireballbarrage_timer = 20000; //Timer + }else fireballbarrage_timer -= diff; + + if (fly_timer < diff) //landing + { + //m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND); + //m_creature->SetHover(false); + (*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; + } + } +}; + +CreatureAI* GetAI_boss_nightbane(Creature *_Creature) +{ + return new boss_nightbaneAI (_Creature); +} + +void AddSC_boss_nightbane() +{ + Script *newscript; + newscript = new Script; + newscript->Name="boss_nightbane"; + newscript->GetAI = GetAI_boss_nightbane; + newscript->RegisterSelf(); +}
\ No newline at end of file diff --git a/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp b/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp index 5af12a4fb0b..9fea30e1c93 100644 --- a/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp +++ b/src/bindings/scripts/scripts/zone/karazhan/instance_karazhan.cpp @@ -59,7 +59,8 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance uint64 MassiveDoor; // Door at Netherspite uint64 GamesmansDoor; // Door before Chess uint64 GamesmansExitDoor; // Door after Chess - uint64 NetherspaceDoor; // Door at Malchezaar + uint64 NetherspaceDoor; // Door at Malchezaar + uint64 MastersTerraceDoor[2]; uint64 ImageGUID; @@ -84,6 +85,8 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance GamesmansDoor = 0; GamesmansExitDoor = 0; NetherspaceDoor = 0; + MastersTerraceDoor[0]= 0; + MastersTerraceDoor[1]= 0; ImageGUID = 0; } @@ -199,6 +202,8 @@ struct TRINITY_DLL_DECL instance_karazhan : public ScriptedInstance case 184276: GamesmansDoor = go->GetGUID(); break; case 184277: GamesmansExitDoor = go->GetGUID(); break; case 185134: NetherspaceDoor = go->GetGUID(); break; + case 184274: MastersTerraceDoor[0] = go->GetGUID(); break; + case 184280: MastersTerraceDoor[1] = go->GetGUID(); break; } switch(OperaEvent) |