procedure SweepThread(dist: integer);
var
  sweep: TL2Skill;
  mob: TL2Npc;
  point: TXYZ;
begin
  while Delay(500) do begin                          // запускаем бесконечный цикл
    if (Engine.Status = lsOnline)                    // если мы онлайн
    and SkillList.ByID(42, sweep) then begin         // и у нас есть умение Sweep [id: 42], то
      mob:= GetNearestSweepableMob(dist);            // ищем ближайшего моба которого можно свипать
      if (mob <> nil) then begin                     // если моба найден, то 
        if Engine.SetTarget(mob) then Delay(99);     // берем в таргет моба
        if (User.DistTo(mob) > 100) then begin       // если дистацния до моба > 100, то
          point:= CalcXYZ(User, mob, -20);           // вычисляем координаты точки, чтобы подойти на дистацию свипа
          if Engine.MoveTo(point.X, point.Y, point.Z) then Delay(500);   // подходим в найденную точку
        end;
        if Engine.UseSkill(sweep) then               // если мы успешно использовали свип, то
          while (sweep.EndTime <> 0) do Delay(99);   // ждем пока он не откатится
      end;
    end;
  end;
end;

function GetNearestSweepableMob(dist: integer): TL2Npc;   // возвращает ближайшего моба, которого можно свипать
var i: integer;
begin
  Result:= nil;
  for i:= 0 to NpcList.Count-1 do begin       // пробегаем по списку NPC вокруг нас
    if (NpcList(i).Valid)                     // если моб валиден
    and (User.DistTo(NpcList(i)) < dist)      // и дистанция до него меньше максимально допустимой
    and (NpcList(i).Dead)                     // и этот моб мертв
    and (NpcList(i).Sweepable) then begin     // и с него можно собрать спойл
      Result:= NpcList(i);                    // то запоминаем его в результат
      dist:= User.DistTo(NpcList(i));         // обновляем значение максимально допустимой дистанции
    end;
  end;
end;

begin
  Script.NewThread(@SweepThread, Pointer(300));   // вторым агрументом указываем макс дистанцию для свипа
  // code...
  
  Delay(-1);
end.