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
@@ -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"
@@ -43,7 +43,7 @@ enum Events
class boss_magmadar : public CreatureScript
{
public:
public:
boss_magmadar() : CreatureScript("boss_magmadar") { }
struct boss_magmadarAI : public BossAI
@@ -109,8 +109,7 @@ class boss_magmadar : public CreatureScript
}
};
// 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
}
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();
}
};