converted all tabs to 4 spaces

This commit is contained in:
Yehonal
2016-06-26 19:23:57 +02:00
parent 52f305111c
commit f6eefedcd5
717 changed files with 132388 additions and 132388 deletions

View File

@@ -8,15 +8,15 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
enum eDisplayId
{
DISPLAYID_DEFAULT = 21953,
DISPLAYID_UNDEAD = 26351,
DISPLAYID_DEFAULT = 21953,
DISPLAYID_UNDEAD = 26351,
};
enum eNPCs
{
NPC_INGVAR_UNDEAD = 23980,
NPC_ANNHYLDE = 24068,
NPC_THROW = 23997,
NPC_INGVAR_UNDEAD = 23980,
NPC_ANNHYLDE = 24068,
NPC_THROW = 23997,
};
enum Yells
@@ -37,361 +37,361 @@ enum Yells
enum eSpells
{
SPELL_SUMMON_VALKYR = 42912,
SPELL_RESURRECTION_BEAM = 42857,
SPELL_RESURRECTION_BALL = 42862,
SPELL_RESURRECTION_HEAL = 42704,
SPELL_INGVAR_TRANSFORM = 42796,
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_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,
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)
#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_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,
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") { }
boss_ingvar_the_plunderer() : CreatureScript("boss_ingvar_the_plunderer") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_ingvar_the_plundererAI(pCreature);
}
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();
}
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;
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);
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);
}
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 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);
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());
Talk(YELL_AGGRO_1);
me->LowerPlayerDamageReq(me->GetMaxHealth());
if (pInstance)
pInstance->SetData(DATA_INGVAR, IN_PROGRESS);
}
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 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 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 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 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 EnterEvadeMode()
{
me->SetControlled(false, UNIT_STATE_ROOT);
me->DisableRotate(false);
ScriptedAI::EnterEvadeMode();
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
events.Update(diff);
if( me->HasUnitState(UNIT_STATE_CASTING) )
return;
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);
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);
// 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;
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);
// 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);
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->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();
}
};
if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE))
DoMeleeAttackIfReady();
}
};
};
void AddSC_boss_ingvar_the_plunderer()
{
new boss_ingvar_the_plunderer();
new boss_ingvar_the_plunderer();
}

View File

