Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
mob_anubisath_sentinel.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: npc_anubisath_sentinel
8SD%Complete: 95
9SDComment: Shadow storm is not properly implemented in core it should only target ppl outside of melee range.
10SDCategory: Temple of Ahn'Qiraj
11EndScriptData */
12
13#include "ScriptMgr.h"
14#include "ScriptedCreature.h"
15#include "WorldPacket.h"
16
17#include "Item.h"
18#include "Player.h"
19#include "Spell.h"
20
21#include "Cell.h"
22#include "CellImpl.h"
23#include "GridNotifiers.h"
24#include "GridNotifiersImpl.h"
25
48
50{
51public:
52 npc_anubisath_sentinel() : CreatureScript("npc_anubisath_sentinel") { }
53
55 {
56 return new aqsentinelAI(creature);
57 }
58
59 struct aqsentinelAI : public ScriptedAI
60 {
63
64 void selectAbility(int asel)
65 {
66 switch (asel)
67 {
68 case 0: ability = SPELL_MENDING_BUFF;break;
69 case 1: ability = SPELL_KNOCK_BUFF;break;
70 case 2: ability = SPELL_MANAB_BUFF;break;
71 case 3: ability = SPELL_REFLECTAF_BUFF;break;
72 case 4: ability = SPELL_REFLECTSFr_BUFF;break;
73 case 5: ability = SPELL_THORNS_BUFF;break;
74 case 6: ability = SPELL_THUNDER_BUFF;break;
75 case 7: ability = SPELL_MSTRIKE_BUFF;break;
76 case 8: ability = SPELL_STORM_BUFF;break;
77 }
78 }
79
80 aqsentinelAI(Creature* creature) : ScriptedAI(creature)
81 {
83 abselected = 0; // just initialization of variable
84 }
85
87
89 {
90 NearbyGUID[0] = NearbyGUID[1] = NearbyGUID[2] = 0;
91 }
92
93 void AddBuddyToList(uint64 CreatureGUID)
94 {
95 if (CreatureGUID == me->GetGUID())
96 return;
97
98 for (int i=0; i<3; ++i)
99 {
100 if (NearbyGUID[i] == CreatureGUID)
101 return;
102 if (!NearbyGUID[i])
103 {
104 NearbyGUID[i] = CreatureGUID;
105 return;
106 }
107 }
108 }
109
111 {
112 aqsentinelAI* cai = CAST_AI(aqsentinelAI, (c)->AI());
113 for (int i=0; i<3; ++i)
114 if (NearbyGUID[i] && NearbyGUID[i] != c->GetGUID())
115 cai->AddBuddyToList(NearbyGUID[i]);
116 cai->AddBuddyToList(me->GetGUID());
117 }
118
120 {
121 for (int i=0; i<3; ++i)
122 if (Creature* pNearby = Unit::GetCreature(*me, NearbyGUID[i]))
123 GiveBuddyMyList(pNearby);
124 }
125
127 {
128 for (int i=0; i<3; ++i)
129 {
131 if (c)
132 {
133 if (!c->IsInCombat())
134 {
135 c->SetNoCallAssistance(true);
136 if (c->AI())
137 c->AI()->AttackStart(who);
138 }
139 }
140 }
141 }
142
143 void AddSentinelsNear(Unit* /*nears*/)
144 {
145 std::list<Creature*> assistList;
146 me->GetCreatureListWithEntryInGrid(assistList, 15264, 70.0f);
147
148 if (assistList.empty())
149 return;
150
151 for (std::list<Creature*>::const_iterator iter = assistList.begin(); iter != assistList.end(); ++iter)
152 AddBuddyToList((*iter)->GetGUID());
153 }
154
155 int pickAbilityRandom(bool *chosenAbilities)
156 {
157 for (int t = 0; t < 2; ++t)
158 {
159 for (int i = !t ? (rand()%9) : 0; i < 9; ++i)
160 {
161 if (!chosenAbilities[i])
162 {
163 chosenAbilities[i] = true;
164 return i;
165 }
166 }
167 }
168 return 0; // should never happen
169 }
170
172 {
173 bool *chosenAbilities = new bool[9];
174 memset(chosenAbilities, 0, 9*sizeof(bool));
175 selectAbility(pickAbilityRandom(chosenAbilities));
176
179 int bli;
180 for (bli = 0; bli < 3; ++bli)
181 {
182 if (!NearbyGUID[bli])
183 break;
184
185 Creature* pNearby = Unit::GetCreature(*me, NearbyGUID[bli]);
186 if (!pNearby)
187 break;
188
189 AddSentinelsNear(pNearby);
190 CAST_AI(aqsentinelAI, pNearby->AI())->gatherOthersWhenAggro = false;
191 CAST_AI(aqsentinelAI, pNearby->AI())->selectAbility(pickAbilityRandom(chosenAbilities));
192 }
193 /*if (bli < 3)
194 DoYell("I dont have enough buddies.", LANG_NEUTRAL, 0);*/
197
198 delete[] chosenAbilities;
199 }
200
202
204 {
205 if (!me->isDead())
206 {
207 for (int i=0; i<3; ++i)
208 {
209 if (!NearbyGUID[i])
210 continue;
211 if (Creature* pNearby = Unit::GetCreature(*me, NearbyGUID[i]))
212 {
213 if (pNearby->isDead())
214 pNearby->Respawn();
215 }
216 }
217 }
220 }
221
223 {
224 me->AddAura(id, me);
225 }
226
235
236 void JustDied(Unit* /*killer*/) OVERRIDE
237 {
238 for (int ni=0; ni<3; ++ni)
239 {
241 if (!sent)
242 continue;
243 if (sent->isDead())
244 continue;
245 sent->ModifyHealth(int32(sent->CountPctFromMaxHealth(50)));
246 CAST_AI(aqsentinelAI, sent->AI())->GainSentinelAbility(ability);
247 }
248 }
249 };
250};
251
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
#define CAST_AI(a, b)
@ SPELL_THUNDER
Definition chapter5.cpp:205
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
void SetNoCallAssistance(bool val)
Definition Creature.h:583
CreatureAI * AI() const
Definition Creature.h:483
CreatureScript(const char *name)
uint64 GetGUID() const
Definition Object.h:119
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:16
Definition Unit.h:1367
int32 ModifyHealth(int32 val)
Definition Unit.cpp:4023
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
uint32 CountPctFromMaxHealth(int32 pct) const
Definition Unit.h:1633
bool IsInCombat() const
Definition Unit.h:1896
bool isDead() const
Definition Unit.h:2040
CreatureAI * GetAI(Creature *creature) const OVERRIDE
@ SPELL_REFLECTAF_BUFF
@ SPELL_REFLECTSFr_BUFF
void AddSC_npc_anubisath_sentinel()
Creature * me
ScriptedAI(Creature *creature)