Скрипт запускает поток, который запоминает всех игроков из нужных кланов, которых видел за время работы. Во время работы пишет в логи найденное кол-во и сохраняет в файл ники персонажей и их профы.

uses SysUtils, Classes;
  
const
  Range: integer = 5000; // радиус видимости

  // названия кланов
  ClansNames: array of string = [
    'RiseOfSun',
    'RunAway',
    'GoldenTime',
    'RAqq',
    'JxStyle'
  ];

procedure ZergCounterThread();
var
  i, j, k: integer;
  Ch: TL2Char;
  SL: TStringList;
  ZergLists: array of array of string;
  Have: boolean;
begin
  SL:= TStringList.Create;
  try
    SetLength(ZergLists, Length(ClansNames)); 
    for i:= 0 to Length(ZergLists)-1 do
      SetLength(ZergLists[i], 0);
      
    while Delay(1000) do begin
      for i:= 0 to CharList.Count-1 do begin
        Ch:= CharList(i);
        Have:= false;
        for j:= 0 to Length(ZergLists)-1 do
          for k:= 0 to Length(ZergLists[j])-1 do
            if (ZergLists[j, k] = Ch.name) then begin
              Have:= true;
              Break;
            end;
        if (Have) or (User.DistTo(Ch) > Range) then continue;
          
        for j:= 0 to Length(ZergLists)-1 do
          if (Ch.Clan = ClansNames[j]) then begin
            SetLength(ZergLists[j], Length(ZergLists[j]) + 1);
            ZergLists[j, Length(ZergLists[j]) - 1]:= Ch.name;
          end;
      end;
      
      Print('-------------------------------------------------------');
      SL.Clear;
      for i:= 0 to Length(ZergLists)-1 do begin
        Print(ClansNames[i] + ': ' + IntToStr(Length(ZergLists[i])));
        SL.Add('----- ' + ClansNames[i] + ' (' + IntToStr(Length(ZergLists[i])) + ') -----');
        for j:= 0 to Length(ZergLists[i])-1 do begin
          if CharList.ByName(ZergLists[i, j], Ch) then
            SL.Add(ZergLists[i, j] + ' (' + GetL2ClassInfo(Ch.ClassID, 1) + ')')
          else
            SL.Add(ZergLists[i, j]);
        end;
        SL.Add('');
      end;
      SL.SaveToFile(Script.Path + User.Name + '_ZergList.txt');
    end;
  finally
    SL.Free;
  end;
end;

begin
  Script.NewThread(@ZergCounterThread);
  // code ...

  Delay(-1);
end.