void JustDied(Unit* /*killer*/) { _JustDied(); Talk(SAY_DEATH); if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_FESTERGUT_DEATH); RemoveBlight(); }
void JustDied(Unit* /*killer*/) { _JustDied(); Talk(SAY_DEATH); instance->DoRemoveAurasDueToSpellOnPlayers(69166); instance->DoRemoveAurasDueToSpellOnPlayers(INOCULATED_HELPER); if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_FESTERGUT_DEATH); RemoveBlight(); }
void JustDied(Unit* killer) { _JustDied(); DoSendQuantumText(SAY_DEATH, me); if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_FESTERGUT_DEATH); RemoveBlight(); // Quest credit if (Player* player = killer->ToPlayer()) { player->CastSpell(player, SPELL_SOUL_FEAST, true); me->RemoveAurasDueToSpell(SPELL_SHADOWS_FATE); } }
void JustDied(Unit* /*killer*/) override { Map::PlayerList const& players = instance->instance->GetPlayers(); if (!players.isEmpty()) { for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) { if (Player* player = itr->GetSource()) if ((player->GetQuestStatus(QUEST_RESIDUE_RENDEZVOUS_10) == QUEST_STATUS_INCOMPLETE) || (player->GetQuestStatus(QUEST_RESIDUE_RENDEZVOUS_25) == QUEST_STATUS_INCOMPLETE)) player->CastSpell(player, SPELL_ORANGE_BLIGHT_RESIDUE, true); else continue; } } _JustDied(); Talk(SAY_DEATH); if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_FESTERGUT_DEATH); RemoveBlight(); }
void UpdateAI(uint32 diff) { if (!UpdateVictim() || !CheckInRoom()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_INHALE_BLIGHT: { RemoveBlight(); if (_inhaleCounter == 3) { Talk(EMOTE_WARN_PUNGENT_BLIGHT); Talk(SAY_PUNGENT_BLIGHT); DoCast(me, SPELL_PUNGENT_BLIGHT); _inhaleCounter = 0; if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetData64(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_FESTERGUT_GAS); events.RescheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000)); } else { DoCast(me, SPELL_INHALE_BLIGHT); // just cast and dont bother with target, conditions will handle it ++_inhaleCounter; if (_inhaleCounter < 3) me->CastSpell(me, gaseousBlight[_inhaleCounter], true, NULL, NULL, me->GetGUID()); } events.ScheduleEvent(EVENT_INHALE_BLIGHT, urand(33500, 35000)); break; } case EVENT_VILE_GAS: { std::list<Unit*> targets; uint32 minTargets = RAID_MODE<uint32>(3, 8, 3, 8); SelectTargetList(targets, minTargets, SELECT_TARGET_RANDOM, -5.0f, true); float minDist = 0.0f; if (targets.size() >= minTargets) minDist = -5.0f; if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, minDist, true)) DoCast(target, SPELL_VILE_GAS); events.ScheduleEvent(EVENT_VILE_GAS, urand(28000, 35000)); break; } case EVENT_GAS_SPORE: Talk(EMOTE_WARN_GAS_SPORE); Talk(EMOTE_GAS_SPORE); me->CastCustomSpell(SPELL_GAS_SPORE, SPELLVALUE_MAX_TARGETS, RAID_MODE<int32>(2, 3, 2, 3), me); events.ScheduleEvent(EVENT_GAS_SPORE, urand(40000, 45000)); events.RescheduleEvent(EVENT_VILE_GAS, urand(28000, 35000)); break; case EVENT_GASTRIC_BLOAT: DoCastVictim(SPELL_GASTRIC_BLOAT); events.ScheduleEvent(EVENT_GASTRIC_BLOAT, urand(15000, 17500)); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK2); Talk(SAY_BERSERK); break; default: break; } } DoMeleeAttackIfReady(); }
void UpdateAI(uint32 diff) override { if (!UpdateVictim() || !CheckInRoom()) return; events.Update(diff); if (me->HasUnitState(UNIT_STATE_CASTING)) return; while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_INHALE_BLIGHT: { RemoveBlight(); if (_inhaleCounter == 3) { Talk(EMOTE_WARN_PUNGENT_BLIGHT); Talk(SAY_PUNGENT_BLIGHT); DoCast(me, SPELL_PUNGENT_BLIGHT); _inhaleCounter = 0; if (Creature* professor = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_PROFESSOR_PUTRICIDE))) professor->AI()->DoAction(ACTION_FESTERGUT_GAS); events.RescheduleEvent(EVENT_GAS_SPORE, urand(20000, 25000)); } else { DoCast(me, SPELL_INHALE_BLIGHT); // just cast and dont bother with target, conditions will handle it ++_inhaleCounter; if (_inhaleCounter < 3) me->CastSpell(me, gaseousBlight[_inhaleCounter], true, NULL, NULL, me->GetGUID()); } events.ScheduleEvent(EVENT_INHALE_BLIGHT, urand(33500, 35000)); break; } case EVENT_VILE_GAS: { std::list<Unit*> ranged, melee; uint32 minTargets = RAID_MODE<uint32>(3, 8, 3, 8); SelectTargetList(ranged, 25, SELECT_TARGET_RANDOM, -5.0f, true); SelectTargetList(melee, 25, SELECT_TARGET_RANDOM, 5.0f, true); while (ranged.size() < minTargets) { if (melee.empty()) break; Unit* target = Trinity::Containers::SelectRandomContainerElement(melee); ranged.push_back(target); melee.remove(target); } if (!ranged.empty()) { Trinity::Containers::RandomResizeList(ranged, RAID_MODE<uint32>(1, 3, 1, 3)); for (std::list<Unit*>::iterator itr = ranged.begin(); itr != ranged.end(); ++itr) DoCast(*itr, SPELL_VILE_GAS); } events.ScheduleEvent(EVENT_VILE_GAS, urand(28000, 35000)); break; } case EVENT_GAS_SPORE: Talk(EMOTE_WARN_GAS_SPORE); Talk(EMOTE_GAS_SPORE); me->CastCustomSpell(SPELL_GAS_SPORE, SPELLVALUE_MAX_TARGETS, RAID_MODE<int32>(2, 3, 2, 3), me); events.ScheduleEvent(EVENT_GAS_SPORE, urand(40000, 45000)); events.RescheduleEvent(EVENT_VILE_GAS, urand(28000, 35000)); break; case EVENT_GASTRIC_BLOAT: DoCastVictim(SPELL_GASTRIC_BLOAT); events.ScheduleEvent(EVENT_GASTRIC_BLOAT, urand(15000, 17500)); break; case EVENT_BERSERK: DoCast(me, SPELL_BERSERK2); Talk(SAY_BERSERK); break; default: break; } } DoMeleeAttackIfReady(); }