Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_murmur.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6/* ScriptData
7SDName: Boss_Murmur
8SD%Complete: 90
9SDComment: Timers may be incorrect
10SDCategory: Auchindoun, Shadow Labyrinth
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "SpellScript.h"
16#include "shadow_labyrinth.h"
17
31
41
43{
44 public:
45 boss_murmur() : CreatureScript("boss_murmur") { }
46
47 struct boss_murmurAI : public BossAI
48 {
49 boss_murmurAI(Creature* creature) : BossAI(creature, DATA_MURMUR)
50 {
51 SetCombatMovement(false);
52 }
53
55 {
56 _Reset();
57 events.ScheduleEvent(EVENT_SONIC_BOOM, 30000);
58 events.ScheduleEvent(EVENT_MURMURS_TOUCH, std::rand() % 20000 + 8000);
59 events.ScheduleEvent(EVENT_RESONANCE, 5000);
60 events.ScheduleEvent(EVENT_MAGNETIC_PULL, std::rand() % 30000 + 15000);
61 if (IsHeroic())
62 {
63 events.ScheduleEvent(EVENT_THUNDERING_STORM, 15000);
64 events.ScheduleEvent(EVENT_SONIC_SHOCK, 10000);
65 }
66
67 // database should have `RegenHealth`=0 to prevent regen
68 uint32 hp = me->CountPctFromMaxHealth(40);
69 if (hp)
70 me->SetHealth(hp);
71 me->ResetPlayerDamageReq();
72 }
73
74 void EnterCombat(Unit* /*who*/) OVERRIDE
75 {
77 }
78
79 void JustDied(Unit* /*killer*/) OVERRIDE
80 {
81 _JustDied();
82 }
83
85 {
86 if (!UpdateVictim())
87 return;
88
89 events.Update(diff);
90
91 if (me->HasUnitState(UNIT_STATE_CASTING))
92 return;
93
94 while (uint32 eventId = events.ExecuteEvent())
95 {
96 switch (eventId)
97 {
101 events.ScheduleEvent(EVENT_SONIC_BOOM, 30000);
102 events.ScheduleEvent(EVENT_RESONANCE, 1500);
103 break;
105 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 80.0f, true))
107 events.ScheduleEvent(EVENT_MURMURS_TOUCH, std::rand() % 35000 + 25000);
108 break;
109 case EVENT_RESONANCE:
110 if (!(me->IsWithinMeleeRange(me->GetVictim())))
111 {
113 events.ScheduleEvent(EVENT_RESONANCE, 5000);
114 }
115 break;
117 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0.0f, true))
118 {
120 events.ScheduleEvent(EVENT_MAGNETIC_PULL, std::rand() % 30000 + 15000);
121 break;
122 }
123 events.ScheduleEvent(EVENT_MAGNETIC_PULL, 500);
124 break;
127 events.ScheduleEvent(EVENT_THUNDERING_STORM, 15000);
128 break;
130 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 20.0f, false))
131 DoCast(target, SPELL_SONIC_SHOCK);
132 events.ScheduleEvent(EVENT_SONIC_SHOCK, std::rand() % 20000 + 10000);
133 break;
134 }
135 }
136
137 // Select nearest most aggro target if top aggro too far
138 if (!me->isAttackReady())
139 return;
140
141 if (!me->IsWithinMeleeRange(me->GetVictim()))
142 {
143 ThreatContainer::StorageType threatlist = me->getThreatManager().getThreatList();
144 for (ThreatContainer::StorageType::const_iterator i = threatlist.begin(); i != threatlist.end(); ++i)
145 if (Unit* target = ObjectAccessor::GetUnit(*me, (*i)->getUnitGuid()))
146 if (me->IsWithinMeleeRange(target))
147 {
148 me->TauntApply(target);
149 break;
150 }
151 }
152
154 }
155 };
156
158 {
160 }
161};
162
163// 33923, 38796 - Sonic Boom
165{
166 public:
167 spell_murmur_sonic_boom() : SpellScriptLoader("spell_murmur_sonic_boom") { }
168
170 {
172
173 bool Validate(SpellInfo const* /*spellInfo*/) OVERRIDE
174 {
175 if (!sSpellMgr->GetSpellInfo(SPELL_SONIC_BOOM_EFFECT))
176 return false;
177 return true;
178 }
179
180 void HandleEffect(SpellEffIndex /*effIndex*/)
181 {
183 }
184
189 };
190
195};
196
197// 33666, 38795 - Sonic Boom Effect
199{
200 public:
201 spell_murmur_sonic_boom_effect() : SpellScriptLoader("spell_murmur_sonic_boom_effect") { }
202
218
223};
224
226{
227 public:
229
231 {
232 float distSq = _source->GetExactDist2dSq(obj);
233 return distSq < (25.0f * 25.0f) || distSq > (100.0f * 100.0f);
234 }
235
236 private:
238};
239
240// 39365 - Thundering Storm
266
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
SpellEffIndex
@ EFFECT_0
@ SPELL_EFFECT_DUMMY
@ TARGET_UNIT_SRC_AREA_ENEMY
#define sSpellMgr
Definition SpellMgr.h:744
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define SpellHitFn(F)
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
Murmur
@ SPELL_MURMURS_TOUCH
@ SPELL_MAGNETIC_PULL
@ SPELL_THUNDERING_STORM
@ SPELL_RESONANCE
@ SPELL_SONIC_BOOM_CAST
@ SPELL_SONIC_BOOM_EFFECT
@ EMOTE_SONIC_BOOM
@ SPELL_SONIC_SHOCK
void AddSC_boss_murmur()
@ EVENT_MAGNETIC_PULL
@ EVENT_SONIC_BOOM
@ EVENT_MURMURS_TOUCH
@ EVENT_SONIC_SHOCK
@ EVENT_THUNDERING_STORM
@ EVENT_RESONANCE
@ SPELL_MAGNETIC_PULL
EventMap events
BossAI(Creature *creature, uint32 bossId)
void _EnterCombat()
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
static Unit * GetUnit(WorldObject const &, uint64 guid)
HookList< HitHandler > OnHit
HookList< EffectHandler > OnEffectHit
Unit * GetHitUnit()
void SetHitDamage(int32 damage)
Unit * GetCaster()
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
SpellScriptLoader(const char *name)
std::list< HostileReference * > StorageType
bool operator()(WorldObject *obj)
WorldObject const * _source
ThunderingStormCheck(WorldObject *source)
void DoMeleeAttackIfReady()
Definition UnitAI.cpp:28
void DoCast(uint32 spellId)
Definition UnitAI.cpp:110
Unit * SelectTarget(SelectAggroTarget targetType, uint32 position=0, float dist=0.0f, bool playerOnly=false, int32 aura=0)
Definition UnitAI.cpp:66
void DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
Definition Unit.h:1367
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
CreatureAI * GetAI(Creature *creature) const OVERRIDE
PrepareSpellScript(spell_murmur_sonic_boom_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
AI * GetShadowLabyrinthAI(Creature *creature)
@ DATA_MURMUR
bool IsHeroic() const
void SetCombatMovement(bool allowMovement)
Creature * me
void JustDied(Unit *) OVERRIDE
boss_murmurAI(Creature *creature)
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void EnterCombat(Unit *) OVERRIDE