Core/Scripting: Gyth / Rend Event in progress. Pushing before Vincent Micheal makes ninja changes.

This commit is contained in:
Malcrom
2013-06-25 00:15:41 -02:30
parent c2992cf55d
commit 60159297f2
3 changed files with 157 additions and 113 deletions

View File

@@ -1,6 +1,5 @@
/*
* Copyright (C) 2008-2013 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
@@ -22,30 +21,20 @@
enum Spells
{
SPELL_CORROSIVE_ACID = 20667,
SPELL_FREEZE = 18763,
SPELL_FLAMEBREATH = 20712,
SPELL_SELF_ROOT_FOREVER = 33356
};
enum Adds
{
MODEL_REND_ON_DRAKE = 9723, /// @todo use creature_template 10459 instead of its modelid
NPC_RAGE_TALON_FIRE_TONG = 10372,
NPC_CHROMATIC_WHELP = 10442,
NPC_CHROMATIC_DRAGONSPAWN = 10447,
NPC_BLACKHAND_ELITE = 10317
SPELL_REND_MOUNTS = 16167, // Change model
SPELL_FREEZE = 16350, // Combat
SPELL_KNOCK_AWAY = 10101, // Combat
SPELL_FLAMEBREATH = 16390, // Combat (Self cast)
SPELL_CORROSIVE_ACID = 16359, // Combat (self cast)
SPELL_SUMMON_REND = 16328 // Summons Rend near death
};
enum Events
{
EVENT_SUMMON_REND = 1,
EVENT_AGGRO = 2,
EVENT_SUMMON_DRAGON_PACK = 3,
EVENT_SUMMON_ORC_PACK = 4,
EVENT_CORROSIVE_ACID = 5,
EVENT_FREEZE = 6,
EVENT_FLAME_BREATH = 7
EVENT_CORROSIVE_ACID = 1,
EVENT_FREEZE = 2,
EVENT_FLAME_BREATH = 3,
EVENT_SUMMONED = 4,
};
class boss_gyth : public CreatureScript
@@ -55,10 +44,7 @@ public:
struct boss_gythAI : public BossAI
{
boss_gythAI(Creature* creature) : BossAI(creature, DATA_GYTH)
{
DoCast(me, SPELL_SELF_ROOT_FOREVER);
}
boss_gythAI(Creature* creature) : BossAI(creature, DATA_GYTH) { }
bool SummonedRend;
@@ -66,30 +52,26 @@ public:
{
_Reset();
SummonedRend = false;
//Invisible for event start
me->SetVisible(false);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
}
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
events.ScheduleEvent(EVENT_SUMMON_DRAGON_PACK, 3000);
events.ScheduleEvent(EVENT_SUMMON_ORC_PACK, 60000);
events.ScheduleEvent(EVENT_AGGRO, 60000);
events.ScheduleEvent(EVENT_CORROSIVE_ACID, 18000);
events.ScheduleEvent(EVENT_FREEZE, 20000);
events.ScheduleEvent(EVENT_FLAME_BREATH, 16000);
}
void JustDied(Unit* /*killer*/)
{
_JustDied();
// Open doors
}
void SummonCreatureWithRandomTarget(uint32 creatureId, uint8 count)
void IsSummonedBy(Unit* /*summoner*/)
{
for (uint8 n = 0; n < count; n++)
if (Unit* Summoned = me->SummonCreature(creatureId, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 240 * IN_MILLISECONDS))
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 50.0f, true))
Summoned->AddThreat(target, 250.0f);
events.ScheduleEvent(EVENT_SUMMONED, 8000);
}
void UpdateAI(uint32 diff)
@@ -97,9 +79,10 @@ public:
if (!UpdateVictim())
return;
if (!SummonedRend && HealthBelowPct(11))
if (!SummonedRend && HealthBelowPct(5))
{
events.ScheduleEvent(EVENT_SUMMON_REND, 8000);
DoCast(me, SPELL_REND_MOUNTS);
me->RemoveAura(SPELL_REND_MOUNTS);
SummonedRend = true;
}
@@ -112,55 +95,21 @@ public:
{
switch (eventId)
{
case EVENT_SUMMON_REND:
// Summon Rend and Change model to normal Gyth
// Interrupt any spell casting
me->InterruptNonMeleeSpells(false);
// Gyth model
me->SetDisplayId(me->GetCreatureTemplate()->Modelid1);
me->SummonCreature(NPC_WARCHIEF_REND_BLACKHAND, me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), 0, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 900 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_CORROSIVE_ACID, 8 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_FREEZE, 11 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_FLAME_BREATH, 4 * IN_MILLISECONDS);
events.CancelEvent(EVENT_SUMMON_REND);
break;
case EVENT_AGGRO:
me->SetVisible(true);
me->SetDisplayId(MODEL_REND_ON_DRAKE);
me->setFaction(14);
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE);
events.CancelEvent(EVENT_AGGRO);
break;
// Summon Dragon pack. 2 Dragons and 3 Whelps
case EVENT_SUMMON_DRAGON_PACK:
for (uint8 i = 0; i < urand(0, 3) + 2; ++i)
{
SummonCreatureWithRandomTarget(NPC_RAGE_TALON_FIRE_TONG, 2);
SummonCreatureWithRandomTarget(NPC_CHROMATIC_WHELP, 3);
}
events.CancelEvent(EVENT_SUMMON_DRAGON_PACK);
break;
// Summon Orc pack. 1 Orc Handler 1 Elite Dragonkin and 3 Whelps
case EVENT_SUMMON_ORC_PACK:
for (uint8 i = 0; i < urand (0, 5) + 2; ++i)
{
SummonCreatureWithRandomTarget(NPC_CHROMATIC_DRAGONSPAWN, 1);
SummonCreatureWithRandomTarget(NPC_BLACKHAND_ELITE, 1);
SummonCreatureWithRandomTarget(NPC_CHROMATIC_WHELP, 3);
}
events.CancelEvent(EVENT_SUMMON_ORC_PACK);
case EVENT_SUMMONED:
DoCast(me, SPELL_REND_MOUNTS);
// Load Path
break;
case EVENT_CORROSIVE_ACID:
DoCastVictim(SPELL_CORROSIVE_ACID);
events.ScheduleEvent(EVENT_CORROSIVE_ACID, 7 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_CORROSIVE_ACID, 20000);
break;
case EVENT_FREEZE:
DoCastVictim(SPELL_FREEZE);
events.ScheduleEvent(EVENT_FREEZE, 16 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_FREEZE, 16000);
break;
case EVENT_FLAME_BREATH:
DoCastVictim(SPELL_FLAMEBREATH);
events.ScheduleEvent(EVENT_FLAME_BREATH, 10500);
events.ScheduleEvent(EVENT_FLAME_BREATH, 10000);
break;
}
}

