Big re-organization of repository [W.I.P]

This commit is contained in:
Yehonal
2016-08-11 20:25:27 +02:00
parent c62a72c0a8
commit 0f85ce1c54
3016 changed files with 1271 additions and 1 deletions

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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();
}

View File

@@ -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