void bot_ai::ResetOrGetNextTarget() { if (master->GetBotMustDie()) return; uint64 targetGUID = 0; // check if anyone has raid target //targetGUID = getTargetWithIcon(); Group *group = master->GetGroup(); targetGUID = group->GetTargetWithIconByGroup (m_creature->GetGUID()); if (targetGUID && targetGUID!=master->GetGUID()) { Unit * target = m_creature->GetCreature(*master, targetGUID); if (target && target->isAlive() && target->IsHostileTo(master) && target->isInCombat() /*&& m_creature->IsWithinDist(target, 30)*/) { BotAttackStart(target); return; } } AttackerSet m_attackers = master->getAttackers(); //check if anyone is attacking master if(gettingAttacked(m_attackers)) return; //check if anyone is attacking me m_attackers = m_creature->getAttackers(); if(gettingAttacked(m_attackers)) return; //check if master has a victim if(master->getVictim() && master->getVictim()->IsHostileTo(master)) { if(m_creature->IsWithinDist(m_creature->getVictim(), 50)) { BotAttackStart(master->getVictim()); return; } } //lastly check a random victim, including bots, pets, etc Unit *target = DoSelectLowestHpFriendly(30); if(target != NULL && target->isAlive() && !target->IsHostileToPlayers()) { m_attackers = target->getAttackers(); if(gettingAttacked(m_attackers)) { return; } } //if there is no one to attack, make sure we are following master if(m_creature->getVictim() == NULL && m_creature->GetCharmInfo()->GetCommandState() != COMMAND_STAY && master->GetDistance(m_creature) > 20 && !master->IsBeingTeleported()) { if (!master->isAlive()) master->SetBotCommandState(COMMAND_STAY); else if (master->GetBotCommandState()==COMMAND_ATTACK) master->SetBotCommandState(prevCommandState); return; } }