View File

@@ -22,16 +22,74 @@
enum Spells
{
SPELL_WHIRLWIND = 26038,
SPELL_CLEAVE = 20691,
SPELL_THUNDERCLAP = 23931, //Not sure if he cast this spell
SPELL_WHIRLWIND = 13736, // sniffed
SPELL_CLEAVE = 15284,
SPELL_MORTAL_STRIKE = 16856,
SPELL_FRENZY = 8269
};
enum Adds
{
NPC_CHROMATIC_WHELP = 10442,
NPC_CHROMATIC_DRAGONSPAWN = 10447,
NPC_BLACKHAND_DRAGON_HANDLER = 10742
};
struct Wave
{
uint32 entry;
float x_pos;
float y_pos;
float z_pos;
float o_pos;
};
static Wave Wave2[]=
{
{ 10447, 209.8637f, -428.2729f, 110.9877f, 0.6632251f },
{ 10442, 209.3122f, -430.8724f, 110.9814f, 2.9147f },
{ 10442, 211.3309f, -425.9111f, 111.0006f, 1.727876f }
};
static Wave Wave3[]=
{
{ 10742, 208.6493f, -424.5787f, 110.9872f, 5.8294f },
{ 10447, 203.9482f, -428.9446f, 110.982f, 4.677482f },
{ 10442, 203.3441f, -426.8668f, 110.9772f, 4.712389f },
{ 10442, 206.3079f, -424.7509f, 110.9943f, 4.08407f }
};
static Wave Wave4[]=
{
{ 10742, 212.3541f, -412.6826f, 111.0352f, 5.88176f },
{ 10447, 212.5754f, -410.2841f, 111.0296f, 2.740167f },
{ 10442, 212.3449f, -414.8659f, 111.0348f, 2.356194f },
{ 10442, 210.6568f, -412.1552f, 111.0124f, 0.9773844f }
};
static Wave Wave5[]=
{
{ 10742, 210.2188f, -410.6686f, 111.0211f, 5.8294f },
{ 10447, 209.4078f, -414.13f, 111.0264f, 4.677482f },
{ 10442, 208.0858f, -409.3145f, 111.0118f, 4.642576f },
{ 10442, 207.9811f, -413.0728f, 111.0098f, 5.288348f },
{ 10442, 208.0854f, -412.1505f, 111.0057f, 4.08407f }
};
static Wave Wave6[]=
{
{ 10742, 213.9138f, -426.512f, 111.0013f, 3.316126f },
{ 10447, 213.7121f, -429.8102f, 110.9888f, 1.413717f },
{ 10447, 213.7157f, -424.4268f, 111.009f, 3.001966f },
{ 10442, 210.8935f, -423.913f, 111.0125f, 5.969026f },
{ 10442, 212.2642f, -430.7648f, 110.9807f, 5.934119f }
};
enum Events
{
EVENT_WHIRLWIND = 1,
EVENT_CLEAVE = 2,
EVENT_THUNDERCLAP = 3,
EVENT_MORTAL_STRIKE = 3
};
class boss_rend_blackhand : public CreatureScript
@@ -39,14 +97,9 @@ class boss_rend_blackhand : public CreatureScript
public:
boss_rend_blackhand() : CreatureScript("boss_rend_blackhand") { }
CreatureAI* GetAI(Creature* creature) const
{
return new boss_rend_blackhandAI(creature);
}
struct boss_rend_blackhandAI : public BossAI
{
boss_rend_blackhandAI(Creature* creature) : BossAI(creature, DATA_WARCHIEF_REND_BLACKHAND) {}
boss_rend_blackhandAI(Creature* creature) : BossAI(creature, DATA_WARCHIEF_REND_BLACKHAND) { }
void Reset()
{
@@ -56,14 +109,24 @@ public:
void EnterCombat(Unit* /*who*/)
{
_EnterCombat();
events.ScheduleEvent(EVENT_WHIRLWIND, 20 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_CLEAVE, 5 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_THUNDERCLAP, 9 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_WHIRLWIND, 13000);
events.ScheduleEvent(EVENT_CLEAVE, 15000);
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 17000);
}
void JustDied(Unit* /*killer*/)
{
_JustDied();
// Do data set on victor
}
void SetData(uint32 type, uint32 data)
{
if (instance && type == 1 && data == 1)
{
events.ScheduleEvent(EVENT_WHIRLWIND, 5000);
}
}
void UpdateAI(uint32 diff)
@@ -81,22 +144,27 @@ public:
switch (eventId)
{
case EVENT_WHIRLWIND:
DoCastVictim(SPELL_WHIRLWIND);
events.ScheduleEvent(EVENT_WHIRLWIND, 18 * IN_MILLISECONDS);
DoCast(SPELL_WHIRLWIND);
events.ScheduleEvent(EVENT_WHIRLWIND, urand(13000, 18000));
break;
case EVENT_CLEAVE:
DoCastVictim(SPELL_CLEAVE);
events.ScheduleEvent(EVENT_CLEAVE, 10 * IN_MILLISECONDS);
events.ScheduleEvent(EVENT_CLEAVE, 10000);
break;
case EVENT_THUNDERCLAP:
DoCastVictim(SPELL_THUNDERCLAP);
events.ScheduleEvent(EVENT_THUNDERCLAP, 16 * IN_MILLISECONDS);
case EVENT_MORTAL_STRIKE:
DoCastVictim(SPELL_MORTAL_STRIKE);
events.ScheduleEvent(EVENT_MORTAL_STRIKE, 16000);
break;
}
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_rend_blackhandAI(creature);
}
};
void AddSC_boss_rend_blackhand()

