summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp217
1 files changed, 126 insertions, 91 deletions
diff --git a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp b/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
index 8e4325c284..0908b5b107 100644
--- a/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
+++ b/src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp
@@ -4,12 +4,12 @@
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*/
-/* ScriptData
-SDName: Boss_Magmadar
-SD%Complete: 75
-SDComment: Conflag on ground nyi
-SDCategory: Molten Core
-EndScriptData */
+ /* ScriptData
+ SDName: Boss_Magmadar
+ SD%Complete: 75
+ SDComment: Conflag on ground nyi
+ SDCategory: Molten Core
+ EndScriptData */
#include "ObjectMgr.h"
#include "ScriptMgr.h"
@@ -18,99 +18,98 @@ EndScriptData */
enum Texts
{
- EMOTE_FRENZY = 0,
- EMOTE_SMOLDERING = 0,
- EMOTE_IGNITE = 1,
+ EMOTE_FRENZY = 0,
+ EMOTE_SMOLDERING = 0,
+ EMOTE_IGNITE = 1,
};
enum Spells
{
- SPELL_FRENZY = 19451,
- SPELL_MAGMA_SPIT = 19449,
- SPELL_PANIC = 19408,
- SPELL_LAVA_BOMB = 19428,
- SPELL_SERRATED_BITE = 19771,
+ SPELL_FRENZY = 19451,
+ SPELL_MAGMA_SPIT = 19449,
+ SPELL_PANIC = 19408,
+ SPELL_LAVA_BOMB = 19428,
+ SPELL_SERRATED_BITE = 19771,
};
enum Events
{
- EVENT_FRENZY = 1,
- EVENT_PANIC = 2,
- EVENT_LAVA_BOMB = 3,
+ EVENT_FRENZY = 1,
+ EVENT_PANIC = 2,
+ EVENT_LAVA_BOMB = 3,
EVENT_SERRATED_BITE = 1,
- EVENT_IGNITE = 2,
+ EVENT_IGNITE = 2,
};
class boss_magmadar : public CreatureScript
{
- public:
- boss_magmadar() : CreatureScript("boss_magmadar") { }
+public:
+ boss_magmadar() : CreatureScript("boss_magmadar") { }
- struct boss_magmadarAI : public BossAI
+ struct boss_magmadarAI : public BossAI
+ {
+ boss_magmadarAI(Creature* creature) : BossAI(creature, BOSS_MAGMADAR)
{
- boss_magmadarAI(Creature* creature) : BossAI(creature, BOSS_MAGMADAR)
- {
- }
+ }
- void Reset()
- {
- BossAI::Reset();
- DoCast(me, SPELL_MAGMA_SPIT, true);
- }
+ void Reset()
+ {
+ BossAI::Reset();
+ DoCast(me, SPELL_MAGMA_SPIT, true);
+ }
- void EnterCombat(Unit* victim)
- {
- BossAI::EnterCombat(victim);
- events.ScheduleEvent(EVENT_FRENZY, 30000);
- events.ScheduleEvent(EVENT_PANIC, 20000);
- events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
- }
+ void EnterCombat(Unit* victim)
+ {
+ BossAI::EnterCombat(victim);
+ events.ScheduleEvent(EVENT_FRENZY, 30000);
+ events.ScheduleEvent(EVENT_PANIC, 20000);
+ events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
+ }
- void UpdateAI(uint32 diff)
- {
- if (!UpdateVictim())
- return;
+ void UpdateAI(uint32 diff)
+ {
+ if (!UpdateVictim())
+ return;
- events.Update(diff);
+ events.Update(diff);
- if (me->HasUnitState(UNIT_STATE_CASTING))
- return;
+ if (me->HasUnitState(UNIT_STATE_CASTING))
+ return;
- while (uint32 eventId = events.ExecuteEvent())
+ while (uint32 eventId = events.ExecuteEvent())
+ {
+ switch (eventId)
{
- switch (eventId)
- {
- case EVENT_FRENZY:
- Talk(EMOTE_FRENZY);
- DoCast(me, SPELL_FRENZY);
- events.ScheduleEvent(EVENT_FRENZY, 15000);
- break;
- case EVENT_PANIC:
- DoCastVictim(SPELL_PANIC);
- events.ScheduleEvent(EVENT_PANIC, 35000);
- break;
- case EVENT_LAVA_BOMB:
- if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LAVA_BOMB))
- DoCast(target, SPELL_LAVA_BOMB);
- events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
- break;
- default:
- break;
- }
+ case EVENT_FRENZY:
+ Talk(EMOTE_FRENZY);
+ DoCast(me, SPELL_FRENZY);
+ events.ScheduleEvent(EVENT_FRENZY, 15000);
+ break;
+ case EVENT_PANIC:
+ DoCastVictim(SPELL_PANIC);
+ events.ScheduleEvent(EVENT_PANIC, 35000);
+ break;
+ case EVENT_LAVA_BOMB:
+ if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true, -SPELL_LAVA_BOMB))
+ DoCast(target, SPELL_LAVA_BOMB);
+ events.ScheduleEvent(EVENT_LAVA_BOMB, 12000);
+ break;
+ default:
+ break;
}
-
- DoMeleeAttackIfReady();
}
- };
- CreatureAI* GetAI(Creature* creature) const
- {
- return new boss_magmadarAI(creature);
+ DoMeleeAttackIfReady();
}
+ };
+
+ CreatureAI* GetAI(Creature* creature) const
+ {
+ return new boss_magmadarAI(creature);
+ }
};
-// Smoldering animation is an hack, Serrated Bites timer may be wrong
-// The original smoldering aura should increase crit chance to 100% and play dead animation
+// Serrated Bites timer may be wrong
class npc_magmadar_core_hound : public CreatureScript
{
public:
@@ -123,19 +122,38 @@ public:
}
EventMap events;
- bool smoldering;
std::list<Creature *> hounds;
+ bool smoldering = false;
+ Unit* killer;
+
+ void removeFeignDeath() {
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
+ me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
+ me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
+ me->RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT);
+ me->ClearUnitState(UNIT_STATE_DIED);
+ me->ClearUnitState(UNIT_STATE_CANNOT_AUTOATTACK);
+ me->DisableRotate(false);
+ }
- void DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/)
+ void DamageTaken(Unit* attacker, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/)
{
if (me->HealthBelowPctDamaged(0, damage))
{
if (!smoldering)
{
+ killer = attacker;
events.ScheduleEvent(EVENT_IGNITE, 10000);
me->SetHealth(1);
- me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED|UNIT_FLAG_PACIFIED);
- me->AddAura(57626, me); // feign death animation, this is an hack even if the result is good
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
+ me->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
+ me->SetFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
+ me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
+ me->AddUnitMovementFlag(MOVEMENTFLAG_ROOT);
+ me->AddUnitState(UNIT_STATE_DIED);
+ me->AddUnitState(UNIT_STATE_CANNOT_AUTOATTACK);
+ me->DisableRotate(true);
Talk(EMOTE_SMOLDERING);
}
damage = 0;
@@ -143,20 +161,22 @@ public:
}
}
- void Reset()
- {
+ void Reset() {
+ removeFeignDeath();
+ }
+ void JustDied(Unit* /*killer*/) {
+ removeFeignDeath();
}
void EnterCombat(Unit* /*victim*/)
{
events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // timer may be wrong
- smoldering = false;
}
void UpdateAI(uint32 diff)
{
- if (!UpdateVictim())
+ if (!UpdateVictim() && !smoldering)
return;
events.Update(diff);
@@ -166,34 +186,49 @@ public:
switch (eventId)
{
case EVENT_SERRATED_BITE:
- if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
+ if (UpdateVictim() && !smoldering) {
DoCast(me->GetVictim(), SPELL_SERRATED_BITE);
- events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // again, timer may be wrong
+ events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // again, timer may be wrong
+ }
break;
case EVENT_IGNITE:
- me->GetCreaturesWithEntryInRange(hounds, 100, NPC_CORE_HOUND);
+ smoldering = false;
+ me->GetCreaturesWithEntryInRange(hounds, 80, NPC_CORE_HOUND);
for (Creature * i : hounds)
{
- if (i && i->IsAlive() && i->IsInCombat() && !i->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
+ if (i && i->IsAlive() && i->IsInCombat() && !i->HasUnitState(UNIT_STATE_DIED))
{
- me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED|UNIT_FLAG_PACIFIED);
- me->RemoveAura(me->GetAura(57626), AURA_REMOVE_BY_DEFAULT);
- me->SetFullHealth();
- smoldering = false;
Talk(EMOTE_IGNITE);
+ me->SetFullHealth();
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
+ me->RemoveFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_FEIGN_DEATH);
+ me->RemoveFlag(UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_DEAD);
+ me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE);
+ me->RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT);
+ me->ClearUnitState(UNIT_STATE_DIED);
+ me->ClearUnitState(UNIT_STATE_CANNOT_AUTOATTACK);
+ me->DisableRotate(false);
+ me->AI()->AttackStart(i->GetVictim());
return;
}
}
- Unit::Kill(me, me);
+ if (me->HasUnitState(UNIT_STATE_DIED))
+ {
+ if (killer)
+ {
+ me->Kill(killer, me);
+ }
+ else
+ {
+ me->Kill(me, me);
+ }
+ }
break;
default:
break;
}
}
- if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
- return;
-
DoMeleeAttackIfReady();
}
};