uses SysUtils;

var        
  Friends: array of string = ['Vasya', 'Petya', 'Kolya'];  // список ников "друзей"
  PathFromSpotToSafe: array of integer = [108869, -173711, -579,
                                          108592, -173446, -579,
                                          108211, -173558, -579 ];  // маршрут со спота к безопасной точке
                                          
  PathFromSafeToSpot: array of integer = [108211, -173558, -579,
                                          108592, -173446, -579,
                                          108869, -173711, -579 ];  // маршрут обратно на спот
    
function CheckStrangers(R: integer = 2000): boolean;
var i: integer;
begin
  result:= false;
  for i:= 0 to CharList.Count-1 do begin
    // игнорируем сопартийцев и игроков из списка "друзей" (можно так же игнорить сокланов и соали)
    if (CharList(i).IsMember) or StrInArray(CharList(i).Name, Friends) then continue;

    // если найден персонаж у нас на споте (+ альтернативная проверка по дистанции)
    if (CharList(i).InZone) or (User.DistTo(CharList(i)) < R) then begin  
      result:= true;
      break;
    end;
  end;  
end;  

function StrInArray(s: string; a: array of string): boolean;   // проверяет наличие строки в массиве строк
var i: integer;
begin
  result:= false;
  for i:= Low(a) to High(a) do begin
    if LowerCase(s) = LowerCase(a[i]) then begin
      result:= true;
      break;
    end;
  end;
end;

function HaveAgroMobs(): boolean;                 // функция проверяет, висят ли на нас агромобы
var i: integer;
begin
  result:= false;
  for i:= 0 to NpcList.Count-1 do begin
    if (IsAgr(NpcList(i))) then begin
      result:= true;
      exit;
    end;
  end;
end;

function IsAgr(Mob: TL2Npc): boolean;
begin
  result:= (Mob.Target = User) and (not Mob.Dead);
end;

// https://adrenalinebot.com/ru/api/example/movement-along-a-linear-route-starting-from-the-closest-to-us-point
function PathMoveTo(path: array of integer): boolean;        // функция движения по указанному маршруту
var i, start: integer;
begin
  result:= false;
  if (Length(path) >= 3) and (Length(path) mod 3 = 0) then begin
    start:= 0;
    for i:= 0 to Length(path) do begin
      if (i mod 3 <> 0) then continue;
      if (User.DistTo(path[i], path[i+1], path[i+2]) < User.DistTo(path[start], path[start+1], path[start+2])) then start:= i;
    end;
  end else exit;
  for i:= start to Length(path) do begin
    if (i mod 3 <> 0) then continue;
    if (User.Dead) then exit;
    result:= Engine.MoveTo(path[i], path[i+1], path[i+2]);
  end;
end;

begin  
  while delay(555) do begin
    if (Engine.Status = lsOnline) then begin
      // прибегаем на спот, включаем интерфейс и тд
      
      if CheckStrangers() then begin            // если обнаружили чужаков у нас на споте, то 
        Engine.Msg('[CheckStrangers]', 'Обнаружены чужаки! Отхожу в безопасное место...', 128);
        Engine.FaceControl(1, false);           // отключаем ведение боя в интерфейсе
        PathMoveTo(PathFromSpotToSafe);         // двигаемся в безопасную точку

        while CheckStrangers() and Delay(555) do begin                  // проверяем в цикле, есть ли чужаки на нашем споте, и если есть, то
          if (HaveAgroMobs) then begin                                  // если на нас висят агро мобы, то
            Engine.Msg('[CheckStrangers]', 'Отбиваюсь от мобов', 128);
            Engine.FaceControl(1, true);                                // включаем интерфейс 
            while (HaveAgroMobs) do delay(555);                         // пока есть агро мобы - ждем пока бот их убьет
            Engine.FaceControl(1, false);                               // выключаем интерфейс

            // выключаем так же интерфейс другим нашим окнам, если требуется
            GetControl('ник_твинка1').FaceControl(0, false);            
            GetControl('ник_твинка2').FaceControl(0, false);
          end;
        end;
        Delay(30*1000);   // ждем дополнительно 30 сек после ухода чужих персонажей
         
        
        // включаем обратно интерфейс нашим окнам
        GetControl('ник_твинка1').FaceControl(0, true);            
        GetControl('ник_твинка2').FaceControl(0, true);
        Delay(30*1000);   // ждем дополнительно 30 сек чтобы окна успели поднять ребаф и тд

        PathMoveTo(PathFromSafeToSpot);        // возвращаемся обратно на спот
        Engine.FaceControl(0, true);           // включаем интерфейс на основном окне
      
      end;
    end;
  end;

end.