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.