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.