diff options
| -rw-r--r-- | src/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_magmadar.cpp | 217 |
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(); } }; |