@@ -11,363 +11,363 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
enum eTexts
{
SAY_START_COMBAT = 1,
SAY_FROST_TOMB = 3,
SAY_SUMMON_SKELETONS = 2,
SAY_FROST_TOMB_EMOTE = 4,
SAY_DEATH = 5,
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,
NPC_FROST_TOMB = 23965,
NPC_SKELETON = 23970,
};
enum eSpells
{
SPELL_FROST_TOMB = 42672,
SPELL_FROST_TOMB_SUMMON = 42714,
SPELL_FROST_TOMB_AURA = 48400,
SPELL_FROST_TOMB = 42672,
SPELL_FROST_TOMB_SUMMON = 42714,
SPELL_FROST_TOMB_AURA = 48400,
SPELL_SHADOWBOLT_N = 43667,
SPELL_SHADOWBOLT_H = 59389,
SPELL_SHADOWBOLT_N = 43667,
SPELL_SHADOWBOLT_H = 59389,
};
#define SPELL_SHADOWBOLT DUNGEON_MODE(SPELL_SHADOWBOLT_N, SPELL_SHADOWBOLT_H)
#define SPELL_SHADOWBOLT DUNGEON_MODE(SPELL_SHADOWBOLT_N, SPELL_SHADOWBOLT_H)
enum eEvents
{
EVENT_SPELL_SHADOWBOLT = 1,
EVENT_FROST_TOMB,
EVENT_SUMMON_SKELETONS,
EVENT_SPELL_SHADOWBOLT = 1,
EVENT_FROST_TOMB,
EVENT_SUMMON_SKELETONS,
};
class npc_frost_tomb : public CreatureScript
{
public:
npc_frost_tomb() : CreatureScript("npc_frost_tomb") { }
npc_frost_tomb() : CreatureScript("npc_frost_tomb") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_frost_tombAI(pCreature);
}
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;
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);
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);
}
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);
}
}
};
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") { }
boss_keleseth() : CreatureScript("boss_keleseth") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_kelesethAI (pCreature);
}
CreatureAI* GetAI(Creature* pCreature) const
{
return new boss_kelesethAI (pCreature);
}
struct boss_kelesethAI : public ScriptedAI
{
boss_kelesethAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceScript();
}
struct boss_kelesethAI : public ScriptedAI
{
boss_kelesethAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceScript();
}
InstanceScript* pInstance;
EventMap events;
InstanceScript* pInstance;
EventMap events;
void Reset()
{
events.Reset();
if (pInstance)
pInstance->SetData(DATA_KELESETH, NOT_STARTED);
}
void Reset()
{
events.Reset();
if (pInstance)
pInstance->SetData(DATA_KELESETH, NOT_STARTED);
}
void MoveInLineOfSight(Unit* /*who*/) {}
void MoveInLineOfSight(Unit* /*who*/) {}
/*void KilledUnit(Unit * victim)
{
if (victim == me)
return;
DoScriptText(SAY_KILL, me);
}*/
/*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 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);
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();
Talk(SAY_START_COMBAT);
DoZoneInCombat();
if (pInstance)
pInstance->SetData(DATA_KELESETH, IN_PROGRESS);
}
if (pInstance)
pInstance->SetData(DATA_KELESETH, IN_PROGRESS);
}
void AttackStart(Unit* who)
{
if( !who )
return;
void AttackStart(Unit* who)
{
if( !who )
return;
UnitAI::AttackStartCaster(who, 12.0f);
}
UnitAI::AttackStartCaster(who, 12.0f);
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if( me->HasUnitState(UNIT_STATE_CASTING) )
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;
}
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();
}
};
DoMeleeAttackIfReady();
}
};
};
enum eSkeletonEnum
{
SPELL_DECREPIFY = 42702,
SPELL_BONE_ARMOR = 59386,
SPELL_SCOURGE_RESURRECTION = 42704,
SPELL_DECREPIFY = 42702,
SPELL_BONE_ARMOR = 59386,
SPELL_SCOURGE_RESURRECTION = 42704,
EVENT_SPELL_DECREPIFY = 1,
EVENT_SPELL_BONE_ARMOR,
EVENT_RESURRECT,
EVENT_RESURRECT_2,
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") { }
npc_vrykul_skeleton() : CreatureScript("npc_vrykul_skeleton") { }
CreatureAI* GetAI(Creature* pCreature) const
{
return new npc_vrykul_skeletonAI (pCreature);
}
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();
}
struct npc_vrykul_skeletonAI : public ScriptedAI
{
npc_vrykul_skeletonAI(Creature *c) : ScriptedAI(c)
{
pInstance = c->GetInstanceScript();
}
InstanceScript *pInstance;
EventMap events;
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 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 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;
}
void UpdateAI(uint32 diff)
{
if( pInstance && pInstance->GetData(DATA_KELESETH) != IN_PROGRESS )
{
if( me->IsAlive() )
Unit::Kill(me, me);
return;
}
if (!UpdateVictim())
return;
if (!UpdateVictim())
return;
events.Update(diff);
events.Update(diff);
if( me->HasUnitState(UNIT_STATE_CASTING) )
return;
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;
}
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();
}
};
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") { }
public:
spell_frost_tomb() : SpellScriptLoader("spell_frost_tomb") { }
class spell_frost_tombAuraScript : public AuraScript
{
PrepareAuraScript(spell_frost_tombAuraScript);
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 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);
}
};
void Register()
{
OnEffectPeriodic += AuraEffectPeriodicFn(spell_frost_tombAuraScript::HandleEffectPeriodic, EFFECT_1, SPELL_AURA_PERIODIC_DUMMY);
}
};
AuraScript* GetAuraScript() const
{
return new spell_frost_tombAuraScript();
}
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();
new boss_keleseth();
new npc_frost_tomb();
new npc_vrykul_skeleton();
new spell_frost_tomb();
}

View File

@@ -25,12 +25,12 @@ enum eTexts
enum eSpells
{
// Skarvald:
// Skarvald:
SPELL_CHARGE = 43651,
SPELL_STONE_STRIKE = 48583,
SPELL_SUMMON_SKARVALD_GHOST = 48613,
// Dalronn:
// Dalronn:
SPELL_SHADOW_BOLT_N = 43649,
SPELL_SHADOW_BOLT_H = 59575,
SPELL_DEBILITATE = 43650,
@@ -38,19 +38,19 @@ enum eSpells
SPELL_SUMMON_DALRONN_GHOST = 48612,
};
#define SPELL_SHADOW_BOLT DUNGEON_MODE(SPELL_SHADOW_BOLT_N, SPELL_SHADOW_BOLT_H)
#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_CHARGE = 1,
EVENT_SPELL_STONE_STRIKE,
EVENT_SPELL_SHADOW_BOLT,
EVENT_SPELL_DEBILITATE,
EVENT_SPELL_SUMMON_SKELETONS,
EVENT_SPELL_SHADOW_BOLT,
EVENT_SPELL_DEBILITATE,
EVENT_SPELL_SUMMON_SKELETONS,
EVENT_YELL_DALRONN_AGGRO,
EVENT_MATE_DIED,
EVENT_YELL_DALRONN_AGGRO,
EVENT_MATE_DIED,
};
class boss_skarvald_the_constructor : public CreatureScript
@@ -71,54 +71,54 @@ public:
}
InstanceScript* pInstance;
EventMap events;
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);
}
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 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);
events.RescheduleEvent(EVENT_SPELL_CHARGE, 5000);
events.RescheduleEvent(EVENT_SPELL_STONE_STRIKE, 10000);
if (me->GetEntry() == NPC_SKARVALD)
Talk(YELL_SKARVALD_AGGRO);
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);
}
}
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*/)
@@ -129,64 +129,64 @@ public:
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);
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;
if (!UpdateVictim())
return;
events.Update(diff);
if( me->HasUnitState(UNIT_STATE_CASTING) )
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;
}
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();
DoMeleeAttackIfReady();
}
};
};
@@ -209,61 +209,61 @@ public:
}
InstanceScript* pInstance;
EventMap events;
SummonList summons;
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);
}
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 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);
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 (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);
}
}
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*/)
@@ -272,75 +272,75 @@ public:
Talk(YELL_DALRONN_KILL);
}
void JustSummoned(Creature* s)
{
summons.Summon(s);
}
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);
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;
if (!UpdateVictim())
return;
events.Update(diff);
if( me->HasUnitState(UNIT_STATE_CASTING) )
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;
}
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();
DoMeleeAttackIfReady();
}
};
};

