Скрипт нужно запускать запускать на главном окне. Не забудьте изменить ники персонажей, которыми нужно управлять.
Так же, у нас есть готовый, гораздо более мощный скрипт 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.