void SpellHit(Unit* caster, const SpellInfo* spell) { if (withhead) return; if (spell->Id == SPELL_FLYING_HEAD) { if (Phase < 3) ++Phase; else Phase = 3; withhead = true; me->RemoveAllAuras(); me->SetName("Headless Horseman"); me->SetFullHealth(); SaySound(SAY_REJOINED); DoCast(me, SPELL_HEAD); caster->GetMotionMaster()->Clear(false); caster->GetMotionMaster()->MoveFollow(me, 6, float(urand(0, 5))); //DoResetThreat();//not sure if need std::list<HostileReference*>::const_iterator itr; for (itr = caster->getThreatManager().getThreatList().begin(); itr != caster->getThreatManager().getThreatList().end(); ++itr) { Unit* unit = Unit::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->isAlive() && unit != caster) me->AddThreat(unit, caster->getThreatManager().getThreat(unit)); } } }
void SpellHit(Unit* caster, const SpellInfo* spell) override { if (withhead) return; if (spell->Id == SPELL_FLYING_HEAD) { if (Phase < 3) ++Phase; else Phase = 3; withhead = true; me->RemoveAllAuras(); me->SetName("Headless Horseman"); me->SetFullHealth(); SaySound(SAY_REJOINED); DoCast(me, SPELL_HEAD); caster->GetMotionMaster()->Clear(false); caster->GetMotionMaster()->MoveFollow(me, 6, float(urand(0, 5))); //DoResetThreat();//not sure if need ThreatContainer::StorageType threatlist = caster->getThreatManager().getThreatList(); for (ThreatContainer::StorageType::const_iterator itr = threatlist.begin(); itr != threatlist.end(); ++itr) { Unit* unit = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); if (unit && unit->IsAlive() && unit != caster) me->AddThreat(unit, caster->getThreatManager().getThreat(unit)); } } }
void KilledUnit(Unit* player) { if (player->GetTypeId() == TYPEID_PLAYER) { if (withhead) SaySound(SAY_PLAYER_DEATH); //maybe possible when player dies from conflagration else if (Creature* Head = Unit::GetCreature((*me), headGUID)) CAST_AI(mob_head::mob_headAI, Head->AI())->SaySound(SAY_PLAYER_DEATH); } }
void KilledUnit(Unit* player) override { if (player->GetTypeId() == TYPEID_PLAYER) { if (withhead) SaySound(SAY_PLAYER_DEATH); //maybe possible when player dies from conflagration else if (Creature* Head = ObjectAccessor::GetCreature((*me), headGUID)) ENSURE_AI(npc_head::npc_headAI, Head->AI())->SaySound(SAY_PLAYER_DEATH); } }
void JustDied(Unit* /*killer*/) { me->StopMoving(); //me->GetMotionMaster()->MoveIdle(); SaySound(SAY_DEATH); if (Creature* flame = DoSpawnCreature(HELPER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60000)) flame->CastSpell(flame, SPELL_BODY_FLAME, false); if (Creature* wisp = DoSpawnCreature(WISP_INVIS, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60000)) CAST_AI(mob_wisp_invis::mob_wisp_invisAI, wisp->AI())->SetType(4); if (instance) instance->SetData(DATA_HORSEMAN_EVENT, DONE); }
void JustDied(Unit* /*killer*/) override { me->StopMoving(); //me->GetMotionMaster()->MoveIdle(); SaySound(SAY_DEATH); if (Creature* flame = DoSpawnCreature(HELPER, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60000)) flame->CastSpell(flame, SPELL_BODY_FLAME, false); if (Creature* wisp = DoSpawnCreature(WISP_INVIS, 0, 0, 0, 0, TEMPSUMMON_TIMED_DESPAWN, 60000)) ENSURE_AI(npc_wisp_invis::npc_wisp_invisAI, wisp->AI())->SetType(4); instance->SetBossState(DATA_HORSEMAN_EVENT, DONE); Map::PlayerList const& players = me->GetMap()->GetPlayers(); if (!players.isEmpty()) { if (Group* group = players.begin()->GetSource()->GetGroup()) if (group->isLFGGroup()) sLFGMgr->FinishDungeon(group->GetGUID(), 285); } }
void SpellHit(Unit* caster, const SpellInfo* spell) { if (!withbody) return; if (spell->Id == SPELL_FLYING_HEAD) { if (Phase < 3) ++Phase; else Phase = 3; withbody = false; if (!bodyGUID) bodyGUID = caster->GetGUID(); me->RemoveAllAuras(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); DoCast(me, SPELL_HEAD_LANDS, true); DoCast(me, SPELL_HEAD, false); SaySound(SAY_LOST_HEAD); me->GetMotionMaster()->Clear(false); me->GetMotionMaster()->MoveFleeing(caster->getVictim()); } }
void MovementInform(uint32 type, uint32 i) { if (type != POINT_MOTION_TYPE || !IsFlying || i != id) return; wp_reached = true; switch (id) { case 0: me->SetVisible(true); break; case 1: { if (Creature* smoke = me->SummonCreature(HELPER, Spawn[1].x, Spawn[1].y, Spawn[1].z, 0, TEMPSUMMON_TIMED_DESPAWN, 20000)) CAST_AI(mob_wisp_invis::mob_wisp_invisAI, smoke->AI())->SetType(3); DoCast(me, SPELL_RHYME_BIG); break; } case 6: if (instance) instance->SetData(GAMEOBJECT_PUMPKIN_SHRINE, 0); //hide gameobject break; case 19: me->RemoveUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT | MOVEMENTFLAG_DISABLE_GRAVITY); break; case 20: { Phase = 1; IsFlying = false; wp_reached = false; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); SaySound(SAY_ENTRANCE); if (Unit* player = Unit::GetUnit(*me, PlayerGUID)) DoStartMovement(player); break; } } ++id; }
void MovementInform(uint32 type, uint32 i) override { if (type != POINT_MOTION_TYPE || !IsFlying || i != id) return; wp_reached = true; switch (id) { case 0: me->SetVisible(true); break; case 1: { if (Creature* smoke = me->SummonCreature(HELPER, Spawn[1].x, Spawn[1].y, Spawn[1].z, 0, TEMPSUMMON_TIMED_DESPAWN, 20000)) ENSURE_AI(npc_wisp_invis::npc_wisp_invisAI, smoke->AI())->SetType(3); DoCast(me, SPELL_RHYME_BIG); break; } case 6: instance->SetData(DATA_PUMPKIN_SHRINE, 0); //hide gameobject break; case 19: me->SetDisableGravity(false); break; case 20: { Phase = 1; IsFlying = false; wp_reached = false; me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); SaySound(SAY_ENTRANCE); if (Unit* player = ObjectAccessor::GetUnit(*me, PlayerGUID)) DoStartMovement(player); break; } } ++id; }
void UpdateAI(const uint32 diff) { if (withhead) { switch (Phase) { case 0: { if (!IsFlying) { if (say_timer <= diff) { say_timer = 3000; Player* player = SelectRandomPlayer(100.0f, false); if (count < 3) { if (player) player->Say(Text[count], 0); } else { DoCast(me, SPELL_RHYME_BIG); if (player) { player->Say(Text[count], 0); player->HandleEmoteCommand(ANIM_EMOTE_SHOUT); } wp_reached = true; IsFlying = true; count = 0; break; } ++count; } else say_timer -= diff; } else { if (wp_reached) { wp_reached = false; me->GetMotionMaster()->Clear(false); me->GetMotionMaster()->MovePoint(id, FlightPoint[id].x, FlightPoint[id].y, FlightPoint[id].z); } } } break; case 1: if (burned) break; if (burn <= diff) { if (Creature* flame = me->SummonCreature(HELPER, Spawn[0].x, Spawn[0].y, Spawn[0].z, 0, TEMPSUMMON_TIMED_DESPAWN, 17000)) CAST_AI(mob_wisp_invis::mob_wisp_invisAI, flame->AI())->SetType(2); burned = true; } else burn -= diff; break; case 2: if (conflagrate <= diff) { if (Unit* player = SelectRandomPlayer(30.0f)) DoCast(player, SPELL_CONFLAGRATION, false); conflagrate = urand(10000, 16000); } else conflagrate -= diff; break; case 3: if (summonadds <= diff) { me->InterruptNonMeleeSpells(false); DoCast(me, SPELL_SUMMON_PUMPKIN); SaySound(SAY_SPROUTING_PUMPKINS); summonadds = urand(25000, 35000); } else summonadds -= diff; break; } if (laugh <= diff) { laugh = urand(11000, 22000); me->MonsterTextEmote(EMOTE_LAUGHS, 0); DoPlaySoundToSet(me, RandomLaugh[rand()%3]); } else laugh -= diff; if (UpdateVictim()) { DoMeleeAttackIfReady(); if (cleave <= diff) { DoCast(me->getVictim(), SPELL_CLEAVE); cleave = urand(2000, 6000); //1 cleave per 2.0f-6.0fsec } else cleave -= diff; } } else { if (regen <= diff) { regen = 1000; //"body calls head" if (me->IsFullHealth() && !returned) { if (Phase > 1) --Phase; else Phase = 1; Creature* Head = Unit::GetCreature((*me), headGUID); if (Head && Head->isAlive()) { CAST_AI(mob_head::mob_headAI, Head->AI())->Phase = Phase; CAST_AI(mob_head::mob_headAI, Head->AI())->Disappear(); } return; } } else regen -= diff; if (whirlwind <= diff) { whirlwind = urand(4000, 8000); if (urand(0, 1)) { me->RemoveAurasDueToSpell(SPELL_CONFUSE); DoCast(me, SPELL_WHIRLWIND, true); DoCast(me, SPELL_CONFUSE); } else me->RemoveAurasDueToSpell(SPELL_WHIRLWIND); } else whirlwind -= diff; } }
void SpellHitTarget(Unit* unit, const SpellInfo* spell) { if (spell->Id == SPELL_CONFLAGRATION && unit->HasAura(SPELL_CONFLAGRATION)) SaySound(SAY_CONFLAGRATION, unit); }