View File

@@ -10,351 +10,351 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
class instance_utgarde_keep : public InstanceMapScript
{
public:
instance_utgarde_keep() : InstanceMapScript("instance_utgarde_keep", 574) { }
instance_utgarde_keep() : InstanceMapScript("instance_utgarde_keep", 574) { }
InstanceScript* GetInstanceScript(InstanceMap* pMap) const
{
return new instance_utgarde_keep_InstanceMapScript(pMap);
}
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) {}
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;
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 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;
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;
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));
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;
}
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;
bool IsEncounterInProgress() const
{
for (uint8 i = 0; i < MAX_ENCOUNTER; ++i)
if (m_auiEncounter[i] == IN_PROGRESS) return true;
return false;
}
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 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 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 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;
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();
}
}
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;
}
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;
}
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::string GetSaveData()
{
OUT_SAVE_INST_DATA;
std::ostringstream saveStream;
saveStream << "U K " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << ForgeEventMask;
std::ostringstream saveStream;
saveStream << "U K " << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << ForgeEventMask;
str_data = saveStream.str();
str_data = saveStream.str();
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
OUT_SAVE_INST_DATA_COMPLETE;
return str_data;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint32 data0, data1, data2, data3;
char dataHead1, dataHead2;
uint32 data0, data1, data2, data3;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> 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;
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;
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;
}
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;
}
};
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();
new instance_utgarde_keep();
}

View File

