*Update flame levi script. Fix the bug that it often gets stuck.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-08-26 22:56:20 -05:00
parent c5ff737ef8
commit f16b93d8d8
8 changed files with 113 additions and 114 deletions

View File

@@ -55,6 +55,8 @@ enum Events
EVENT_PURSUE = 1,
EVENT_MISSILE,
EVENT_VENT,
EVENT_SPEED,
EVENT_SUMMON,
EVENT_MIMIRON_INFERNO, // Not Blizzlike
EVENT_HODIR_FURY, // Not Blizzlike
};
@@ -88,8 +90,10 @@ struct TRINITY_DLL_DECL boss_flame_leviathanAI : public BossAI
events.ScheduleEvent(EVENT_PURSUE, 0);
events.ScheduleEvent(EVENT_MISSILE, 1500);
events.ScheduleEvent(EVENT_VENT, 20000);
events.ScheduleEvent(EVENT_MIMIRON_INFERNO, 60000 + (rand()%60000)); // Not Blizzlike
events.ScheduleEvent(EVENT_HODIR_FURY, 60000 + (rand()%60000)); // Not Blizzlike
events.ScheduleEvent(EVENT_SPEED, 15000);
events.ScheduleEvent(EVENT_SUMMON, 0);
//events.ScheduleEvent(EVENT_MIMIRON_INFERNO, 60000 + (rand()%60000)); // Not Blizzlike
//events.ScheduleEvent(EVENT_HODIR_FURY, 60000 + (rand()%60000)); // Not Blizzlike
if (Creature *turret = CAST_CRE(vehicle->GetPassenger(7)))
turret->AI()->DoZoneInCombat();
}
@@ -120,8 +124,8 @@ struct TRINITY_DLL_DECL boss_flame_leviathanAI : public BossAI
if(summon->GetEntry() == MOB_MECHANOLIFT)
{
summons.Despawn(summon);
if(Creature* container = DoSummon(MOB_CONTAINER, summon, 0, 0))
container->GetMotionMaster()->MovePoint(1, container->GetPositionX(), container->GetPositionY(), me->GetPositionZ());
//if(Creature* container = DoSummon(MOB_CONTAINER, summon, 0, 0))
// container->GetMotionMaster()->MovePoint(1, container->GetPositionX(), container->GetPositionY(), me->GetPositionZ());
}
}
@@ -130,17 +134,12 @@ struct TRINITY_DLL_DECL boss_flame_leviathanAI : public BossAI
if (!me->isInCombat())
return;
if (me->getThreatManager().isThreatListEmpty()) // This is wrong, Flame Leviathan isn't even supposed to have a threat list, he just "switches to another Siege Engine/Demolisher every 30 seconds"
if (me->getThreatManager().isThreatListEmpty())
{
EnterEvadeMode();
me->SetHealth(me->GetMaxHealth()); // EnterEvadeMode(); does not work against vehicles
return;
}
if(summons.size() < 4)
if(Creature *lift = DoSummonFlyer(MOB_MECHANOLIFT, me, 50, rand()%20 + 20, 0))
lift->GetMotionMaster()->MoveRandom(100);
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
@@ -154,8 +153,11 @@ struct TRINITY_DLL_DECL boss_flame_leviathanAI : public BossAI
{
case 0: break; // this is a must
case EVENT_PURSUE:
DoCastAOE(SPELL_PURSUED);
events.RepeatEvent(35000);
DoCastAOE(SPELL_PURSUED, true);
//events.RepeatEvent(35000); // this should not be used because eventId may be overriden
events.RescheduleEvent(EVENT_PURSUE, 35000);
if(!me->getVictim()) // all siege engines and demolishers are dead
UpdateVictim(); // begin to kill other things
return;
case EVENT_MISSILE:
//TODO: without unittarget no visual effect
@@ -167,6 +169,16 @@ struct TRINITY_DLL_DECL boss_flame_leviathanAI : public BossAI
DoCastAOE(SPELL_FLAME_VENTS);
events.RepeatEvent(20000);
return;
case EVENT_SPEED:
DoCastAOE(SPELL_GATHERING_SPEED);
events.RepeatEvent(15000);
return;
case EVENT_SUMMON:
if(summons.size() < 10)
if(Creature *lift = DoSummonFlyer(MOB_MECHANOLIFT, me, rand()%20 + 20, 50, 0))
lift->GetMotionMaster()->MoveRandom(100);
events.RepeatEvent(2000);
return;
case EVENT_MIMIRON_INFERNO: // Not Blizzlike
DoCast(me->getVictim(), SPELL_MIMIRON_INFERNO);
events.RepeatEvent(60000 + (rand()%60000));
@@ -183,59 +195,6 @@ struct TRINITY_DLL_DECL boss_flame_leviathanAI : public BossAI
}
};
struct TRINITY_DLL_DECL boss_flame_leviathan_turretAI : public ScriptedAI
{
boss_flame_leviathan_turretAI(Creature *c) : ScriptedAI(c)
{
me->SetReactState(REACT_PASSIVE);
}
void Reset()
{
events.Reset();
}
EventMap events;
void EnterCombat(Unit *who)
{
events.ScheduleEvent(1, 5000);
}
void AttackStart(Unit *who)
{
if(who)
me->Attack(who, false);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateCombatState())
return;
events.Update(diff);
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
if (uint32 eventId = events.GetEvent())
{
switch(eventId)
{
case 1:
DoCast(me->getVictim(), SPELL_FLAME_CANNON);
AttackStart(SelectTarget(SELECT_TARGET_RANDOM));
events.RepeatEvent(3000);
return;
default:
events.PopEvent();
break;
}
}
}
};
//#define BOSS_DEBUG
struct TRINITY_DLL_DECL boss_flame_leviathan_seatAI : public PassiveAI
@@ -293,50 +252,21 @@ struct TRINITY_DLL_DECL boss_flame_leviathan_seatAI : public PassiveAI
}
};
struct TRINITY_DLL_DECL boss_flame_leviathan_defense_turretAI : public ScriptedAI
struct TRINITY_DLL_DECL boss_flame_leviathan_defense_turretAI : public TurretAI
{
boss_flame_leviathan_defense_turretAI(Creature *c) : ScriptedAI(c), timer(2000) {}
uint32 timer;
boss_flame_leviathan_defense_turretAI(Creature *c) : TurretAI(c) {}
void DamageTaken(Unit *who, uint32 &damage)
{
if (!who->GetVehicle() || who->GetVehicleBase()->GetEntry() != 33114)
if(!CanAIAttack(who))
damage = 0;
}
void MoveInLineOfSight(Unit *who)
bool CanAIAttack(const Unit *who) const
{
if (me->getVictim())
return;
if (who->GetTypeId() != TYPEID_PLAYER || !who->GetVehicle() || who->GetVehicleBase()->GetEntry() != 33114)
return;
AttackStart(who);
}
void AttackStart(Unit *who)
{
if(who)
me->Attack(who, false);
}
void UpdateAI(const uint32 diff)
{
if (!UpdateVictim())
return;
if (me->hasUnitState(UNIT_STAT_CASTING))
return;
if(timer > diff)
timer -= diff;
else
{
timer = 2000;
DoCast(me->getVictim(), SPELL_SEARING_FLAME);
}
return false;
return true;
}
};
@@ -388,11 +318,6 @@ CreatureAI* GetAI_boss_flame_leviathan(Creature* pCreature)
return new boss_flame_leviathanAI (pCreature);
}
CreatureAI* GetAI_boss_flame_leviathan_turret(Creature* pCreature)
{
return new boss_flame_leviathan_turretAI (pCreature);
}
CreatureAI* GetAI_boss_flame_leviathan_seat(Creature* pCreature)
{
return new boss_flame_leviathan_seatAI (pCreature);
@@ -421,11 +346,6 @@ void AddSC_boss_flame_leviathan()
newscript->GetAI = &GetAI_boss_flame_leviathan;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="boss_flame_leviathan_turret";
newscript->GetAI = &GetAI_boss_flame_leviathan_turret;
newscript->RegisterSelf();
newscript = new Script;
newscript->Name="boss_flame_leviathan_seat";
newscript->GetAI = &GetAI_boss_flame_leviathan_seat;

View File

@@ -18,3 +18,50 @@
#include "precompiled.h"
#include "def_ulduar.h"
#include "Vehicle.h"
#define SPELL_ARM_DEAD_DAMAGE HEROIC(63629,63979)
#define SPELL_TWO_ARM_SMASH HEROIC(63356,64003)
#define SPELL_ONE_ARM_SMASH HEROIC(63573,64006)
#define SPELL_STONE_SHOUT HEROIC(63716,64005)
#define SPELL_PETRIFY_BREATH HEROIC(62030,63980)
#define SPELL_STONE_GRIP HEROIC(62166,63981)
#define SPELL_ARM_SWEEP HEROIC(63766,63983)
struct TRINITY_DLL_DECL boss_kologarnAI : public BossAI
{
boss_kologarnAI(Creature *c) : BossAI(c, BOSS_KOLOGARN), vehicle(me->GetVehicleKit())
{
assert(vehicle);
}
Vehicle *vehicle;
void AttackStart(Unit *who)
{
me->Attack(who, true);
}
void UpdateAI(const uint32 diff)
{
if(!UpdateVictim())
return;
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI_boss_kologarn(Creature* pCreature)
{
return new boss_kologarnAI (pCreature);
}
void AddSC_boss_kologarn()
{
Script *newscript;
newscript = new Script;
newscript->Name="boss_kologarn";
newscript->GetAI = &GetAI_boss_kologarn;
newscript->RegisterSelf();
}

View File

@@ -291,6 +291,7 @@ extern void AddSC_boss_flame_leviathan();
extern void AddSC_boss_ignis();
extern void AddSC_boss_razorscale();
extern void AddSC_boss_xt002();
extern void AddSC_boss_kologarn();
extern void AddSC_boss_assembly_of_iron();
extern void AddSC_instance_ulduar();
extern void AddSC_boss_keleseth(); //Utgarde Keep
@@ -684,6 +685,7 @@ void AddScripts()
AddSC_boss_razorscale();
AddSC_boss_xt002();
AddSC_boss_assembly_of_iron();
AddSC_boss_kologarn();
AddSC_instance_ulduar();
AddSC_boss_keleseth(); //Utgarde Keep
AddSC_boss_skarvald_dalronn();