mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-02-02 15:17:27 +01:00
*Update flame levi script. Fix the bug that it often gets stuck.
--HG-- branch : trunk
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user