mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-02-01 10:03:47 +00:00
Molten Core - Core Hounds (#683)
* fixed core hounds * removed warning * removed warning
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user