void SmartAI::MoveInLineOfSight(Unit* who) { if (!who) return; GetScript()->OnMoveInLineOfSight(who); if (me->HasReactState(REACT_PASSIVE) || AssistPlayerInCombat(who)) return; if (!CanAIAttack(who)) return; if (me->IsHostileTo(who)) { float fAttackRadius = me->GetAttackDistance(who); if (me->IsWithinDistInMap(who, fAttackRadius) && me->IsWithinLOSInMap(who)) { if (!me->getVictim()) { who->RemoveAurasByType(SPELL_AURA_MOD_STEALTH); AttackStart(who); } else/* if (me->GetMap()->IsDungeon())*/ { who->SetInCombatWith(me); me->AddThreat(who, 0.0f); } } } //if (me->canStartAttack(who, false)) // AttackStart(who); }
void UpdateAI(const uint32 diff) { if (!UpdateVictim()) return; if (NapalmTimer <= diff) { if (Unit* pTarget = SelectUnit(SELECT_TARGET_RANDOM,0)) { if(CanAIAttack(pTarget)) DoCast(pTarget,SPELL_NAPALM,true); } NapalmTimer = 5000; } else NapalmTimer-=diff; }
bool SmartAI::AssistPlayerInCombatAgainst(Unit* who) { if (me->HasReactState(REACT_PASSIVE) || !IsAIControlled()) return false; if (!who || !who->GetVictim()) return false; // experimental (unknown) flag not present if (!(me->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST)) return false; // not a player if (!who->EnsureVictim()->GetCharmerOrOwnerPlayerOrPlayerItself()) return false; if (!who->isInAccessiblePlaceFor(me)) return false; if (!CanAIAttack(who)) return false; // we cannot attack in evade mode if (me->IsInEvadeMode()) return false; // or if enemy is in evade mode if (who->GetTypeId() == TYPEID_UNIT && who->ToCreature()->IsInEvadeMode()) return false; if (!me->IsValidAssistTarget(who->GetVictim())) return false; // too far away and no free sight if (me->IsWithinDistInMap(who, SMART_MAX_AID_DIST) && me->IsWithinLOSInMap(who)) { me->EngageWithTarget(who); return true; } return false; }
void SmartAI::MoveInLineOfSight(Unit* who) { if (!who) return; GetScript()->OnMoveInLineOfSight(who); if (me->HasReactState(REACT_PASSIVE) || AssistPlayerInCombat(who)) return; if (!CanAIAttack(who)) return; if (!me->CanStartAttack(who, false)) return; if (me->IsHostileTo(who)) { float fAttackRadius = me->GetAttackDistance(who); if (me->IsWithinDistInMap(who, fAttackRadius) && me->IsWithinLOSInMap(who)) { if (!me->GetVictim()) { // Clear distracted state on combat if (me->HasUnitState(UNIT_STATE_DISTRACTED)) { me->ClearUnitState(UNIT_STATE_DISTRACTED); me->GetMotionMaster()->Clear(); } AttackStart(who); } else/* if (me->GetMap()->IsDungeon())*/ { who->SetInCombatWith(me); me->AddThreat(who, 0.0f); } } } }
void DamageTaken(Unit *who, uint32 &damage) { if(!CanAIAttack(who)) damage = 0; }
void MoveInLineOfSight(Unit* who) override { if (!_inCombat && who->GetTypeId() == TYPEID_PLAYER && !who->ToPlayer()->IsGameMaster() && CanAIAttack(who)) { _inCombat = true; DoZoneInCombat(); me->SetByteValue(UNIT_FIELD_BYTES_1, UNIT_BYTES_1_OFFSET_STAND_STATE, UNIT_STAND_STATE_STAND); events.ScheduleEvent(EVENT_SUBMERGE, 10s); } }