Skip to content

Commit

Permalink
Scripts/Instance: The Stonecore
Browse files Browse the repository at this point in the history
  • Loading branch information
Mihapro committed Nov 4, 2014
1 parent 4fde974 commit 50bf6ca
Show file tree
Hide file tree
Showing 10 changed files with 3,155 additions and 0 deletions.
350 changes: 350 additions & 0 deletions sql/updates/world/2014_11_05_00_world.sql

Large diffs are not rendered by default.

12 changes: 12 additions & 0 deletions src/server/game/Scripting/ScriptLoader.cpp
Expand Up @@ -677,6 +677,12 @@ void AddSC_zangarmarsh();

// Maelstrom
void AddSC_kezan();
void AddSC_instance_stonecore(); // Stonecore
void AddSC_stonecore();
void AddSC_boss_corborus();
void AddSC_boss_slabhide();
void AddSC_boss_ozruk();
void AddSC_boss_high_priestess_azil();

// Events
void AddSC_event_childrens_week();
Expand Down Expand Up @@ -1411,6 +1417,12 @@ void AddMaelstromScripts()
{
#ifdef SCRIPTS
AddSC_kezan();
AddSC_instance_stonecore(); // Stonecore
AddSC_stonecore();
AddSC_boss_corborus();
AddSC_boss_slabhide();
AddSC_boss_ozruk();
AddSC_boss_high_priestess_azil();
#endif
}

Expand Down
7 changes: 7 additions & 0 deletions src/server/scripts/Maelstrom/CMakeLists.txt
Expand Up @@ -9,6 +9,13 @@
set(scripts_STAT_SRCS
${scripts_STAT_SRCS}
Maelstrom/kezan.cpp
Maelstrom/Stonecore/instance_stonecore.cpp
Maelstrom/Stonecore/stonecore.cpp
Maelstrom/Stonecore/stonecore.h
Maelstrom/Stonecore/boss_corborus.cpp
Maelstrom/Stonecore/boss_slabhide.cpp
Maelstrom/Stonecore/boss_ozruk.cpp
Maelstrom/Stonecore/boss_high_priestess_azil.cpp
)

