Molten Core - Core Hounds (#683)

* fixed core hounds

* removed warning

* removed warning
This commit is contained in:
Gargarensis
2017-11-10 14:55:19 +01:00
committed by Yehonal
parent a2170f218b
commit a95be19341

View File

@@ -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 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;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
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;
}
}
DoMeleeAttackIfReady();
}
};
CreatureAI* GetAI(Creature* creature) const
{
return new boss_magmadarAI(creature);
}
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 UpdateAI(uint32 diff)
{
if (!UpdateVictim())
return;
events.Update(diff);
if (me->HasUnitState(UNIT_STATE_CASTING))
return;
while (uint32 eventId = events.ExecuteEvent())
{
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;
}
}
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 DamageTaken(Unit* /*attacker*/, uint32& damage, DamageEffectType /*damagetype*/, SpellSchoolMask /*damageSchoolMask*/)
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*/)
{
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();
}
};