uses SysUtils, Classes;

var
  SafePoint: array of integer = [147593, -112774, -2144];  // "безопасная" точка - куда отбегать для ребафа
  BuffID: integer = 1204;         // ID бафа, по которому проверять необходимость ребафа
  RebuffTime: cardinal = 60000;   // время до окончания бафа для ребафа (в мс)
  AltB: array of string = ['_bbshome', '_cbbsbuff;', '_cbbsblist:mage_scheme:index'];  // байпасы для бафа

procedure AltB_Rebuff_Thread();
var X, Y, Z: integer;
begin
  while delay(555) do begin
    if (BuffTime(BuffID) < RebuffTime) then begin
      Engine.Msg('[Rebuff]', 'Пора ребафаться, отхожу в безопасное место', 0);
      // предпринимаем необходимые действия, например тормозим другие потоки или что-то еще
      // если хотите чтобы бот сначала добил всех агро мобов, которые висят на нем,
      // прежде чем бежать в безопасную точку, то раскоментируйте код ниже
      {if (HaveAgroMobs) then begin
        Engine.Msg('[Rebuff]', 'Отбиваюсь от мобов', 128);
        while (HaveAgroMobs) do delay(555);
        Engine.FaceControl(1, true);
      end; }
      X:= User.X;
      Y:= User.Y;
      Z:= User.Z;
      Engine.FaceControl(1, false);
      Engine.Msg('[Rebuff]', 'Запомнил свои координаты: ['+IntToStr(X)+', '+IntToStr(Y)+', '+IntToStr(Z)+']', 0);
      while (User.DistTo(SafePoint[0], SafePoint[1], SafePoint[2]) > 222) do           // если нужно, то
        if Engine.MoveTo(SafePoint[0], SafePoint[1], SafePoint[2]) then delay(555);    // бежим в безопасную точку
      Delay(1000);
      if (HaveAgroMobs) then begin                                                     // если на нас висят агро мобы, то
        Engine.Msg('[Rebuff]', 'Отбиваюсь от мобов', 128);
        Engine.FaceControl(1, true);                                                   // включаем интерфейс
        while (HaveAgroMobs) do delay(555);                                            // пока есть агро мобы - ждем
        Engine.FaceControl(1, false);                                                  // выключаем интерфейс
        while (User.InCombat) do delay(555);                                           // ждем выхода из боя
      end;

      repeat BuffAltB();                                          // ребафаемся до тех пор
      until (BuffTime(BuffID) > RebuffTime);                      // пока время бафа не станет больше требуемого
      Engine.MoveTo(X, Y, Z);                                     // возвращаемся в координаты, которые запомнили перед бафом
      Engine.FaceControl(1, true);                                // включаем обратно интерфейс и продолжаем фарм

    end;
  end;
end;

// https://adrenalinebot.com/ru/api/example/buff-time-check
function BuffTime(ID: integer): cardinal;
var i: integer;
begin
  result:= 0;
  for i:= 0 to User.Buffs.Count-1 do begin        // пробегаем по списку своих бафов
    if (User.Buffs.Items(i).id = ID) then begin   // если ID совпал, то
      result:= User.Buffs.Items(i).EndTime;       // записываем в результат время до окончания бафа
      break;
    end;
  end;
end;

procedure BuffAltB();
var i: integer;
begin
  for i:= Low(AltB) to High(AltB) do
    if Engine.BypassToServer(AltB[i]) then delay(555);
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;
      break;
    end;
  end;
end;

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

begin
  Script.NewThread(@AltB_Rebuff_Thread);
  // тут может быть дополнительный код если что
  Delay(-1);
end.