Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
- --- a/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
- +++ b/src/server/scripts/Northrend/Ulduar/ulduar/boss_razorscale.cpp
- @@ -39,7 +39,7 @@
- EMOTE_PERMA = -1603268,
- };
- -#define GOSSIP_ITEM_1 "Activate Harpoones!"
- +#define GOSSIP_ITEM_1 "Activate Harpoons!"
- enum Spells
- {
- @@ -49,17 +49,34 @@
- SPELL_WINGBUFFET = 62666,
- SPELL_FLAMEBREATH = 63317,
- SPELL_FUSEARMOR = 64771,
- - SPELL_DEVOURING_FLAME = 63236,
- - SPELL_HARPOON = 54933,
- SPELL_FLAMED = 62696,
- SPELL_STUN = 9032,
- SPELL_BERSERK = 47008
- };
- +enum DevouringFlameSpells
- +{
- + SPELL_DEVOURING_FLAME = 63236,
- + SPELL_DEVOURING_FLAME_DAMAGE = 64704,
- + SPELL_DEVOURING_FLAME_TRIGGER = 64709,
- +};
- +
- +enum HarpoonSpells
- +{//these spells stil need to be scripted into a spell script. the visual is the one that is used from bloody :/
- + SPELL_HARPOON_TRIGGER = 62505,
- + SPELL_HARPOON_DUMMY = 62509,
- + SPELL_HARPOON_SHOT_1 = 63524, //used by npc harpoon
- + SPELL_HARPOON_SHOT_2 = 63657,
- + SPELL_HARPOON_SHOT_3 = 63658,
- + SPELL_HARPOON_SHOT_4 = 63659,
- +
- + SPELL_HARPOON_VISUAL = 54933, //WRONG SPELL
- +};
- +
- const Position PosHarpoon[4] =
- {
- -{594.317f, -136.953f, 391.517f, 4.544f},
- -{577.449f, -136.953f, 391.517f, 4.877f},
- +{589.923f, -133.622f, 391.897f, 4.544f},
- +{571.947f, -136.012f, 391.517f, 4.877f},
- {607.726f, -146.857f, 391.517f, 4.041f},
- {561.449f, -146.857f, 391.517f, 5.426f}
- };
- @@ -90,12 +107,11 @@
- {560.231f, -153.677f, 391.517f, 5.403f}
- };
- -const Position RazorFlight = {588.050f, -251.191f, 470.536f, 1.605f};
- +const Position RazorFlight = {588.050f, -251.191f, 470.536f, 0};
- const Position RazorGround = {586.966f, -175.534f, 391.517f, 1.692f};
- enum Mobs
- {
- - RAZORSCALE = 33186,// ?? why not use instance?
- NPC_DARK_RUNE_GUARDIAN = 33388,
- NPC_DARK_RUNE_SENTINEL = 33846,
- NPC_DARK_RUNE_WATCHER = 33453,
- @@ -103,8 +119,7 @@
- NPC_COMMANDER = 33210,
- NPC_ENGINEER = 33287,
- NPC_DEFENDER = 33816,
- - NPC_HARPOON = 33184,
- - GOB_MOLE_MACHINE = 194316
- + NPC_HARPOON = 33282,
- };
- enum DarkRuneSpells
- @@ -126,6 +141,8 @@
- #define ACTION_EVENT_START 1
- #define ACTION_GROUND_PHASE 2
- +#define ACTION_HARPOON_DESTROY 3
- +#define ACTION_HARPOON_ACTIVATED 10
- enum Phases
- {
- @@ -152,6 +169,129 @@
- EVENT_SUMMON
- };
- +class boss_razorscale_controller : public CreatureScript
- +{
- + public:
- + boss_razorscale_controller() : CreatureScript("boss_razorscale_controller") { }
- +
- + struct boss_razorscale_controllerAI : public BossAI
- + {
- + boss_razorscale_controllerAI(Creature* pCreature) : BossAI(pCreature, DATA_RAZORSCALE_CONTROL)
- + {
- + me->SetDisplayId(11686);
- + }
- +
- + Creature* Harpoon[4];
- + uint8 HarpoonCounter;
- +
- + void Reset()
- + {
- + events.Reset();
- + me->SetReactState(REACT_PASSIVE);
- +
- + instance->SetBossState(DATA_RAZORSCALE_CONTROL, NOT_STARTED);
- + }
- +
- + void EnterCombat(Unit* who)
- + {
- + instance->SetBossState(DATA_RAZORSCALE_CONTROL, IN_PROGRESS);
- + // TODO: add support for gameobjects 4 different harpoon instead of npc
- + for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
- + Harpoon[n] = me->SummonCreature(NPC_HARPOON, PosHarpoon[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 0);
- +
- + //DoCast(me, SPELL_HARPOON_TRIGGER);
- +
- + if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, instance->GetData64(TYPE_RAZORSCALE)))
- + if (!Razorscale->isInCombat())
- + DoZoneInCombat(Razorscale);
- +
- + events.ScheduleEvent(EVENT_HARPOON, 60000);
- + }
- +
- + void SpellHit(Unit* /*caster*/, const SpellEntry* pSpell)
- + {
- + if ((pSpell->Id == SPELL_HARPOON_SHOT_1) | (pSpell->Id == SPELL_HARPOON_SHOT_2) | (pSpell->Id == SPELL_HARPOON_SHOT_3) | (pSpell->Id == SPELL_HARPOON_SHOT_4))
- + {
- + sLog.outError("Harpoon hit on controller");
- + HarpoonCounter++;
- + }
- + }
- +
- + void JustDied(Unit* /*killer*/)
- + {
- + _JustDied();
- + }
- +
- + void DoAction(const int32 action)
- + {
- + switch(action)
- + {
- + case ACTION_HARPOON_DESTROY:
- + sLog.outError("ACTION_HARPOON_DESTROY");
- + for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
- + {
- + if (Harpoon[n])
- + Harpoon[n]->CastSpell(Harpoon[n], SPELL_FLAMED, true);
- +
- + events.ScheduleEvent(EVENT_HARPOON, 60000);
- + }
- + break;
- + }
- + }
- +
- + void UpdateAI(const uint32 diff)
- + {
- + if (instance->GetBossState(TYPE_RAZORSCALE) != IN_PROGRESS)
- + return;
- +
- + events.Update(diff);
- +
- + /*if (me->hasUnitState(UNIT_STAT_CASTING))
- + return;*/
- +
- + if (HarpoonCounter == RAID_MODE(2,4))
- + {
- + HarpoonCounter = 0;
- +
- + if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, instance->GetData64(TYPE_RAZORSCALE)))
- + {
- + Razorscale->AI()->DoAction(ACTION_HARPOON_ACTIVATED);
- + }
- + }
- +
- + while (uint32 eventId = events.ExecuteEvent())
- + {
- + switch (eventId)
- + {
- + case EVENT_HARPOON:
- + {
- + if (Harpoon[0])
- + Harpoon[0]->MonsterTextEmote(EMOTE_HARPOON, 0, true);
- + for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
- + {
- + if (Harpoon[n])
- + {
- + Harpoon[n]->SetFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
- + Harpoon[n]->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- + Harpoon[n]->SetDisplayId(22524);
- + }
- + }
- + events.CancelEvent(EVENT_HARPOON);
- + break;
- + }
- + default:
- + break;
- + }
- + }
- + }
- + };
- +
- + CreatureAI* GetAI(Creature* pCreature) const
- + {
- + return new boss_razorscale_controllerAI(pCreature);
- + }
- +};
- +
- class boss_razorscale : public CreatureScript
- {
- public:
- @@ -177,7 +317,6 @@
- uint32 EnrageTimer;
- uint32 FlyCount;
- - Creature* Harpoon[4];
- bool PermaGround;
- bool Enraged;
- @@ -187,14 +326,15 @@
- me->SetFlying(true);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
- me->SetReactState(REACT_PASSIVE);
- - PermaGround = false;
- + PermaGround = false;
- }
- void EnterCombat(Unit* /*who*/)
- {
- _EnterCombat();
- - for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
- - Harpoon[n] = me->SummonCreature(NPC_HARPOON, PosHarpoon[n], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 0);
- + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_RAZORSCALE_CONTROL)))
- + if (!controller->isInCombat())
- + DoZoneInCombat(controller);
- me->SetSpeed(MOVE_FLIGHT, 3.0f, true);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- me->SetReactState(REACT_PASSIVE);
- @@ -216,7 +356,7 @@
- if (FlyCount <= 2)
- instance->DoCompleteAchievement(ACHIEVEMENT_QUICK_SHAVE);
- }
- - }
- + }
- void UpdateAI(const uint32 diff)
- {
- @@ -236,7 +378,7 @@
- DoCast(me, SPELL_BERSERK);
- Enraged = true;
- }
- - else EnrageTimer -= diff;
- + else EnrageTimer -= diff;
- if (phase == PHASE_GROUND)
- {
- @@ -256,27 +398,20 @@
- events.ScheduleEvent(EVENT_FIREBALL, 7000, 0, PHASE_FLIGHT);
- events.ScheduleEvent(EVENT_DEVOURING, 10000, 0, PHASE_FLIGHT);
- events.ScheduleEvent(EVENT_SUMMON, 5000, 0, PHASE_FLIGHT);
- - events.ScheduleEvent(EVENT_GROUND, 75000, 0, PHASE_FLIGHT);
- ++FlyCount;
- return;
- case EVENT_LAND:
- + sLog.outError("event land called");
- me->SetFlying(false);
- me->NearTeleportTo(586.966f, -175.534f, 391.517f, 1.692f);
- DoCast(me, SPELL_STUN, true);
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
- if (Creature *pCommander = me->GetCreature(*me, instance->GetData64(DATA_EXP_COMMANDER)))
- pCommander->AI()->DoAction(ACTION_GROUND_PHASE);
- - events.ScheduleEvent(EVENT_HARPOON, 0, 0, PHASE_GROUND);
- events.ScheduleEvent(EVENT_BREATH, 30000, 0, PHASE_GROUND);
- events.ScheduleEvent(EVENT_BUFFET, 33000, 0, PHASE_GROUND);
- events.ScheduleEvent(EVENT_FLIGHT, 35000, 0, PHASE_GROUND);
- return;
- - case EVENT_HARPOON:
- - for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
- - if (Harpoon[n])
- - Harpoon[n]->CastSpell(me, SPELL_HARPOON, true);
- - events.ScheduleEvent(EVENT_HARPOON, 1500, 0, PHASE_GROUND);
- - return;
- case EVENT_BREATH:
- me->MonsterTextEmote(EMOTE_BREATH, 0, true);
- DoCastAOE(SPELL_FLAMEBREATH);
- @@ -285,9 +420,8 @@
- return;
- case EVENT_BUFFET:
- DoCastAOE(SPELL_WINGBUFFET);
- - for (uint8 n = 0; n < RAID_MODE(2,4); ++n)
- - if (Harpoon[n])
- - Harpoon[n]->CastSpell(Harpoon[n], SPELL_FLAMED, true);
- + if (Creature* controller = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_RAZORSCALE_CONTROL)))
- + controller->AI()->DoAction(ACTION_HARPOON_DESTROY);
- events.CancelEvent(EVENT_BUFFET);
- return;
- }
- @@ -337,14 +471,6 @@
- {
- switch(eventId)
- {
- - case EVENT_GROUND:
- - phase = PHASE_GROUND;
- - events.SetPhase(PHASE_GROUND);
- - if (Harpoon[0])
- - Harpoon[0]->MonsterTextEmote(EMOTE_HARPOON, 0, true);
- - me->GetMotionMaster()->MovePoint(0,RazorGround);
- - events.ScheduleEvent(EVENT_LAND, 5500, 0, PHASE_GROUND);
- - return;
- case EVENT_FIREBALL:
- if (Unit *pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 200, true))
- DoCast(pTarget, SPELL_FIREBALL);
- @@ -376,6 +502,7 @@
- me->SetSpeed(MOVE_FLIGHT, 1.0f, true);
- PermaGround = true;
- DoCastAOE(SPELL_FLAMEBREATH);
- + instance->SetBossState(DATA_RAZORSCALE_CONTROL, NOT_STARTED);
- events.ScheduleEvent(EVENT_FLAME, 15000, 0, PHASE_PERMAGROUND);
- events.RescheduleEvent(EVENT_DEVOURING, 15000, 0, PHASE_PERMAGROUND);
- events.RescheduleEvent(EVENT_BREATH, 20000, 0, PHASE_PERMAGROUND);
- @@ -408,6 +535,11 @@
- me->SetReactState(REACT_AGGRESSIVE);
- DoZoneInCombat();
- break;
- + case ACTION_HARPOON_ACTIVATED:
- + sLog.outError("doaction called");
- + me->GetMotionMaster()->MovePoint(0,RazorGround);
- + events.ScheduleEvent(EVENT_LAND, 5000, 0, PHASE_GROUND);
- + break;
- }
- }
- };
- @@ -587,7 +719,7 @@
- void Reset()
- {
- - MoleMachine = me->SummonGameObject(GOB_MOLE_MACHINE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(),
- + MoleMachine = me->SummonGameObject(GO_MOLE_MACHINE, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(),
- float(urand(0, 6)), 0, 0, 0, 0, 300);
- if (MoleMachine)
- MoleMachine->SetGoState(GO_STATE_ACTIVE);
- @@ -642,9 +774,10 @@
- struct npc_devouring_flameAI : public Scripted_NoMovementAI
- {
- npc_devouring_flameAI(Creature* pCreature) : Scripted_NoMovementAI(pCreature)
- - {
- - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_PACIFIED);
- + {
- me->SetDisplayId(11686);
- + me->SetReactState(REACT_PASSIVE);
- + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED);
- }
- void Reset()
- @@ -817,9 +950,120 @@
- };
- +class boss_razorscale_harpoon : public CreatureScript
- +{
- +public:
- + boss_razorscale_harpoon() : CreatureScript("boss_razorscale_harpoon") {}
- +
- + CreatureAI* GetAI(Creature* pCreature) const
- + {
- + return new boss_razorscale_harpoonAI (pCreature);
- + }
- +
- + struct boss_razorscale_harpoonAI : public PassiveAI
- + {
- + boss_razorscale_harpoonAI(Creature *pCreature) : PassiveAI(pCreature)
- + {
- + pInstance = pCreature->GetInstanceScript();
- + }
- +
- + InstanceScript *pInstance;
- +
- + void DoAction(const int32 param)
- + {
- + if (param == EVENT_SPELLCLICK)
- + {
- + me->RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPELLCLICK);
- + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
- + if (Creature* Razorscale = ObjectAccessor::GetCreature(*me, pInstance->GetData64(TYPE_RAZORSCALE)))
- + me->CastSpell(Razorscale, SPELL_HARPOON_VISUAL, true);
- + }
- + }
- + };
- +
- +};
- +
- +class spell_razorscale_devouring_flame : public SpellScriptLoader
- +{
- + public:
- + spell_razorscale_devouring_flame() : SpellScriptLoader("spell_razorscale_devouring_flame") { }
- +
- + class spell_razorscale_devouring_flame_AuraScript : public AuraScript
- + {
- + PrepareAuraScript(spell_razorscale_devouring_flame_AuraScript)
- +
- + bool Validate(SpellEntry const * /*spellEntry*/)
- + {
- + if (!sSpellStore.LookupEntry(SPELL_DEVOURING_FLAME_DAMAGE))//64704 10m
- + return false;
- + if (!sSpellStore.LookupEntry(SPELL_DEVOURING_FLAME_TRIGGER))//64709 10m
- + return false;
- + return true;
- + }
- +
- + void HandleEffectPeriodic(AuraEffect const * aurEff, AuraApplication const * aurApp)
- + {
- + Unit* aurEffCaster = aurEff->GetCaster();
- + if (!aurEffCaster)
- + return;
- +
- + Unit * target = aurApp->GetTarget();
- + aurEffCaster->CastSpell(target, SPELL_DEVOURING_FLAME_DAMAGE, true);
- + }
- +
- + void Register()
- + {
- + OnEffectPeriodic += AuraEffectPeriodicFn(spell_razorscale_devouring_flame_AuraScript::HandleEffectPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
- + }
- + };
- +
- + AuraScript* GetAuraScript() const
- + {
- + return new spell_razorscale_devouring_flame_AuraScript();
- + }
- +};
- +
- +class spell_razorscale_harpoon_firestate : public SpellScriptLoader
- +{
- + public:
- + spell_razorscale_harpoon_firestate() : SpellScriptLoader("spell_razorscale_harpoon_firestate") { }
- +
- + class spell_razorscale_harpoon_firestate_AuraScript : public AuraScript
- + {
- + PrepareAuraScript(spell_razorscale_harpoon_firestate_AuraScript)
- +
- + bool Validate(SpellEntry const * /*spellEntry*/)
- + {
- + if (!sSpellStore.LookupEntry(SPELL_FLAMED))
- + return false;
- + return true;
- + }
- +
- + void HandleEffectRemove(AuraEffect const * /*aurEff*/, AuraApplication const * aurApp, AuraEffectHandleModes /*mode*/)
- + {
- + Unit * target = aurApp->GetTarget();
- + if (!target)
- + return;
- + if (target->GetEntry() == NPC_HARPOON)
- + target->SetDisplayId(11686);
- + }
- +
- + void Register()
- + {
- + OnEffectRemove += AuraEffectRemoveFn(spell_razorscale_harpoon_firestate_AuraScript::HandleEffectRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL);
- + }
- + };
- +
- + AuraScript* GetAuraScript() const
- + {
- + return new spell_razorscale_harpoon_firestate_AuraScript();
- + }
- +};
- +
- void AddSC_boss_razorscale()
- {
- + new boss_razorscale_controller();
- new boss_razorscale();
- new npc_expedition_commander();
- new npc_mole_machine_trigger();
- @@ -827,4 +1071,7 @@
- new npc_darkrune_watcher();
- new npc_darkrune_guardian();
- new npc_darkrune_sentinel();
- + new boss_razorscale_harpoon();
- + new spell_razorscale_devouring_flame();
- + new spell_razorscale_harpoon_firestate();
- }
- \ No newline at end of file
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement