diff options
3 files changed, 157 insertions, 113 deletions
diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp index 1c0206ac728..0ddbe0e1a25 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_gyth.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -22,30 +21,20 @@ enum Spells { - SPELL_CORROSIVE_ACID = 20667, - SPELL_FREEZE = 18763, - SPELL_FLAMEBREATH = 20712, - SPELL_SELF_ROOT_FOREVER = 33356 -}; - -enum Adds -{ - MODEL_REND_ON_DRAKE = 9723, /// @todo use creature_template 10459 instead of its modelid - NPC_RAGE_TALON_FIRE_TONG = 10372, - NPC_CHROMATIC_WHELP = 10442, - NPC_CHROMATIC_DRAGONSPAWN = 10447, - NPC_BLACKHAND_ELITE = 10317 + SPELL_REND_MOUNTS = 16167, // Change model + SPELL_FREEZE = 16350, // Combat + SPELL_KNOCK_AWAY = 10101, // Combat + SPELL_FLAMEBREATH = 16390, // Combat (Self cast) + SPELL_CORROSIVE_ACID = 16359, // Combat (self cast) + SPELL_SUMMON_REND = 16328 // Summons Rend near death }; enum Events { - EVENT_SUMMON_REND = 1, - EVENT_AGGRO = 2, - EVENT_SUMMON_DRAGON_PACK = 3, - EVENT_SUMMON_ORC_PACK = 4, - EVENT_CORROSIVE_ACID = 5, - EVENT_FREEZE = 6, - EVENT_FLAME_BREATH = 7 + EVENT_CORROSIVE_ACID = 1, + EVENT_FREEZE = 2, + EVENT_FLAME_BREATH = 3, + EVENT_SUMMONED = 4, }; class boss_gyth : public CreatureScript @@ -55,10 +44,7 @@ public: struct boss_gythAI : public BossAI { - boss_gythAI(Creature* creature) : BossAI(creature, DATA_GYTH) - { - DoCast(me, SPELL_SELF_ROOT_FOREVER); - } + boss_gythAI(Creature* creature) : BossAI(creature, DATA_GYTH) { } bool SummonedRend; @@ -66,30 +52,26 @@ public: { _Reset(); SummonedRend = false; - //Invisible for event start - me->SetVisible(false); - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } void EnterCombat(Unit* /*who*/) { _EnterCombat(); - events.ScheduleEvent(EVENT_SUMMON_DRAGON_PACK, 3000); - events.ScheduleEvent(EVENT_SUMMON_ORC_PACK, 60000); - events.ScheduleEvent(EVENT_AGGRO, 60000); + + events.ScheduleEvent(EVENT_CORROSIVE_ACID, 18000); + events.ScheduleEvent(EVENT_FREEZE, 20000); + events.ScheduleEvent(EVENT_FLAME_BREATH, 16000); } void JustDied(Unit* /*killer*/) { _JustDied(); + // Open doors } - void SummonCreatureWithRandomTarget(uint32 creatureId, uint8 count) + void IsSummonedBy(Unit* /*summoner*/) { - for (uint8 n = 0; n < count; n++) - if (Unit* Summoned = me->SummonCreature(creatureId, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 240 * IN_MILLISECONDS)) - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true)) - Summoned->AddThreat(target, 250.0f); + events.ScheduleEvent(EVENT_SUMMONED, 8000); } void UpdateAI(uint32 diff) @@ -97,9 +79,10 @@ public: if (!UpdateVictim()) return; - if (!SummonedRend && HealthBelowPct(11)) + if (!SummonedRend && HealthBelowPct(5)) { - events.ScheduleEvent(EVENT_SUMMON_REND, 8000); + DoCast(me, SPELL_REND_MOUNTS); + me->RemoveAura(SPELL_REND_MOUNTS); SummonedRend = true; } @@ -112,55 +95,21 @@ public: { switch (eventId) { - case EVENT_SUMMON_REND: - // Summon Rend and Change model to normal Gyth - // Interrupt any spell casting - me->InterruptNonMeleeSpells(false); - // Gyth model - me->SetDisplayId(me->GetCreatureTemplate()->Modelid1); - me->SummonCreature(NPC_WARCHIEF_REND_BLACKHAND, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900 * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_CORROSIVE_ACID, 8 * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_FREEZE, 11 * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_FLAME_BREATH, 4 * IN_MILLISECONDS); - events.CancelEvent(EVENT_SUMMON_REND); - break; - case EVENT_AGGRO: - me->SetVisible(true); - me->SetDisplayId(MODEL_REND_ON_DRAKE); - me->setFaction(14); - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - events.CancelEvent(EVENT_AGGRO); - break; - // Summon Dragon pack. 2 Dragons and 3 Whelps - case EVENT_SUMMON_DRAGON_PACK: - for (uint8 i = 0; i < urand(0, 3) + 2; ++i) - { - SummonCreatureWithRandomTarget(NPC_RAGE_TALON_FIRE_TONG, 2); - SummonCreatureWithRandomTarget(NPC_CHROMATIC_WHELP, 3); - } - events.CancelEvent(EVENT_SUMMON_DRAGON_PACK); - break; - // Summon Orc pack. 1 Orc Handler 1 Elite Dragonkin and 3 Whelps - case EVENT_SUMMON_ORC_PACK: - for (uint8 i = 0; i < urand (0, 5) + 2; ++i) - { - SummonCreatureWithRandomTarget(NPC_CHROMATIC_DRAGONSPAWN, 1); - SummonCreatureWithRandomTarget(NPC_BLACKHAND_ELITE, 1); - SummonCreatureWithRandomTarget(NPC_CHROMATIC_WHELP, 3); - } - events.CancelEvent(EVENT_SUMMON_ORC_PACK); + case EVENT_SUMMONED: + DoCast(me, SPELL_REND_MOUNTS); + // Load Path break; case EVENT_CORROSIVE_ACID: DoCastVictim(SPELL_CORROSIVE_ACID); - events.ScheduleEvent(EVENT_CORROSIVE_ACID, 7 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_CORROSIVE_ACID, 20000); break; case EVENT_FREEZE: DoCastVictim(SPELL_FREEZE); - events.ScheduleEvent(EVENT_FREEZE, 16 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_FREEZE, 16000); break; case EVENT_FLAME_BREATH: DoCastVictim(SPELL_FLAMEBREATH); - events.ScheduleEvent(EVENT_FLAME_BREATH, 10500); + events.ScheduleEvent(EVENT_FLAME_BREATH, 10000); break; } } diff --git a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp index 34bcedf91d7..4fc82275e6a 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockSpire/boss_rend_blackhand.cpp @@ -22,16 +22,74 @@ enum Spells { - SPELL_WHIRLWIND = 26038, - SPELL_CLEAVE = 20691, - SPELL_THUNDERCLAP = 23931, //Not sure if he cast this spell + SPELL_WHIRLWIND = 13736, // sniffed + SPELL_CLEAVE = 15284, + SPELL_MORTAL_STRIKE = 16856, + SPELL_FRENZY = 8269 +}; + +enum Adds +{ + NPC_CHROMATIC_WHELP = 10442, + NPC_CHROMATIC_DRAGONSPAWN = 10447, + NPC_BLACKHAND_DRAGON_HANDLER = 10742 +}; + +struct Wave +{ + uint32 entry; + float x_pos; + float y_pos; + float z_pos; + float o_pos; +}; + +static Wave Wave2[]= +{ + { 10447, 209.8637f, -428.2729f, 110.9877f, 0.6632251f }, + { 10442, 209.3122f, -430.8724f, 110.9814f, 2.9147f }, + { 10442, 211.3309f, -425.9111f, 111.0006f, 1.727876f } +}; + +static Wave Wave3[]= +{ + { 10742, 208.6493f, -424.5787f, 110.9872f, 5.8294f }, + { 10447, 203.9482f, -428.9446f, 110.982f, 4.677482f }, + { 10442, 203.3441f, -426.8668f, 110.9772f, 4.712389f }, + { 10442, 206.3079f, -424.7509f, 110.9943f, 4.08407f } +}; + +static Wave Wave4[]= +{ + { 10742, 212.3541f, -412.6826f, 111.0352f, 5.88176f }, + { 10447, 212.5754f, -410.2841f, 111.0296f, 2.740167f }, + { 10442, 212.3449f, -414.8659f, 111.0348f, 2.356194f }, + { 10442, 210.6568f, -412.1552f, 111.0124f, 0.9773844f } +}; + +static Wave Wave5[]= +{ + { 10742, 210.2188f, -410.6686f, 111.0211f, 5.8294f }, + { 10447, 209.4078f, -414.13f, 111.0264f, 4.677482f }, + { 10442, 208.0858f, -409.3145f, 111.0118f, 4.642576f }, + { 10442, 207.9811f, -413.0728f, 111.0098f, 5.288348f }, + { 10442, 208.0854f, -412.1505f, 111.0057f, 4.08407f } +}; + +static Wave Wave6[]= +{ + { 10742, 213.9138f, -426.512f, 111.0013f, 3.316126f }, + { 10447, 213.7121f, -429.8102f, 110.9888f, 1.413717f }, + { 10447, 213.7157f, -424.4268f, 111.009f, 3.001966f }, + { 10442, 210.8935f, -423.913f, 111.0125f, 5.969026f }, + { 10442, 212.2642f, -430.7648f, 110.9807f, 5.934119f } }; enum Events { EVENT_WHIRLWIND = 1, EVENT_CLEAVE = 2, - EVENT_THUNDERCLAP = 3, + EVENT_MORTAL_STRIKE = 3 }; class boss_rend_blackhand : public CreatureScript @@ -39,14 +97,9 @@ class boss_rend_blackhand : public CreatureScript public: boss_rend_blackhand() : CreatureScript("boss_rend_blackhand") { } - CreatureAI* GetAI(Creature* creature) const - { - return new boss_rend_blackhandAI(creature); - } - struct boss_rend_blackhandAI : public BossAI { - boss_rend_blackhandAI(Creature* creature) : BossAI(creature, DATA_WARCHIEF_REND_BLACKHAND) {} + boss_rend_blackhandAI(Creature* creature) : BossAI(creature, DATA_WARCHIEF_REND_BLACKHAND) { } void Reset() { @@ -56,14 +109,24 @@ public: void EnterCombat(Unit* /*who*/) { _EnterCombat(); - events.ScheduleEvent(EVENT_WHIRLWIND, 20 * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_CLEAVE, 5 * IN_MILLISECONDS); - events.ScheduleEvent(EVENT_THUNDERCLAP, 9 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_WHIRLWIND, 13000); + events.ScheduleEvent(EVENT_CLEAVE, 15000); + events.ScheduleEvent(EVENT_MORTAL_STRIKE, 17000); } void JustDied(Unit* /*killer*/) { _JustDied(); + // Do data set on victor + } + + void SetData(uint32 type, uint32 data) + { + if (instance && type == 1 && data == 1) + { + events.ScheduleEvent(EVENT_WHIRLWIND, 5000); + } + } void UpdateAI(uint32 diff) @@ -81,22 +144,27 @@ public: switch (eventId) { case EVENT_WHIRLWIND: - DoCastVictim(SPELL_WHIRLWIND); - events.ScheduleEvent(EVENT_WHIRLWIND, 18 * IN_MILLISECONDS); + DoCast(SPELL_WHIRLWIND); + events.ScheduleEvent(EVENT_WHIRLWIND, urand(13000, 18000)); break; case EVENT_CLEAVE: DoCastVictim(SPELL_CLEAVE); - events.ScheduleEvent(EVENT_CLEAVE, 10 * IN_MILLISECONDS); + events.ScheduleEvent(EVENT_CLEAVE, 10000); break; - case EVENT_THUNDERCLAP: - DoCastVictim(SPELL_THUNDERCLAP); - events.ScheduleEvent(EVENT_THUNDERCLAP, 16 * IN_MILLISECONDS); + case EVENT_MORTAL_STRIKE: + DoCastVictim(SPELL_MORTAL_STRIKE); + events.ScheduleEvent(EVENT_MORTAL_STRIKE, 16000); break; } } DoMeleeAttackIfReady(); } }; + + CreatureAI* GetAI(Creature* creature) const + { + return new boss_rend_blackhandAI(creature); + } }; void AddSC_boss_rend_blackhand() diff --git a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp index a6266fe8b73..150ad588ae8 100644 --- a/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp +++ b/src/server/scripts/EasternKingdoms/BlackwingLair/boss_nefarian.cpp @@ -37,13 +37,14 @@ enum Events EVENT_GYTH_REND_3 = 8, EVENT_GYTH_REND_4 = 9, EVENT_GYTH_REND_5 = 10, + EVENT_GYTH_REND_6 = 11, // Nefarian - EVENT_SHADOWFLAME = 11, - EVENT_VEILOFSHADOW = 12, - EVENT_CLEAVE = 13, - EVENT_TAILLASH = 14, - EVENT_CLASSCALL = 15 + EVENT_SHADOWFLAME = 12, + EVENT_VEILOFSHADOW = 13, + EVENT_CLEAVE = 14, + EVENT_TAILLASH = 15, + EVENT_CLASSCALL = 16 }; enum Says @@ -83,6 +84,12 @@ enum Says SAY_DEATH_KNIGHT = 13 }; +enum Gameobjects +{ + // UBRS + OBJECT_DR_PORTCULLIS = 175185 +}; + enum Gossip { GOSSIP_ID = 21332, @@ -162,7 +169,10 @@ public: void Reset() { if (me->GetMapId() == 229) - events.ScheduleEvent(EVENT_PLAYER_CHECK, 5000); + { + playerGUID = 0; + events.ScheduleEvent(EVENT_PLAYER_CHECK, 10000); + } if (me->GetMapId() == 469) { @@ -225,35 +235,49 @@ public: switch (eventId) { case EVENT_PLAYER_CHECK: - if (SelectTarget(SELECT_TARGET_NEAREST, 0, 30.0f, true)) - events.ScheduleEvent(EVENT_GYTH_REND_1, 1000); - else - events.ScheduleEvent(EVENT_PLAYER_CHECK, 5000); + { + Map::PlayerList const &players = me->GetMap()->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + if (Player* player = itr->GetSource()->ToPlayer()) + { + if (me->GetDistance(player) < 30.0f && player->IsAlive() && !player->IsGameMaster()) + { + playerGUID = player->GetGUID(); + me->SetInFront(player); + me->SendMovementFlagUpdate(); + events.ScheduleEvent(EVENT_GYTH_REND_1, 1000); + } + else + events.ScheduleEvent(EVENT_PLAYER_CHECK, 10000); + } break; + } case EVENT_GYTH_REND_1: Talk(SAY_GYTH_REND_1); events.ScheduleEvent(EVENT_GYTH_REND_2, 4000); break; case EVENT_GYTH_REND_2: - if (Unit* player = SelectTarget(SELECT_TARGET_NEAREST, 0, 30.0f, false)) - me->SetInFront(player); - me->SendMovementFlagUpdate(); me->HandleEmoteCommand(EMOTE_ONESHOT_POINT); events.ScheduleEvent(EVENT_GYTH_REND_3, 4000); break; case EVENT_GYTH_REND_3: Talk(SAY_GYTH_REND_2); - events.ScheduleEvent(EVENT_GYTH_REND_4, 4000); + events.ScheduleEvent(EVENT_GYTH_REND_4, 2000); break; case EVENT_GYTH_REND_4: + if (GameObject* portcullis = me->FindNearestGameObject(OBJECT_DR_PORTCULLIS, 50.0f)) + portcullis->SetGoState(GO_STATE_READY); + events.ScheduleEvent(EVENT_GYTH_REND_5, 2000); + break; + case EVENT_GYTH_REND_5: if (Creature* rend = me->FindNearestCreature(NPC_REND_BLACKHAND, 5.0f, true)) me->SetInFront(rend); me->SendMovementFlagUpdate(); events.ScheduleEvent(EVENT_GYTH_REND_5, 4000); break; - case EVENT_GYTH_REND_5: + case EVENT_GYTH_REND_6: me->HandleEmoteCommand(EMOTE_ONESHOT_TALK); - events.ScheduleEvent(EVENT_GYTH_REND_5, 4000); + events.ScheduleEvent(EVENT_GYTH_REND_6, 4000); default: break; } @@ -346,6 +370,9 @@ public: } private: + // UBRS + uint64 playerGUID; + // BWL uint32 SpawnedAdds; }; |
