mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 02:04:52 +01:00
Script: Updated Murmur to use events.
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
DELETE FROM `spelldifficulty_dbc` WHERE `id` IN (33923,33666,33711);
|
||||
INSERT INTO `spelldifficulty_dbc` (`id`,`spellid0`,`spellid1`) VALUES
|
||||
(33923,33923,38796),
|
||||
(33666,33666,38795),
|
||||
(33711,33711,38794);
|
||||
@@ -301,6 +301,7 @@ public:
|
||||
//enrage at 20%
|
||||
if (HealthBelowPct(20))
|
||||
events.ScheduleEvent(EVENT_SUMMON_TRAVELER, 5000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
DoMeleeAttackIfReady();
|
||||
|
||||
@@ -30,53 +30,51 @@ EndScriptData */
|
||||
|
||||
enum Murmur
|
||||
{
|
||||
// Spell
|
||||
SPELL_RESONANCE = 33657,
|
||||
SPELL_MAGNETIC_PULL = 33689,
|
||||
SPELL_SONIC_SHOCK = 38797,
|
||||
SPELL_THUNDERING_STORM = 39365,
|
||||
SPELL_SONIC_BOOM_CAST = 33923,
|
||||
SPELL_SONIC_BOOM_EFFECT = 33666,
|
||||
SPELL_MURMURS_TOUCH = 33711,
|
||||
// Text
|
||||
EMOTE_SONIC_BOOM = 0
|
||||
};
|
||||
|
||||
#define SPELL_SONIC_BOOM_CAST DUNGEON_MODE(33923, 38796)
|
||||
#define SPELL_SONIC_BOOM_EFFECT DUNGEON_MODE(33666, 38795)
|
||||
|
||||
#define SPELL_MURMURS_TOUCH DUNGEON_MODE(33711, 38794)
|
||||
|
||||
enum Events
|
||||
{
|
||||
EVENT_SONIC_BOOM = 1,
|
||||
EVENT_MURMURS_TOUCH = 2,
|
||||
EVENT_RESONANCE = 3,
|
||||
EVENT_MAGNETIC_PULL = 4,
|
||||
EVENT_THUNDERING_STORM = 5,
|
||||
EVENT_SONIC_SHOCK = 6
|
||||
};
|
||||
|
||||
class boss_murmur : public CreatureScript
|
||||
{
|
||||
public:
|
||||
boss_murmur() : CreatureScript("boss_murmur") { }
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
struct boss_murmurAI : public BossAI
|
||||
{
|
||||
return new boss_murmurAI (creature);
|
||||
}
|
||||
|
||||
struct boss_murmurAI : public ScriptedAI
|
||||
{
|
||||
boss_murmurAI(Creature* creature) : ScriptedAI(creature)
|
||||
boss_murmurAI(Creature* creature) : BossAI(creature, DATA_MURMUREVENT)
|
||||
{
|
||||
SetCombatMovement(false);
|
||||
}
|
||||
|
||||
uint32 SonicBoom_Timer;
|
||||
uint32 MurmursTouch_Timer;
|
||||
uint32 Resonance_Timer;
|
||||
uint32 MagneticPull_Timer;
|
||||
uint32 SonicShock_Timer;
|
||||
uint32 ThunderingStorm_Timer;
|
||||
bool SonicBoom;
|
||||
|
||||
void Reset()
|
||||
{
|
||||
SonicBoom_Timer = 30000;
|
||||
MurmursTouch_Timer = urand(8000, 20000);
|
||||
Resonance_Timer = 5000;
|
||||
MagneticPull_Timer = urand(15000, 30000);
|
||||
ThunderingStorm_Timer = 15000;
|
||||
SonicShock_Timer = 10000;
|
||||
SonicBoom = false;
|
||||
events.ScheduleEvent(EVENT_SONIC_BOOM, 30000);
|
||||
events.ScheduleEvent(EVENT_MURMURS_TOUCH, urand(8000, 20000));
|
||||
events.ScheduleEvent(EVENT_RESONANCE, 5000);
|
||||
events.ScheduleEvent(EVENT_MAGNETIC_PULL, urand(15000, 30000));
|
||||
if (IsHeroic())
|
||||
{
|
||||
events.ScheduleEvent(EVENT_THUNDERING_STORM, 15000);
|
||||
events.ScheduleEvent(EVENT_SONIC_SHOCK, 10000);
|
||||
}
|
||||
|
||||
//database should have `RegenHealth`=0 to prevent regen
|
||||
uint32 hp = me->CountPctFromMaxHealth(40);
|
||||
@@ -117,81 +115,65 @@ public:
|
||||
if (!UpdateVictim() || me->IsNonMeleeSpellCasted(false))
|
||||
return;
|
||||
|
||||
// Sonic Boom
|
||||
if (SonicBoom)
|
||||
{
|
||||
DoCast(me, SPELL_SONIC_BOOM_EFFECT, true);
|
||||
SonicBoomEffect();
|
||||
events.Update(diff);
|
||||
|
||||
SonicBoom = false;
|
||||
Resonance_Timer = 1500;
|
||||
}
|
||||
if (SonicBoom_Timer <= diff)
|
||||
while (uint32 eventId = events.ExecuteEvent())
|
||||
{
|
||||
Talk(EMOTE_SONIC_BOOM);
|
||||
DoCast(me, SPELL_SONIC_BOOM_CAST);
|
||||
SonicBoom_Timer = 30000;
|
||||
SonicBoom = true;
|
||||
return;
|
||||
} else SonicBoom_Timer -= diff;
|
||||
|
||||
// Murmur's Touch
|
||||
if (MurmursTouch_Timer <= diff)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80, true))
|
||||
DoCast(target, SPELL_MURMURS_TOUCH);
|
||||
MurmursTouch_Timer = urand(25000, 35000);
|
||||
} else MurmursTouch_Timer -= diff;
|
||||
|
||||
// Resonance
|
||||
if (!SonicBoom && !(me->IsWithinMeleeRange(me->GetVictim())))
|
||||
{
|
||||
if (Resonance_Timer <= diff)
|
||||
switch (eventId)
|
||||
{
|
||||
DoCast(me, SPELL_RESONANCE);
|
||||
Resonance_Timer = 5000;
|
||||
} else Resonance_Timer -= diff;
|
||||
}
|
||||
|
||||
// Magnetic Pull
|
||||
if (MagneticPull_Timer <= diff)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive())
|
||||
case EVENT_SONIC_BOOM:
|
||||
Talk(EMOTE_SONIC_BOOM);
|
||||
DoCast(me, SPELL_SONIC_BOOM_CAST);
|
||||
DoCast(me, SPELL_SONIC_BOOM_EFFECT, true);
|
||||
SonicBoomEffect();
|
||||
events.ScheduleEvent(EVENT_SONIC_BOOM, 30000);
|
||||
events.ScheduleEvent(EVENT_RESONANCE, 1500);
|
||||
break;
|
||||
case EVENT_MURMURS_TOUCH:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80, true))
|
||||
DoCast(target, SPELL_MURMURS_TOUCH);
|
||||
events.ScheduleEvent(EVENT_MURMURS_TOUCH, urand(25000, 35000));
|
||||
break;
|
||||
case EVENT_RESONANCE:
|
||||
if (!(me->IsWithinMeleeRange(me->GetVictim())))
|
||||
{
|
||||
DoCast(me, SPELL_RESONANCE);
|
||||
events.ScheduleEvent(EVENT_RESONANCE, 5000);
|
||||
}
|
||||
break;
|
||||
case EVENT_MAGNETIC_PULL:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
|
||||
if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive())
|
||||
{
|
||||
DoCast(target, SPELL_MAGNETIC_PULL);
|
||||
events.ScheduleEvent(EVENT_MAGNETIC_PULL, 15000+rand()%15000);
|
||||
break;
|
||||
}
|
||||
events.ScheduleEvent(EVENT_MAGNETIC_PULL, 500);
|
||||
break;
|
||||
case EVENT_THUNDERING_STORM:
|
||||
{
|
||||
DoCast(target, SPELL_MAGNETIC_PULL);
|
||||
MagneticPull_Timer = 15000+rand()%15000;
|
||||
return;
|
||||
}
|
||||
MagneticPull_Timer = 500;
|
||||
} else MagneticPull_Timer -= diff;
|
||||
|
||||
if (IsHeroic())
|
||||
{
|
||||
// Thundering Storm
|
||||
if (ThunderingStorm_Timer <= diff)
|
||||
{
|
||||
ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList();
|
||||
for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i)
|
||||
if (Unit* target = Unit::GetUnit(*me, (*i)->getUnitGuid()))
|
||||
if (target->IsAlive() && !me->IsWithinDist(target, 35, false))
|
||||
DoCast(target, SPELL_THUNDERING_STORM, true);
|
||||
ThunderingStorm_Timer = 15000;
|
||||
} else ThunderingStorm_Timer -= diff;
|
||||
|
||||
// Sonic Shock
|
||||
if (SonicShock_Timer <= diff)
|
||||
{
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20, false))
|
||||
if (target->IsAlive())
|
||||
DoCast(target, SPELL_SONIC_SHOCK);
|
||||
SonicShock_Timer = 10000+rand()%10000;
|
||||
} else SonicShock_Timer -= diff;
|
||||
ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList();
|
||||
for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i)
|
||||
if (Unit* target = Unit::GetUnit(*me, (*i)->getUnitGuid()))
|
||||
if (target->IsAlive() && !me->IsWithinDist(target, 35, false))
|
||||
DoCast(target, SPELL_THUNDERING_STORM, true);
|
||||
events.ScheduleEvent(EVENT_THUNDERING_STORM, 15000);
|
||||
break;
|
||||
}
|
||||
case EVENT_SONIC_SHOCK:
|
||||
if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20, false))
|
||||
if (target->IsAlive())
|
||||
DoCast(target, SPELL_SONIC_SHOCK);
|
||||
events.ScheduleEvent(EVENT_SONIC_SHOCK, 10000+rand()%10000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Select nearest most aggro target if top aggro too far
|
||||
if (!me->isAttackReady())
|
||||
return;
|
||||
|
||||
if (!me->IsWithinMeleeRange(me->GetVictim()))
|
||||
{
|
||||
ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList();
|
||||
@@ -206,6 +188,11 @@ public:
|
||||
|
||||
DoMeleeAttackIfReady();
|
||||
}
|
||||
|
||||
CreatureAI* GetAI(Creature* creature) const
|
||||
{
|
||||
return new boss_murmurAI (creature);
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user