mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-16 02:20:27 +00:00
Big re-organization of repository [W.I.P]
This commit is contained in:
@@ -1,397 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "utgarde_keep.h"
|
||||
|
||||
enum eDisplayId
|
||||
{
|
||||
DISPLAYID_DEFAULT = 21953,
|
||||
DISPLAYID_UNDEAD = 26351,
|
||||
};
|
||||
|
||||
enum eNPCs
|
||||
{
|
||||
NPC_INGVAR_UNDEAD = 23980,
|
||||
NPC_ANNHYLDE = 24068,
|
||||
NPC_THROW = 23997,
|
||||
};
|
||||
|
||||
enum Yells
|
||||
{
|
||||
//Yells Ingvar
|
||||
YELL_AGGRO_1 = 0,
|
||||
YELL_KILL_1 = 1,
|
||||
YELL_DEAD_1 = 2,
|
||||
|
||||
YELL_AGGRO_2 = 3,
|
||||
YELL_KILL_2 = 4,
|
||||
YELL_DEAD_2 = 5,
|
||||
|
||||
EMOTE_ROAR = 6,
|
||||
YELL_ANHYLDE_1 = 0,
|
||||
YELL_ANHYLDE_2 = 1,
|
||||
};
|
||||
|
||||
enum eSpells
|
||||
{
|
||||
SPELL_SUMMON_VALKYR = 42912,
|
||||
SPELL_RESURRECTION_BEAM = 42857,
|
||||
SPELL_RESURRECTION_BALL = 42862,
|
||||
SPELL_RESURRECTION_HEAL = 42704,
|
||||
SPELL_INGVAR_TRANSFORM = 42796,
|
||||
|
||||
SPELL_STAGGERING_ROAR_N = 42708,
|
||||
SPELL_STAGGERING_ROAR_H = 59708,
|
||||
SPELL_CLEAVE = 42724,
|
||||
SPELL_SMASH_N = 42669,
|
||||
SPELL_SMASH_H = 59706,
|
||||
SPELL_ENRAGE_N = 42705,
|
||||
SPELL_ENRAGE_H = 59707,
|
||||
|
||||
SPELL_DREADFUL_ROAR_N = 42729,
|
||||
SPELL_DREADFUL_ROAR_H = 59734,
|
||||
SPELL_WOE_STRIKE_N = 42730,
|
||||
SPELL_WOE_STRIKE_H = 59735,
|
||||
SPELL_DARK_SMASH = 42723,
|
||||
SPELL_SHADOW_AXE = 42749,
|
||||
};
|
||||
|
||||
#define SPELL_STAGGERING_ROAR DUNGEON_MODE(SPELL_STAGGERING_ROAR_N, SPELL_STAGGERING_ROAR_H)
|
||||
#define SPELL_DREADFUL_ROAR DUNGEON_MODE(SPELL_DREADFUL_ROAR_N, SPELL_DREADFUL_ROAR_H)
|
||||
#define SPELL_WOE_STRIKE DUNGEON_MODE(SPELL_WOE_STRIKE_N, SPELL_WOE_STRIKE_H)
|
||||
#define SPELL_SMASH DUNGEON_MODE(SPELL_SMASH_N, SPELL_SMASH_H)
|
||||
#define SPELL_ENRAGE DUNGEON_MODE(SPELL_ENRAGE_N, SPELL_ENRAGE_H)
|
||||
|
||||
enum eEvents
|
||||
{
|
||||
EVENT_START_RESURRECTION = 1,
|
||||
EVENT_YELL_DEAD_1,
|
||||
EVENT_VALKYR_MOVE,
|
||||
EVENT_ANNHYLDE_YELL,
|
||||
EVENT_VALKYR_BEAM,
|
||||
EVENT_RESURRECTION_BALL,
|
||||
EVENT_RESURRECTION_HEAL,
|
||||
EVENT_MORPH_TO_UNDEAD,
|
||||
EVENT_START_PHASE_2,
|
||||
|
||||
EVENT_UNROOT,
|
||||
EVENT_SPELL_ROAR,
|
||||
EVENT_SPELL_CLEAVE_OR_WOE_STRIKE,
|
||||
EVENT_SPELL_SMASH,
|
||||
EVENT_SPELL_ENRAGE_OR_SHADOW_AXE,
|
||||
EVENT_AXE_RETURN,
|
||||
EVENT_AXE_PICKUP,
|
||||
};
|
||||
|
||||
class boss_ingvar_the_plunderer : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_ingvar_the_plunderer() : CreatureScript("boss_ingvar_the_plunderer") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_ingvar_the_plundererAI(pCreature);
|
||||
}
|
||||
|
||||
struct boss_ingvar_the_plundererAI : public ScriptedAI
|
||||
{
|
||||
boss_ingvar_the_plundererAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
{
|
||||
pInstance = c->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
uint64 ValkyrGUID;
|
||||
uint64 ThrowGUID;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
ValkyrGUID = 0;
|
||||
ThrowGUID = 0;
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
me->SetDisplayId(DISPLAYID_DEFAULT);
|
||||
me->LoadEquipment(1);
|
||||
FeignDeath(false);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
me->DisableRotate(false);
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_INGVAR, NOT_STARTED);
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (me->GetDisplayId() == DISPLAYID_DEFAULT && damage >= me->GetHealth())
|
||||
{
|
||||
damage = 0;
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
me->RemoveAllAuras();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
me->DisableRotate(false);
|
||||
me->GetMotionMaster()->MovementExpired();
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
me->StopMoving();
|
||||
FeignDeath(true);
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_START_RESURRECTION, 1000);
|
||||
events.RescheduleEvent(EVENT_YELL_DEAD_1, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * /*who*/)
|
||||
{
|
||||
events.Reset();
|
||||
// schedule Phase 1 abilities
|
||||
events.RescheduleEvent(EVENT_SPELL_ROAR, 15000);
|
||||
events.RescheduleEvent(EVENT_SPELL_CLEAVE_OR_WOE_STRIKE, 2000);
|
||||
events.RescheduleEvent(EVENT_SPELL_SMASH, 5000);
|
||||
events.RescheduleEvent(EVENT_SPELL_ENRAGE_OR_SHADOW_AXE, 10000);
|
||||
|
||||
Talk(YELL_AGGRO_1);
|
||||
me->LowerPlayerDamageReq(me->GetMaxHealth());
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_INGVAR, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* s)
|
||||
{
|
||||
summons.Summon(s);
|
||||
if (s->GetEntry() == NPC_ANNHYLDE)
|
||||
{
|
||||
ValkyrGUID = s->GetGUID();
|
||||
s->SetCanFly(true);
|
||||
s->SetDisableGravity(true);
|
||||
s->SetHover(true);
|
||||
s->SetPosition(s->GetPositionX(), s->GetPositionY(), s->GetPositionZ()+35.0f, s->GetOrientation());
|
||||
s->SetFacingTo(s->GetOrientation());
|
||||
}
|
||||
else if (s->GetEntry() == NPC_THROW)
|
||||
{
|
||||
ThrowGUID = s->GetGUID();
|
||||
if( Unit* t = SelectTarget(SELECT_TARGET_RANDOM, 0, 70.0f, true) )
|
||||
s->GetMotionMaster()->MovePoint(0, t->GetPositionX(), t->GetPositionY(), t->GetPositionZ());
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*who*/)
|
||||
{
|
||||
if (me->GetDisplayId() == DISPLAYID_DEFAULT)
|
||||
Talk(YELL_KILL_2);
|
||||
else
|
||||
Talk(YELL_KILL_1);
|
||||
}
|
||||
|
||||
void FeignDeath(bool apply)
|
||||
{
|
||||
if (apply)
|
||||
{
|
||||
me->SetStandState(UNIT_STAND_STATE_DEAD);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
}
|
||||
else
|
||||
{
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
}
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
Talk(YELL_DEAD_2);
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, NPC_INGVAR_UNDEAD, 1); // undead entry needed for achievements
|
||||
pInstance->SetData(DATA_INGVAR, DONE);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
me->DisableRotate(false);
|
||||
ScriptedAI::EnterEvadeMode();
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_YELL_DEAD_1:
|
||||
Talk(YELL_DEAD_1);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_START_RESURRECTION:
|
||||
me->CastSpell(me, SPELL_SUMMON_VALKYR, true);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_VALKYR_BEAM, 7000);
|
||||
events.RescheduleEvent(EVENT_VALKYR_MOVE, 1);
|
||||
events.RescheduleEvent(EVENT_ANNHYLDE_YELL, 3000);
|
||||
break;
|
||||
case EVENT_VALKYR_MOVE:
|
||||
if( Creature* s = ObjectAccessor::GetCreature(*me, ValkyrGUID) )
|
||||
s->GetMotionMaster()->MovePoint(1, s->GetPositionX(), s->GetPositionY(), s->GetPositionZ()-15.0f);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_ANNHYLDE_YELL:
|
||||
if( Creature* s = ObjectAccessor::GetCreature(*me, ValkyrGUID) )
|
||||
s->AI()->Talk(YELL_ANHYLDE_2);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_VALKYR_BEAM:
|
||||
me->RemoveAura(SPELL_SUMMON_VALKYR);
|
||||
if( Creature* c = ObjectAccessor::GetCreature(*me, ValkyrGUID) )
|
||||
c->CastSpell(me, SPELL_RESURRECTION_BEAM, false);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_RESURRECTION_BALL, 4000);
|
||||
break;
|
||||
case EVENT_RESURRECTION_BALL:
|
||||
me->CastSpell(me, SPELL_RESURRECTION_BALL, true);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_RESURRECTION_HEAL, 4000);
|
||||
break;
|
||||
case EVENT_RESURRECTION_HEAL:
|
||||
me->RemoveAura(SPELL_RESURRECTION_BALL);
|
||||
me->CastSpell(me, SPELL_RESURRECTION_HEAL, true);
|
||||
FeignDeath(false);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_MORPH_TO_UNDEAD, 3000);
|
||||
break;
|
||||
case EVENT_MORPH_TO_UNDEAD:
|
||||
me->CastSpell(me, SPELL_INGVAR_TRANSFORM, true);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_START_PHASE_2, 1000);
|
||||
break;
|
||||
case EVENT_START_PHASE_2:
|
||||
if( Creature* c = ObjectAccessor::GetCreature(*me, ValkyrGUID) )
|
||||
{
|
||||
c->DespawnOrUnsummon();
|
||||
summons.DespawnAll();
|
||||
}
|
||||
events.PopEvent();
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
AttackStart(me->GetVictim());
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
Talk(YELL_AGGRO_2);
|
||||
|
||||
// schedule Phase 2 abilities
|
||||
events.RescheduleEvent(EVENT_SPELL_ROAR, 15000);
|
||||
events.RescheduleEvent(EVENT_SPELL_CLEAVE_OR_WOE_STRIKE, 2000);
|
||||
events.RescheduleEvent(EVENT_SPELL_SMASH, 5000);
|
||||
events.RescheduleEvent(EVENT_SPELL_ENRAGE_OR_SHADOW_AXE, 10000);
|
||||
|
||||
break;
|
||||
|
||||
// ABILITIES HERE:
|
||||
case EVENT_UNROOT:
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
me->DisableRotate(false);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_SPELL_ROAR:
|
||||
Talk(EMOTE_ROAR);
|
||||
|
||||
me->_AddCreatureSpellCooldown(SPELL_STAGGERING_ROAR, 0);
|
||||
me->_AddCreatureSpellCooldown(SPELL_DREADFUL_ROAR, 0);
|
||||
|
||||
if (me->GetDisplayId() == DISPLAYID_DEFAULT)
|
||||
me->CastSpell((Unit*)NULL, SPELL_STAGGERING_ROAR, false);
|
||||
else
|
||||
me->CastSpell((Unit*)NULL, SPELL_DREADFUL_ROAR, false);
|
||||
events.RepeatEvent(urand(15000,20000));
|
||||
break;
|
||||
case EVENT_SPELL_CLEAVE_OR_WOE_STRIKE:
|
||||
if( me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) == 0 )
|
||||
{
|
||||
events.RepeatEvent(3000);
|
||||
break;
|
||||
}
|
||||
if (me->GetDisplayId() == DISPLAYID_DEFAULT)
|
||||
me->CastSpell(me->GetVictim(), SPELL_CLEAVE, false);
|
||||
else
|
||||
me->CastSpell(me->GetVictim(), SPELL_WOE_STRIKE, false);
|
||||
events.RepeatEvent(urand(0,4000)+3000);
|
||||
break;
|
||||
case EVENT_SPELL_SMASH:
|
||||
if( me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) == 0 )
|
||||
{
|
||||
events.RepeatEvent(3000);
|
||||
break;
|
||||
}
|
||||
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||
me->DisableRotate(true);
|
||||
me->SendMovementFlagUpdate();
|
||||
if (me->GetDisplayId() == DISPLAYID_DEFAULT)
|
||||
me->CastSpell((Unit*)NULL, SPELL_SMASH, false);
|
||||
else
|
||||
me->CastSpell((Unit*)NULL, SPELL_DARK_SMASH, false);
|
||||
events.RepeatEvent(urand(9000,11000));
|
||||
events.RescheduleEvent(EVENT_UNROOT, 3750);
|
||||
break;
|
||||
case EVENT_SPELL_ENRAGE_OR_SHADOW_AXE:
|
||||
if (me->GetDisplayId() == DISPLAYID_DEFAULT)
|
||||
{
|
||||
me->CastSpell(me, SPELL_ENRAGE, false);
|
||||
events.RepeatEvent(10000);
|
||||
}
|
||||
else
|
||||
{
|
||||
me->CastSpell((Unit*)NULL, SPELL_SHADOW_AXE, true);
|
||||
SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_NO_CHANGE, EQUIP_NO_CHANGE);
|
||||
events.RepeatEvent(35000);
|
||||
events.RescheduleEvent(EVENT_AXE_RETURN, 10000);
|
||||
}
|
||||
break;
|
||||
case EVENT_AXE_RETURN:
|
||||
if (Creature* c = ObjectAccessor::GetCreature(*me, ThrowGUID))
|
||||
c->GetMotionMaster()->MoveCharge(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ()+0.5f);
|
||||
events.PopEvent();
|
||||
events.RescheduleEvent(EVENT_AXE_PICKUP, 1500);
|
||||
break;
|
||||
case EVENT_AXE_PICKUP:
|
||||
if (Creature* c = ObjectAccessor::GetCreature(*me, ThrowGUID))
|
||||
{
|
||||
c->DestroyForNearbyPlayers();
|
||||
c->DespawnOrUnsummon();
|
||||
summons.DespawnAll();
|
||||
}
|
||||
ThrowGUID = 0;
|
||||
SetEquipmentSlots(true);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
|
||||
if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_boss_ingvar_the_plunderer()
|
||||
{
|
||||
new boss_ingvar_the_plunderer();
|
||||
}
|
||||
@@ -1,373 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "utgarde_keep.h"
|
||||
#include "SpellAuraEffects.h"
|
||||
#include "SpellScript.h"
|
||||
#include "PassiveAI.h"
|
||||
|
||||
enum eTexts
|
||||
{
|
||||
SAY_START_COMBAT = 1,
|
||||
SAY_FROST_TOMB = 3,
|
||||
SAY_SUMMON_SKELETONS = 2,
|
||||
SAY_FROST_TOMB_EMOTE = 4,
|
||||
SAY_DEATH = 5,
|
||||
};
|
||||
|
||||
enum eNPCs
|
||||
{
|
||||
NPC_FROST_TOMB = 23965,
|
||||
NPC_SKELETON = 23970,
|
||||
};
|
||||
|
||||
enum eSpells
|
||||
{
|
||||
SPELL_FROST_TOMB = 42672,
|
||||
SPELL_FROST_TOMB_SUMMON = 42714,
|
||||
SPELL_FROST_TOMB_AURA = 48400,
|
||||
|
||||
SPELL_SHADOWBOLT_N = 43667,
|
||||
SPELL_SHADOWBOLT_H = 59389,
|
||||
};
|
||||
|
||||
#define SPELL_SHADOWBOLT DUNGEON_MODE(SPELL_SHADOWBOLT_N, SPELL_SHADOWBOLT_H)
|
||||
|
||||
enum eEvents
|
||||
{
|
||||
EVENT_SPELL_SHADOWBOLT = 1,
|
||||
EVENT_FROST_TOMB,
|
||||
EVENT_SUMMON_SKELETONS,
|
||||
};
|
||||
|
||||
class npc_frost_tomb : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_frost_tomb() : CreatureScript("npc_frost_tomb") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_frost_tombAI(pCreature);
|
||||
}
|
||||
|
||||
struct npc_frost_tombAI : public NullCreatureAI
|
||||
{
|
||||
npc_frost_tombAI(Creature *c) : NullCreatureAI(c), PrisonerGUID(0)
|
||||
{
|
||||
if (TempSummon* t = c->ToTempSummon())
|
||||
if (Unit* s = t->GetSummoner())
|
||||
{
|
||||
PrisonerGUID = s->GetGUID();
|
||||
if( me->GetInstanceScript() && me->GetInstanceScript()->instance->IsHeroic() )
|
||||
{
|
||||
const int32 dmg = 2000;
|
||||
c->CastCustomSpell(s, SPELL_FROST_TOMB_AURA, NULL, &dmg, NULL, true);
|
||||
}
|
||||
else
|
||||
c->CastSpell(s, SPELL_FROST_TOMB_AURA, true);
|
||||
}
|
||||
}
|
||||
uint64 PrisonerGUID;
|
||||
|
||||
void JustDied(Unit* killer)
|
||||
{
|
||||
if (killer->GetGUID() != me->GetGUID())
|
||||
if (InstanceScript* pInstance = me->GetInstanceScript())
|
||||
pInstance->SetData(DATA_ON_THE_ROCKS_ACHIEV, 0);
|
||||
|
||||
if (PrisonerGUID)
|
||||
if (Unit* p = ObjectAccessor::GetUnit(*me, PrisonerGUID))
|
||||
p->RemoveAurasDueToSpell(SPELL_FROST_TOMB_AURA);
|
||||
me->DespawnOrUnsummon(5000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (PrisonerGUID)
|
||||
{
|
||||
if (Unit* p = ObjectAccessor::GetUnit(*me, PrisonerGUID))
|
||||
{
|
||||
if( !p->HasAura(SPELL_FROST_TOMB_AURA) )
|
||||
Unit::Kill(me, me);
|
||||
}
|
||||
else
|
||||
Unit::Kill(me, me);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
class boss_keleseth : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_keleseth() : CreatureScript("boss_keleseth") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_kelesethAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_kelesethAI : public ScriptedAI
|
||||
{
|
||||
boss_kelesethAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = c->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_KELESETH, NOT_STARTED);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit* /*who*/) {}
|
||||
|
||||
/*void KilledUnit(Unit * victim)
|
||||
{
|
||||
if (victim == me)
|
||||
return;
|
||||
DoScriptText(SAY_KILL, me);
|
||||
}*/
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_KELESETH, DONE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_SHADOWBOLT, 0);
|
||||
events.RescheduleEvent(EVENT_FROST_TOMB, 28000);
|
||||
events.RescheduleEvent(EVENT_SUMMON_SKELETONS, 4000);
|
||||
|
||||
Talk(SAY_START_COMBAT);
|
||||
DoZoneInCombat();
|
||||
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_KELESETH, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void AttackStart(Unit* who)
|
||||
{
|
||||
if( !who )
|
||||
return;
|
||||
|
||||
UnitAI::AttackStartCaster(who, 12.0f);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_SPELL_SHADOWBOLT:
|
||||
me->CastSpell(me->GetVictim(), SPELL_SHADOWBOLT, false);
|
||||
events.RepeatEvent(urand(4000,5000));
|
||||
break;
|
||||
case EVENT_FROST_TOMB:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true) )
|
||||
if( !target->HasAura(SPELL_FROST_TOMB_AURA) )
|
||||
{
|
||||
Talk(SAY_FROST_TOMB_EMOTE, target);
|
||||
Talk(SAY_FROST_TOMB);
|
||||
me->CastSpell(target, SPELL_FROST_TOMB, false);
|
||||
events.RepeatEvent(15000);
|
||||
break;
|
||||
}
|
||||
events.RepeatEvent(1000);
|
||||
break;
|
||||
case EVENT_SUMMON_SKELETONS:
|
||||
Talk(SAY_SUMMON_SKELETONS);
|
||||
for (uint8 i = 0; i < 5; ++i)
|
||||
{
|
||||
float dist = rand_norm()*4+3.0f;
|
||||
float angle = rand_norm()*2*M_PI;
|
||||
if( Creature* c = me->SummonCreature(NPC_SKELETON, 156.2f+cos(angle)*dist, 259.1f+sin(angle)*dist, 42.9f, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000) )
|
||||
if( Unit* target = c->SelectNearestTarget(250.0f) )
|
||||
{
|
||||
c->AddThreat(target, 5.0f);
|
||||
DoZoneInCombat(c);
|
||||
}
|
||||
}
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
enum eSkeletonEnum
|
||||
{
|
||||
SPELL_DECREPIFY = 42702,
|
||||
SPELL_BONE_ARMOR = 59386,
|
||||
SPELL_SCOURGE_RESURRECTION = 42704,
|
||||
|
||||
EVENT_SPELL_DECREPIFY = 1,
|
||||
EVENT_SPELL_BONE_ARMOR,
|
||||
EVENT_RESURRECT,
|
||||
EVENT_RESURRECT_2,
|
||||
};
|
||||
|
||||
class npc_vrykul_skeleton : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_vrykul_skeleton() : CreatureScript("npc_vrykul_skeleton") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_vrykul_skeletonAI (pCreature);
|
||||
}
|
||||
|
||||
struct npc_vrykul_skeletonAI : public ScriptedAI
|
||||
{
|
||||
npc_vrykul_skeletonAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = c->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript *pInstance;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_DECREPIFY, urand(10000,20000));
|
||||
if( IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_SPELL_BONE_ARMOR, urand(25000,120000));
|
||||
}
|
||||
|
||||
void DamageTaken(Unit*, uint32 &damage, DamageEffectType, SpellSchoolMask)
|
||||
{
|
||||
if (damage >= me->GetHealth())
|
||||
{
|
||||
damage = 0;
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
me->RemoveAllAuras();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||
me->GetMotionMaster()->MovementExpired();
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
me->StopMoving();
|
||||
me->SetStandState(UNIT_STAND_STATE_DEAD);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
events.RescheduleEvent(EVENT_RESURRECT, 12000);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if( pInstance && pInstance->GetData(DATA_KELESETH) != IN_PROGRESS )
|
||||
{
|
||||
if( me->IsAlive() )
|
||||
Unit::Kill(me, me);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_SPELL_DECREPIFY:
|
||||
if( !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) )
|
||||
me->CastSpell(me->GetVictim(), SPELL_DECREPIFY, false);
|
||||
events.RepeatEvent(urand(15000,25000));
|
||||
break;
|
||||
case EVENT_SPELL_BONE_ARMOR:
|
||||
if( !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) )
|
||||
me->CastSpell((Unit*)NULL, SPELL_BONE_ARMOR, false);
|
||||
events.RepeatEvent(urand(40000,120000));
|
||||
break;
|
||||
case EVENT_RESURRECT:
|
||||
events.PopEvent();
|
||||
events.DelayEvents(3500);
|
||||
DoCast(me, SPELL_SCOURGE_RESURRECTION, true);
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
|
||||
me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
|
||||
events.RescheduleEvent(EVENT_RESURRECT_2, 3000);
|
||||
break;
|
||||
case EVENT_RESURRECT_2:
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
|
||||
if( !me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE) )
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
class spell_frost_tomb : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_frost_tomb() : SpellScriptLoader("spell_frost_tomb") { }
|
||||
|
||||
class spell_frost_tombAuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_frost_tombAuraScript);
|
||||
|
||||
void HandleEffectPeriodic(AuraEffect const* aurEff)
|
||||
{
|
||||
PreventDefaultAction();
|
||||
if (aurEff->GetTickNumber()==1)
|
||||
if( Unit* target = GetTarget() )
|
||||
target->CastSpell((Unit*)NULL, SPELL_FROST_TOMB_SUMMON, true);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectPeriodic += AuraEffectPeriodicFn(spell_frost_tombAuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_frost_tombAuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_keleseth()
|
||||
{
|
||||
new boss_keleseth();
|
||||
new npc_frost_tomb();
|
||||
new npc_vrykul_skeleton();
|
||||
new spell_frost_tomb();
|
||||
}
|
||||
@@ -1,352 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "utgarde_keep.h"
|
||||
|
||||
enum eTexts
|
||||
{
|
||||
//signed for 24200, but used by 24200, 27390
|
||||
YELL_SKARVALD_AGGRO = 0,
|
||||
YELL_SKARVALD_DAL_DIED = 1,
|
||||
YELL_SKARVALD_SKA_DIEDFIRST = 2,
|
||||
YELL_SKARVALD_KILL = 3,
|
||||
YELL_SKARVALD_DAL_DIEDFIRST = 4,
|
||||
|
||||
//signed for 24201, but used by 24201, 27389
|
||||
YELL_DALRONN_AGGRO = 0,
|
||||
YELL_DALRONN_SKA_DIED = 1,
|
||||
YELL_DALRONN_DAL_DIEDFIRST = 2,
|
||||
YELL_DALRONN_KILL = 3,
|
||||
YELL_DALRONN_SKA_DIEDFIRST = 4,
|
||||
};
|
||||
|
||||
enum eSpells
|
||||
{
|
||||
// Skarvald:
|
||||
SPELL_CHARGE = 43651,
|
||||
SPELL_STONE_STRIKE = 48583,
|
||||
SPELL_SUMMON_SKARVALD_GHOST = 48613,
|
||||
|
||||
// Dalronn:
|
||||
SPELL_SHADOW_BOLT_N = 43649,
|
||||
SPELL_SHADOW_BOLT_H = 59575,
|
||||
SPELL_DEBILITATE = 43650,
|
||||
SPELL_SUMMON_SKELETONS = 52611,
|
||||
SPELL_SUMMON_DALRONN_GHOST = 48612,
|
||||
};
|
||||
|
||||
#define SPELL_SHADOW_BOLT DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H)
|
||||
|
||||
enum eEvents
|
||||
{
|
||||
EVENT_SPELL_CHARGE = 1,
|
||||
EVENT_SPELL_STONE_STRIKE,
|
||||
|
||||
EVENT_SPELL_SHADOW_BOLT,
|
||||
EVENT_SPELL_DEBILITATE,
|
||||
EVENT_SPELL_SUMMON_SKELETONS,
|
||||
|
||||
EVENT_YELL_DALRONN_AGGRO,
|
||||
EVENT_MATE_DIED,
|
||||
};
|
||||
|
||||
class boss_skarvald_the_constructor : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_skarvald_the_constructor() : CreatureScript("boss_skarvald_the_constructor") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_skarvald_the_constructorAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_skarvald_the_constructorAI : public ScriptedAI
|
||||
{
|
||||
boss_skarvald_the_constructorAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = c->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetLootMode(0);
|
||||
events.Reset();
|
||||
if( me->GetEntry() == NPC_SKARVALD )
|
||||
{
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, NOT_STARTED);
|
||||
}
|
||||
else // NPC_SKARVALD_GHOST
|
||||
if( Unit* target = me->SelectNearestTarget(50.0f) )
|
||||
{
|
||||
me->AddThreat(target, 0.0f);
|
||||
AttackStart(target);
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
switch(param)
|
||||
{
|
||||
case 1:
|
||||
events.RescheduleEvent(EVENT_MATE_DIED, 3500);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_CHARGE, 5000);
|
||||
events.RescheduleEvent(EVENT_SPELL_STONE_STRIKE, 10000);
|
||||
|
||||
if (me->GetEntry() == NPC_SKARVALD)
|
||||
Talk(YELL_SKARVALD_AGGRO);
|
||||
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, IN_PROGRESS);
|
||||
if( Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_DALRONN)) )
|
||||
if( !c->IsInCombat() && who )
|
||||
{
|
||||
c->AddThreat(who, 0.0f);
|
||||
c->AI()->AttackStart(who);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit * /*victim*/)
|
||||
{
|
||||
if (me->GetEntry() == NPC_SKARVALD)
|
||||
Talk(YELL_SKARVALD_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* Killer)
|
||||
{
|
||||
if( me->GetEntry() != NPC_SKARVALD )
|
||||
return;
|
||||
if( pInstance )
|
||||
if( Creature* dalronn = pInstance->instance->GetCreature(pInstance->GetData64(DATA_DALRONN)) )
|
||||
if( dalronn->isDead() )
|
||||
{
|
||||
Talk(YELL_SKARVALD_SKA_DIEDFIRST);
|
||||
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, DONE);
|
||||
pInstance->SetData(DATA_UNLOCK_SKARVALD_LOOT, 0);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
Talk(YELL_SKARVALD_DAL_DIED);
|
||||
dalronn->AI()->DoAction(1);
|
||||
}
|
||||
me->CastSpell((Unit*)NULL, SPELL_SUMMON_SKARVALD_GHOST, true);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_MATE_DIED:
|
||||
Talk(YELL_SKARVALD_DAL_DIEDFIRST);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_SPELL_CHARGE:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, (IsHeroic() ? 100.0f : 30.0f), true) )
|
||||
{
|
||||
ScriptedAI::DoResetThreat();
|
||||
me->AddThreat(target, 10000.0f);
|
||||
me->CastSpell(target, SPELL_CHARGE, false);
|
||||
}
|
||||
events.RepeatEvent(urand(5000,10000));
|
||||
break;
|
||||
case EVENT_SPELL_STONE_STRIKE:
|
||||
if( me->GetVictim() && me->IsWithinMeleeRange(me->GetVictim()) )
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), SPELL_STONE_STRIKE, false);
|
||||
events.RepeatEvent(urand(5000,10000));
|
||||
}
|
||||
else
|
||||
events.RepeatEvent(3000);
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class boss_dalronn_the_controller : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_dalronn_the_controller() : CreatureScript("boss_dalronn_the_controller") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_dalronn_the_controllerAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_dalronn_the_controllerAI : public ScriptedAI
|
||||
{
|
||||
boss_dalronn_the_controllerAI(Creature *c) : ScriptedAI(c), summons(me)
|
||||
{
|
||||
pInstance = c->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
me->SetLootMode(0);
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
if( me->GetEntry() == NPC_DALRONN )
|
||||
{
|
||||
if (pInstance)
|
||||
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, NOT_STARTED);
|
||||
}
|
||||
else // NPC_DALRONN_GHOST
|
||||
if( Unit* target = me->SelectNearestTarget(50.0f) )
|
||||
{
|
||||
me->AddThreat(target, 0.0f);
|
||||
AttackStart(target);
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
switch(param)
|
||||
{
|
||||
case -1:
|
||||
summons.DespawnAll();
|
||||
break;
|
||||
case 1:
|
||||
events.RescheduleEvent(EVENT_MATE_DIED, 3500);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit * who)
|
||||
{
|
||||
events.Reset();
|
||||
events.RescheduleEvent(EVENT_SPELL_SHADOW_BOLT, 1000);
|
||||
events.RescheduleEvent(EVENT_SPELL_DEBILITATE, 5000);
|
||||
if( IsHeroic() )
|
||||
events.RescheduleEvent(EVENT_SPELL_SUMMON_SKELETONS, 10000);
|
||||
|
||||
if (me->GetEntry() == NPC_DALRONN)
|
||||
events.RescheduleEvent(EVENT_YELL_DALRONN_AGGRO, 4999);
|
||||
|
||||
if (pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, IN_PROGRESS);
|
||||
if( Creature* c = pInstance->instance->GetCreature(pInstance->GetData64(DATA_SKARVALD)) )
|
||||
if( !c->IsInCombat() && who )
|
||||
{
|
||||
c->AddThreat(who, 0.0f);
|
||||
c->AI()->AttackStart(who);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit * /*victim*/)
|
||||
{
|
||||
if (me->GetEntry() == NPC_DALRONN)
|
||||
Talk(YELL_DALRONN_KILL);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* s)
|
||||
{
|
||||
summons.Summon(s);
|
||||
}
|
||||
|
||||
void JustDied(Unit* Killer)
|
||||
{
|
||||
if( me->GetEntry() != NPC_DALRONN )
|
||||
return;
|
||||
if( pInstance )
|
||||
if( Creature* skarvald = pInstance->instance->GetCreature(pInstance->GetData64(DATA_SKARVALD)) )
|
||||
if( skarvald->isDead() )
|
||||
{
|
||||
Talk(YELL_DALRONN_DAL_DIEDFIRST);
|
||||
pInstance->SetData(DATA_DALRONN_AND_SKARVALD, DONE);
|
||||
pInstance->SetData(DATA_UNLOCK_DALRONN_LOOT, 0);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
Talk(YELL_DALRONN_SKA_DIED);
|
||||
skarvald->AI()->DoAction(1);
|
||||
}
|
||||
me->CastSpell((Unit*)NULL, SPELL_SUMMON_DALRONN_GHOST, true);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
|
||||
if( me->HasUnitState(UNIT_STATE_CASTING) )
|
||||
return;
|
||||
|
||||
switch( events.GetEvent() )
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
case EVENT_YELL_DALRONN_AGGRO:
|
||||
Talk(YELL_DALRONN_AGGRO);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_MATE_DIED:
|
||||
Talk(YELL_DALRONN_SKA_DIEDFIRST);
|
||||
events.PopEvent();
|
||||
break;
|
||||
case EVENT_SPELL_SHADOW_BOLT:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 42.0f, true) )
|
||||
me->CastSpell(target, SPELL_SHADOW_BOLT, false);
|
||||
events.RepeatEvent(2500);
|
||||
break;
|
||||
case EVENT_SPELL_DEBILITATE:
|
||||
if( Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 45.0f, true) )
|
||||
{
|
||||
me->CastSpell(target, SPELL_DEBILITATE, false);
|
||||
events.RepeatEvent(urand(5000,10000));
|
||||
}
|
||||
else
|
||||
events.RepeatEvent(3000);
|
||||
break;
|
||||
case EVENT_SPELL_SUMMON_SKELETONS:
|
||||
me->CastSpell((Unit*)NULL, SPELL_SUMMON_SKELETONS, false);
|
||||
events.RepeatEvent(urand(20000,30000));
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_boss_skarvald_dalronn()
|
||||
{
|
||||
new boss_skarvald_the_constructor();
|
||||
new boss_dalronn_the_controller();
|
||||
}
|
||||
@@ -1,360 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "utgarde_keep.h"
|
||||
#include "Player.h"
|
||||
|
||||
class instance_utgarde_keep : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_utgarde_keep() : InstanceMapScript("instance_utgarde_keep", 574) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
|
||||
{
|
||||
return new instance_utgarde_keep_InstanceMapScript(pMap);
|
||||
}
|
||||
|
||||
struct instance_utgarde_keep_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_utgarde_keep_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {}
|
||||
|
||||
uint32 m_auiEncounter[MAX_ENCOUNTER];
|
||||
uint32 ForgeEventMask;
|
||||
std::string str_data;
|
||||
|
||||
uint64 GO_ForgeBellowGUID[3];
|
||||
uint64 GO_ForgeFireGUID[3];
|
||||
uint64 GO_ForgeAnvilGUID[3];
|
||||
uint64 GO_PortcullisGUID[2];
|
||||
|
||||
uint64 NPC_KelesethGUID;
|
||||
uint64 NPC_DalronnGUID;
|
||||
uint64 NPC_SkarvaldGUID;
|
||||
uint64 NPC_DalronnGhostGUID;
|
||||
uint64 NPC_SkarvaldGhostGUID;
|
||||
uint64 NPC_IngvarGUID;
|
||||
uint64 NPC_DarkRangerMarrahGUID;
|
||||
uint64 NPC_SpecialDrakeGUID;
|
||||
bool bRocksAchiev;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
memset(&m_auiEncounter, 0, sizeof(m_auiEncounter));
|
||||
ForgeEventMask = 0;
|
||||
|
||||
memset(&GO_ForgeBellowGUID, 0, sizeof(GO_ForgeBellowGUID));
|
||||
memset(&GO_ForgeFireGUID, 0, sizeof(GO_ForgeFireGUID));
|
||||
memset(&GO_ForgeAnvilGUID, 0, sizeof(GO_ForgeAnvilGUID));
|
||||
memset(&GO_PortcullisGUID, 0, sizeof(GO_PortcullisGUID));
|
||||
|
||||
NPC_KelesethGUID = 0;
|
||||
NPC_DalronnGUID = 0;
|
||||
NPC_SkarvaldGUID = 0;
|
||||
NPC_DalronnGhostGUID = 0;
|
||||
NPC_SkarvaldGhostGUID = 0;
|
||||
NPC_IngvarGUID = 0;
|
||||
NPC_DarkRangerMarrahGUID = 0;
|
||||
NPC_SpecialDrakeGUID = 0;
|
||||
bRocksAchiev = true;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
{
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (m_auiEncounter[i] == IN_PROGRESS) return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void OnPlayerEnter(Player* plr)
|
||||
{
|
||||
if (Creature* c = instance->GetCreature(NPC_DarkRangerMarrahGUID))
|
||||
{
|
||||
c->SetReactState(REACT_PASSIVE);
|
||||
c->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
if (plr && plr->GetTeamId() == TEAM_HORDE)
|
||||
{
|
||||
if (!c->IsVisible())
|
||||
c->SetVisible(true);
|
||||
return;
|
||||
}
|
||||
else
|
||||
if(c->IsVisible())
|
||||
c->SetVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
void OnCreatureCreate(Creature* creature)
|
||||
{
|
||||
switch(creature->GetEntry())
|
||||
{
|
||||
case NPC_KELESETH: NPC_KelesethGUID = creature->GetGUID(); break;
|
||||
case NPC_DALRONN: NPC_DalronnGUID = creature->GetGUID(); break;
|
||||
case NPC_SKARVALD: NPC_SkarvaldGUID = creature->GetGUID(); break;
|
||||
case NPC_DALRONN_GHOST: NPC_DalronnGhostGUID = creature->GetGUID(); break;
|
||||
case NPC_SKARVALD_GHOST: NPC_SkarvaldGhostGUID = creature->GetGUID(); break;
|
||||
case NPC_INGVAR: NPC_IngvarGUID = creature->GetGUID(); break;
|
||||
case NPC_DARK_RANGER_MARRAH:NPC_DarkRangerMarrahGUID = creature->GetGUID(); break;
|
||||
case NPC_ENSLAVED_PROTO_DRAKE: if (creature->GetPositionX() < 250.0f) NPC_SpecialDrakeGUID = creature->GetGUID(); break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* go)
|
||||
{
|
||||
switch(go->GetEntry())
|
||||
{
|
||||
case GO_BELLOW_1:
|
||||
GO_ForgeBellowGUID[0] = go->GetGUID();
|
||||
if (ForgeEventMask & 1) HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_BELLOW_2:
|
||||
GO_ForgeBellowGUID[1] = go->GetGUID();
|
||||
if (ForgeEventMask & 2) HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_BELLOW_3:
|
||||
GO_ForgeBellowGUID[2] = go->GetGUID();
|
||||
if (ForgeEventMask & 4) HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_FORGEFIRE_1:
|
||||
GO_ForgeFireGUID[0] = go->GetGUID();
|
||||
if (ForgeEventMask & 1) HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_FORGEFIRE_2:
|
||||
GO_ForgeFireGUID[1] = go->GetGUID();
|
||||
if (ForgeEventMask & 2) HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_FORGEFIRE_3:
|
||||
GO_ForgeFireGUID[2] = go->GetGUID();
|
||||
if (ForgeEventMask & 4) HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_GLOWING_ANVIL_1:
|
||||
GO_ForgeAnvilGUID[0] = go->GetGUID();
|
||||
if (ForgeEventMask & 1) HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_GLOWING_ANVIL_2:
|
||||
GO_ForgeAnvilGUID[1] = go->GetGUID();
|
||||
if (ForgeEventMask & 2) HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_GLOWING_ANVIL_3:
|
||||
GO_ForgeAnvilGUID[2] = go->GetGUID();
|
||||
if (ForgeEventMask & 4) HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_GIANT_PORTCULLIS_1:
|
||||
GO_PortcullisGUID[0] = go->GetGUID();
|
||||
if (m_auiEncounter[2] == DONE) HandleGameObject(0, true, go);
|
||||
break;
|
||||
case GO_GIANT_PORTCULLIS_2:
|
||||
GO_PortcullisGUID[1] = go->GetGUID();
|
||||
if (m_auiEncounter[2] == DONE) HandleGameObject(0, true, go);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case DATA_KELESETH:
|
||||
m_auiEncounter[0] = data;
|
||||
if (data == NOT_STARTED)
|
||||
bRocksAchiev = true;
|
||||
break;
|
||||
case DATA_ON_THE_ROCKS_ACHIEV:
|
||||
bRocksAchiev = false;
|
||||
break;
|
||||
case DATA_DALRONN_AND_SKARVALD:
|
||||
if (data == NOT_STARTED)
|
||||
{
|
||||
if( Creature* c = instance->GetCreature(NPC_DalronnGUID) )
|
||||
if( c->isDead() )
|
||||
{
|
||||
c->AI()->DoAction(-1);
|
||||
c->Respawn();
|
||||
}
|
||||
if( Creature* c = instance->GetCreature(NPC_SkarvaldGUID) )
|
||||
if( c->isDead() )
|
||||
c->Respawn();
|
||||
if( Creature* c = instance->GetCreature(NPC_DalronnGhostGUID) )
|
||||
{
|
||||
c->AI()->DoAction(-1);
|
||||
c->DespawnOrUnsummon();
|
||||
}
|
||||
NPC_DalronnGhostGUID = 0;
|
||||
if( Creature* c = instance->GetCreature(NPC_SkarvaldGhostGUID) )
|
||||
c->DespawnOrUnsummon();
|
||||
NPC_SkarvaldGhostGUID = 0;
|
||||
}
|
||||
if (data == DONE)
|
||||
{
|
||||
if( Creature* c = instance->GetCreature(NPC_DalronnGhostGUID) )
|
||||
{
|
||||
c->AI()->DoAction(-1);
|
||||
c->DespawnOrUnsummon();
|
||||
}
|
||||
NPC_DalronnGhostGUID = 0;
|
||||
if( Creature* c = instance->GetCreature(NPC_SkarvaldGhostGUID) )
|
||||
c->DespawnOrUnsummon();
|
||||
NPC_SkarvaldGhostGUID = 0;
|
||||
}
|
||||
|
||||
m_auiEncounter[1] = data;
|
||||
break;
|
||||
case DATA_UNLOCK_SKARVALD_LOOT:
|
||||
if( Creature* c = instance->GetCreature(NPC_SkarvaldGUID) )
|
||||
{
|
||||
c->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE | UNIT_DYNFLAG_TAPPED | UNIT_DYNFLAG_TAPPED_BY_PLAYER);
|
||||
c->SetLootMode(1);
|
||||
c->loot.clear();
|
||||
if (uint32 lootid = c->GetCreatureTemplate()->lootid)
|
||||
c->loot.FillLoot(lootid, LootTemplates_Creature, c->GetLootRecipient(), false, false, c->GetLootMode());
|
||||
if (c->GetLootMode())
|
||||
c->loot.generateMoneyLoot(c->GetCreatureTemplate()->mingold,c->GetCreatureTemplate()->maxgold);
|
||||
c->DestroyForNearbyPlayers();
|
||||
c->SetVisible(true);
|
||||
}
|
||||
break;
|
||||
case DATA_UNLOCK_DALRONN_LOOT:
|
||||
if( Creature* c = instance->GetCreature(NPC_DalronnGUID) )
|
||||
{
|
||||
c->AI()->DoAction(-1);
|
||||
c->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE | UNIT_DYNFLAG_TAPPED | UNIT_DYNFLAG_TAPPED_BY_PLAYER);
|
||||
c->SetLootMode(1);
|
||||
c->loot.clear();
|
||||
if (uint32 lootid = c->GetCreatureTemplate()->lootid)
|
||||
c->loot.FillLoot(lootid, LootTemplates_Creature, c->GetLootRecipient(), false, false, c->GetLootMode());
|
||||
if (c->GetLootMode())
|
||||
c->loot.generateMoneyLoot(c->GetCreatureTemplate()->mingold,c->GetCreatureTemplate()->maxgold);
|
||||
c->DestroyForNearbyPlayers();
|
||||
c->SetVisible(true);
|
||||
}
|
||||
break;
|
||||
case DATA_INGVAR:
|
||||
if (data == DONE)
|
||||
{
|
||||
HandleGameObject(GO_PortcullisGUID[0], true);
|
||||
HandleGameObject(GO_PortcullisGUID[1], true);
|
||||
}
|
||||
m_auiEncounter[2] = data;
|
||||
break;
|
||||
case DATA_FORGE_1:
|
||||
case DATA_FORGE_2:
|
||||
case DATA_FORGE_3:
|
||||
if (data == NOT_STARTED)
|
||||
{
|
||||
HandleGameObject(GO_ForgeBellowGUID[type-100], false);
|
||||
HandleGameObject(GO_ForgeFireGUID[type-100], false);
|
||||
HandleGameObject(GO_ForgeAnvilGUID[type-100], false);
|
||||
ForgeEventMask &= ~((uint32)(1<<(type-100)));
|
||||
}
|
||||
else
|
||||
{
|
||||
HandleGameObject(GO_ForgeBellowGUID[type-100], true);
|
||||
HandleGameObject(GO_ForgeFireGUID[type-100], true);
|
||||
HandleGameObject(GO_ForgeAnvilGUID[type-100], true);
|
||||
ForgeEventMask |= (uint32)(1<<(type-100));
|
||||
}
|
||||
break;
|
||||
case DATA_SPECIAL_DRAKE:
|
||||
if (Creature* c = instance->GetCreature(NPC_SpecialDrakeGUID))
|
||||
c->AI()->SetData(28, 6);
|
||||
break;
|
||||
}
|
||||
|
||||
if (data == DONE)
|
||||
{
|
||||
SaveToDB();
|
||||
}
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 id) const
|
||||
{
|
||||
switch(id)
|
||||
{
|
||||
case DATA_KELESETH: return NPC_KelesethGUID;
|
||||
case DATA_DALRONN: return NPC_DalronnGUID;
|
||||
case DATA_SKARVALD: return NPC_SkarvaldGUID;
|
||||
case DATA_INGVAR: return NPC_IngvarGUID;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 id) const
|
||||
{
|
||||
switch(id)
|
||||
{
|
||||
case DATA_KELESETH:
|
||||
case DATA_DALRONN_AND_SKARVALD:
|
||||
case DATA_INGVAR:
|
||||
return m_auiEncounter[id];
|
||||
case DATA_FORGE_1:
|
||||
case DATA_FORGE_2:
|
||||
case DATA_FORGE_3:
|
||||
return ForgeEventMask & (uint32)(1<<(id-100));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "U K " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << ForgeEventMask;
|
||||
|
||||
str_data = saveStream.str();
|
||||
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
return str_data;
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
uint32 data0, data1, data2, data3;
|
||||
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
|
||||
|
||||
if (dataHead1 == 'U' && dataHead2 == 'K')
|
||||
{
|
||||
m_auiEncounter[0] = data0;
|
||||
m_auiEncounter[1] = data1;
|
||||
m_auiEncounter[2] = data2;
|
||||
ForgeEventMask = data3;
|
||||
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
|
||||
if (m_auiEncounter[i] == IN_PROGRESS)
|
||||
m_auiEncounter[i] = NOT_STARTED;
|
||||
} else OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
|
||||
{
|
||||
switch(criteria_id)
|
||||
{
|
||||
case 7231: // On The Rocks
|
||||
return bRocksAchiev;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
void AddSC_instance_utgarde_keep()
|
||||
{
|
||||
new instance_utgarde_keep();
|
||||
}
|
||||
@@ -1,240 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "GameObjectAI.h"
|
||||
#include "Vehicle.h"
|
||||
#include "utgarde_keep.h"
|
||||
|
||||
class npc_dragonflayer_forge_master : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_dragonflayer_forge_master() : CreatureScript("npc_dragonflayer_forge_master") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_dragonflayer_forge_masterAI(pCreature);
|
||||
}
|
||||
|
||||
struct npc_dragonflayer_forge_masterAI : public ScriptedAI
|
||||
{
|
||||
npc_dragonflayer_forge_masterAI(Creature *c) : ScriptedAI(c)
|
||||
{
|
||||
pInstance = c->GetInstanceScript();
|
||||
|
||||
float x = me->GetHomePosition().GetPositionX();
|
||||
float y = me->GetHomePosition().GetPositionY();
|
||||
if (x>344.0f && x<357.0f && y<-35.0f && y>-44.0f)
|
||||
{
|
||||
dataId = DATA_FORGE_1;
|
||||
prevDataId = 0;
|
||||
}
|
||||
else if (x>380.0f && x<389.0f && y<-12.0f && y>-21.0f)
|
||||
{
|
||||
dataId = DATA_FORGE_2;
|
||||
prevDataId = DATA_FORGE_1;
|
||||
}
|
||||
else
|
||||
{
|
||||
dataId = DATA_FORGE_3;
|
||||
prevDataId = DATA_FORGE_2;
|
||||
}
|
||||
}
|
||||
|
||||
InstanceScript* pInstance;
|
||||
uint32 dataId;
|
||||
uint32 prevDataId;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if (pInstance)
|
||||
pInstance->SetData(dataId, NOT_STARTED);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/)
|
||||
{
|
||||
if (pInstance)
|
||||
pInstance->SetData(dataId, DONE);
|
||||
me->SaveRespawnTime();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/)
|
||||
{
|
||||
if (pInstance)
|
||||
{
|
||||
if (prevDataId && !pInstance->GetData(prevDataId))
|
||||
{
|
||||
EnterEvadeMode();
|
||||
return;
|
||||
}
|
||||
pInstance->SetData(dataId, IN_PROGRESS);
|
||||
}
|
||||
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
enum EnslavedProtoDrake
|
||||
{
|
||||
TYPE_PROTODRAKE_AT = 28,
|
||||
DATA_PROTODRAKE_MOVE = 6,
|
||||
|
||||
PATH_PROTODRAKE = 125946,
|
||||
|
||||
EVENT_REND = 1,
|
||||
EVENT_FLAME_BREATH = 2,
|
||||
EVENT_KNOCKAWAY = 3,
|
||||
|
||||
SPELL_REND = 43931,
|
||||
SPELL_FLAME_BREATH = 50653,
|
||||
SPELL_KNOCK_AWAY = 49722,
|
||||
|
||||
POINT_LAST = 5,
|
||||
};
|
||||
|
||||
const Position protodrakeCheckPos = {206.24f, -190.28f, 200.11f, 0.f};
|
||||
|
||||
class npc_enslaved_proto_drake : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_enslaved_proto_drake() : CreatureScript("npc_enslaved_proto_drake") { }
|
||||
|
||||
struct npc_enslaved_proto_drakeAI : public ScriptedAI
|
||||
{
|
||||
npc_enslaved_proto_drakeAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
_setData = false;
|
||||
}
|
||||
|
||||
void Reset()
|
||||
{
|
||||
_events.Reset();
|
||||
_events.ScheduleEvent(EVENT_REND, urand(2000, 3000));
|
||||
_events.ScheduleEvent(EVENT_FLAME_BREATH, urand(5500, 7000));
|
||||
_events.ScheduleEvent(EVENT_KNOCKAWAY, urand(3500, 6000));
|
||||
}
|
||||
|
||||
void MovementInform(uint32 type, uint32 id)
|
||||
{
|
||||
if (type == WAYPOINT_MOTION_TYPE && id == POINT_LAST)
|
||||
{
|
||||
me->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.25f);
|
||||
if (Vehicle* v = me->GetVehicleKit())
|
||||
if (Unit* p = v->GetPassenger(0))
|
||||
if (Creature* rider = p->ToCreature())
|
||||
rider->SetHomePosition(me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0.25f);
|
||||
|
||||
me->SetDisableGravity(false);
|
||||
me->SetHover(false);
|
||||
me->SetCanFly(false);
|
||||
me->SetFacingTo(0.25f);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
}
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
if (type == TYPE_PROTODRAKE_AT && data == DATA_PROTODRAKE_MOVE && !_setData && me->IsAlive() && me->GetDistance(protodrakeCheckPos) < 10.0f)
|
||||
{
|
||||
_setData = true;
|
||||
me->SetDisableGravity(true);
|
||||
me->SetHover(true);
|
||||
me->SetCanFly(true);
|
||||
me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
_events.Update(diff);
|
||||
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
while (uint32 eventid = _events.ExecuteEvent())
|
||||
{
|
||||
switch (eventid)
|
||||
{
|
||||
case EVENT_REND:
|
||||
DoCast(SPELL_REND);
|
||||
_events.ScheduleEvent(EVENT_REND, urand(15000, 20000));
|
||||
break;
|
||||
case EVENT_FLAME_BREATH:
|
||||
DoCast(SPELL_FLAME_BREATH);
|
||||
_events.ScheduleEvent(EVENT_FLAME_BREATH, urand(11000, 12000));
|
||||
break;
|
||||
case EVENT_KNOCKAWAY:
|
||||
DoCast(SPELL_KNOCK_AWAY);
|
||||
_events.ScheduleEvent(EVENT_KNOCKAWAY, urand(7000, 8500));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
bool _setData;
|
||||
EventMap _events;
|
||||
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new npc_enslaved_proto_drakeAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
enum TickingTimeBomb
|
||||
{
|
||||
SPELL_TICKING_TIME_BOMB_EXPLODE = 59687
|
||||
};
|
||||
|
||||
class spell_ticking_time_bomb : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_ticking_time_bomb() : SpellScriptLoader("spell_ticking_time_bomb") { }
|
||||
|
||||
class spell_ticking_time_bomb_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_ticking_time_bomb_AuraScript);
|
||||
|
||||
bool Validate(SpellInfo const* /*spellEntry*/)
|
||||
{
|
||||
return (bool) sSpellMgr->GetSpellInfo(SPELL_TICKING_TIME_BOMB_EXPLODE);
|
||||
}
|
||||
|
||||
void HandleOnEffectRemove(AuraEffect const* /* aurEff */, AuraEffectHandleModes /* mode */)
|
||||
{
|
||||
if (GetCaster() == GetTarget())
|
||||
{
|
||||
GetTarget()->CastSpell(GetTarget(), SPELL_TICKING_TIME_BOMB_EXPLODE, true);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectRemove += AuraEffectRemoveFn(spell_ticking_time_bomb_AuraScript::HandleOnEffectRemove, EFFECT_0, SPELL_AURA_PERIODIC_DUMMY, AURA_EFFECT_HANDLE_REAL);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript* GetAuraScript() const
|
||||
{
|
||||
return new spell_ticking_time_bomb_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_utgarde_keep()
|
||||
{
|
||||
new npc_dragonflayer_forge_master();
|
||||
new npc_enslaved_proto_drake();
|
||||
|
||||
new spell_ticking_time_bomb();
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#ifndef DEF_UTGARDE_KEEP_H
|
||||
#define DEF_UTGARDE_KEEP_H
|
||||
|
||||
enum eData
|
||||
{
|
||||
DATA_KELESETH,
|
||||
DATA_DALRONN_AND_SKARVALD,
|
||||
DATA_INGVAR,
|
||||
MAX_ENCOUNTER,
|
||||
DATA_FORGE_EVENT_MASK,
|
||||
DATA_DALRONN,
|
||||
DATA_SKARVALD,
|
||||
DATA_ON_THE_ROCKS_ACHIEV,
|
||||
|
||||
DATA_SPECIAL_DRAKE = 50,
|
||||
|
||||
DATA_FORGE_1 = 100,
|
||||
DATA_FORGE_2,
|
||||
DATA_FORGE_3,
|
||||
|
||||
DATA_UNLOCK_SKARVALD_LOOT = 200,
|
||||
DATA_UNLOCK_DALRONN_LOOT,
|
||||
};
|
||||
|
||||
enum eGameObject
|
||||
{
|
||||
GO_BELLOW_1 = 186688,
|
||||
GO_BELLOW_2 = 186689,
|
||||
GO_BELLOW_3 = 186690,
|
||||
|
||||
GO_FORGEFIRE_1 = 186692,
|
||||
GO_FORGEFIRE_2 = 186693,
|
||||
GO_FORGEFIRE_3 = 186691,
|
||||
|
||||
GO_GLOWING_ANVIL_1 = 186609,
|
||||
GO_GLOWING_ANVIL_2 = 186610,
|
||||
GO_GLOWING_ANVIL_3 = 186611,
|
||||
|
||||
GO_GIANT_PORTCULLIS_1 = 186756,
|
||||
GO_GIANT_PORTCULLIS_2 = 186694,
|
||||
};
|
||||
|
||||
enum eCreatures
|
||||
{
|
||||
NPC_KELESETH = 23953,
|
||||
NPC_DALRONN = 24201,
|
||||
NPC_DALRONN_GHOST = 27389,
|
||||
NPC_SKARVALD = 24200,
|
||||
NPC_SKARVALD_GHOST = 27390,
|
||||
NPC_INGVAR = 23954,
|
||||
|
||||
NPC_DARK_RANGER_MARRAH = 24137,
|
||||
NPC_ENSLAVED_PROTO_DRAKE = 24083,
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -1,814 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "utgarde_pinnacle.h"
|
||||
|
||||
enum Misc
|
||||
{
|
||||
SAY_AGGRO = 0,
|
||||
SAY_SLAY = 1,
|
||||
SOUND_DEATH = 13467,
|
||||
|
||||
// EVENT
|
||||
SPELL_ORB_VISUAL = 48044,
|
||||
SPELL_ORB_CHANNEL = 48048,
|
||||
NPC_ORB_TRIGGER = 22515,
|
||||
SPELL_AWAKEN_SUBBOSS = 47669,
|
||||
|
||||
// PALEHOOF
|
||||
SPELL_ARCING_SMASH = 48260,
|
||||
SPELL_IMPALE_N = 48261,
|
||||
SPELL_IMPALE_H = 59268,
|
||||
SPELL_WITHERING_ROAR_N = 48256,
|
||||
SPELL_WITHERING_ROAR_H = 59267,
|
||||
SPELL_FREEZE = 16245,
|
||||
|
||||
// Massive Jormungar
|
||||
SPELL_ACID_SPIT = 48132,
|
||||
SPELL_ACID_SPLATTER_N = 48136,
|
||||
SPELL_ACID_SPLATTER_H = 59272,
|
||||
SPELL_POISON_BREATH_N = 48133,
|
||||
SPELL_POISON_BREATH_H = 59271,
|
||||
NPC_JORMUNGAR_WORM = 27228,
|
||||
|
||||
// Ferocious Rhino
|
||||
SPELL_GORE_N = 48130,
|
||||
SPELL_GORE_H = 59264,
|
||||
SPELL_GRIEVOUS_WOUND_N = 48105,
|
||||
SPELL_GRIEVOUS_WOUND_H = 59263,
|
||||
SPELL_STOMP = 48131,
|
||||
|
||||
// Ravenous Furbolg
|
||||
SPELL_CHAIN_LIGHTING_N = 48140,
|
||||
SPELL_CHAIN_LIGHTING_H = 59273,
|
||||
SPELL_CRAZED = 48139,
|
||||
SPELL_TERRIFYING_ROAR = 48144,
|
||||
|
||||
// Frenzied Worgen
|
||||
SPELL_MORTAL_WOUND_N = 48137,
|
||||
SPELL_MORTAL_WOUND_H = 59265,
|
||||
SPELL_ENRAGE_1 = 48138,
|
||||
SPELL_ENRAGE_2 = 48142,
|
||||
|
||||
// ACTIONS
|
||||
ACTION_START_EVENT = 1,
|
||||
ACTION_UNFREEZE = 2,
|
||||
ACTION_DESPAWN_ADDS = 3,
|
||||
ACTION_MINIBOSS_DIED = 4,
|
||||
ACTION_UNFREEZE2 = 5,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_UNFREEZE_MONSTER = 1,
|
||||
EVENT_START_FIGHT = 2,
|
||||
EVENT_UNFREEZE_MONSTER2 = 3,
|
||||
|
||||
EVENT_PALEHOOF_START = 4,
|
||||
EVENT_PALEHOOF_START2 = 5,
|
||||
EVENT_PALEHOOF_WITHERING_ROAR = 6,
|
||||
EVENT_PALEHOOF_IMPALE = 7,
|
||||
EVENT_PALEHOOF_ARCING_SMASH = 8,
|
||||
|
||||
EVENT_JORMUNGAR_ACID_SPIT = 10,
|
||||
EVENT_JORMUNGAR_ACID_SPLATTER = 11,
|
||||
EVENT_JORMUNGAR_POISON_BREATH = 12,
|
||||
|
||||
EVENT_RHINO_STOMP = 20,
|
||||
EVENT_RHINO_GORE = 21,
|
||||
EVENT_RHINO_WOUND = 22,
|
||||
|
||||
EVENT_FURBOLG_CHAIN = 30,
|
||||
EVENT_FURBOLG_CRAZED = 31,
|
||||
EVENT_FURBOLG_ROAR = 32,
|
||||
|
||||
EVENT_WORGEN_MORTAL = 40,
|
||||
EVENT_WORGEN_ENRAGE1 = 41,
|
||||
EVENT_WORGEN_ENRAGE2 = 42,
|
||||
};
|
||||
|
||||
/*######
|
||||
## Mob Gortok Palehoof
|
||||
######*/
|
||||
|
||||
class boss_palehoof : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_palehoof() : CreatureScript("boss_palehoof") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_palehoofAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_palehoofAI : public ScriptedAI
|
||||
{
|
||||
boss_palehoofAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript *m_pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
uint64 OrbGUID;
|
||||
uint8 Counter;
|
||||
uint8 RandomUnfreeze[4];
|
||||
|
||||
void Reset()
|
||||
{
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
bool good;
|
||||
do
|
||||
{
|
||||
good = true;
|
||||
RandomUnfreeze[i] = urand(0,3);
|
||||
|
||||
for (uint8 j = 0; j < i; ++j)
|
||||
if (RandomUnfreeze[i] == RandomUnfreeze[j])
|
||||
{
|
||||
good = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (!good);
|
||||
}
|
||||
|
||||
events.Reset();
|
||||
summons.DoAction(ACTION_DESPAWN_ADDS);
|
||||
summons.DespawnAll();
|
||||
OrbGUID = 0;
|
||||
Counter = 0;
|
||||
me->CastSpell(me, SPELL_FREEZE, true);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetControlled(false, UNIT_STATE_STUNNED);
|
||||
|
||||
if (m_pInstance)
|
||||
{
|
||||
m_pInstance->SetData(DATA_GORTOK_PALEHOOF, NOT_STARTED);
|
||||
|
||||
// Reset statue
|
||||
if (GameObject *statisGenerator = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(STATIS_GENERATOR)))
|
||||
{
|
||||
statisGenerator->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
statisGenerator->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
|
||||
// Reset mini bosses
|
||||
for(uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
if(Creature *Animal = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_NPC_FRENZIED_WORGEN+i)))
|
||||
{
|
||||
Animal->SetPosition(Animal->GetHomePosition());
|
||||
Animal->StopMovingOnCurrentPos();
|
||||
if(Animal->isDead())
|
||||
Animal->Respawn(true);
|
||||
|
||||
Animal->CastSpell(Animal, SPELL_FREEZE, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_START_EVENT)
|
||||
{
|
||||
if (Creature *cr = me->SummonCreature(NPC_ORB_TRIGGER, 238.608f, -460.71f, 109.567f))
|
||||
{
|
||||
OrbGUID = cr->GetGUID();
|
||||
cr->AddAura(SPELL_ORB_VISUAL, cr);
|
||||
summons.Summon(cr);
|
||||
cr->SetDisableGravity(true);
|
||||
cr->GetMotionMaster()->MovePoint(0, 275.4f, -453, 110); // ROOM CENTER
|
||||
events.RescheduleEvent(EVENT_UNFREEZE_MONSTER, 10000);
|
||||
me->SetInCombatWithZone();
|
||||
me->SetControlled(true, UNIT_STATE_STUNNED);
|
||||
}
|
||||
}
|
||||
else if (param == ACTION_MINIBOSS_DIED)
|
||||
{
|
||||
if (Counter > (IsHeroic() ? 3 : 1))
|
||||
events.RescheduleEvent(EVENT_PALEHOOF_START, 3000);
|
||||
else
|
||||
events.RescheduleEvent(EVENT_UNFREEZE_MONSTER, 3000);
|
||||
}
|
||||
}
|
||||
void EnterCombat(Unit* pWho)
|
||||
{
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(DATA_GORTOK_PALEHOOF, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
|
||||
return;
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_UNFREEZE_MONSTER:
|
||||
{
|
||||
if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID))
|
||||
{
|
||||
if (Creature *miniBoss = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_NPC_FRENZIED_WORGEN+RandomUnfreeze[Counter])))
|
||||
{
|
||||
Counter++;
|
||||
miniBoss->AI()->DoAction(ACTION_UNFREEZE);
|
||||
orb->CastSpell(miniBoss, SPELL_AWAKEN_SUBBOSS, true);
|
||||
events.ScheduleEvent(EVENT_UNFREEZE_MONSTER2, 6000);
|
||||
}
|
||||
else
|
||||
EnterEvadeMode();
|
||||
}
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
case EVENT_UNFREEZE_MONSTER2:
|
||||
{
|
||||
if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID))
|
||||
{
|
||||
if (Creature *miniBoss = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_NPC_FRENZIED_WORGEN+RandomUnfreeze[Counter-1])))
|
||||
{
|
||||
miniBoss->AI()->DoAction(ACTION_UNFREEZE2);
|
||||
orb->RemoveAurasDueToSpell(SPELL_AWAKEN_SUBBOSS);
|
||||
}
|
||||
else
|
||||
EnterEvadeMode();
|
||||
}
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
case EVENT_PALEHOOF_START:
|
||||
{
|
||||
if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID))
|
||||
{
|
||||
orb->CastSpell(me, SPELL_AWAKEN_SUBBOSS, true);
|
||||
events.ScheduleEvent(EVENT_PALEHOOF_START2, 6000);
|
||||
}
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
case EVENT_PALEHOOF_START2:
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
if (Creature *orb = ObjectAccessor::GetCreature(*me, OrbGUID))
|
||||
orb->RemoveAurasDueToSpell(SPELL_AWAKEN_SUBBOSS);
|
||||
|
||||
me->RemoveAurasDueToSpell(SPELL_FREEZE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetControlled(false, UNIT_STATE_STUNNED);
|
||||
// SETINCOMBATWITHZONE
|
||||
|
||||
// schedule combat events
|
||||
events.ScheduleEvent(EVENT_PALEHOOF_WITHERING_ROAR, 10000);
|
||||
events.ScheduleEvent(EVENT_PALEHOOF_IMPALE, 12000);
|
||||
events.ScheduleEvent(EVENT_PALEHOOF_ARCING_SMASH, 15000);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
case EVENT_PALEHOOF_WITHERING_ROAR:
|
||||
{
|
||||
me->CastSpell(me, IsHeroic() ? SPELL_WITHERING_ROAR_H : SPELL_WITHERING_ROAR_N, false);
|
||||
events.RepeatEvent(8000 + rand()%4000);
|
||||
break;
|
||||
}
|
||||
case EVENT_PALEHOOF_IMPALE:
|
||||
{
|
||||
if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(tgt, IsHeroic() ? SPELL_IMPALE_H : SPELL_IMPALE_N, false);
|
||||
|
||||
events.RepeatEvent(8000 + rand()%4000);
|
||||
break;
|
||||
}
|
||||
case EVENT_PALEHOOF_ARCING_SMASH:
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), SPELL_ARCING_SMASH, false);
|
||||
events.RepeatEvent(13000 + rand()%4000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* pKiller)
|
||||
{
|
||||
me->SendPlaySound(SOUND_DEATH, false);
|
||||
if(m_pInstance)
|
||||
m_pInstance->SetData(DATA_GORTOK_PALEHOOF, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetTypeId() != TYPEID_PLAYER)
|
||||
return;
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/*######
|
||||
## Mob Massive Jormungar
|
||||
######*/
|
||||
|
||||
class npc_massive_jormungar : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_massive_jormungar() : CreatureScript("npc_massive_jormungar") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_massive_jormungarAI (pCreature);
|
||||
}
|
||||
|
||||
struct npc_massive_jormungarAI : public ScriptedAI
|
||||
{
|
||||
npc_massive_jormungarAI(Creature* pCreature) : ScriptedAI(pCreature), summons(me)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript *m_pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
summons.DespawnAll();
|
||||
events.Reset();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit *) {}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_UNFREEZE)
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
else if (param == ACTION_UNFREEZE2)
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_FREEZE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetInCombatWithZone();
|
||||
|
||||
events.ScheduleEvent(EVENT_JORMUNGAR_ACID_SPIT, 3000);
|
||||
events.ScheduleEvent(EVENT_JORMUNGAR_ACID_SPLATTER, 12000);
|
||||
events.ScheduleEvent(EVENT_JORMUNGAR_POISON_BREATH, 10000);
|
||||
}
|
||||
else if (param == ACTION_DESPAWN_ADDS)
|
||||
summons.DespawnAll();
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
|
||||
return;
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_JORMUNGAR_ACID_SPIT:
|
||||
{
|
||||
if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(tgt, SPELL_ACID_SPIT, false);
|
||||
|
||||
events.RepeatEvent(2000 + rand()%2000);
|
||||
break;
|
||||
}
|
||||
case EVENT_JORMUNGAR_ACID_SPLATTER:
|
||||
{
|
||||
me->CastSpell(me, IsHeroic() ? SPELL_ACID_SPLATTER_H : SPELL_ACID_SPLATTER_N, false);
|
||||
|
||||
// Aura summon wont work because of duration
|
||||
float x, y, z;
|
||||
me->GetPosition(x, y, z);
|
||||
for (uint8 i = 0; i < 6; ++i)
|
||||
{
|
||||
if (Creature* pJormungarWorm = me->SummonCreature(NPC_JORMUNGAR_WORM, x+rand()%10, y+rand()%10, z, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000))
|
||||
{
|
||||
summons.Summon(pJormungarWorm);
|
||||
pJormungarWorm->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
events.RepeatEvent(10000 + rand()%4000);
|
||||
break;
|
||||
}
|
||||
case EVENT_JORMUNGAR_POISON_BREATH:
|
||||
{
|
||||
if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(tgt, IsHeroic() ? SPELL_POISON_BREATH_H : SPELL_POISON_BREATH_N, false);
|
||||
|
||||
events.RepeatEvent(8000 + rand()%4000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* pKiller)
|
||||
{
|
||||
if (m_pInstance)
|
||||
{
|
||||
if (Creature *palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF)))
|
||||
palehoof->AI()->DoAction(ACTION_MINIBOSS_DIED);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/*######
|
||||
## Mob Ferocious Rhino
|
||||
######*/
|
||||
|
||||
class npc_ferocious_rhino : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_ferocious_rhino() : CreatureScript("npc_ferocious_rhino") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_ferocious_rhinoAI (pCreature);
|
||||
}
|
||||
|
||||
struct npc_ferocious_rhinoAI : public ScriptedAI
|
||||
{
|
||||
npc_ferocious_rhinoAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript *m_pInstance;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit *) {}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_UNFREEZE)
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
else if (param == ACTION_UNFREEZE2)
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_FREEZE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetInCombatWithZone();
|
||||
|
||||
events.ScheduleEvent(EVENT_RHINO_STOMP, 3000);
|
||||
events.ScheduleEvent(EVENT_RHINO_GORE, 12000);
|
||||
events.ScheduleEvent(EVENT_RHINO_WOUND, 10000);
|
||||
}
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
|
||||
return;
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_RHINO_STOMP:
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), SPELL_STOMP, false);
|
||||
events.RepeatEvent(8000 + rand()%4000);
|
||||
break;
|
||||
}
|
||||
case EVENT_RHINO_GORE:
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_GORE_H : SPELL_GORE_N, false);
|
||||
events.RepeatEvent(13000 + rand()%4000);
|
||||
break;
|
||||
}
|
||||
case EVENT_RHINO_WOUND:
|
||||
{
|
||||
if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(tgt, IsHeroic() ? SPELL_GRIEVOUS_WOUND_H : SPELL_GRIEVOUS_WOUND_N, false);
|
||||
|
||||
events.RepeatEvent(18000 + rand()%4000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* pKiller)
|
||||
{
|
||||
if (m_pInstance)
|
||||
{
|
||||
if (Creature *palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF)))
|
||||
palehoof->AI()->DoAction(ACTION_MINIBOSS_DIED);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/*######
|
||||
## Mob Ravenous Furbolg
|
||||
######*/
|
||||
|
||||
class npc_ravenous_furbolg : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_ravenous_furbolg() : CreatureScript("npc_ravenous_furbolg") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_ravenous_furbolgAI (pCreature);
|
||||
}
|
||||
|
||||
struct npc_ravenous_furbolgAI : public ScriptedAI
|
||||
{
|
||||
npc_ravenous_furbolgAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript *m_pInstance;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit *) {}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_UNFREEZE)
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
else if (param == ACTION_UNFREEZE2)
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_FREEZE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetInCombatWithZone();
|
||||
|
||||
events.ScheduleEvent(EVENT_FURBOLG_CHAIN, 3000);
|
||||
events.ScheduleEvent(EVENT_FURBOLG_CRAZED, 12000);
|
||||
events.ScheduleEvent(EVENT_FURBOLG_ROAR, 10000);
|
||||
}
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
|
||||
return;
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_FURBOLG_CHAIN:
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_CHAIN_LIGHTING_H : SPELL_CHAIN_LIGHTING_N, false);
|
||||
events.RepeatEvent(4000 + rand()%3000);
|
||||
break;
|
||||
}
|
||||
case EVENT_FURBOLG_CRAZED:
|
||||
{
|
||||
me->CastSpell(me, SPELL_CRAZED, false);
|
||||
events.RepeatEvent(8000 + rand()%4000);
|
||||
break;
|
||||
}
|
||||
case EVENT_FURBOLG_ROAR:
|
||||
{
|
||||
me->CastSpell(me, SPELL_TERRIFYING_ROAR, false);
|
||||
events.RepeatEvent(10000 + rand()%5000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* pKiller)
|
||||
{
|
||||
if (m_pInstance)
|
||||
{
|
||||
if (Creature *palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF)))
|
||||
palehoof->AI()->DoAction(ACTION_MINIBOSS_DIED);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/*######
|
||||
## Mob Frenzied Worgen
|
||||
######*/
|
||||
|
||||
class npc_frenzied_worgen : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_frenzied_worgen() : CreatureScript("npc_frenzied_worgen") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_frenzied_worgenAI (pCreature);
|
||||
}
|
||||
|
||||
struct npc_frenzied_worgenAI : public ScriptedAI
|
||||
{
|
||||
npc_frenzied_worgenAI(Creature* pCreature) : ScriptedAI(pCreature)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript *m_pInstance;
|
||||
EventMap events;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit *) {}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_UNFREEZE)
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
else if (param == ACTION_UNFREEZE2)
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_FREEZE);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
me->SetInCombatWithZone();
|
||||
|
||||
events.ScheduleEvent(EVENT_WORGEN_MORTAL, 3000);
|
||||
events.ScheduleEvent(EVENT_WORGEN_ENRAGE1, 12000);
|
||||
events.ScheduleEvent(EVENT_WORGEN_ENRAGE2, 10000);
|
||||
}
|
||||
}
|
||||
|
||||
void MoveInLineOfSight(Unit *who)
|
||||
{
|
||||
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
|
||||
return;
|
||||
|
||||
ScriptedAI::MoveInLineOfSight(who);
|
||||
}
|
||||
|
||||
void JustReachedHome()
|
||||
{
|
||||
me->SetStandState(UNIT_STAND_STATE_STAND);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_WORGEN_MORTAL:
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_MORTAL_WOUND_H : SPELL_MORTAL_WOUND_H, false);
|
||||
events.RepeatEvent(4000 + rand()%3000);
|
||||
break;
|
||||
}
|
||||
case EVENT_WORGEN_ENRAGE1:
|
||||
{
|
||||
me->CastSpell(me, SPELL_ENRAGE_1, false);
|
||||
events.RepeatEvent(15000);
|
||||
break;
|
||||
}
|
||||
case EVENT_WORGEN_ENRAGE2:
|
||||
{
|
||||
me->CastSpell(me, SPELL_ENRAGE_2, false);
|
||||
events.RepeatEvent(10000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* pKiller)
|
||||
{
|
||||
if (m_pInstance)
|
||||
{
|
||||
if (Creature *palehoof = ObjectAccessor::GetCreature(*me, m_pInstance->GetData64(DATA_GORTOK_PALEHOOF)))
|
||||
palehoof->AI()->DoAction(ACTION_MINIBOSS_DIED);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class go_palehoof_sphere : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_palehoof_sphere() : GameObjectScript("go_palehoof_sphere") { }
|
||||
|
||||
bool OnGossipHello(Player *pPlayer, GameObject *pGO)
|
||||
{
|
||||
InstanceScript *pInstance = pGO->GetInstanceScript();
|
||||
|
||||
Creature *pPalehoof = ObjectAccessor::GetCreature(*pGO, pInstance ? pInstance->GetData64(DATA_GORTOK_PALEHOOF) : 0);
|
||||
if (pPalehoof && pPalehoof->IsAlive())
|
||||
{
|
||||
// maybe these are hacks :(
|
||||
pGO->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE);
|
||||
pGO->SetGoState(GO_STATE_ACTIVE);
|
||||
|
||||
pPalehoof->AI()->DoAction(ACTION_START_EVENT);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_palehoof()
|
||||
{
|
||||
new boss_palehoof();
|
||||
new npc_massive_jormungar();
|
||||
new npc_ferocious_rhino();
|
||||
new npc_ravenous_furbolg();
|
||||
new npc_frenzied_worgen();
|
||||
new go_palehoof_sphere();
|
||||
}
|
||||
@@ -1,524 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "utgarde_pinnacle.h"
|
||||
#include "Vehicle.h"
|
||||
#include "CombatAI.h"
|
||||
#include "Player.h"
|
||||
#include "SpellInfo.h"
|
||||
|
||||
enum Misc
|
||||
{
|
||||
// TEXTS
|
||||
SAY_AGGRO = 0,
|
||||
SAY_KILL = 1,
|
||||
EMOTE_RANGE = 2,
|
||||
SAY_DEATH = 3,
|
||||
SAY_DRAKE_DEATH = 4,
|
||||
EMOTE_BREATH = 5,
|
||||
SAY_DRAKE_BREATH = 6,
|
||||
|
||||
// SPELLS
|
||||
SPELL_CRUSH_N = 50234,
|
||||
SPELL_CRUSH_H = 59330,
|
||||
SPELL_POISONED_SPEAR_N = 50255,
|
||||
SPELL_POISONED_SPEAR_H = 59331,
|
||||
SPELL_WHIRLWIND_N = 50228,
|
||||
SPELL_WHIRLWIND_H = 50228,
|
||||
|
||||
SPELL_FLAME_VISUAL = 47592,
|
||||
SPELL_FLAME_BREATH_N = 47579,
|
||||
SPELL_FLAME_BREATH_H = 60020,
|
||||
|
||||
SPELL_LAUNCH_HARPOON = 48642,
|
||||
|
||||
// NPCS
|
||||
NPC_YMIRJAR_WARRIOR = 26690,
|
||||
NPC_YMIRJAR_WITCH_DOCTOR = 26691,
|
||||
NPC_YMIRJAR_HARPOONER = 26692,
|
||||
NPC_GRAUF = 26893,
|
||||
NPC_BREATH_TRIGGER = 28351,
|
||||
EQUIP_MACE = 17193,
|
||||
|
||||
// ACTIONS
|
||||
ACTION_START_EVENT = 1,
|
||||
ACTION_REMOVE_SKADI = 2,
|
||||
ACTION_PHASE2 = 3,
|
||||
ACTION_MYGIRL_ACHIEVEMENT = 4,
|
||||
|
||||
// ACHIEVEMENTS
|
||||
ACHIEV_TIMED_LODI_DODI = 17726,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
// SKADI
|
||||
EVENT_SKADI_START = 1,
|
||||
EVENT_SKADI_CRUSH = 2,
|
||||
EVENT_SKADI_SPEAR = 3,
|
||||
EVENT_SKADI_WHIRLWIND = 4,
|
||||
|
||||
// GRAUF
|
||||
EVENT_GRAUF_START = 10,
|
||||
EVENT_GRAUF_MOVE = 11,
|
||||
EVENT_GRAUF_SUMMON_HELPERS = 12,
|
||||
EVENT_GRAUF_CHECK = 13,
|
||||
EVENT_GRAUF_REMOVE_SKADI = 14,
|
||||
};
|
||||
|
||||
static Position TrashPosition[]=
|
||||
{
|
||||
{441.236f, -512.000f, 104.930f},
|
||||
{478.436f, -494.475f, 104.730f}
|
||||
};
|
||||
|
||||
static Position SkadiPosition[] =
|
||||
{
|
||||
{338.679f, -507.254f, 124.122f},
|
||||
{338.679f, -513.254f, 124.122f},
|
||||
{490.096f, -510.86f, 123.368f},
|
||||
{490.76f, -517.389f, 123.368f}
|
||||
};
|
||||
|
||||
#define EMOTE_IN_RANGE "Skadi the Ruthless is within range of the harpoon launchers"
|
||||
|
||||
enum phase
|
||||
{
|
||||
PHASE_NONE,
|
||||
PHASE_START,
|
||||
PHASE_FLIGHT,
|
||||
PHASE_LAND,
|
||||
PHASE_GROUND
|
||||
};
|
||||
|
||||
class boss_skadi : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_skadi() : CreatureScript("boss_skadi") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_skadiAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_skadiAI : public ScriptedAI
|
||||
{
|
||||
boss_skadiAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript *m_pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
uint64 GraufGUID;
|
||||
bool SecondPhase, EventStarted;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
if (Creature *cr = me->SummonCreature(NPC_GRAUF, 341.741f, -516.955f, 104.669f, 3.12414f))
|
||||
{
|
||||
GraufGUID = cr->GetGUID();
|
||||
summons.Summon(cr);
|
||||
}
|
||||
SecondPhase = false;
|
||||
EventStarted = false;
|
||||
|
||||
me->RemoveAllAuras();
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
me->UpdatePosition(343.02f, -507.325f, 104.567f, M_PI, true);
|
||||
me->StopMovingOnCurrentPos();
|
||||
|
||||
if(m_pInstance)
|
||||
{
|
||||
m_pInstance->DoStopTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_LODI_DODI);
|
||||
m_pInstance->SetData(DATA_SKADI_THE_RUTHLESS, NOT_STARTED);
|
||||
m_pInstance->SetData(SKADI_IN_RANGE, 0);
|
||||
m_pInstance->SetData(SKADI_HITS, 0);
|
||||
m_pInstance->SetData(DATA_SKADI_ACHIEVEMENT, false);
|
||||
}
|
||||
}
|
||||
|
||||
Creature *GetGrauf() { return ObjectAccessor::GetCreature(*me, GraufGUID); }
|
||||
|
||||
void EnterCombat(Unit* pWho)
|
||||
{
|
||||
if (!EventStarted)
|
||||
{
|
||||
EventStarted = true;
|
||||
Talk(SAY_AGGRO);
|
||||
if (m_pInstance)
|
||||
{
|
||||
if (IsHeroic())
|
||||
m_pInstance->DoStartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, ACHIEV_TIMED_LODI_DODI);
|
||||
|
||||
m_pInstance->SetData(DATA_SKADI_THE_RUTHLESS, IN_PROGRESS);
|
||||
}
|
||||
|
||||
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||
me->SetInCombatWithZone();
|
||||
events.RescheduleEvent(EVENT_SKADI_START, 2000);
|
||||
}
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
|
||||
if (param == ACTION_PHASE2)
|
||||
{
|
||||
SecondPhase = true;
|
||||
events.ScheduleEvent(EVENT_SKADI_CRUSH, 8000);
|
||||
events.ScheduleEvent(EVENT_SKADI_SPEAR, 10000);
|
||||
events.ScheduleEvent(EVENT_SKADI_WHIRLWIND, 15000);
|
||||
|
||||
if (me->GetVictim())
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
else
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim() && SecondPhase)
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_SKADI_START:
|
||||
{
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
if (Creature *cr = GetGrauf())
|
||||
{
|
||||
me->EnterVehicleUnattackable(cr, 0);
|
||||
cr->AI()->DoAction(ACTION_START_EVENT);
|
||||
}
|
||||
else
|
||||
EnterEvadeMode();
|
||||
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
case EVENT_SKADI_CRUSH:
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_CRUSH_H : SPELL_CRUSH_N, false);
|
||||
events.RepeatEvent(8000);
|
||||
break;
|
||||
}
|
||||
case EVENT_SKADI_SPEAR:
|
||||
{
|
||||
if (Unit *tgt = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
me->CastSpell(tgt, IsHeroic() ? SPELL_POISONED_SPEAR_H : SPELL_POISONED_SPEAR_N, false);
|
||||
|
||||
events.RepeatEvent(10000);
|
||||
break;
|
||||
}
|
||||
case EVENT_SKADI_WHIRLWIND:
|
||||
{
|
||||
me->CastSpell(me, IsHeroic() ? SPELL_WHIRLWIND_H : SPELL_WHIRLWIND_N, false);
|
||||
events.RepeatEvent(15000 + rand()%5000);
|
||||
events.DelayEvents(10000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* pKiller)
|
||||
{
|
||||
summons.DespawnAll();
|
||||
Talk(SAY_DEATH);
|
||||
|
||||
if (m_pInstance)
|
||||
{
|
||||
m_pInstance->SetData(DATA_SKADI_THE_RUTHLESS, DONE);
|
||||
m_pInstance->HandleGameObject(m_pInstance->GetData64(SKADI_DOOR), true);
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* pVictim)
|
||||
{
|
||||
if (urand(0,1))
|
||||
return;
|
||||
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class boss_skadi_grauf : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_skadi_grauf() : CreatureScript("boss_skadi_grauf") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_skadi_graufAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_skadi_graufAI : public VehicleAI
|
||||
{
|
||||
boss_skadi_graufAI(Creature *pCreature) : VehicleAI(pCreature), summons(me)
|
||||
{
|
||||
m_pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript *m_pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
uint8 currentPos;
|
||||
uint8 AchievementHitCount;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
currentPos = 0;
|
||||
AchievementHitCount = 0;
|
||||
me->RemoveAllAuras();
|
||||
}
|
||||
|
||||
void DoAction(int32 param)
|
||||
{
|
||||
if (param == ACTION_START_EVENT)
|
||||
{
|
||||
events.RescheduleEvent(EVENT_GRAUF_CHECK, 5000);
|
||||
events.RescheduleEvent(EVENT_GRAUF_START, 2000);
|
||||
}
|
||||
else if (param == ACTION_REMOVE_SKADI)
|
||||
{
|
||||
Talk(SAY_DRAKE_DEATH);
|
||||
me->GetMotionMaster()->MovePoint(10, 480.0f, -513.0f, 108.0f);
|
||||
events.ScheduleEvent(EVENT_GRAUF_REMOVE_SKADI, 2000);
|
||||
}
|
||||
else if (param == ACTION_MYGIRL_ACHIEVEMENT)
|
||||
{
|
||||
AchievementHitCount++;
|
||||
if (AchievementHitCount >= 3 && m_pInstance)
|
||||
m_pInstance->SetData(DATA_SKADI_ACHIEVEMENT, true);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit *target, const SpellInfo *spellInfo)
|
||||
{
|
||||
if (spellInfo->Id == 47593) // SPELL_FLAME_VISUAL trigger
|
||||
target->CastSpell(target, me->GetMap()->IsHeroic() ? SPELL_FLAME_BREATH_H : SPELL_FLAME_BREATH_N, true);
|
||||
}
|
||||
|
||||
void SpawnFlameTriggers(uint8 point)
|
||||
{
|
||||
for(uint8 j = 0; j < 50; ++j)
|
||||
{
|
||||
if (point == 1)
|
||||
me->SummonCreature(NPC_BREATH_TRIGGER, 480.0f-(j*3), -518.0f+(j/16.0f), 105.0f, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
|
||||
else
|
||||
me->SummonCreature(NPC_BREATH_TRIGGER, 480.0f-(j*3), -510.0f+(j/16.0f), 105.0f, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
|
||||
}
|
||||
// and out of loop, cover the small room
|
||||
if (point == 0)
|
||||
{
|
||||
Creature *cr;
|
||||
if (cr = me->SummonCreature(NPC_BREATH_TRIGGER, 483, -484.9f, 105, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000))
|
||||
cr->CastSpell(cr, cr->GetMap()->IsHeroic() ? SPELL_FLAME_BREATH_H : SPELL_FLAME_BREATH_N, true);
|
||||
if (cr = me->SummonCreature(NPC_BREATH_TRIGGER, 471.0f, -484.7f, 105, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000))
|
||||
cr->CastSpell(cr, cr->GetMap()->IsHeroic() ? SPELL_FLAME_BREATH_H : SPELL_FLAME_BREATH_N, true);
|
||||
|
||||
for (uint8 j = 0; j < 7; j++)
|
||||
if (cr = me->SummonCreature(NPC_BREATH_TRIGGER, 477.0f, -507.0f+(j*3), 105.0f, 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000))
|
||||
cr->CastSpell(cr, cr->GetMap()->IsHeroic() ? SPELL_FLAME_BREATH_H : SPELL_FLAME_BREATH_N, true);
|
||||
}
|
||||
}
|
||||
|
||||
void MovementInform(uint32 uiType, uint32 Id)
|
||||
{
|
||||
switch(Id)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
me->RemoveAurasDueToSpell(SPELL_FLAME_VISUAL);
|
||||
me->SetFacingTo(M_PI*2);
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(SKADI_IN_RANGE, 1);
|
||||
|
||||
me->MonsterTextEmote(EMOTE_IN_RANGE, 0, true);
|
||||
me->SetFacingTo(M_PI);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
uint8 SelectNextPos(uint8 Position)
|
||||
{
|
||||
switch (Position)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
return 2+urand(0,1);
|
||||
default:
|
||||
if (me->GetPositionY() < -515.0f)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit *)
|
||||
{
|
||||
me->SetInCombatWithZone();
|
||||
}
|
||||
|
||||
void RemoveSkadi(bool withEvade)
|
||||
{
|
||||
if (Unit *skadi = me->GetVehicleKit()->GetPassenger(0))
|
||||
{
|
||||
summons.DespawnAll();
|
||||
skadi->ExitVehicle();
|
||||
if (withEvade)
|
||||
{
|
||||
skadi->ToCreature()->AI()->EnterEvadeMode();
|
||||
skadi->UpdatePosition(343.02f, -507.325f, 104.567f, M_PI, true);
|
||||
}
|
||||
else
|
||||
skadi->ToCreature()->AI()->DoAction(ACTION_PHASE2);
|
||||
|
||||
skadi->StopMovingOnCurrentPos();
|
||||
}
|
||||
}
|
||||
|
||||
void CheckPlayers()
|
||||
{
|
||||
Map::PlayerList const& pList = me->GetMap()->GetPlayers();
|
||||
for(Map::PlayerList::const_iterator itr = pList.begin(); itr != pList.end(); ++itr)
|
||||
{
|
||||
if (itr->GetSource()->GetPositionX() < 320.0f || itr->GetSource()->IsGameMaster() || !itr->GetSource()->IsAlive())
|
||||
continue;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
RemoveSkadi(true);
|
||||
}
|
||||
|
||||
void SpawnHelpers(uint8 Spot)
|
||||
{
|
||||
if (Creature *Harpooner = me->SummonCreature(NPC_YMIRJAR_HARPOONER, TrashPosition[Spot].GetPositionX()+rand()%5, TrashPosition[Spot].GetPositionY()+rand()%5, TrashPosition[Spot].GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
{
|
||||
Harpooner->SetInCombatWithZone();
|
||||
summons.Summon(Harpooner);
|
||||
}
|
||||
if (Creature *Second = me->SummonCreature((urand(0,1) ? NPC_YMIRJAR_WARRIOR : NPC_YMIRJAR_WITCH_DOCTOR), TrashPosition[Spot].GetPositionX()+rand()%5, TrashPosition[Spot].GetPositionY()+rand()%5, TrashPosition[Spot].GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
{
|
||||
Second->SetInCombatWithZone();
|
||||
summons.Summon(Second);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events.Update(diff);
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_GRAUF_CHECK:
|
||||
{
|
||||
CheckPlayers();
|
||||
events.RepeatEvent(2000);
|
||||
break;
|
||||
}
|
||||
case EVENT_GRAUF_START:
|
||||
{
|
||||
me->GetMotionMaster()->Clear(true);
|
||||
me->GetMotionMaster()->MoveTakeoff(10, SkadiPosition[0].GetPositionX(), SkadiPosition[0].GetPositionY(), SkadiPosition[0].GetPositionZ(), 3.0f);
|
||||
|
||||
SpawnHelpers(0);
|
||||
SpawnHelpers(0);
|
||||
events.ScheduleEvent(EVENT_GRAUF_MOVE, 15000);
|
||||
events.ScheduleEvent(EVENT_GRAUF_SUMMON_HELPERS, 20000);
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
case EVENT_GRAUF_MOVE:
|
||||
{
|
||||
AchievementHitCount = 0;
|
||||
uint8 targetPoint = SelectNextPos(currentPos);
|
||||
me->GetMotionMaster()->MovePoint(targetPoint, SkadiPosition[targetPoint].GetPositionX(), SkadiPosition[targetPoint].GetPositionY(), SkadiPosition[targetPoint].GetPositionZ());
|
||||
if (targetPoint <= 1)
|
||||
{
|
||||
SpawnFlameTriggers(targetPoint);
|
||||
me->CastSpell(me, SPELL_FLAME_VISUAL, false);
|
||||
}
|
||||
|
||||
if (m_pInstance)
|
||||
m_pInstance->SetData(SKADI_IN_RANGE, 0);
|
||||
|
||||
currentPos = targetPoint;
|
||||
events.RepeatEvent(25000);
|
||||
break;
|
||||
}
|
||||
case EVENT_GRAUF_SUMMON_HELPERS:
|
||||
{
|
||||
SpawnHelpers(1);
|
||||
events.RepeatEvent(15000);
|
||||
break;
|
||||
}
|
||||
case EVENT_GRAUF_REMOVE_SKADI:
|
||||
{
|
||||
RemoveSkadi(false);
|
||||
me->DespawnOrUnsummon();
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class go_harpoon_canon : public GameObjectScript
|
||||
{
|
||||
public:
|
||||
go_harpoon_canon() : GameObjectScript("go_harpoon_canon") { }
|
||||
|
||||
bool OnGossipHello(Player* pPlayer, GameObject* pGO)
|
||||
{
|
||||
InstanceScript *m_pInstance = pGO->GetInstanceScript();
|
||||
if (m_pInstance && m_pInstance->GetData(DATA_SKADI_THE_RUTHLESS) == IN_PROGRESS)
|
||||
if (m_pInstance->GetData(SKADI_IN_RANGE) == 1)
|
||||
{
|
||||
uint8 count = m_pInstance->GetData(SKADI_HITS)+1;
|
||||
m_pInstance->SetData(SKADI_HITS, count);
|
||||
|
||||
if (Creature *grauf = ObjectAccessor::GetCreature(*pPlayer, m_pInstance->GetData64(DATA_GRAUF)))
|
||||
{
|
||||
if (count >= 3)
|
||||
{
|
||||
m_pInstance->SetData(SKADI_IN_RANGE, 0);
|
||||
grauf->AI()->DoAction(ACTION_REMOVE_SKADI);
|
||||
}
|
||||
|
||||
grauf->AI()->DoAction(ACTION_MYGIRL_ACHIEVEMENT);
|
||||
}
|
||||
pGO->CastSpell((Unit*)NULL, SPELL_LAUNCH_HARPOON);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_skadi()
|
||||
{
|
||||
new boss_skadi();
|
||||
new boss_skadi_grauf();
|
||||
new go_harpoon_canon();
|
||||
}
|
||||
@@ -1,444 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "utgarde_pinnacle.h"
|
||||
#include "SpellScript.h"
|
||||
#include "Player.h"
|
||||
#include "PassiveAI.h"
|
||||
|
||||
enum Misc
|
||||
{
|
||||
// SAY
|
||||
TALK_INTRO_A1 = 0,
|
||||
TALK_INTRO_A2 = 1,
|
||||
TALK_INTRO_S1 = 0,
|
||||
TALK_INTRO_S2 = 0,
|
||||
TALK_INTRO_S3 = 1,
|
||||
SAY_AGGRO = 2,
|
||||
SAY_SLAY = 3,
|
||||
SAY_DEATH = 4,
|
||||
SAY_SACRIFICE_PLAYER = 5,
|
||||
|
||||
// SPELLS
|
||||
// INTRO
|
||||
SPELL_ARTHAS_TRANSFORMING_SVALA = 54142,
|
||||
SPELL_SVALA_TRANSFORMING1 = 54205,
|
||||
SPELL_SVALA_TRANSFORMING2 = 54140,
|
||||
|
||||
// SORROWGRAVE
|
||||
SPELL_CALL_FLAMES = 48258,
|
||||
SPELL_BALL_OF_FLAME = 48246,
|
||||
SPELL_RITUAL_OF_THE_SWORD = 48276,
|
||||
SPELL_RITUAL_STRIKE = 48331,
|
||||
SPELL_SINSTER_STRIKE_N = 15667,
|
||||
SPELL_SINSTER_STRIKE_H = 59409,
|
||||
EQUIP_SWORD = 40343,
|
||||
|
||||
// CHANNELERS
|
||||
SPELL_PARALYZE = 48278,
|
||||
SPELL_SHADOWS_IN_THE_DARK = 59407,
|
||||
SPELL_TELEPORT_VISUAL = 64446,
|
||||
|
||||
// NPCS
|
||||
NPC_RITUAL_CHANNELER = 27281,
|
||||
NPC_ARTHAS = 29280,
|
||||
NPC_FLAME_BRAZIER = 27273,
|
||||
|
||||
// ACTIONS
|
||||
ACTION_START_SORROWGRAVE = 1,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
// BASE EVENT START
|
||||
EVENT_SVALA_START = 1,
|
||||
EVENT_SVALA_TALK1 = 2,
|
||||
EVENT_SVALA_TALK2 = 3,
|
||||
EVENT_SVALA_TALK3 = 4,
|
||||
EVENT_SVALA_TALK4 = 5,
|
||||
EVENT_SVALA_TALK5 = 6,
|
||||
EVENT_SVALA_TALK6 = 7,
|
||||
EVENT_SVALA_TALK7 = 8,
|
||||
EVENT_SVALA_TALK8 = 9,
|
||||
EVENT_SVALA_TALK9 = 20,
|
||||
|
||||
// FIGHT
|
||||
EVENT_SORROWGRAVE_SS = 10,
|
||||
EVENT_SORROWGRAVE_FLAMES = 11,
|
||||
EVENT_SORROWGRAVE_FLAMES2 = 12,
|
||||
EVENT_SORROWGRAVE_RITUAL = 13,
|
||||
EVENT_SORROWGRAVE_RITUAL_SPELLS = 14,
|
||||
EVENT_SORROWGRAVE_FINISH_RITUAL = 15,
|
||||
};
|
||||
|
||||
const Position RitualChannelerLoc[3]=
|
||||
{
|
||||
{296.42f, -355.01f, 90.94f, 0.0f},
|
||||
{302.36f, -352.01f, 90.54f, 0.0f},
|
||||
{291.39f, -350.89f, 90.54f, 0.0f}
|
||||
};
|
||||
|
||||
/*######
|
||||
## Boss Svala
|
||||
######*/
|
||||
|
||||
class boss_svala : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_svala() : CreatureScript("boss_svala") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_svalaAI (creature);
|
||||
}
|
||||
|
||||
struct boss_svalaAI : public ScriptedAI
|
||||
{
|
||||
boss_svalaAI(Creature* creature) : ScriptedAI(creature), summons(me)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
Started = false;
|
||||
ArthasGUID = 0;
|
||||
}
|
||||
|
||||
uint64 ArthasGUID;
|
||||
bool Started;
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
EventMap events2;
|
||||
SummonList summons;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
if (instance)
|
||||
{
|
||||
instance->SetData(DATA_SVALA_SORROWGRAVE, NOT_STARTED);
|
||||
instance->SetData(DATA_SVALA_ACHIEVEMENT, false);
|
||||
}
|
||||
|
||||
summons.DespawnAll();
|
||||
events.Reset();
|
||||
events2.Reset();
|
||||
if (!Started)
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
else
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->SetHover(true);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
ScriptedAI::EnterEvadeMode();
|
||||
}
|
||||
|
||||
void SetData(uint32 data, uint32 param)
|
||||
{
|
||||
if (data != 1 || param != 1 || Started || instance->GetData(DATA_SVALA_SORROWGRAVE) == DONE)
|
||||
return;
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
Started = true;
|
||||
me->setActive(true);
|
||||
events2.ScheduleEvent(EVENT_SVALA_START, 5000);
|
||||
if (Creature* pArthas = me->SummonCreature(NPC_ARTHAS, 295.81f, -366.16f, 92.57f, 1.58f, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 59000))
|
||||
ArthasGUID = pArthas->GetGUID();
|
||||
|
||||
if (instance)
|
||||
{
|
||||
instance->SetData(DATA_SVALA_SORROWGRAVE, IN_PROGRESS);
|
||||
if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_SVALA_MIRROR)))
|
||||
mirror->SetGoState(GO_STATE_READY);
|
||||
}
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summon)
|
||||
{
|
||||
summons.Summon(summon);
|
||||
if (summon->GetEntry() == NPC_RITUAL_CHANNELER)
|
||||
summon->CastSpell(summon, SPELL_TELEPORT_VISUAL, true);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit*)
|
||||
{
|
||||
me->SetInCombatWithZone();
|
||||
Talk(SAY_AGGRO);
|
||||
|
||||
events.ScheduleEvent(EVENT_SORROWGRAVE_SS, 3000);
|
||||
events.ScheduleEvent(EVENT_SORROWGRAVE_FLAMES, 11000);
|
||||
events.ScheduleEvent(EVENT_SORROWGRAVE_RITUAL, 25000);
|
||||
|
||||
if (instance)
|
||||
instance->SetData(DATA_SVALA_SORROWGRAVE, IN_PROGRESS);
|
||||
}
|
||||
|
||||
void JustDied(Unit*)
|
||||
{
|
||||
summons.DespawnAll();
|
||||
Talk(SAY_DEATH);
|
||||
if(instance)
|
||||
instance->SetData(DATA_SVALA_SORROWGRAVE, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* victim)
|
||||
{
|
||||
if (victim->GetEntry() == NPC_SCOURGE_HULK && instance)
|
||||
{
|
||||
instance->SetData(DATA_SVALA_ACHIEVEMENT, true);
|
||||
instance->DoUpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE, 26555, 1, NULL);
|
||||
}
|
||||
|
||||
if (victim->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
events2.Update(diff);
|
||||
switch (events2.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SVALA_START:
|
||||
Talk(TALK_INTRO_S1);
|
||||
events2.ScheduleEvent(EVENT_SVALA_TALK1, 8000);
|
||||
break;
|
||||
case EVENT_SVALA_TALK1:
|
||||
if (Creature* Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID))
|
||||
Arthas->AI()->Talk(TALK_INTRO_A1);
|
||||
events2.ScheduleEvent(EVENT_SVALA_TALK2, 9000);
|
||||
break;
|
||||
case EVENT_SVALA_TALK2:
|
||||
if (Creature* Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID))
|
||||
Arthas->CastSpell(me, SPELL_ARTHAS_TRANSFORMING_SVALA, false);
|
||||
me->CastSpell(me, SPELL_SVALA_TRANSFORMING2, true);
|
||||
events2.ScheduleEvent(EVENT_SVALA_TALK3, 3000);
|
||||
break;
|
||||
case EVENT_SVALA_TALK3:
|
||||
me->SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 6.0f);
|
||||
me->SetHover(true);
|
||||
me->AddUnitState(UNIT_STATE_NO_ENVIRONMENT_UPD);
|
||||
events2.ScheduleEvent(30, 1000);
|
||||
events2.ScheduleEvent(EVENT_SVALA_TALK4, 9000);
|
||||
break;
|
||||
case 30:
|
||||
{
|
||||
WorldPacket data(SMSG_SPLINE_MOVE_SET_HOVER, 9);
|
||||
data.append(me->GetPackGUID());
|
||||
me->SendMessageToSet(&data, false);
|
||||
break;
|
||||
}
|
||||
case EVENT_SVALA_TALK4:
|
||||
{
|
||||
me->CastSpell(me, SPELL_SVALA_TRANSFORMING1, true);
|
||||
me->UpdateEntry(NPC_SVALA_SORROWGRAVE);
|
||||
me->SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 6.0f);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
if (Creature* Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID))
|
||||
Arthas->InterruptNonMeleeSpells(false);
|
||||
me->RemoveAllAuras();
|
||||
me->SetWalk(false);
|
||||
events2.ScheduleEvent(EVENT_SVALA_TALK5, 2000);
|
||||
|
||||
std::list<Creature*> creatureList;
|
||||
me->GetCreaturesWithEntryInRange(creatureList, 100.0f, NPC_DRAGONFLAYER_SPECTATOR);
|
||||
for (std::list<Creature*>::const_iterator itr = creatureList.begin(); itr != creatureList.end(); ++itr)
|
||||
(*itr)->AI()->SetData(1, 2);
|
||||
|
||||
break;
|
||||
}
|
||||
case EVENT_SVALA_TALK5:
|
||||
Talk(TALK_INTRO_S2);
|
||||
events2.ScheduleEvent(EVENT_SVALA_TALK6, 12000);
|
||||
break;
|
||||
case EVENT_SVALA_TALK6:
|
||||
if (Creature *Arthas = ObjectAccessor::GetCreature(*me, ArthasGUID))
|
||||
Arthas->AI()->Talk(TALK_INTRO_A2);
|
||||
events2.ScheduleEvent(EVENT_SVALA_TALK7, 9000);
|
||||
break;
|
||||
case EVENT_SVALA_TALK7:
|
||||
me->SetFacingTo(M_PI/2.0f);
|
||||
Talk(TALK_INTRO_S3);
|
||||
if (GameObject* mirror = ObjectAccessor::GetGameObject(*me, instance->GetData64(GO_SVALA_MIRROR)))
|
||||
mirror->SetGoState(GO_STATE_ACTIVE);
|
||||
events2.ScheduleEvent(EVENT_SVALA_TALK8, 13000);
|
||||
break;
|
||||
case EVENT_SVALA_TALK8:
|
||||
me->GetMotionMaster()->MoveFall(0, true);
|
||||
events2.ScheduleEvent(EVENT_SVALA_TALK9, 2000);
|
||||
break;
|
||||
case EVENT_SVALA_TALK9:
|
||||
me->SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 3.0f);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_IMMUNE_TO_NPC);
|
||||
me->LoadEquipment(1, true);
|
||||
me->setActive(false);
|
||||
if (Player* target = SelectTargetFromPlayerList(100.0f))
|
||||
AttackStart(target);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.ExecuteEvent())
|
||||
{
|
||||
case EVENT_SORROWGRAVE_SS:
|
||||
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SINSTER_STRIKE_H : SPELL_SINSTER_STRIKE_N, false);
|
||||
events.ScheduleEvent(EVENT_SORROWGRAVE_SS, urand(3000, 5000));
|
||||
break;
|
||||
case EVENT_SORROWGRAVE_FLAMES:
|
||||
summons.DespawnAll();
|
||||
me->CastSpell(me, SPELL_CALL_FLAMES, false);
|
||||
events.ScheduleEvent(EVENT_SORROWGRAVE_FLAMES2, 500);
|
||||
events.ScheduleEvent(EVENT_SORROWGRAVE_FLAMES2, 1000);
|
||||
events.ScheduleEvent(EVENT_SORROWGRAVE_FLAMES, urand(8000, 12000));
|
||||
break;
|
||||
case EVENT_SORROWGRAVE_FLAMES2:
|
||||
{
|
||||
std::list<Creature*> braziers;
|
||||
me->GetCreaturesWithEntryInRange(braziers, 100.0f, NPC_FLAME_BRAZIER);
|
||||
if (!braziers.empty())
|
||||
{
|
||||
for (std::list<Creature*>::const_iterator itr = braziers.begin(); itr != braziers.end(); ++itr)
|
||||
(*itr)->CastCustomSpell(SPELL_BALL_OF_FLAME, SPELLVALUE_MAX_TARGETS, 1, (*itr), true);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case EVENT_SORROWGRAVE_RITUAL:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
{
|
||||
Talk(SAY_SACRIFICE_PLAYER);
|
||||
|
||||
for (uint8 i = 0; i < 3; ++i)
|
||||
if (Creature* cr = me->SummonCreature(NPC_RITUAL_CHANNELER, RitualChannelerLoc[i], TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 360000))
|
||||
cr->AI()->AttackStart(target);
|
||||
|
||||
me->GetMotionMaster()->MoveIdle();
|
||||
DoTeleportPlayer(target, 296.632f, -346.075f, 90.63f, 4.6f);
|
||||
me->NearTeleportTo(296.632f, -346.075f, 110.0f, 4.6f, false);
|
||||
me->SetControlled(true, UNIT_STATE_ROOT);
|
||||
me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE);
|
||||
me->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE_PERCENT);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
}
|
||||
|
||||
events.DelayEvents(25001); // +1 just to be sure
|
||||
events.ScheduleEvent(EVENT_SORROWGRAVE_RITUAL_SPELLS, 0);
|
||||
events.ScheduleEvent(EVENT_SORROWGRAVE_FINISH_RITUAL, 25000);
|
||||
return;
|
||||
case EVENT_SORROWGRAVE_RITUAL_SPELLS:
|
||||
//me->CastSpell(me, SPELL_RITUAL_OF_THE_SWORD, false);
|
||||
me->CastSpell(me, SPELL_RITUAL_STRIKE, true);
|
||||
return;
|
||||
case EVENT_SORROWGRAVE_FINISH_RITUAL:
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->SetControlled(false, UNIT_STATE_ROOT);
|
||||
AttackStart(me->GetVictim());
|
||||
me->GetMotionMaster()->MoveFall(0, true);
|
||||
summons.DespawnAll();
|
||||
break;
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/*######
|
||||
## Mob Ritual Channeler
|
||||
######*/
|
||||
|
||||
class npc_ritual_channeler : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_ritual_channeler() : CreatureScript("npc_ritual_channeler") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new npc_ritual_channelerAI (pCreature);
|
||||
}
|
||||
|
||||
struct npc_ritual_channelerAI : public NullCreatureAI
|
||||
{
|
||||
npc_ritual_channelerAI(Creature* pCreature) : NullCreatureAI(pCreature) {}
|
||||
|
||||
void AttackStart(Unit* pWho)
|
||||
{
|
||||
if (me->GetMap()->GetDifficulty() == DUNGEON_DIFFICULTY_HEROIC)
|
||||
me->AddAura(SPELL_SHADOWS_IN_THE_DARK, me);
|
||||
|
||||
if (pWho)
|
||||
{
|
||||
me->AddThreat(pWho, 10000000.0f);
|
||||
me->CastSpell(pWho, SPELL_PARALYZE, false);
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
class spell_svala_ritual_strike : public SpellScriptLoader
|
||||
{
|
||||
public:
|
||||
spell_svala_ritual_strike() : SpellScriptLoader("spell_svala_ritual_strike") { }
|
||||
|
||||
class spell_svala_ritual_strike_SpellScript : public SpellScript
|
||||
{
|
||||
PrepareSpellScript(spell_svala_ritual_strike_SpellScript);
|
||||
|
||||
void HandleDummyEffect(SpellEffIndex /*effIndex*/)
|
||||
{
|
||||
if (Unit* unitTarget = GetHitUnit())
|
||||
{
|
||||
if (unitTarget->GetTypeId() != TYPEID_UNIT)
|
||||
return;
|
||||
|
||||
Unit::DealDamage(GetCaster(), unitTarget, 7000, NULL, DIRECT_DAMAGE);
|
||||
}
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
OnEffectHitTarget += SpellEffectFn(spell_svala_ritual_strike_SpellScript::HandleDummyEffect, EFFECT_2, SPELL_EFFECT_DUMMY);
|
||||
}
|
||||
};
|
||||
|
||||
SpellScript *GetSpellScript() const
|
||||
{
|
||||
return new spell_svala_ritual_strike_SpellScript();
|
||||
}
|
||||
|
||||
class spell_svala_ritual_strike_AuraScript : public AuraScript
|
||||
{
|
||||
PrepareAuraScript(spell_svala_ritual_strike_AuraScript);
|
||||
|
||||
void CalculateAmount(AuraEffect const * /*aurEff*/, int32 & amount, bool & /*canBeRecalculated*/)
|
||||
{
|
||||
// Set amount based on difficulty
|
||||
amount = (GetCaster()->GetMap()->IsHeroic() ? 2000 : 1000);
|
||||
}
|
||||
|
||||
void Register()
|
||||
{
|
||||
DoEffectCalcAmount += AuraEffectCalcAmountFn(spell_svala_ritual_strike_AuraScript::CalculateAmount, EFFECT_1, SPELL_AURA_PERIODIC_DAMAGE);
|
||||
}
|
||||
};
|
||||
|
||||
AuraScript *GetAuraScript() const
|
||||
{
|
||||
return new spell_svala_ritual_strike_AuraScript();
|
||||
}
|
||||
};
|
||||
|
||||
void AddSC_boss_svala()
|
||||
{
|
||||
new boss_svala();
|
||||
new npc_ritual_channeler();
|
||||
new spell_svala_ritual_strike();
|
||||
}
|
||||
@@ -1,341 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "utgarde_pinnacle.h"
|
||||
#include "SpellInfo.h"
|
||||
|
||||
enum Misc
|
||||
{
|
||||
// TEXTS
|
||||
SAY_AGGRO = 0,
|
||||
SAY_SLAY = 1,
|
||||
SAY_DEATH = 2,
|
||||
SAY_SUMMON_BJORN = 3,
|
||||
SAY_SUMMON_HALDOR = 4,
|
||||
SAY_SUMMON_RANULF = 5,
|
||||
SAY_SUMMON_TORGYN = 6,
|
||||
|
||||
// SPELLS
|
||||
SPELL_BANE_N = 48294,
|
||||
SPELL_BANE_H = 59301,
|
||||
SPELL_DARK_SLASH = 48292,
|
||||
SPELL_FETID_ROT_N = 48291,
|
||||
SPELL_FETID_ROT_H = 59300,
|
||||
SPELL_SCREAMS_OF_THE_DEAD = 51750,
|
||||
SPELL_SPIRIT_BURST_N = 48529, // when Ranulf
|
||||
SPELL_SPIRIT_BURST_H = 59305, // when Ranulf
|
||||
SPELL_SPIRIT_STRIKE_N = 48423, // when Haldor
|
||||
SPELL_SPIRIT_STRIKE_H = 59304, // when Haldor
|
||||
|
||||
SPELL_SUMMON_AVENGING_SPIRIT = 48592,
|
||||
SPELL_SUMMON_SPIRIT_FOUNT = 48386,
|
||||
|
||||
SPELL_CHANNEL_SPIRIT_TO_YMIRON = 48316,
|
||||
SPELL_CHANNEL_YMIRON_TO_SPIRIT = 48307,
|
||||
|
||||
SPELL_SPIRIT_FOUNT_N = 48380,
|
||||
SPELL_SPIRIT_FOUNT_H = 59320,
|
||||
|
||||
SPELL_FLAMES = 39199,
|
||||
|
||||
// NPCS
|
||||
NPC_BJORN = 27303, // Near Right Boat, summon Spirit Fount
|
||||
NPC_BJORN_VISUAL = 27304,
|
||||
NPC_HALDOR = 27307, // Near Left Boat, debuff Spirit Strike on player
|
||||
NPC_HALDOR_VISUAL = 27310,
|
||||
NPC_RANULF = 27308, // Far Left Boat, ability to cast spirit burst
|
||||
NPC_RANULF_VISUAL = 27311,
|
||||
NPC_TORGYN = 27309, // Far Right Boat, summon 4 Avenging Spirit
|
||||
NPC_TORGYN_VISUAL = 27312,
|
||||
|
||||
NPC_SPIRIT_FOUNT = 27339,
|
||||
NPC_AVENGING_SPIRIT = 27386,
|
||||
};
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_YMIRON_HEALTH_CHECK = 1,
|
||||
EVENT_YMIRON_BANE = 2,
|
||||
EVENT_YMIRON_FETID_ROT = 3,
|
||||
EVENT_YMIRON_DARK_SLASH = 4,
|
||||
EVENT_YMIRON_ACTIVATE_BOAT = 5,
|
||||
EVENT_YMIRON_BJORN_ABILITY = 6,
|
||||
EVENT_YMIRON_RANULF_ABILITY = 7,
|
||||
EVENT_YMIRON_HALDOR_ABILITY = 8,
|
||||
EVENT_YMIRON_TORGYN_ABILITY = 9,
|
||||
EVENT_YMIRON_RESTORE = 10,
|
||||
};
|
||||
|
||||
struct ActiveBoatStruct
|
||||
{
|
||||
uint32 trigger;
|
||||
uint32 npc;
|
||||
uint32 say;
|
||||
float MoveX, MoveY, MoveZ, SpawnX, SpawnY, SpawnZ, SpawnO;
|
||||
};
|
||||
|
||||
static ActiveBoatStruct BoatStructure[4] =
|
||||
{
|
||||
{NPC_RANULF, NPC_RANULF_VISUAL, SAY_SUMMON_RANULF, 404.379f, -335.335f, 104.756f, 413.594f, -335.408f, 107.995f, 3.157f},
|
||||
{NPC_TORGYN, NPC_TORGYN_VISUAL, SAY_SUMMON_TORGYN, 380.813f, -335.069f, 104.756f, 369.994f, -334.771f, 107.995f, 6.232f},
|
||||
{NPC_BJORN, NPC_BJORN_VISUAL, SAY_SUMMON_BJORN, 381.546f, -314.362f, 104.756f, 370.841f, -314.426f, 107.995f, 6.232f},
|
||||
{NPC_HALDOR, NPC_HALDOR_VISUAL, SAY_SUMMON_HALDOR, 404.310f, -314.761f, 104.756f, 413.992f, -314.703f, 107.995f, 3.157f}
|
||||
};
|
||||
|
||||
class boss_ymiron : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_ymiron() : CreatureScript("boss_ymiron") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* pCreature) const
|
||||
{
|
||||
return new boss_ymironAI (pCreature);
|
||||
}
|
||||
|
||||
struct boss_ymironAI : public ScriptedAI
|
||||
{
|
||||
boss_ymironAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me), summons2(me)
|
||||
{
|
||||
pInstance = pCreature->GetInstanceScript();
|
||||
}
|
||||
|
||||
InstanceScript *pInstance;
|
||||
EventMap events;
|
||||
SummonList summons;
|
||||
SummonList summons2;
|
||||
uint8 BoatNum;
|
||||
uint8 BoatOrder[4];
|
||||
|
||||
void Reset()
|
||||
{
|
||||
for (uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
bool good;
|
||||
do
|
||||
{
|
||||
good = true;
|
||||
BoatOrder[i] = urand(0,3);
|
||||
|
||||
for (uint8 j = 0; j < i; ++j)
|
||||
if (BoatOrder[i] == BoatOrder[j])
|
||||
{
|
||||
good = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (!good);
|
||||
}
|
||||
|
||||
events.Reset();
|
||||
summons.DespawnAll();
|
||||
summons2.DespawnAll();
|
||||
BoatNum = 0;
|
||||
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_DISABLE_MOVE);
|
||||
|
||||
if(pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_KING_YMIRON, NOT_STARTED);
|
||||
pInstance->SetData(DATA_YMIRON_ACHIEVEMENT, true);
|
||||
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
if (pInstance->GetData(DATA_SKADI_THE_RUTHLESS) == DONE)
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
}
|
||||
|
||||
void EnterEvadeMode()
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
ScriptedAI::EnterEvadeMode();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* pWho)
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
if(pInstance)
|
||||
{
|
||||
pInstance->SetData(DATA_KING_YMIRON, IN_PROGRESS);
|
||||
if (pInstance->GetData(DATA_SKADI_THE_RUTHLESS) == DONE)
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
|
||||
events.RescheduleEvent(EVENT_YMIRON_BANE, 18000);
|
||||
events.RescheduleEvent(EVENT_YMIRON_FETID_ROT, 8000);
|
||||
events.RescheduleEvent(EVENT_YMIRON_DARK_SLASH, 28000);
|
||||
events.RescheduleEvent(EVENT_YMIRON_HEALTH_CHECK, 1000);
|
||||
}
|
||||
|
||||
void MovementInform(uint32 uiType, uint32 point)
|
||||
{
|
||||
if(uiType != POINT_MOTION_TYPE)
|
||||
return;
|
||||
|
||||
if (point == 0)
|
||||
{
|
||||
Talk(BoatStructure[BoatOrder[BoatNum-1]].say);
|
||||
if (Creature *cr = me->FindNearestCreature(BoatStructure[BoatOrder[BoatNum-1]].trigger, 50.0f))
|
||||
me->CastSpell(cr, SPELL_CHANNEL_YMIRON_TO_SPIRIT, true);
|
||||
|
||||
events.ScheduleEvent(EVENT_YMIRON_ACTIVATE_BOAT, 6000);
|
||||
}
|
||||
}
|
||||
|
||||
void SpellHitTarget(Unit *, const SpellInfo *spellInfo)
|
||||
{
|
||||
if (spellInfo->Id == 59302 && pInstance) // Bane trigger
|
||||
pInstance->SetData(DATA_YMIRON_ACHIEVEMENT, false);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff)
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
events.Update(diff);
|
||||
if (me->HasUnitState(UNIT_STATE_CASTING))
|
||||
return;
|
||||
|
||||
switch (events.GetEvent())
|
||||
{
|
||||
case EVENT_YMIRON_HEALTH_CHECK:
|
||||
{
|
||||
if (me->GetHealth() < std::max(0.0f, float(me->GetMaxHealth()*(1.0f-(IsHeroic() ? 0.2f : 0.334f)*float(BoatNum+1)))))
|
||||
{
|
||||
events.DelayEvents(12000);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
me->CastSpell(me, SPELL_SCREAMS_OF_THE_DEAD, true);
|
||||
me->GetMotionMaster()->Clear();
|
||||
me->GetMotionMaster()->MovePoint(0, BoatStructure[BoatOrder[BoatNum]].MoveX, BoatStructure[BoatOrder[BoatNum]].MoveY, BoatStructure[BoatOrder[BoatNum]].MoveZ);
|
||||
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
summons.DespawnAll();
|
||||
|
||||
// Spawn flames in previous boat if any
|
||||
if (BoatNum) // different than 0
|
||||
if (Creature *cr = me->SummonTrigger(BoatStructure[BoatOrder[BoatNum-1]].SpawnX, BoatStructure[BoatOrder[BoatNum-1]].SpawnY, BoatStructure[BoatOrder[BoatNum-1]].SpawnZ, 0, 1800000))
|
||||
{
|
||||
cr->AddAura(SPELL_FLAMES, cr);
|
||||
summons2.Summon(cr);
|
||||
}
|
||||
|
||||
BoatNum++;
|
||||
}
|
||||
|
||||
events.RepeatEvent(1000);
|
||||
break;
|
||||
}
|
||||
case EVENT_YMIRON_BANE:
|
||||
{
|
||||
me->CastSpell(me, IsHeroic() ? SPELL_BANE_H : SPELL_BANE_N, false);
|
||||
events.RepeatEvent(20000+rand()%5000);
|
||||
break;
|
||||
}
|
||||
case EVENT_YMIRON_FETID_ROT:
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_FETID_ROT_H : SPELL_FETID_ROT_N, false);
|
||||
events.RepeatEvent(10000+rand()%3000);
|
||||
break;
|
||||
}
|
||||
case EVENT_YMIRON_DARK_SLASH:
|
||||
{
|
||||
int32 dmg = me->GetVictim()->GetHealth() / 2;
|
||||
me->CastCustomSpell(me->GetVictim(), SPELL_DARK_SLASH, &dmg, 0, 0, false);
|
||||
events.RepeatEvent(30000+rand()%5000);
|
||||
break;
|
||||
}
|
||||
case EVENT_YMIRON_ACTIVATE_BOAT:
|
||||
{
|
||||
// Spawn it!
|
||||
if (Creature* king = me->SummonCreature(BoatStructure[BoatOrder[BoatNum-1]].npc, BoatStructure[BoatOrder[BoatNum-1]].SpawnX, BoatStructure[BoatOrder[BoatNum-1]].SpawnY, BoatStructure[BoatOrder[BoatNum-1]].SpawnZ, BoatStructure[BoatOrder[BoatNum-1]].SpawnO, TEMPSUMMON_CORPSE_DESPAWN, 0))
|
||||
{
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
king->CastSpell(me, SPELL_CHANNEL_SPIRIT_TO_YMIRON, true);
|
||||
summons.Summon(king);
|
||||
king->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE);
|
||||
king->SetDisableGravity(true);
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
|
||||
me->GetMotionMaster()->MoveChase(me->GetVictim());
|
||||
switch(BoatOrder[BoatNum-1])
|
||||
{
|
||||
case 0: events.ScheduleEvent(EVENT_YMIRON_RANULF_ABILITY, 3000, 1); break;
|
||||
case 1: events.ScheduleEvent(EVENT_YMIRON_TORGYN_ABILITY, 3000, 1); break;
|
||||
case 2: events.ScheduleEvent(EVENT_YMIRON_BJORN_ABILITY, 3000, 1); break;
|
||||
case 3: events.ScheduleEvent(EVENT_YMIRON_HALDOR_ABILITY, 3000, 1); break;
|
||||
}
|
||||
}
|
||||
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
case EVENT_YMIRON_BJORN_ABILITY:
|
||||
{
|
||||
if (Creature* sf = me->SummonCreature(NPC_SPIRIT_FOUNT, 385+rand()%10, -330+rand()%10, 104.756f, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 180000))
|
||||
{
|
||||
summons.Summon(sf);
|
||||
sf->SetSpeed(MOVE_RUN, 0.4f);
|
||||
sf->AddAura(IsHeroic() ? SPELL_SPIRIT_FOUNT_H : SPELL_SPIRIT_FOUNT_N, sf);
|
||||
sf->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
sf->GetMotionMaster()->MoveFollow(me->GetVictim(), 0, rand_norm()*M_PI*2);
|
||||
}
|
||||
events.PopEvent();
|
||||
break;
|
||||
}
|
||||
case EVENT_YMIRON_HALDOR_ABILITY:
|
||||
{
|
||||
me->CastSpell(me->GetVictim(), IsHeroic() ? SPELL_SPIRIT_STRIKE_H : SPELL_SPIRIT_STRIKE_N, false);
|
||||
events.RepeatEvent(5000);
|
||||
break;
|
||||
}
|
||||
case EVENT_YMIRON_RANULF_ABILITY:
|
||||
{
|
||||
me->CastSpell(me, IsHeroic() ? SPELL_SPIRIT_BURST_H : SPELL_SPIRIT_BURST_N, false);
|
||||
events.RepeatEvent(10000);
|
||||
break;
|
||||
}
|
||||
case EVENT_YMIRON_TORGYN_ABILITY:
|
||||
{
|
||||
for(uint8 i = 0; i < 4; ++i)
|
||||
{
|
||||
if (Creature* as = me->SummonCreature(NPC_AVENGING_SPIRIT, me->GetPositionX()+rand()%10, me->GetPositionY()+rand()%10, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 30000))
|
||||
{
|
||||
summons.Summon(as);
|
||||
as->SetInCombatWithZone();
|
||||
}
|
||||
}
|
||||
events.RepeatEvent(15000);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
void JustDied(Unit* pKiller)
|
||||
{
|
||||
Talk(SAY_DEATH);
|
||||
summons.DespawnAll();
|
||||
summons2.DespawnAll();
|
||||
|
||||
if(pInstance)
|
||||
pInstance->SetData(DATA_KING_YMIRON, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* pVictim)
|
||||
{
|
||||
if (urand(0,1))
|
||||
return;
|
||||
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_boss_ymiron()
|
||||
{
|
||||
new boss_ymiron();
|
||||
}
|
||||
@@ -1,261 +0,0 @@
|
||||
/*
|
||||
REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
|
||||
*/
|
||||
|
||||
#include "ScriptMgr.h"
|
||||
#include "ScriptedCreature.h"
|
||||
#include "utgarde_pinnacle.h"
|
||||
|
||||
class instance_pinnacle : public InstanceMapScript
|
||||
{
|
||||
public:
|
||||
instance_pinnacle() : InstanceMapScript("instance_pinnacle", 575) { }
|
||||
|
||||
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
|
||||
{
|
||||
return new instance_pinnacle_InstanceMapScript(pMap);
|
||||
}
|
||||
|
||||
struct instance_pinnacle_InstanceMapScript : public InstanceScript
|
||||
{
|
||||
instance_pinnacle_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {Initialize();};
|
||||
|
||||
uint64 SvalaSorrowgrave;
|
||||
uint64 GortokPalehoof;
|
||||
uint64 SkadiRuthless;
|
||||
uint64 KingYmiron;
|
||||
uint64 FrenziedWorgen;
|
||||
uint64 RavenousFurbolg;
|
||||
uint64 MassiveJormungar;
|
||||
uint64 FerociousRhino;
|
||||
uint64 Grauf;
|
||||
|
||||
uint64 SvalaMirrorGUID;
|
||||
uint64 SkadiRuthlessDoor;
|
||||
uint64 YmironDoor;
|
||||
uint64 StatisGenerator;
|
||||
uint32 FightStatus;
|
||||
uint32 Encounters[MAX_ENCOUNTERS];
|
||||
uint8 SkadiHits;
|
||||
uint8 SkadiInRange;
|
||||
|
||||
bool svalaAchievement;
|
||||
bool skadiAchievement;
|
||||
bool ymironAchievement;
|
||||
|
||||
void Initialize()
|
||||
{
|
||||
SvalaSorrowgrave = 0;
|
||||
GortokPalehoof = 0;
|
||||
SkadiRuthless = 0;
|
||||
KingYmiron = 0;
|
||||
FrenziedWorgen = 0;
|
||||
RavenousFurbolg = 0;
|
||||
MassiveJormungar = 0;
|
||||
FerociousRhino = 0;
|
||||
Grauf = 0;
|
||||
|
||||
SvalaMirrorGUID = 0;
|
||||
StatisGenerator = 0;
|
||||
SkadiHits = 0;
|
||||
SkadiInRange = 0;
|
||||
SkadiRuthlessDoor= 0;
|
||||
YmironDoor = 0;
|
||||
FightStatus = 0;
|
||||
|
||||
svalaAchievement = false;
|
||||
skadiAchievement = false;
|
||||
ymironAchievement = false;
|
||||
|
||||
for(uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
Encounters[i] = NOT_STARTED;
|
||||
}
|
||||
|
||||
bool IsEncounterInProgress() const
|
||||
{
|
||||
for(uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
if(Encounters[i] == IN_PROGRESS)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
void OnCreatureCreate(Creature* pCreature)
|
||||
{
|
||||
switch(pCreature->GetEntry())
|
||||
{
|
||||
case NPC_SVALA_SORROWGRAVE: SvalaSorrowgrave = pCreature->GetGUID(); break;
|
||||
case NPC_GORTOK_PALEHOOF: GortokPalehoof = pCreature->GetGUID(); break;
|
||||
case NPC_SKADI_THE_RUTHLESS: SkadiRuthless = pCreature->GetGUID(); break;
|
||||
case NPC_KING_YMIRON: KingYmiron = pCreature->GetGUID(); break;
|
||||
case NPC_FRENZIED_WORGEN: FrenziedWorgen = pCreature->GetGUID(); break;
|
||||
case NPC_RAVENOUS_FURBOLG: RavenousFurbolg = pCreature->GetGUID(); break;
|
||||
case NPC_MASSIVE_JORMUNGAR: MassiveJormungar = pCreature->GetGUID(); break;
|
||||
case NPC_FEROCIOUS_RHINO: FerociousRhino = pCreature->GetGUID(); break;
|
||||
case NPC_GARUF: Grauf = pCreature->GetGUID(); break;
|
||||
}
|
||||
}
|
||||
|
||||
void OnGameObjectCreate(GameObject* pGo)
|
||||
{
|
||||
switch(pGo->GetEntry())
|
||||
{
|
||||
case GO_SKADI_THE_RUTHLESS_DOOR:
|
||||
SkadiRuthlessDoor = pGo->GetGUID();
|
||||
if (Encounters[DATA_SKADI_THE_RUTHLESS] == DONE)
|
||||
HandleGameObject(0,true,pGo);
|
||||
break;
|
||||
case GO_KING_YMIRON_DOOR:
|
||||
YmironDoor = pGo->GetGUID();
|
||||
if (Encounters[DATA_KING_YMIRON] == DONE)
|
||||
HandleGameObject(0,true,pGo);
|
||||
break;
|
||||
case GO_GORK_PALEHOOF_SPHERE:
|
||||
StatisGenerator = pGo->GetGUID();
|
||||
break;
|
||||
case GO_SVALA_MIRROR:
|
||||
SvalaMirrorGUID = pGo->GetGUID();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool CheckAchievementCriteriaMeet(uint32 criteria_id, Player const* source, Unit const* target = NULL, uint32 miscvalue1 = 0)
|
||||
{
|
||||
switch(criteria_id)
|
||||
{
|
||||
case 7322: // The Incredible Hulk (2043)
|
||||
return svalaAchievement;
|
||||
case 7595: // My Girl Loves to Skadi All the Time (2156)
|
||||
return skadiAchievement;
|
||||
case 7598: // King's Bane (2157)
|
||||
return ymironAchievement;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 data)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case DATA_SVALA_SORROWGRAVE:
|
||||
case DATA_GORTOK_PALEHOOF:
|
||||
Encounters[type] = data;
|
||||
break;
|
||||
case DATA_SKADI_THE_RUTHLESS:
|
||||
if (data == DONE)
|
||||
{
|
||||
HandleGameObject(SkadiRuthlessDoor,true);
|
||||
// Make ymiron attackable
|
||||
if (Creature *cr = instance->GetCreature(KingYmiron))
|
||||
cr->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
|
||||
}
|
||||
Encounters[type] = data;
|
||||
break;
|
||||
case DATA_KING_YMIRON:
|
||||
if (data == DONE)
|
||||
HandleGameObject(YmironDoor,true);
|
||||
Encounters[type] = data;
|
||||
break;
|
||||
case SKADI_HITS:
|
||||
SkadiHits = data;
|
||||
break;
|
||||
case SKADI_IN_RANGE:
|
||||
SkadiInRange = data;
|
||||
break;
|
||||
case DATA_SVALA_ACHIEVEMENT:
|
||||
svalaAchievement = (bool)data;
|
||||
return;
|
||||
case DATA_SKADI_ACHIEVEMENT:
|
||||
skadiAchievement = (bool)data;
|
||||
return;
|
||||
case DATA_YMIRON_ACHIEVEMENT:
|
||||
ymironAchievement = (bool)data;
|
||||
return;
|
||||
|
||||
}
|
||||
OUT_SAVE_INST_DATA;
|
||||
|
||||
SaveToDB();
|
||||
OUT_SAVE_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
std::string GetSaveData()
|
||||
{
|
||||
std::ostringstream saveStream;
|
||||
saveStream << "U P " << Encounters[0] << ' ' << Encounters[1] << ' ' << Encounters[2] << ' ' << Encounters[3];
|
||||
return saveStream.str();
|
||||
}
|
||||
|
||||
void Load(const char* in)
|
||||
{
|
||||
if (!in)
|
||||
{
|
||||
OUT_LOAD_INST_DATA_FAIL;
|
||||
return;
|
||||
}
|
||||
|
||||
OUT_LOAD_INST_DATA(in);
|
||||
|
||||
char dataHead1, dataHead2;
|
||||
uint16 data0, data1, data2, data3;
|
||||
|
||||
std::istringstream loadStream(in);
|
||||
loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3;
|
||||
|
||||
if (dataHead1 == 'U' && dataHead2 == 'P')
|
||||
{
|
||||
Encounters[0] = data0;
|
||||
Encounters[1] = data1;
|
||||
Encounters[2] = data2;
|
||||
Encounters[3] = data3;
|
||||
|
||||
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
|
||||
if (Encounters[i] == IN_PROGRESS)
|
||||
Encounters[i] = NOT_STARTED;
|
||||
|
||||
} else OUT_LOAD_INST_DATA_FAIL;
|
||||
|
||||
OUT_LOAD_INST_DATA_COMPLETE;
|
||||
}
|
||||
|
||||
uint32 GetData(uint32 type) const
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case DATA_SVALA_SORROWGRAVE: return Encounters[0];
|
||||
case DATA_GORTOK_PALEHOOF: return Encounters[1];
|
||||
case DATA_SKADI_THE_RUTHLESS: return Encounters[2];
|
||||
case DATA_KING_YMIRON: return Encounters[3];
|
||||
case SKADI_HITS: return SkadiHits;
|
||||
case SKADI_IN_RANGE: return SkadiInRange;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64 GetData64(uint32 identifier) const
|
||||
{
|
||||
switch(identifier)
|
||||
{
|
||||
case DATA_SVALA_SORROWGRAVE: return SvalaSorrowgrave;
|
||||
case DATA_GORTOK_PALEHOOF: return GortokPalehoof;
|
||||
case DATA_SKADI_THE_RUTHLESS: return SkadiRuthless;
|
||||
case DATA_KING_YMIRON: return KingYmiron;
|
||||
case DATA_NPC_FRENZIED_WORGEN: return FrenziedWorgen;
|
||||
case DATA_NPC_RAVENOUS_FURBOLG: return RavenousFurbolg;
|
||||
case DATA_NPC_MASSIVE_JORMUNGAR: return MassiveJormungar;
|
||||
case DATA_NPC_FEROCIOUS_RHINO: return FerociousRhino;
|
||||
case YMIRON_DOOR: return YmironDoor;
|
||||
case STATIS_GENERATOR: return StatisGenerator;
|
||||
case SKADI_DOOR: return SkadiRuthlessDoor;
|
||||
case DATA_GRAUF: return Grauf;
|
||||
case GO_SVALA_MIRROR: return SvalaMirrorGUID;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
void AddSC_instance_utgarde_pinnacle()
|
||||
{
|
||||
new instance_pinnacle();
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
#ifndef DEF_PINNACLE_H
|
||||
#define DEF_PINNACLE_H
|
||||
|
||||
enum Data
|
||||
{
|
||||
DATA_SVALA_SORROWGRAVE = 0,
|
||||
DATA_GORTOK_PALEHOOF = 1,
|
||||
DATA_SKADI_THE_RUTHLESS = 2,
|
||||
DATA_KING_YMIRON = 3,
|
||||
DATA_GRAUF = 4,
|
||||
|
||||
DATA_NPC_FRENZIED_WORGEN = 10,
|
||||
DATA_NPC_RAVENOUS_FURBOLG = 11,
|
||||
DATA_NPC_MASSIVE_JORMUNGAR = 12,
|
||||
DATA_NPC_FEROCIOUS_RHINO = 13,
|
||||
|
||||
YMIRON_DOOR = 20,
|
||||
STATIS_GENERATOR = 21,
|
||||
|
||||
SKADI_HITS = 30,
|
||||
SKADI_IN_RANGE = 31,
|
||||
SKADI_DOOR = 32,
|
||||
|
||||
MAX_ENCOUNTERS = 4,
|
||||
|
||||
DATA_SVALA_ACHIEVEMENT = 50,
|
||||
DATA_SKADI_ACHIEVEMENT = 51,
|
||||
DATA_YMIRON_ACHIEVEMENT = 52,
|
||||
};
|
||||
|
||||
enum Objects
|
||||
{
|
||||
// GOs
|
||||
GO_SKADI_THE_RUTHLESS_DOOR = 192173,
|
||||
GO_KING_YMIRON_DOOR = 192174,
|
||||
GO_GORK_PALEHOOF_SPHERE = 188593,
|
||||
GO_SVALA_MIRROR = 191745,
|
||||
|
||||
// NPCs
|
||||
NPC_SCOURGE_HULK = 26555,
|
||||
NPC_DRAGONFLAYER_SPECTATOR = 26667,
|
||||
NPC_SVALA_SORROWGRAVE = 26668,
|
||||
NPC_GORTOK_PALEHOOF = 26687,
|
||||
NPC_SKADI_THE_RUTHLESS = 26693,
|
||||
NPC_KING_YMIRON = 26861,
|
||||
NPC_FRENZIED_WORGEN = 26683,
|
||||
NPC_RAVENOUS_FURBOLG = 26684,
|
||||
NPC_MASSIVE_JORMUNGAR = 26685,
|
||||
NPC_FEROCIOUS_RHINO = 26686,
|
||||
NPC_GARUF = 26893,
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user