Хостинг, который использует TopHope.RU более 2-х лет

Хостинг, который использует TopHope.RU более 2-х лет

Сайт для программистов

Краткий help по L2Ph 3.5.1.100+

Тема в разделе "Пакетный уровень", создана пользователем Midsummer, июл 22, 2013.

  1. Midsummer

    Midsummer Адекват

    Сообщения:
    18
    Симпатии:
    32
    Баллы:
    23
    # Решил запостить наработки умных людей (alexteam, J-Fobos и других) на тему гайда по пакетхаку.
    # Тема пригодится как новичкам, так и мастерам-олдфагам ;)

    Краткое содержание
    I. Информация об интерфейсе программы
    II. Инструменты разработки
    III. F.A.Q.​

    Ну что ж, поехали!

    Что такое L2PacketHack?
    L2PacketHack (далее PH, L2PH, ПХ) это программа предназначенная для контроля трафика игры Lineage и его модификации.

    Зачем нужен PH?
    В первую очередь, PH предназначен для автоматизации определенных действий и упрощения жизни игрокам.

    Об этом хелпе.
    Данный файл справки написан для версии 3.5.1.100 и будет постепенно обновляться и расширяться (расширен до версии 3.5.23.141). в Хелпе произведена попытка охватить полностью интерфейс и некоторые аспекты написания плагинов и скриптов. А так же добавлен F.A.Q. взятый с форума.
    Оговорка:
    обновляться будут только те элементы которые считаются критическими, т.е. скрин программы обновляться не будет только ради того чтобы в заголовке была новая версия и т.д. и т.п.


    Разработчики.
    В написании кода принимали участие следующие люди:
    xkor;
    NLObP;
    Wanick;
    QaK;
    alexteam.

    Форум программы Для того что-бы увидеть ссылку Зарегистрируйтесь на форуме.
    Скомпилированные версии можно найти Для того что-бы увидеть ссылку Зарегистрируйтесь на форуме.

    Оговорка:
    Назначение PH вовсе не связано со взломом серверов, это побочное явление которым пользуются люди желающие получить от программы гораздо больше, и при наличии соответствующего опыта и знания перечня недоработок серверов - получающие эту возможность.




    Основное окно программы
    Основное окно программы. (Структура главного меню)

    [​IMG]

    На приведенном скриншоте показано основное окно ПХ версии 3.5.23.141

    Оговорка:
    [No Connections] уведомляет о том, что на данный момент нет перехваченных соединений, а вовсе не о том что ПХ проверяет свою версию, либо возможность его использования.




    Файл

    Лог l2ph

    Пункт отображает форму содержащую системный лог ПХ. (пример):
    [​IMG]

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


    Открыть лог пакетов

    Позволяет открыть предварительно сохраненный лог пакетов для его анализа.
    Упрощает жизнь тем что не обязательно нужно запускать клиент чтобы глянуть внешний вид того или иного пакета, достаточно просто загрузить предварительно сохраненный лог.

    Пример:
    [​IMG]

    Подробнее об интерфейсных элементах можно прочитать в пункте "Фрейм" соединения.


    Открыть RAW лог пакетов

    РавЛоги, довольно интересная вещь, в них содержится то что присылает сервер и отправляет клиент в неизменном виде, именно то что происходит на уровне TCP, при этом не происходит даже "расклейка" пакетов.

    Этот пункт меню будет полезен тем, кто пытается написать newxor для сервера с нестандартной шифровкой. Он позволяет прогнать равлог через указанную ему библиотеку и отобразит получившийся результат и результат проверки (проверка заключается в том, что берется пакет, дешифруется, шифруется и сравнивается с изначальным вариантом, если найдены отличия значит что-то в написанной библиотеке не так, и в лог проверки выводиться изначальный пакет, декриптованый вариант, и криптованый вариант)

    Так же он годиться и для простых пользователей ПХ. использовать по вкусу.

    Окно состоит из 3х вкладок:

    Вкладка "Текущее состояние"
    [​IMG]

    Отображает содержимое равлога.

    Кнопки панели инструментов:
    1. Открыть РавЛог - вызывает диалог открытия файла
    2. Показывает лог в том виде в котором он есть (снимает нажатие с 3 и 4)
    3. Будет пытаться разбивать пакеты по формату (2байта(длинна), тело пакета(длинна в первых 2х байтах - 2))
    4. Будет пытаться Декодировать пакеты через NewXor (если он не задан - через встроенный алгоритм) и используя текущие установки в опциях (требует 3)
    5. Перечитывает РавЛог из файла
    6. Отображает направление пакета в вкладке "Текущее состояние"
    7. Отображает время отправки/приема пакета



    Вкладка "Разбор"
    [​IMG]

    Отображает результат декодирования пакетов из равлога, подробнее об интерфейсных элементах можно прочитать в пункте "Фрейм" соединения.

    Вкладка "Лог проверки"
    Содержит поле выводящее лог проверки, содержимое лога отсутствует при отсутствующих расхождениях между оригинальным пакетом и этим же пакетом предварительно декодированным и кодированным.


    Обновить информацию из *.ini

    Перезагружает информацию из следующих файлов:
    settings\sysmsgid.ini
    settings\itemsid.ini
    settings\npcsid.ini
    settings\classid.ini
    settings\skillsid.ini

    Так же принудительно вызывает обновление списка пакетов во всех перехваченных соединениях/открытых логах.

    Данный пункт полезен тогда когда производиться модификация указанных файлов. позволяет перечитать информацию из них не закрывая ПХ.


    Настройки

    Настройки ПХ, окно состоит из 3х вкладок разбивающих типы настройек по группам.

    Вкладка "Общие настройки"
    [​IMG]

    Содержит настройки дешифрации перехватываемых данных

    Элементы:

    1. ПХ не будет пытаться декриптовать трафик при установленной опции. Опция используется для создания логов на серверах с нестандартной шифрацией для последующего написания NewXor
    2. Устанавливается в случае использовании серверов защиты меняющей Xor ключ.
    3. Устанавливается на серверах соответствующей версии.
    4. Устанавливается на официальных серверах Lineage, не работает на Русском оф-сервере.
    5. Указывает что нужно использовать NewXor путь к которому указан в элементе 6.
    6. Путь к NewXor прописывается вручную, либо с помощью п.7.
    7. Открывает диалог поиска dll файла.
    8. Указывает какой из packetsХХ.ini использовать при отрисовке пакетов а фрейме соединения.
    9. Сохраняет и применяет опции.
    10. Перезагружает данные с Options.ini анулируя все изменения в текущем диалоге.

    Вкладка "Настройка перехвата"
    [​IMG]

    Содержит методы касаемые перехвата соединения.

    Элементы:

    1. Указывает приложения, соединения которых требуется перехватывать.
    2. Указывает Перечень портов, соединения по которым будут игнорироваться.
    3. Включает метод перехвата через внедряемую библиотеку загруженной в Пх с помошю п.6. путь к которой задан в п.7. при этом запущенные приложения будут сканироваться на предмет новых экземпляров процессов с именами из п.1. с интервалом указанным в п.4.
    4,5,6,7 - см. 3.
    8. Включает метод перехвата соединения с помощью Layered Service Provider.
    9. Деинсталирует модуль перехвата при выходе из пх.
    10. задает способ перехвата с помошью ЛСП библиотеки
    11. Задает путь к длл модулю (БЕЗ ПРОБЕЛОВ И РУССКИХ БУКВ В ИМЕНИ! иначе могут возникнуть проблемы)
    12. Указывает что Л2ПХ будет использоваться в качестве Socks5 прокси сервера. Данный режим работы позволяет запустить клиент/бот на другой машине.
    Оговорка:
    Для перехвата соединения нужно будет использовать дополнительный софт (freecap, permeo security driver, etc.)
    13. Порт на который ПХ принимает соединения в случае использования п.3, п.10 либо п8 с способом "Перехват соединения" установленным в п.10



    Вкладка "Дополнительно"
    [​IMG]

    Содержит несколько вспомогательных настроек ПХ.

    Оговорка:
    Умолчания - настройки для заново создаваемых фреймов соединений. применяются к каждому новому фрейму. в отдельно взятом фрейме их можно менять.


    Элементы:

    1,2,3,5. Устанавливает соответствующую опцию в фрейме соединения
    4. Позволяет вести и сохранять RAW логи
    6. Не будет спрашивать "Вы действительно хотите выйти" при закрытии пх.
    7. При запуске ПХ окно лога ПХ будет показано автоматически.
    8. Заголовок основоной формы будет задан в соостветсвии с данным шаблоном. помогает освободиться от защит определяющих "зловредные" утилиты по заголовкам окон.


    Выход

    Закрывает ПХ, предварительно спросив о необходимости этого действия (запрос можно отключить в настройках).

    При закрытии происходит разрыв всех перехваченных соединений в независимости от типа перехвата и (или) вашего желания.

    Оговорка:
    При использовании LSP перехвата разрыва как такового не происходит. перехваченное приложение (клиент/бот) становиться неспособным получать/отправлять данные. позаботьтесь о выходе из клиента прежде чем закрывать ПХ. (либо используйте ctrl+alt+del для закрытия клиента)



    Автоматизация

    Скрипты

    По мнению пользователей - одна из самых главных возможностей программы находится здесь
    Окно позволяет управлять скриптами, писать новые/модифицировать существующие. используя язык программирования ObjectPascal.

    Оговорка:
    Это не компилятор, а транслятор, транслятор очень ограничен и далеко не все что можно сделать в паскале тут реализуемо.
    Больше возможностей дают плагины.



    Внешний вид окна с загруженным для редактирования скриптом, открытым WatchList и списком скриптов.
    [​IMG]

    Кратко по назначению элементов:

    1. Создает новый скрипт, запросив предварительно имя для него, и помещает его в папку Scripts\
    2. Сохраняет скрипт (ctrl+s)
    3. Загружает текст скрипта из указанного файла и сохраняет его на манер п.1.
    4. Переименовывает текущий, открытый для редактирования скрипт.
    5. Удаляет текущий открытый скрипт.
    6. Компилирует скрипт. при неудачной компиляции сообщение об ошибке отображается в статусбаре (п.26) и строка с ошибкой выделяется с помощью маркера (п. 24)
    7. Компилирует скрипт (если он не был скомпилирован), переводит редактор в readonly и запускает процедуру Init в скрипте.
    8. Запускает процедуру Free в скрипте и снимает флаг readonly с редактора.
    9. Перезагружает список файлов доступных в папке Scripts\ и отображает их в п. 18.
    10. Скрывает/показывает перечень доступных скриптов (п. 18)
    11. Отображает окно логов ПХ (файл\лог l2ph) вынесено как кнопка в редактор скриптов из за того что скрипты могут писать в этот самый лог.
    12. Показывает/Скрывает Watchlist (п.16)
    13. Отображает форму содержащую в себе перечень классов поддерживаемых скриптовым движком а так же функций.
    14. Открывает окно настроек подсвечивания редактора. (Стандартное окно. язык интерфейса Англ. даже не просите переводить!)
    15. Открывает окно настроек горячих клавиш редактора. (Стандартное окно. язык интерфейса Англ. даже не просите переводить!)
    16. Watchlist. Отображает состояние переменных в момент выполнения скрипта.
    17. Само окно редактора.
    18. Перечень файлов скриптов находящихся в папке Scrypt\. в порядке их выполнения, для того чтобы скрипт исполнялся требуеться установить чекбокс (п.19 напротив скрипта), Менять порядок выполнения можно с помощью п.20 и п.21, так же есть возможность сохранить порядок скриптов (при следующей загрузке пх скрипты загрузятся в указанном порядке, и активируются если это того требуется).
    19. Будет ли исполняться скрипт при приходе пакета.
    20,21. Перемещение выбранного скрипта в списке вверх/вниз по списку.
    22. Сохраняет порядок и состояние чекбоксов (п.19) в options.ini
    23. Состояние строки (Синий - модифицирована/добавлена и была сохранена, Желтый - Изменена, зеленый - добавлена.)
    24. Маркер уведомляющий об ошибке в этой строке.
    25. Вкладка текущего скрипта с его именем и статусом (модифицирован - листик с карандашиком, не модифицирован - листик) и кнопкой закрыть. Естественно возможно наличие несколько вкладок и одновременное редактирование нескольких скриптов.
    26. Строка состояния отображающая последнее сообщение от редактора.

    Подробнее по синтаксису смотрите раздел "Разработка\Скриптинг"


    Плагины

    Содержит перечень плагинов, их описания и поддерживаемых ими функций. А так же позволяет загружать / выгружать плагины из списка.

    Окно "Плагины":
    [​IMG]

    Описание элементов:

    1. Перечень плагинов, находящихся в папке Plugins\. Отмеченные плагины - загружены.
    2. Описание текущего плагина.
    3. Поддерживаемые плагинами функции.

    Подробнее о написании плагинов смотрите раздел "Разработка\О плагинах"


    Пользовательская форма

    Содержит пустую форму которая имеет свою кнопку в таскабаре и которая доступна для размещения на ней экземпляров компонент/объектов с скриптов либо плагинов.
    По умолчанию форма не может быть показана.
    Об использовании формы читайте соответствующие разделы.​



    Дополнительно

    Фильтр пакетов

    Внешний вид:
    [​IMG]

    Содержит перечень пакетов в текущем packetXX.ini с возможностью скрывать их из перечня пакетов в фрейме соединения.

    Элементы:

    1. Направление
    2. Сохраняет настройки в Options.ini и перезагружает списки пакетов во всех фреймах соединений.
    3. Отмечает все/Инвертирует отмеченные в текущей вкладке.


    Преобразования

    Внешний вид:
    [​IMG]

    Форма служит для двунаправленного преобразования в(из) требуемый(ого) тип(а) из(в) hex.

    Элементы:

    1. Вид данных в формате указанном в п.3.
    2. Вид данных в HEX
    3. Тип данных в п.1.
    4. Преобразовать данные из п.1 в HEX и поместить результат в п.2.
    5. Обратно п.4.
    6. Будет вызывать действия в п.4/5 автоматически в зависимости от того в каком из полей выполняются изменения.
    7. Статус последнего преобразования.


    Процессы

    Внешний вид:
    [​IMG]

    Информационное окно содержащее в себе перечень запущенных процессов и перечень пропатченых (при использовании перехвата с помощью inject.dll) клиентов/ботов.


    Составление/просмотр пакета

    Внешний вид:
    [​IMG]

    Служит для составления/изменения/просмотра пакета.
    Полезно при отстутсвии в данный момент каких либо соединений пеерехваченых пх.

    Элементы:

    1. Направление отсылки пакета.
    2. HEX вид составляемого пакета с подсветкой блоков.
    3. Детальная расшифровка составляемого пакета.​



    Помошь


    О программе

    Внешний вид:
    [​IMG]

    Информационное окно содержащее версию, смешную картинку, переход на страничку программы.


    Язык

    Внешний вид:
    [​IMG]

    Изменяет язык интерфейса на требуемый.​



    "Фрейм" соединения

    Общий элемент для соединений, просмотра логов.

    Оговорка:
    Почему именно "фрейм" ? - потому что каждый такой элемент создается динамически для каждого соединения/открытого лога, а объекты содержащиеся в нем находятся на экземпляре объекта tFrame.


    Внешний вид главного окна программы с несколькими соединениями и открытым логом с отображенным экземпляром фрейма соединения.

    Вкладка Просмотр:
    [​IMG]

    Элементы:

    1. Перечитывает информацию из ini файлов и обновляет список пакетов в текущем фрейме.
    2. Сохраняет лог пакетов запросив имя файла.
    Оговорка:
    При активированном пункте "Дать возможность сохранять RAW логи" в опции\Дополнительно рядом с этим пунктом появляется еще одна "дискетка" позволяющая сохранить RAW лог.

    3. Очищает список пакетов в текущем фрейме.
    4. Добавляет текущий пакет в фильтр. (все пакеты с текущим типом не будут отображаться в логе пакетов)
    5. Удаляет текущий пакет из списка пакетов (не фильтрует, а именно удаляет).
    6. Добавляет пакет из п.16 в меню посылки.
    7. При деактивированном в списке пакетов не будут отображаться пакеты идущие от сервера.
    8. При деактивированном в списке пакетов не будут отображаться пакеты идущие от клиента.
    9. При деактивированном слежение за последним пришедшим пакетом будет отключено (автопрокрутка).
    10. При активированном лог пакетов перед автоочисткой будет сохранен автоматически (автоочистка происходит каждые 3000 пакетов, количество можно задать опцией MaxLinesInPktLog в options.ini (секция general)
    11. Открывает фильтр пакетов (Дополнительно\Фильтр пакетов).
    12. Показывать смещение (offset) в HEX/DEC
    13. При установленном запрещает автозакрытие данного фрейма при потере соединения к которому этот фрейм привязан. в последствии можно закрыть с помощью п.14.
    14. Закрывает текущий фрейм и разрывает соединение к которому фрейм привязан (если оно еще существует).
    15. Содержит перечень полученных/отправленных клиентом с их порядковым номером и типом.
    16. Отображает выбранный в п.15 пакет в HEX виде.
    17. Расшифровка пакета выбранного в п.15 (использует .ini файлы для определение имени и кол-ва полей)
    18. Все что обведено этой рамкой и есть "фрейм" соединения, в зависимости от того где он создан в нем могут отсутствовать определенные вкладки, либо кнопки.
    19. Перечень соединений, либо открытых логов, для установленного соединения у которого "определилось имя" вкладка называется именем соединения. в других случаях название вкладки описывается следующим образом: [тип перехвата/лог]#(идентификатор соединения/Имя лог файла)

    Вкладка посылка:
    Предназначена для ручной отправки пакета (пакет указывается без первых байтов длинны) на сервер/клиент.

    Внешний вид:
    [​IMG]

    Элементы:

    1. Сохраняет текущий пакет(ы) в файл
    2. Загружает пакет(ы) из файла.
    3. Отправка пакетов будет производиться в сторону сервера.
    4. Отправка пакетов будет производиться в сторону клиента
    5. При установленной опции каждая строчка будет восприниматься как отдельный пакет.
    6. Отправить в указанную сторону.
    7. Интервал отправки для таймера
    8. Активирует таймер который отправляет данный(е) пакет(ы) с интервалом указаным в п.7.
    9. Защищает фрейм от закрытия при дисконнекте.
    10. Закрывает фрейм и связаное с ним соединение.
    11. перечень пакетов на отправку
    12. hex вид пакета на текущей линии в п.11.
    13. Детальная расшифровка пакета в п.12.


    Вкладка дополнительно:
    Содержит редактор скриптов привязанный конкретно к этому соединению. отличие от основного редактора скриптов - нет процедур Init, Free. Сюда так же не поступают переменные PCK. В основном тут проверяют будут ли работать скрипты на сервере вообще. по умолчанию содержит скрипт отправляющий на клиент уведомление "Hello!!!"

    Данная вкладка не предназначена для запуска ПОЛНОЦЕННЫХ СКРИПТОВ
    Выполнение полноценного скрипта тут приведет к ошибке.

    Внешний вид:
    [​IMG]

    Элементы:

    1. Сохраняет скрипт в файл.
    2. Загружает скрипт из файла.
    3. Запускает скрипт.
    4. Прерывает выполнение скрипта.​

    Разработка

    Скриптинг
    Перечень поддерживаемых функций/процедур, переменных

    Перечень функций и процедур, добавляемых ПХ в движек FastScript:
    function HStr(Hex:String):String
    Конвертирует HEX представление в строку.
    Пример использования:
    Buf := HStr('01 20 30 30 0a 30 10 58 19 38 29 49 11 31 23 44 55 66 ab fa f5 f1 f6 f2 f5 01 00 00 00');

    procedure SendToClient
    Отправляет buf в направлении клиента. действует для текущего обрабатываемого соединения либо, для явно установленного с помошью UseForConnectName имени соединения или установленного с помошью UseForConnectID идентификатора соединения.
    действует для текущего обрабатываемого соединения либо, для явно установленного с помошью UseForConnectName имени соединения или установленного с помошью UseForConnectID идентификатора соединения.

    Пример использования:
    Buf := HStr('01 20 30 30 0a 30 10 58 19 38 29 49 11 31 23 44 55 66 ab fa f5 f1 f6 f2 f5 01 00 00 00');
    SendToClient;

    либо
    UseForConnectName := 'charactername';
    Buf := HStr('01 20 30 30 0a 30 10 58 19 38 29 49 11 31 23 44 55 66 ab fa f5 f1 f6 f2 f5 01 00 00 00');
    SendToClient;


    procedure SendToServer
    Аналогично SendToClient но в сторону сервера.


    procedure SendToClientEx(CharName:string)
    Аналогично SendToClient но с явным указанием имени соединения.


    procedure SendToServerEx(CharName:string)
    Аналогично SendToServer но с явным указанием имени соединения.

    procedure NoCloseFrameAfterDisconnect
    Уведомляет пх что после отключения от сервера либо клиента не нужно закрывать "фрейм соединения"
    действует для текущего обрабатываемого соединения либо, для явно установленного с помошью UseForConnectName имени соединения или установленного с помошью UseForConnectID идентификатора соединения.

    procedure NoCloseFrameAfterDisconnect
    анулирует действие NoCloseFrameAfterDisconnect
    действует для текущего обрабатываемого соединения либо, для явно установленного с помошью UseForConnectName имени соединения или установленного с помошью UseForConnectID идентификатора соединения.


    procedure NoCloseClientAfterServerDisconnect
    Не будет отсоединять клиент от пх при отсоединении пх от сервера
    действует для текущего обрабатываемого соединения либо, для явно установленного с помошью UseForConnectName имени соединения или установленного с помошью UseForConnectID идентификатора соединения.


    procedure CloseClientAfterServerDisconnect
    анулирует действие NoCloseClientAfterServerDisconnect
    действует для текущего обрабатываемого соединения либо, для явно установленного с помошью UseForConnectName имени соединения или установленного с помошью UseForConnectID идентификатора соединения.


    procedure NoCloseServerAfterClientDisconnect
    Не будет разрушать соединение пх с сервером при отключении клиента от пх
    действует для текущего обрабатываемого соединения либо, для явно установленного с помошью UseForConnectName имени соединения или установленного с помошью UseForConnectID идентификатора соединения.


    procedure CloseServerAfterClientDisconnect
    анулирует действие NoCloseServerAfterClientDisconnect
    действует для текущего обрабатываемого соединения либо, для явно установленного с помошью UseForConnectName имени соединения или установленного с помошью UseForConnectID идентификатора соединения.


    procedure Disconnect
    разрывает текущее соединение
    действует для текущего обрабатываемого соединения либо, для явно установленного с помошью UseForConnectName имени соединения или установленного с помошью UseForConnectID идентификатора соединения.

    function ConnectNameByID(id:integer):string
    получает имя соединения по его идентификатору


    function ConnectIDByName(name:string):integer
    Получает идентификатор соединения по его имени


    procedure SetName(Name:string)
    задает имя для текущего соединения
    действует для текущего обрабатываемого соединения либо, для явно установленного с помошью UseForConnectName имени соединения или установленного с помошью UseForConnectID идентификатора соединения.

    procedure Delay(msec: Cardinal)
    Делает задержку в скрипте. передаваемый параметр - милисекунды.
    Стоит учесть что на время задержки для текущего соединения полностью блокируеться передача данных между клиентом и сервером.


    procedure ShowForm
    Показывает пользовательскую форму


    procedure HideForm
    скрывает пользовательскую форму.


    procedure WriteS(v:string)
    дописывает строку в переменную Buf

    procedure WriteC(v:byte; ind:integer=0)
    Вписывает(при указании оффсета ind)/Дописывает байт в Buf


    procedure WriteD(v:integer; ind:integer=0)
    Вписывает(при указании оффсета ind)/Дописывает 4 байта (integer) в Buf


    procedure WriteH(v:word; ind:integer=0)
    Вписывает(при указании оффсета ind)/Дописывает 2 байта (word) в Buf

    procedure WriteF(v:double; ind:integer=0)
    procedure WriteQ(v:int64; ind:integer=0)
    Вписывает(при указании оффсета ind)/Дописывает 8 байт (double/int64) в Buf
    Для поддержки WriteQ в FastScript был вручную добавлен тип Int64

    procedure WriteMask(Mask:string; parameters : array of variant);
    Дописывает к буфферу целый ряд значений ориентируясь на указанную маску.
    к примеру вот такой вот ряд операторов

    WriteC(12);
    WriteD(SomeDVariabble);
    WriteH(19);
    WriteF(333);
    WriteQ(4923489);
    WriteS('Somestring');

    Заменяеться одной строчкой
    WriteMask('cdhfqs', [12, SomeDVariabble, 19, 333, 4923489, 'Somestring']);


    function ReadS(var index:integer):string
    function ReadC(var index:integer):byte
    function ReadD(var index:integer):integer
    function ReadH(var index:integer):word
    function ReadF(var index:integer):double
    function ReadQ(var index:integer):int64
    Читают требуемый тип по указанному офсету из pck и сдвигают index на длинну прочитаного значения.
    Пример использования

    var
    __i:integer;
    __s:string;
    __c:byte;
    __d:integer;
    __h:word;
    __f:double;
    __q:int64;
    begin
    i := 10; //offset;
    c := readc(i); //i = 11
    d := readd(i); //i = 15 ...
    h := readh(i);
    f := readsf(i);
    q := readq(i);
    s := reads(i);

    .....

    procedure ReadMask(Mask:string; var index:integer; var parameters : array of variant)
    Читает целый ряд значений из pck в зависимости от маски, и здвигает index на сумарную длинну прочитаных значений.
    пример выше выполненный с помошью этой функции выглядит вот так:

    var
    __i:integer;
    __s:string;
    __c:byte;
    __d:integer;
    __h:word;
    __f:double;
    __q:int64;
    begin
    i := 10; //offset;
    ReadMask('cdhfqs', i, [c, d, h, f, q, s]);
    .....


    Чуть короче.. не так ли ?
    ряд параметров можно "пропустить" к примеру вот так (допустим нам нужен только первый байт и строка в конце):
    ReadMask('cdhfqs', i, [c, 0, 0, 0, 0, s]);
    либо
    ReadMask('cdhfqs', i, [c, '', '', '', '', s]);


    procedure sendMSG(msg:String)
    Пишет текстовое сообщение в лог ПХ


    procedure CanUseAltTab(FormCaption: string)
    Помещает форму с указанным заголовоком (созданную в скрипте) в перечень окон видимых по аль+таб


    function LoadLibrary(LibName:String):Integer
    Загружает длл библиотеку


    function FreeLibrary(LibHandle:Integer):Boolean
    Выгружает длл библиотеку


    function StrToHex(str1:String):String
    Обратно HStr


    procedure CallPr(LibHandle:integer;FunctionName:String;Count:Integer;Params:array of variant)
    function CallFnc(LibHandle:integer;FunctionName:String;Count:Integer;Params:array of variant):string
    procedure TestFunc(LibHandle:integer;FunctionName:String;Count:Integer)
    procedure TestFunc1(LibHandle:integer;FunctionName:String;Count1:variant)
    function CallFunction(LibHandle:integer;FunctionName:String;Count:Integer;Params:array of variant):variant
    Функции для работы с процедурами/функциями длл (и проверки наличиятребуемых) загруженными с помошью LoadLibrary

    function CallSF(ScriptName:String;FunctionName:String;Params:array of variant):variant
    Вызов определенного метода(процедуры, функции) из другого скрипта.





    Перечень переменных добавляемых ПХ:
    var buf: string;
    Содержит буффер(пакет) отправляемый на сервер/клиент с помошью SendToServer, SntToClient, SendToServerEx, SendToClientEx


    var pck: string;
    Содержит буффер(пакет) пришедший от сервера/клиента


    const FromServer: Boolean;
    const FromClient: Boolean;
    Направление PCK


    const ConnectID: Integer;
    Идентификатор текущего соединения (менять бесполезно)


    const ConnectName: string;
    имя текущего соединения (менять можно с помошью SetName)

    var UseForConnectName: string;
    При задании данного значения привязывает имя определенного соединения к выполнению действий к определенному скрипту.
    к примеру SendToServer при задании UseForConnectName := 'charname' будет выполняться как SendToServerEx('charname')
    так же слудует учесть что тело скрипта будет запускаться только в случае прихода пакета от соединения с именем заданным в UseForConnectName


    var UseForConnectID: Integer;
    При задании действует аналогично UseForConnectName но для идентификатора соединения.
    Перечень функций/процедур имеющихся в FastScript согласно официального мануала
    Описание не требуеться ибо они стандартны для языка паскать и их описание легко можно найти в поисковиках.

    function IntToStr(i: Integer): String;
    function FloatToStr(e: Extended): String;
    function DateToStr(e: Extended): String;
    function TimeToStr(e: Extended): String;
    function DateTimeToStr(e: Extended): String;
    function VarToStr(v: Variant): String;
    function StrToInt(s: String): Integer;
    function StrToFloat(s: String): Extended;
    function StrToDate(s: String): Extended;
    function StrToTime(s: String): Extended;
    function StrToDateTime(s: String): Extended;
    function Format(Fmt: String; Args: array): String;
    function FormatFloat(Fmt: String; Value: Extended): String;
    function FormatDateTime(Fmt: String; DateTime: TDateTime): String;
    function FormatMaskText(EditMask: string; Value: string): string;
    function EncodeDate(Year, Month, Day: Word): TDateTime;
    procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);
    function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime;
    procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);
    function Date: TDateTime;
    function Time: TDateTime;
    function Now: TDateTime;
    function DayOfWeek(aDate: DateTime): Integer;
    function IsLeapYear(Year: Word): Boolean;
    function DaysInMonth(nYear, nMonth: Integer): Integer;
    function Length(s: String): Integer;
    function Copy(s: String; from, count: Integer): String;
    function Pos(substr, s: String): Integer;
    procedure Delete(var s: String; from, count: Integer);
    procedure Insert(s: String; var s2: String; pos: Integer);
    function Uppercase(s: String): String;
    function Lowercase(s: String): String;
    function Trim(s: String): String;
    function NameCase(s: String): String;
    function CompareText(s, s1: String): Integer;
    function Chr(i: Integer): Char;
    function Chr(i: Integer): Char;
    function Ord(ch: Char): Integer;
    procedure SetLength(var S: String; L: Integer);
    function Round(e: Extended): Integer;
    function Trunc(e: Extended): Integer;
    function Int(e: Extended): Integer;
    function Frac(X: Extended): Extended;
    function Sqrt(e: Extended): Extended;
    function Abs(e: Extended): Extended;
    function Sin(e: Extended): Extended;
    function Cos(e: Extended): Extended;
    function ArcTan(X: Extended): Extended;
    function Tan(X: Extended): Extended;
    function Exp(X: Extended): Extended;
    function Ln(X: Extended): Extended;
    function Pi: Extended;
    procedure Inc(var i: Integer; incr: Integer = 1);
    procedure Dec(var i: Integer; decr: Integer = 1);
    procedure RaiseException(Param: String);
    procedure ShowMessage(Msg: Variant);
    procedure Randomize;
    function Random: Extended;
    function ValidInt(cInt: String): Boolean;
    function ValidFloat(cFlt: String): Boolean;
    function ValidDate(cDate: String): Boolean;
    function CreateOleObject(ClassName: String): Variant;
    function VarArrayCreate(Bounds: Array; Typ: Integer): Variant;
    Что нужно знать для написания скриптов

    # Автор xkor.
    # Немного видоизменена.
    _____________

    Прежде всего вам понадобится умение программирования на Object Pascal (или Delphi, что примерно тоже самое) и для манипуляций с пакетами естественно понадобится знать что они из себя представляют, о пакетах подробнее можно почитать в соответствующем разделе.

    В этой теме я лишь приведу описания внутренних функций и переменных программы.

    Описание FastScript: (это скриптовой движек использованный в программе)
    Для того что-бы увидеть ссылку Зарегистрируйтесь на форуме.

    Доступные переменные:
    pck (string) - текущий обрабатываемый пакет (без первых двух байт с размером)
    FromClient (boolean) - пакет (pck) пришел от клиента (всёравно что not FromServer)
    FromServer (boolean) - пакет (pck) пришел от сервера (всёравно что not FromClient)
    buf (string) - буфер, используемый некоторыми функциями
    ConnectName (string) - имя чара от или к которому идёт пакет (v. 3.1.3+)
    ConnectID (integer) - номер соединения для которого выполняется скрипт
    Доступные функции:
    ShowForm и HideForm - для отображения/скрытия формы (UserForm), управлять которой можно из скрипта
    Для рисования на ней контролов надо указывать UserForm в качестве родителя
    SendToClient - отправляет клиенту содержимое переменной buf
    SendToServer - отправляет серверу содержимое переменной buf
    SendToClientEx(CharName: string) - отправляет клиенту с именем CharName содержимое переменной buf (v. 3.1.3+)
    SendToServerEx(CharName: string) - отправляет серверу с именем CharName содержимое переменной buf (v. 3.1.3+)
    (к пакету buf автоматически добавляются 2 байта длины)
    CanUseAltTab(FormCaption: string) - Добавляет форму созданую в скрипте в список форм видимых по alt+tab. в качестве параметра - заголовок формы. (v. 3.5.1+)
    NoCloseServerAfterClientDisconnect - запрещает закрытие соединения при дисконекте клиента (v. 3.5.1+)
    NoCloseClientAfterServerDisconnect - запрещает закрытие соединения при дисконекте сервера (v. 3.5.1+)
    CloseServerAfterClientDisconnect - разрешает закрытие соединения при дисконекте клиента (v. 3.5.1+)
    CloseClientAfterServerDisconnect - разрешает закрытие соединения при дисконекте сервера (v. 3.5.1+)
    (по умолчанию закрытия разрешены)
    Disconnect - закрывает соединение (v. 3.5.1+)

    ConnectNameByID(id:integer):string - возвращает имя соединения по его ID (v. 3.2.0+)
    ConnectIDByName(name:string):integer - возвращает ID соединения по его имени (v. 3.2.0+)
    SetName(Name:string) - устанавливает имя соединения (v. 3.2.0+)

    ReadC(var index:integer):byte - читает из переменной pck байт
    ReadH(var index:integer):word - читает из переменной pck число (2 байта) (v. 3.1.8+)
    ReadD(var index:integer):integer - читает из переменной pck число (4 байта)
    ReadF(var index:integer):double - читает из переменной pck число c плавающей запятой(8 байт) (v. 3.1.8+)
    ReadS(var index:integer):string - читает из переменной pck строку (в пакете строка unicode нультерминированная, а результирующая строка обычная паскалевская)
    Index - начальная позиция чтения, которая модифицируется функцией (сдвигается на число считанных байт)

    HStr(h:string):string - преобразует строку в HEX-последовательность
    К примеру, HStr('AA 00 BB 00 CC 00') вернёт цепочку байт #$AA#$00#$BB#$00#$CC#$00. Можно передавать строку как с пробелами, так и без них; регистр символов не имеет значения.

    WriteC(v:byte; ind:integer=0) - пишет в переменную buf один байт
    WriteH(v:word; ind:integer=0) - пишет в переменную buf число (2 байта) (v. 3.1.8+)
    WriteD(v:integer; ind:integer=0) - пишет в переменную buf число (4 байта)
    WriteF(v:double; ind:integer=0) - пишет в переменную buf число c плавающей запятой(8 байт) (v. 3.1.8+)
    WriteS(v:string) - пишет в переменную buf строку (автоматический перевод в unicode)
    В первых четырёх процедурах присутствует необязательный параметр ind. Если параметр не указан, то переменная buf дополняется байтом/числом, иначе модифицируется часть буфера.

    sendMSG(msg:String) - пишет msg в лог ПХ.
    LoadLibrary(LibName:String):Integer - подгружает к программе библиотеку LibName и возвращает указатель на неё (v. 3.1.8+)
    FreeLibrary(LibHandle:Integer):Boolean - выгружает из памяти программы библиотеку (v. 3.1.8+)
    CallFnc(LibHandle:integer;FunctionName:String;Count:Integ er;Params:array of variant):String- вызывает функцию FunctionName из зарание подгруженной библиотеки с указателем LibHandle и параметрами перечисленными в Params (v. 3.5.1+)
    CallPr(LibHandle:integer;FunctionName:String;Count:Integ er;Params:array of variant);- вызывает процедуру FunctionName из зарание подгруженной библиотеки с указателем LibHandle и параметрами перечисленными в Params (v. 3.5.1+)
    CallSF(ScriptName:String;FunctionName:String;Params:array of variant):variant - вызывет функцию FunctionName из скрипта ScriptName (v. 3.5.1+)
    Пример:
    buf=HStr('AA BB CC DD EE');
    Если вызвать функцию WriteD(10,1), то получим buf=[0A 00 00 00 EE].
    А если просто WriteD(10), то [AA BB CC DD EE 0A 00 00 00].

    Например скрипт:
    Код:
    begin
      if FromClient and (ConnectName='SokolA') 
      and (pck=HStr('1b 04 00 00 00')) then begin
        buf:=HStr('45 00 00 00 00 00 00 00 00 00');
        SendToServerEx('SokolB');
        pck:='';
      end;
    end
    При получении от клиента играющего за чара с ником SokolA пакета 1b 04 00 00 00 (социальное действие "Victory") непропустит этот пакет и отправит пакет 45 00 00 00 00 00 00 00 00 00 (команда сесть) от имени клиента играющего за чара с ником SokolB, тоесть играете вы в два окна, в одном SokolA, в другом SokolB, нажимаете в первом Victory, и SokolB садится.

    Пример вызова функций из системных библиотек:
    Код:
    var
      lib,Lib1:Integer;
      Res:variant;
      ar:array of variant;
    begin
      lib := loadLibrary('User32.dll');
      lib1 := loadLibrary('GDI32.dll');
      Res := CallFunction(lib,'MessageBoxW',4,[nil,'Text1','text2',0]);
      Res := CallFunction(lib,'GetDC',1,[0]);
      CallFunction(lib1,'LineTo',3,[Res,100,100]);
      CallFunction(lib,'ReleaseDC',2,[0,Res]);
      FreeLibrary(lib);
      FreeLibrary(lib1);
    end.
    Скрипты:
    Процедура Init вызывается когда вы устанавливаете рядом со скриптом галочку. либо вызываете TestInit.
    Процедура Free вызывается когда вы убираете рядом со скриптом галочку. либо вызываете TestFree.
    Основное тело скрипта (между begin и end) вызывается каждый раз при получении пакета от сервера или клиента если скрипт отмечен галочкой.


    О плагинах
    Плагины. назначение и возможности.

    Плагины предназначены для расширения возможностей работы скриптов либо полного их (скриптов) замещения.
    Расширение достигаеться за счет возможности добавления своих функций/процедур в скриптовый движек с помошью плагинов (подробнее смотри примеры доступные на свн, либо тут в соответствующей ветке) и обработчиков этих функций.
    Замещение скриптов возможно по той причине что плагины как и скрипты имеют те же (по возможностям) вызываемые методы.
    отличие от скриптов одно - нет ограничения накладваемого скриптовым движком, тобишь можно полноценно использовать всю силу языка програмирования а не довольствоваться возможностями fastscript.


    Структура плагина.

    Структура плагина, ОБЯЗАТЕЛЬНЫЕ ЭЛЕМЕНТЫ

    library plugin_demo3;

    uses
    __FastMM4 in '..\fastmm\FastMM4.pas',
    __FastMM4Messages in '..\fastmm\FastMM4Messages.pas',
    __windows,__
    __usharedstructs in '..\units\usharedstructs.pas',
    __plugin_demo3_form in 'plugin_demo3_form.pas' {MyForm};

    var
    __min_ver_a: array[0..3] of Byte = ( 3,5,23,______141__ );
    __min_ver: LongWord absolute min_ver_a; // минимальная поддерживаемая версия программы
    __ps: TPluginStruct; // структура передаваемая в плагин

    // Обязательно вызываемая функция.
    // Должна вернуть описание плагина,
    // заодно может проверить версию программы
    function GetPluginInfo(const ver: LongWord): PChar; stdcall;
    begin
    __if ver<min_ver then
    ____Result:=Описание плагина+sLineBreak+
    ____________'У вас старая версия программы! Плагин не сможет корректно с ней работать!'
    __else
    ____Result:=описание плагина';
    end;

    // Обязательно вызываемая функция.
    // Получает структуру с ссылками на все функции основной программы,
    // которые могут вызываться из плагина.
    // Если вернёт False то плагин выгружается.
    function SetStruct(const struct: PPluginStruct): Boolean; stdcall;
    begin
    __ps := struct^;
    __Result:=True;
    end;



    // экспортируем используемые программой функции
    exports
    __GetPluginInfo,
    __SetStruct;
    begin
    end.


    Класс TPluginStruct экземпляр которого передается плагину можно глянуть в разделе "Содержимое uSharedStructs"
    Все ее функции/процедуры в ней аналогичны тем что используются в скриптах.
    plugin_demo.dpr; работа с пакетами

    library plugin_demo;

    {$define RELEASE} // для совместимости с релизом пакетхака, при дебуге можно закоментировать

    uses
    __FastMM4 in '..\fastmm\FastMM4.pas',
    __FastMM4Messages in '..\fastmm\FastMM4Messages.pas',
    __SysUtils,
    __Windows,
    __dialogs,
    __Classes,
    __usharedstructs in '..\units\usharedstructs.pas';

    var________________________________
    __min_ver_a: array[0..3] of Byte = ( 3,5,23,______141__ );
    __min_ver: LongWord absolute min_ver_a; // минимальная поддерживаемая версия программы
    __ps: TPluginStruct;
    __ppck: string;
    const
    __pause=15000;

    var
    __ColvoHP, CharObjID, ItemObjHP: integer;
    __CurHP, MaxHP : integer;
    __lastHP, cntHP:cardinal;
    __TimerHP: Boolean;
    __StatusHP: Boolean;

    function GetPluginInfo(const ver: LongWord): PChar; stdcall;
    begin
    __if ver<min_ver then
    ____Result:='Демонстрационный Plugin к программе l2phx'+sLineBreak+
    ____________'Для версий 3.5.23.141+'+sLineBreak+
    ____________'У вас старая версия программы! Плагин не сможет корректно с ней работать!'
    __else
    ____Result:='Демонстрационный Plugin к программе l2phx'+sLineBreak+
    ____________'Для версий 3.5.23.141+'+sLineBreak+
    ____________'Автовыпивалка НР бутылок';
    end;


    procedure Say(msg:string);
    var
    __buf: string;
    begin
    __with ps do begin
    ____buf:=HexToString('4A 00 00 00 00');
    ____WriteD(buf,2);
    ____WriteS(buf,'AutoHP');
    ____WriteS(buf,msg);
    ____SendPacketStr(buf,cntHP,False);
    __end;
    end;


    function SetStruct(const struct: PPluginStruct): Boolean; stdcall;
    begin
    __ps := struct^;
    __Result:=True;
    __cntHP := 0;
    end;




    procedure StatsUpdate;
    var
    i: integer;
    begin
    for i:=0 to ps.ReadDEx(ppck,7)-1 do
    case ppck[i*8+8] of
    __ #$09: CurHP:=ps.ReadDEx(ppck,i*8+15);
    __ #$0A: MaxHP:=ps.ReadDEx(ppck,i*8+15);
    end;
    say('CurHP/MaxHP = '+inttostr(curhp)+'/'+inttostr(maxhp));
    if (CurHP<=MaxHP-50) then TimerHP:=true else TimerHP:=false;
    end;

    procedure OnLoad; stdcall;
    begin
    __statusHP:=false;
    __CharObjID:=0;
    __ItemObjHP:=0;
    __TimerHP:=false;
    __lastHP:=0;
    __cntHP := 0;
    __with ps do
    ____begin

    ____if GoFirstConnection then
    ______repeat
    ______cntHP := ConnectInfo.ConnectID;
    ______Say('Для выбора нужного соединения наберите в чате слово set и отправьте');
    ______until GoNextConnection;
    ______
    ____end;
    end;

    procedure OnPacket(const cnt: integer; const fromServer: Boolean; const connectionname:string; var pck: string); stdcall;
    var
    __buf: string;
    begin
    __if length(pck) < 3 then exit;
    __ppck:=pck;

    __if not FromServer and (pck[1]=#$38) and (cntHP=0) then
    __if(ps.ReadSEx(pck,3)='set')then begin
    ____pck := ''; // не пропускаем пакет
    ____cntHP:=cnt;
    ____Say('Выбрано это соединение.');
    ____Say('Для начала работы скрипта бросаем, подбираем или выпиваем Heal Potion!');
    __end;

    __if FromServer and(cnt = cntHP)then begin
    ____//InventoryUpdate
    ____if(pck[1]=#$27)and((ps.ReadDEx(pck,13)=1060)
    ____or(ps.ReadDEx(pck,13)=1061))then begin //Healing Potion, Lesser Healing Potion
    ______ItemObjHP:=ps.ReadDEx(pck,9);
    ______ColvoHP:=ps.ReadDEx(pck,17); //количество хилок
    ______if statusHP then exit;
    ______Say('Автоматическое использование Нeal Рotion готово к работе!');
    ______Say('Хилок='+IntToStr(ColvoHP));
    ______statusHP:=true;
    ____end;

    ____//UserInfo
    ____if(pck[1]=#$04)then
    ______begin
    ________CharObjID:=ps.ReadDEx(ppck,19);
    ________MaxHP:=ps.ReadDEx(ppck,83);
    ______end;

    ____//StatusUpdate
    ____if((pck[1]=#$0E)and(ps.ReadDEx(pck,3)=CharObjID)and(pck[4]=#$04))then
    ______StatsUpdate;

    ____if TimerHP and(GetTickCount-lastHP > pause)then begin
    ______lastHP:=GetTickCount;
    ______buf:=#$14;
    ______ps.WriteD(buf,ItemObjHP);
    ______ps.WriteD(buf,0);
    ______ps.SendPacketStr(buf,cnt,True);
    ______if ColvoHP<5 then
    ________Say('Кончаются хилки! Закупите Heal Potion!');
    ______if ColvoHP=1 then begin
    ________Say('Хилок='+inttostr(ColvoHP-1));
    ________Say('Кончились хилки! Закупите Heal Potion!');
    ________TimerHP:=False;
    ______end;
    ____end;
    __end;

    end;

    exports
    __GetPluginInfo,
    __OnPacket,
    __OnLoad,
    __SetStruct;

    begin
    end.
    plugin_demo2.dpr; Добавление своих функций

    library plugin_demo2;

    {$define RELEASE} // для совместимости с релизом пакетхака, при дебуге можно закоментировать

    uses
    __FastMM4 in '..\fastmm\FastMM4.pas',
    __FastMM4Messages in '..\fastmm\FastMM4Messages.pas',
    __windows,

    __// модуль с описаниями основных типов
    __// используемых в плагине и программе
    __usharedstructs in '..\units\usharedstructs.pas';



    var
    __min_ver_a: array[0..3] of Byte = ( 3,5,23,______141__ );
    __min_ver: LongWord absolute min_ver_a; // минимальная поддерживаемая версия программы
    __ps: TPluginStruct; // структура передаваемая в плагин

    // Обязательно вызываемая функция.
    // Должна вернуть описание плагина,
    // заодно может проверить версию программы
    function GetPluginInfo(const ver: LongWord): PChar; stdcall;
    begin
    __if ver<min_ver then
    ____Result:='Демонстрационный Plugin к программе l2phx'+sLineBreak+
    ____________'Для версий 3.5.23.141+'+sLineBreak+
    ____________'У вас старая версия программы! Плагин не сможет корректно с ней работать!'
    __else
    ____Result:='Демонстрационный Plugin к программе l2phx'+sLineBreak+
    ____________'Для версий 3.5.23.141+'+sLineBreak+
    ____________'Показывает каким образом можно добавить свою функцию/процедуру в ПХ'+sLineBreak+
    ____________'';
    end;

    // Обязательно вызываемая функция.
    // Получает структуру с ссылками на все функции основной программы,
    // которые могут вызываться из плагина.
    // Если вернёт False то плагин выгружается.
    function SetStruct(const struct: PPluginStruct): Boolean; stdcall;
    begin
    __ps := struct^;
    __Result:=True;
    end;


    // Необязательно вызываемая функция. (может отсутствовать в плагине)
    // Вызывается при вызове скриптовой функции обьявленной в RefreshPrecompile
    function OnCallMethod(const ConnectId, ScriptId: integer;
    ______________________const MethodName: String; // имя функции в верхнем регистре
    ______________________var Params, // параметры функции
    ______________________FuncResult: Variant // результат функции
    ________ ): Boolean; stdcall; // если вернёт True то дальнейшая
    ______________________________// обработка функции прекратиться
    begin
    __Result:=False; // передаём обработку функции программе
    __if MethodName='PI' then begin
    ____Result:=True; // запрещаем дальнейшую обработку функции в программе
    ____FuncResult:=Pi;
    __end;

    __if MethodName='SHOW_MY_MESSAGE' then begin
    ____MessageBox(0,pchar(string(Params[0])),'',MB_OK);
    ____Result:=True; // запрещаем дальнейшую обработку функции в программе
    ____FuncResult:=0; //какой результат ? это процедура.
    __end;
    end;

    // Необязательно вызываемая функция. (может отсутствовать в плагине)
    // Вызывается после иницализации плагина, позволяет добавлять свои функции в редактор / скриптовый движек
    Procedure OnRefreshPrecompile; stdcall;
    begin
    __ps.UserFuncs.Add('function Pi:Extended');
    __ps.UserFuncs.Add('procedure Show_my_message(msg:string)');
    __//а вот теперь внимание
    __//ps.UserFuncs.Add('procedure Show_my_message(%s)');
    __//%s говорит о том что функция в своих параметрах будет передавать изначально
    __//екземпляр класса TfsScript
    __//%s должен быть последней либо единственным параметром
    __//к примеру обьявление некоторых функций в пх
    __//
    __//'procedure SetName(Name:string;%s)'
    __//'procedure Disconnect(%s)'
    __//'procedure WriteS(v:string;%s)'
    __//
    __//обратите внимание на ";" перед параметром, он есть при условии что %s не единственный параметр функции
    __//что это дает:
    __//возможность выдергивать переменные с фастскрипта.
    __//как это делаеться в пх:
    __{
    __if sMethodName = 'DISCONNECT' then
    __begin
    ____ConId:=TfsScript(Integer(Params[0])).Variables['ConnectID'];
    ____DoDisconnect(ConId);
    __end

    __либо

    __if sMethodName = 'SETNAME' then
    __begin
    ____buf:=TfsScript(Integer(Params[1])).Variables['buf'];
    ____ConId:=TfsScript(Integer(Params[1])).Variables['ConnectID'];
    ____SetConName(ConId, String(Params[0]));
    __end__
    __}
    __//TfsScript(Integer(Params[0])) - екземпляр TfsScript


    end;


    // экспортируем используемые программой функции
    exports
    __GetPluginInfo,
    __SetStruct,
    __OnCallMethod,
    __OnRefreshPrecompile;

    begin
    end.
    plugin_demo.dpr; добавление своих функций (расширенная версия)

    library plugin_demo4;

    {$define RELEASE} // для совместимости с релизом пакетхака, при дебуге можно закоментировать

    uses
    __FastMM4 in '..\fastmm\FastMM4.pas',
    __FastMM4Messages in '..\fastmm\FastMM4Messages.pas',
    __windows,
    __variants,
    __classes,__
    __usharedstructs in '..\units\usharedstructs.pas';

    var________________________________{version} {revision}
    __min_ver_a: array[0..3] of Byte = ( 3,5,23,______141__ );
    __min_ver: Integer absolute min_ver_a; // минимальная поддерживаемая версия программы
    __ps: TPluginStruct;

    function GetPluginInfo(const ver: Integer): PChar; stdcall;
    begin
    __if ver<min_ver then
    ____Result:='Демонстрационный Plugin к программе l2ph'+sLineBreak+
    ____________'Для версий 3.5.23.141+'+sLineBreak+
    ____________'У вас старая версия программы! Плагин не сможет корректно с ней работать!'
    __else
    ____Result:='Демонстрационный Plugin к программе l2ph'+sLineBreak+
    ____________'Для версий 3.5.23.141+'+sLineBreak+
    ____________'"Как добавить свою функцию и ее обработчик" часть вторая. © alexteam'+sLineBreak+
    ____________sLineBreak+
    ____________sLineBreak+
    ____________'Плагин - хранилище глобальных переменных, обьектов, все что можно впихнуть в тип variant (тобиш все). общих для всех скриптов'+sLineBreak+
    ____________sLineBreak+
    ____________'Функции говорят сами за себя:'+sLineBreak+
    ____________'function isGlobalVarExists(name:string):boolean'+sLineBreak+
    ____________'procedure SetGlobalVar(name:string; variable:Variant)'+sLineBreak+
    ____________'procedure DeleteGlobalVar(name:string)'+sLineBreak+
    ____________'Function GetGlobalVar(name:string):Variant'+sLineBreak+
    ____________'procedure DeleteAllGlobalVars'+sLineBreak;
    end;

    function SetStruct(const struct: PPluginStruct): Boolean; stdcall;
    begin
    __ps := struct^;
    __Result:=True;
    end;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //Код плагина.


    type
    __TVariable = class(tobject)
    __name : string;
    __variable : variant;
    __Constructor create;
    __Destructor destroy; override;
    __end;

    var
    __VarList : Tlist;


    constructor TVariable.create;
    begin
    __//Добавляем себя в глобальный список
    __VarList.Add(self);
    end;

    destructor TVariable.destroy;
    var
    __i: integer;
    begin
    __//Удаляем себя из глобального списка
    __i := 0;
    __while i < VarList.Count do
    __begin
    ____if TVariable(VarList.Items) = self then
    ____begin
    ______VarList.Delete(i);
    ______exit;
    ____end;
    ____inc(i);
    __end;
    __inherited;
    end;

    procedure OnLoad; stdcall;
    begin
    __VarList := TList.Create;

    end;


    procedure DeleteAllGlobalVars;
    begin
    while VarList.Count > 0 do
    __TVariable(VarList.Items[0]).destroy;
    end;

    procedure OnFree; stdcall;
    begin
    __DeleteAllGlobalVars;
    __VarList.Destroy;
    end;________

    Function GetTVariable(name:string):TVariable;
    var
    __i : integer;
    begin
    __result := nil;

    __i := 0;
    __while i < VarList.Count do
    __begin
    ____if TVariable(VarList.Items).name = name then
    ______begin
    ________Result := TVariable(VarList.Items);
    ________exit;
    ______end;
    ____inc(i);
    __end;
    end;

    Procedure SetOrCreateVar(Name:string; variable: variant);
    var
    __MyVar : TVariable;
    begin
    __myvar := GetTVariable(name);

    __if not assigned(MyVar) then
    ____begin
    ______MyVar := TVariable.create;
    ______MyVar.name := Name;
    ____end;

    __MyVar.variable := variable;
    end;

    procedure deletevar(name:string);
    var
    __i:integer;
    begin
    __i := 0;
    __while i < VarList.Count do
    __begin
    ____if TVariable(VarList.Items).name = name then
    ______begin
    ________TVariable(VarList.Items).destroy;
    ________exit;
    ______end;
    ____inc(i);
    __end;
    end;

    function OnCallMethod(const ConnectId, ScriptId: integer;
    ______________________const MethodName: String; // имя функции в верхнем регистре
    ______________________var Params, // параметры функции______________________ FuncResult: Variant // результат функции
    ________ ): Boolean; stdcall; // если вернёт True то дальнейшая
    ______________________________// обработка функции прекратиться
    var
    __variable : TVariable;
    begin
    __Result:=False;
    __if MethodName='ISGLOBALVAREXISTS' then
    __begin
    ____FuncResult := assigned(GetTVariable(VarAsType(Params[0], varString)));
    ____
    ____Result := True;____
    __end else

    __if MethodName='SETGLOBALVAR' then
    __begin
    ____SetOrCreateVar(
    ______VarAsType(Params[0], varString),
    ______Params[1]);

    ____Result:=True;
    ____FuncResult := Null;____
    __end else

    __if MethodName='DELETEGLOBALVAR' then
    __begin
    ____deletevar(VarAsType(Params[0], varString));

    ____Result:=True;
    ____FuncResult := Null;____
    __end else

    __if MethodName='GETGLOBALVAR' then
    __begin
    ____variable := GetTVariable(VarAsType(Params[0], varString));
    ____if assigned(variable) then
    ______FuncResult := variable.variable
    ____else
    ______FuncResult := Null;

    ____Result:=True; // запрещаем дальнейшую обработку функции в программе
    __end else

    __if MethodName='DELETEALLGLOBALVARS' then
    __begin
    ____DeleteAllGlobalVars;

    ____Result:=True;
    ____FuncResult := Null;
    __end;
    end;

    Procedure OnRefreshPrecompile; stdcall;
    begin
    __ps.UserFuncs.Add('function isGlobalVarExists(name:string):boolean');
    __ps.UserFuncs.Add('procedure SetGlobalVar(name:string; variable:Variant)');
    __ps.UserFuncs.Add('procedure DeleteGlobalVar(name:string)');
    __ps.UserFuncs.Add('Function GetGlobalVar(name:string):Variant');
    __ps.UserFuncs.Add('procedure DeleteAllGlobalVars');
    end;

    // экспортируем используемые программой функции
    exports
    __GetPluginInfo,
    __SetStruct,
    __OnLoad,
    __OnRefreshPrecompile,
    __OnCallMethod,
    __OnFree;


    begin
    end.

    Содержимое uSharedStructs.pas

    Для версии 3.5.23.141

    unit usharedstructs;

    interface
    uses Classes;

    const
    __PCK_GS_ToServer = 4;__PCK_GS_ToClient = 3;
    __PCK_LS_ToServer = 2;
    __PCK_LS_ToClient = 1;

    type

    __TEncDecSettings =
    __record
    ____isChangeXor,
    ____isNoDecrypt,
    ____isNoProcessToClient,
    ____isNoProcessToServer,
    ____isKamael,
    ____isGraciaOff,
    ____isSaveLog,
    ____ShowLastPacket,
    ____HexViewOffset : boolean;
    __end;

    __{Используется плагинами}

    __PCodingClass =^TCodingClass;
    __TCodingClass = class(TObject)
    __public
    ____GKeyS,GKeyR:array[0..15] of Byte;
    ____procedure InitKey(const XorKey; Interlude: Boolean = False); Virtual; Abstract;
    ____procedure DecryptGP(var Data; const Size: Word); Virtual; Abstract;
    ____procedure EncryptGP(var Data; const Size: Word); Virtual; Abstract;
    __end;


    __PCorrectorData = ^TCorrectorData;
    __TCorrectorData = packed record
    _____seed : integer;__// random generator seed for mixing id tables
    _____1_byte_table : string;
    _____2_byte_table : string;
    _____2_byte_table_size: integer;
    _____id_mix : boolean;
    ____temp_seed : integer;
    ____protocol: integer;
    __end;__

    __TCharArray = array[0..$FFFF] of AnsiChar;
    __
    __PPacket = ^TPacket;__
    __TPacket = packed record case Integer of
    ____0: (Size: Word;
    ________Data: array[0..$FFFD] of Byte);
    ____1: (PacketAsByteArray: array[0..$FFFF] of Byte);
    ____2: (PacketAsCharArray: TCharArray);
    ____3: (pckSize: Word;
    ________pckId: Byte;
    ________pckData: array[0..$FFFC] of Byte);
    __end;


    __TNewPacket = procedure(var Packet:tpacket;FromServer : boolean; Caller: TObject)__of object; // Caller это TencDec к примеру -> TencDec(caller).name вызывает акшин только TencDec
    __TNewAction = procedure (action : byte; Caller: TObject)__of object; //Caller зависит от action
    __TStringArray = array of string;

    __
    __{экземпляр этого класса (точнее его потомок) передается в плагины.}__
    __TOnTimer = procedure(const param: Cardinal); stdcall;
    __tConnectInfo = packed record
    ____ConnectID:integer;
    ____ConnectName:string[200];
    __end;

    __tConnectInfoEx = packed record__//Используеться в ASL
    ____ConnectInfo : tConnectInfo;
    ____Valid : boolean;
    __end;
    PPluginStruct = ^TPluginStruct;
    __TPluginStruct = class (tobject)
    ____private
    ____public
    ____userFormHandle: THandle;
    ____ConnectInfo : tConnectInfo;
    ____UserFuncs : tstringlist;
    ____function ReadC(const pck:string; const index:integer):byte; Virtual; Abstract;
    ____function ReadH(const pck:string; const index:integer):word; Virtual; Abstract;
    ____function ReadD(const pck:string; const index:integer):integer; Virtual; Abstract;
    ____function ReadQ(const pck:string; const index:integer):int64; Virtual; Abstract;
    ____function ReadF(const pck:string; const index:integer):double; Virtual; Abstract;
    ____function ReadS(const pck:string; const index:integer):string; Virtual; Abstract;

    ____function ReadCEx(const pck; const index:integer):byte; Virtual; Abstract;
    ____function ReadHEx(const pck; const index:integer):word; Virtual; Abstract;
    ____function ReadDEx(const pck; const index:integer):integer; Virtual; Abstract;
    ____function ReadQEx(const pck; const index:integer):int64; Virtual; Abstract;
    ____function ReadFEx(const pck; const index:integer):double; Virtual; Abstract;
    ____function ReadSEx(const pck; const index:integer):string; Virtual; Abstract;
    ____procedure WriteC(var pck: string; const v:byte;____ind:integer=-1); Virtual; Abstract;
    ____procedure WriteH(var pck: string; const v:word;____ind:integer=-1); Virtual; Abstract;
    ____procedure WriteD(var pck: string; const v:integer; ind:integer=-1); Virtual; Abstract;
    ____procedure WriteQ(var pck: string; const v:int64; ind:integer=-1); Virtual; Abstract;
    ____procedure WriteF(var pck: string; const v:double;__ind:integer=-1); Virtual; Abstract;
    ____procedure WriteS(var pck: string; const v:string;__ind:integer=-1); Virtual; Abstract;
    ____procedure WriteCEx(var pck; const v:byte;____ind:integer=-1); Virtual; Abstract;
    ____procedure WriteHEx(var pck; const v:word;____ind:integer=-1); Virtual; Abstract;
    ____procedure WriteDEx(var pck; const v:integer; ind:integer=-1); Virtual; Abstract;
    ____procedure WriteQEx(var pck; const v:int64; ind:integer=-1); Virtual; Abstract;
    ____procedure WriteFEx(var pck; const v:double;__ind:integer=-1); Virtual; Abstract;
    ____procedure WriteSEx(var pck; const v:string;__ind:integer=-1); Virtual; Abstract;

    ____Function SetScriptVariable(scriptid:integer; varname:string; varvalue:variant):boolean; Virtual; Abstract;
    ____Function GetScriptVariable(scriptid:integer; varname:string):variant; Virtual; Abstract;
    ____function IsScriptIdValid(scriptid:integer):boolean; Virtual; Abstract;
    ____function CreateAndRunTimerThread(const interval, usrParam: Cardinal;
    ____________________________________ const OnTimerProc: TOnTimer): Pointer; Virtual; Abstract;
    ____procedure ChangeTimerThread(const timer: Pointer; const interval: Cardinal;
    ________________________________const usrParam: Cardinal = $ffffffff;
    ________________________________const OnTimerProc: TOnTimer = nil); Virtual; Abstract;
    ____procedure DestroyTimerThread(var timer: Pointer); Virtual; Abstract;
    ____function StringToHex(str1,Separator:String):String; Virtual; Abstract;
    ____function HexToString(Hex:String):String; Virtual; Abstract;
    ____function DataPckToStrPck(var pck): string; Virtual; Abstract;
    ____procedure SendPacketData(var pck; const tid: integer; const ToServer: Boolean); Virtual; Abstract;
    ____procedure SendPacketStr(pck: string; const tid: integer; const ToServer: Boolean); Virtual; Abstract;
    ____procedure SendPacket(Size: Word; pck: string; tid: integer; ToServer: Boolean); Virtual; Abstract;
    ____
    ____function getConnectionName(id : integer):string; Virtual; Abstract;
    ____function getConnectioidByName(name : string):integer; Virtual; Abstract;
    ____Function GoFirstConnection:boolean; Virtual; Abstract;
    ____Function GoNextConnection:boolean; Virtual; Abstract;
    ____procedure ShowUserForm(ActivateOnly:boolean);__Virtual; Abstract;
    ____Procedure HideUserForm;__Virtual; Abstract;
    __end;

    implementation


    end.


    III. F.A.Q.


    # Коментарий автора:
    # Информация бралась с форума программы.
    # Надеюсь авторы не будут в обиде за столь злостный копипаст и отсуствия копирайтов во многих местах.


    Общие вопросы


    Вопрос: Запускаю L2ph(x) версию 3.хх ругается антивирь на троян?
    Решение: Это нормально. Пакетхак использует процедуру внедрения в процесс, как это делает большинство вирей - отсюда и ругань. В конце июля 2008 года было обнаружено, что в программа, выложенная на сервере содержит сигнатуру схожую с одним трояном. При перекомпиляции исходного проекта в новой версии среды разработки похожей сигнатуры больше не появилось. Программа была перекомпилирована и выложена поновой. Если все равно боитесь - скачайте исходник самостоятельно и откомпилируйте его.

    Вопрос: Запускаю скрипт который взял на этом форуме вылетает ошибка?
    Решение: Самая распространенная ошибка: не прописываете константы Name и т.д. скрипт не подходит под ваши хроники. Либо скрипт требует модификации в связи с изменением наименований встроеных функций.

    Вопрос: Запускаю ПХ, захожу на сервер, соединение перехватывается но в списке пакетов совсем не те пакеты которые там должны быть, что делать?
    Решение: Наиболее часто подымаемый на форуме вопрос, который уже порядком достал, убедитесь что пх настроен правильно под ваш сервер, это основная причина. Если же вы уверенны в том что все настройки установлены правильно - читаем следующий вопрос.

    Вопрос: Вместо имени персонажа в левом верхнем углу программы пишется "пусто"(для версий ниже 3.5.1, для версий выше это место - вкладка соединения) или какая-нибудь абракадабра, что мне делать?
    Решение1: скорее всего на сервере изменена шифрация трафика, ни в коем случае не клянчить и не донимать народ, чтобы посмотрели или написали дллку под Ваш сервер. Есть топик ДЕШИФРУЕМ ТРАФИК посвященный этой проблеме. Почитайте его. Попробуйте найти алгоритм. Если что-то не получится - задайте конкретный Вопрос: у меня не получается то-то и то-то с примерами, а не у мнея ничего не получается - помогите плз. Далее нужно скачать исходник Пакетхака и перекомпилировать библиотеку newxor.dll, которая отвечает за расшифровку/зашифровку трафика в Пакетхаке.
    Решение2: В версии пакетхака 3.2.0 имя соединения на Камаеле, не показывается из-за того, что имя берётся из пакета $04-UserInfo, а в Камаеле он имеет другой Id=$32. Возможное решение проблемы - попробовать взять пакетхак из темы Модификация L2phx 3.2.0

    Вопрос: Вставляю скрипт в вкладку отправить нажимаю отправить и клиент вылетает, что я делаю не так?
    Решение: Вкладка отправить создана для отправки пакетов. причём каждый пакет должен быть в новой строке если их там несколько, и должна быть установлена соответствующая опция в панели интструментов. пкеты будут отправляться по очереди. Для запуска скриптов ставьте галочку напротив имени скрипта на вкладке "Скрипты".

    Вопрос: На вкладке скрипты выделяю скрипт, нажимаю кнопку "Test Init", появляется формочка, но скрипт не работает.
    Решение: Кнопка "Test Init" предназначена для тестового запуска процедуры Init, и выполняется код, написаный в данной процедуре.Для запуска скриптов ставьте галочку напротив имени скрипта на вкладке "Скрипты".

    Вопрос: Ищу скрипт на автоматизацию действий ....
    Решение: Для начала посмотрите в разделе скриптинг темы посвященные скриптам на автоматизацию действий их достаточно много. Если не нашли то попробуйте воспользоваться поиском. И только после этого спросите если такой скрипт в природе.
    Если первая фраза будет типа: Дайте мне скрипт... , тема будет удалена.

    Вопрос: Не пашет на шоках после ИЛа =(
    Ловит пакеты но отправлять не может, рядом с никами перехваченных знак "?"
    Что делать?....

    Решение: Убери галку Обход смены XOR и будет те счастье... (с) xkor

    Вопрос: Кто-нибудь уже пытался подружить пакетхак от xkora с клиентом Hellbounda?
    Решение: Попробовать взять пакетхак из темы Модификация L2phx 3.2.0 он работает на Грации. В комплекте идут инишки для расшифровки пакетов (С4, Интерлюд, Камаель), сообщений, итемов и т.д. и т.п.

    Вопрос: И почему я стучусь тебе в аську а ты не отвечаешь??? (Sn00pu)
    Решение:
    чел ты ко мне стукани ещё я не NLObP забаню на пару месяцев. есть форум вопросы тут!!! ждите пока у разработчика скрипта найдётся время на ответ на ваш не всегда внятный вопрос.(с)Grinch

    Вопрос: Ловлю пакет, модифицирую его, отсылаю его клиенту, в инвентаре появляется долгожданная пуха, но, когда открываю инвентарь, она исчезает. Подскажите: что делать?
    Решение: ВСЕ данные хранятся на серваке, модифицировать их через изменение пакета в 99% не приведет ни к чему, бросайте это занятие.

    Вопрос: Для чего и как пользоваться пакетхаком
    Ответ: Для того что-бы увидеть ссылку Зарегистрируйтесь на форуме. - гайд написанный J-Fobos или Для того что-бы увидеть ссылку Зарегистрируйтесь на форуме. - гайд написанный MarShall'ом либо, все же этот хелп, написанный индуским кодером с альфацентавры. (c) alexteam

    Вопрос: На вкладке просмотр при выборе пакета в списке ... вылетает ошибка?
    Решение: Самая распространенная ошибка: выбран packets.ini для других хроник.​

    Расшифровка пакетов для Intrelude.

    by TAMBIK

    ___________


    Action
    Назначение: пакет, который отсылается клиентом при клике мышью по НПЦ или другому

    чару
    Формат:
    04
    XX XX XX XX // ID объекта
    XX XX XX XX // Координата X положения чара
    XX XX XX XX // Координата Y положения чара
    XX XX XX XX // Координата Z положения чара
    XX // 00 - просто клик, 01 - клик с зажатым шифтом

    AttackRequest
    Назначение: запрос на атаку
    Формат:
    0A
    XX XX XX XX // ID того, кого собираемся атаковать
    XX XX XX XX // X координата позиции чара
    XX XX XX XX // Y координата позиции чара
    XX XX XX XX // Z координата позиции чара
    XX XX XX XX // 0 - Ctrl не нажат, 1 - Ctrl нажат

    RequestItemList
    Назначение: запросить список вещей находящихся в инвентаре.(клиент открывает

    инвентарь, когда сервер высылает этот список)
    Формат:
    0F
    --------------------------------------------------------------------------------
    RequestUnEquipItem
    Назначение: Снимает эквип с чара
    Формат:
    11
    XX XX XX XX // Номер слота
    --------------------------------------------------------------------------------
    RequestDropItem
    Назначение: запрос за дроп итема. Отправляется клиентом, при попытке выбросить из

    инвентаря какую-либо вещь
    Формат:
    12
    XX XX XX XX // ID итема который хотим выбросить
    XX XX XX XX // количество итемов которое мы хотим выбросить
    XX XX XX XX // X кордината места в которое выбрасываем итем
    XX XX XX XX // Y кордината места в которое выбрасываем итем
    XX XX XX XX // Z кордината места в которое выбрасываем итем
    --------------------------------------------------------------------------------
    UseItem
    Назначение: запрос на использование итема
    Формат:
    14
    XX XX XX XX // ID объекта

    TradeRequest
    Назначение: запрос торговлю.
    Формат:
    15
    XX XX XX XX // ID объекта с которым хотим торговать
    --------------------------------------------------------------------------------
    AddTradeItem
    Назначение: добавляет итем в трейд лист.
    Формат:
    16
    XX XX XX XX // ID трейда
    XX XX XX XX // ID объекта
    XX XX XX XX // количество
    --------------------------------------------------------------------------------
    TradeDone
    Назначение: запрос на завершение торговли.
    Формат:
    17
    XX XX XX XX // 0 - отменить сделку, 1 - подтвердить сделку

    RequestSocialAction
    Назначение: вызывает анимацию социальных действий вроде смеха и т.п.
    Формат:
    1B
    XX XX XX XX // Номер экшина
    // 0x02 - Greeting
    // 0x03 - Victory
    // 0x04 - Advance
    // 0x05 - No
    // 0x06 - Yes
    // 0x07 - Bow
    // 0x08 - Unaware
    // 0x09 - Social Waiting
    // 0x0A - Laugh
    // 0x0B - Applaud
    // 0x0C - Dance
    // 0x0D - Sorrow
    // 0x0F - Анимация как при lvl-up
    // 0x10 - Анимация героев

    ChangeMoveType
    Назначение: включает/выключает бег
    Формат:
    1C
    XX XX XX XX // 0 - бег выключен, 1 - бег включен
    --------------------------------------------------------------------------------
    ChangeWaitType
    Назначение: сесть/встать
    Формат:
    1D
    XX XX XX XX // 0 - сесть, 1 - встать
    --------------------------------------------------------------------------------
    RequestTargetCanceld
    Назначение: Отменяет таргет
    Формат:
    1D
    --------------------------------------------------------------------------------
    RequestBuyItem
    Назначение: Запрос на покупку вещей
    Формат:
    1F
    XX XX XX XX // ID сиска покупок
    XX XX XX XX // количество вещей которые нужно купить
    // <<< Блок повторяется столько раз, сколько разных вещей нужно купить
    XX XX XX XX // ID предмета который нужно купить
    XX XX XX XX // количество предметов которые нужно купить

    RequestBypassToServer
    Назначение: передает "bypass"(содержаться в HTML) команду серверу.
    Формат:
    21
    XX XX XX XX 00 00 // строка с коммандой
    --------------------------------------------------------------------------------
    RequestJoinPledge
    Назначение: отправляет чару предложение вступить в клан.
    Формат:
    24
    XX XX XX XX // ID чара, которому высылается предложение
    --------------------------------------------------------------------------------
    RequestAnswerJoinPledge
    Назначение: ответ на предложение о вступлении в клан
    Формат:
    25
    XX XX XX XX // ответ: 00 - нет, 01 - да
    --------------------------------------------------------------------------------
    RequestWithdrawalPledge

    Назначение: выйти из клана
    Формат:
    26
    --------------------------------------------------------------------------------
    RequestOustPledgeMember
    Назначение: удалить чара из клана
    Формат:
    27
    XX XX XX XX 00 00 // строка с именем чара
    --------------------------------------------------------------------------------
    RequestJoinParty
    Назначение: предложить вступить в пати
    Формат:
    29
    XX XX XX XX 00 00 // ник чара, которому отсылается предложение
    XX XX XX XX // тип распределения предметов:
    // 0x00 - дроп получает подобравший его чар, споил - достается спойлеру
    // 0x01 - дроп распределяется случайным образом, споил - достается спойлеру
    // 0x02 - дроп и споил, распределяется случайным образом
    // 0x03 - дроп дается чарам по очереди, споил - достается спойлеру
    // 0x04 - дроп и споил, дается чарам по очереди

    RequestAnswerJoinParty
    Назначение: ответ на предложение вступить в пати
    Формат:
    2A
    XX XX XX XX // ответ: 00 - нет, 01 - да
    --------------------------------------------------------------------------------
    RequestWithDrawalParty
    Назначение: выйти из пати
    Формат:
    2B
    --------------------------------------------------------------------------------
    RequestOustPartyMember
    Назначение: удалить чара из пати
    Формат:
    2C
    XX XX XX XX 00 00 // строка с именем чара которого следует удалить
    --------------------------------------------------------------------------------
    RequestMagicSkillUse
    Назначение: использовать магический скилл
    Формат:
    2F
    XX XX XX XX // ID скилла
    XX XX XX XX // состояние CTRL : 00 - отпущен, 01 - нажат
    XX XX XX XX // состояние SHIFT: 00 - отпущен, 01 - нажат
    --------------------------------------------------------------------------------
    Appearing
    Назначение: Запрашивает возрождение чара после смерти. Вызывается после пакетов

    RequestRestartPoint и ValidatePosition
    Формат:
    30

    RequestShortCutReg
    Назначение: Регестрирует ярлык на панеле быстрого доступа.
    Формат:
    33
    XX XX XX XX // Тип ярлыка
    // 0x01 - итем
    // 0x02 - скилл
    // 0x03 - действие
    // 0x04 - макрос
    XX XX XX XX // идентификатор объекта выносимого на панель
    XX XX XX XX // номер слота
    XX XX XX XX // номер закладки
    XX XX XX XX // неизвестно
    --------------------------------------------------------------------------------
    RequestShortCutDel
    Назначение: Удаляет ярлык с панели быстрого доступа.
    Формат:
    35
    XX XX XX XX // номер слота
    XX XX XX XX // номер закладки
    --------------------------------------------------------------------------------
    Say2
    Назначение: отправляет сообщение другим игрокам
    Формат:
    38
    XX XX XX XX 00 00 // Cтрока сообщения
    XX XX XX XX // Тип сообщение
    // 0x00 - ALL
    // 0x01 - SHOUT ( ! )
    // 0x02 - TELL ( " )
    // 0x03 - PARTY ( # )
    // 0x04 - CLAN ( @ )
    // 0x05 - GM
    // 0x06 - PETITION_PLAYER
    // 0x07 - PETITION_GM
    // 0x08 - TRADE ( + )
    // 0x09 - ALLIANCE ( $ )
    // 0x0A - ANNOUNCEMENT
    // 0x0F - PARTYROOM_ALL ( желтый )
    // 0x10 - PARTYROOM_COMMANDER ( синий )
    // 0x11 - Голос героя
    XX XX XX XX 00 00 // Для приватных сообщений. Содержит ник чара которому

    предназначено сообщение.

    RequestPledgeMemberList
    Назначение: запросить список членов клана
    Формат:
    3C
    --------------------------------------------------------------------------------
    RequestSkillList
    Назначение: запрашивает список изученных скилов
    Формат:
    3F
    --------------------------------------------------------------------------------
    AnswerTradeRequest
    Назначение: ответ на трейд
    Формат:
    40
    XX XX XX XX // Ответ на трейд: 00 - отклонить, 01 - подтвердить
    --------------------------------------------------------------------------------
    RequestActionUse
    Назначение: выполняет действие
    Формат:
    45
    XX XX XX XX // Action ID (список не полный, экшинов там дофига)
    // 0x00 - Сесть/встать
    // 0x01 - Идти/бежать
    // 0x19 - Ансаммонить пета
    // 0x33 - General manufacture
    // 0x38 - Зазезть/слезть с страйдера (вирна ???)
    XX XX XX XX // 00 - CTRL не нажат, 01 - CTRL нажат
    XX // 01 - SHIFT не нажат, 01 - SHIFT нажат
    --------------------------------------------------------------------------------
    RequestRestart
    Назначение: возвращает в меню выбора чара
    Формат:
    46


    StartRotating
    Назначение: Включает вращение чара вокруг своей оси
    Формат:
    4A
    XX XX XX XX // Угол (принимает значения от 0 до 65535)
    XX XX XX XX // сторона ( 01 00 00 00 - вращение вправо, FF FF FF FF - вращение влево )
    --------------------------------------------------------------------------------
    FinishRotating
    Назначение: прекращает вращение чара вокруг своей оси
    Формат:
    4B
    XX XX XX XX // Неизвестно
    XX XX XX XX // Неизвестно
    --------------------------------------------------------------------------------
    RequestStartPledgeWar
    Назначение: начать кланвар
    Формат:
    4D
    XX XX XX XX 00 00 // строка с названием клана, которому объявляется кланвар
    --------------------------------------------------------------------------------
    RequestStartPledgeWar
    Назначение: закончить клан вар
    Формат:
    4F
    XX XX XX XX 00 00 // строка с названием клана

    RequestGiveNickName
    Назначение: устанавить титул.
    Формат:
    55
    XX XX XX XX 00 00 // строка содержащая ник чара которому требуется установить титул
    XX XX XX XX 00 00 // строка содержащая титул
    --------------------------------------------------------------------------------
    RequestEnchantItem
    Назначение: запрашивает энчат интема.
    Формат:
    58
    XX XX XX XX // ID итема который хотим заэнчатить
    --------------------------------------------------------------------------------
    RequestDestroyItem
    Назначение: запрос на уничтожение итема
    Формат:
    59
    XX XX XX XX // ID итема
    XX XX XX XX // количество итемов?
    --------------------------------------------------------------------------------
    RequestFriendInvite
    Назначение: занести чара в френд лист
    Формат:
    5E
    XX XX XX XX 00 00 // строка с именем чара, которого следует добавить
    --------------------------------------------------------------------------------
    RequestAnswerFriendInvite
    Назначение: ответ на предложение добавления в список друзей
    Формат:
    5F
    XX XX XX XX // 00 - нет, 01 - да
    --------------------------------------------------------------------------------
    RequestFriendList
    Назначение: запрос френдлиста
    Формат:
    60


    RequestFriendDel
    Назначение: запрос на удаление чара из френд листа
    Формат:
    61
    XX XX XX XX 00 00 // строка с именем чара, которого следует удалить
    --------------------------------------------------------------------------------
    CharacterRestore
    Назначение: отменяет удаление чара
    Формат:
    62
    XX XX XX XX // номер слота с чаром
    --------------------------------------------------------------------------------
    RequestQuestList
    Назначение: запросить список квестов
    Формат:
    63
    --------------------------------------------------------------------------------
    RequestQuestAbort
    Назначение: прервать выполнение квеста
    Формат:
    64
    XX XX XX XX // ID квеста
    --------------------------------------------------------------------------------
    CharacterRestore
    Назначение: запрос информации о клане
    Формат:
    66
    XX XX XX XX // ID клана
    --------------------------------------------------------------------------------
    RequestPledgeCrest
    Назначение: устанавливает иконку клана
    Формат:
    68
    XX XX XX XX // ID иконки
    --------------------------------------------------------------------------------
    RequestRide
    Назначение: залезть/слезть со страйдера/виверна
    Формат:
    6A
    XX XX XX XX // 0 - слезть, 1 - залезть
    XX XX XX XX // 1 - страйдер, 2 - вивирен
    --------------------------------------------------------------------------------
    RequestAquireSkillInfo
    Назначение: запрос информации о скилле
    Формат:
    6B
    XX XX XX XX // ID скилла
    XX XX XX XX // уровень скилла
    --------------------------------------------------------------------------------
    RequestAquireSkill
    Назначение: запрос на изучение скилла
    Формат:
    6C
    XX XX XX XX // ID скилла
    XX XX XX XX // уровень скилла
    --------------------------------------------------------------------------------
    RequestRestartPoint
    Назначение: запрашивает рестарт после смерти чара
    Формат:
    6D
    XX XX XX XX // точка в которую будет возвращен игрок
    // 0x00 - Город
    // 0x01 - Клан холл
    // 0x02 - Замок
    // 0x03 - Флаг (при осаде замка)
    // 0x04 - Ресс на месте на котором умер игрок, используется на фестивале
    --------------------------------------------------------------------------------
    RequestGMCommand
    Назначение: отсылает запрос на GM комманду
    Формат:
    6E
    XX XX XX XX 00 00 // строка с именем чара - цели
    XX XX XX XX // идентификатор комманды
    // 0x01 - статус игрока
    // 0x02 - клан игрока
    // 0x03 - скилы игрока
    // 0x04 - квесты игрока
    // 0x05 - инвентарь игрока
    // 0x06 - вархаус игрока
    XX XX XX XX // неизвестно
    --------------------------------------------------------------------------------
    RequestPartyMatchConfig
    Назначение: открыть окно поиска пати
    Формат:
    6F
    XX XX XX XX // автомтическая регистрация: 00 - нет, 01 - да
    XX XX XX XX // показывать уровень: 00 - нет, 01 - да
    XX XX XX XX // показывать класс: 00 - нет, 01 - да
    --------------------------------------------------------------------------------
    RequestPartyMatchList
    Назначение: запросить список чаров ищущих пати
    Формат:
    70
    XX XX XX XX // статус может быть 1 и 3. Что значит наверняка, я не знаю.
    --------------------------------------------------------------------------------
    RequestPartyMatchDetail
    Назначение: запросить подробную информуцию о чаре ищущем пати
    Формат:
    71
    XX XX XX XX // ID чара
    --------------------------------------------------------------------------------
    RequestCrystallizeItem
    Назначение: запрос на кристализацию итема
    Формат:
    72
    XX XX XX XX // ID итема который нужно кристализовать
    XX XX XX XX // количество итемов, которые нужно кристализовать
    --------------------------------------------------------------------------------
    SetPrivateStoreMsgSell
    Назначение: устанавливает сообщение на продажу для PrivateStore
    Формат:
    77
    XX XX XX XX 00 00 // строка с сообщением
    --------------------------------------------------------------------------------
    RequestGmList
    Назначение: запрос списка GMов
    Формат:
    81
    --------------------------------------------------------------------------------
    RequestJoinAlly
    Назначение: предложить вступить в аллианс
    Формат:
    82
    XX XX XX XX // ID лидера клана, который преглашается в алли
    --------------------------------------------------------------------------------
    RequestAnswerJoinAlly
    Назначение: ответ на предложение вступления в аллианс
    Формат:
    83
    XX XX XX XX // ответ: 00 - нет, 01 - да

    AllyLeave
    Назначение: покинуть аллианс
    Формат:
    84
    XX XX XX XX 00 00 // строка с названием клана
    --------------------------------------------------------------------------------
    AllyDismiss
    Назначение: запрос на роспуск аллианса
    Формат:
    85
    XX XX XX XX 00 00 // строка с именем клана
    --------------------------------------------------------------------------------
    RequestAllyCrest
    Назначение: запрос на установку иконки аллианса
    Формат:
    88
    XX XX XX XX // ID иконки
    --------------------------------------------------------------------------------
    RequestChangePetName
    Назначение: меняет имя пета
    Формат:
    89
    XX XX XX XX 00 00 // строка с новым именем пита
    --------------------------------------------------------------------------------
    RequestPetUseItem
    Назначение: команда пету использовать итем
    Формат:
    8A
    XX XX XX XX // ID объекта которых нужно использовать
    --------------------------------------------------------------------------------
    RequestGiveItemToPet
    Назначение: переместить итем из своего инвентаря в инвентарь пита
    Формат:
    8B
    XX XX XX XX // ID итема
    XX XX XX XX // количество
    --------------------------------------------------------------------------------
    RequestGetItemFromPet
    Назначение: переместить итем из инвентаря пета к себе в инвентарь
    Формат:

    XX XX XX XX // ID итема
    XX XX XX XX // количество
    XX XX XX XX // фиг его знает. В большинстве случаев - 0
    --------------------------------------------------------------------------------
    RequestAllyInfo
    Назначение: запрос информации об аллиансе.
    Формат:
    8E
    --------------------------------------------------------------------------------
    RequestPetGetItem
    Назначение: команда пету поднять итем.
    Формат:
    8F
    XX XX XX XX // ID который надлежит поднять
    --------------------------------------------------------------------------------
    SetPrivateStoreMsgBuy
    Назначение: устанавливает сообщение на покупку для PrivateStore
    Формат:
    94
    XX XX XX XX 00 00 // строка с сообщением
    --------------------------------------------------------------------------------
    RequestStartAllianceWar
    Назначение: объявить алли вар
    Формат:
    98
    XX XX XX XX 00 00 // строка с именем аллианса
    --------------------------------------------------------------------------------
    RequestStopAllianceWar
    Назначение: запрос о прекращении алли вар'а
    Формат:
    9A
    XX XX XX XX 00 00 // строка с именем аллианса
    --------------------------------------------------------------------------------
    RequestBlock
    Назначение: запрос операции над черным списком
    Формат:
    A0
    XX XX XX XX // тип запроса:
    // 0x00 - добавить чара в игнор
    // 0x01 - удалить чара из игнора
    // 0x02 - вывесли список чаров занесенных в игнор
    // 0x03 - игнор всех
    // 0x04 - отменить игнор всех
    XX XX XX XX 00 00 // строка с именем чара которого надо занести в игнор
    --------------------------------------------------------------------------------
    RequestSiegeAttackerList
    Назначение: запрашивает список записаных на осаду замка атакующих кланов
    Формат:
    A2
    XX XX XX XX // ID замка
    --------------------------------------------------------------------------------
    RequestJoinSiege
    Назначение: добавить/удалить клан в список осады замка
    Формат:
    A4
    XX XX XX XX // ID замка
    XX XX XX XX // 00 - присоедениться к защитникам, 01 - присоедениться к атакующим
    XX XX XX XX // 00 - удалить клан из списка, 01 - добавить клан в список
    --------------------------------------------------------------------------------
    RequestRecipeBookOpen
    Назначение: открыть книгу рецептов
    Формат:

    --------------------------------------------------------------------------------
    RequestEvaluate
    Назначение: запрос на рекомендацию игрока
    Формат:
    B9
    XX XX XX XX // ID цели
    --------------------------------------------------------------------------------
    RequestHennaList
    Назначение: запросить список доступных татуировок
    Формат:
    BA
    XX XX XX XX // неизвестно
    --------------------------------------------------------------------------------
    RequestHennaItemInfo
    Назначение: получить информацию о татуировке
    Формат:
    BB
    XX XX XX XX // ID татуировки
    --------------------------------------------------------------------------------
    RequestHennaEquip
    Назначение: запрос на нанесение татуировки
    Формат:

    XX XX XX XX // ID татуировки которую нужно нанести
    --------------------------------------------------------------------------------
    RequestMakeMacro
    Назначение: запрос на создание макроса
    Формат:
    С1
    XX XX XX XX // ID макроса
    XX XX XX XX 00 00 // строка содержащая имя макроса
    XX XX XX XX 00 00 // строка с описанием макроса
    XX XX XX XX 00 00 // строка с текстом на иконке
    XX // ID иконки
    XX // количество строк
    // <<<<< Следующий блок повторяется столько раз, сколько строк в макросе.
    XX // строка
    XX // тип
    XX // ID скилла
    XX // ID ярлыка на панели
    XX XX XX XX 00 00 // имя комманды
    --------------------------------------------------------------------------------
    RequestDeleteMacro
    Назначение: запрос на удаление макроса
    Формат:
    C2
    XX XX XX XX // ID макроса
    --------------------------------------------------------------------------------
    RequestAutoSoulShot
    Назначение: включает/выключает использование AutoSS
    Формат:
    CF
    XX XX XX XX // идентификатор итема
    XX XX XX XX // 1 - включить : 0 - выключить
    --------------------------------------------------------------------------------
    RequestExPledgeCrestLarge
    Назначение: запросить данные изображения большой иконки клана(те что размещаються на

    вещах клана типа щитов) клана
    Формат:
    D0
    10
    XX XX XX XX // ID иконки
    --------------------------------------------------------------------------------
    RequestExSetPledgeCrestLarge
    Назначение: отправить данные изображения большой иконки клана(те что размещаются на

    вещах клана типа щитов) на сервер
    Формат:
    D0
    11
    XX XX XX XX // размер данных
    // <<<<< Следующий блок повторяется столько раз, сколько байт в данных изображения
    XX // данные изображения
    --------------------------------------------------------------------------------
    RequestChangePartyLeader
    Назначение: передает лидерство в пати
    Формат:
    EE
    XX XX XX XX 00 00 // строка с именем чара, которому передается лидерство.
     
    DaVilka, Darkness=), PndsQ и 6 другим нравится это.
  2. Seth

    Seth Адекват

    Сообщения:
    23
    Симпатии:
    1
    Баллы:
    1
    У меня такой вопрос возник, установил виртуалку, и туда поставил L2Ph и попытался запустить через прокси ла2 через "Proxifier" но как только я подключаю прокси то страницы браузера перестают открываться и на акк естественно не заходит, вроде настроил и ПХ и прокси, поставил сокс5, путь до ла2 вставил но все равно не получается, кто то просветит меня? :)
     
  3. tribl3

    tribl3 Адекват

    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    3
    Тоже интересует люди добрые выручайте, только уменя по песочнице
     
  4. Majorchik

    Majorchik

    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Для тех у кого с Proxifier блочиться инет. В "Proxification Rules", на Rule Name: "Default", В столбце: "Action" сменить на "Direct". Мне помогло. Надеюсь понятно.
     
  5. Ivite

    Ivite

    Сообщения:
    3
    Симпатии:
    2
    Баллы:
    3
    Доброго дня)
    пользуюсь пакетником не долго. около недели. сразу всё работало на ура. патом с третей-четвёртой попытки.
    теперь вот:
    17.06.2017 10:28:25 LSP модуль уже зарегистрирован в системе
    17.06.2017 10:28:25 Стартует L2ph v3.5.33.166
    17.06.2017 10:28:25 На 1024 зарегистрирован локальный сервер
    17.06.2017 10:29:19 (LSP) Обнаружено соединение (Сокет 1648) IP/port Х.ХХХ.ХХХ.ХХХ:2108. Соединение будет перехвачено
    17.06.2017 10:29:19 ServerListen: Обнаружено новое соединение.
    17.06.2017 10:29:19 Тунель ($52308960) создан
    17.06.2017 10:29:19 Тунель ($52308960) запущен для чтения с сокета № 308
    17.06.2017 10:29:21 Тунель ($52308960), Серверный сокет № 308 / Клиентский сокет № 332, Соединение установлено с Х.ХХХ.ХХХ.ХХХ:2108
    17.06.2017 10:29:23 Тунель ($52308960) Отвалились от клиента
    17.06.2017 10:29:23 Тунель ($52308960) Отвалились от сервера
    17.06.2017 10:29:23 (LSP) Обнаружено соединение (Сокет 1648) IP/port Х.ХХХ.ХХХ.ХХХ:7778. Соединение будет перехвачено
    17.06.2017 10:29:23 ServerListen: Обнаружено новое соединение.
    17.06.2017 10:29:23 Тунель ($60419392) создан
    17.06.2017 10:29:23 Тунель ($60419392) запущен для чтения с сокета № 348
    17.06.2017 10:29:25 Тунель ($60419392), Серверный сокет № 348 / Клиентский сокет № 256, Соединение установлено с Х.ХХХ.ХХХ.ХХХ:7778
    17.06.2017 10:29:25 Тунель ($52308960) уничтожен
    17.06.2017 10:29:26 Тунель ($60419392) Отвалились от сервера
    17.06.2017 10:29:26 Тунель ($60419392) уничтожен
    Клиент доходит до выбора перса и дисконект.
    пишет ВЫ отсоединены от сервера
    подскажите что не так?
    если нада скрины настроек или игры скажите я выложу.
     
    Последнее редактирование: июн 17, 2017
    HellFire нравится это.
  6. Delivi0n

    Delivi0n Адекват

    Сообщения:
    20
    Симпатии:
    20
    Баллы:
    1,510
    Гайд очень полезный для новичков спасибо)
     
  7. Lomanu4

    Lomanu4 Part of ZeroLevel Team

    Сообщения:
    220
    Симпатии:
    161
    Баллы:
    1,068
    У кого остались исходники?
     
  8. HellFire

    HellFire Команда форума Администратор

    Сообщения:
    973
    Симпатии:
    1,599
    Баллы:
    4,118
    Для того что-бы увидеть ссылку Зарегистрируйтесь на форуме.
     
    MrTraC и Lomanu4 нравится это.
  9. Lomanu4

    Lomanu4 Part of ZeroLevel Team

    Сообщения:
    220
    Симпатии:
    161
    Баллы:
    1,068
    Спасибо
     
  10. Delivi0n

    Delivi0n Адекват

    Сообщения:
    20
    Симпатии:
    20
    Баллы:
    1,510
    Cервер в лс кинь
     
    HellFire нравится это.