Fix Script AQ40/C'Thun.

Fixes issue #587.
Thanks kb_z for original patch.

Still some visual effect not working.

--HG--
branch : trunk
This commit is contained in:
Trazom62
2010-02-03 21:32:08 +01:00
parent 1cda3dcb5f
commit 000876b2f4
@@ -23,66 +23,129 @@ EndScriptData */
#include "ScriptedPch.h"
#include "temple_of_ahnqiraj.h"
#include "SpellId.h"
//Text emote
#define EMOTE_WEAKENED -1531011
/*
* This is a 2 phases events. Here follows an explanation of the main events and transition between phases and sub-phases.
*
* The first phase is the EYE phase: the Eye of C'Thun is active and C'thun is not active.
* During this phase, the "Eye of C'Thun" alternates between 2 sub-phases:
* - PHASE_EYE_GREEN_BEAM:
* 50 sec phase during which the Eye mainly casts its Green Beam every 3 sec.
* - PHASE_EYE_RED_BEAM:
* 35 sec phase during which the Eye casts its red beam every sec.
* This EYE phase ends when the "Eye of C'Thun" is killed. Then starts the CTHUN phase.
*
* The second phase is the CTHUN phase. The Eye of C'Thun is not active and C'Thun is active.
* This phase starts with the transformation of the Eye into C'Thun (PHASE_CTHUN_TRANSITION).
* After the transformation, C'Thun alternates between 2 sub-phases:
* - PHASE_CTHUN_STOMACH:
* - C'Thun is almost insensible to all damage (99% damage reduction).
* - It spawns 2 tentacles in its stomach.
* - C'Thun swallows players.
* - This sub-phase ends when the 2 tentacles are killed. Swallowed players are regurgitate.
*
* - PHASE_CTHUN_WEAK:
* - weakened C'Thun takes normal damage.
* - This sub-phase ends after 45 secs.
*
* This CTHUN phase ends when C'Thun is killed
*
* Note:
* - the current phase is stored in the instance data to be easily shared between the eye and cthun.
*/
#define PI 3.14
//****** Out of Combat ******
//Random Wispers - No txt only sound
#define RANDOM_SOUND_WHISPER 8663
enum Phases
{
PHASE_NOT_STARTED = 0,
//***** Phase 1 ********
// Main Phase 1 - EYE
PHASE_EYE_GREEN_BEAM = 1,
PHASE_EYE_RED_BEAM = 2,
//Mobs
#define BOSS_EYE_OF_CTHUN 15589
#define MOB_CLAW_TENTACLE 15725
#define MOB_EYE_TENTACLE 15726
#define MOB_SMALL_PORTAL 15904
// Main Phase 2 - CTHUN
PHASE_CTHUN_TRANSITION = 3,
PHASE_CTHUN_STOMACH = 4,
PHASE_CTHUN_WEAK = 5,
PHASE_CTHUN_DONE = 6,
};
enum Creatures
{
MOB_CTHUN_PORTAL = 15896,
//***** Main Phase 1 ********
BOSS_EYE_OF_CTHUN = 15589,
MOB_CLAW_TENTACLE = 15725,
MOB_EYE_TENTACLE = 15726,
MOB_SMALL_PORTAL = 15904,
//***** Main Phase 2 ********
MOB_BODY_OF_CTHUN = 15809,
MOB_GIANT_CLAW_TENTACLE = 15728,
MOB_GIANT_EYE_TENTACLE = 15334,
MOB_FLESH_TENTACLE = 15802,
MOB_GIANT_PORTAL = 15910,
};
enum Spells
{
//***** Main Phase 1 ********
//Eye Spells
#define SPELL_GREEN_BEAM 26134
#define SPELL_DARK_GLARE 26029
#define SPELL_RED_COLORATION 22518 //Probably not the right spell but looks similar
SPELL_FREEZE_ANIM = SPELL_FREEZE_ANIM_16245,
SPELL_GREEN_BEAM = SPELL_EYE_BEAM_26134,
SPELL_DARK_GLARE = SPELL_DARK_GLARE_26029,
SPELL_RED_COLORATION = SPELL_GLOWY_RED_22518, //Probably not the right spell but looks similar
//Eye Tentacles Spells
#define SPELL_MIND_FLAY 26143
SPELL_MIND_FLAY = SPELL_MIND_FLAY_26143,
//Claw Tentacles Spells
#define SPELL_GROUND_RUPTURE 26139
#define SPELL_HAMSTRING 26141
SPELL_GROUND_RUPTURE = SPELL_GROUND_RUPTURE_26139,
SPELL_HAMSTRING = SPELL_HAMSTRING_26141,
#define MOB_
//*****Phase 2******
//***** Main Phase 2 ******
//Body spells
//#define SPELL_CARAPACE_CTHUN 26156 //Was removed from client dbcs
#define SPELL_TRANSFORM 26232
SPELL_TRANSFORM = SPELL_TRANSFORM_CTHUN___PHASE_2_26232,
SPELL_PURPLE_COLORATION = SPELL_GLOWY_PURPLE_22581, //Probably not the right spell but looks similar
//Eye Tentacles Spells
//SAME AS PHASE1
//Giant Claw Tentacles
#define SPELL_MASSIVE_GROUND_RUPTURE 26100
SPELL_MASSIVE_GROUND_RUPTURE = SPELL_GROUND_RUPTURE_26100,
//Also casts Hamstring
#define SPELL_THRASH 3391
SPELL_THRASH = SPELL_THRASH_3391,
//Giant Eye Tentacles
//CHAIN CASTS "SPELL_GREEN_BEAM"
//Stomach Spells
#define SPELL_MOUTH_TENTACLE 26332
#define SPELL_EXIT_STOMACH_KNOCKBACK 25383
#define SPELL_DIGESTIVE_ACID 26476
SPELL_MOUTH_TENTACLE = SPELL_SUMMON_MOUTH_TENTACLE_26332,
SPELL_EXIT_STOMACH_KNOCKBACK = SPELL_SPIT_OUT_25383,
SPELL_DIGESTIVE_ACID = SPELL_DIGESTIVE_ACID_26476,
};
//Mobs
#define MOB_BODY_OF_CTHUN 15809
#define MOB_GIANT_CLAW_TENTACLE 15728
#define MOB_GIANT_EYE_TENTACLE 15334
#define MOB_FLESH_TENTACLE 15802
#define MOB_GIANT_PORTAL 15910
enum Actions
{
ACTION_FLESH_TENTACLE_KILLED = 1,
};
enum Yells
{
//Text emote
EMOTE_WEAKENED = -1531011,
//****** Out of Combat ******
// Random Wispers - No txt only sound
// The random sound is chosen by the client.
RANDOM_SOUND_WHISPER = 8663,
};
//Stomach Teleport positions
#define STOMACH_X -8562.0f
@@ -91,49 +154,14 @@ EndScriptData */
#define STOMACH_O 5.05f
//Flesh tentacle positions
#define TENTACLE_POS1_X -8571.0f
#define TENTACLE_POS1_Y 1990.0f
#define TENTACLE_POS1_Z -98.0f
#define TENTACLE_POS1_O 1.22f
#define TENTACLE_POS2_X -8525.0f
#define TENTACLE_POS2_Y 1994.0f
#define TENTACLE_POS2_Z -98.0f
#define TENTACLE_POS2_O 2.12f
const Position FleshTentaclePos[2] =
{
{ -8571.0f, 1990.0f, -98.0f, 1.22f},
{ -8525.0f, 1994.0f, -98.0f, 2.12f},
};
//Kick out position
#define KICK_X -8545.0f
#define KICK_Y 1984.0f
#define KICK_Z -96.0f
struct TRINITY_DLL_DECL flesh_tentacleAI : public ScriptedAI
{
flesh_tentacleAI(Creature *c) : ScriptedAI(c), Parent(0)
{
SetCombatMovement(false);
}
uint64 Parent;
uint32 CheckTimer;
void SpawnedByCthun(uint64 p)
{
Parent = p;
}
void Reset()
{
CheckTimer = 1000;
}
void EnterCombat(Unit *who)
{
}
void UpdateAI(const uint32 diff);
void JustDied(Unit* killer);
};
const Position KickPos = { -8545.0f, 1984.0f, -96.0f};
struct TRINITY_DLL_DECL eye_of_cthunAI : public Scripted_NoMovementAI
{
@@ -168,7 +196,7 @@ struct TRINITY_DLL_DECL eye_of_cthunAI : public Scripted_NoMovementAI
//Eye beam phase 50 seconds
BeamTimer = 3000;
EyeTentacleTimer = 45000; //Always spawns 5 seconds before Dark Beam
ClawTentacleTimer = 12500; //4 per Eye beam phase (unsure if they spawn durring Dark beam)
ClawTentacleTimer = 12500; //4 per Eye beam phase (unsure if they spawn during Dark beam)
//Dark Beam phase 35 seconds (each tick = 1 second, 35 ticks)
DarkGlareTick = 0;
@@ -178,22 +206,32 @@ struct TRINITY_DLL_DECL eye_of_cthunAI : public Scripted_NoMovementAI
//Reset flags
m_creature->RemoveAurasDueToSpell(SPELL_RED_COLORATION);
m_creature->RemoveAurasDueToSpell(SPELL_FREEZE_ANIM);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
m_creature->SetVisibility(VISIBILITY_ON);
//Reset Phase
if (pInst)
pInst->SetData(DATA_CTHUN_PHASE, 0);
pInst->SetData(DATA_CTHUN_PHASE, PHASE_NOT_STARTED);
//to avoid having a following void zone
Creature* pPortal= m_creature->FindNearestCreature(MOB_CTHUN_PORTAL, 10);
if (pPortal)
pPortal->SetReactState(REACT_PASSIVE);
}
void EnterCombat(Unit *who)
{
DoZoneInCombat();
if (pInst)
pInst->SetData(DATA_CTHUN_PHASE, PHASE_EYE_GREEN_BEAM);
}
void SpawnEyeTentacle(float x, float y)
{
if (Creature* Spawned = me->SummonCreature(MOB_EYE_TENTACLE,m_creature->GetPositionX()+x,m_creature->GetPositionY()+y,m_creature->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,500))
if (Creature* Spawned = DoSpawnCreature(MOB_EYE_TENTACLE, x, y, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 500))
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
if (Spawned->AI())
Spawned->AI()->AttackStart(pTarget);
}
@@ -207,17 +245,35 @@ struct TRINITY_DLL_DECL eye_of_cthunAI : public Scripted_NoMovementAI
if (!pInst)
return;
switch (pInst->GetData(DATA_CTHUN_PHASE))
uint32 currentPhase = pInst->GetData(DATA_CTHUN_PHASE);
if (currentPhase == PHASE_EYE_GREEN_BEAM || currentPhase == PHASE_EYE_RED_BEAM)
{
case 0:
// EyeTentacleTimer
if (EyeTentacleTimer <= diff)
{
//Spawn the 8 Eye Tentacles in the corret spots
SpawnEyeTentacle(0, 20); //south
SpawnEyeTentacle(10, 10); //south west
SpawnEyeTentacle(20, 0); //west
SpawnEyeTentacle(10, -10); //north west
SpawnEyeTentacle(0, -20); //north
SpawnEyeTentacle(-10, -10); //north east
SpawnEyeTentacle(-20, 0); // east
SpawnEyeTentacle(-10, 10); // south east
EyeTentacleTimer = 45000;
} else EyeTentacleTimer -= diff;
}
switch (currentPhase)
{
case PHASE_EYE_GREEN_BEAM:
//BeamTimer
if (BeamTimer <= diff)
{
//SPELL_GREEN_BEAM
Unit *pTarget = NULL;
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
if (pTarget)
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
{
m_creature->InterruptNonMeleeSpells(false);
DoCast(pTarget, SPELL_GREEN_BEAM);
@@ -233,16 +289,14 @@ struct TRINITY_DLL_DECL eye_of_cthunAI : public Scripted_NoMovementAI
//ClawTentacleTimer
if (ClawTentacleTimer <= diff)
{
Unit *pTarget = NULL;
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
if (pTarget)
if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
{
Creature* Spawned = NULL;
//Spawn claw tentacle on the random target
Spawned = me->SummonCreature(MOB_CLAW_TENTACLE,pTarget->GetPositionX(),pTarget->GetPositionY(),pTarget->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,500);
Spawned = me->SummonCreature(MOB_CLAW_TENTACLE, *pTarget, TEMPSUMMON_CORPSE_DESPAWN, 500);
if (Spawned)
if (Spawned && Spawned->AI())
Spawned->AI()->AttackStart(pTarget);
}
@@ -250,69 +304,46 @@ struct TRINITY_DLL_DECL eye_of_cthunAI : public Scripted_NoMovementAI
ClawTentacleTimer = 12500;
} else ClawTentacleTimer -= diff;
//EyeTentacleTimer
if (EyeTentacleTimer <= diff)
{
//Spawn the 8 Eye Tentacles in the corret spots
SpawnEyeTentacle(0, 20); //south
SpawnEyeTentacle(10, 10); //south west
SpawnEyeTentacle(20, 0); //west
SpawnEyeTentacle(10, -10); //north west
SpawnEyeTentacle(0, -20); //north
SpawnEyeTentacle(-10, -10); //north east
SpawnEyeTentacle(-20, 0); // east
SpawnEyeTentacle(-10, 10); // south east
//No point actually putting a timer here since
//These shouldn't trigger agian until after phase shifts
EyeTentacleTimer = 45000;
} else EyeTentacleTimer -= diff;
//PhaseTimer
if (PhaseTimer <= diff)
{
//Switch to Dark Beam
pInst->SetData(DATA_CTHUN_PHASE, 1);
pInst->SetData(DATA_CTHUN_PHASE, PHASE_EYE_RED_BEAM);
m_creature->InterruptNonMeleeSpells(false);
m_creature->SetReactState(REACT_PASSIVE);
//Remove any target
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0);
//Select random target for dark beam to start on
Unit *pTarget = NULL;
pTarget = SelectUnit(SELECT_TARGET_RANDOM,0);
if (pTarget)
if (Unit *pTarget = SelectUnit(SELECT_TARGET_RANDOM,0))
{
//Correctly update our target
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, pTarget->GetGUID());
//Face our target
DarkGlareAngle = m_creature->GetAngle(pTarget);
DarkGlareTickTimer = 1000;
DarkGlareTick = 0;
ClockWise = rand()%2;
ClockWise = RAND(true, false);
}
//Add red coloration to C'thun
DoCast(m_creature, SPELL_RED_COLORATION);
DoCast(m_creature, SPELL_RED_COLORATION, true);
//Freeze animation
DoCast(m_creature, SPELL_FREEZE_ANIM);
m_creature->SetOrientation(DarkGlareAngle);
m_creature->StopMoving();
//Darkbeam for 35 seconds
PhaseTimer = 35000;
} else PhaseTimer -= diff;
}
break;
case 1:
{
//EyeTentacleTimer
case PHASE_EYE_RED_BEAM:
if (DarkGlareTick < 35)
if (DarkGlareTickTimer <= diff)
{
//Remove any target
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0);
//Set angle and cast
if (ClockWise)
m_creature->SetOrientation(DarkGlareAngle + ((float)DarkGlareTick*PI/35));
@@ -335,39 +366,42 @@ struct TRINITY_DLL_DECL eye_of_cthunAI : public Scripted_NoMovementAI
if (PhaseTimer <= diff)
{
//Switch to Eye Beam
pInst->SetData(DATA_CTHUN_PHASE, 0);
pInst->SetData(DATA_CTHUN_PHASE, PHASE_EYE_GREEN_BEAM);
BeamTimer = 3000;
EyeTentacleTimer = 45000; //Always spawns 5 seconds before Dark Beam
ClawTentacleTimer = 12500; //4 per Eye beam phase (unsure if they spawn durring Dark beam)
ClawTentacleTimer = 12500; //4 per Eye beam phase (unsure if they spawn during Dark beam)
m_creature->InterruptNonMeleeSpells(false);
//Remove Red coloration from c'thun
m_creature->RemoveAurasDueToSpell(SPELL_RED_COLORATION);
m_creature->RemoveAurasDueToSpell(SPELL_FREEZE_ANIM);
//Freeze animation
m_creature->SetUInt32Value(UNIT_FIELD_FLAGS, 0);
//set it back to aggressive
m_creature->SetReactState(REACT_AGGRESSIVE);
//Eye Beam for 50 seconds
PhaseTimer = 50000;
} else PhaseTimer -= diff;
}
break;
//Transition phase
case 2:
{
case PHASE_CTHUN_TRANSITION:
//Remove any target
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0);
m_creature->SetHealth(0);
}
m_creature->SetVisibility(VISIBILITY_OFF);
break;
//Dead phase
case 5:
{
m_creature->Kill(m_creature);
}
case PHASE_CTHUN_DONE:
Creature* pPortal= m_creature->FindNearestCreature(MOB_CTHUN_PORTAL, 10);
if (pPortal)
pPortal->ForcedDespawn();
m_creature->ForcedDespawn();
break;
}
}
@@ -379,9 +413,8 @@ struct TRINITY_DLL_DECL eye_of_cthunAI : public Scripted_NoMovementAI
switch (pInst->GetData(DATA_CTHUN_PHASE))
{
case 0:
case 1:
{
case PHASE_EYE_GREEN_BEAM:
case PHASE_EYE_RED_BEAM:
//Only if it will kill
if (damage < m_creature->GetHealth())
return;
@@ -399,36 +432,30 @@ struct TRINITY_DLL_DECL eye_of_cthunAI : public Scripted_NoMovementAI
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0);
//Death animation/respawning;
pInst->SetData(DATA_CTHUN_PHASE, 2);
pInst->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_TRANSITION);
m_creature->SetHealth(0);
damage = 0;
m_creature->InterruptNonMeleeSpells(true);
m_creature->RemoveAllAuras();
}
break;
case 5:
{
case PHASE_CTHUN_DONE:
//Allow death here
return;
}
default:
{
//Prevent death in this phase
//Prevent death in these phases
damage = 0;
return;
}
break;
}
}
};
struct TRINITY_DLL_DECL cthunAI : public ScriptedAI
struct TRINITY_DLL_DECL cthunAI : public Scripted_NoMovementAI
{
cthunAI(Creature *c) : ScriptedAI(c)
cthunAI(Creature *c) : Scripted_NoMovementAI(c)
{
SetCombatMovement(false);
@@ -490,9 +517,10 @@ struct TRINITY_DLL_DECL cthunAI : public ScriptedAI
//Reset flags
m_creature->RemoveAurasDueToSpell(SPELL_TRANSFORM);
m_creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
m_creature->SetVisibility(VISIBILITY_OFF);
if (pInst)
pInst->SetData(DATA_CTHUN_PHASE, 0);
pInst->SetData(DATA_CTHUN_PHASE, PHASE_NOT_STARTED);
}
void EnterCombat(Unit *who)
@@ -503,17 +531,11 @@ struct TRINITY_DLL_DECL cthunAI : public ScriptedAI
void SpawnEyeTentacle(float x, float y)
{
Creature* Spawned;
Spawned = me->SummonCreature(MOB_EYE_TENTACLE,m_creature->GetPositionX()+x,m_creature->GetPositionY()+y,m_creature->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,500);
if (Spawned)
{
Unit *pTarget;
pTarget = SelectRandomNotStomach();
if (pTarget)
Spawned = DoSpawnCreature(MOB_EYE_TENTACLE, x, y, 0, 0, TEMPSUMMON_CORPSE_DESPAWN, 500);
if (Spawned && Spawned->AI())
if (Unit *pTarget = SelectRandomNotStomach())
Spawned->AI()->AttackStart(pTarget);
}
}
Unit* SelectRandomNotStomach()
{
@@ -587,22 +609,43 @@ struct TRINITY_DLL_DECL cthunAI : public ScriptedAI
if (!pInst)
return;
switch (pInst->GetData(DATA_CTHUN_PHASE))
uint32 currentPhase = pInst->GetData(DATA_CTHUN_PHASE);
if (currentPhase == PHASE_CTHUN_STOMACH || currentPhase == PHASE_CTHUN_WEAK)
{
// EyeTentacleTimer
if (EyeTentacleTimer <= diff)
{
//Spawn the 8 Eye Tentacles in the corret spots
SpawnEyeTentacle(0, 20); //south
SpawnEyeTentacle(10, 10); //south west
SpawnEyeTentacle(20, 0); //west
SpawnEyeTentacle(10, -10); //north west
SpawnEyeTentacle(0, -20); //north
SpawnEyeTentacle(-10, -10); //north east
SpawnEyeTentacle(-20, 0); // east
SpawnEyeTentacle(-10, 10); // south east
EyeTentacleTimer = 30000; // every 30sec in phase 2
} else EyeTentacleTimer -= diff;
}
switch (currentPhase)
{
//Transition phase
case 2:
{
case PHASE_CTHUN_TRANSITION:
//PhaseTimer
if (PhaseTimer <= diff)
{
//Switch
pInst->SetData(DATA_CTHUN_PHASE, 3);
pInst->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_STOMACH);
//Switch to c'thun model
m_creature->InterruptNonMeleeSpells(false);
DoCast(m_creature, SPELL_TRANSFORM, false);
m_creature->SetHealth(m_creature->GetMaxHealth());
m_creature->SetVisibility(VISIBILITY_ON);
m_creature->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE | UNIT_FLAG_NON_ATTACKABLE);
//Emerging phase
@@ -622,45 +665,33 @@ struct TRINITY_DLL_DECL cthunAI : public ScriptedAI
//Spawn 2 flesh tentacles
FleshTentaclesKilled = 0;
Creature* Spawned;
//Spawn flesh tentacle
Spawned = me->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS1_X, TENTACLE_POS1_Y, TENTACLE_POS1_Z, TENTACLE_POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0);
if (!Spawned)
for (uint8 i = 0; i < 2; i++)
{
Creature* spawned = me->SummonCreature(MOB_FLESH_TENTACLE, FleshTentaclePos[i], TEMPSUMMON_CORPSE_DESPAWN);
if (!spawned)
++FleshTentaclesKilled;
else
CAST_AI(flesh_tentacleAI, (Spawned->AI()))->SpawnedByCthun(m_creature->GetGUID());
//Spawn flesh tentacle
Spawned = me->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS2_X, TENTACLE_POS2_Y, TENTACLE_POS2_Z, TENTACLE_POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0);
if (!Spawned)
++FleshTentaclesKilled;
else
CAST_AI(flesh_tentacleAI, (Spawned->AI()))->SpawnedByCthun(m_creature->GetGUID());
}
PhaseTimer = 0;
} else PhaseTimer -= diff;
}
break;
//Body Phase
case 3:
{
case PHASE_CTHUN_STOMACH:
//Remove Target field
m_creature->SetUInt64Value(UNIT_FIELD_TARGET, 0);
//Weaken
if (FleshTentaclesKilled > 1)
{
pInst->SetData(DATA_CTHUN_PHASE, 4);
pInst->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_WEAK);
DoScriptText(EMOTE_WEAKENED, m_creature);
PhaseTimer = 45000;
DoCast(m_creature, SPELL_RED_COLORATION, true);
DoCast(m_creature, SPELL_PURPLE_COLORATION, true);
UNORDERED_MAP<uint64, bool>::iterator i = Stomach_Map.begin();
@@ -708,7 +739,7 @@ struct TRINITY_DLL_DECL cthunAI : public ScriptedAI
DoCast(pUnit, SPELL_DIGESTIVE_ACID, true);
//Check if player should be kicked from stomach
if (pUnit->IsWithinDist3d(KICK_X, KICK_Y, KICK_Z, 15.0f))
if (pUnit->IsWithinDist3d(&KickPos, 15.0f))
{
//Teleport each player out
DoTeleportPlayer(pUnit, m_creature->GetPositionX(), m_creature->GetPositionY(), m_creature->GetPositionZ()+10, rand()%6);
@@ -731,10 +762,7 @@ struct TRINITY_DLL_DECL cthunAI : public ScriptedAI
//Stomach Enter Timer
if (StomachEnterTimer <= diff)
{
Unit *pTarget = NULL;
pTarget = SelectRandomNotStomach();
if (pTarget)
if (Unit *pTarget = SelectRandomNotStomach())
{
//Set target in stomach
Stomach_Map[pTarget->GetGUID()] = true;
@@ -765,17 +793,12 @@ struct TRINITY_DLL_DECL cthunAI : public ScriptedAI
//GientClawTentacleTimer
if (GiantClawTentacleTimer <= diff)
{
Unit *pTarget = NULL;
pTarget = SelectRandomNotStomach();
if (pTarget)
if (Unit *pTarget = SelectRandomNotStomach())
{
Creature* Spawned = NULL;
//Spawn claw tentacle on the random target
Spawned = me->SummonCreature(MOB_GIANT_CLAW_TENTACLE,pTarget->GetPositionX(),pTarget->GetPositionY(),pTarget->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,500);
if (Spawned)
Spawned->AI()->AttackStart(pTarget);
if (Creature* spawned = me->SummonCreature(MOB_GIANT_CLAW_TENTACLE, *pTarget, TEMPSUMMON_CORPSE_DESPAWN, 500))
if (spawned->AI())
spawned->AI()->AttackStart(pTarget);
}
//One giant claw tentacle every minute
@@ -785,89 +808,53 @@ struct TRINITY_DLL_DECL cthunAI : public ScriptedAI
//GiantEyeTentacleTimer
if (GiantEyeTentacleTimer <= diff)
{
Unit *pTarget = NULL;
pTarget = SelectRandomNotStomach();
if (pTarget)
if (Unit *pTarget = SelectRandomNotStomach())
{
Creature* Spawned = NULL;
//Spawn claw tentacle on the random target
Spawned = me->SummonCreature(MOB_GIANT_EYE_TENTACLE,pTarget->GetPositionX(),pTarget->GetPositionY(),pTarget->GetPositionZ(),0,TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT,500);
if (Spawned)
Spawned->AI()->AttackStart(pTarget);
if (Creature* spawned = me->SummonCreature(MOB_GIANT_EYE_TENTACLE, *pTarget, TEMPSUMMON_CORPSE_DESPAWN, 500))
if (spawned->AI())
spawned->AI()->AttackStart(pTarget);
}
//One giant eye tentacle every minute
GiantEyeTentacleTimer = 60000;
} else GiantEyeTentacleTimer -= diff;
//EyeTentacleTimer
if (EyeTentacleTimer <= diff)
{
//Spawn the 8 Eye Tentacles in the corret spots
SpawnEyeTentacle(0, 25); //south
SpawnEyeTentacle(12, 12); //south west
SpawnEyeTentacle(25, 0); //west
SpawnEyeTentacle(12, -12); //north west
SpawnEyeTentacle(0, -25); //north
SpawnEyeTentacle(-12, -12); //north east
SpawnEyeTentacle(-25, 0); // east
SpawnEyeTentacle(-12, 12); // south east
//These spawn at every 30 seconds
EyeTentacleTimer = 30000;
} else EyeTentacleTimer -= diff;
}
break;
//Weakened state
case 4:
{
case PHASE_CTHUN_WEAK:
//PhaseTimer
if (PhaseTimer <= diff)
{
//Switch
pInst->SetData(DATA_CTHUN_PHASE, 3);
pInst->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_STOMACH);
//Remove red coloration
m_creature->RemoveAurasDueToSpell(SPELL_RED_COLORATION);
//Remove purple coloration
m_creature->RemoveAurasDueToSpell(SPELL_PURPLE_COLORATION);
//Spawn 2 flesh tentacles
FleshTentaclesKilled = 0;
Creature* Spawned;
//Spawn flesh tentacle
Spawned = me->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS1_X, TENTACLE_POS1_Y, TENTACLE_POS1_Z, TENTACLE_POS1_O, TEMPSUMMON_CORPSE_DESPAWN, 0);
if (!Spawned)
for (uint8 i = 0; i < 2; i++)
{
Creature* spawned = me->SummonCreature(MOB_FLESH_TENTACLE, FleshTentaclePos[i], TEMPSUMMON_CORPSE_DESPAWN);
if (!spawned)
++FleshTentaclesKilled;
else
CAST_AI(flesh_tentacleAI, (Spawned->AI()))->SpawnedByCthun(m_creature->GetGUID());
//Spawn flesh tentacle
Spawned = me->SummonCreature(MOB_FLESH_TENTACLE, TENTACLE_POS2_X, TENTACLE_POS2_Y, TENTACLE_POS2_Z, TENTACLE_POS2_O, TEMPSUMMON_CORPSE_DESPAWN, 0);
if (!Spawned)
++FleshTentaclesKilled;
else
CAST_AI(flesh_tentacleAI, (Spawned->AI()))->SpawnedByCthun(m_creature->GetGUID());
}
PhaseTimer = 0;
} else PhaseTimer -= diff;
}
break;
}
}
void JustDied(Unit* pKiller)
{
//Switch
if (pInst)
pInst->SetData(DATA_CTHUN_PHASE, 5);
pInst->SetData(DATA_CTHUN_PHASE, PHASE_CTHUN_DONE);
}
void DamageTaken(Unit *done_by, uint32 &damage)
@@ -878,25 +865,21 @@ struct TRINITY_DLL_DECL cthunAI : public ScriptedAI
switch (pInst->GetData(DATA_CTHUN_PHASE))
{
case 3:
{
case PHASE_CTHUN_STOMACH:
//Not weakened so reduce damage by 99%
if (damage / 99 > 0) damage/= 99;
else damage = 1;
damage /= 100;
if (damage == 0)
damage = 1;
//Prevent death in non-weakened state
if (damage >= m_creature->GetHealth())
damage = 0;
return;
}
break;
case 4:
{
case PHASE_CTHUN_WEAK:
//Weakened - takes normal damage
return;
}
default:
damage = 0;
@@ -904,21 +887,27 @@ struct TRINITY_DLL_DECL cthunAI : public ScriptedAI
}
}
void FleshTentcleKilled()
void DoAction(const int32 param)
{
switch(param)
{
case ACTION_FLESH_TENTACLE_KILLED:
++FleshTentaclesKilled;
break;
}
}
};
struct TRINITY_DLL_DECL eye_tentacleAI : public ScriptedAI
struct TRINITY_DLL_DECL eye_tentacleAI : public Scripted_NoMovementAI
{
eye_tentacleAI(Creature *c) : ScriptedAI(c)
eye_tentacleAI(Creature *c) : Scripted_NoMovementAI(c)
{
SetCombatMovement(false);
if (Unit* pPortal = m_creature->SummonCreature(MOB_SMALL_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0))
if (Creature* pPortal = m_creature->SummonCreature(MOB_SMALL_PORTAL, *m_creature, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
Portal = pPortal->GetGUID();
}
}
uint32 MindflayTimer;
uint32 KillSelfTimer;
@@ -970,15 +959,18 @@ struct TRINITY_DLL_DECL eye_tentacleAI : public ScriptedAI
}
};
struct TRINITY_DLL_DECL claw_tentacleAI : public ScriptedAI
struct TRINITY_DLL_DECL claw_tentacleAI : public Scripted_NoMovementAI
{
claw_tentacleAI(Creature *c) : ScriptedAI(c)
claw_tentacleAI(Creature *c) : Scripted_NoMovementAI(c)
{
SetCombatMovement(false);
if (Unit* pPortal = m_creature->SummonCreature(MOB_SMALL_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0))
if (Creature* pPortal = m_creature->SummonCreature(MOB_SMALL_PORTAL, *m_creature, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
Portal = pPortal->GetGUID();
}
}
uint32 GroundRuptureTimer;
uint32 HamstringTimer;
@@ -1030,8 +1022,11 @@ struct TRINITY_DLL_DECL claw_tentacleAI : public ScriptedAI
if (!pTarget->HasAura(SPELL_DIGESTIVE_ACID))
{
m_creature->GetMap()->CreatureRelocation(m_creature, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0);
if (Unit* pPortal = m_creature->SummonCreature(MOB_SMALL_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0))
if (Creature* pPortal = m_creature->SummonCreature(MOB_SMALL_PORTAL, *m_creature, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
Portal = pPortal->GetGUID();
}
GroundRuptureTimer = 500;
HamstringTimer = 2000;
@@ -1060,15 +1055,18 @@ struct TRINITY_DLL_DECL claw_tentacleAI : public ScriptedAI
}
};
struct TRINITY_DLL_DECL giant_claw_tentacleAI : public ScriptedAI
struct TRINITY_DLL_DECL giant_claw_tentacleAI : public Scripted_NoMovementAI
{
giant_claw_tentacleAI(Creature *c) : ScriptedAI(c)
giant_claw_tentacleAI(Creature *c) : Scripted_NoMovementAI(c)
{
SetCombatMovement(false);
if (Unit* pPortal = m_creature->SummonCreature(MOB_GIANT_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0))
if (Creature* pPortal = m_creature->SummonCreature(MOB_GIANT_PORTAL, *m_creature, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
Portal = pPortal->GetGUID();
}
}
uint32 GroundRuptureTimer;
uint32 ThrashTimer;
@@ -1122,8 +1120,11 @@ struct TRINITY_DLL_DECL giant_claw_tentacleAI : public ScriptedAI
if (!pTarget->HasAura(SPELL_DIGESTIVE_ACID))
{
m_creature->GetMap()->CreatureRelocation(m_creature, pTarget->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ(), 0);
if (Unit* pPortal = m_creature->SummonCreature(MOB_GIANT_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0))
if (Creature* pPortal = m_creature->SummonCreature(MOB_GIANT_PORTAL, *m_creature, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
Portal = pPortal->GetGUID();
}
GroundRuptureTimer = 500;
HamstringTimer = 2000;
@@ -1161,15 +1162,18 @@ struct TRINITY_DLL_DECL giant_claw_tentacleAI : public ScriptedAI
}
};
struct TRINITY_DLL_DECL giant_eye_tentacleAI : public ScriptedAI
struct TRINITY_DLL_DECL giant_eye_tentacleAI : public Scripted_NoMovementAI
{
giant_eye_tentacleAI(Creature *c) : ScriptedAI(c)
giant_eye_tentacleAI(Creature *c) : Scripted_NoMovementAI(c)
{
SetCombatMovement(false);
if (Unit* pPortal = m_creature->SummonCreature(MOB_GIANT_PORTAL, 0.0f, 0.0f, 0.0f, 0.0f, TEMPSUMMON_CORPSE_DESPAWN, 0))
if (Creature* pPortal = m_creature->SummonCreature(MOB_GIANT_PORTAL, *m_creature, TEMPSUMMON_CORPSE_DESPAWN))
{
pPortal->SetReactState(REACT_PASSIVE);
Portal = pPortal->GetGUID();
}
}
uint32 BeamTimer;
uint64 Portal;
@@ -1210,45 +1214,21 @@ struct TRINITY_DLL_DECL giant_eye_tentacleAI : public ScriptedAI
}
};
//Flesh tentacle functions
void flesh_tentacleAI::UpdateAI(const uint32 diff)
struct TRINITY_DLL_DECL flesh_tentacleAI : public Scripted_NoMovementAI
{
//Check if we have a target
if (!UpdateVictim())
return;
if (Parent)
if (CheckTimer <= diff)
flesh_tentacleAI(Creature *c) : Scripted_NoMovementAI(c)
{
Unit* pUnit = Unit::GetUnit(*m_creature, Parent);
if (!pUnit || !pUnit->isAlive() || !pUnit->isInCombat())
{
Parent = 0;
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NONE, NULL, false);
return;
SetCombatMovement(false);
}
CheckTimer = 1000;
} else CheckTimer -= diff;
DoMeleeAttackIfReady();
}
void flesh_tentacleAI::JustDied(Unit* killer)
void JustDied(Unit* killer)
{
if (!Parent)
{
error_log("TSCR: flesh_tentacle: No Parent variable");
return;
}
Creature* Cthun = Unit::GetCreature(*m_creature, Parent);
if (Cthun)
CAST_AI(cthunAI, (Cthun->AI()))->FleshTentcleKilled();
else error_log("TSCR: flesh_tentacle: No Cthun");
if (CAST_SUM(m_creature))
if (Creature* pSummoner = CAST_CRE(CAST_SUM(m_creature)->GetSummoner()))
if (pSummoner->AI())
pSummoner->AI()->DoAction(ACTION_FLESH_TENTACLE_KILLED);
}
};
//GetAIs
CreatureAI* GetAI_eye_of_cthun(Creature* pCreature)
@@ -1326,4 +1306,3 @@ void AddSC_boss_cthun()
newscript->GetAI = &GetAI_flesh_tentacle;
newscript->RegisterSelf();
}