void MySelectNextTarget() { if (_ebonGargoyleGUID) { Unit* gargoyle = ObjectAccessor::GetUnit(*me, _ebonGargoyleGUID); if (gargoyle && gargoyle->GetAI()) gargoyle->GetAI()->AttackStart(me); _ebonGargoyleGUID = 0; } Unit* owner = me->GetOwner(); if (owner && owner->GetTypeId() == TYPEID_PLAYER) { Unit* selection = owner->ToPlayer()->GetSelectedUnit(); if (selection) { me->getThreatManager().resetAllAggro(); me->AddThreat(selection, 1000000.0f); if (owner->IsInCombat()) AttackStart(selection); } if (!owner->IsInCombat() && !me->GetVictim()) EnterEvadeMode(); } }
void HandleScript(SpellEffIndex /*eff*/) { Unit* caster = GetCaster(); if (!caster) return; if (GetHitDamage() >= int32(GetHitUnit()->GetHealth())) if (caster->GetAI()) caster->GetAI()->SetData(DATA_GRAVITY_BOMB_CASUALTY, 1); }
void HandlePeriodicTick(AuraEffect const* aurEff) { if (aurEff->GetBase()->GetStackAmount() < 2) return; Unit* caster = GetCaster(); //TODO: the caster should be boss but not the player if (!caster || !caster->GetAI()) return; caster->GetAI()->SetGUID(GetTarget()->GetGUID(), DATA_INTENSE_COLD); }
void HandlePeriodicTick(AuraEffect const* aurEff) { Unit* caster = GetCaster(); if (!caster) return; if (aurEff->GetBase()->GetStackAmount() >= 2) caster->GetAI()->SetGUID(GetTarget()->GetGUID(), DATA_INTENSE_COLD); }
void UpdateAI(uint32 diff) { if (!UpdateVictim() || me->HasUnitState(UNIT_STATE_CASTING)) return; if(me->GetPositionX() == position[5].GetPositionX() && me->GetPositionY() == position[5].GetPositionY() && me->GetPositionZ() == position[5].GetPositionZ() && !HomePosition) { pDragah->GetAI()->DoAction(ACTION_DRAGAH_IS_ON_THE_GROUND); me->SetSpeed(MOVE_WALK, 1.0f); me->SetCanFly(false); me->SetReactState(REACT_AGGRESSIVE); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); events.ScheduleEvent(EVENT_VALIONAS_FLAME, urand(4000,7000)); events.ScheduleEvent(EVENT_SHREDDING_SWIPE, urand(10000,13000)); if(me->GetMap()->IsHeroic()) events.ScheduleEvent(EVENT_DEVOURING_FLAMES, urand(15000,17000)); HomePosition = true; } events.Update(diff); while (uint32 eventId = events.GetEvent()) { switch (eventId) { case EVENT_VALIONAS_FLAME: if (Unit* pTarget = SelectTarget(SELECT_TARGET_RANDOM, 0)) DoCast(pTarget, SPELL_VALIONAS_FLAME); events.RepeatEvent(urand(15000,25000)); break; case EVENT_SHREDDING_SWIPE: if(me->getVictim()) me->CastSpell(me->getVictim(), SPELL_SHREDDING_SWIPE, true); events.RepeatEvent(urand(21000,30000)); break; case EVENT_DEVOURING_FLAMES: DoCast(SelectTarget(SELECT_TARGET_RANDOM, 0), SPELL_DEVOURING_FLAMES_H); events.RepeatEvent(urand(30000,35000)); break; default: events.PopEvent(); break; } } DoMeleeAttackIfReady(); }
void OnRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) { Unit* caster = GetCaster(); if (!caster || caster->GetEntry() != NPC_SNOBOLD_VASSAL) return; if (Creature* gormok = GetTarget()->ToCreature()) if (Unit* target = gormok->AI()->SelectTarget(SELECT_TARGET_RANDOM, 0, SnobolledTargetSelector())) { gormok->AI()->Talk(EMOTE_SNOBOLLED); caster->GetAI()->DoAction(ACTION_ACTIVE_SNOBOLD); caster->CastSpell(target, SPELL_RIDE_PLAYER, true); } }
void MovementInform(uint32 type, uint32 id) { if (type != POINT_MOTION_TYPE) return; switch (id) { case POINT_VALIONA_FLY_IN_THE_AIR: currentWaypoint++; if(currentWaypoint < 3) // You can extend the Waypoints by yourself if you want { me->GetMotionMaster()->MovePoint(POINT_VALIONA_FLY_IN_THE_AIR, position[currentWaypoint]); }else me->GetMotionMaster()->MovePoint(POINT_VALIONA_LAND, position[3]); break; case POINT_VALIONA_LAND: pDragah->GetAI()->DoAction(ACTION_DRAGAH_IS_ON_THE_GROUND); me->SetSpeed(MOVE_WALK, 1.0f); me->SetFlying(false); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); me->SetReactState(REACT_AGGRESSIVE); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(me->getVictim()); events.ScheduleEvent(EVENT_VALIONAS_FLAME, urand(4000,7000)); events.ScheduleEvent(EVENT_SHREDDING_SWIPE, urand(10000,13000)); if(/*me->GetMap()->IsHeroic()*/ true) // To test it on non heroic difficulty events.ScheduleEvent(EVENT_DEVOURING_FLAMES, urand(15000,17000)); break; case POINT_VALIONA_FLY_AWAY: DespawnCreatures(NPC_SEEPING_TWILIGHT_TRIGGER,500.0f); me->GetMotionMaster()->MovePoint(POINT_VALIONA_IS_AWAY, position[4]); break; case POINT_VALIONA_IS_AWAY: me->DespawnOrUnsummon(); break; default: break; } }
void HandleEffectPeriodic(AuraEffect const* /*aurEff*/) { Unit* target = GetTarget(); Unit* owner = target->GetOwner(); if (!owner) return; if (owner->IsMounted() && !target->IsMounted()) { if (VolunteerAI* volunteerAI = CAST_AI(VolunteerAI, target->GetAI())) target->Mount(volunteerAI->GetMountId()); } else if (!owner->IsMounted() && target->IsMounted()) target->Dismount(); target->SetSpeed(MOVE_RUN, owner->GetSpeedRate(MOVE_RUN)); target->SetSpeed(MOVE_WALK, owner->GetSpeedRate(MOVE_WALK)); }
void FilterTargets(std::list<WorldObject*>& targets) { Unit* caster = GetCaster(); targets.remove_if(Trinity::UnitAuraCheck(true, SPELL_HAS_DARK_BREWMAIDENS_BREW)); if (targets.size() > 1) targets.remove_if([caster](WorldObject* obj) { if (obj->GetGUID() == caster->GetAI()->GetGUID(DATA_TARGET_GUID)) return true; return false; }); if (targets.empty()) return; WorldObject* target = Trinity::Containers::SelectRandomContainerElement(targets); targets.clear(); targets.push_back(target); }
void MovementInform(uint32 uiType, uint32 /*uiId*/) override { if (uiType != POINT_MOTION_TYPE) return; if (me->IsSummon()) { Unit* summoner = me->ToTempSummon()->GetSummoner(); if (summoner && summoner->GetTypeId() == TYPEID_UNIT && summoner->IsAIEnabled) { npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI* ai = CAST_AI(npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI, summoner->GetAI()); if (ai) { ai->uiTimer = 2000; ai->uiPhase = 5; } //me->ChangeOrient(0.0f, summoner); } } }
void UpdateAI(const uint32 diff) { if (!UpdateVictim() || me->HasUnitState(UNIT_STAT_CASTING)) return; if(ShouldSummonAdds) { // Despawns the Stalker DespawnCreatures(NPC_SHADOW_GALE_STALKER); RemoveShadowGaleDebuffFromPlayers(); me->SetReactState(REACT_AGGRESSIVE); me->GetMotionMaster()->Clear(); me->GetMotionMaster()->MoveChase(me->getVictim()); if ((rand()%2)) me->MonsterYell(SAY_SUMMON, LANG_UNIVERSAL, NULL); //Adds a visual portal effect to the Stalker if (FacelessPortalStalker) FacelessPortalStalker->GetAI()->DoCast(FacelessPortalStalker,SPELL_TWILIGHT_PORTAL_VISUAL,true); events.ScheduleEvent(EVENT_REMOVE_TWILIGHT_PORTAL, 7000); //Summons Faceless over the Spell if (FacelessPortalStalker) FacelessPortalStalker->GetAI()->DoCast(FacelessPortalStalker,SPELL_SPAWN_FACELESS,true); ShouldSummonAdds = false; // DBM says that the Spell has 40s CD events.ScheduleEvent(EVENT_SHADOW_GALE, urand(40000,44000)); } events.Update(diff); while (uint32 eventId = events.ExecuteEvent()) { switch (eventId) { case EVENT_ENFEEBLING_BLOW: DoCastVictim(SPELL_ENFEEBLING_BLOW); events.ScheduleEvent(EVENT_ENFEEBLING_BLOW, urand(19000,24000)); break; case EVENT_SHADOW_GALE: if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 0, true, 0)) { ShadowGaleTrigger = me->SummonCreature(NPC_SHADOW_GALE_STALKER, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), target->GetOrientation(), TEMPSUMMON_CORPSE_DESPAWN); me->SetReactState(REACT_PASSIVE); me->GetMotionMaster()->MovePoint(POINT_ERUDAX_IS_AT_STALKER, -739.665f, -827.024f, 232.412f); me->MonsterYell(SAY_GALE, LANG_UNIVERSAL, NULL); } break; case EVENT_REMOVE_TWILIGHT_PORTAL: //Removes Portal effect from Stalker FacelessPortalStalker->RemoveAllAuras(); break; case EVENT_BINDING_SHADOWS: if (Unit* tempTarget = SelectTarget(SELECT_TARGET_RANDOM, 0, 500.0f, true)) DoCast(tempTarget,SPELL_BINDING_SHADOWS); events.ScheduleEvent(EVENT_BINDING_SHADOWS, urand(12000,17000)); break; default: break; } } DoMeleeAttackIfReady(); }
void HandleDummy(SpellEffIndex /*effIndex*/) { Unit* caster = GetCaster(); caster->GetAI()->SetGUID(GetHitUnit()->GetGUID(), DATA_TARGET_GUID); caster->CastSpell(GetHitUnit(), SPELL_SEND_FIRST_MUG, true); }