Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_doomwalker.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
17
28
37
39{
40 public:
41 boss_doomwalker() : CreatureScript("boss_doomwalker") { }
42
44 {
45 boss_doomwalkerAI(Creature* creature) : ScriptedAI(creature)
46 {
47 }
48
50 {
51 _events.Reset();
52 _events.ScheduleEvent(EVENT_ENRAGE, 0);
53 _events.ScheduleEvent(EVENT_ARMOR, std::rand() % 13000 + 5000);
54 _events.ScheduleEvent(EVENT_CHAIN, std::rand() % 30000 + 10000);
55 _events.ScheduleEvent(EVENT_QUAKE, std::rand() % 35000 + 25000);
56 _events.ScheduleEvent(EVENT_OVERRUN, std::rand() % 45000 + 30000);
57 _inEnrage = false;
58 }
59
60 void KilledUnit(Unit* victim) OVERRIDE
61 {
62 victim->CastSpell(victim, SPELL_MARK_DEATH, 0);
63
64 if (std::rand() % 4)
65 return;
66
68 }
69
70 void JustDied(Unit* /*killer*/) OVERRIDE
71 {
73 }
74
75 void EnterCombat(Unit* /*who*/) OVERRIDE
76 {
78 }
79
81
82 {
83 if (who && who->GetTypeId() == TypeID::TYPEID_PLAYER && me->IsValidAttackTarget(who))
84 if (who->HasAura(SPELL_MARK_DEATH, 0))
85 who->CastSpell(who, SPELL_AURA_DEATH, 1);
86 }
87
89 {
90 if (!UpdateVictim())
91 return;
92
93 _events.Update(diff);
94
95 if (me->HasUnitState(UNIT_STATE_CASTING))
96 return;
97
98 while (uint32 eventId = _events.ExecuteEvent())
99 {
100 switch (eventId)
101 {
102 case EVENT_ENRAGE:
103 if (!HealthAbovePct(20))
104 {
106 _events.ScheduleEvent(EVENT_ENRAGE, 6000);
107 _inEnrage = true;
108 }
109 break;
110 case EVENT_OVERRUN:
113 _events.ScheduleEvent(EVENT_OVERRUN, std::rand() % 40000 + 25000);
114 break;
115 case EVENT_QUAKE:
116 if (std::rand() % 1)
117 return;
118
120
121 //remove enrage before casting earthquake because enrage + earthquake = 16000dmg over 8sec and all dead
122 if (_inEnrage)
123 me->RemoveAurasDueToSpell(SPELL_ENRAGE);
124
126 _events.ScheduleEvent(EVENT_QUAKE, std::rand() % 55000 + 30000);
127 break;
128 case EVENT_CHAIN:
129 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
131 _events.ScheduleEvent(EVENT_CHAIN, std::rand() % 27000 + 7000);
132 break;
133 case EVENT_ARMOR:
135 _events.ScheduleEvent(EVENT_ARMOR, std::rand() % 25000 + 10000);
136 break;
137 default:
138 break;
139 }
140 }
142 }
143
144 private:
147 };
148
150 {
151 return new boss_doomwalkerAI(creature);
152 }
153};
154
156{
157 new boss_doomwalker();
158}
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ TYPEID_PLAYER
Definition Object.h:55
@ UNIT_STATE_CASTING
Definition Unit.h:527
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ SPELL_ENRAGE
@ EVENT_ENRAGE
@ SAY_SLAY
#define SAY_DEATH
#define SAY_AGGRO
@ SPELL_ENRAGE
@ SPELL_EARTHQUAKE
@ SPELL_MARK_DEATH
@ SPELL_SUNDER_ARMOR
@ SPELL_AURA_DEATH
@ SPELL_CHAIN_LIGHTNING
@ SPELL_OVERRUN
@ SAY_DEATH
@ SAY_AGGRO
@ SAY_EARTHQUAKE
@ SAY_OVERRUN
@ SAY_SLAY
void AddSC_boss_doomwalker()
@ EVENT_ENRAGE
@ EVENT_ARMOR
@ EVENT_OVERRUN
@ EVENT_QUAKE
@ EVENT_CHAIN
@ SPELL_EARTHQUAKE
@ EVENT_CHAIN
@ SPELL_CHAIN_LIGHTNING
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
CreatureScript(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
CreatureAI * GetAI(Creature *creature) const OVERRIDE
Creature * me
bool HealthAbovePct(uint32 pct) const
ScriptedAI(Creature *creature)
void KilledUnit(Unit *victim) OVERRIDE
void MoveInLineOfSight(Unit *who) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================