Files
Viano-Core/src/server/scripts/EasternKingdoms/Deadmines/deadmines.cpp
T

676 lines
26 KiB
C++

/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* 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 "deadmines.h"
#include "Spell.h"
#include "Player.h"
#include "WorldSession.h"
#include "GameObjectAI.h"
#include "GameObject.h"
#include "Vehicle.h"
#include "MotionMaster.h"
#include "InstanceScript.h"
#include "TemporarySummon.h"
#include "SpellScript.h"
#include "SpellInfo.h"
namespace Deadmines
{
enum DefiasWatcher
{
SPELL_ON_FIRE = 91737,
SPELL_EXPLOSIVE_SUICIDE = 91738,
SPELL_ENERGIZE = 89132,
SPELL_CLEAVE = 90980,
FACTION_CONTROLLABLE = 1816,
EVENT_CLEAVE = 1
};
struct npc_deadmines_defias_watcher : public ScriptedAI
{
npc_deadmines_defias_watcher(Creature* creature) : ScriptedAI(creature), _isOnFire(false) { }
void JustEngagedWith(Unit* /*who*/) override
{
_events.ScheduleEvent(EVENT_CLEAVE, 3s + 500ms);
}
void Reset() override
{
me->SetFullHealth();
}
void DamageTaken(Unit* /*attacker*/, uint32& damage) override
{
if (!_isOnFire && me->HealthBelowPctDamaged(30, damage))
{
me->GetThreatManager().ClearAllThreat();
me->CombatStop();
me->SetFaction(FACTION_CONTROLLABLE);
DoCastSelf(SPELL_ON_FIRE);
DoCastAOE(SPELL_ENERGIZE);
me->setRegeneratingHealth(false);
_isOnFire = true;
}
}
void UpdateAI(uint32 diff) override
{
if (!UpdateVictim())
return;
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_CLEAVE:
DoCastVictim(SPELL_CLEAVE);
_events.Repeat(4s, 5s);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
bool _isOnFire;
EventMap _events;
};
enum VanessasTrapBunny
{
EVENT_MOVE_DOWN = 1,
EVENT_SUMMON_VALVES,
EVENT_ANNOUNCE_VALVES,
SAY_ANNOUNCE_ACTIVATE_VALVES = 0,
POINT_MOLTEN_MAGMA = 1,
};
Position const trapBunnyMoveDownPos = { -205.7569f, -579.0972f, 35.98623f };
Position const steamValvePositions[] =
{
{ -199.1944f, -583.1545f, 37.33158f, 2.600541f },
{ -201.809f, -572.6215f, 37.33158f, 4.171337f },
{ -209.6823f, -585.8924f, 37.33158f, 0.9599311f },
{ -212.3524f, -575.3976f, 37.33158f, 5.707227f }
};
class npc_deadmines_vanessas_trap_bunny : public CreatureScript
{
public:
npc_deadmines_vanessas_trap_bunny() : CreatureScript("npc_deadmines_vanessas_trap_bunny") { }
struct npc_deadmines_vanessas_trap_bunnyAI : public ScriptedAI
{
npc_deadmines_vanessas_trap_bunnyAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript())
{
Inizialize();
}
void Inizialize()
{
_movementStarted = false;
}
void Reset() override
{
Inizialize();
}
void PassengerBoarded(Unit* passenger, int8 /*seatId*/, bool apply) override
{
if (!passenger)
return;
if (apply && passenger->GetTypeId() == TYPEID_PLAYER && !_movementStarted)
{
passenger->SetDisableGravity(true);
_events.ScheduleEvent(EVENT_SUMMON_VALVES, Seconds(2) + Milliseconds(900));
_events.ScheduleEvent(EVENT_MOVE_DOWN, Seconds(6));
_movementStarted = true;
}
else if (!apply)
passenger->SetDisableGravity(false);
}
void DoAction(int32 action) override
{
if (action == ACTION_EJECT_PLAYERS)
{
if (Vehicle* vehicle = me->GetVehicleKit())
for (uint8 i = 0; i < 5; i++)
if (Unit* passenger = vehicle->GetPassenger(i))
{
passenger->ExitVehicle(&trapBunnyMoveDownPos);
DoCast(passenger, SPELL_FORCE_MAGMA_TRAP_THROW, true);
}
}
}
void MovementInform(uint32 type, uint32 point) override
{
if (type != POINT_MOTION_TYPE && type != EFFECT_MOTION_TYPE)
return;
switch (point)
{
case POINT_MOLTEN_MAGMA:
DoCastSelf(SPELL_MOLTEN_MAGMA, true);
break;
default:
break;
}
}
void UpdateAI(uint32 diff) override
{
_events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_MOVE_DOWN:
me->SetSpeed(MOVE_RUN, me->GetSpeed(MOVE_WALK) * 0.5f); // Moving down very, very slow
me->GetMotionMaster()->MovePoint(POINT_MOLTEN_MAGMA, trapBunnyMoveDownPos, false);
_events.ScheduleEvent(EVENT_ANNOUNCE_VALVES, Milliseconds(200));
break;
case EVENT_SUMMON_VALVES:
for (uint8 i = 0; i < 4; i++)
DoSummon(NPC_STEAM_VALVE, steamValvePositions[i], 0, TEMPSUMMON_MANUAL_DESPAWN);
break;
case EVENT_ANNOUNCE_VALVES:
Talk(SAY_ANNOUNCE_ACTIVATE_VALVES);
break;
default:
break;
}
}
}
private:
EventMap _events;
InstanceScript* _instance;
bool _movementStarted;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetDeadminesAI<npc_deadmines_vanessas_trap_bunnyAI>(creature);
}
};
class npc_deadmines_steam_valve : public CreatureScript
{
public:
npc_deadmines_steam_valve() : CreatureScript("npc_deadmines_steam_valve") { }
struct npc_deadmines_steam_valveAI : public ScriptedAI
{
npc_deadmines_steam_valveAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
void OnSpellClick(Unit* /*clicker*/, bool& /*result*/) override
{
if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
{
_instance->SetData(DATA_ACTIVATED_VENT, DONE);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
}
private:
InstanceScript* _instance;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetDeadminesAI<npc_deadmines_steam_valveAI>(creature);
}
};
enum VanessaVanCleef
{
SAY_GLUBTOK_INTRO_1 = 0,
SAY_GLUBTOK_INTRO_2 = 1,
SAY_ANNOUNCE_GLUBTOKS_NIGHTMARE = 2,
SAY_ANNOUNCE_GET_BACK_TO_THE_SHIP = 3,
SAY_HELIX_INTRO_1 = 4,
SAY_HELIX_INTRO_2 = 5,
SAY_MECHANICAL_INTRO_1 = 6,
SAY_MECHANICAL_INTRO_2 = 7,
SAY_ANNOUNCE_MECHANICAL_NIGHTMARE = 8,
SAY_RIPSNARL_INTRO_1 = 9,
SAY_RIPSNARL_INTRO_2 = 10,
SAY_ANNOUNCE_RIPSNARL_NIGHTMARE = 11,
EVENT_TALK_GLUBTOKS_NIGHTMARE_1 = 1,
EVENT_TALK_GLUBTOKS_NIGHTMARE_2,
EVENT_CANCEL_NIGHTMARE_AURA_TRAP,
EVENT_ANNOUNCE_ENTERED_GLUBTOKS_NIGHTMARE,
EVENT_ANNOUNCE_GET_BACK_TO_THE_SHIP,
EVENT_TALK_HELIX_NIGHTMARE_1,
EVENT_TALK_HELIX_NIGHTMARE_2,
EVENT_CANCEL_NIGHTMARE_AURA_GLUBTOK,
EVENT_TALK_MECHANICAL_NIGHTMARE_1,
EVENT_TALK_MECHANICAL_NIGHTMARE_2,
EVENT_CANCEL_NIGHTMARE_AURA_HELIX,
EVENT_ANNOUNCE_ENTERED_MECHANICAL_NIGHTMARE,
EVENT_TALK_RIPSNARL_NIGHTMARE_1,
EVENT_TALK_RIPSNARL_NIGHTMARE_2,
EVENT_CANCEL_NIGHTMARE_AURA_MECHANICAL,
EVENT_ANNOUNCE_ENTERED_RIPSNARL_NIGHTMARE,
EVENT_ADRENALINE,
SPELL_CANCEL_NIGHTMARE_AURA = 92583,
SPELL_NIGHTMARE_AURA_GLUBTOK = 92565,
SPELL_NIGHTMARE_AURA_HELIX = 92566,
SPELL_NIGHTMARE_AURA_MECHANICAL = 92567,
SPELL_NIGHTMARE_AURA_RIPSNARL = 92568,
};
class npc_deadmines_vanessa_van_cleef_nightmare : public CreatureScript
{
public:
npc_deadmines_vanessa_van_cleef_nightmare() : CreatureScript("npc_deadmines_vanessa_van_cleef_nightmare") { }
struct npc_deadmines_vanessa_van_cleef_nightmareAI : public ScriptedAI
{
npc_deadmines_vanessa_van_cleef_nightmareAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
void Reset() override
{
if (_instance->GetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER) == NIGHTMARE_STAGE_GLUBTOK)
_events.ScheduleEvent(EVENT_TALK_GLUBTOKS_NIGHTMARE_1, Seconds(1));
else if (_instance->GetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER) == NIGHTMARE_STAGE_HELIX)
_events.ScheduleEvent(EVENT_TALK_HELIX_NIGHTMARE_1, Seconds(1));
else if (_instance->GetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER) == NIGHTMARE_STAGE_FOE_REAPER)
_events.ScheduleEvent(EVENT_TALK_MECHANICAL_NIGHTMARE_1, Seconds(1));
else if (_instance->GetData(DATA_VANESSA_VAN_CLEEF_ENCOUNTER) == NIGHTMARE_STAGE_RIPSNARL)
_events.ScheduleEvent(EVENT_TALK_RIPSNARL_NIGHTMARE_1, Seconds(2) + Milliseconds(200));
}
void UpdateAI(uint32 diff) override
{
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_TALK_GLUBTOKS_NIGHTMARE_1:
Talk(SAY_GLUBTOK_INTRO_1);
_events.ScheduleEvent(EVENT_TALK_GLUBTOKS_NIGHTMARE_2, Seconds(8) + Milliseconds(400));
break;
case EVENT_TALK_GLUBTOKS_NIGHTMARE_2:
Talk(SAY_GLUBTOK_INTRO_2);
_events.ScheduleEvent(EVENT_CANCEL_NIGHTMARE_AURA_TRAP, Seconds(4) + Milliseconds(600));
break;
case EVENT_CANCEL_NIGHTMARE_AURA_TRAP:
DoCastAOE(SPELL_CANCEL_NIGHTMARE_AURA, true);
DoCastAOE(SPELL_NIGHTMARE_AURA_GLUBTOK, true);
_events.ScheduleEvent(EVENT_ANNOUNCE_ENTERED_GLUBTOKS_NIGHTMARE, Milliseconds(110));
break;
case EVENT_ANNOUNCE_ENTERED_GLUBTOKS_NIGHTMARE:
Talk(SAY_ANNOUNCE_GLUBTOKS_NIGHTMARE);
_events.ScheduleEvent(EVENT_ANNOUNCE_GET_BACK_TO_THE_SHIP, Seconds(4) + Milliseconds(800));
break;
case EVENT_ANNOUNCE_GET_BACK_TO_THE_SHIP:
Talk(SAY_ANNOUNCE_GET_BACK_TO_THE_SHIP);
if (Creature* glubtok = me->FindNearestCreature(NPC_GLUBTOK_NIGHTMARE, 10.0f, true))
glubtok->DespawnOrUnsummon(Seconds(2) + Milliseconds(500));
me->DespawnOrUnsummon(Seconds(2) + Milliseconds(500));
break;
case EVENT_TALK_HELIX_NIGHTMARE_1:
Talk(SAY_HELIX_INTRO_1);
_events.ScheduleEvent(EVENT_TALK_HELIX_NIGHTMARE_2, Seconds(6));
break;
case EVENT_TALK_HELIX_NIGHTMARE_2:
Talk(SAY_HELIX_INTRO_2);
_events.ScheduleEvent(EVENT_CANCEL_NIGHTMARE_AURA_GLUBTOK, Seconds(4) + Milliseconds(600));
break;
case EVENT_CANCEL_NIGHTMARE_AURA_GLUBTOK:
DoCastAOE(SPELL_CANCEL_NIGHTMARE_AURA, true);
DoCastAOE(SPELL_NIGHTMARE_AURA_HELIX, true);
me->DespawnOrUnsummon(Seconds(3) + Milliseconds(700));
break;
case EVENT_TALK_MECHANICAL_NIGHTMARE_1:
Talk(SAY_MECHANICAL_INTRO_1);
_events.ScheduleEvent(EVENT_TALK_MECHANICAL_NIGHTMARE_2, Seconds(3) + Milliseconds(600));
break;
case EVENT_TALK_MECHANICAL_NIGHTMARE_2:
Talk(SAY_MECHANICAL_INTRO_2);
_events.ScheduleEvent(EVENT_CANCEL_NIGHTMARE_AURA_HELIX, Seconds(3) + Milliseconds(400));
break;
case EVENT_CANCEL_NIGHTMARE_AURA_HELIX:
DoCastAOE(SPELL_CANCEL_NIGHTMARE_AURA, true);
DoCastAOE(SPELL_NIGHTMARE_AURA_MECHANICAL, true);
_events.ScheduleEvent(EVENT_ANNOUNCE_ENTERED_MECHANICAL_NIGHTMARE, Milliseconds(200));
break;
case EVENT_ANNOUNCE_ENTERED_MECHANICAL_NIGHTMARE:
Talk(SAY_ANNOUNCE_MECHANICAL_NIGHTMARE);
if (Creature* reaper = me->FindNearestCreature(NPC_FOE_REAPER_5000_NIGHTMARE, 20.0f, true))
reaper->DespawnOrUnsummon(Seconds(2) + Milliseconds(200));
me->DespawnOrUnsummon(Seconds(2) + Milliseconds(200));
break;
case EVENT_TALK_RIPSNARL_NIGHTMARE_1:
Talk(SAY_RIPSNARL_INTRO_1);
_events.ScheduleEvent(EVENT_TALK_RIPSNARL_NIGHTMARE_2, Seconds(7) + Milliseconds(150));
break;
case EVENT_TALK_RIPSNARL_NIGHTMARE_2:
Talk(SAY_RIPSNARL_INTRO_2);
_events.ScheduleEvent(EVENT_CANCEL_NIGHTMARE_AURA_MECHANICAL, Seconds(4) + Milliseconds(600));
break;
case EVENT_CANCEL_NIGHTMARE_AURA_MECHANICAL:
DoCastAOE(SPELL_CANCEL_NIGHTMARE_AURA, true);
DoCastAOE(SPELL_NIGHTMARE_AURA_RIPSNARL, true);
_events.ScheduleEvent(EVENT_ANNOUNCE_ENTERED_RIPSNARL_NIGHTMARE, Milliseconds(200));
break;
case EVENT_ANNOUNCE_ENTERED_RIPSNARL_NIGHTMARE:
Talk(SAY_ANNOUNCE_RIPSNARL_NIGHTMARE);
_events.ScheduleEvent(EVENT_ADRENALINE, Seconds(2));
break;
case EVENT_ADRENALINE:
DoCastAOE(SPELL_ADRENALINE, true);
if (Creature* reaper = me->FindNearestCreature(NPC_RIPSNARL_NIGHTMARE, 20.0f, true))
reaper->DespawnOrUnsummon(Milliseconds(300));
me->DespawnOrUnsummon(Milliseconds(300));
break;
default:
break;
}
}
}
private:
EventMap _events;
InstanceScript* _instance;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetDeadminesAI<npc_deadmines_vanessa_van_cleef_nightmareAI>(creature);
}
};
enum HelixNightmare
{
SAY_ANNOUNCE_HELIX_NIGHTMARE = 0,
SAY_ANNOUNCE_NIGHTMAR_SPIDERS = 1,
SPELL_HELIX_RIDE = 88337,
SPELL_RIDE_FACE_TARGETING = 88349,
SPELL_PESTILENCE = 91939,
SPELL_SHADOW_FOG = 92792,
EVENT_SPIRIT_STRIKE = 1,
EVENT_TALK_NIGHTMARE = 3,
EVENT_MAKE_ATTACKABLE,
EVENT_RIDE_PLAYER,
EVENT_PESTILENCE,
EVENT_SUMMON_NIGHTMARE_SKITTERLINGS,
EVENT_ANNOUNCE_SPIDERS,
};
class npc_deadmines_helix_nightmare : public CreatureScript
{
public:
npc_deadmines_helix_nightmare() : CreatureScript("npc_deadmines_helix_nightmare") { }
struct npc_deadmines_helix_nightmareAI : public ScriptedAI
{
npc_deadmines_helix_nightmareAI(Creature* creature) : ScriptedAI(creature), _instance(creature->GetInstanceScript()) { }
void JustAppeared() override
{
_events.ScheduleEvent(EVENT_MAKE_ATTACKABLE, Seconds(7) + Milliseconds(700));
_events.ScheduleEvent(EVENT_TALK_NIGHTMARE, Seconds(17) + Milliseconds(800));
}
void JustEngagedWith(Unit* /*who*/) override
{
_events.ScheduleEvent(EVENT_SPIRIT_STRIKE, Seconds(4) + Milliseconds(400));
_events.ScheduleEvent(EVENT_RIDE_PLAYER, Seconds(2) + Milliseconds(500));
}
void UpdateAI(uint32 diff) override
{
UpdateVictim();
_events.Update(diff);
while (uint32 eventId = _events.ExecuteEvent())
{
switch (eventId)
{
case EVENT_MAKE_ATTACKABLE:
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
break;
case EVENT_SPIRIT_STRIKE:
DoCastVictim(SPELL_SPIRIT_STRIKE);
_events.Repeat(Seconds(3) + Milliseconds(600));
break;
case EVENT_TALK_NIGHTMARE:
Talk(SAY_ANNOUNCE_HELIX_NIGHTMARE);
_events.ScheduleEvent(EVENT_SUMMON_NIGHTMARE_SKITTERLINGS, Milliseconds(600));
break;
case EVENT_RIDE_PLAYER:
DoCastAOE(SPELL_RIDE_FACE_TARGETING, true);
_events.Repeat(Seconds(11));
break;
case EVENT_SUMMON_NIGHTMARE_SKITTERLINGS:
for (uint8 i = 0; i < 100; i++)
me->SummonCreature(NPC_NIGHTMARE_SKITTERLING, nightmareSkitterlingPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
for (uint8 i = 0; i < 3; i++)
me->SummonCreature(NPC_DARKWEB_DEVOURER, DarkwebDevourerPos[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
me->SummonCreature(NPC_CHATTERING_HORROR, ChatteringHorrorPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000);
if (Creature* dummy = me->SummonCreature(NPC_GENERAL_PURPOSE_DUMMY_JMF, GeneralPurposeBunnyPos, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 5000))
dummy->CastSpell(dummy, SPELL_SHADOW_FOG, true);
_events.ScheduleEvent(EVENT_ANNOUNCE_SPIDERS, Milliseconds(800));
break;
case EVENT_ANNOUNCE_SPIDERS:
Talk(SAY_ANNOUNCE_NIGHTMAR_SPIDERS);
break;
default:
break;
}
}
DoMeleeAttackIfReady();
}
private:
EventMap _events;
InstanceScript* _instance;
};
CreatureAI* GetAI(Creature* creature) const override
{
return GetDeadminesAI<npc_deadmines_helix_nightmareAI>(creature);
}
};
enum DefiasCannon
{
// GroupID 0 and 1 are used by Foe Reaper 5000
SAY_ANNOUNCE_CANNON_LOADED = 2
};
class go_deadmines_defias_cannon : public GameObjectScript
{
public:
go_deadmines_defias_cannon() : GameObjectScript("go_deadmines_defias_cannon") { }
struct go_deadmines_defias_cannonAI : public GameObjectAI
{
go_deadmines_defias_cannonAI(GameObject* go) : GameObjectAI(go), _instance(go->GetInstanceScript()) { }
bool OnReportUse(Player* /*player*/) override
{
if (GameObject* cannon = me->ToGameObject())
{
if (_instance->GetData(DATA_BROKEN_DOOR) != DONE)
{
cannon->SendCustomAnim(0);
if (GameObject* door = _instance->GetGameObject(DATA_IRON_CLAD_DOOR))
door->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE);
if (Creature* bunny = me->FindNearestCreature(NPC_GENERAL_PURPOSE_DUMMY_JMF, 20.0f, true))
bunny->AI()->Talk(SAY_ANNOUNCE_CANNON_LOADED);
_instance->SetData(DATA_BROKEN_DOOR, DONE);
cannon->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
}
}
return true;
}
private:
InstanceScript* _instance;
};
GameObjectAI* GetAI(GameObject* go) const override
{
return GetDeadminesAI<go_deadmines_defias_cannonAI>(go);
}
};
class spell_deadmines_on_fire : public AuraScript
{
bool Validate(SpellInfo const* /*spellInfo*/) override
{
return ValidateSpellInfo({ SPELL_EXPLOSIVE_SUICIDE });
}
void AfterRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/)
{
GetTarget()->CastSpell(GetTarget(), SPELL_EXPLOSIVE_SUICIDE, true);
}
void Register() override
{
AfterEffectRemove.Register(&spell_deadmines_on_fire::AfterRemove, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, AURA_EFFECT_HANDLE_REAL);
}
};
class spell_deadmines_ride_magma_vehicle : public SpellScriptLoader
{
public:
spell_deadmines_ride_magma_vehicle() : SpellScriptLoader("spell_deadmines_ride_magma_vehicle") { }
class spell_deadmines_ride_magma_vehicle_SpellScript : public SpellScript
{
void HandleHit(SpellEffIndex effIndex)
{
Unit* target = GetHitUnit();
target->CastSpell(target, GetSpellInfo()->Effects[effIndex].BasePoints, true);
}
void Register() override
{
OnEffectHitTarget.Register(&spell_deadmines_ride_magma_vehicle_SpellScript::HandleHit, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_deadmines_ride_magma_vehicle_SpellScript();
}
};
// We have no dummy npc in sniffs so we use a sniffed coordinate instead
class spell_deadmines_magma_trap_throw_to_location : public SpellScriptLoader
{
public:
spell_deadmines_magma_trap_throw_to_location() : SpellScriptLoader("spell_deadmines_magma_trap_throw_to_location") { }
class spell_deadmines_magma_trap_throw_to_location_SpellScript : public SpellScript
{
void HandleScript(SpellEffIndex /*effIndex*/)
{
if (GetHitDest())
GetHitDest()->Relocate(-225.1973f, -563.7677f, 51.23737f);
}
void Register() override
{
OnEffectLaunch.Register(&spell_deadmines_magma_trap_throw_to_location_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_JUMP_DEST);
}
};
SpellScript* GetSpellScript() const override
{
return new spell_deadmines_magma_trap_throw_to_location_SpellScript();
}
};
class spell_deadmines_bloodbath : public SpellScriptLoader
{
public:
spell_deadmines_bloodbath() : SpellScriptLoader("spell_deadmines_bloodbath") { }
class spell_deadmines_bloodbath_AuraScript : public AuraScript
{
void HandleTick(AuraEffect const* /*aurEff*/)
{
PreventDefaultAction();
if (Unit* caster = GetCaster())
if (caster->GetVictim())
caster->CastSpell(GetCaster()->GetVictim(), GetSpellInfo()->Effects[EFFECT_1].TriggerSpell, true);
}
void Register() override
{
OnEffectPeriodic.Register(&spell_deadmines_bloodbath_AuraScript::HandleTick, EFFECT_1, SPELL_AURA_PERIODIC_TRIGGER_SPELL);
}
};
AuraScript* GetAuraScript() const
{
return new spell_deadmines_bloodbath_AuraScript();
}
};
}
void AddSC_deadmines()
{
using namespace Deadmines;
RegisterDeadminesCreatureAI(npc_deadmines_defias_watcher);
new npc_deadmines_vanessas_trap_bunny();
new npc_deadmines_steam_valve();
new npc_deadmines_vanessa_van_cleef_nightmare();
new npc_deadmines_helix_nightmare();
new go_deadmines_defias_cannon();
RegisterSpellScript(spell_deadmines_on_fire);
new spell_deadmines_ride_magma_vehicle();
new spell_deadmines_magma_trap_throw_to_location();
new spell_deadmines_bloodbath();
}