uses SysUtils;

procedure FindChampionsThread(R: integer = 2000);
var i: integer;   point: TXYZ;
begin
  while delay(555) do begin
    if (Engine.Status = lsOnline) then begin
      for i:= 0 to NpcList.Count-1 do begin             // пробегаем по списку мобов
        if (NpcList(i).Team <> 0) and                   // если моб - чемпион и
        (User.DistTo(NpcList(i)) < R) and               // дистанция до моба < радиуса поиска и
        (Abs(User.Z - NpcList(i).Z) < 500) then begin   // разность по модулю координаты Z бота и моба < 500, то
          Print('Обнаружен чемпион: '+NpcList(i).Name+', [HP: '+IntToStr(NpcList(i).CurHP)+'], Dist: '+IntToStr(User.DistTo(NpcList(i))));
          // далее делаем то, что нужно, ниже будет приведен достаточно простые действия без особых проверок
          Engine.FaceControl(1, false);                 // выключаем боевку в боте
          point:= CalcXYZ(User, NpcList(i), 500);       // вычисляем координаты куда нужно подбежать к чемпиону
          Engine.MoveTo(point.X, point.Y, point.Z);     // бежим к мобу
          Engine.SetTarget(NpcList(i));                 // берем его в таргет 
          Engine.FaceControl(1, true);                  // включаем боевку обратно

          break;                                        // не забываем выйти из цикла
        end;
      end;
    end;
  end;
end;
        
begin
  Script.NewThread(@FindChampionsThread);    
  // code ...   
  Delay(-1);
end.