View File

@@ -37,13 +37,14 @@ enum Events
EVENT_GYTH_REND_3 = 8,
EVENT_GYTH_REND_4 = 9,
EVENT_GYTH_REND_5 = 10,
EVENT_GYTH_REND_6 = 11,
// Nefarian
EVENT_SHADOWFLAME = 11,
EVENT_VEILOFSHADOW = 12,
EVENT_CLEAVE = 13,
EVENT_TAILLASH = 14,
EVENT_CLASSCALL = 15
EVENT_SHADOWFLAME = 12,
EVENT_VEILOFSHADOW = 13,
EVENT_CLEAVE = 14,
EVENT_TAILLASH = 15,
EVENT_CLASSCALL = 16
};
enum Says
@@ -83,6 +84,12 @@ enum Says
SAY_DEATH_KNIGHT = 13
};
enum Gameobjects
{
// UBRS
OBJECT_DR_PORTCULLIS = 175185
};
enum Gossip
{
GOSSIP_ID = 21332,
@@ -162,7 +169,10 @@ public:
void Reset()
{
if (me->GetMapId() == 229)
events.ScheduleEvent(EVENT_PLAYER_CHECK, 5000);
{
playerGUID = 0;
events.ScheduleEvent(EVENT_PLAYER_CHECK, 10000);
}
if (me->GetMapId() == 469)
{
@@ -225,35 +235,49 @@ public:
switch (eventId)
{
case EVENT_PLAYER_CHECK:
if (SelectTarget(SELECT_TARGET_NEAREST, 0, 30.0f, true))
events.ScheduleEvent(EVENT_GYTH_REND_1, 1000);
else
events.ScheduleEvent(EVENT_PLAYER_CHECK, 5000);
{
Map::PlayerList const &players = me->GetMap()->GetPlayers();
for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr)
if (Player* player = itr->GetSource()->ToPlayer())
{
if (me->GetDistance(player) < 30.0f && player->IsAlive() && !player->IsGameMaster())
{
playerGUID = player->GetGUID();
me->SetInFront(player);
me->SendMovementFlagUpdate();
events.ScheduleEvent(EVENT_GYTH_REND_1, 1000);
}
else
events.ScheduleEvent(EVENT_PLAYER_CHECK, 10000);
}
break;
}
case EVENT_GYTH_REND_1:
Talk(SAY_GYTH_REND_1);
events.ScheduleEvent(EVENT_GYTH_REND_2, 4000);
break;
case EVENT_GYTH_REND_2:
if (Unit* player = SelectTarget(SELECT_TARGET_NEAREST, 0, 30.0f, false))
me->SetInFront(player);
me->SendMovementFlagUpdate();
me->HandleEmoteCommand(EMOTE_ONESHOT_POINT);
events.ScheduleEvent(EVENT_GYTH_REND_3, 4000);
break;
case EVENT_GYTH_REND_3:
Talk(SAY_GYTH_REND_2);
events.ScheduleEvent(EVENT_GYTH_REND_4, 4000);
events.ScheduleEvent(EVENT_GYTH_REND_4, 2000);
break;
case EVENT_GYTH_REND_4:
if (GameObject* portcullis = me->FindNearestGameObject(OBJECT_DR_PORTCULLIS, 50.0f))
portcullis->SetGoState(GO_STATE_READY);
events.ScheduleEvent(EVENT_GYTH_REND_5, 2000);
break;
case EVENT_GYTH_REND_5:
if (Creature* rend = me->FindNearestCreature(NPC_REND_BLACKHAND, 5.0f, true))
me->SetInFront(rend);
me->SendMovementFlagUpdate();
events.ScheduleEvent(EVENT_GYTH_REND_5, 4000);
break;
case EVENT_GYTH_REND_5:
case EVENT_GYTH_REND_6:
me->HandleEmoteCommand(EMOTE_ONESHOT_TALK);
events.ScheduleEvent(EVENT_GYTH_REND_5, 4000);
events.ScheduleEvent(EVENT_GYTH_REND_6, 4000);
default:
break;
}
@@ -346,6 +370,9 @@ public:
}
private:
// UBRS
uint64 playerGUID;
// BWL
uint32 SpawnedAdds;
};