TrinityCore
Loading...
Searching...
No Matches
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
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
103
104// 36627 - Rotface
105struct boss_rotface : public BossAI
106{
107 boss_rotface(Creature* creature) : BossAI(creature, DATA_ROTFACE)
108 {
109 infectionStage = 0;
110 infectionCooldown = 14s;
111 }
112
125
143
144 void JustDied(Unit* /*killer*/) override
145 {
147 _JustDied();
150 professor->AI()->DoAction(ACTION_ROTFACE_DEATH);
151 }
152
159
160 void KilledUnit(Unit* victim) override
161 {
162 if (victim->GetTypeId() == TYPEID_PLAYER)
163 Talk(SAY_KILL);
164 }
165
166 void EnterEvadeMode(EvadeReason why) override
167 {
170 professor->AI()->EnterEvadeMode();
171 }
172
173 void SpellHitTarget(WorldObject* /*target*/, SpellInfo const* spellInfo) override
174 {
175 if (spellInfo->Id == SPELL_SLIME_SPRAY)
177 }
178
179 void JustSummoned(Creature* summon) override
180 {
181 if (summon->GetEntry() == NPC_VILE_GAS_STALKER)
183 professor->CastSpell(summon, SPELL_VILE_GAS_H, true);
184
185 summons.Summon(summon);
186 }
187
188 void UpdateAI(uint32 diff) override
189 {
190 if (!UpdateVictim())
191 return;
192
193 events.Update(diff);
194
196 return;
197
198 while (uint32 eventId = events.ExecuteEvent())
199 {
200 switch (eventId)
201 {
203 if (Unit* target = SelectTarget(SelectTargetMethod::Random, 1, 0.0f, true))
204 {
208 }
210 break;
212 if (infectionStage++ < 4)
213 {
214 infectionCooldown -= 2s;
216 }
217 break;
221 break;
222 case EVENT_VILE_GAS:
225 break;
226 default:
227 break;
228 }
229
231 return;
232 }
233 }
234
235private:
238};
239
240// 36897 - Little Ooze
242{
243 npc_little_ooze(Creature* creature) : ScriptedAI(creature) { }
244
245 void IsSummonedBy(WorldObject* summonerWO) override
246 {
247 Unit* summoner = summonerWO->ToUnit();
248 if (!summoner)
249 return;
254 AddThreat(summoner, 500000.0f);
255 }
256
257 void JustDied(Unit* /*killer*/) override
258 {
260 }
261
262 void UpdateAI(uint32 diff) override
263 {
264 if (!UpdateVictim())
265 return;
266
267 events.Update(diff);
268
270 {
273 }
274 }
275
276private:
278};
279
280// 36899 - Big Ooze
282{
283 npc_big_ooze(Creature* creature) : ScriptedAI(creature), instance(creature->GetInstanceScript()) { }
284
285 void IsSummonedBy(WorldObject* /*summoner*/) override
286 {
293 // register in Rotface's summons - not summoned with Rotface as owner
295 rotface->AI()->JustSummoned(me);
296 }
297
298 void JustDied(Unit* /*killer*/) override
299 {
301 rotface->AI()->SummonedCreatureDespawn(me);
303 }
304
305 void DoAction(int32 action) override
306 {
307 if (action == EVENT_STICKY_OOZE)
309 }
310
311 void UpdateAI(uint32 diff) override
312 {
313 if (!UpdateVictim())
314 return;
315
316 events.Update(diff);
317
318 while (uint32 eventId = events.ExecuteEvent())
319 {
320 switch (eventId)
321 {
325 break;
326 default:
327 break;
328 }
329 }
330 }
331
332private:
335};
336
337// 37217 - Precious
339{
340 npc_precious_icc(Creature* creature) : ScriptedAI(creature), _summons(me), _instance(creature->GetInstanceScript()) { }
341
342 void Reset() override
343 {
344 _events.Reset();
349 }
350
351 void JustSummoned(Creature* summon) override
352 {
353 _summons.Summon(summon);
355 summon->AI()->AttackStart(target);
356 }
357
358 void SummonedCreatureDespawn(Creature* summon) override
359 {
360 _summons.Despawn(summon);
361 }
362
363 void JustDied(Unit* /*killer*/) override
364 {
367 if (rotface->IsAlive())
368 rotface->AI()->Talk(SAY_PRECIOUS_DIES);
369 }
370
371 void UpdateAI(uint32 diff) override
372 {
373 if (!UpdateVictim())
374 return;
375
376 _events.Update(diff);
377
379 return;
380
381 while (uint32 eventId = _events.ExecuteEvent())
382 {
383 switch (eventId)
384 {
385 case EVENT_DECIMATE:
388 break;
392 break;
395 for (uint32 i = 0; i < 11; ++i)
398 break;
399 default:
400 break;
401 }
402 }
403 }
404
405private:
409};
410
411// 69782, 69796, 69798, 69801 - Ooze Flood
413{
414 void HandleScript(SpellEffIndex /*effIndex*/)
415 {
416 if (!GetHitUnit())
417 return;
418
419 std::list<Creature*> triggers;
421
422 if (triggers.empty())
423 return;
424
427 .SetOriginalCaster(GetOriginalCaster() ? GetOriginalCaster()->GetGUID() : ObjectGuid::Empty));
428 }
429
430 void FilterTargets(std::list<WorldObject*>& targets)
431 {
432 // get 2 targets except 2 nearest
434
435 // .resize() runs pop_back();
436 if (targets.size() > 4)
437 targets.resize(4);
438
439 while (targets.size() > 2)
440 targets.pop_front();
441 }
442
448};
449
450// 69674, 71224, 73022, 73023 - Mutated Infection
452{
453 void FilterTargets(std::list<WorldObject*>& targets)
454 {
455 // remove targets with this aura already
456 // tank is not on this list
457 targets.remove_if(Trinity::UnitAuraCheck(true, GetSpellInfo()->Id));
458 if (targets.empty())
459 return;
460
462 targets.clear();
463 targets.push_back(target);
464 }
465
467 {
468 if (Creature* caster = GetCaster()->ToCreature())
469 if (Unit* target = GetHitUnit())
470 caster->AI()->Talk(EMOTE_MUTATED_INFECTION, target);
471 }
472
478};
479
481{
482 bool Validate(SpellInfo const* spellInfo) override
483 {
484 return ValidateSpellEffect({ { spellInfo->Id, EFFECT_2 } })
486 }
487
489 {
490 Unit* target = GetTarget();
492 .SetTriggeringAura(aurEff)
493 .SetOriginalCaster(GetCasterGUID()));
494 }
495
500};
501
502// 69538 - Small Ooze Combine
523
524// 69553 - Large Ooze Combine
526{
527 void HandleScript(SpellEffIndex /*effIndex*/)
528 {
529 Creature* caster = GetCaster()->ToCreature();
530 Creature* target = GetHitCreature();
531 if (!(target && target->IsAlive()) || !caster)
532 return;
533
534 if (Aura* unstable = caster->GetAura(SPELL_UNSTABLE_OOZE))
535 {
536 if (Aura* targetAura = target->GetAura(SPELL_UNSTABLE_OOZE))
537 unstable->ModStackAmount(targetAura->GetStackAmount());
538 else
539 unstable->ModStackAmount(1);
540
541 if (unstable->GetStackAmount() >= 5)
542 {
545 if (InstanceScript* instance = caster->GetInstanceScript())
546 {
547 if (Creature* rotface = ObjectAccessor::GetCreature(*caster, instance->GetGuidData(DATA_ROTFACE)))
548 {
549 instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false));
550 if (rotface->IsAlive())
551 rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION);
552 }
553 }
554
555 caster->AI()->DoAction(EVENT_STICKY_OOZE);
556 caster->CastSpell(caster, SPELL_UNSTABLE_OOZE_EXPLOSION, CastSpellExtraArgs().SetOriginalCaster(caster->GetGUID()));
557 }
558 }
559 target->DespawnOrUnsummon();
560 }
561
566};
567
568// 69610 - Large Ooze Buff Combine
570{
571 bool Load() override
572 {
573 return GetCaster()->GetTypeId() == TYPEID_UNIT;
574 }
575
576 void HandleScript(SpellEffIndex /*effIndex*/)
577 {
578 if (!(GetHitCreature() && GetHitCreature()->IsAlive()))
579 return;
580
581 Creature* caster = GetCaster()->ToCreature();
582 if (Aura* unstable = caster->GetAura(SPELL_UNSTABLE_OOZE))
583 {
584 uint8 newStack = uint8(unstable->GetStackAmount()+1);
585 unstable->SetStackAmount(newStack);
586
587 switch (newStack)
588 {
589 case 2:
590 caster->AI()->Talk(EMOTE_UNSTABLE_2, caster);
591 caster->CastSpell(caster, SPELL_VERTEX_COLOR_PINK, true);
592 break;
593 case 3:
594 caster->AI()->Talk(EMOTE_UNSTABLE_3, caster);
595 caster->CastSpell(caster, SPELL_VERTEX_COLOR_BRIGHT_RED, true);
596 break;
597 case 4:
598 caster->AI()->Talk(EMOTE_UNSTABLE_4, caster);
599 caster->CastSpell(caster, SPELL_VERTEX_COLOR_DARK_RED, true);
600 break;
601 case 5:
602 {
603 caster->AI()->Talk(EMOTE_UNSTABLE_EXPLOSION);
606 if (InstanceScript* instance = caster->GetInstanceScript())
607 {
608 instance->SetData(DATA_OOZE_DANCE_ACHIEVEMENT, uint32(false));
609 if (Creature* rotface = ObjectAccessor::GetCreature(*caster, instance->GetGuidData(DATA_ROTFACE)))
610 if (rotface->IsAlive())
611 rotface->AI()->Talk(SAY_UNSTABLE_EXPLOSION);
612 }
613
614 caster->AI()->DoAction(EVENT_STICKY_OOZE);
615 caster->CastSpell(caster, SPELL_UNSTABLE_OOZE_EXPLOSION, CastSpellExtraArgs().SetOriginalCaster(caster->GetGUID()));
616 break;
617 }
618 default:
619 break;
620 }
621 }
622
624 }
625
630};
631
632// 69839 - Unstable Ooze Explosion
634{
635 bool Validate(SpellInfo const* /*spell*/) override
636 {
638 }
639
641 {
642 PreventHitEffect(effIndex);
643 if (!GetHitUnit())
644 return;
645
646 float x, y, z;
647 GetHitUnit()->GetPosition(x, y, z);
650 }
651
656};
657
658// 69832 - Unstable Ooze Explosion
660{
662 {
663 PreventHitDefaultEffect(effIndex);
664 if (!GetExplTargetDest())
665 return;
666
667 uint32 triggered_spell_id = GetEffectInfo().TriggerSpell;
668
669 if (InstanceScript* script = GetCaster()->GetInstanceScript())
670 if (Creature* rotface = script->instance->GetCreature(script->GetGuidData(DATA_ROTFACE)))
671 rotface->CastSpell(*GetExplTargetDest(), triggered_spell_id, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
672 .SetOriginalCaster(GetCaster()->GetGUID()));
673 }
674
679};
680
681// 71441 - Unstable Ooze Explosion Suicide Trigger
683{
684 void DespawnSelf(AuraEffect const* /*aurEff*/)
685 {
687 Unit* target = GetTarget();
688 if (target->GetTypeId() != TYPEID_UNIT)
689 return;
690
691 target->RemoveAllAuras();
692 target->SetVisible(false);
693 target->ToCreature()->SetCanMelee(false);
694 target->ToCreature()->DespawnOrUnsummon(60s);
695 }
696
701};
702
703// 72285, 72288 - Vile Gas Trigger
705{
706 void FilterTargets(std::list<WorldObject*>& targets)
707 {
709 if (targets.empty())
710 return;
711
712 std::list<WorldObject*> ranged, melee;
713 std::list<WorldObject*>::iterator itr = targets.begin();
714 while (itr != targets.end() && (*itr)->GetDistance(GetCaster()) < 5.0f)
715 {
716 melee.push_back((*itr)->ToUnit());
717 ++itr;
718 }
719
720 while (itr != targets.end())
721 {
722 ranged.push_back((*itr)->ToUnit());
723 ++itr;
724 }
725
726 uint32 minTargets = GetCaster()->GetMap()->Is25ManRaid() ? 8 : 3;
727 while (ranged.size() < minTargets)
728 {
729 if (melee.empty())
730 break;
731
733 ranged.push_back(target);
734 melee.remove(target);
735 }
736
737 if (!ranged.empty())
738 Trinity::Containers::RandomResize(ranged, GetCaster()->GetMap()->Is25ManRaid() ? 3 : 1);
739
740 targets.swap(ranged);
741 }
742
748
754};
755
756// 69507, 71213, 73189, 73190 - Slime Spray
758{
760 {
761 Player* target = GetHitPlayer();
762 if (!target)
763 return;
764
766 return;
767
769 if (target->GetQuestStatus(questId) != QUEST_STATUS_INCOMPLETE)
770 return;
771
773 }
774
779};
780
T GetEntry(std::unordered_map< uint32, T > const &map, CriteriaTreeEntry const *tree)
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
Definition Duration.h:24
@ FAIL
@ TEMPSUMMON_TIMED_DESPAWN
@ TYPEID_UNIT
Definition ObjectGuid.h:43
@ TYPEID_PLAYER
Definition ObjectGuid.h:44
@ QUEST_STATUS_INCOMPLETE
Definition QuestDef.h:146
#define RegisterSpellAndAuraScriptPair(script_1, script_2)
Definition ScriptMgr.h:1381
#define RegisterSpellScript(spell_script)
Definition ScriptMgr.h:1383
SpellEffIndex
@ 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
#define EFFECT_ALL
AuraEffectHandleModes
@ AURA_EFFECT_HANDLE_REAL
@ SPELL_AURA_PERIODIC_DAMAGE
@ SPELL_AURA_PERIODIC_TRIGGER_SPELL
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
#define SpellEffectFn(F, I, N)
#define SpellObjectAreaTargetSelectFn(F, I, N)
#define AuraEffectPeriodicFn(F, I, N)
#define SpellHitFn(F)
#define AuraEffectRemoveFn(F, I, N, M)
EvadeReason
@ UNIT_STATE_CASTING
Definition Unit.h:290
#define MUTATED_INFECTION
void AddSC_boss_rotface()
RotfaceEvents
@ EVENT_VILE_GAS
@ EVENT_SUMMON_ZOMBIES
@ EVENT_SLIME_SPRAY
@ EVENT_MORTAL_WOUND
@ EVENT_STICKY_OOZE
@ EVENT_MUTATED_INFECTION
@ EVENT_HASTEN_INFECTIONS
@ EVENT_DECIMATE
RotfaceSpells
@ 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
RotfaceTexts
@ 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
void PreventDefaultAction()
HookList< EffectApplyHandler > AfterEffectRemove
HookList< EffectPeriodicHandler > OnEffectPeriodic
SpellEffectInfo const & GetEffectInfo(SpellEffIndex effIndex) const
Unit * GetTarget() const
ObjectGuid GetCasterGUID() const
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
TypeID GetTypeId() const
Definition BaseEntity.h:166
InstanceScript *const instance
void _JustReachedHome()
SummonList summons
EventMap events
void DoZoneInCombat()
Definition CreatureAI.h:169
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
void Talk(uint8 id, WorldObject const *whisperTarget=nullptr)
bool UpdateVictim()
void AttackStart(Unit *victim) override
== Triggered Actions Requested ==================
Creature *const me
Definition CreatureAI.h:63
Creature * DoSummon(uint32 entry, Position const &pos, Milliseconds despawnTime=30s, TempSummonType summonType=TEMPSUMMON_CORPSE_TIMED_DESPAWN)
void SetCanMelee(bool canMelee, bool fleeFromMelee=false)
void DespawnOrUnsummon(Milliseconds timeToDespawn=0s, Seconds forceRespawnTime=0s)
CreatureAI * AI() const
Definition Creature.h:235
void Update(uint32 time)
Definition EventMap.h:77
EventId ExecuteEvent()
Definition EventMap.cpp:77
void CancelEvent(EventId eventId)
Definition EventMap.cpp:156
void ScheduleEvent(EventId eventId, Milliseconds time, GroupIndex group=0u, PhaseIndex phase=0u)
Definition EventMap.cpp:40
void Reset()
Definition EventMap.cpp:25
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:3385
static ObjectGuid const Empty
Definition ObjectGuid.h:314
Player * ToPlayer()
Definition Object.h:126
uint32 GetEntry() const
Definition Object.h:89
Creature * ToCreature()
Definition Object.h:121
Unit * ToUnit()
Definition Object.h:116
QuestStatus GetQuestStatus(uint32 quest_id) const
Definition Player.cpp:15929
uint32 TriggerSpell
Definition SpellInfo.h:234
int32 CalcValueAsInt(WorldObject const *caster=nullptr, SpellEffectValue const *basePoints=nullptr, Unit const *target=nullptr, float *variance=nullptr, uint32 castItemId=0, int32 itemLevel=-1) const
uint32 const Id
Definition SpellInfo.h:328
SpellEffectInfo const & GetEffect(SpellEffIndex index) const
Definition SpellInfo.h:590
static bool ValidateSpellInfo(std::initializer_list< uint32 > spellIds)
static bool ValidateSpellEffect(std::initializer_list< std::pair< uint32, SpellEffIndex > > effects)
Creature * GetHitCreature() const
Player * GetHitPlayer() const
Unit * GetCaster() const
HookList< HitHandler > AfterHit
int32 GetEffectValueAsInt() const
HookList< HitHandler > OnHit
HookList< EffectHandler > OnEffectHit
void PreventHitDefaultEffect(SpellEffIndex effIndex)
Unit * GetHitUnit() const
SpellEffectInfo const & GetEffectInfo() const
HookList< EffectHandler > OnEffectHitTarget
void PreventHitEffect(SpellEffIndex effIndex)
WorldLocation const * GetExplTargetDest() const
SpellInfo const * GetSpellInfo() const
HookList< ObjectAreaTargetSelectHandler > OnObjectAreaTargetSelect
Unit * GetOriginalCaster() const
void Despawn(Creature const *summon)
void Summon(Creature const *summon)
SpellCastResult DoCastSelf(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:160
virtual void DoAction(int32 param)
Definition UnitAI.h:73
SpellCastResult DoCastVictim(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.cpp:172
Unit * SelectTarget(SelectTargetMethod targetType, uint32 offset=0, float dist=0.0f, bool playerOnly=false, bool withTank=true, int32 aura=0)
Definition UnitAI.cpp:71
SpellCastResult DoCastAOE(uint32 spellId, CastSpellExtraArgs const &args={})
Definition UnitAI.h:162
Definition Unit.h:647
void SetVisible(bool x)
Definition Unit.cpp:8787
bool IsAlive() const
Definition Unit.h:1205
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4718
bool HasUnitState(const uint32 f) const
Definition Unit.h:755
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4822
void RemoveAllAuras()
Definition Unit.cpp:4400
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:3992
Map * GetMap() const
Definition Object.h:411
InstanceScript * GetInstanceScript() const
Definition Object.cpp:394
void GetCreatureListWithEntryInGrid(Container &creatureContainer, uint32 entry, float maxSearchRange=250.0f) const
Definition Object.cpp:2663
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
Definition Object.cpp:2222
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:1403
void setActive(bool isActiveObject)
Definition Object.cpp:274
virtual void SetData(uint32, uint32)
Definition ZoneScript.h:100
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)
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) -> std::add_const_t< decltype(*std::ranges::begin(container))> &
Definition Containers.h:110
void RandomResize(C &container, std::size_t requestedSize)
Definition Containers.h:67
constexpr void GetPosition(float &x, float &y) const
Definition Position.h:92
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
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
void Reset() override