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/> * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*/ */
/* ScriptData /* ScriptData
SDName: Boss_Magmadar SDName: Boss_Magmadar
SD%Complete: 75 SD%Complete: 75
SDComment: Conflag on ground nyi SDComment: Conflag on ground nyi
SDCategory: Molten Core SDCategory: Molten Core
EndScriptData */ EndScriptData */
#include "ObjectMgr.h" #include "ObjectMgr.h"
#include "ScriptMgr.h" #include "ScriptMgr.h"
@@ -18,99 +18,98 @@ EndScriptData */
enum Texts enum Texts
{ {
EMOTE_FRENZY = 0, EMOTE_FRENZY = 0,
EMOTE_SMOLDERING = 0, EMOTE_SMOLDERING = 0,
EMOTE_IGNITE = 1, EMOTE_IGNITE = 1,
}; };
enum Spells enum Spells
{ {
SPELL_FRENZY = 19451, SPELL_FRENZY = 19451,
SPELL_MAGMA_SPIT = 19449, SPELL_MAGMA_SPIT = 19449,
SPELL_PANIC = 19408, SPELL_PANIC = 19408,
SPELL_LAVA_BOMB = 19428, SPELL_LAVA_BOMB = 19428,
SPELL_SERRATED_BITE = 19771, SPELL_SERRATED_BITE = 19771,
}; };
enum Events enum Events
{ {
EVENT_FRENZY = 1, EVENT_FRENZY = 1,
EVENT_PANIC = 2, EVENT_PANIC = 2,
EVENT_LAVA_BOMB = 3, EVENT_LAVA_BOMB = 3,
EVENT_SERRATED_BITE = 1, EVENT_SERRATED_BITE = 1,
EVENT_IGNITE = 2, EVENT_IGNITE = 2,
}; };
class boss_magmadar : public CreatureScript class boss_magmadar : public CreatureScript
{ {
public: public:
boss_magmadar() : CreatureScript("boss_magmadar") { } 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 // Serrated Bites timer may be wrong
// The original smoldering aura should increase crit chance to 100% and play dead animation
class npc_magmadar_core_hound : public CreatureScript class npc_magmadar_core_hound : public CreatureScript
{ {
public: public:
@@ -123,19 +122,38 @@ public:
} }
EventMap events; EventMap events;
bool smoldering;
std::list<Creature *> hounds; 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 (me->HealthBelowPctDamaged(0, damage))
{ {
if (!smoldering) if (!smoldering)
{ {
killer = attacker;
events.ScheduleEvent(EVENT_IGNITE, 10000); events.ScheduleEvent(EVENT_IGNITE, 10000);
me->SetHealth(1); me->SetHealth(1);
me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED|UNIT_FLAG_PACIFIED); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNK_29);
me->AddAura(57626, me); // feign death animation, this is an hack even if the result is good 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); Talk(EMOTE_SMOLDERING);
} }
damage = 0; damage = 0;
@@ -143,20 +161,22 @@ public:
} }
} }
void Reset() void Reset() {
{ removeFeignDeath();
}
void JustDied(Unit* /*killer*/) {
removeFeignDeath();
} }
void EnterCombat(Unit* /*victim*/) void EnterCombat(Unit* /*victim*/)
{ {
events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // timer may be wrong events.ScheduleEvent(EVENT_SERRATED_BITE, 10000); // timer may be wrong
smoldering = false;
} }
void UpdateAI(uint32 diff) void UpdateAI(uint32 diff)
{ {
if (!UpdateVictim()) if (!UpdateVictim() && !smoldering)
return; return;
events.Update(diff); events.Update(diff);
@@ -166,34 +186,49 @@ public:
switch (eventId) switch (eventId)
{ {
case EVENT_SERRATED_BITE: case EVENT_SERRATED_BITE:
if (!me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED)) if (UpdateVictim() && !smoldering) {
DoCast(me->GetVictim(), SPELL_SERRATED_BITE); 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; break;
case EVENT_IGNITE: case EVENT_IGNITE:
me->GetCreaturesWithEntryInRange(hounds, 100, NPC_CORE_HOUND); smoldering = false;
me->GetCreaturesWithEntryInRange(hounds, 80, NPC_CORE_HOUND);
for (Creature * i : hounds) 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); 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; return;
} }
} }
Unit::Kill(me, me); if (me->HasUnitState(UNIT_STATE_DIED))
{
if (killer)
{
me->Kill(killer, me);
}
else
{
me->Kill(me, me);
}
}
break; break;
default: default:
break; break;
} }
} }
if (me->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PACIFIED))
return;
DoMeleeAttackIfReady(); DoMeleeAttackIfReady();
} }
}; };