@@ -24,53 +24,53 @@ public:
{
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;
}
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;
uint32 prevDataId;
void Reset()
{
if (pInstance)
pInstance->SetData(dataId, NOT_STARTED);
pInstance->SetData(dataId, NOT_STARTED);
}
void JustDied(Unit* /*killer*/)
{
if (pInstance)
pInstance->SetData(dataId, DONE);
me->SaveRespawnTime();
pInstance->SetData(dataId, DONE);
me->SaveRespawnTime();
}
void EnterCombat(Unit* /*who*/)
{
if (pInstance)
{
if (prevDataId && !pInstance->GetData(prevDataId))
{
EnterEvadeMode();
return;
}
{
if (prevDataId && !pInstance->GetData(prevDataId))
{
EnterEvadeMode();
return;
}
pInstance->SetData(dataId, IN_PROGRESS);
}
}
me->SetUInt32Value(UNIT_NPC_EMOTESTATE, EMOTE_ONESHOT_NONE);
}
};
@@ -120,17 +120,17 @@ public:
{
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->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);
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);
}
}
@@ -139,9 +139,9 @@ public:
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->SetDisableGravity(true);
me->SetHover(true);
me->SetCanFly(true);
me->GetMotionMaster()->MovePath(PATH_PROTODRAKE, false);
}
}
@@ -236,5 +236,5 @@ void AddSC_utgarde_keep()
new npc_dragonflayer_forge_master();
new npc_enslaved_proto_drake();
new spell_ticking_time_bomb();
new spell_ticking_time_bomb();
}

View File

@@ -7,54 +7,54 @@ REWRITTEN FROM SCRATCH BY PUSSYWIZARD, IT OWNS NOW!
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_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_SPECIAL_DRAKE = 50,
DATA_FORGE_1 = 100,
DATA_FORGE_2,
DATA_FORGE_3,
DATA_FORGE_1 = 100,
DATA_FORGE_2,
DATA_FORGE_3,
DATA_UNLOCK_SKARVALD_LOOT = 200,
DATA_UNLOCK_DALRONN_LOOT,
DATA_UNLOCK_SKARVALD_LOOT = 200,
DATA_UNLOCK_DALRONN_LOOT,
};
enum eGameObject
{
GO_BELLOW_1 = 186688,
GO_BELLOW_2 = 186689,
GO_BELLOW_3 = 186690,
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_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_GLOWING_ANVIL_1 = 186609,
GO_GLOWING_ANVIL_2 = 186610,
GO_GLOWING_ANVIL_3 = 186611,
GO_GIANT_PORTCULLIS_1 = 186756,
GO_GIANT_PORTCULLIS_2 = 186694,
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_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,
NPC_DARK_RANGER_MARRAH = 24137,
NPC_ENSLAVED_PROTO_DRAKE = 24083,
};
#endif

View File

@@ -12,7 +12,7 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Misc
{
// TEXTS
// TEXTS
SAY_AGGRO = 0,
SAY_KILL = 1,
EMOTE_RANGE = 2,
@@ -21,52 +21,52 @@ enum Misc
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,
// 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_FLAME_VISUAL = 47592,
SPELL_FLAME_BREATH_N = 47579,
SPELL_FLAME_BREATH_H = 60020,
SPELL_LAUNCH_HARPOON = 48642,
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,
// 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,
// ACTIONS
ACTION_START_EVENT = 1,
ACTION_REMOVE_SKADI = 2,
ACTION_PHASE2 = 3,
ACTION_MYGIRL_ACHIEVEMENT = 4,
// ACHIEVEMENTS
ACHIEV_TIMED_LODI_DODI = 17726,
// 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,
// 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,
// 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[]=
@@ -77,21 +77,21 @@ static Position TrashPosition[]=
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}
{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
PHASE_NONE,
PHASE_START,
PHASE_FLIGHT,
PHASE_LAND,
PHASE_GROUND
};
class boss_skadi : public CreatureScript
@@ -104,156 +104,156 @@ public:
return new boss_skadiAI (pCreature);
}
struct boss_skadiAI : public ScriptedAI
{
boss_skadiAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me)
{
m_pInstance = pCreature->GetInstanceScript();
}
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;
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;
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();
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);
}
}
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); }
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);
}
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);
}
}
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);
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();
}
}
if (me->GetVictim())
me->GetMotionMaster()->MoveChase(me->GetVictim());
else
me->SetInCombatWithZone();
}
}
void UpdateAI(uint32 diff)
{
if (!UpdateVictim() && SecondPhase)
return;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim() && SecondPhase)
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
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();
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.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;
}
}
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();
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* pKiller)
{
summons.DespawnAll();
Talk(SAY_DEATH);
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);
}
}
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;
void KilledUnit(Unit* pVictim)
{
if (urand(0,1))
return;
Talk(SAY_KILL);
}
};
Talk(SAY_KILL);
}
};
};
class boss_skadi_grauf : public CreatureScript
@@ -266,223 +266,223 @@ public:
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();
}
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;
InstanceScript *m_pInstance;
EventMap events;
SummonList summons;
uint8 currentPos;
uint8 AchievementHitCount;
void Reset()
{
events.Reset();
summons.DespawnAll();
currentPos = 0;
AchievementHitCount = 0;
me->RemoveAllAuras();
}
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 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 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 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);
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;
}
}
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;
}
}
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 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);
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();
}
}
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;
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);
}
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 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);
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);
}
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);
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;
}
}
}
};
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
@@ -490,35 +490,35 @@ 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);
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);
}
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);
}
grauf->AI()->DoAction(ACTION_MYGIRL_ACHIEVEMENT);
}
pGO->CastSpell((Unit*)NULL, SPELL_LAUNCH_HARPOON);
}
return true;
}
return true;
}
};
void AddSC_boss_skadi()
{
new boss_skadi();
new boss_skadi_grauf();
new boss_skadi_grauf();
new go_harpoon_canon();
}

