ma5tak Опубликовано 29 октября, 2020 Поделиться Опубликовано 29 октября, 2020 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. Может кто-то помочь с данным скриптом, у меня окна повторяют за мейном только таргет и открывают диалоговое окно, дальше по строчкам не повторяют. Цитата OpcodeStr = '23'; // для Interlude заменить на '21' OpcodeHex = $23; // для Interlude заменить на $21 Значение на "21" менял, да и дело наверное не в этом, для теста пробовал ставить разные значения, даже "0" ставил. При этом скрипт работал так же, открывает диалоговое окно а дальше, по строчкам, не пашет. 0 Цитата Ссылка на комментарий Поделиться на другие сайты More sharing options...
Zanoza Опубликовано 29 октября, 2020 Поделиться Опубликовано 29 октября, 2020 Сумон Bolo и клан Vega пусть обьсняют как это делается))) P.s. Тоже интересно 0 Цитата Ссылка на комментарий Поделиться на другие сайты More sharing options...
iNoj Опубликовано 29 октября, 2020 Поделиться Опубликовано 29 октября, 2020 впиши в OnCliPacket хоть какой-то print для дебага, может она у тебя тупо не запускается 0 Цитата Ссылка на комментарий Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.