Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_bronjahm.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#include "ScriptMgr.h"
7#include "ScriptedCreature.h"
8#include "SpellScript.h"
9#include "SpellAuraEffects.h"
10#include "forge_of_souls.h"
11
20
22{
28 SPELL_FEAR = 68950,
30 SPELL_SOULSTORM_CHANNEL = 69008, // pre-fight
31 SPELL_SOULSTORM_VISUAL = 68870, // pre-cast soulstorm
32 SPELL_PURPLE_BANISH_VISUAL = 68862 // Used by Soul Fragment (Aura)
33};
34
43
45{
48};
49
51{
52 public:
53 boss_bronjahm() : CreatureScript("boss_bronjahm") { }
54
55 struct boss_bronjahmAI : public BossAI
56 {
58 {
60 }
61
63 {
64 if (!instance || static_cast<InstanceMap*>(me->GetMap())->GetScriptId() != sObjectMgr->GetScriptId(FoSScriptName))
65 me->IsAIEnabled = false;
66 else if (!me->isDead())
67 Reset();
68 }
69
71 {
72 events.Reset();
73 events.SetPhase(PHASE_1);
74 events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
75 events.ScheduleEvent(EVENT_MAGIC_BANE, std::rand() % 20000 + 8000);
76 events.ScheduleEvent(EVENT_CORRUPT_SOUL, std::rand() % 35000 + 25000, 0, PHASE_1);
77
78 instance->SetBossState(DATA_BRONJAHM, NOT_STARTED);
79 }
80
85
86 void EnterCombat(Unit* /*who*/) OVERRIDE
87 {
89 me->RemoveAurasDueToSpell(SPELL_SOULSTORM_CHANNEL);
90
91 instance->SetBossState(DATA_BRONJAHM, IN_PROGRESS);
92 }
93
94 void JustDied(Unit* /*killer*/) OVERRIDE
95 {
97
98 instance->SetBossState(DATA_BRONJAHM, DONE);
99 }
100
102 {
103 if (who->GetTypeId() == TypeID::TYPEID_PLAYER)
104 Talk(SAY_SLAY);
105 }
106
107 void DamageTaken(Unit* /*attacker*/, uint32& /*damage*/) OVERRIDE
108 {
109 if (events.IsInPhase(PHASE_1) && !HealthAbovePct(30))
110 {
111 events.SetPhase(PHASE_2);
113 events.ScheduleEvent(EVENT_FEAR, std::rand() % 16000 + 12000, 0, PHASE_2);
114 events.ScheduleEvent(EVENT_SOULSTORM, 100, 0, PHASE_2);
115 }
116 }
117
119 {
120 summons.Summon(summon);
121 summon->SetReactState(REACT_PASSIVE);
122 summon->GetMotionMaster()->Clear();
123 summon->GetMotionMaster()->MoveFollow(me, me->GetObjectSize(), 0.0f);
124 summon->CastSpell(summon, SPELL_PURPLE_BANISH_VISUAL, true);
125 }
126
128 {
129 if (!UpdateVictim())
130 return;
131
132 events.Update(diff);
133
134 if (me->HasUnitState(UNIT_STATE_CASTING))
135 return;
136
137 while (uint32 eventId = events.ExecuteEvent())
138 {
139 switch (eventId)
140 {
141 case EVENT_MAGIC_BANE:
143 events.ScheduleEvent(EVENT_MAGIC_BANE, std::rand() % 20000 + 8000);
144 break;
146 if (!me->IsWithinMeleeRange(me->GetVictim()))
148 events.ScheduleEvent(EVENT_SHADOW_BOLT, 2000);
149 break;
151 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
152 {
154 DoCast(target, SPELL_CORRUPT_SOUL);
155 }
156 events.ScheduleEvent(EVENT_CORRUPT_SOUL, std::rand() % 35000 + 25000, 0, PHASE_1);
157 break;
158 case EVENT_SOULSTORM:
160 me->CastSpell(me, SPELL_SOULSTORM_VISUAL, true);
161 me->CastSpell(me, SPELL_SOULSTORM, false);
162 break;
163 case EVENT_FEAR:
164 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
165 me->CastCustomSpell(SPELL_FEAR, SPELLVALUE_MAX_TARGETS, 1, target, false);
166 events.ScheduleEvent(EVENT_FEAR, std::rand() % 12000 + 8000, 0, PHASE_2);
167 break;
168 default:
169 break;
170 }
171 }
172
174 }
175 };
176
178 {
179 return new boss_bronjahmAI(creature);
180 }
181};
182
184{
185 public:
186 npc_corrupted_soul_fragment() : CreatureScript("npc_corrupted_soul_fragment") { }
187
189 {
191 {
192 instance = me->GetInstanceScript();
193 }
194
196 {
197 if (type != CHASE_MOTION_TYPE)
198 return;
199
200 if (instance)
201 {
202 if (TempSummon* summ = me->ToTempSummon())
203 {
204 uint64 BronjahmGUID = instance->GetData64(DATA_BRONJAHM);
205 if (GUID_LOPART(BronjahmGUID) != id)
206 return;
207
208 if (Creature* bronjahm = ObjectAccessor::GetCreature(*me, BronjahmGUID))
209 me->CastSpell(bronjahm, SPELL_CONSUME_SOUL, true);
210
211 summ->UnSummon();
212 }
213 }
214 }
215
216 private:
218 };
219
221 {
222 return new npc_corrupted_soul_fragmentAI(creature);
223 }
224};
225
227{
228 public:
229 spell_bronjahm_magic_bane() : SpellScriptLoader("spell_bronjahm_magic_bane") { }
230
232 {
234
236 {
237 if (GetHitUnit()->getPowerType() != POWER_MANA)
238 return;
239
240 const int32 maxDamage = GetCaster()->GetMap()->GetSpawnMode() == 1 ? 15000 : 10000;
241 int32 newDamage = GetHitDamage();
242 newDamage += GetHitUnit()->GetMaxPower(POWER_MANA)/2;
243 newDamage = std::min<int32>(maxDamage, newDamage);
244
245 SetHitDamage(newDamage);
246 }
247
252 };
253
258};
259
286
314
345
347{
348 public:
349 explicit DistanceCheck(Unit* _caster) : caster(_caster) { }
350
351 bool operator() (WorldObject* unit) const
352 {
353 if (caster->GetExactDist2d(unit) <= 10.0f)
354 return true;
355 return false;
356 }
357
359};
360
396
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
std::uint64_t uint64
Definition Define.h:76
@ IN_PROGRESS
@ DONE
@ NOT_STARTED
@ CHASE_MOTION_TYPE
@ TYPEID_PLAYER
Definition Object.h:55
uint32 GUID_LOPART(uint64 x)
#define sObjectMgr
Definition ObjectMgr.h:1617
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ POWER_MANA
@ SPELL_EFFECT_SCRIPT_EFFECT
@ TARGET_UNIT_DEST_AREA_ENEMY
@ SPELL_AURA_PERIODIC_DUMMY
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellHitFn(F)
@ SPELLVALUE_MAX_TARGETS
Definition Unit.h:118
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ REACT_PASSIVE
Definition Unit.h:1156
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ SAY_SLAY
@ SAY_DEATH
@ SAY_AGGRO
@ SAY_SLAY
@ SAY_CORRUPT_SOUL
@ SAY_SOUL_STORM
void AddSC_boss_bronjahm()
@ SPELL_CONSUME_SOUL
@ SPELL_PURPLE_BANISH_VISUAL
@ SPELL_FEAR
@ SPELL_SOULSTORM_CHANNEL
@ SPELL_TELEPORT
@ SPELL_SHADOW_BOLT
@ SPELL_MAGIC_S_BANE
@ SPELL_SOULSTORM
@ SPELL_SOULSTORM_VISUAL
@ SPELL_CORRUPT_SOUL
@ PHASE_2
@ PHASE_1
@ EVENT_CORRUPT_SOUL
@ EVENT_FEAR
@ EVENT_MAGIC_BANE
@ EVENT_SOULSTORM
@ EVENT_SHADOW_BOLT
#define SAY_DEATH
#define SAY_AGGRO
@ SPELL_SHADOW_BOLT
CombatPhases
@ SPELL_FEAR
@ EVENT_FEAR
@ EVENT_SHADOW_BOLT
uint32 GetTickNumber() const
void PreventDefaultAction()
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetTarget() const
InstanceScript *const instance
SummonList summons
EventMap events
BossAI(Creature *creature, uint32 bossId)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(const char *name)
bool operator()(WorldObject *unit) const
DistanceCheck(Unit *_caster)
uint32 GetScriptId() const
Definition Map.h:646
uint8 GetSpawnMode() const
Definition Map.h:358
static Creature * GetCreature(WorldObject const &u, uint64 guid)
HookList< HitHandler > OnHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
HookList< EffectHandler > OnEffectHitTarget
Unit * GetHitUnit()
int32 GetEffectValue()
void SetHitDamage(int32 damage)
Unit * GetCaster()
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
int32 GetHitDamage()
SpellScriptLoader(const char *name)
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 DoCastVictim(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:168
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)
int32 GetMaxPower(Powers power) const
Definition Unit.cpp:5246
Map * GetMap() const
Definition Object.h:740
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
PrepareSpellScript(spell_bronjahm_consume_soul_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
PrepareSpellScript(spell_bronjahm_magic_bane_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
#define FoSScriptName
@ DATA_BRONJAHM
Creature * me
bool HealthAbovePct(uint32 pct) const
ScriptedAI(Creature *creature)
void KilledUnit(Unit *who) OVERRIDE
boss_bronjahmAI(Creature *creature)
void EnterCombat(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void DamageTaken(Unit *, uint32 &) OVERRIDE
void JustSummoned(Creature *summon) OVERRIDE
void JustDied(Unit *) OVERRIDE