View File

@@ -11,67 +11,67 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Misc
{
// SAY
TALK_INTRO_A1 = 0,
TALK_INTRO_A2 = 1,
TALK_INTRO_S1 = 0,
TALK_INTRO_S2 = 0,
TALK_INTRO_S3 = 1,
// 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,
// 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,
// 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,
// 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,
// NPCS
NPC_RITUAL_CHANNELER = 27281,
NPC_ARTHAS = 29280,
NPC_FLAME_BRAZIER = 27273,
// ACTIONS
ACTION_START_SORROWGRAVE = 1,
// 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,
// 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,
// 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]=
@@ -95,260 +95,260 @@ public:
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;
}
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;
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);
}
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);
}
}
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 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;
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();
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)))
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 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);
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);
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);
}
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 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);
}
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);
}
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);
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);
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;
}
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;
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
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);
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);
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);
}
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;
}
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();
}
};
DoMeleeAttackIfReady();
}
};
};
/*######
@@ -365,22 +365,22 @@ public:
return new npc_ritual_channelerAI (pCreature);
}
struct npc_ritual_channelerAI : public NullCreatureAI
{
npc_ritual_channelerAI(Creature* pCreature) : NullCreatureAI(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);
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);
}
}
};
if (pWho)
{
me->AddThreat(pWho, 10000000.0f);
me->CastSpell(pWho, SPELL_PARALYZE, false);
}
}
};
};
class spell_svala_ritual_strike : public SpellScriptLoader
@@ -395,17 +395,17 @@ class spell_svala_ritual_strike : public SpellScriptLoader
void HandleDummyEffect(SpellEffIndex /*effIndex*/)
{
if (Unit* unitTarget = GetHitUnit())
{
if (unitTarget->GetTypeId() != TYPEID_UNIT)
return;
{
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);
OnEffectHitTarget += SpellEffectFn(spell_svala_ritual_strike_SpellScript::HandleDummyEffect, EFFECT_2, SPELL_EFFECT_DUMMY);
}
};
@@ -414,31 +414,31 @@ class spell_svala_ritual_strike : public SpellScriptLoader
return new spell_svala_ritual_strike_SpellScript();
}
class spell_svala_ritual_strike_AuraScript : public AuraScript
{
PrepareAuraScript(spell_svala_ritual_strike_AuraScript);
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 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);
}
};
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();
}
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();
new spell_svala_ritual_strike();
}

View File

