mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 18:15:31 +01:00
Scripts:
- cleanup obsidian sanctum script - prevent yelling texts if non player died in some scripts
This commit is contained in:
1
sql/updates/world/2013_12_23_08_world_creature_text.sql
Normal file
1
sql/updates/world/2013_12_23_08_world_creature_text.sql
Normal file
@@ -0,0 +1 @@
|
||||
UPDATE `creature_text` SET `type`=41 WHERE `entry`=28860 AND `groupid`=9;
|
||||
@@ -126,9 +126,10 @@ class boss_akilzon : public CreatureScript
|
||||
_JustDied();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void SetWeather(uint32 weather, float grade)
|
||||
|
||||
@@ -83,9 +83,10 @@ public:
|
||||
Talk(SAY_ONAGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_ONSLAY);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_ONSLAY);
|
||||
}
|
||||
|
||||
void WaypointReached(uint32 waypointId) OVERRIDE
|
||||
|
||||
@@ -97,9 +97,10 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
|
||||
@@ -69,9 +69,10 @@ public:
|
||||
Talk(SAY_AGGRO);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
|
||||
@@ -345,10 +345,7 @@ public:
|
||||
BigWill = 0;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE { }
|
||||
|
||||
void MoveInLineOfSight(Unit* who) OVERRIDE
|
||||
|
||||
{
|
||||
if (!who || !who->IsAlive() || EventInProgress)
|
||||
return;
|
||||
@@ -362,8 +359,6 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE { }
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
{
|
||||
if (EventInProgress)
|
||||
|
||||
@@ -302,9 +302,10 @@ public:
|
||||
ResetPlayersPhaseMask();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -78,44 +78,34 @@ enum Misc
|
||||
DATA_CAN_LOOT = 0
|
||||
};
|
||||
|
||||
struct Location
|
||||
{
|
||||
float x, y, z;
|
||||
};
|
||||
|
||||
static Location FlameRight1Spawn = { 3200.00f, 573.211f, 57.1551f };
|
||||
static Location FlameRight1Direction = { 3289.28f, 573.211f, 57.1551f };
|
||||
static Location FlameRight2Spawn = { 3200.00f, 532.211f, 57.1551f };
|
||||
static Location FlameRight2Direction = { 3289.28f, 532.211f, 57.1551f };
|
||||
static Location FlameRight3Spawn = { 3200.00f, 491.211f, 57.1551f };
|
||||
static Location FlameRight3Direction = { 3289.28f, 491.211f, 57.1551f };
|
||||
static Location FlameLeft1Spawn = { 3289.28f, 511.711f, 57.1551f };
|
||||
static Location FlameLeft1Direction = { 3200.00f, 511.711f, 57.1551f };
|
||||
static Location FlameLeft2Spawn = { 3289.28f, 552.711f, 57.1551f };
|
||||
static Location FlameLeft2Direction = { 3200.00f, 552.711f, 57.1551f };
|
||||
|
||||
struct Waypoint
|
||||
{
|
||||
float m_fX, m_fY, m_fZ;
|
||||
};
|
||||
Position const FlameRight1Spawn = { 3200.00f, 573.211f, 57.1551f, 0.0f };
|
||||
Position const FlameRight1Direction = { 3289.28f, 573.211f, 57.1551f, 0.0f };
|
||||
Position const FlameRight2Spawn = { 3200.00f, 532.211f, 57.1551f, 0.0f };
|
||||
Position const FlameRight2Direction = { 3289.28f, 532.211f, 57.1551f, 0.0f };
|
||||
Position const FlameRight3Spawn = { 3200.00f, 491.211f, 57.1551f, 0.0f };
|
||||
Position const FlameRight3Direction = { 3289.28f, 491.211f, 57.1551f, 0.0f };
|
||||
Position const FlameLeft1Spawn = { 3289.28f, 511.711f, 57.1551f, 0.0f };
|
||||
Position const FlameLeft1Direction = { 3200.00f, 511.711f, 57.1551f, 0.0f };
|
||||
Position const FlameLeft2Spawn = { 3289.28f, 552.711f, 57.1551f, 0.0f };
|
||||
Position const FlameLeft2Direction = { 3200.00f, 552.711f, 57.1551f, 0.0f };
|
||||
|
||||
//each dragons special points. First where fly to before connect to connon, second where land point is.
|
||||
Waypoint m_aTene[]=
|
||||
Position const TenebronPositions[] =
|
||||
{
|
||||
{3212.854f, 575.597f, 109.856f}, // init
|
||||
{3246.425f, 565.367f, 61.249f} // end
|
||||
{ 3212.854f, 575.597f, 109.856f, 0.0f }, // init
|
||||
{ 3246.425f, 565.367f, 61.249f, 0.0f } // end
|
||||
};
|
||||
|
||||
Waypoint m_aShad[]=
|
||||
Position const ShadronPositions[] =
|
||||
{
|
||||
{3293.238f, 472.223f, 106.968f},
|
||||
{3271.669f, 526.907f, 61.931f}
|
||||
{ 3293.238f, 472.223f, 106.968f, 0.0f },
|
||||
{ 3271.669f, 526.907f, 61.931f, 0.0f }
|
||||
};
|
||||
|
||||
Waypoint m_aVesp[]=
|
||||
Position const VesperonPositions[] =
|
||||
{
|
||||
{3193.310f, 472.861f, 102.697f},
|
||||
{3227.268f, 533.238f, 59.995f}
|
||||
{ 3193.310f, 472.861f, 102.697f, 0.0f },
|
||||
{ 3227.268f, 533.238f, 59.995f, 0.0f }
|
||||
};
|
||||
|
||||
enum SartharionEvents
|
||||
@@ -156,11 +146,8 @@ public:
|
||||
|
||||
me->SetHomePosition(3246.57f, 551.263f, 58.6164f, 4.66003f);
|
||||
|
||||
if (instance)
|
||||
{
|
||||
DrakeRespawn();
|
||||
instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED);
|
||||
}
|
||||
DrakeRespawn();
|
||||
instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED);
|
||||
}
|
||||
|
||||
void JustReachedHome() OVERRIDE
|
||||
@@ -174,8 +161,7 @@ public:
|
||||
_EnterCombat();
|
||||
DoZoneInCombat();
|
||||
|
||||
if (instance)
|
||||
FetchDragons();
|
||||
FetchDragons();
|
||||
|
||||
events.ScheduleEvent(EVENT_LAVA_STRIKE, 5000);
|
||||
events.ScheduleEvent(EVENT_CLEAVE_ATTACK, 7000);
|
||||
@@ -192,25 +178,23 @@ public:
|
||||
Talk(SAY_SARTHARION_DEATH);
|
||||
_JustDied();
|
||||
|
||||
if (instance)
|
||||
{
|
||||
if (Creature* tenebron = Unit::GetCreature(*me, instance->GetData64(DATA_TENEBRON)))
|
||||
if (tenebron->IsAlive())
|
||||
tenebron->DisappearAndDie();
|
||||
if (Creature* tenebron = Unit::GetCreature(*me, instance->GetData64(DATA_TENEBRON)))
|
||||
if (tenebron->IsAlive())
|
||||
tenebron->DisappearAndDie();
|
||||
|
||||
if (Creature* shadron = Unit::GetCreature(*me, instance->GetData64(DATA_SHADRON)))
|
||||
if (shadron->IsAlive())
|
||||
shadron->DisappearAndDie();
|
||||
if (Creature* shadron = Unit::GetCreature(*me, instance->GetData64(DATA_SHADRON)))
|
||||
if (shadron->IsAlive())
|
||||
shadron->DisappearAndDie();
|
||||
|
||||
if (Creature* vesperon = Unit::GetCreature(*me, instance->GetData64(DATA_VESPERON)))
|
||||
if (vesperon->IsAlive())
|
||||
vesperon->DisappearAndDie();
|
||||
}
|
||||
if (Creature* vesperon = Unit::GetCreature(*me, instance->GetData64(DATA_VESPERON)))
|
||||
if (vesperon->IsAlive())
|
||||
vesperon->DisappearAndDie();
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SARTHARION_SLAY);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SARTHARION_SLAY);
|
||||
}
|
||||
|
||||
// me->ResetLootMode() is called from Reset()
|
||||
@@ -307,7 +291,7 @@ public:
|
||||
AddDrakeLootMode();
|
||||
++drakeCount;
|
||||
}
|
||||
fetchTene->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aTene[0].m_fX, m_aTene[0].m_fY, m_aTene[0].m_fZ);
|
||||
fetchTene->GetMotionMaster()->MovePoint(POINT_ID_INIT, TenebronPositions[0]);
|
||||
|
||||
if (!fetchTene->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
|
||||
fetchTene->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
@@ -325,7 +309,7 @@ public:
|
||||
AddDrakeLootMode();
|
||||
++drakeCount;
|
||||
}
|
||||
fetchShad->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aShad[0].m_fX, m_aShad[0].m_fY, m_aShad[0].m_fZ);
|
||||
fetchShad->GetMotionMaster()->MovePoint(POINT_ID_INIT, ShadronPositions[0]);
|
||||
|
||||
if (!fetchShad->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
|
||||
fetchShad->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
@@ -343,7 +327,7 @@ public:
|
||||
AddDrakeLootMode();
|
||||
++drakeCount;
|
||||
}
|
||||
fetchVesp->GetMotionMaster()->MovePoint(POINT_ID_INIT, m_aVesp[0].m_fX, m_aVesp[0].m_fY, m_aVesp[0].m_fZ);
|
||||
fetchVesp->GetMotionMaster()->MovePoint(POINT_ID_INIT, VesperonPositions[0]);
|
||||
|
||||
if (!fetchVesp->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
|
||||
fetchVesp->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
@@ -367,24 +351,24 @@ public:
|
||||
if (temp->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
|
||||
temp->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
|
||||
int32 textId = 0;
|
||||
uint8 textId = 0;
|
||||
|
||||
switch (temp->GetEntry())
|
||||
{
|
||||
case NPC_TENEBRON:
|
||||
textId = SAY_SARTHARION_CALL_TENEBRON;
|
||||
temp->AddAura(SPELL_POWER_OF_TENEBRON, temp);
|
||||
temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, m_aTene[1].m_fX, m_aTene[1].m_fY, m_aTene[1].m_fZ);
|
||||
temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, TenebronPositions[1]);
|
||||
break;
|
||||
case NPC_SHADRON:
|
||||
textId = SAY_SARTHARION_CALL_SHADRON;
|
||||
temp->AddAura(SPELL_POWER_OF_SHADRON, temp);
|
||||
temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, m_aShad[1].m_fX, m_aShad[1].m_fY, m_aShad[1].m_fZ);
|
||||
temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, ShadronPositions[1]);
|
||||
break;
|
||||
case NPC_VESPERON:
|
||||
textId = SAY_SARTHARION_CALL_VESPERON;
|
||||
temp->AddAura(SPELL_POWER_OF_VESPERON, temp);
|
||||
temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, m_aVesp[1].m_fX, m_aVesp[1].m_fY, m_aVesp[1].m_fZ);
|
||||
temp->GetMotionMaster()->MovePoint(POINT_ID_LAND, VesperonPositions[1]);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -402,20 +386,6 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
void SendFlameTsunami()
|
||||
{
|
||||
if (Map* map = me->GetMap())
|
||||
if (map->IsDungeon())
|
||||
{
|
||||
Map::PlayerList const &PlayerList = map->GetPlayers();
|
||||
|
||||
if (!PlayerList.isEmpty())
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
if (i->GetSource() && i->GetSource()->IsAlive())
|
||||
Talk(WHISPER_LAVA_CHURN, i->GetSource());
|
||||
}
|
||||
}
|
||||
|
||||
// Selects a random Fire Cyclone and makes it cast Lava Strike.
|
||||
// FIXME: Frequency of the casts reduced to compensate 100% chance of spawning a Lava Blaze add
|
||||
void CastLavaStrikeOnTarget(Unit* target)
|
||||
@@ -428,13 +398,7 @@ public:
|
||||
if (fireCyclonesList.empty())
|
||||
return;
|
||||
|
||||
std::list<Creature*>::iterator itr = fireCyclonesList.begin();
|
||||
uint32 rnd = rand()%fireCyclonesList.size();
|
||||
|
||||
for (uint32 i = 0; i < rnd; ++i)
|
||||
++itr;
|
||||
|
||||
(*itr)->CastSpell(target, SPELL_LAVA_STRIKE, true);
|
||||
Trinity::Containers::SelectRandomContainerElement(fireCyclonesList)->CastSpell(target, SPELL_LAVA_STRIKE, true);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
@@ -456,25 +420,25 @@ public:
|
||||
}
|
||||
break;
|
||||
case EVENT_FLAME_TSUNAMI:
|
||||
SendFlameTsunami();
|
||||
Talk(WHISPER_LAVA_CHURN);
|
||||
switch (urand(0, 1))
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
if (Creature* right1 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight1Spawn.x, FlameRight1Spawn.y, FlameRight1Spawn.z, 0, TEMPSUMMON_TIMED_DESPAWN, 12000))
|
||||
right1->GetMotionMaster()->MovePoint(0, FlameRight1Direction.x, FlameRight1Direction.y, FlameRight1Direction.z);
|
||||
if (Creature* right2 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight2Spawn.x, FlameRight2Spawn.y, FlameRight2Spawn.z, 0, TEMPSUMMON_TIMED_DESPAWN, 12000))
|
||||
right2->GetMotionMaster()->MovePoint(0, FlameRight2Direction.x, FlameRight2Direction.y, FlameRight2Direction.z);
|
||||
if (Creature* right3 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight3Spawn.x, FlameRight3Spawn.y, FlameRight3Spawn.z, 0, TEMPSUMMON_TIMED_DESPAWN, 12000))
|
||||
right3->GetMotionMaster()->MovePoint(0, FlameRight3Direction.x, FlameRight3Direction.y, FlameRight3Direction.z);
|
||||
if (Creature* right1 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight1Spawn, TEMPSUMMON_TIMED_DESPAWN, 12000))
|
||||
right1->GetMotionMaster()->MovePoint(0, FlameRight1Direction);
|
||||
if (Creature* right2 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight2Spawn, TEMPSUMMON_TIMED_DESPAWN, 12000))
|
||||
right2->GetMotionMaster()->MovePoint(0, FlameRight2Direction);
|
||||
if (Creature* right3 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameRight3Spawn, TEMPSUMMON_TIMED_DESPAWN, 12000))
|
||||
right3->GetMotionMaster()->MovePoint(0, FlameRight3Direction);
|
||||
break;
|
||||
}
|
||||
case 1:
|
||||
{
|
||||
if (Creature* left1 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameLeft1Spawn.x, FlameLeft1Spawn.y, FlameLeft1Spawn.z, 0, TEMPSUMMON_TIMED_DESPAWN, 12000))
|
||||
left1->GetMotionMaster()->MovePoint(0, FlameLeft1Direction.x, FlameLeft1Direction.y, FlameLeft1Direction.z);
|
||||
if (Creature* left2 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameLeft2Spawn.x, FlameLeft2Spawn.y, FlameLeft2Spawn.z, 0, TEMPSUMMON_TIMED_DESPAWN, 12000))
|
||||
left2->GetMotionMaster()->MovePoint(0, FlameLeft2Direction.x, FlameLeft2Direction.y, FlameLeft2Direction.z);
|
||||
if (Creature* left1 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameLeft1Spawn, TEMPSUMMON_TIMED_DESPAWN, 12000))
|
||||
left1->GetMotionMaster()->MovePoint(0, FlameLeft1Direction);
|
||||
if (Creature* left2 = me->SummonCreature(NPC_FLAME_TSUNAMI, FlameLeft2Spawn, TEMPSUMMON_TIMED_DESPAWN, 12000))
|
||||
left2->GetMotionMaster()->MovePoint(0, FlameLeft2Direction);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -547,7 +511,7 @@ public:
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new boss_sartharionAI(creature);
|
||||
return GetObsidianSanctumAI<boss_sartharionAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -94,58 +94,44 @@ enum Misc
|
||||
DATA_CAN_LOOT = 0
|
||||
};
|
||||
|
||||
struct Location
|
||||
{
|
||||
float x, y, z;
|
||||
};
|
||||
|
||||
struct Locations
|
||||
{
|
||||
float x, y, z;
|
||||
};
|
||||
|
||||
struct Waypoint
|
||||
{
|
||||
float m_fX, m_fY, m_fZ;
|
||||
};
|
||||
|
||||
#define MAX_WAYPOINT 6
|
||||
//points around raid "isle", counter clockwise. should probably be adjusted to be more alike
|
||||
Waypoint dragonCommon[MAX_WAYPOINT]=
|
||||
Position const dragonCommon[MAX_WAYPOINT]=
|
||||
{
|
||||
{3214.012f, 468.932f, 98.652f},
|
||||
{3244.950f, 468.427f, 98.652f},
|
||||
{3283.520f, 496.869f, 98.652f},
|
||||
{3287.316f, 555.875f, 98.652f},
|
||||
{3250.479f, 585.827f, 98.652f},
|
||||
{3209.969f, 566.523f, 98.652f}
|
||||
{ 3214.012f, 468.932f, 98.652f, 0.0f },
|
||||
{ 3244.950f, 468.427f, 98.652f, 0.0f },
|
||||
{ 3283.520f, 496.869f, 98.652f, 0.0f },
|
||||
{ 3287.316f, 555.875f, 98.652f, 0.0f },
|
||||
{ 3250.479f, 585.827f, 98.652f, 0.0f },
|
||||
{ 3209.969f, 566.523f, 98.652f, 0.0f }
|
||||
};
|
||||
|
||||
static Location AcolyteofShadron = { 3363.92f, 534.703f, 97.2683f };
|
||||
static Location AcolyteofShadron2 = { 3246.57f, 551.263f, 58.6164f };
|
||||
static Location AcolyteofVesperon = { 3145.68f, 520.71f, 89.7f };
|
||||
static Location AcolyteofVesperon2 = { 3246.57f, 551.263f, 58.6164f };
|
||||
Position const AcolyteofShadron = { 3363.92f, 534.703f, 97.2683f, 0.0f };
|
||||
Position const AcolyteofShadron2 = { 3246.57f, 551.263f, 58.6164f, 0.0f };
|
||||
Position const AcolyteofVesperon = { 3145.68f, 520.71f, 89.7f, 0.0f };
|
||||
Position const AcolyteofVesperon2 = { 3246.57f, 551.263f, 58.6164f, 0.0f };
|
||||
|
||||
Locations TwilightEggs[] =
|
||||
Position const TwilightEggs[] =
|
||||
{
|
||||
{3219.28f, 669.121f, 88.5549f},
|
||||
{3221.55f, 682.852f, 90.5361f},
|
||||
{3239.77f, 685.94f, 90.3168f},
|
||||
{3250.33f, 669.749f, 88.7637f},
|
||||
{3246.6f, 642.365f, 84.8752f},
|
||||
{3233.68f, 653.117f, 85.7051f}
|
||||
};
|
||||
Locations TwilightEggsSarth[] =
|
||||
{
|
||||
{3252.73f, 515.762f, 58.5501f},
|
||||
{3256.56f, 521.119f, 58.6061f},
|
||||
{3255.63f, 527.513f, 58.7568f},
|
||||
{3264.90f, 525.865f, 58.6436f},
|
||||
{3264.26f, 516.364f, 58.8011f},
|
||||
{3257.54f, 502.285f, 58.2077f}
|
||||
{ 3219.28f, 669.121f, 88.5549f, 0.0f },
|
||||
{ 3221.55f, 682.852f, 90.5361f, 0.0f },
|
||||
{ 3239.77f, 685.94f, 90.3168f, 0.0f },
|
||||
{ 3250.33f, 669.749f, 88.7637f, 0.0f },
|
||||
{ 3246.6f, 642.365f, 84.8752f, 0.0f },
|
||||
{ 3233.68f, 653.117f, 85.7051f, 0.0f }
|
||||
};
|
||||
|
||||
enum SharedTextIDs
|
||||
Position const TwilightEggsSarth[] =
|
||||
{
|
||||
{ 3252.73f, 515.762f, 58.5501f, 0.0f },
|
||||
{ 3256.56f, 521.119f, 58.6061f, 0.0f },
|
||||
{ 3255.63f, 527.513f, 58.7568f, 0.0f },
|
||||
{ 3264.90f, 525.865f, 58.6436f, 0.0f },
|
||||
{ 3264.26f, 516.364f, 58.8011f, 0.0f },
|
||||
{ 3257.54f, 502.285f, 58.2077f, 0.0f }
|
||||
};
|
||||
|
||||
enum SharedTextIds
|
||||
{
|
||||
SAY_AGGRO = 0,
|
||||
SAY_SLAY = 1,
|
||||
@@ -157,12 +143,24 @@ enum SharedTextIDs
|
||||
WHISPER_OPENED_PORTAL = 7
|
||||
};
|
||||
|
||||
enum DummyDragonEvents
|
||||
enum DragonEvents
|
||||
{
|
||||
EVENT_FREE_MOVEMENT = 1
|
||||
// Shared Events
|
||||
EVENT_FREE_MOVEMENT = 1,
|
||||
EVENT_SHADOW_FISSURE = 2,
|
||||
EVENT_SHADOW_BREATH = 3,
|
||||
|
||||
// Tenebron
|
||||
EVENT_HATCH_EGGS = 4,
|
||||
|
||||
// Shadron
|
||||
EVENT_ACOLYTE_SHADRON = 5,
|
||||
|
||||
// Vesperon
|
||||
EVENT_ACOLYTE_VESPERON = 6
|
||||
};
|
||||
|
||||
//to control each dragons common abilities
|
||||
// to control each dragons common abilities
|
||||
struct dummy_dragonAI : public ScriptedAI
|
||||
{
|
||||
dummy_dragonAI(Creature* creature) : ScriptedAI(creature)
|
||||
@@ -175,12 +173,22 @@ struct dummy_dragonAI : public ScriptedAI
|
||||
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE))
|
||||
me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
|
||||
|
||||
events.Reset();
|
||||
waypointId = 0;
|
||||
portalRespawnTime = 30000;
|
||||
_canMoveFree = false;
|
||||
_canLoot = true;
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
DoZoneInCombat();
|
||||
|
||||
events.ScheduleEvent(EVENT_SHADOW_FISSURE, 5000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BREATH, 20000);
|
||||
}
|
||||
|
||||
void SetData(uint32 type, uint32 value) OVERRIDE
|
||||
{
|
||||
if (type == DATA_CAN_LOOT)
|
||||
@@ -217,14 +225,11 @@ struct dummy_dragonAI : public ScriptedAI
|
||||
return;
|
||||
}
|
||||
|
||||
// get amount of common points
|
||||
uint32 commonWPCount = sizeof(dragonCommon)/sizeof(Waypoint);
|
||||
|
||||
// increase
|
||||
waypointId = pointId+1;
|
||||
waypointId = pointId + 1;
|
||||
|
||||
// if we have reached a point bigger or equal to count, it mean we must reset to point 0
|
||||
if (waypointId >= commonWPCount)
|
||||
if (waypointId >= MAX_WAYPOINT)
|
||||
{
|
||||
if (!_canMoveFree)
|
||||
_canMoveFree = true;
|
||||
@@ -235,23 +240,6 @@ struct dummy_dragonAI : public ScriptedAI
|
||||
events.ScheduleEvent(EVENT_FREE_MOVEMENT, 500);
|
||||
}
|
||||
|
||||
// used when open portal and spawn mobs in phase
|
||||
void DoRaidWhisper(int32 iTextId)
|
||||
{
|
||||
Map* map = me->GetMap();
|
||||
|
||||
if (map && map->IsDungeon())
|
||||
{
|
||||
Map::PlayerList const &PlayerList = map->GetPlayers();
|
||||
|
||||
if (!PlayerList.isEmpty())
|
||||
{
|
||||
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
|
||||
Talk(iTextId, i->GetSource());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// "opens" the portal and does the "opening" whisper
|
||||
void OpenPortal()
|
||||
{
|
||||
@@ -268,21 +256,21 @@ struct dummy_dragonAI : public ScriptedAI
|
||||
if (instance && !instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS)
|
||||
{
|
||||
for (uint32 i = 0; i < 6; ++i)
|
||||
me->SummonCreature(NPC_TWILIGHT_EGG, TwilightEggs[i].x, TwilightEggs[i].y, TwilightEggs[i].z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000);
|
||||
me->SummonCreature(NPC_TWILIGHT_EGG, TwilightEggs[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (uint32 i = 0; i < 6; ++i)
|
||||
me->SummonCreature(NPC_SARTHARION_TWILIGHT_EGG, TwilightEggsSarth[i].x, TwilightEggsSarth[i].y, TwilightEggsSarth[i].z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000);
|
||||
me->SummonCreature(NPC_SARTHARION_TWILIGHT_EGG, TwilightEggsSarth[i], TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case NPC_SHADRON:
|
||||
{
|
||||
if (instance && !instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS)
|
||||
me->SummonCreature(NPC_ACOLYTE_OF_SHADRON, AcolyteofShadron.x, AcolyteofShadron.y, AcolyteofShadron.z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 28000);
|
||||
me->SummonCreature(NPC_ACOLYTE_OF_SHADRON, AcolyteofShadron, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 28000);
|
||||
else
|
||||
me->SummonCreature(NPC_ACOLYTE_OF_SHADRON, AcolyteofShadron2.x, AcolyteofShadron2.y, AcolyteofShadron2.z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 28000);
|
||||
me->SummonCreature(NPC_ACOLYTE_OF_SHADRON, AcolyteofShadron2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 28000);
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -290,7 +278,7 @@ struct dummy_dragonAI : public ScriptedAI
|
||||
{
|
||||
if (instance && !instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS)
|
||||
{
|
||||
if (Creature* acolyte = me->SummonCreature(NPC_ACOLYTE_OF_VESPERON, AcolyteofVesperon.x, AcolyteofVesperon.y, AcolyteofVesperon.z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
|
||||
if (Creature* acolyte = me->SummonCreature(NPC_ACOLYTE_OF_VESPERON, AcolyteofVesperon, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
|
||||
{
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
acolyte->InterruptNonMeleeSpells(true);
|
||||
@@ -299,7 +287,7 @@ struct dummy_dragonAI : public ScriptedAI
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Creature* acolyte = me->SummonCreature(NPC_ACOLYTE_OF_VESPERON, AcolyteofVesperon2.x, AcolyteofVesperon2.y, AcolyteofVesperon2.z, 0, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
|
||||
if (Creature* acolyte = me->SummonCreature(NPC_ACOLYTE_OF_VESPERON, AcolyteofVesperon2, TEMPSUMMON_CORPSE_TIMED_DESPAWN, 20000))
|
||||
{
|
||||
me->InterruptNonMeleeSpells(true);
|
||||
acolyte->InterruptNonMeleeSpells(true);
|
||||
@@ -307,12 +295,12 @@ struct dummy_dragonAI : public ScriptedAI
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoRaidWhisper(WHISPER_OPEN_PORTAL);
|
||||
DoRaidWhisper(WHISPER_OPENED_PORTAL);
|
||||
Talk(WHISPER_OPEN_PORTAL);
|
||||
Talk(WHISPER_OPENED_PORTAL);
|
||||
|
||||
// By using SetRespawnTime() we will actually "spawn" the object with our defined time.
|
||||
// Once time is up, portal will disappear again.
|
||||
@@ -323,6 +311,12 @@ struct dummy_dragonAI : public ScriptedAI
|
||||
// Refresh respawnTime so time again are set to 30secs?
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
if (!_canLoot)
|
||||
@@ -365,7 +359,7 @@ struct dummy_dragonAI : public ScriptedAI
|
||||
return;
|
||||
|
||||
// Twilight Revenge to main boss
|
||||
if (Unit* sartharion = Unit::GetUnit(*me, instance->GetData64(DATA_SARTHARION)))
|
||||
if (Unit* sartharion = ObjectAccessor::GetUnit(*me, instance->GetData64(DATA_SARTHARION)))
|
||||
if (sartharion->IsAlive())
|
||||
{
|
||||
sartharion->RemoveAurasDueToSpell(spellId);
|
||||
@@ -381,11 +375,30 @@ struct dummy_dragonAI : public ScriptedAI
|
||||
if (events.ExecuteEvent() == EVENT_FREE_MOVEMENT)
|
||||
{
|
||||
if (_canMoveFree && waypointId < MAX_WAYPOINT)
|
||||
me->GetMotionMaster()->MovePoint(waypointId, dragonCommon[waypointId].m_fX, dragonCommon[waypointId].m_fY, dragonCommon[waypointId].m_fZ);
|
||||
me->GetMotionMaster()->MovePoint(waypointId, dragonCommon[waypointId]);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
void ExecuteEvent(uint32 eventId)
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHADOW_FISSURE:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
|
||||
DoCast(target, RAID_MODE(SPELL_SHADOW_FISSURE, SPELL_SHADOW_FISSURE));
|
||||
events.ScheduleEvent(eventId, urand(15000, 20000));
|
||||
break;
|
||||
case EVENT_SHADOW_BREATH:
|
||||
Talk(SAY_BREATH);
|
||||
DoCastVictim(RAID_MODE(SPELL_SHADOW_BREATH, SPELL_SHADOW_BREATH_H));
|
||||
events.ScheduleEvent(eventId, urand(20000, 25000));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
protected:
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
uint32 waypointId;
|
||||
@@ -398,13 +411,6 @@ struct dummy_dragonAI : public ScriptedAI
|
||||
## Tenebron
|
||||
######*/
|
||||
|
||||
enum TenebronEvents
|
||||
{
|
||||
EVENT_SHADOW_FISSURE_TENEBRON = 2,
|
||||
EVENT_HATCH_EGGS = 3,
|
||||
EVENT_SHADOW_BREATH_TENEBRON = 4
|
||||
};
|
||||
|
||||
class npc_tenebron : public CreatureScript
|
||||
{
|
||||
public:
|
||||
@@ -419,23 +425,16 @@ public:
|
||||
dummy_dragonAI::Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
void EnterCombat(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
DoZoneInCombat();
|
||||
events.ScheduleEvent(EVENT_SHADOW_FISSURE_TENEBRON, 5000);
|
||||
events.ScheduleEvent(EVENT_HATCH_EGGS, 30000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BREATH_TENEBRON, 20000);
|
||||
}
|
||||
dummy_dragonAI::EnterCombat(who);
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_HATCH_EGGS, 30000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
{
|
||||
//if no target, update dummy and return
|
||||
// if no target, update dummy and return
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
dummy_dragonAI::UpdateAI(diff);
|
||||
@@ -448,32 +447,23 @@ public:
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHADOW_FISSURE_TENEBRON:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(target, RAID_MODE(SPELL_SHADOW_FISSURE, SPELL_SHADOW_FISSURE));
|
||||
events.ScheduleEvent(EVENT_SHADOW_FISSURE_TENEBRON, urand(15000, 20000));
|
||||
break;
|
||||
case EVENT_HATCH_EGGS:
|
||||
OpenPortal();
|
||||
events.ScheduleEvent(EVENT_HATCH_EGGS, 30000);
|
||||
break;
|
||||
case EVENT_SHADOW_BREATH_TENEBRON:
|
||||
Talk(SAY_BREATH);
|
||||
DoCastVictim(RAID_MODE(SPELL_SHADOW_BREATH, SPELL_SHADOW_BREATH_H));
|
||||
events.ScheduleEvent(EVENT_SHADOW_BREATH_TENEBRON, urand(20000, 25000));
|
||||
default:
|
||||
dummy_dragonAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new npc_tenebronAI(creature);
|
||||
return GetObsidianSanctumAI<npc_tenebronAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -481,13 +471,6 @@ public:
|
||||
## Shadron
|
||||
######*/
|
||||
|
||||
enum ShadronEvents
|
||||
{
|
||||
EVENT_SHADOW_FISSURE_SHADRON = 5,
|
||||
EVENT_ACOLYTE_SHADRON = 6,
|
||||
EVENT_SHADOW_BREATH_SHADRON = 7
|
||||
};
|
||||
|
||||
class npc_shadron : public CreatureScript
|
||||
{
|
||||
public:
|
||||
@@ -495,10 +478,7 @@ public:
|
||||
|
||||
struct npc_shadronAI : public dummy_dragonAI
|
||||
{
|
||||
npc_shadronAI(Creature* creature) : dummy_dragonAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
npc_shadronAI(Creature* creature) : dummy_dragonAI(creature) { }
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
@@ -510,27 +490,19 @@ public:
|
||||
if (me->HasAura(SPELL_GIFT_OF_TWILIGTH_SHA))
|
||||
me->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SHA);
|
||||
|
||||
if (instance)
|
||||
instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED);
|
||||
instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
void EnterCombat(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
DoZoneInCombat();
|
||||
events.ScheduleEvent(EVENT_SHADOW_FISSURE_SHADRON, 5000);
|
||||
dummy_dragonAI::EnterCombat(who);
|
||||
|
||||
events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, 60000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BREATH_SHADRON, 20000);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
{
|
||||
//if no target, update dummy and return
|
||||
// if no target, update dummy and return
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
dummy_dragonAI::UpdateAI(diff);
|
||||
@@ -543,11 +515,6 @@ public:
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHADOW_FISSURE_SHADRON:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(target, RAID_MODE(SPELL_SHADOW_FISSURE, SPELL_SHADOW_FISSURE_H));
|
||||
events.ScheduleEvent(EVENT_SHADOW_FISSURE_SHADRON, urand(15000, 20000));
|
||||
break;
|
||||
case EVENT_ACOLYTE_SHADRON:
|
||||
if (instance->GetBossState(DATA_PORTAL_OPEN) == NOT_STARTED)
|
||||
events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, 10000);
|
||||
@@ -558,30 +525,24 @@ public:
|
||||
|
||||
OpenPortal();
|
||||
|
||||
if (instance)
|
||||
instance->SetBossState(DATA_PORTAL_OPEN, IN_PROGRESS);
|
||||
instance->SetBossState(DATA_PORTAL_OPEN, IN_PROGRESS);
|
||||
|
||||
events.ScheduleEvent(EVENT_ACOLYTE_SHADRON, urand(60000, 65000));
|
||||
}
|
||||
break;
|
||||
case EVENT_SHADOW_BREATH_SHADRON:
|
||||
Talk(SAY_BREATH);
|
||||
DoCastVictim(RAID_MODE(SPELL_SHADOW_BREATH, SPELL_SHADOW_BREATH_H));
|
||||
events.ScheduleEvent(EVENT_SHADOW_BREATH_SHADRON, urand(20000, 25000));
|
||||
default:
|
||||
dummy_dragonAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new npc_shadronAI(creature);
|
||||
return GetObsidianSanctumAI<npc_shadronAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -589,13 +550,6 @@ public:
|
||||
## Vesperon
|
||||
######*/
|
||||
|
||||
enum VesperonEvents
|
||||
{
|
||||
EVENT_SHADOW_FISSURE_VESPERON = 8,
|
||||
EVENT_ACOLYTE_VESPERON = 9,
|
||||
EVENT_SHADOW_BREATH_VESPERON = 10
|
||||
};
|
||||
|
||||
class npc_vesperon : public CreatureScript
|
||||
{
|
||||
public:
|
||||
@@ -603,33 +557,23 @@ public:
|
||||
|
||||
struct npc_vesperonAI : public dummy_dragonAI
|
||||
{
|
||||
npc_vesperonAI(Creature* creature) : dummy_dragonAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
npc_vesperonAI(Creature* creature) : dummy_dragonAI(creature) { }
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
dummy_dragonAI::Reset();
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
void EnterCombat(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_AGGRO);
|
||||
DoZoneInCombat();
|
||||
events.ScheduleEvent(EVENT_SHADOW_FISSURE_VESPERON, 5000);
|
||||
events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 60000);
|
||||
events.ScheduleEvent(EVENT_SHADOW_BREATH_VESPERON, 20000);
|
||||
}
|
||||
dummy_dragonAI::EnterCombat(who);
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 60000);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
{
|
||||
//if no target, update dummy and return
|
||||
// if no target, update dummy and return
|
||||
if (!UpdateVictim())
|
||||
{
|
||||
dummy_dragonAI::UpdateAI(diff);
|
||||
@@ -642,11 +586,6 @@ public:
|
||||
{
|
||||
switch (eventId)
|
||||
{
|
||||
case EVENT_SHADOW_FISSURE_VESPERON:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
DoCast(target, RAID_MODE(SPELL_SHADOW_FISSURE, SPELL_SHADOW_FISSURE_H));
|
||||
events.ScheduleEvent(EVENT_SHADOW_FISSURE_VESPERON, urand(15000, 20000));
|
||||
break;
|
||||
case EVENT_ACOLYTE_VESPERON:
|
||||
if (instance->GetBossState(DATA_PORTAL_OPEN) == IN_PROGRESS)
|
||||
events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, 10000);
|
||||
@@ -657,24 +596,19 @@ public:
|
||||
events.ScheduleEvent(EVENT_ACOLYTE_VESPERON, urand(60000, 70000));
|
||||
}
|
||||
break;
|
||||
case EVENT_SHADOW_BREATH_VESPERON:
|
||||
Talk(SAY_BREATH);
|
||||
DoCastVictim(RAID_MODE(SPELL_SHADOW_BREATH, SPELL_SHADOW_BREATH_H));
|
||||
events.ScheduleEvent(EVENT_SHADOW_BREATH_VESPERON, urand(20000, 25000));
|
||||
default:
|
||||
dummy_dragonAI::ExecuteEvent(eventId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
InstanceScript* instance;
|
||||
EventMap events;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new npc_vesperonAI(creature);
|
||||
return GetObsidianSanctumAI<npc_vesperonAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -684,23 +618,21 @@ public:
|
||||
|
||||
class npc_acolyte_of_shadron : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_acolyte_of_shadron() : CreatureScript("npc_acolyte_of_shadron") { }
|
||||
public:
|
||||
npc_acolyte_of_shadron() : CreatureScript("npc_acolyte_of_shadron") { }
|
||||
|
||||
struct npc_acolyte_of_shadronAI : public ScriptedAI
|
||||
{
|
||||
npc_acolyte_of_shadronAI(Creature* creature) : ScriptedAI(creature)
|
||||
struct npc_acolyte_of_shadronAI : public ScriptedAI
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
// Despawn the NPC automatically after 28 seconds
|
||||
me->DespawnOrUnsummon(28000);
|
||||
|
||||
if (instance)
|
||||
npc_acolyte_of_shadronAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
// Despawn the NPC automatically after 28 seconds
|
||||
me->DespawnOrUnsummon(28000);
|
||||
|
||||
//if not solo fight, buff main boss, else place debuff on mini-boss. both spells TARGET_SCRIPT
|
||||
if (instance->GetBossState(DATA_SARTHARION) == IN_PROGRESS)
|
||||
{
|
||||
@@ -712,14 +644,11 @@ public:
|
||||
if (Creature* shadron = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADRON)))
|
||||
shadron->AddAura(SPELL_GIFT_OF_TWILIGTH_SHA, shadron);
|
||||
}
|
||||
|
||||
me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me);
|
||||
}
|
||||
|
||||
me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
if (instance)
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
if (ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_SHADRON)))
|
||||
instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED);
|
||||
@@ -727,7 +656,7 @@ public:
|
||||
Map* map = me->GetMap();
|
||||
if (map->IsDungeon())
|
||||
{
|
||||
Map::PlayerList const &PlayerList = map->GetPlayers();
|
||||
Map::PlayerList const& PlayerList = map->GetPlayers();
|
||||
|
||||
if (PlayerList.isEmpty())
|
||||
return;
|
||||
@@ -741,7 +670,7 @@ public:
|
||||
i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT);
|
||||
i->GetSource()->RemoveAurasDueToSpell(SPELL_TWILIGHT_SHIFT_ENTER);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// not solo fight, so main boss has debuff
|
||||
@@ -754,24 +683,23 @@ public:
|
||||
if (debuffTarget->IsAlive() && debuffTarget->HasAura(SPELL_GIFT_OF_TWILIGTH_SHA))
|
||||
debuffTarget->RemoveAurasDueToSpell(SPELL_GIFT_OF_TWILIGTH_SHA);
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/) OVERRIDE
|
||||
void UpdateAI(uint32 /*diff*/) OVERRIDE
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
InstanceScript* instance;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
return GetObsidianSanctumAI<npc_acolyte_of_shadronAI>(creature);
|
||||
}
|
||||
|
||||
private:
|
||||
InstanceScript* instance;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new npc_acolyte_of_shadronAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -780,34 +708,31 @@ public:
|
||||
|
||||
class npc_acolyte_of_vesperon : public CreatureScript
|
||||
{
|
||||
public:
|
||||
npc_acolyte_of_vesperon() : CreatureScript("npc_acolyte_of_vesperon") { }
|
||||
public:
|
||||
npc_acolyte_of_vesperon() : CreatureScript("npc_acolyte_of_vesperon") { }
|
||||
|
||||
struct npc_acolyte_of_vesperonAI : public ScriptedAI
|
||||
{
|
||||
npc_acolyte_of_vesperonAI(Creature* creature) : ScriptedAI(creature)
|
||||
struct npc_acolyte_of_vesperonAI : public ScriptedAI
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
npc_acolyte_of_vesperonAI(Creature* creature) : ScriptedAI(creature)
|
||||
{
|
||||
instance = creature->GetInstanceScript();
|
||||
}
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
// Despawn the NPC automatically after 28 seconds
|
||||
me->DespawnOrUnsummon(28000);
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
// Despawn the NPC automatically after 28 seconds
|
||||
me->DespawnOrUnsummon(28000);
|
||||
|
||||
if (instance)
|
||||
me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me);
|
||||
|
||||
DoCast(me, SPELL_TWILIGHT_TORMENT_VESP_ACO);
|
||||
}
|
||||
DoCast(me, SPELL_TWILIGHT_TORMENT_VESP_ACO);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP_ACO);
|
||||
|
||||
// remove twilight torment on Vesperon
|
||||
if (instance)
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
{
|
||||
me->RemoveAurasDueToSpell(SPELL_TWILIGHT_TORMENT_VESP_ACO);
|
||||
|
||||
// remove twilight torment on Vesperon
|
||||
if (Creature* vesperon = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_VESPERON)))
|
||||
{
|
||||
instance->SetBossState(DATA_PORTAL_OPEN, NOT_STARTED);
|
||||
@@ -842,24 +767,23 @@ public:
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(57935);
|
||||
instance->DoRemoveAurasDueToSpellOnPlayers(58835); // Components of spell Twilight Torment
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 /*diff*/) OVERRIDE
|
||||
void UpdateAI(uint32 /*diff*/) OVERRIDE
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
private:
|
||||
InstanceScript* instance;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
if (!UpdateVictim())
|
||||
return;
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
return GetObsidianSanctumAI<npc_acolyte_of_vesperonAI>(creature);
|
||||
}
|
||||
|
||||
private:
|
||||
InstanceScript* instance;
|
||||
};
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new npc_acolyte_of_vesperonAI(creature);
|
||||
}
|
||||
};
|
||||
|
||||
/*######
|
||||
@@ -886,8 +810,7 @@ public:
|
||||
|
||||
void Reset() OVERRIDE
|
||||
{
|
||||
if (instance)
|
||||
me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me);
|
||||
me->AddAura(SPELL_TWILIGHT_SHIFT_ENTER, me);
|
||||
|
||||
events.ScheduleEvent(EVENT_TWILIGHT_EGGS, 20000);
|
||||
}
|
||||
@@ -928,7 +851,7 @@ public:
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const OVERRIDE
|
||||
{
|
||||
return new npc_twilight_eggsAI(creature);
|
||||
return GetObsidianSanctumAI<npc_twilight_eggsAI>(creature);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef DEF_OBSIDIAN_SANCTUM_H
|
||||
#define DEF_OBSIDIAN_SANCTUM_H
|
||||
#ifndef OBSIDIAN_SANCTUM_H_
|
||||
#define OBSIDIAN_SANCTUM_H_
|
||||
|
||||
#define OSScriptName "instance_obsidian_sanctum"
|
||||
|
||||
@@ -45,4 +45,10 @@ enum GameObjectIds
|
||||
GO_TWILIGHT_PORTAL = 193988
|
||||
};
|
||||
|
||||
#endif
|
||||
template<class AI>
|
||||
AI* GetObsidianSanctumAI(Creature* creature)
|
||||
{
|
||||
return GetInstanceAI<AI>(creature, OSScriptName);
|
||||
}
|
||||
|
||||
#endif // OBSIDIAN_SANCTUM_H_
|
||||
|
||||
@@ -480,9 +480,7 @@ class spell_devourer_of_souls_mirrored_soul_target_selector : public SpellScript
|
||||
class achievement_three_faced : public AchievementCriteriaScript
|
||||
{
|
||||
public:
|
||||
achievement_three_faced() : AchievementCriteriaScript("achievement_three_faced")
|
||||
{
|
||||
}
|
||||
achievement_three_faced() : AchievementCriteriaScript("achievement_three_faced") { }
|
||||
|
||||
bool OnCheck(Player* /*player*/, Unit* target) OVERRIDE
|
||||
{
|
||||
|
||||
@@ -184,9 +184,10 @@ public:
|
||||
instance->SetData(DATA_SLAD_RAN_EVENT, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void JustSummoned(Creature* summoned) OVERRIDE
|
||||
|
||||
@@ -116,9 +116,10 @@ public:
|
||||
instance->SetData(DATA_KERISTRASZA_EVENT, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
bool CheckContainmentSpheres(bool remove_prison = false)
|
||||
|
||||
@@ -138,9 +138,10 @@ public:
|
||||
instance->SetData(DATA_MAGUS_TELESTRA_EVENT, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void DoAction(int32 action) OVERRIDE
|
||||
|
||||
@@ -106,9 +106,10 @@ public:
|
||||
instance->SetData(DATA_ORMOROK_EVENT, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 diff) OVERRIDE
|
||||
|
||||
@@ -99,9 +99,10 @@ class boss_eregos : public CreatureScript
|
||||
DoAction(ACTION_SET_NORMAL_EVENTS);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE
|
||||
|
||||
@@ -137,9 +137,10 @@ public:
|
||||
instance->SetBossState(DATA_IONAR, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void SpellHit(Unit* /*caster*/, const SpellInfo* spell) OVERRIDE
|
||||
|
||||
@@ -124,9 +124,10 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void UpdateAI(uint32 uiDiff) OVERRIDE
|
||||
|
||||
@@ -154,9 +154,10 @@ public:
|
||||
instance->SetBossState(DATA_VOLKHAN, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void DespawnGolem()
|
||||
|
||||
@@ -193,9 +193,10 @@ public:
|
||||
//Talk(SAY_DEATH);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_SLAY);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_SLAY);
|
||||
}
|
||||
|
||||
void DoAction(int32 actionId) OVERRIDE
|
||||
|
||||
@@ -415,9 +415,10 @@ public:
|
||||
instance->SetBossState(DATA_SKADI_THE_RUTHLESS, DONE);
|
||||
}
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void SpawnMobs()
|
||||
|
||||
@@ -116,11 +116,10 @@ class npc_millhouse_manastorm : public CreatureScript
|
||||
}
|
||||
}
|
||||
|
||||
void EnterCombat(Unit* /*who*/) OVERRIDE { }
|
||||
|
||||
void KilledUnit(Unit* /*victim*/) OVERRIDE
|
||||
void KilledUnit(Unit* who) OVERRIDE
|
||||
{
|
||||
Talk(SAY_KILL);
|
||||
if (who->GetTypeId() == TYPEID_PLAYER)
|
||||
Talk(SAY_KILL);
|
||||
}
|
||||
|
||||
void JustDied(Unit* /*killer*/) OVERRIDE
|
||||
|
||||
@@ -32,11 +32,11 @@ enum DataTypes
|
||||
|
||||
// Additional Data
|
||||
DATA_CONVERSATION = 4,
|
||||
DATA_WARDEN_1 = 5, // used by EventAI
|
||||
DATA_WARDEN_2 = 6, // used by EventAI
|
||||
DATA_WARDEN_3 = 7, // used by EventAI
|
||||
DATA_WARDEN_4 = 8, // used by EventAI
|
||||
DATA_WARDEN_5 = 9, // used by EventAI
|
||||
DATA_WARDEN_1 = 5, // used by SmartAI
|
||||
DATA_WARDEN_2 = 6, // used by SmartAI
|
||||
DATA_WARDEN_3 = 7, // used by SmartAI
|
||||
DATA_WARDEN_4 = 8, // used by SmartAI
|
||||
DATA_WARDEN_5 = 9, // used by SmartAI
|
||||
DATA_MELLICHAR = 10,
|
||||
DATA_WARDENS_SHIELD = 11
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user