Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
boss_rotface.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 "ObjectMgr.h"
7#include "ScriptMgr.h"
8#include "ScriptedCreature.h"
9#include "SpellAuras.h"
10#include "GridNotifiers.h"
11#include "icecrown_citadel.h"
12
13// KNOWN BUGS:
14// ~ No Slime Spray animation directly at target spot
15
31
33{
34 // Rotface
35 SPELL_SLIME_SPRAY = 69508, // every 20 seconds
36 SPELL_MUTATED_INFECTION = 69674, // hastens every 1:30
38
39 // Oozes
40 SPELL_LITTLE_OOZE_COMBINE = 69537, // combine 2 Small Oozes
41 SPELL_LARGE_OOZE_COMBINE = 69552, // combine 2 Large Oozes
42 SPELL_LARGE_OOZE_BUFF_COMBINE = 69611, // combine Large and Small Ooze
43 SPELL_OOZE_MERGE = 69889, // 2 Small Oozes summon a Large Ooze
44 SPELL_WEAK_RADIATING_OOZE = 69750, // passive damage aura - small
45 SPELL_RADIATING_OOZE = 69760, // passive damage aura - large
46 SPELL_UNSTABLE_OOZE = 69558, // damage boost and counter for explosion
47 SPELL_GREEN_ABOMINATION_HITTIN__YA_PROC = 70001, // prevents getting hit by infection
51
52 // Precious
56
57 // Professor Putricide
60};
61
62#define MUTATED_INFECTION RAID_MODE<int32>(69674, 71224, 73022, 73023)
63
79
81{
82 public:
83 boss_rotface() : CreatureScript("boss_rotface") { }
84
85 struct boss_rotfaceAI : public BossAI
86 {
88 {
90 infectionCooldown = 14000;
91 }
92
94 {
95 _Reset();
96 events.ScheduleEvent(EVENT_SLIME_SPRAY, 20000);
97 events.ScheduleEvent(EVENT_HASTEN_INFECTIONS, 90000);
98 events.ScheduleEvent(EVENT_MUTATED_INFECTION, 14000);
99 if (IsHeroic())
100 events.ScheduleEvent(EVENT_VILE_GAS, std::rand() % 27000 + 22000);
101
102 infectionStage = 0;
103 infectionCooldown = 14000;
104 }
105
107 {
108 if (!instance->CheckRequiredBosses(DATA_ROTFACE, who->ToPlayer()))
109 {
111 instance->DoCastSpellOnPlayers(LIGHT_S_HAMMER_TELEPORT);
112 return;
113 }
114
115 me->setActive(true);
117 if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)))
118 professor->AI()->DoAction(ACTION_ROTFACE_COMBAT);
119
122 }
123
124 void JustDied(Unit* /*killer*/) OVERRIDE
125 {
126 instance->DoRemoveAurasDueToSpellOnPlayers(MUTATED_INFECTION);
127 _JustDied();
129 if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)))
130 professor->AI()->DoAction(ACTION_ROTFACE_DEATH);
131 }
132
134 {
136 instance->SetBossState(DATA_ROTFACE, FAIL);
137 instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(true)); // reset
138 }
139
141 {
142 if (victim->GetTypeId() == TypeID::TYPEID_PLAYER)
143 Talk(SAY_KILL);
144 }
145
147 {
149 if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)))
150 professor->AI()->EnterEvadeMode();
151 }
152
153 void SpellHitTarget(Unit* /*target*/, SpellInfo const* spell) OVERRIDE
154 {
155 if (spell->Id == SPELL_SLIME_SPRAY)
157 }
158
160 {
161 // don't enter combat
162 }
163
165 {
166 if (summon->GetEntry() == NPC_VILE_GAS_STALKER)
167 if (Creature* professor = Unit::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE)))
168 professor->CastSpell(summon, SPELL_VILE_GAS_H, true);
169 }
170
172 {
173 if (!UpdateVictim() || !CheckInRoom())
174 return;
175
176 events.Update(diff);
177
178 if (me->HasUnitState(UNIT_STATE_CASTING))
179 return;
180
181 while (uint32 eventId = events.ExecuteEvent())
182 {
183 switch (eventId)
184 {
186 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1, 0.0f, true))
187 {
191 }
192 events.ScheduleEvent(EVENT_SLIME_SPRAY, 20000);
193 break;
195 if (infectionStage++ < 4)
196 {
197 infectionCooldown -= 2000;
198 events.ScheduleEvent(EVENT_HASTEN_INFECTIONS, 90000);
199 }
200 break;
202 me->CastCustomSpell(SPELL_MUTATED_INFECTION, SPELLVALUE_MAX_TARGETS, 1, NULL, false);
204 break;
205 case EVENT_VILE_GAS:
207 events.ScheduleEvent(EVENT_VILE_GAS, std::rand() % 35000 + 30000);
208 break;
209 default:
210 break;
211 }
212 }
213
215 }
216
217 private:
220 };
221
223 {
225 }
226};
227
229{
230 public:
231 npc_little_ooze() : CreatureScript("npc_little_ooze") { }
232
234 {
235 npc_little_oozeAI(Creature* creature) : ScriptedAI(creature)
236 {
237 }
238
239 void IsSummonedBy(Unit* summoner) OVERRIDE
240 {
244 events.ScheduleEvent(EVENT_STICKY_OOZE, 5000);
245 me->AddThreat(summoner, 500000.0f);
246 }
247
248 void JustDied(Unit* /*killer*/) OVERRIDE
249 {
250 me->DespawnOrUnsummon();
251 }
252
254 {
255 if (!UpdateVictim())
256 return;
257
258 events.Update(diff);
259
260 if (events.ExecuteEvent() == EVENT_STICKY_OOZE)
261 {
263 events.ScheduleEvent(EVENT_STICKY_OOZE, 15000);
264 }
265
267 }
268
269 private:
271 };
272
274 {
276 }
277};
278
280{
281 public:
282 npc_big_ooze() : CreatureScript("npc_big_ooze") { }
283
285 {
286 npc_big_oozeAI(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript())
287 {
288 }
289
290 void IsSummonedBy(Unit* /*summoner*/) OVERRIDE
291 {
297 events.ScheduleEvent(EVENT_STICKY_OOZE, 5000);
298 // register in Rotface's summons - not summoned with Rotface as owner
299 if (Creature* rotface = Unit::GetCreature(*me, instance->GetData64(DATA_ROTFACE)))
300 rotface->AI()->JustSummoned(me);
301 }
302
303 void JustDied(Unit* /*killer*/) OVERRIDE
304 {
305 if (Creature* rotface = Unit::GetCreature(*me, instance->GetData64(DATA_ROTFACE)))
306 rotface->AI()->SummonedCreatureDespawn(me);
307 me->DespawnOrUnsummon();
308 }
309
311 {
312 if (action == EVENT_STICKY_OOZE)
313 events.CancelEvent(EVENT_STICKY_OOZE);
314 }
315
317 {
318 if (!UpdateVictim())
319 return;
320
321 events.Update(diff);
322
323 while (uint32 eventId = events.ExecuteEvent())
324 {
325 switch (eventId)
326 {
329 events.ScheduleEvent(EVENT_STICKY_OOZE, 15000);
330 default:
331 break;
332 }
333 }
334
335 if (me->IsVisible())
337 }
338
339 private:
342 };
343
345 {
347 }
348};
349
351{
352 public:
353 npc_precious_icc() : CreatureScript("npc_precious_icc") { }
354
356 {
358 {
359 _instance = creature->GetInstanceScript();
360 }
361
363 {
364 _events.Reset();
365 _events.ScheduleEvent(EVENT_DECIMATE, std::rand() % 25000 + 20000);
366 _events.ScheduleEvent(EVENT_MORTAL_WOUND, std::rand() % 7000 + 3000);
367 _events.ScheduleEvent(EVENT_SUMMON_ZOMBIES, std::rand() % 22000 + 20000);
368 _summons.DespawnAll();
369 }
370
372 {
373 _summons.Summon(summon);
374 if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0))
375 summon->AI()->AttackStart(target);
376 }
377
379 {
380 _summons.Despawn(summon);
381 }
382
383 void JustDied(Unit* /*killer*/) OVERRIDE
384 {
385 _summons.DespawnAll();
386 if (Creature* rotface = Unit::GetCreature(*me, _instance->GetData64(DATA_ROTFACE)))
387 if (rotface->IsAlive())
388 rotface->AI()->Talk(SAY_PRECIOUS_DIES);
389 }
390
392 {
393 if (!UpdateVictim())
394 return;
395
396 _events.Update(diff);
397
398 if (me->HasUnitState(UNIT_STATE_CASTING))
399 return;
400
401 while (uint32 eventId = _events.ExecuteEvent())
402 {
403 switch (eventId)
404 {
405 case EVENT_DECIMATE:
407 _events.ScheduleEvent(EVENT_DECIMATE, std::rand() % 25000 + 20000);
408 break;
411 _events.ScheduleEvent(EVENT_MORTAL_WOUND, std::rand() % 12500 + 10000);
412 break;
415 for (uint32 i = 0; i < 11; ++i)
417 _events.ScheduleEvent(EVENT_SUMMON_ZOMBIES, std::rand() % 22000 + 20000);
418 break;
419 default:
420 break;
421 }
422 }
423
425 }
426
427 private:
431 };
432
434 {
436 }
437};
438
440{
441 public:
442 spell_rotface_ooze_flood() : SpellScriptLoader("spell_rotface_ooze_flood") { }
443
445 {
447
448 void HandleScript(SpellEffIndex /*effIndex*/)
449 {
450 if (!GetHitUnit())
451 return;
452
453 std::list<Creature*> triggers;
454 GetHitUnit()->GetCreatureListWithEntryInGrid(triggers, GetHitUnit()->GetEntry(), 12.5f);
455
456 if (triggers.empty())
457 return;
458
460 GetHitUnit()->CastSpell(triggers.back(), uint32(GetEffectValue()), false, NULL, NULL, GetOriginalCaster() ? GetOriginalCaster()->GetGUID() : 0);
461 }
462
463 void FilterTargets(std::list<WorldObject*>& targets)
464 {
465 // get 2 targets except 2 nearest
467
468 // .resize() runs pop_back();
469 if (targets.size() > 4)
470 targets.resize(4);
471
472 while (targets.size() > 2)
473 targets.pop_front();
474 }
475
481 };
482
487};
488
490{
491 public:
492 spell_rotface_mutated_infection() : SpellScriptLoader("spell_rotface_mutated_infection") { }
493
495 {
497
499 {
500 _target = NULL;
501 return true;
502 }
503
504 void FilterTargets(std::list<WorldObject*>& targets)
505 {
506 // remove targets with this aura already
507 // tank is not on this list
508 targets.remove_if(Skyfire::UnitAuraCheck(true, GetSpellInfo()->Id));
509 if (targets.empty())
510 return;
511
513 targets.clear();
514 targets.push_back(target);
515 _target = target;
516 }
517
518 void ReplaceTargets(std::list<WorldObject*>& targets)
519 {
520 targets.clear();
521 if (_target)
522 targets.push_back(_target);
523 }
524
526 {
527 if (Creature* caster = GetCaster()->ToCreature())
528 if (Unit* target = GetHitUnit())
529 caster->AI()->Talk(EMOTE_MUTATED_INFECTION, target);
530 }
531
539
541 };
542
547};
548
580
582{
583 public:
584 spell_rotface_large_ooze_combine() : SpellScriptLoader("spell_rotface_large_ooze_combine") { }
585
587 {
589
590 void HandleScript(SpellEffIndex /*effIndex*/)
591 {
592 if (!(GetHitCreature() && GetHitCreature()->IsAlive()))
593 return;
594
595 if (Aura* unstable = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE))
596 {
597 if (Aura* targetAura = GetHitCreature()->GetAura(SPELL_UNSTABLE_OOZE))
598 unstable->ModStackAmount(targetAura->GetStackAmount());
599 else
600 unstable->ModStackAmount(1);
601
602 // no idea why, but this does not trigger explosion on retail (only small+large do)
603 }
604
605 // just for safety
609 }
610
615 };
616
621};
622
624{
625 public:
626 spell_rotface_large_ooze_buff_combine() : SpellScriptLoader("spell_rotface_large_ooze_buff_combine") { }
627
629 {
631
632 void HandleScript(SpellEffIndex /*effIndex*/)
633 {
634 if (!(GetHitCreature() && GetHitCreature()->IsAlive()))
635 return;
636
637 if (Aura* unstable = GetCaster()->GetAura(SPELL_UNSTABLE_OOZE))
638 {
639 uint8 newStack = uint8(unstable->GetStackAmount()+1);
640 unstable->SetStackAmount(newStack);
641
642 // explode!
643 if (newStack >= 5)
644 {
647 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
648 if (Creature* rotface = Unit::GetCreature(*GetCaster(), instance->GetData64(DATA_ROTFACE)))
649 if (rotface->IsAlive())
650 {
651 rotface->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION);
652 rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION);
653 }
654
655 if (Creature* cre = GetCaster()->ToCreature())
656 cre->AI()->DoAction(EVENT_STICKY_OOZE);
657 GetCaster()->CastSpell(GetCaster(), SPELL_UNSTABLE_OOZE_EXPLOSION, false, NULL, NULL, GetCaster()->GetGUID());
658 if (InstanceScript* instance = GetCaster()->GetInstanceScript())
659 instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false));
660 }
661 }
662
664 }
665
670 };
671
676};
677
717
719{
720 public:
721 spell_rotface_unstable_ooze_explosion() : SpellScriptLoader("spell_rotface_unstable_ooze_explosion") { }
722
724 {
726
728 {
730 if (!GetExplTargetDest())
731 return;
732
733 uint32 triggered_spell_id = GetSpellInfo()->Effects[effIndex].TriggerSpell;
734
735 float x, y, z;
736 GetExplTargetDest()->GetPosition(x, y, z);
737 // let Rotface handle the cast - caster dies before this executes
738 if (InstanceScript* script = GetCaster()->GetInstanceScript())
739 if (Creature* rotface = script->instance->GetCreature(script->GetData64(DATA_ROTFACE)))
740 rotface->CastSpell(x, y, z, triggered_spell_id, true, NULL, NULL, GetCaster()->GetGUID());
741 }
742
747 };
748
753};
754
787
789{
790 public:
791 spell_rotface_vile_gas_trigger() : SpellScriptLoader("spell_rotface_vile_gas_trigger") { }
792
794 {
796
797 void FilterTargets(std::list<WorldObject*>& targets)
798 {
800 if (targets.empty())
801 return;
802
803 std::list<WorldObject*> ranged, melee;
804 std::list<WorldObject*>::iterator itr = targets.begin();
805 while (itr != targets.end() && (*itr)->GetDistance(GetCaster()) < 5.0f)
806 {
807 melee.push_back((*itr)->ToUnit());
808 ++itr;
809 }
810
811 while (itr != targets.end())
812 {
813 ranged.push_back((*itr)->ToUnit());
814 ++itr;
815 }
816
817 uint32 minTargets = GetCaster()->GetMap()->Is25ManRaid() ? 8 : 3;
818 while (ranged.size() < minTargets)
819 {
820 if (melee.empty())
821 break;
822
824 ranged.push_back(target);
825 melee.remove(target);
826 }
827
828 if (!ranged.empty())
829 Skyfire::Containers::RandomResizeList(ranged, GetCaster()->GetMap()->Is25ManRaid() ? 3 : 1);
830
831 targets.swap(ranged);
832 }
833
839
845 };
846
851};
852
std::int32_t int32
Definition Define.h:73
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define OVERRIDE
Definition Define.h:60
@ FAIL
@ TYPEID_PLAYER
Definition Object.h:55
@ TYPEID_UNIT
Definition Object.h:54
@ TEMPSUMMON_TIMED_DESPAWN
Definition Object.h:70
SpellEffIndex
@ EFFECT_1
@ EFFECT_0
@ EFFECT_2
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_TRIGGER_MISSILE
@ SPELL_EFFECT_FORCE_CAST
@ TARGET_UNIT_SRC_AREA_ENTRY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
#define sSpellMgr
Definition SpellMgr.h:744
#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
@ SELECT_TARGET_RANDOM
Definition UnitAI.h:23
@ SAY_BERSERK
#define SAY_DEATH
#define SAY_AGGRO
#define SAY_KILL
@ SPELL_DECIMATE
@ EVENT_VILE_GAS
@ EVENT_DECIMATE
@ SPELL_MUTATED_INFECTION
@ SPELL_LARGE_OOZE_COMBINE
@ SPELL_UNSTABLE_OOZE_EXPLOSION
@ SPELL_UNSTABLE_OOZE
@ SPELL_UNSTABLE_OOZE_EXPLOSION_TRIGGER
@ SPELL_RADIATING_OOZE
@ SPELL_AWAKEN_PLAGUED_ZOMBIES
@ SPELL_SLIME_SPRAY
@ SPELL_WEAK_RADIATING_OOZE
@ SPELL_VILE_GAS_TRIGGER_SUMMON
@ SPELL_DECIMATE
@ SPELL_VILE_GAS_H
@ SPELL_STICKY_OOZE
@ SPELL_LITTLE_OOZE_COMBINE
@ SPELL_MORTAL_WOUND
@ SPELL_GREEN_ABOMINATION_HITTIN__YA_PROC
@ SPELL_LARGE_OOZE_BUFF_COMBINE
@ SPELL_VILE_GAS_TRIGGER
@ SPELL_OOZE_MERGE
#define MUTATED_INFECTION
void AddSC_boss_rotface()
@ EMOTE_MUTATED_INFECTION
@ SAY_DEATH
@ EMOTE_SLIME_SPRAY
@ SAY_UNSTABLE_EXPLOSION
@ SAY_AGGRO
@ SAY_KILL
@ SAY_SLIME_SPRAY
@ EMOTE_PRECIOUS_ZOMBIES
@ EMOTE_UNSTABLE_EXPLOSION
@ SAY_PRECIOUS_DIES
@ EVENT_VILE_GAS
@ EVENT_SUMMON_ZOMBIES
@ EVENT_SLIME_SPRAY
@ EVENT_MORTAL_WOUND
@ EVENT_STICKY_OOZE
@ EVENT_MUTATED_INFECTION
@ EVENT_HASTEN_INFECTIONS
@ EVENT_DECIMATE
@ SPELL_MORTAL_WOUND
@ EVENT_MORTAL_WOUND
void PreventDefaultAction()
HookList< EffectPeriodicHandler > OnEffectPeriodic
Unit * GetTarget() const
InstanceScript *const instance
void _JustReachedHome()
bool CheckInRoom()
EventMap events
BossAI(Creature *creature, uint32 bossId)
void DoZoneInCombat(Creature *creature=NULL, float maxRangeToNearestTarget=50.0f)
Creature * DoSummon(uint32 entry, Position const &pos, uint32 despawnTime=30000, TempSummonType summonType=TempSummonType::TEMPSUMMON_CORPSE_TIMED_DESPAWN)
void Talk(uint8 id, WorldObject const *whisperTarget=NULL)
bool UpdateVictim()
virtual void EnterEvadeMode()
void DespawnOrUnsummon(uint32 msTimeToDespawn=0)
CreatureScript(const char *name)
bool Is25ManRaid() const
Definition Map.cpp:3063
TypeID GetTypeId() const
Definition Object.h:131
Creature * ToCreature()
Definition Object.h:207
uint32 TriggerSpell
Definition SpellInfo.h:108
SpellEffectInfo Effects[MAX_SPELL_EFFECTS]
Definition SpellInfo.h:255
Creature * GetHitCreature()
WorldLocation const * GetExplTargetDest()
HookList< HitHandler > AfterHit
SpellInfo const * GetSpellInfo()
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
HookList< EffectHandler > OnEffectHitTarget
void PreventHitEffect(SpellEffIndex effIndex)
Unit * GetHitUnit()
int32 GetEffectValue()
Unit * GetOriginalCaster()
Unit * GetCaster()
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
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
void DoCastAOE(uint32 spellId, bool triggered=false)
Definition UnitAI.cpp:176
Definition Unit.h:1367
void SetVisible(bool x)
Definition Unit.cpp:4163
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)
void RemoveAurasDueToSpell(uint32 spellId, uint64 casterGUID=0, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
static Creature * GetCreature(WorldObject &object, uint64 guid)
Definition Unit.cpp:4905
void RemoveAllAuras()
Map * GetMap() const
Definition Object.h:740
InstanceScript * GetInstanceScript()
Definition Object.cpp:1612
void GetCreatureListWithEntryInGrid(std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
Definition Object.cpp:2841
TempSummon * SummonCreature(uint32 id, Position const &pos, TempSummonType spwtype=TempSummonType::TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0) const
Definition Object.cpp:2703
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
CreatureAI * GetAI(Creature *creature) const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
void FilterTargets(std::list< WorldObject * > &targets)
PrepareSpellScript(spell_rotface_ooze_flood_SpellScript)
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
AuraScript * GetAuraScript() const OVERRIDE
SpellScript * GetSpellScript() const OVERRIDE
SpellScript * GetSpellScript() const
@ NPC_OOZE_SPRAY_STALKER
@ NPC_VILE_GAS_STALKER
@ NPC_UNSTABLE_EXPLOSION_STALKER
CreatureAI * GetIcecrownCitadelAI(Creature *creature)
@ ACTION_ROTFACE_COMBAT
@ ACTION_ROTFACE_DEATH
@ LIGHT_S_HAMMER_TELEPORT
@ DATA_OOZE_DANCE_ACHIEVEMENT
@ DATA_ROTFACE
@ DATA_PROFESSOR_PUTRICIDE
void RandomResizeList(std::list< T > &list, uint32 size)
Definition Containers.h:19
C::value_type const & SelectRandomContainerElement(C const &container)
Definition Containers.h:48
void GetPosition(float &x, float &y) const
Definition Object.h:333
bool IsHeroic() const
Creature * me
ScriptedAI(Creature *creature)
void KilledUnit(Unit *victim) OVERRIDE
void JustSummoned(Creature *summon) OVERRIDE
void SpellHitTarget(Unit *, SpellInfo const *spell) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void EnterCombat(Unit *who) OVERRIDE
void JustDied(Unit *) OVERRIDE
boss_rotfaceAI(Creature *creature)
void MoveInLineOfSight(Unit *) OVERRIDE
void IsSummonedBy(Unit *) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
npc_big_oozeAI(Creature *creature)
void JustDied(Unit *) OVERRIDE
void DoAction(int32 action) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void IsSummonedBy(Unit *summoner) OVERRIDE
void JustSummoned(Creature *summon) OVERRIDE
void UpdateAI(uint32 diff) OVERRIDE
== Triggered Actions Requested ==================
void SummonedCreatureDespawn(Creature *summon) OVERRIDE