message(" -> Prepared: The Maelstrom")
319 changes: 319 additions & 0 deletions src/server/scripts/Maelstrom/Stonecore/boss_corborus.cpp
@@ -0,0 +1,319 @@
/*
* Copyright (C) 2008-2014 TrinityCore <http://www.trinitycore.org/>
*
* 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
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include "ScriptMgr.h"
#include "ScriptedCreature.h"
#include "CreatureGroups.h"
#include "stonecore.h"

// TO-DO:
// Find heroic sniffs and script spawning Crystal Shards on heroic mode.

enum Spells
{
// Corborus intro
SPELL_TWILIGHT_DOCUMENTS = 93167,
SPELL_RING_WYRM_CHARGE = 81237,
SPELL_DOOR_BREAK = 81232, // cast by World Trigger 22515

// Corborus boss
SPELL_DAMPENING_WAVE = 82415,
SPELL_CRYSTAL_BARRAGE = 86881, // 81638 triggers 81637
// SPELL_CRYSTAL_BARRAGE_SHARD = 92012, // heroic only, summons Crystal Shard (TO-DO!)
SPELL_CLEAR_ALL_DEBUFFS = 34098,
SPELL_SUBMERGE = 81629,
SPELL_TRASHING_CHARGE_TELEPORT = 81839, // triggers 81864
// SPELL_TRASHING_CHARGE_TELEPORT_2= 81838, // dummy, targets all players, threat update packet follows
SPELL_SUMMON_TRASHING_CHARGE = 81816,
SPELL_TRASHING_CHARGE_VISUAL = 81801, // cast time 3.5 sec
SPELL_TRASHING_CHARGE_EFFECT = 81828, // 40 yard radius
SPELL_EMERGE = 81948,

// Rock Borer npc (43917)
SPELL_ROCK_BORER_EMERGE = 82185,
SPELL_ROCK_BORE = 80028,
};

enum NPCs
{
NPC_TRASHING_CHARGE = 43743,
// NPC_CRYSTAL_SHARD = 49267, // 49473
};

enum Events
{
EVENT_NONE,

// Corborus intro
EVENT_CORBORUS_CHARGE,
EVENT_CORBORUS_KNOCKBACK,
EVENT_CORBORUS_FACEPLAYERS,

// Corborus boss
EVENT_DAMPENING_WAVE,
EVENT_CRYSTAL_BARRAGE,
EVENT_SUBMERGE,
EVENT_TELEPORT,
EVENT_TRASHING_CHARGE,
EVENT_SUMMON_BEETLE,
EVENT_EMERGE,
EVENT_ATTACK,

// Rock Borer
EVENT_EMERGED,
EVENT_ROCK_BORE,
};

class boss_corborus : public CreatureScript
{
public:
boss_corborus() : CreatureScript("boss_corborus") { }

struct boss_corborusAI : public BossAI
{
boss_corborusAI(Creature* creature) : BossAI(creature, DATA_CORBORUS)
{
stateIntro = NOT_STARTED;
}

void Reset() override
{
_Reset();
countTrashingCharge = 0;
events.ScheduleEvent(EVENT_DAMPENING_WAVE, 10000);
events.ScheduleEvent(EVENT_CRYSTAL_BARRAGE, 15000);
events.ScheduleEvent(EVENT_SUBMERGE, 36000);
}

void DoAction(int32 action) override
{
switch (action)
{
case ACTION_CORBORUS_INTRO: // Executes Corborus intro event
{
if (stateIntro != NOT_STARTED)
return;

stateIntro = IN_PROGRESS;

if (Creature* Millhouse = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MILLHOUSE_MANASTORM)))
{
Millhouse->InterruptNonMeleeSpells(true);
Millhouse->RemoveAllAuras();
Millhouse->HandleEmoteCommand(EMOTE_ONESHOT_KNOCKDOWN);
}

events.ScheduleEvent(EVENT_CORBORUS_CHARGE, 1000);
break;
}
default:
break;
}
}

void UpdateAI(uint32 diff) override
{
if (!UpdateVictim() && stateIntro != IN_PROGRESS)
return;

events.Update(diff);

if (me->HasUnitState(UNIT_STATE_CASTING))
return;

while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CORBORUS_CHARGE:
// Face Millhouse and other mobs
instance->SetData(DATA_MILLHOUSE_EVENT_FACE, 0);

// Open rock gate and cast visual from nearby worldtrigger
instance->HandleGameObject(instance->GetGuidData(GAMEOBJECT_CORBORUS_ROCKDOOR), true);
if (Creature* worldtrigger = me->FindNearestCreature(NPC_WORLDTRIGGER, 60.0f))
worldtrigger->CastSpell(worldtrigger, SPELL_DOOR_BREAK, true);

// Make Corborus charge
me->CastSpell(me, SPELL_RING_WYRM_CHARGE, true);

events.ScheduleEvent(EVENT_CORBORUS_KNOCKBACK, 1000);
break;
case EVENT_CORBORUS_KNOCKBACK:
// Spawn Twilight Documents (quest gameobject)
if (Creature* Millhouse = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_MILLHOUSE_MANASTORM)))
Millhouse->CastSpell(Millhouse, SPELL_TWILIGHT_DOCUMENTS, true);

// Knockback Millhouse and other mobs
instance->SetData(DATA_MILLHOUSE_EVENT_KNOCKBACK, 0);

events.ScheduleEvent(EVENT_CORBORUS_FACEPLAYERS, 2000);
break;
case EVENT_CORBORUS_FACEPLAYERS:
// Face Corborus to players and set new home position
me->SetFacingTo(3.176499f);
me->SetHomePosition(1154.55f, 878.843f, 284.963f, 3.176499f);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC);

// Despawn Millhouse and all trash
instance->SetData(DATA_MILLHOUSE_EVENT_DESPAWN, 0);

stateIntro = DONE;
break;
case EVENT_DAMPENING_WAVE:
DoCastVictim(SPELL_DAMPENING_WAVE);
events.ScheduleEvent(EVENT_DAMPENING_WAVE, 15000);
break;
case EVENT_CRYSTAL_BARRAGE:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
DoCast(target, SPELL_CRYSTAL_BARRAGE);
events.ScheduleEvent(EVENT_CRYSTAL_BARRAGE, 10000);
break;
case EVENT_SUBMERGE:
events.RescheduleEvent(EVENT_DAMPENING_WAVE, 35000);
events.RescheduleEvent(EVENT_CRYSTAL_BARRAGE, 30000);
events.RescheduleEvent(EVENT_SUBMERGE, 100000);

me->SetReactState(REACT_PASSIVE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
DoCast(me, SPELL_CLEAR_ALL_DEBUFFS);
me->AttackStop();

DoCast(me, SPELL_SUBMERGE);

countTrashingCharge = 0;
events.ScheduleEvent(EVENT_TELEPORT, 500);
break;
case EVENT_TELEPORT:
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100.0f, true))
DoCast(target, SPELL_TRASHING_CHARGE_TELEPORT);
countTrashingCharge += 1;
if (countTrashingCharge <= 4)
events.ScheduleEvent(EVENT_TRASHING_CHARGE, 1000);
else
events.ScheduleEvent(EVENT_EMERGE, 2500);
break;
case EVENT_TRASHING_CHARGE:
DoCast(me, SPELL_SUMMON_TRASHING_CHARGE);
DoCast(me, SPELL_TRASHING_CHARGE_VISUAL);
events.ScheduleEvent(EVENT_TELEPORT, 5000);
break;
case EVENT_EMERGE:
me->RemoveAllAuras();
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
DoCast(me, SPELL_EMERGE);
events.ScheduleEvent(EVENT_ATTACK, 2500);
break;
case EVENT_ATTACK:
me->SetReactState(REACT_AGGRESSIVE);
break;
default:
break;
}
}

DoMeleeAttackIfReady();
}

void JustSummoned(Creature* summon) override
{
if (summon->GetEntry() != NPC_TRASHING_CHARGE)
return;

summon->SetReactState(REACT_PASSIVE);
summon->CastSpell(summon, SPELL_TRASHING_CHARGE_EFFECT);
summon->DespawnOrUnsummon(6000);
}

private:
EncounterState stateIntro;
uint32 countTrashingCharge;
};

CreatureAI* GetAI(Creature* creature) const override
{
return GetInstanceAI<boss_corborusAI>(creature);
}
};

// 43391 - Rock Borer
class npc_rock_borer : public CreatureScript
{
public:
npc_rock_borer() : CreatureScript("npc_rock_borer") { }

struct npc_rock_borerAI : public ScriptedAI
{
npc_rock_borerAI(Creature* creature) : ScriptedAI(creature)
{
me->SetDisableGravity(true);
me->SetReactState(REACT_PASSIVE);
events.ScheduleEvent(EVENT_EMERGED, 1200);
events.ScheduleEvent(EVENT_ROCK_BORE, urand(15000, 20000)); // Need sniffs for this timer
}

void IsSummonedBy(Unit* summoner) override
{
me->SetInCombatState(false, summoner);
DoCast(SPELL_ROCK_BORER_EMERGE);
}

void UpdateAI(uint32 diff) override
{
if (!UpdateVictim() && me->GetReactState() != REACT_PASSIVE)
return;

events.Update(diff);

if (me->HasUnitState(UNIT_STATE_CASTING))
return;

while (uint32 eventId = events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_EMERGED:
me->RemoveAurasDueToSpell(SPELL_ROCK_BORER_EMERGE);
me->SetReactState(REACT_AGGRESSIVE);
break;
case EVENT_ROCK_BORE:
DoCast(SPELL_ROCK_BORE);
events.ScheduleEvent(EVENT_ROCK_BORE, urand(15000, 20000)); // Need sniffs for this timer
break;
default:
break;
}
}

DoMeleeAttackIfReady();
}

private:
EventMap events;
};

CreatureAI* GetAI(Creature* creature) const override
{
return GetInstanceAI<npc_rock_borerAI>(creature);
}
};

void AddSC_boss_corborus()
{
new boss_corborus();
new npc_rock_borer();
}

4 comments on commit 50bf6ca

@Exodius
Copy link
Contributor

@Exodius Exodius commented on 50bf6ca Nov 5, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not a +1...

It's a +1000...

@NephariusAT
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

awesome work!

@digz6666
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Awesome!

@burnham
Copy link
Contributor

@burnham burnham commented on 50bf6ca Nov 6, 2014

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good job, was time to update.

Please sign in to comment.