mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-24 10:56:38 +01:00
Core/Scripting: Gyth / Rend Event in progress. Pushing before Vincent Micheal makes ninja changes.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user