uses SysUtils;

procedure RandomClicksThread(d: integer);
var X, Y, Z: integer;
begin
  X:= User.X;                                                              // устанавливаем начальные координаты точки
  Y:= User.Y;                                                              // относительно которой мы будем бегать
  Z:= User.Z;
  while Delay(1000) do begin                                               // запускаем бесконечный цикл
    if (Engine.Status = lsOnline) then begin                               // если мы в игре, то
      if (User.DistTo(X, Y, Z) > 2*d*d) then begin                         // если мы отдалились от ориентирной точки
        Print(Format('[RandomClicksThread] Координаты базовой точки обновлены: (%d, %d) -> (%d, %d)', [X, Y, User.X, User.Y]));
        X:= User.X;                                                        // обновляем координаты
        Y:= User.Y;
        Z:= User.Z;
      end;
    
      if (not User.Moved) and (not User.Sitting)                           // если мы не движемся и не сидим
      and (not User.InCombat) and (User.Cast.EndTime = 0)                  // не находимся в бою и ничего не кастуем
      and ((User.Target = nil) or (User.Target.Dead)) then begin           // и у нас либо нет цели либо цель мертва, то
        if Engine.DMoveTo(X+Random(2*d)-d, Y+Random(2*d)-d, User.Z) then   // делаем рандомный шаг в сторону
          Delay(1000+Random(5000));                                        // и ждем рандомное кол-во времени
      end;                                                  
    end;
  end;
end;

begin
  Script.NewThread(@RandomClicksThread, Pointer(150));       // запускаем поток, 2ым аргументом указываем макс дистанцию на которую будем отбегать
  // code...

  Delay(-1);
end.