Счетчик игроков из указанных кланов + запись информации в файл

Данный скрипт отлично подходит для осад и прочих массовых замесов, когда хочется знать точное количество игроков от тех или иных кланов

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

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.