Players counter from the specified clans + record information to file

This script is great for sieges and other mass fights, when you want to know the exact number of players from certain clans

The script launches a thread that remembers all the players from the necessary clans that it saw during the work. During operation, writes the found number to the logs and saves the nicknames of the characters and their classes to the file.

uses SysUtils, Classes;
  
const
  Range: integer = 5000; // radius of visibility

  // List of clans
  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.