aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-08-26 22:56:20 -0500
committermegamage <none@none>2009-08-26 22:56:20 -0500
commitf16b93d8d8ded579fbf7b560afa3bb6475816c02 (patch)
treef3320916aa1ddc55d0aa49130fa6e11f3f5a791b /src
parentc5ff737ef8e9c1805505df8429d98a9fed839895 (diff)
*Update flame levi script. Fix the bug that it often gets stuck.
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/bindings/scripts/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp140
-rw-r--r--src/bindings/scripts/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp47
-rw-r--r--src/bindings/scripts/system/ScriptLoader.cpp2
-rw-r--r--src/game/Creature.cpp3
-rw-r--r--src/game/ObjectMgr.cpp3
5 files changed, 84 insertions, 111 deletions
diff --git a/src/bindings/scripts/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp b/src/bindings/scripts/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp
index f251b88d812..39c667522e2 100644
--- a/src/bindings/scripts/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp
+++ b/src/bindings/scripts/scripts/northrend/ulduar/ulduar/boss_flame_leviathan.cpp
@@ -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);
@@ -422,11 +347,6 @@ void AddSC_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;
newscript->RegisterSelf();
diff --git a/src/bindings/scripts/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp b/src/bindings/scripts/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp
index a736b2db12a..b9a2f628d4f 100644
--- a/src/bindings/scripts/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp
+++ b/src/bindings/scripts/scripts/northrend/ulduar/ulduar/boss_kologarn.cpp
@@ -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();
+}
diff --git a/src/bindings/scripts/system/ScriptLoader.cpp b/src/bindings/scripts/system/ScriptLoader.cpp
index 30a03b25f5a..553a5af959f 100644
--- a/src/bindings/scripts/system/ScriptLoader.cpp
+++ b/src/bindings/scripts/system/ScriptLoader.cpp
@@ -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();
diff --git a/src/game/Creature.cpp b/src/game/Creature.cpp
index 5441a42c94a..3e857a34acc 100644
--- a/src/game/Creature.cpp
+++ b/src/game/Creature.cpp
@@ -562,6 +562,8 @@ void Creature::Update(uint32 diff)
break;
}
case DEAD_FALLING:
+ GetMotionMaster()->UpdateMotion(diff);
+ break;
default:
break;
}
@@ -1817,6 +1819,7 @@ bool Creature::FallGround()
if (fabs(ground_Z - z) < 0.1f)
return false;
+ RemoveUnitMovementFlag(MOVEMENTFLAG_WALK_MODE);
GetMotionMaster()->MovePoint(EVENT_FALL_GROUND, x, y, ground_Z);
Unit::setDeathState(DEAD_FALLING);
return true;
diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp
index 2acad8f7ede..8d00b604236 100644
--- a/src/game/ObjectMgr.cpp
+++ b/src/game/ObjectMgr.cpp
@@ -1034,8 +1034,9 @@ uint32 ObjectMgr::ChooseDisplayId(uint32 team, const CreatureInfo *cinfo, const
case 33114: // Flame Leviathan Seat (model 24914 chair)
case 33167: // Salvaged Demolisher Mechanic Seat
return cinfo->DisplayID_A[0];
- case 33143: // Overload Control Device
case 33218: // Pyrite Safety Container
+ return cinfo->DisplayID_A[1];
+ case 33143: // Overload Control Device
return cinfo->DisplayID_H[0];
default:
return cinfo->GetRandomValidModelId();