@@ -9,7 +9,7 @@ REWRITTEN FROM SCRATCH BY XINEF, IT OWNS NOW!
enum Misc
{
// TEXTS
// TEXTS
SAY_AGGRO = 0,
SAY_SLAY = 1,
SAY_DEATH = 2,
@@ -18,7 +18,7 @@ enum Misc
SAY_SUMMON_RANULF = 5,
SAY_SUMMON_TORGYN = 6,
// SPELLS
// SPELLS
SPELL_BANE_N = 48294,
SPELL_BANE_H = 59301,
SPELL_DARK_SLASH = 48292,
@@ -39,9 +39,9 @@ enum Misc
SPELL_SPIRIT_FOUNT_N = 48380,
SPELL_SPIRIT_FOUNT_H = 59320,
SPELL_FLAMES = 39199,
SPELL_FLAMES = 39199,
// NPCS
// 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
@@ -57,21 +57,21 @@ enum Misc
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,
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 trigger;
uint32 npc;
uint32 say;
float MoveX, MoveY, MoveZ, SpawnX, SpawnY, SpawnZ, SpawnO;
@@ -95,244 +95,244 @@ public:
return new boss_ymironAI (pCreature);
}
struct boss_ymironAI : public ScriptedAI
{
boss_ymironAI(Creature *pCreature) : ScriptedAI(pCreature), summons(me), summons2(me)
{
pInstance = pCreature->GetInstanceScript();
}
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];
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);
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);
}
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;
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->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);
}
}
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 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);
}
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);
}
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;
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);
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);
}
}
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 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;
void UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
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();
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);
}
// 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++;
}
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.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;
}
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();
}
DoMeleeAttackIfReady();
}
void JustDied(Unit* pKiller)
{
Talk(SAY_DEATH);
summons.DespawnAll();
summons2.DespawnAll();
void JustDied(Unit* pKiller)
{
Talk(SAY_DEATH);
summons.DespawnAll();
summons2.DespawnAll();
if(pInstance)
pInstance->SetData(DATA_KING_YMIRON, DONE);
}
if(pInstance)
pInstance->SetData(DATA_KING_YMIRON, DONE);
}
void KilledUnit(Unit* pVictim)
{
if (urand(0,1))
return;
void KilledUnit(Unit* pVictim)
{
if (urand(0,1))
return;
Talk(SAY_SLAY);
}
};
Talk(SAY_SLAY);
}
};
};
void AddSC_boss_ymiron()

View File

@@ -16,243 +16,243 @@ public:
return new instance_pinnacle_InstanceMapScript(pMap);
}
struct instance_pinnacle_InstanceMapScript : public InstanceScript
{
instance_pinnacle_InstanceMapScript(Map* pMap) : InstanceScript(pMap) {Initialize();};
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 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;
uint64 SvalaMirrorGUID;
uint64 SkadiRuthlessDoor;
uint64 YmironDoor;
uint64 StatisGenerator;
uint32 FightStatus;
uint32 Encounters[MAX_ENCOUNTERS];
uint8 SkadiHits;
uint8 SkadiInRange;
bool svalaAchievement;
bool skadiAchievement;
bool ymironAchievement;
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;
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;
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;
}
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;
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;
}
}
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;
}
}
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;
}
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;
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;
}
OUT_SAVE_INST_DATA;
SaveToDB();
OUT_SAVE_INST_DATA_COMPLETE;
}
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();
}
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;
}
void Load(const char* in)
{
if (!in)
{
OUT_LOAD_INST_DATA_FAIL;
return;
}
OUT_LOAD_INST_DATA(in);
OUT_LOAD_INST_DATA(in);
char dataHead1, dataHead2;
uint16 data0, data1, data2, data3;
char dataHead1, dataHead2;
uint16 data0, data1, data2, data3;
std::istringstream loadStream(in);
loadStream >> dataHead1 >> dataHead2 >> 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;
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;
for (uint8 i = 0; i < MAX_ENCOUNTERS; ++i)
if (Encounters[i] == IN_PROGRESS)
Encounters[i] = NOT_STARTED;
} else OUT_LOAD_INST_DATA_FAIL;
} else OUT_LOAD_INST_DATA_FAIL;
OUT_LOAD_INST_DATA_COMPLETE;
}
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;
}
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;
}
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;
}
};
return 0;
}
};
};
void AddSC_instance_utgarde_pinnacle()

View File

@@ -3,51 +3,51 @@
enum Data
{
DATA_SVALA_SORROWGRAVE = 0,
DATA_GORTOK_PALEHOOF = 1,
DATA_SKADI_THE_RUTHLESS = 2,
DATA_KING_YMIRON = 3,
DATA_GRAUF = 4,
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,
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,
SKADI_HITS = 30,
SKADI_IN_RANGE = 31,
SKADI_DOOR = 32,
MAX_ENCOUNTERS = 4,
MAX_ENCOUNTERS = 4,
DATA_SVALA_ACHIEVEMENT = 50,
DATA_SKADI_ACHIEVEMENT = 51,
DATA_YMIRON_ACHIEVEMENT = 52,
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,
// 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,
// 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