Скрипт нужно запускать запускать на главном окне. Не забудьте изменить ники персонажей, которыми нужно управлять.

Так же, у нас есть готовый, гораздо более мощный скрипт Manipulator, который умеет повторять за основным окном практически любые действия в игре.

const
  DialogRepeatEnable: boolean = true; // повтор диалогов, true(да) / false(нет)
  // список ников персонажей, которые должны повторять за основным окном
  DialogRepeatPlayerList: array of string = ['Krickt1338', 'Krickt1339', 'Vasya'];
  OpcodeStr = '23';  // для Interlude заменить на '21'
  OpcodeHex = $23;   // для Interlude заменить на $21

procedure OnCliPacket(ID1, ID2: Cardinal; Data: Pointer; Size: Word);   // обработчик исходящих пакетов (C->S)
begin
  if (DialogRepeatEnable) and (ID1 = OpcodeHex) then   // если повтор включен, и id пакета совпадает с выбором диалога, то
    DialogRepeat(MemToHex(Data^, Size));               // вызываем функцию, которая повторит выбор диалога указанным окнам
end;

procedure DialogRepeat(PacketData: string);
var 
  E: TL2Control;
  i: integer;
begin
  for i:= 0 to Length(DialogRepeatPlayerList)-1 do begin         // проходим по списку чаров, которыми нужно повторять диалоги
    E:= nil;
    E:= GetControl(DialogRepeatPlayerList[i]);                   // получаем Engine нужного окна
    if (E <> nil) then E.SendToServer(OpcodeStr + PacketData);   // если Engine получен, то отправляем пакет выбора диалога
  end;
end;

procedure DialogOpen(E: TL2Control);    // берет в таргет и открывает диалог с нужным NPC другим окном
begin
  E.SetTarget(User.Target.ID);
  E.DlgOpen;
end;

procedure DialogOpenThread();           // основной поток, выполняющий всю логику
var
  p1, p2: integer;
  i: integer;
  E: TL2Control;
  LastTargetID: cardinal;               // тут мы храним ID последнего нашего таргета
  LastDlgText: string;                  // тут будет храниться текст последнего диалога
begin
  Engine.SendActID(1);                        // активируем перехват C->S пакетов 
  while (true) do begin                       // запускаем бесконечный цикл
    Engine.WaitAction([laDlg], p1, p2);       // ждем события "открытие диалога"
    while (User.Target.ID = LastTargetID) and (Engine.DlgText <> LastDlgText) do delay(10);
    for i:= 0 to Length(DialogRepeatPlayerList)-1 do begin   // для каждого ника из списка персонажей
      E:= nil;
      E:= GetControl(DialogRepeatPlayerList[i]);             // получаем его Engine
      if (E <> nil) then                                     // и если Engine получен, то 
        Script.NewThread(@DialogOpen(E));                    // запускаем для его поток, который откроет диалог с нужным NPC
    end;
    LastTargetID:= User.Target.ID;                           // перезаписываем ID последнего цели
    LastDlgText:= Engine.DlgText;                            // и текст последнего диалога
  end;
end;

begin
  if (DialogRepeatEnable) then              // если повтор включен, то
    Script.NewThread(@DialogOpenThread);    // запускаем поток, который будет делать все необходимое

  // code ...    
    
  Delay(-1);
end.