TrinityCore
boss_rotface.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "icecrown_citadel.h"
19#include "Containers.h"
20#include "GridNotifiers.h"
21#include "InstanceScript.h"
22#include "Map.h"
23#include "ObjectAccessor.h"
24#include "ScriptedCreature.h"
25#include "ScriptMgr.h"
26#include "SpellAuras.h"
27#include "SpellScript.h"
28#include "TemporarySummon.h"
29
30// KNOWN BUGS:
31// ~ No Slime Spray animation directly at target spot
32
34{
44
49
51};
52
54{
55 // Rotface
56 SPELL_SLIME_SPRAY = 69508, // every 20 seconds
57 SPELL_MUTATED_INFECTION = 69674, // hastens every 1:30
59
60 // Oozes
61 SPELL_LITTLE_OOZE_COMBINE = 69537, // combine 2 Small Oozes
62 SPELL_LARGE_OOZE_COMBINE = 69552, // combine 2 Large Oozes
63 SPELL_LARGE_OOZE_BUFF_COMBINE = 69611, // combine Large and Small Ooze
64 SPELL_OOZE_MERGE = 69889, // 2 Small Oozes summon a Large Ooze
65 SPELL_WEAK_RADIATING_OOZE = 69750, // passive damage aura - small
66 SPELL_RADIATING_OOZE = 69760, // passive damage aura - large
67 SPELL_UNSTABLE_OOZE = 69558, // damage boost and counter for explosion
68 SPELL_GREEN_ABOMINATION_HITTIN__YA_PROC = 70001, // prevents getting hit by infection
75
76 // Precious
80
81 // Professor Putricide
84};
85
86#define MUTATED_INFECTION RAID_MODE<int32>(69674, 71224, 73022, 73023)
87
89{
90 // Rotface
95
96 // Precious
100
102};
103
104struct boss_rotface : public BossAI
105{
106 boss_rotface(Creature* creature) : BossAI(creature, DATA_ROTFACE)
107 {
108 infectionStage = 0;
109 infectionCooldown = 14s;
110 }
111
112 void Reset() override
113 {
114 _Reset();
118 if (IsHeroic())
120
121 infectionStage = 0;
122 infectionCooldown = 14s;
123 }
124
125 void JustEngagedWith(Unit* who) override
126 {
128 {
131 return;
132 }
133
134 me->setActive(true);
137 professor->AI()->DoAction(ACTION_ROTFACE_COMBAT);
138
141 }
142
143 void JustDied(Unit* /*killer*/) override
144 {
146 _JustDied();
149 professor->AI()->DoAction(ACTION_ROTFACE_DEATH);
150 }
151
152 void JustReachedHome() override
153 {
157 }
158
159 void KilledUnit(Unit* victim) override
160 {
161 if (victim->GetTypeId() == TYPEID_PLAYER)
162 Talk(SAY_KILL);
163 }
164
165 void EnterEvadeMode(EvadeReason why) override
166 {
169 professor->AI()->EnterEvadeMode();
170 }
171
172 void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
173 {
174 if (spellInfo->Id == SPELL_SLIME_SPRAY)
176 }
177
178 void JustSummoned(Creature* summon) override
179 {
180 if (summon->GetEntry() == NPC_VILE_GAS_STALKER)
182 professor->CastSpell(summon, SPELL_VILE_GAS_H, true);
183
184 summons.Summon(summon);
185 }
186
187 void UpdateAI(uint32 diff) override
188 {
189 if (!UpdateVictim())
190 return;
191
192 events.Update(diff);
193
195 return;
196
197 while (uint32 eventId = events.ExecuteEvent())
198 {
199 switch (eventId)
200 {
202 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
203 {
207 }
209 break;
211 if (infectionStage++ < 4)
212 {
213 infectionCooldown -= 2s;
215 }
216 break;
220 break;
221 case EVENT_VILE_GAS:
224 break;
225 default:
226 break;
227 }
228
230 return;
231 }
232 }
233
234private:
237};
238
240{
241 npc_little_ooze(Creature* creature) : ScriptedAI(creature) { }
242
243 void IsSummonedBy(WorldObject* summonerWO) override
244 {
245 Unit* summoner = summonerWO->ToUnit();
246 if (!summoner)
247 return;
252 AddThreat(summoner, 500000.0f);
253 }
254
255 void JustDied(Unit* /*killer*/) override
256 {
258 }
259
260 void UpdateAI(uint32 diff) override
261 {
262 if (!UpdateVictim())
263 return;
264
265 events.Update(diff);
266
268 {
271 }
272 }
273
274private:
276};
277
279{
280 npc_big_ooze(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
281
282 void IsSummonedBy(WorldObject* /*summoner*/) override
283 {
290 // register in Rotface's summons - not summoned with Rotface as owner
292 rotface->AI()->JustSummoned(me);
293 }
294
295 void JustDied(Unit* /*killer*/) override
296 {
298 rotface->AI()->SummonedCreatureDespawn(me);
300 }
301
302 void DoAction(int32 action) override
303 {
304 if (action == EVENT_STICKY_OOZE)
306 }
307
308 void UpdateAI(uint32 diff) override
309 {
310 if (!UpdateVictim())
311 return;
312
313 events.Update(diff);
314
315 while (uint32 eventId = events.ExecuteEvent())
316 {
317 switch (eventId)
318 {
322 break;
323 default:
324 break;
325 }
326 }
327 }
328
329private:
332};
333
335{
336 npc_precious_icc(Creature* creature) : ScriptedAI(creature), _summons(me), _instance(creature->GetInstanceScript()) { }
337
338 void Reset() override
339 {
340 _events.Reset();
345 }
346
347 void JustSummoned(Creature* summon) override
348 {
349 _summons.Summon(summon);
351 summon->AI()->AttackStart(target);
352 }
353
354 void SummonedCreatureDespawn(Creature* summon) override
355 {
356 _summons.Despawn(summon);
357 }
358
359 void JustDied(Unit* /*killer*/) override
360 {
363 if (rotface->IsAlive())
364 rotface->AI()->Talk(SAY_PRECIOUS_DIES);
365 }
366
367 void UpdateAI(uint32 diff) override
368 {
369 if (!UpdateVictim())
370 return;
371
372 _events.Update(diff);
373
375 return;
376
377 while (uint32 eventId = _events.ExecuteEvent())
378 {
379 switch (eventId)
380 {
381 case EVENT_DECIMATE:
384 break;
388 break;
391 for (uint32 i = 0; i < 11; ++i)
394 break;
395 default:
396 break;
397 }
398 }
399 }
400
401private:
405};
406
407// 69782, 69796, 69798, 69801 - Ooze Flood
409{
410 void HandleScript(SpellEffIndex /*effIndex*/)
411 {
412 if (!GetHitUnit())
413 return;
414
415 std::list<Creature*> triggers;
417
418 if (triggers.empty())
419 return;
420
423 .SetOriginalCaster(GetOriginalCaster() ? GetOriginalCaster()->GetGUID() : ObjectGuid::Empty));
424 }
425
426 void FilterTargets(std::list<WorldObject*>& targets)
427 {
428 // get 2 targets except 2 nearest
430
431 // .resize() runs pop_back();
432 if (targets.size() > 4)
433 targets.resize(4);
434
435 while (targets.size() > 2)
436 targets.pop_front();
437 }
438
439 void Register() override
440 {
443 }
444};
445
446// 69674, 71224, 73022, 73023 - Mutated Infection
448{
449 void FilterTargets(std::list<WorldObject*>& targets)
450 {
451 // remove targets with this aura already
452 // tank is not on this list
453 targets.remove_if(Trinity::UnitAuraCheck(true, GetSpellInfo()->Id));
454 if (targets.empty())
455 return;
456
458 targets.clear();
459 targets.push_back(target);
460 }
461
463 {
464 if (Creature* caster = GetCaster()->ToCreature())
465 if (Unit* target = GetHitUnit())
466 caster->AI()->Talk(EMOTE_MUTATED_INFECTION, target);
467 }
468
469 void Register() override
470 {
473 }
474};
475
477{
478 bool Validate(SpellInfo const* spellInfo) override
479 {
480 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } })
481 && ValidateSpellInfo({ uint32(spellInfo->GetEffect(EFFECT_2).CalcValue()) });
482 }
483
485 {
486 Unit* target = GetTarget();
488 .SetTriggeringAura(aurEff)
489 .SetOriginalCaster(GetCasterGUID()));
490 }
491
492 void Register() override
493 {
495 }
496};
497
498// 69538 - Small Ooze Combine
500{
501 void HandleScript(SpellEffIndex /*effIndex*/)
502 {
503 Creature* caster = GetCaster()->ToCreature();
504 if (!(GetHitCreature() && GetHitUnit()->IsAlive()) || !caster)
505 return;
506
509 GetHitCreature()->CastSpell(caster, SPELL_OOZE_MERGE, true);
511 caster->DespawnOrUnsummon();
512 }
513
514 void Register() override
515 {
517 }
518};
519
520// 69553 - Large Ooze Combine
522{
523 void HandleScript(SpellEffIndex /*effIndex*/)
524 {
525 Creature* caster = GetCaster()->ToCreature();
526 Creature* target = GetHitCreature();
527 if (!(target && target->IsAlive()) || !caster)
528 return;
529
530 if (Aura* unstable = caster->GetAura(SPELL_UNSTABLE_OOZE))
531 {
532 if (Aura* targetAura = target->GetAura(SPELL_UNSTABLE_OOZE))
533 unstable->ModStackAmount(targetAura->GetStackAmount());
534 else
535 unstable->ModStackAmount(1);
536
537 if (unstable->GetStackAmount() >= 5)
538 {
541 if (InstanceScript* instance = caster->GetInstanceScript())
542 {
543 if (Creature* rotface = ObjectAccessor::GetCreature(*caster, instance->GetGuidData(DATA_ROTFACE)))
544 {
545 instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false));
546 if (rotface->IsAlive())
547 rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION);
548 }
549 }
550
551 caster->AI()->DoAction(EVENT_STICKY_OOZE);
552 caster->CastSpell(caster, SPELL_UNSTABLE_OOZE_EXPLOSION, CastSpellExtraArgs().SetOriginalCaster(caster->GetGUID()));
553 }
554 }
555 target->DespawnOrUnsummon();
556 }
557
558 void Register() override
559 {
561 }
562};
563
564// 69610 - Large Ooze Buff Combine
566{
567 bool Load() override
568 {
569 return GetCaster()->GetTypeId() == TYPEID_UNIT;
570 }
571
572 void HandleScript(SpellEffIndex /*effIndex*/)
573 {
574 if (!(GetHitCreature() && GetHitCreature()->IsAlive()))
575 return;
576
577 Creature* caster = GetCaster()->ToCreature();
578 if (Aura* unstable = caster->GetAura(SPELL_UNSTABLE_OOZE))
579 {
580 uint8 newStack = uint8(unstable->GetStackAmount()+1);
581 unstable->SetStackAmount(newStack);
582
583 switch (newStack)
584 {
585 case 2:
586 caster->AI()->Talk(EMOTE_UNSTABLE_2, caster);
587 caster->CastSpell(caster, SPELL_VERTEX_COLOR_PINK, true);
588 break;
589 case 3:
590 caster->AI()->Talk(EMOTE_UNSTABLE_3, caster);
591 caster->CastSpell(caster, SPELL_VERTEX_COLOR_BRIGHT_RED, true);
592 break;
593 case 4:
594 caster->AI()->Talk(EMOTE_UNSTABLE_4, caster);
595 caster->CastSpell(caster, SPELL_VERTEX_COLOR_DARK_RED, true);
596 break;
597 case 5:
598 {
599 caster->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION);
602 if (InstanceScript* instance = caster->GetInstanceScript())
603 {
604 instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false));
605 if (Creature* rotface = ObjectAccessor::GetCreature(*caster, instance->GetGuidData(DATA_ROTFACE)))
606 if (rotface->IsAlive())
607 rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION);
608 }
609
610 caster->AI()->DoAction(EVENT_STICKY_OOZE);
611 caster->CastSpell(caster, SPELL_UNSTABLE_OOZE_EXPLOSION, CastSpellExtraArgs().SetOriginalCaster(caster->GetGUID()));
612 break;
613 }
614 default:
615 break;
616 }
617 }
618
620 }
621
622 void Register() override
623 {
625 }
626};
627
628// 69839 - Unstable Ooze Explosion
630{
631 bool Validate(SpellInfo const* /*spell*/) override
632 {
634 }
635
637 {
638 PreventHitEffect(effIndex);
639 if (!GetHitUnit())
640 return;
641
642 float x, y, z;
643 GetHitUnit()->GetPosition(x, y, z);
646 }
647
648 void Register() override
649 {
651 }
652};
653
654// 69832 - Unstable Ooze Explosion
656{
658 {
659 PreventHitDefaultEffect(effIndex);
660 if (!GetExplTargetDest())
661 return;
662
663 uint32 triggered_spell_id = GetEffectInfo().TriggerSpell;
664
665 if (InstanceScript* script = GetCaster()->GetInstanceScript())
666 if (Creature* rotface = script->instance->GetCreature(script->GetGuidData(DATA_ROTFACE)))
667 rotface->CastSpell(*GetExplTargetDest(), triggered_spell_id, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
668 .SetOriginalCaster(GetCaster()->GetGUID()));
669 }
670
671 void Register() override
672 {
674 }
675};
676
677// 71441 - Unstable Ooze Explosion Suicide Trigger
679{
680 void DespawnSelf(AuraEffect const* /*aurEff*/)
681 {
683 Unit* target = GetTarget();
684 if (target->GetTypeId() != TYPEID_UNIT)
685 return;
686
687 target->RemoveAllAuras();
688 target->SetVisible(false);
689 target->ToCreature()->SetCanMelee(false);
690 target->ToCreature()->DespawnOrUnsummon(60s);
691 }
692
693 void Register() override
694 {
696 }
697};
698
699// 72285, 72288 - Vile Gas Trigger
701{
702 void FilterTargets(std::list<WorldObject*>& targets)
703 {
705 if (targets.empty())
706 return;
707
708 std::list<WorldObject*> ranged, melee;
709 std::list<WorldObject*>::iterator itr = targets.begin();
710 while (itr != targets.end() && (*itr)->GetDistance(GetCaster()) < 5.0f)
711 {
712 melee.push_back((*itr)->ToUnit());
713 ++itr;
714 }
715
716 while (itr != targets.end())
717 {
718 ranged.push_back((*itr)->ToUnit());
719 ++itr;
720 }
721
722 uint32 minTargets = GetCaster()->GetMap()->Is25ManRaid() ? 8 : 3;
723 while (ranged.size() < minTargets)
724 {
725 if (melee.empty())
726 break;
727
729 ranged.push_back(target);
730 melee.remove(target);
731 }
732
733 if (!ranged.empty())
734 Trinity::Containers::RandomResize(ranged, GetCaster()->GetMap()->Is25ManRaid() ? 3 : 1);
735
736 targets.swap(ranged);
737 }
738
740 {
741 PreventHitDefaultEffect(effIndex);
743 }
744
745 void Register() override
746 {
749 }
750};
751
752// 69507, 71213, 73189, 73190 - Slime Spray
754{
756 {
757 Player* target = GetHitPlayer();
758 if (!target)
759 return;
760
762 return;
763
765 if (target->GetQuestStatus(questId) != QUEST_STATUS_INCOMPLETE)
766 return;
767
769 }
770
771 void Register() override
772 {
774 }
775};
776
778{
779 // Creatures
784
785 // Spells
796}
Texts
T GetEntry(std::unordered_map< uint32, T > const &map, CriteriaTreeEntry const *tree)
uint8_t uint8
Definition: Define.h:144
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition: Duration.h:29
@ FAIL
@ TEMPSUMMON_TIMED_DESPAWN
Definition: ObjectDefines.h:65
@ TYPEID_UNIT
Definition: ObjectGuid.h:40
@ TYPEID_PLAYER
Definition: ObjectGuid.h:41
Spells
Definition: PlayerAI.cpp:32
@ QUEST_STATUS_INCOMPLETE
Definition: QuestDef.h:145
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
Definition: ScriptMgr.h:1371
#define RegisterSpellScript(spell_script)
Definition: ScriptMgr.h:1369
SpellEffIndex
Definition: SharedDefines.h:29
@ EFFECT_0
Definition: SharedDefines.h:30
@ EFFECT_2
Definition: SharedDefines.h:32
@ TARGET_UNIT_SRC_AREA_ENTRY
@ TARGET_UNIT_SRC_AREA_ENEMY
@ SPELL_EFFECT_DUMMY
@ SPELL_EFFECT_SCRIPT_EFFECT
@ SPELL_EFFECT_TRIGGER_MISSILE
@ SPELL_EFFECT_FORCE_CAST
#define EFFECT_ALL
Definition: SharedDefines.h:72
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
Definition: SpellDefines.h:266
#define SpellEffectFn(F, I, N)
Definition: SpellScript.h:842
#define SpellObjectAreaTargetSelectFn(F, I, N)
Definition: SpellScript.h:864
#define AuraEffectPeriodicFn(F, I, N)
Definition: SpellScript.h:2046
#define SpellHitFn(F)
Definition: SpellScript.h:854
#define AuraEffectRemoveFn(F, I, N, M)
Definition: SpellScript.h:2040
EvadeReason
Definition: UnitAICommon.h:30
@ UNIT_STATE_CASTING
Definition: Unit.h:270
@ 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_VERTEX_COLOR_DARK_RED
@ SPELL_SLIME_SPRAY
@ SPELL_VERTEX_COLOR_BRIGHT_RED
@ SPELL_WEAK_RADIATING_OOZE
@ SPELL_VILE_GAS_TRIGGER_SUMMON
@ SPELL_DECIMATE
@ SPELL_VILE_GAS_H
@ SPELL_STICKY_OOZE
@ SPELL_LITTLE_OOZE_COMBINE
@ SPELL_VERTEX_COLOR_PINK
@ 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_UNSTABLE_2
@ EMOTE_SLIME_SPRAY
@ SAY_UNSTABLE_EXPLOSION
@ SAY_AGGRO
@ EMOTE_UNSTABLE_3
@ SAY_KILL
@ SAY_SLIME_SPRAY
@ EMOTE_PRECIOUS_ZOMBIES
@ EMOTE_UNSTABLE_EXPLOSION
@ EMOTE_UNSTABLE_4
@ SAY_BERSERK
@ 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
void PreventDefaultAction()
HookList< EffectApplyHandler > AfterEffectRemove
Definition: SpellScript.h:2039
HookList< EffectPeriodicHandler > OnEffectPeriodic
Definition: SpellScript.h:2045
SpellEffectInfo const & GetEffectInfo(SpellEffIndex effIndex) const
Unit * GetTarget() const
ObjectGuid GetCasterGUID() const
InstanceScript *const instance
void _JustReachedHome()
SummonList summons
EventMap events
void _JustDied()
void DoZoneInCombat()
Definition: CreatureAI.h:161
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
Definition: CreatureAI.cpp:219
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
Definition: CreatureAI.cpp:56
bool UpdateVictim()
Definition: CreatureAI.cpp:245
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Definition: CreatureAI.cpp:328
Creature *const me
Definition: CreatureAI.h:61
Creature * DoSummon(uint32 entry, Position const &pos, Milliseconds despawnTime=30s, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
Definition: CreatureAI.cpp:464
void SetCanMelee(bool canMelee, bool fleeFromMelee=false)
Definition: Creature.cpp:2822
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
Definition: Creature.cpp:2415
CreatureAI * AI() const
Definition: Creature.h:214
uint32 ExecuteEvent()
Definition: EventMap.cpp:73
void Update(uint32 time)
Definition: EventMap.h:56
void ScheduleEvent(uint32 eventId, Milliseconds time, uint32 group=0, uint8 phase=0)
Definition: EventMap.cpp:36
void CancelEvent(uint32 eventId)
Definition: EventMap.cpp:131
void Reset()
Definition: EventMap.cpp:21
virtual bool SetBossState(uint32 id, EncounterState state)
void DoRemoveAurasDueToSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
void DoCastSpellOnPlayers(uint32 spell, bool includePets=false, bool includeControlled=false)
virtual ObjectGuid GetGuidData(uint32 type) const override
virtual bool CheckRequiredBosses(uint32, Player const *=nullptr) const
bool Is25ManRaid() const
Definition: Map.cpp:3320
static ObjectGuid const Empty
Definition: ObjectGuid.h:274
static Creature * ToCreature(Object *o)
Definition: Object.h:219
static Unit * ToUnit(Object *o)
Definition: Object.h:225
TypeID GetTypeId() const
Definition: Object.h:173
uint32 GetEntry() const
Definition: Object.h:161
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
static Player * ToPlayer(Object *o)
Definition: Object.h:213
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition: Player.cpp:16050
int32 CalcValue(WorldObject const *caster=nullptr, int32 const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
Definition: SpellInfo.cpp:495
uint32 TriggerSpell
Definition: SpellInfo.h:237
uint32 const Id
Definition: SpellInfo.h:325
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition: SpellInfo.h:577
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
Definition: SpellScript.h:162
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
Definition: SpellScript.h:173
Creature * GetHitCreature() const
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< HitHandler > AfterHit
Definition: SpellScript.h:852
HookList< HitHandler > OnHit
Definition: SpellScript.h:850
HookList< EffectHandler > OnEffectHit
Definition: SpellScript.h:839
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
int32 GetEffectValue() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
Definition: SpellScript.h:840
void PreventHitEffect(SpellEffIndex effIndex)
WorldLocation const * GetExplTargetDest() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Definition: SpellScript.h:863
Unit * GetOriginalCaster() const
void Despawn(Creature const *summon)
void Summon(Creature const *summon)
virtual void DoAction(int32)
Definition: UnitAI.h:72
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:159
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.cpp:180
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition: UnitAI.cpp:79
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition: UnitAI.h:161
Definition: Unit.h:627
void SetVisible(bool x)
Definition: Unit.cpp:8351
bool IsAlive() const
Definition: Unit.h:1164
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4560
bool HasUnitState(const uint32 f) const
Definition: Unit.h:732
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4664
void RemoveAllAuras()
Definition: Unit.cpp:4242
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition: Unit.cpp:3831
Map * GetMap() const
Definition: Object.h:624
InstanceScript * GetInstanceScript() const
Definition: Object.cpp:1042
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition: Object.cpp:3312
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition: Object.cpp:2896
TempSummon * SummonCreature(uint32 entry, Position const &pos, TempSummonType despawnType=TEMPSUMMON_MANUAL_DESPAWN, Milliseconds despawnTime=0s, uint32 vehId=0, uint32 spellId=0, ObjectGuid privateObjectOwner=ObjectGuid::Empty)
Definition: Object.cpp:2025
void setActive(bool isActiveObject)
Definition: Object.cpp:922
virtual void SetData(uint32, uint32)
Definition: ZoneScript.h:92
void HandleScript(SpellEffIndex)
void HandleEffectRemove(AuraEffect const *aurEff, AuraEffectHandleModes)
bool Validate(SpellInfo const *spellInfo) override
void FilterTargets(std::list< WorldObject * > &targets)
void HandleScript(SpellEffIndex)
void FilterTargets(std::list< WorldObject * > &targets)
void Register() override
bool Validate(SpellInfo const *) override
void HandleCast(SpellEffIndex effIndex)
void CheckTarget(SpellEffIndex effIndex)
void HandleDummy(SpellEffIndex effIndex)
void FilterTargets(std::list< WorldObject * > &targets)
@ SPELL_GREEN_BLIGHT_RESIDUE
@ LIGHT_S_HAMMER_TELEPORT
#define RegisterIcecrownCitadelCreatureAI(ai_name)
@ ACTION_ROTFACE_COMBAT
@ ACTION_ROTFACE_DEATH
@ DATA_OOZE_DANCE_ACHIEVEMENT
@ DATA_ROTFACE
@ DATA_PROFESSOR_PUTRICIDE
@ NPC_OOZE_SPRAY_STALKER
@ NPC_VILE_GAS_STALKER
@ NPC_UNSTABLE_EXPLOSION_STALKER
@ QUEST_RESIDUE_RENDEZVOUS_10
@ QUEST_RESIDUE_RENDEZVOUS_25
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition: Containers.h:109
void RandomResize(C &container, std::size_t requestedSize)
Definition: Containers.h:67
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
bool IsHeroic() const
void AddThreat(Unit *victim, float amount, Unit *who=nullptr)
void JustEngagedWith(Unit *who) override
void EnterEvadeMode(EvadeReason why) override
void Reset() override
void JustDied(Unit *) override
void UpdateAI(uint32 diff) override
boss_rotface(Creature *creature)
uint32 infectionStage
void JustReachedHome() override
void KilledUnit(Unit *victim) override
void JustSummoned(Creature *summon) override
void SpellHitTarget(WorldObject *, SpellInfo const *spellInfo) override
Milliseconds infectionCooldown
void IsSummonedBy(WorldObject *) override
EventMap events
void JustDied(Unit *) override
void DoAction(int32 action) override
npc_big_ooze(Creature *creature)
void UpdateAI(uint32 diff) override
InstanceScript * instance
void UpdateAI(uint32 diff) override
void JustDied(Unit *) override
npc_little_ooze(Creature *creature)
void IsSummonedBy(WorldObject *summonerWO) override
void JustSummoned(Creature *summon) override
InstanceScript * _instance
npc_precious_icc(Creature *creature)
void JustDied(Unit *) override
void SummonedCreatureDespawn(Creature *summon) override
void UpdateAI(uint32 diff) override
SummonList _summons
void Reset() override