*Updated Onyxia script - original patch by Moandor

*Fix the crash in dark_portal script - by nofantasy
*Updated TideWalker script - now use proper spell for summons and for other abilites

--HG--
branch : trunk
This commit is contained in:
Blaymoira
2008-12-19 21:45:22 +01:00
parent 97b2c725df
commit cebaa3a703
4 changed files with 227 additions and 97 deletions

View File

@@ -22,8 +22,7 @@
#define C_TIME_KEEPER 17918
#define C_RKEEP 21104
#define C_RLORD 17839
//#define RIFT_BOSS urand(0,1) ? C_RKEEP : C_RLORD
#define RIFT_BOSS C_RKEEP
#define RIFT_BOSS (rand()%2 ? C_RKEEP : C_RLORD)
#define C_DEJA 17879
#define C_TEMPO 17880
#define C_AEONUS 17881

View File

@@ -16,7 +16,7 @@
/* ScriptData
SDName: Boss_Fathomlord_Karathress
SD%Complete: 70%
SD%Complete: 70
SDComment: Cyclone workaround
SDCategory: Coilfang Resevoir, Serpent Shrine Cavern
EndScriptData */

View File

@@ -17,7 +17,7 @@
/* ScriptData
SDName: Boss_Morogrim_Tidewalker
SD%Complete: 90
SDComment: Water globules don't explode properly
SDComment: Water globules don't explode properly, remove hacks
SDCategory: Coilfang Resevoir, Serpent Shrine Cavern
EndScriptData */
@@ -55,6 +55,29 @@ EndScriptData */
#define WATERY_GRAVE_Y4 -690.96
#define WATERY_GRAVE_Z4 -14.44
#define SPELL_WATERY_GRAVE_1 38023
#define SPELL_WATERY_GRAVE_2 38024
#define SPELL_WATERY_GRAVE_3 38025
#define SPELL_WATERY_GRAVE_4 37850
#define SPELL_SUMMON_WATER_GLOBULE_1 37854
#define SPELL_SUMMON_WATER_GLOBULE_2 37858
#define SPELL_SUMMON_WATER_GLOBULE_3 37860
#define SPELL_SUMMON_WATER_GLOBULE_4 37861
#define SPELL_SUMMON_MURLOC_A6 39813
#define SPELL_SUMMON_MURLOC_A7 39814
#define SPELL_SUMMON_MURLOC_A8 39815
#define SPELL_SUMMON_MURLOC_A9 39816
#define SPELL_SUMMON_MURLOC_A10 39817
#define SPELL_SUMMON_MURLOC_B6 39818
#define SPELL_SUMMON_MURLOC_B7 39819
#define SPELL_SUMMON_MURLOC_B8 39820
#define SPELL_SUMMON_MURLOC_B9 39821
#define SPELL_SUMMON_MURLOC_B10 39822
//Creatures
#define WATER_GLOBULE 21913
#define TIDEWALKER_LURKER 21920
@@ -119,7 +142,18 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
void Aggro(Unit *who) { StartEvent(); }
void ApplyWateryGrave(Unit *player, uint8 pos)
void ApplyWateryGrave(Unit *player, uint8 target)
{
switch(target)
{
case 0: DoCast(player, SPELL_WATERY_GRAVE_1); break;
case 1: DoCast(player, SPELL_WATERY_GRAVE_2); break;
case 2: DoCast(player, SPELL_WATERY_GRAVE_3); break;
case 3: DoCast(player, SPELL_WATERY_GRAVE_4); break;
}
}
/*void ApplyWateryGrave(Unit *player, uint8 pos)
{
float x, y, z;
@@ -149,9 +183,9 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
DoTeleportPlayer(player, x, y, z+1, player->GetOrientation());
DoCast(player, SPELL_WATERY_GRAVE);
}
}*/
void SummonMurloc(float x, float y, float z)
/*void SummonMurloc(float x, float y, float z)
{
Creature *Summoned;
@@ -163,9 +197,9 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
if (target)
Summoned->AI()->AttackStart(target);
}
}
}*/
void SummonWaterGlobule(float x, float y, float z)
/*void SummonWaterGlobule(float x, float y, float z)
{
Creature *Globule;
@@ -177,7 +211,7 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
if (target)
Globule->AI()->AttackStart(target);
}
}
}*/
void UpdateAI(const uint32 diff)
{
@@ -202,7 +236,7 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
case 1: DoScriptText(SAY_SUMMON2, m_creature); break;
}
//north
/*//north
SummonMurloc(486.10, -723.64, -7.14);
SummonMurloc(482.58, -723.78, -7.14);
SummonMurloc(479.38, -723.91, -7.14);
@@ -216,8 +250,22 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
SummonMurloc(303.91, -725.64, -13.06);
SummonMurloc(300.23, -726, -11.89);
SummonMurloc(296.82, -726.33, -10.82);
SummonMurloc(293.64, -726.64, -9.81);
SummonMurloc(293.64, -726.64, -9.81);*/
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
DoCast(target, SPELL_SUMMON_MURLOC_A6);
DoCast(target, SPELL_SUMMON_MURLOC_A7);
DoCast(target, SPELL_SUMMON_MURLOC_A8);
DoCast(target, SPELL_SUMMON_MURLOC_A9);
DoCast(target, SPELL_SUMMON_MURLOC_A10);
DoCast(target, SPELL_SUMMON_MURLOC_B6);
DoCast(target, SPELL_SUMMON_MURLOC_B7);
DoCast(target, SPELL_SUMMON_MURLOC_B8);
DoCast(target, SPELL_SUMMON_MURLOC_B9);
DoCast(target, SPELL_SUMMON_MURLOC_B10);
}
DoScriptText(EMOTE_EARTHQUAKE, m_creature);
Earthquake = false;
@@ -265,13 +313,18 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
//WateryGlobules_Timer
if (WateryGlobules_Timer < diff)
{
SummonWaterGlobule(WATERY_GRAVE_X1, WATERY_GRAVE_Y1, WATERY_GRAVE_Z1);
/*SummonWaterGlobule(WATERY_GRAVE_X1, WATERY_GRAVE_Y1, WATERY_GRAVE_Z1);
SummonWaterGlobule(WATERY_GRAVE_X2, WATERY_GRAVE_Y2, WATERY_GRAVE_Z2);
SummonWaterGlobule(WATERY_GRAVE_X3, WATERY_GRAVE_Y3, WATERY_GRAVE_Z3);
SummonWaterGlobule(WATERY_GRAVE_X4, WATERY_GRAVE_Y4, WATERY_GRAVE_Z4);
SummonWaterGlobule(WATERY_GRAVE_X4, WATERY_GRAVE_Y4, WATERY_GRAVE_Z4);*/
if(Unit* target = SelectUnit(SELECT_TARGET_RANDOM, 0))
{
DoCast(target, SPELL_SUMMON_WATER_GLOBULE_1);
DoCast(target, SPELL_SUMMON_WATER_GLOBULE_2);
DoCast(target, SPELL_SUMMON_WATER_GLOBULE_3);
DoCast(target, SPELL_SUMMON_WATER_GLOBULE_4);
}
DoScriptText(EMOTE_WATERY_GLOBULES, m_creature);
WateryGlobules_Timer = 25000;
}else WateryGlobules_Timer -= diff;
}
@@ -281,6 +334,8 @@ struct TRINITY_DLL_DECL boss_morogrim_tidewalkerAI : public ScriptedAI
};
//Water Globule AI
#define SPELL_GLOBULE_EXPLOSION 37852
struct TRINITY_DLL_DECL mob_water_globuleAI : public ScriptedAI
{
mob_water_globuleAI(Creature *c) : ScriptedAI(c) {Reset();}
@@ -321,8 +376,7 @@ struct TRINITY_DLL_DECL mob_water_globuleAI : public ScriptedAI
{
if (m_creature->IsWithinDistInMap(m_creature->getVictim(), 5))
{
uint32 damage = 4000+rand()%2000;
m_creature->DealDamage(m_creature->getVictim(), damage, NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_FROST, NULL, false);
DoCast(m_creature->getVictim(), SPELL_GLOBULE_EXPLOSION);
//despawn
m_creature->DealDamage(m_creature, m_creature->GetHealth(), NULL, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false);

View File

@@ -6,18 +6,18 @@
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/* ScriptData
SDName: Boss_Onyxia
SD%Complete: 50
SDComment: Phase 2 has many errors. Recommend Rewrite of entire script.
SD%Complete: 90
SDComment: Spell Heated Ground is wrong, flying animation, visual for area effect
SDCategory: Onyxia's Lair
EndScriptData */
@@ -40,19 +40,18 @@ EndScriptData */
#define SPELL_FIREBALL 18392
#define SPELL_BELLOWINGROAR 18431
#define SPELL_HEATED_GROUND 22191
#define SPELL_HEATED_GROUND 22191 //Wrong Spell
#define SPELL_SUMMONWHELP 17646
static float MovementLocations[7][3]=
#define CREATURE_WHELP 11262
static float MovementLocations[4][3]=
{
{-65.8444, -213.809, -60.2985},
{22.87639, -217.152, -60.0548},
{-33.5561, -182.682, -60.9457},
{-31.4963, -250.123, -60.1278},
{-2.78999, -181.431, -60.8962},
{-54.9415, -232.242, -60.5555},
{10.56655, -241.478, -60.9426},
{-64.0523, -213.0619, -68.2985},
{12.4636, -220.01490, -68.0548},
{-38.8391, -182.3220, -68.9457},
{-37.0390, -244.8760, -68.1278}
};
static float SpawnLocations[4][3]=
@@ -63,8 +62,6 @@ static float SpawnLocations[4][3]=
{17.372, -190.840, -85.2810},
};
#define CREATURE_WHELP 11262
struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
{
boss_onyxiaAI(Creature* c) : ScriptedAI(c) {Reset();}
@@ -79,6 +76,10 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
uint32 SummonWhelpsTimer;
uint32 BellowingRoarTimer;
uint32 WingBuffetTimer;
uint32 KnockAwayTimer;
uint32 FireballTimer;
bool InitialSpawn;
void Reset()
{
@@ -87,22 +88,30 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
FlameBreathTimer = 20000;
TailSweepTimer = 2000;
CleaveTimer = 15000;
MovementTimer = 5000;
MovementTimer = 3000;
EngulfingFlamesTimer = 15000;
SummonWhelpsTimer = 45000;
BellowingRoarTimer = 30000;
WingBuffetTimer = 17000;
KnockAwayTimer = 15000;
FireballTimer = 18000;
m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
m_creature->ApplySpellImmune(1, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
InitialSpawn = true;
m_creature->ApplySpellImmune(0, IMMUNITY_STATE, SPELL_AURA_MOD_TAUNT, true);
m_creature->ApplySpellImmune(1, IMMUNITY_EFFECT,SPELL_EFFECT_ATTACK_ME, true);
}
void Aggro(Unit* who)
void Aggro(Unit* who)
{
DoScriptText(SAY_AGGRO, m_creature);
DoZoneInCombat();
DoZoneInCombat();
}
void JustDied(Unit* Killer)
{
}
void KilledUnit(Unit *victim)
{
DoScriptText(SAY_KILL, m_creature);
@@ -113,25 +122,30 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
if(!m_creature->SelectHostilTarget() || !m_creature->getVictim())
return;
if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 60) && (Phase == 1))
if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 60) && (Phase == 1))
{
Phase = 2;
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
Phase = 2;
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
m_creature->AddUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
m_creature->SetHover(true);
m_creature->GetMotionMaster()->Clear(false);
m_creature->GetMotionMaster()->MoveIdle();
DoScriptText(SAY_PHASE_2_TRANS, m_creature);
}
DoScriptText(SAY_PHASE_2_TRANS, m_creature);
}
if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 40) && (Phase == 2))
if(((m_creature->GetHealth()*100 / m_creature->GetMaxHealth()) < 40) && (Phase == 2))
{
Phase = 3;
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT + MOVEMENTFLAG_LEVITATING);
Phase = 3;
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_LEVITATING + MOVEMENTFLAG_ONTRANSPORT);
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LAND);
m_creature->SetHover(false);
m_creature->GetMotionMaster()->MovePoint(0, -10.6155, -219.357, -87.7344);
DoStartMovement(m_creature->getVictim());
m_creature->RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
DoScriptText(SAY_PHASE_3_TRANS, m_creature);
}
}
if(Phase == 1 || Phase == 3)
if(Phase == 1 || Phase == 3)
{
if(FlameBreathTimer < diff)
{
@@ -151,7 +165,7 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
if(CleaveTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_CLEAVE);
CleaveTimer = 7000;
CleaveTimer = 10000;
}else CleaveTimer -= diff;
if(WingBuffetTimer < diff)
@@ -160,62 +174,125 @@ struct TRINITY_DLL_DECL boss_onyxiaAI : public ScriptedAI
WingBuffetTimer = 7000 + ((rand()%8)*1000);
}else WingBuffetTimer -= diff;
DoMeleeAttackIfReady();
}
if(KnockAwayTimer < diff)
{
if(rand() <= 30)
{
DoCast(m_creature->getVictim(), SPELL_KNOCK_AWAY);
}
KnockAwayTimer = 15000;
}else KnockAwayTimer -= diff;
if(Phase == 2)
if(Phase == 3)
{
if(BellowingRoarTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_BELLOWINGROAR);
BellowingRoarTimer = 30000;
}else BellowingRoarTimer -= diff;
if(SummonWhelpsTimer < diff)
{
SummonWhelps(Phase);
SummonWhelpsTimer = 45000;
}else SummonWhelpsTimer -= diff;
}
DoMeleeAttackIfReady();
}
if(Phase == 2)
{
if(!m_creature->isHover())
{
m_creature->HandleEmoteCommand(EMOTE_ONESHOT_LIFTOFF);
m_creature->SetHover(true);
}
if(InitialSpawn)
{
InitialSpawn = false;
if(!m_creature->GetMotionMaster()->empty() && (m_creature->GetMotionMaster()->GetCurrentMovementGeneratorType() != POINT_MOTION_TYPE))
m_creature->GetMotionMaster()->Clear(false);
for(uint32 i = 0; i < 10; ++i)
{
uint32 random = rand()%4;
Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
if(Whelp)
Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
}
}
if(MovementTimer < diff)
if(EngulfingFlamesTimer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_ENGULFINGFLAMES);
m_creature->HandleEmoteCommand(ANIM_FLY);
EngulfingFlamesTimer = 10000;
}
else EngulfingFlamesTimer -= diff;
if(FireballTimer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_FIREBALL);
FireballTimer = 18000;
}
else FireballTimer -= diff;
if(MovementTimer < diff)
{
uint32 random = rand()%8;
if(random < 7)
m_creature->GetMotionMaster()->MovePoint(0, MovementLocations[random][0], MovementLocations[random][1], MovementLocations[random][2]);
else
{
if(rand()%100 < 30)
{
DoScriptText(EMOTE_BREATH, m_creature);
DoCast(m_creature->getVictim(), SPELL_DEEPBREATH);
}
DoCast(m_creature->getVictim(), SPELL_DEEPBREATH);
}
else ChangePosition();
MovementTimer = 25000;
}else MovementTimer -= diff;
if(EngulfingFlamesTimer < diff)
{
DoCast(SelectUnit(SELECT_TARGET_RANDOM, 0), SPELL_ENGULFINGFLAMES);
EngulfingFlamesTimer = 8000;
}else EngulfingFlamesTimer -= diff;
if(SummonWhelpsTimer < diff)
{
uint32 max = rand()%20;
for(uint8 i = 0; i < max; ++i)
{
uint8 random = rand()%4;
Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
if(Whelp)
Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
}
SummonWhelpsTimer = 30000;
}else SummonWhelpsTimer -= diff;
}
SummonWhelps(Phase);
if(Phase == 3)
{
if(BellowingRoarTimer < diff)
{
DoCast(m_creature->getVictim(), SPELL_BELLOWINGROAR);
BellowingRoarTimer = 30000;
}else BellowingRoarTimer -= diff;
}
}
SummonWhelpsTimer = 45000;
}
else SummonWhelpsTimer -= diff;
}
}
void ChangePosition()
{
uint32 random = rand() % 4;
if(random<4){
m_creature->GetMotionMaster()->MovePoint(0, MovementLocations[random][0], MovementLocations[random][1], MovementLocations[random][2]);}
}
void SummonWhelps(uint32 Phase)
{
if(Phase == 2)
{
uint32 max = rand()%10;
for(uint32 i = 0; i < max; ++i)
{
uint32 random = rand()%3;
Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
if(Whelp)
Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
}
}
if(Phase == 3)
{
uint32 max = rand() % 10 +1;
if(max < 5)
{
for(uint32 i = 0; i < max; ++i)
{
uint32 random = rand()%4;
Creature* Whelp = m_creature->SummonCreature(CREATURE_WHELP, SpawnLocations[random][0], SpawnLocations[random][1], SpawnLocations[random][2], 0, TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 30000);
if(Whelp)
Whelp->AI()->AttackStart(SelectUnit(SELECT_TARGET_RANDOM, 0));
}
}
}
}
};
CreatureAI* GetAI_boss_onyxiaAI(Creature *_Creature)
@@ -228,6 +305,6 @@ void AddSC_boss_onyxia()
Script *newscript;
newscript = new Script;
newscript->Name="boss_onyxia";
newscript->GetAI = GetAI_boss_onyxiaAI;
newscript->RegisterSelf();
}
newscript->GetAI = &GetAI_boss_onyxiaAI;
newscript->RegisterSelf();
}