diff --git a/src/server/scripts/Draenor/Dungeons/BloodmaulSlagMines/boss_slave_watcher_crushto.cpp b/src/server/scripts/Draenor/Dungeons/BloodmaulSlagMines/boss_slave_watcher_crushto.cpp
index 03531df..a409382 100644
--- a/src/server/scripts/Draenor/Dungeons/BloodmaulSlagMines/boss_slave_watcher_crushto.cpp
+++ b/src/server/scripts/Draenor/Dungeons/BloodmaulSlagMines/boss_slave_watcher_crushto.cpp
@@ -15,10 +15,306 @@
* with this program. If not, see .
*/
-#include "ScriptMgr.h"
-#include "ScriptedCreature.h"
+#include "bloodmaul_slag_mines.h"
+#include "GridNotifiers.h"
+#include "Player.h"
+
+enum eCreatures
+{
+ MOB_CAPTURED_MINER_HOSTILE = 74357,
+ MOB_CAPTURED_MINER_FRIENDLY = 83725,
+ NPC_EARTH_CRUSH_STALKER = 83650,
+};
+
+enum eSpells
+{
+ /// Slave Watcher Crushto
+ // Earth Crush
+ SPELL_EARTH_CRUSH = 153679, // Many spells with the same name, why is that ? TARGET_UNIT_CASTER_ENEMY_CONE
+ SPELL_EARTH_CRUSH_SUMMON_STALKER = 153735, // Summon the giant rock (I think)
+
+ // Ferocious Yell / Weakened Will
+ SPELL_FEROCIOUS_YELL = 150759, // Many effects, trigger 150811
+ SPELL_WEAKENED_WILL = 150811, // Force target to flee upon reaching 3 stacks
+ SPELL_SHATTERED_WILL = 150813, // Flee spell related to Weakened Will
+
+ // Wild Slam / Crushing Leap
+ SPELL_WILD_SLAM = 150753, // Jumps to a target right after
+ SPELL_CRUSHING_LEAP_SELECTOR = 150745, // Select a target + dummy on it
+ SPELL_CRUSHING_LEAP_JUMP = 150746, // Jump to a target
+ SPELL_CRUSHING_LEAP_FIXATE = 150818, // Periodically trigger 151270 with a base value (aggro amount ?)
+ SPELL_CRUSHING_LEAP_AGGRO = 151270, // Add aggro to miners (dummy)
+ SPELL_CRUSHING_LEAP_CONTROL = 152176, // Visual of being controlled ?
+ // Crushing Leap doesn't seem to do something special, it just applies an aura forcing the miners to focus on this target
+
+ // Raise the miners
+ SPELL_RAISE_THE_MINERS = 150801, // Summon the npcs via triggered spell in dummy
+ SPELL_RAISE_THE_MINERS_ALLIANCE = 150779, // Alliance version
+ SPELL_RAISE_THE_MINERS_HORDE = 150775, // Horde version
+ SPELL_RAISE_THE_MINERS_BOTH = 150780, // Hostile to both
+
+ /// Captured Miners
+ // Traumatic Strike
+ SPELL_TRAUMATIC_STRIKE_PLAYERS = 150807, // Used during player phase
+ SPELL_TRAUMATIC_STRIKE_BOSS = 151092, // Used when miners turn against the boss
+};
+
+enum eEvents
+{
+ /// Slave Watcher Crushto
+ EVENT_EARTH_CRUSH = 1,
+ EVENT_FEROCIOUS_YELL = 2,
+ EVENT_WILD_SLAM = 3,
+ EVENT_CRUSHING_LEAP = 4,
+ EVENT_RAISE_THE_MINERS = 5,
+
+ /// Captured Miners
+ EVENT_CHECK_FACTION = 6, // Roll a chance to become friendly
+ EVENT_TRAUMATIC_STRIKE = 7,
+};
+
+enum eTalks
+{
+ // TODO
+};
+
+class boss_slave_watcher_crushto : public CreatureScript
+{
+public:
+ boss_slave_watcher_crushto() : CreatureScript("boss_slave_watcher_crushto")
+ {
+
+ }
+
+ class boss_slave_watcher_crushto_AI : public ScriptedAI
+ {
+ public:
+ boss_slave_watcher_crushto_AI(Creature* creature) :
+ ScriptedAI(creature), m_instance(creature->GetInstanceScript())
+ {
+ m_events.Reset();
+ }
+
+ void Reset()
+ {
+ m_events.Reset();
+ m_instance->SetBossState(DATA_CRUSHTO, NOT_STARTED);
+
+ CleanArea();
+ }
+
+ void EnterCombat(Unit *target)
+ {
+ DoZoneInCombat();
+
+ m_events.ScheduleEvent(EVENT_EARTH_CRUSH, 10 * IN_MILLISECONDS);
+ m_events.ScheduleEvent(EVENT_FEROCIOUS_YELL, 7 * IN_MILLISECONDS);
+ m_events.ScheduleEvent(EVENT_WILD_SLAM, 15 * IN_MILLISECONDS);
+ m_events.ScheduleEvent(EVENT_RAISE_THE_MINERS, 20 * IN_MILLISECONDS);
+
+ m_instance->SetBossState(DATA_CRUSHTO, IN_PROGRESS);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ m_events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = m_events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_EARTH_CRUSH:
+ DoCast(me, SPELL_EARTH_CRUSH_SUMMON_STALKER);
+ DoCastAOE(SPELL_EARTH_CRUSH);
+ m_events.ScheduleEvent(EVENT_EARTH_CRUSH, urand(10, 20) * IN_MILLISECONDS);
+ break;
+
+ case EVENT_FEROCIOUS_YELL:
+ DoCastAOE(SPELL_FEROCIOUS_YELL);
+ m_events.ScheduleEvent(EVENT_FEROCIOUS_YELL, urand(12, 18) * IN_MILLISECONDS);
+ break;
+
+ case EVENT_WILD_SLAM:
+ DoCastAOE(SPELL_WILD_SLAM);
+ // Add a five second delay to not execute an event while jumping
+ m_events.DelayEvents(5 * IN_MILLISECONDS);
+ m_events.ScheduleEvent(EVENT_CRUSHING_LEAP, 1 * IN_MILLISECONDS);
+ break;
+
+ case EVENT_CRUSHING_LEAP:
+ DoCastAOE(SPELL_CRUSHING_LEAP_SELECTOR);
+ m_events.ScheduleEvent(EVENT_WILD_SLAM, urand(20, 25) * IN_MILLISECONDS);
+ break;
+
+ case EVENT_RAISE_THE_MINERS:
+ DoCast(me, SPELL_RAISE_THE_MINERS);
+ m_events.ScheduleEvent(EVENT_RAISE_THE_MINERS, urand(12, 18) * IN_MILLISECONDS);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ void JustDied(Unit *killer)
+ {
+ m_instance->SetBossState(DATA_CRUSHTO, DONE);
+
+ CleanArea();
+ }
+
+ void MovementInform(uint32 motionType, uint32 motionPoint)
+ {
+ /* Upon landing after Crushing Leap, force the miners to attack the targets
+ * so apply the needed auras on the players. */
+ if (motionType == EFFECT_MOTION_TYPE && motionPoint == EVENT_JUMP)
+ {
+ std::list closests;
+ me->GetPlayerListInGrid(closests, 10.0f);
+
+ for (Player* player : closests)
+ player->CastSpell(player, SPELL_CRUSHING_LEAP_FIXATE, true);
+ }
+ }
+
+ private:
+ EventMap m_events;
+ InstanceScript* m_instance;
+
+ inline void CleanArea() const
+ {
+
+ }
+
+ void RemoveCreaturesByEntry(uint32 entry) const
+ {
+ std::list creatures;
+ me->GetCreatureListWithEntryInGrid(creatures, entry, 500.0f);
+
+ for (Creature* creature : creatures)
+ creature->DisappearAndDie();
+ }
+ };
+
+ CreatureAI* GetAI(Creature *creature) const
+ {
+ return GetBloodmaulSlagAI(creature);
+ }
+};
+
+class mob_captured_miner : public CreatureScript
+{
+public:
+ mob_captured_miner() : CreatureScript("mob_captured_miner")
+ {
+
+ }
+
+ class mob_captured_miner_AI : public ScriptedAI
+ {
+ public:
+ mob_captured_miner_AI(Creature* creature) :
+ ScriptedAI(creature), m_instance(creature->GetInstanceScript())
+ {
+ m_events.Reset();
+ }
+
+ enum eFactions
+ {
+ FACTION_HOSTILE = 14,
+ FACTION_FRIENDLY = 35,
+ };
+
+ void Reset()
+ {
+ m_events.Reset();
+ if (me->getFaction() == FACTION_HOSTILE)
+ m_events.ScheduleEvent(EVENT_CHECK_FACTION, 10 * IN_MILLISECONDS);
+ }
+
+ void EnterCombat(Unit *target)
+ {
+ m_events.ScheduleEvent(EVENT_TRAUMATIC_STRIKE, 10 * IN_MILLISECONDS);
+ }
+
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
+
+ m_events.Update(diff);
+
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
+
+ while (uint32 eventId = m_events.ExecuteEvent())
+ {
+ switch (eventId)
+ {
+ case EVENT_CHECK_FACTION:
+ if (roll_chance_i(10))
+ {
+ me->UpdateEntry(MOB_CAPTURED_MINER_FRIENDLY);
+ //2fix if (Creature* crushto = ObjectAccessor::GetCreature(*me, m_instance->GetData64(DATA_CRUSHTO)))
+ //2fix me->SetInCombatWith(crushto);
+ }
+ else
+ {
+ m_events.ScheduleEvent(EVENT_CHECK_FACTION, 10 * IN_MILLISECONDS);
+ }
+ break;
+
+ case EVENT_TRAUMATIC_STRIKE:
+ switch (me->getFaction())
+ {
+ case FACTION_HOSTILE:
+ DoCastVictim(SPELL_TRAUMATIC_STRIKE_PLAYERS);
+ break;
+
+ case FACTION_FRIENDLY:
+ DoCastVictim(SPELL_TRAUMATIC_STRIKE_BOSS);
+ break;
+
+ default:
+ break;
+ }
+ m_events.ScheduleEvent(EVENT_TRAUMATIC_STRIKE, 10 * IN_MILLISECONDS);
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ DoMeleeAttackIfReady();
+ }
+
+ private:
+ EventMap m_events;
+ InstanceScript* m_instance;
+ };
+
+ CreatureAI* GetAI(Creature *creature) const
+ {
+ return GetBloodmaulSlagAI(creature);
+ }
+};
+
+
void AddSC_boss_slave_watcher_crushto()
{
-
+ new boss_slave_watcher_crushto();
+ new mob_captured_miner();
+
}
+