Molten Core - Core Hounds (#683)
* fixed core hounds * removed warning * removed warning
This commit is contained in:
@@ -109,8 +109,7 @@ class boss_magmadar : public CreatureScript
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// 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();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user