Авторизация

Войдите, используя свой логин и пароль:

  • Страница 1 из 1
  • 1
Форум » Lineage2 Клиент » Боты » WP-PPC - настройка и различная документация
WP-PPC - настройка и различная документация
l2
Отправлено 12.06.2009 - 16:301
Администраторы
703 сообщений
Мужчина
Статус: Offline
Процес установки разделен на несколько пунктов, каждое сообщение - пункт настройки.

WP PPC - Wicked Patcher

Wicked Patcher (после wp655f версии) содержит три модуля:

1. PPC -- Proxy Packed Converter - прокси сервер и скриптовый пакет-конвертер
2. MI -- Multi Injector - Мульти-инжектор (v.4.0)
3. SE -- Server Emulator - эмулятор серверов, (еще не закончен)

Здесь речь идет о PPC.

PPC = Proxy Packet Converter, что примерно означает - Прокси, Пакетный конвертер.

PPC предназначен для перехвата трафика TPC вообще , и трафика между клиентом (ботом) и сервером LA2/RFO (и других) в частности.
Так же , продвинутым контролем над этим трафиком , включая полное оперативное вмешательство в протокол соединения и изменение трафика по своему усмотрению с помощью гибкой системы скриптов.

С помощью PPC можно ловить пакеты TCP, изменять их, блокировать, посылать свои пакеты и вообще все что угодно с помощью скриптов.

PPC является первой в своем виде программой, где с помощью скриптов можно 'кодировать' алгоритм изменения трафика, в данный момент уже появилось много подражателей моей идеи (теже хлапексы, l2пакетхаки и прочие ), что радует, так как это подтверждает состоятельность моей идеи как факта.

Но, WP PPC является на сегодняшний момент единственной реально МНОГОПОТОЧНОЙ программой подобного рода.
Т.е. работает с большим количеством независимых друг от друга соединений.

Взять PPC можно в составе последней версии WP с моего сайта WP-PPC :: Wicked Patcher, Proxy Packet Converter, Multi Injector©

Permeo Security Driver - _http://www.satspace.ru/uploaded/perm...er.v.4.2.6.rar

В состав PPC входит:
1. Два прокси сервера с гибким настраиваемым протоколом , по умолчанию Socks 5.
Каждый из серверов многопоточный, то есть , каждый из серверов может держать несколько соединений одновременно. В принципе не обязательно он и Socks, так как прокси протокол написан на скрипте, а его можно изменять под свои нужды.

2. Продвинутый Автологгер (далее по тексту - AL),
предназначенный для протоколирования и автоматической записи пакетов трафика. Управляется как в ручную, так и через скрипты (включая способы шифрации и прочее)
Умеет автоматически определять является ли этот трафик последствием LA2 соединения, и, исходя из этого автоматически дешифрует (и шифрует обратно) пакеты LA2.
Так же, автоматически определяет разные способы работы с не LA2-трафиком, например RFO.
Возможно пользовательское дополнение своего типа трафика в определитель AL.

3. Скрипт-машина. (далее по тексту - СМ),
Позволяет гибко изменять пакеты трафика, путем написания скрипт-программ.
Это позволяет делать с пакетами все , что захотим.
Функции СМ все время дополняются и улучшаются, о них далее по тексту.
Каждый принятый пакет проходит последовательно до трех скриптов.
[принятый пакет] >> [дешифрация] >> [скрипт1] >> [скрипт2] >> [скрипт3] >> [шифрация ] >> [пакет на отправление]

I) Соединение клиента с сервером.

_http://x33.ru/saur/upload/PPC/k1a.gif

Обычно Трафик между клиентом (ботом) и сервером происходит напрямую, т.е. клиент сразу лезет на заданный IP и порт сервера.
(для LA2 трафика: в боте прописывается в set.ini , а в клиенте в l2.ini)

Соединение через прокси ,у бота LA2 (walker), происходит на адрес указанный в самом боте, а он уже по прокси-протоколу передает ему адрес куда прокси сервер должен соединятся дальше на сервер.

Другими словами, перенаправить трафик бота LA2 (Walker) просто, так как у него в опциях есть настройки работы через socks5 прокси, а PPC это и есть sock5 прокси (по умолчанию)
Достаточно сделать следующее , чтобы бот соединялся через PPC :

_http://x33.ru/saur/upload/PPC/k2.gif

127.0.0.1 ставить обязательно, а вот порт надо указывать такой, какой указываем в один из серверов PPC:

_http://x33.ru/saur/upload/PPC/k3.gif

А чтобы по 10 раз не забивать адрес, то сохраните в опциях волкера настройки.
НО! Внимание! волкер глючит при лоаде настроек - поэтому вызывайте настройки в волкере два раза подрят - это исключит глюки при загрузки сохраненых опций волкера.

С клиентом сложнее, так как у него нету встроенной функции соединения через прокси, и для этого приходится пользоваться сторонними программами проксификаторами.
Permeo Security Driver и Proxifier являются стандартными проксификаторами, инструкций по использованию полно в интернете.

Внимание!
В последних версих WP PPC добавлен модуль Multi Injector.
Он позволяет перенаправлять программы без использования сторонних проксификаторов.
В WP PPC по умолчанию уже находятся записи MI для перехвата LA2 и RFO:
_http://x33.ru/saur/upload/PPC/WPMIdef.gif

в случае LA2 клиента надо включить галочку на l2.exe (l2.dll в случае левых загрузчиков)
внимание! GG официального сервера Lineage2.com обнаруживает данный перехват
(если получится обойтись без драйвера, то скоро эта проблема будет решена)

в случае RFO включаем галочки на rf.exe и rf_online.bin (в rf.exe внедряем DLL помогающую перехватывать rf_online.bin)

Разумеется, чтобы MI работал с процессами, необходимо так же включить кнопку:
_http://x33.ru/saur/upload/PPC/k15.gif

Для других программ создаются аналогичные записи пользователем.
Более полная документация по MI (Multi Injector) в процессе написания ..

Внимание! скрины в описании настройки устаревшие.

Вот пример как выглядит трафик Lineage2 перехваченный версией WP658:
_http://saur.x33.ru/trash/LostWarNet281108.JPG

Профиль Личное сообщение Дом. страница icq
147
l2
Отправлено 12.06.2009 - 17:402
Администраторы
703 сообщений
Мужчина
Статус: Offline
Настройки PPC

В начале , надо определить порт , на который зацепится наш прокси сервер.
Так как их два, то можем поставить два номера порта подряд, по умолчанию в PPC это 1777 и 1778. Но можно выбрать любые не занятые номера.
Обычно нужен только один сервер, поэтому выбираем любой из двух и нажимаем кнопку включения (с желтым солнышком).

_http://saur.x33.ru/upload/PPC/k3.gif

Если появилось предупреждение о том, что порт занят, ставим другой номер порта.
! Очень важно правильно настроить фаерволл, разрешив WP PPC запускать сервера на локальном компьютере, а так же, разрешить выход в интернет. !

Нажав на кнопку [ * P-C панель] открываем главную панель PPC:

Тут изображена первая закладка главной панели PPC:

_http://saur.x33.ru/upload/PPC/k4.gif

На ней, вверху, находится список задания условий для соединений, а в углу права внизу опции.

На этой закладке устанавливается привязка скриптов по условиям.
Условие может быть :
Имя сервера - у соединения должно совпасть имя сервера
Host / IP - у соединения должно совпасть Host или IP
Port - у соединения должен совпасть Port

Галочками ставятся либо какое ни будь одно условие либо комбинацию из них.
В списке ниже, устанавливается от 1 до 3 скриптов для данной привязки.

! Нужно помнить, что если мы поставим порт 2106, то указанные скрипты в этой записи запустятся ТОЛЬКО на этот порт, то есть только на время работы Логин сервера, следовательно самым разумным ставить только Host /IP ! Для этого должна стоять только одна галочка Host/IP на данном условии, и в поле 'Выбор по:' так же должно стоять IP нашего сервера.

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

Имена серверов берутся из обнаруженных в памяти ботов - эти имена мы прописываем в set.ini бота. Имена в условие запуска скриптов лучше не ставить, для начала достаточно только IP.

Например, мы хотим установить скрипт позволяющий боту нормально двигаться на ява-серверах, l2j. Пусть IP сервера у нас будет 195.152.91.110 , название скрипта - demo2.sc (скрипт уже есть в дистрибутиве).

Тогда все должно выглядеть так :

_http://saur.x33.ru/upload/PPC/k5a.gif

(1) мы добавляем кнопкой [Добавить] сервер в список , можно с любым именем, например [Все имена].
(2) убедившись, что появившаяся запись отмечена (выбрана) , мы вводим IP в первом поле над кнопкой [OK]. (4) Далее нажимаем [OK].
(3) отмечаем галочку [x] Host/IP
(4) Далее нажимаем [OK].
(5) После этого, указываем какие скрипты будут запускаться при этих условиях.

Теперь нажав на пустое место под записью, чтобы снять выделение, мы должны увидеть раскраску полей . Если первое поле с номером зеленое , и нет ни одного поля с красным, значит, эта запись будет использоваться, иначе, она игнорируется (когда есть хоть одно красное поле - значит данные не до конца введены)

_http://saur.x33.ru/upload/PPC/k5b.gif

Теперь, если будет произведен коннект по такому IP, то на этот коннект будут запущены скрипты ниже (список из трех строчек).
Мы поставили 1 скрипт, но можно ставить до трех. Они будут выполняться по очереди , отдавая друг другу пакет по цепочке, после последнего он зашифруется и отправится.

Профиль Личное сообщение Дом. страница icq
147
l2
Отправлено 12.06.2009 - 17:413
Администраторы
703 сообщений
Мужчина
Статус: Offline
_http://saur.x33.ru/img/t.gif

Ниже на этой же закладке мы видим опции (они стоят в данный момент по умолчанию):

_http://saur.x33.ru/upload/PPC/k6.gif

'[ ] без скриптов не пропускать '- если тут будет галочка, то соединение не попавшее в список выбора скриптов, (либо если запись выбора не полная, есть красные поля), то это соединение не будет установлено.
'[x] Автостарт Auto Logger'a (AL)' - AL работает сразу, с первым пакетом. Иначе он будет ждать нажатия кнопки [On/Off] см. закладку Auto Logger. (либо когда из скрипта будет команда)
'Пакетов сохранять [ 500 ]' - Так как сохранить весь трафик не возможно (будет слишком накладно), то здесь ставится максимально количество пакетов на одно соединение, когда количество в работающем AL превысит установленное, ранние (верхние) пакеты будут удаляться, а последние добавляться . Например , если стоит 500, но при работающем AL прошло 850 пакетов, то сохранятся пакеты с 350 по 850. Значения этой опции могут быть от 100 до 3000 (пока так)
'Макс. Размер файла AL [ 3 ] Мег.' - Все собранные пакеты (если AL был включен хоть на время), при разрыве соединения сохраняются в файл 'autolog.dat', туда добавляются все пакеты пока файл не превысит указанный размер тут. Далее файл переименовывается в 'autolog.dat~.dat' заменяя старый если был, и начинается новый фал. 3 мегабайта это достаточно, но кому мало, можно поставить до 10 (пока так). (см. закладку Auto Logger.)
'Тип АвтоПарсинга пакетов [1]' - значение 1 - означает автоматическое определение разделения 'склеенных' пакетов. Значение 0 - не парсить пакеты , значение 2 - делить по факту размера в первых двух байтов. По умолчанию значение 1 .
Значение можно изменять 'на лету' в скриптах. Допустим, зная, что первые пакеты - это пакеты защиты, мы ставим значение в 0 (в скриптах) и работаем, эмулируя защиту, когда приходит время протоколу la2 мы ставим 2.(в скриптах)
'Тип PDecode пакетов [1]' - значение 1 - автоматическое определение дешифрации пакетов гейм сервера, 0 - выключено ! В этом случае пакеты будут идти, как есть - не дешифрованные.
2 - включен тип декодировки пакетов для la2 'GSDecode' (дешифроваться будет, только, если определятся ключи). Оставим 1.
'Таймаут по не активности [0]' - в секундах. Любое соединение, через которое в течении установленного тут времени не было ни одного пакета - рвется.
0 - таймаут выключен. (по умолчанию)

Все опции PPC запоминаются при выходе из WP PPC.

Левее опций мы видим установки скрипта для Прокси протокола, по умолчанию запускается скрипт почти аналогичный тому что можно посмотреть в файле 'wpsc\socks5.sc'.

III) Скрипты.

Запустив бота можно переключиться на следующую закладку (Links Online):

Мы видим онлайн соединение нашего бота.
!!! (Далее мы будет разбирать реальное соединение, и там другое IP, отличающееся от того, что мы указывали выше, скрины переделывать мне уже влом. Будем считать, что IP было то, что будем видеть дальше)

_http://saur.x33.ru/upload/PPC/k7.gif

Ниже списка мы видим закладки 'SysLog' , 'INFO' и 'Send Raw Packet'
'Syslog' это системный лог, туда пишутся глобальные сообщения об ошибках ( а так же сообщения от прокси скрипта).
'INFO' - это информация об активном соединении.
Там , кстати , можно всегда узнать реальный протокол =) (в данном случае 659)
'Send Raw Packet' - возможность послать пакет вручную, без скрипта.
в верхнем поле вводится пакет в виде двухсимвольных шестнадцатеричных байт разделенных пробелом, выбирается активное соединение и нажимается кнопка отсылки на сервер или на клиент.

В низу справа под списком Онлайн соединений мы видим кнопку [ Terminate link ]
Этой кнопкой мы всегда сможет разорвать соединение.

Кнопка с солнышком и надписью 'редактировать скрипты онлайн' активна только при выборе активного соединения из списка.
! Нажав не него мы получаем дополнительную закладку !!! с именем сервера и его Host/IP

_http://saur.x33.ru/upload/PPC/k8.gif

На ней мы видим редакторы для трех скриптов и скрипт лог для данного соединения,
Скрипты можно оперативно, не разрывая связи править, записывать в память/ на диск/загружать...
Script Log - туда записываются сообщения скриптов для каждого пакета.

Вспомним, что скрипты, все три, вызываются по очереди для каждого пакета, и после них пакет шифруется и отправляется дальше, куда он и шел в начале.
Далее , следующий пакет трафика опять идет на скрипты и так далее: (и пакеты от сервера и от клиента все идут через скрипты, а уже в скриптах можно по переменной _gFromServ определить откуда пакет)

Кнопки Read/Write - читают/пишут скрипт в памяти, после исправления скрипта, чтобы он исправился в памяти надо нажать Write - с этого момента следующий пакет сразу попадет на исправленный скрипт. Read - читает пакет из памяти.
Кнопки Load/Save - загружают/записывают, соответственно, скрипт из/в файл.
Если воспользовались кнопкой Load, то после загрузки, надо нажать Write, чтобы скрипт из редактора записался в память на пакеты. Т.е. как и при редактировании.
В закладке ScriptLog мы видим сообщения от скриптов (функции типа Writelog() ) и ошибки скриптов. Если ошибка будет фатальна для соединения, то произойдет разъединение и вся закладка скриптов закроется. НО! Если был включен (по умолчанию включен, вспомним опции) Auto Logger, то все это запишется в лог , и сообщения скриптов тоже, так что мы всегда узнаем что там случилось.

Профиль Личное сообщение Дом. страница icq
147
l2
Отправлено 12.06.2009 - 17:424
Администраторы
703 сообщений
Мужчина
Статус: Offline
Auto Logger. (AL)

_http://saur.x33.ru/img/t.gif

Не прерывая соединение бота, можно переключиться на закладку 'Auto Logger'

Мы видим Список соединений сверху, слева список пакетов.
Нажимая кнопки 'Online'/'Log File'справа от списка соединений , мы можем видеть как запущенные в данный момент соединения, так и записанные в файл.

Когда нажат режим 'Online' , в списке вверху, раз в секунду, обновляются запущенные в данный момент соединения, и выбрав одно , можно увидеть пакеты данного соединения в левом списке.
Кнопкой Start log/Stop log мы может останавливать и заново запускать автолог для каждого соединения.
Нажав на любой пакет из списка пакетов, можно видеть содержимое пакета.
'S>c ' означает , что пакет идет в направлении от сервера к клиенту.

Сохраняется только определенное количество пакетов, максимум 3000 пакетов (см. опции)
При разрыве соединения, лог этого соединения записывается в файл.

_http://saur.x33.ru/upload/PPC/k9.gif

В случае, если пакет был исправен скриптом, или было некое сообщение из скриптов, то появляются дополнительные закладки:

_http://saur.x33.ru/upload/PPC/k10.gif

Тут пакет идет с клиента через скрипт , закладка C>(scr) , далее пакет из скрипта иде на сервер (scr)>S.

Закладка Scripts log появляется, когда скрипт выдает какое либо сообщение (к примеру ф-цией Writelog())

Есть еще закладка (scr)<>(с)/(s) это закладка отражает все дополнительные пакеты, которые были переданы из скриптов при обработке данного пакета.

отображение пакетов в списке пакетов :
1. первая скобка '>':
S>c , C>s - передача текущего пакета без изменения.
2. первая скобка '}':
S}c , C}s - передача пакета с изменениями (закладки S>(scr) C>(scr) (scr)>S (scr)>C )
3. вторая скобка '>':
S>>c, C>>s - передача текущего пакета без изменений,
но были посланы дополнительно пакеты. (закладка (scr)<>(c/s))
S}>c, C}> - передача текущего пакета с изменениями,
и плюс были посланы дополнительные пакеты (закладки соответствуют)
4. значек в конце '~':
S>c~, S}>c~, S>>c~ .. - присуствуют сообщения из скриптов (закладка Script Log)
5. символ 'x':
S>x , C>x, S>>x, S}x - текущий пакет блокирован.
6. первый значек '='
=>c, =>s - пакет отправлен вручную, минуя скрипт. ('Links Online' / 'Send Raw Packet')
7. первый значек 'T' : (см. '_gS3OnTimer' и gSys('S3timer'))
сообщения или дополнительные пакеты из скрипта3 запущенного по таймеру:
T>~ - присуствуют сообщения из скрипта3 по таймеру.
T>> T>>~ - были посланы дополнительные пакеты из скрипта3 по таймеру.

В последних версиях дополнено описание пакетов.
Описание пакетов зависит от типа трафика, и устанавливается либо автоматически, либо в ручную на закладке 'Описание'

пример 'раскраски' пакета в зависимости от типов аргументов (и типа трафика, в данном случае это трафик 'LA2'):
_http://saur.x33.ru/upload/PPC/k12.gif
цвета заменяемые.
для одного типа аргумента один цвет, но до 5 тонов, чтобы одного типа аргументы не 'склеивались'

Номера пакетов можно переключить на название из описания или обратно:
_http://saur.x33.ru/upload/PPC/k13.gif

V) Script Tester

Это отдельный скрипт-движок, для отработки синтаксиса выражений,
от остальной части PPC не зависим и не связан.
Системные переменные почти все отсутствуют, (для отладки инициализировать в ручную)
Можно писать несложные некоторые программки.

При выходе из WP, все , что написано в Script Tester'е будет автоматически сохранено в файле 'ScriptTester.txt'. И при запуске WP опять туда загрузится.

возможность выбирать скрипт-движок:
зависит от расширения файлов скриптов:

'.sc' - WPS, - текстовый файт WPScript
'.fsc' - FS, - текстовый файл FastScript
'.xml' - PFS, - прекомпилированный файл FastScript. (можно создать в Script Tester'e)

В .xml случае (прекомпилированный) файл можно только использовать, но не редактировать.
Так же его очень трудно понять, можно использовать в качестве некоего подобия шифрования скрипта

Прекомпилированный файл будет примерно в 6-9 раз больше текстового, но зато при первичной загрузке (и соответственно компиляции) будет выполняться быстрее.
компиляция происходит только один раз при загрузке, но, например, при количестве строк более 1000 компиляция '.fsc' будет примерно 2 секунды, а компиляция '.xml' будет 100 ms.

Далее, после компиляции, при работе скрипта, разницы в скорости не будет.

Внимание!
Крайне рекомендуется выбирать FS скрипт, так как FS движок более быстр и продвинут, чем WPS.

Профиль Личное сообщение Дом. страница icq
147
l2
Отправлено 12.06.2009 - 17:435
Администраторы
703 сообщений
Мужчина
Статус: Offline
Функции скрипт-языка WPS

_http://saur.x33.ru/img/t.gif

Внимание!
В WP PPC встроено два разных скрипт-движка, чей синтаксис и ф-ции частично различны.
WPS, как устаревший движок, больше не поддерживается и описан в качестве документации. Используйте только FS движок.
Здесь описан скрипт движок WPS, информация о другом , FS, будет дальше по теме.

Синтаксис скрипт-движка WPS

Синтаксис скрип - языка WPS во многом схож с паскалем, об исключениях ниже.

Поддерживаются следующие операторы:

begin .. end;
if .. then .. else
case ... else end;
For .. to/downto .. do
While .. do
Repeat .. until
continue
break
goto
exit

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

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

Пример определения типа переменной;

c := 'a' ; // тип char;
k := c + 1; // тип сhar, равнозначно k = char( (byte(с)+1) and $ff );
k := 1 + c; // тип int, равнозначно k = byte(с) +1;
k := 0 + c; // тип int, равнозначно простому переводу типа k := byte©;

пример нарушения правила 'о перестановке слагаемых' =)
zz := 2 + gBuff[1]; // - zz стала int , = (byte(buff[1]) + 2) and $FF;
zz := gBuff[1] + 'a'; // - zz стала строкой, (= 'aa')

Чтобы не было подобных ошибок, советую использовать явное преобразование:
k := byte©;
k := char©;

А вот присваивание элементу строки (одномерного массива) будет работает как угодно:
s := '123456'; // буфер - это таже строка.
s[4] := 'G'; // здесь s = '123G56'
s[5] := 60 ; // здесь s = '123G<6'

шестнадцатеричные значения как в паскале:

v := $10; // v = 16;
v := $FFFF; // v = 65535

символ цифрами тоже как в паскале:

c := #97; // c : char = 'a' (97 = $61)
c := #$61; // c :char = 'a' ($61) шестнадцатиречный символ =)

строку можно набрать по разному:

s := 'aaaa1';
s := '#$61+#$61+#97+#97+'1' ; // = 'aaaa1'
доступ к символам/байтам как в массиве с позиции 1 то есть, s[5] = '1'

(немного из старых объяснений:
Brotherhood Of Cheaters - Allcheats.ru - Братство Читеров - Показать сообщение отдельно - WP401F/451R(WP307F) в производстве (не только для ботов) )

функции и процедуры скрипта:

В скрипте можно писать функции и процедуры, синтаксис схож с паскалем.

procedure Name(v1, ... vn); // описание процедуры
begin // тело процедуры

end;

function Name(v1, ... vn); // описание функции
begin // тело функции

result := ... // возвращаемое функцией значение.
end;

процедуры и функции без аргументов описываются так:
procedure Name();
...
function Name();
...

Внимание !! (только для WPS)
Все внешние переменные описанные в главном теле скрипта копируются в тело функции/процедуры, но не изменяются при выходе. За исключением переменных описанных в аргументах.
Системные переменные в том числе. (_gOutBuff присваивать только в главном теле скрипта)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>> например, так неправильно: <<<

procedure aaa();
begin
_gOutBuff := _gBuff; // здесь _gOutBuff локальный для этой ф-ции !!
// он копируется из основного, но не изменяет основной.
_gOutBuff[5] := #0;
end;

begin // главное тело скрипта

aaa; // <- вызов функции не изменит _gOutBuff;

end;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>> Правильно так: <<

function aaa();
begin
result := _gBuff;
result[5] := #0;
end;

begin // главное тело скрипта

_gOutBuff := aaa; // теперь _gOutBuff установился нормально.

end;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
>> так тоже правильно: <<

procedure aaa(bf);
begin
bf := _gBuff;
bf[5] := #0;
end;

begin // главное тело скрипта

bf := 0; // определим переменную.
aaa(bf);
_gOutBuff := bf; // теперь _gOutBuff установился нормально.

end;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Массивы.

Одномерные массивы являются набором отдельных переменных.
Объявляется каждый элемент массива отдельно.
например:
a[100] := 10;
- создастся сотый элемент массива a[], но, другие элементы еще не определены.

length(a) - работать не будет, так как каждый элемент массива это отдельная переменная.

Если необходимо сразу весь массив, то , на данный момент, только так :
if _gAbsNumPkt = 1 then begin // если первый пакет, то объявляем переменные.
for i := 1 to 100 do a[i] := 0;
alen := 100; // создадим переменную, где будем держать размер массива.
end;

Строка/буффер тоже определяется как одномерный массив, но имеет свойства string.

Двух мерные массивы создавать нельзя, но можно создавать массивы строк/буферов.
например:
a[1] := _gBuff;
if length(a[1]) >2) then ID := a[1][3]; // если размер пакета больше 2, то берм ID пакета

length(a) - даст ошибку.
length(a[1]) - даст размер пакета.

Для целей PPC этого достаточно, так как в скриптмашине сделан упор на быстродействие, а более мощные массивы существенно снижают быстродействие.

Более продвинутые синтаксис и возможности имеет второй скрипт-движок FS, информация о нем будет дальше.

Системные переменные скрипт-движка WPS

Все переменные определенные когда либо в скриптах, действительны для всей сессии.
Кроме этого существуют системные переменные, для входящей и исходящей инф-ции в скриптах. (Только для WPS)

_gBuff :str - входящий буфер (строка) , в нем приходит пакет в скрипты.
_gOutBuff :str - исходящий буфер, это пакет который уйдет дальше по назначению.
Если ничего не присваивать этой переменной, то пакет на выходе будет без изменений.
_gFromServ :bool - возвращает true , если скрипт получил пакет с сервера на клиент.
false - если с клиента на сервер.

_gS3onTimer - возвращает true ('1') если скрипт запущен по таймеру (см. gSys('S3timer'[,time]))

_gS3TimerCount - возвращает счетчик срабатываний таймера с последнего сброса таймера.
при сбрасывани таймера в ноль (выключении - gSys('S3timer',0)) счетчик _gS3TimerCount обнуляется. (_gS3TimerCount только начиная с WP410F)
(см. gSys('S3timer'[,time]))

_gAbsNumPkt :int - абсолютный номер приходящего пакета, нумеруется с 1.

_gStopOnError (bool) по умолчанию false, если установить значение true, то будет разрыв соединения в случае любой ошибки скрипта.
Разрыв будет не сразу, может пройти еще пара пакетов (для лога полезно).

_gServName - строка, с именем сервера, как он определился PPC.
_gServHost - строка, с хостом сервера, если он определился.
_gServIP - int, IP сервера.
_gServPort - int, Port сервера.

_gCWinSock - доступно только в скрипте socks5, тип WinSocketStream.

Профиль Личное сообщение Дом. страница icq
147
l2
Отправлено 12.06.2009 - 17:446
Администраторы
703 сообщений
Мужчина
Статус: Offline
Функции скрипт-языка WPS.(продолжение)

_http://saur.x33.ru/img/t.gif

Стандартные Функции:

byte(char), char(byte) -прямое преобразование в тип byte или char соответственно.
Внимание! в скрипт-языке FS данный способ преобразования не приемлем.

Функции перевода адреса :
inet_ntoa(addr : int) : str; (стандартная ф-ция.)
inet_addr(s : str) : int64; (стандартная ф-ция.)
inet_addr('127.0.0.1') - вернет целое 16777343 ($100007F)
inet_addr('zzzz') - ошибка, вернет -1 ($FFFFFFFFFFFFFFFF) (64 бит)

_getIPbyHost(s : string) : integer; - возвращает IP адрес по имени хоста.
!использует DNS, задержка в случае отсутствия имени на DNS может достигать до 3 секунд.
возвращает 0 в случае ошибки или если адрес по имени хоста не найден.

Copy(s, inx, count) : str - возвращает подстроку из сткроки 's' начиная с 'inx' номера символа, количеством 'count'. (стандартная ф-ция)
Так же, возвращает из бинарного буфера 's' начиная с 'inx' количеством 'count' байт/символов.
Copy('skjd123lsd',3,2) - вернет 'jd'

Insert(sub, s, idx); - Вставляет подстроку 'sub' в строку 's' начиная с 'idx' позиции.
Строка и субстрока могут быть бинарным буфером/пакетом.

s := '123456';
Insert('zz',s,3);
//теперь s = '12zz3456';

Delete(var str, idx, count) : str - Удаляет подстроку из строки 'str' начиная с 'idx' количеством 'count' символов

pos(subs,s) : int - возвращает индекс , с которого начинается подстрока 'subs' в строке(буфере) 's', либо 0 если такая подстрока не найдена (стандартная ф-ция)
pos('4','FD12345') - вернет 6.

Length(s) : int - возвращает длину строки(буфера) (стандартная ф-ция)
Length('dfgoi') - вернет 5

IntToStr(i) : str - преобразует int в строку . (стандартная ф-ция)
IntToStr(123) - вернет '123';

StrToInt(s) : int - преобразует строку в целое (стандартная ф-ция)
StrToInt('2332') - вернет 2332;
StrToInt('$2332') - вернет 9010 ($2332);
StrToInt('sdsd') - даст ошибку скрипта.

FloatToStr(), StrToFloat() - тоже, что и предыдущие ф-ции , но только с дробными числами.
StrToFloat ('234.2') - вернет 234.2 (стандартная ф-ция)

UpperCase(s), LowerCase(s) - конвертирует все строчные в прописные и наоборот соответственно. (стандартная ф-ция)
UpperCase('AaaaVvvv') - вернет 'AAAAVVVV';

Trim(s) - обрезает ведущие и последние пробелы и символы управления (непечатные). (стандартная ф-ция)
Trim(' a sd ') - вернет 'a sd'

Format(frmstr, a1,...an) : str; - (стандартная ф-ция)
форматированный вывод аргументов a1..an в соответствии со строкой форматирования frmstr.
Функция возвращает отформатированную строку.
'frmstr' - форматирующая строка, это текстовая строка, в которой на нужных местах стоят специальные символы(спецификации), которые определяют, какие и как туда будут подставлены параметры.
'a1,..an' - параметры, каждый параметр соответствует одной спецификации символов в форматирующей строке.

более подробное описание форматирующей строки смотрите ф-ю 'format' в паскале/дельфи (или тут _http://www.helloworld.ru/texts/comp/lang/delphi/delphi5/pril/formstr.htm )
или смотрите 'printf' в c++ (например тут _http://ru.wikipedia.org/wiki/Printf )

Примеры:
x := 100; y := 200;
writelog(format('X в 10ной: %d Y в hex: %x',x,y));
в логе будет запись: 'X в 10ной: 100 Y в hex: C8';
тоже самое: writelog(format('%s %d %s %x','X в 10ной:',x,'Y в hex:',y));

Функции для работы с датой и временем:
Now; Date; Time; DateToStr; StrToDate; TimeToStr; StrToTime ; FormatDateTime;
Описание не даю, они стандартные.

Арифметические ф-ции: (тоже все стандартные)
Abs; Int; Fract; Round; Ceil, Floor, Trunc, Sin, Cos, Tan, ArcSin, ArcCos, ArcTan,
Exp, Ln, IntPower, Sqr, Sqrt, Inc, Dec;
операции : div, mod

Битовые операции:
BitAND, BitOR, BitNOT, BitXOR, SHR , SHL;

Профиль Личное сообщение Дом. страница icq
147
l2
Отправлено 12.06.2009 - 17:457
Администраторы
703 сообщений
Мужчина
Статус: Offline
Функции скрипт-языка WPS.(продолжение)

_http://saur.x33.ru/img/t.gif

Далее не стандартные ф-ции.

ScriptTimeOut(ms), ms = 100..31000. - смена установки таймаута скрипта (от 0.1 до 31 секунд).
Любой скрипт по умолчанию терминируется , если время его работы превышает 1 секунду по умолчанию, _ScriptTimeOut меняет это значение.
В скрипт-тестере можно поставить значение 99999, тогда таймаут не будет отслеживаться
(В пакетных скриптах совсем отключить таймаут нельзя)
Таймауты по неактивности во время действия скрипта не проверяются.

WriteLog(a1,a2,..,an); a1..n - любые переменные; Выводит в лог сообщения либо значения переменных. Лог - для socks -скрипта это Syslog, для пакетных скриптов - свой, Scripts Log. (виден в каждой записи в логе, либо в онлайн редакторе скриптов)
Скрипт-тестер выводит в свой лог.

WriteLogH(a1,a2,,,an); a1..n - любые переменные.
Выводит Int в шестнадцатеричном виде;
Если переменная это строка (Str), то выводится как есть, без изменений.
Удобно для вывода в лог шестнадцатеричных значений с сообщениями.

Например:
WriteLogH(' X координата: ',curx,' Y координата: ',cury);
это равнозначно :
WriteLog(' X координата: ',inttohex(curx,2),' Y координата: ',inttohex(cury,2));

WriteLogHexB(buf[,len]); пишет HexBlock buf'a в виде блока , как это сделано в Autologger'e;

InttoHex(int[,mincount]) : str - вернет целое в шестнадцатеричном представлении (в Hex) в виде строки.
IntTohex($3461EAE) - вернет строку '3461EAE';
IntTohex(7777) - вернет строку '1E61';

BuftoHex(buf : str) : str - переводит каждый байт в Hex;
BuftoHex(#$01+#$02+#$04); - вернет строку '010204'
BuftoHex('aaa') - вернет строку '616161';
BuftoHex(inttostr(7777)) - вернет строку '37373737'

FStr(len, ch) : str; создать и вернуть строку(буфер) размером 'len' и заполнить символом 'ch'.
buf := FStr(1024,'a') - создать буфер 1024 символа и заполнить его символом 'a'.
buf := Fstr(100,0); - создать буфер 100 байт и обнулить его.
ограничение на максимум - 65к =)

HStr(str,[,len]) : buf; // собрать пакет
HPck(str,[,len]) : buf; // собрать пакет и добавить длину автоматом
пакет задается в виде шестнадцатеричных литер с пробелом либо без него
второй аргумент это длина пакета, неуказанные литеры дополняются нулями

Пример:
// Допустим, нужен пакет социала "Greeting" вида "07 00 1B 02 00 00 00"
// т.е. надо собрать строку #$07+#0+#$1B+#2+#0+#0+#0
// сделать это можно по разному:
pck := HStr('07 00 1B 02 00 00 00'); // - готовый пакет #$07+#0+#$1B+#2+#0+#0+#0"
pck := HStr('07001B02000000'); // тоже самое
pck := HStr('07 00 1B 02',7); // тоже самое
в этом случае второй аргумент - это размер строки, до которого надо дополнить нулями.

или, если надо, чтобы размер добавлялся сам, то используем ф-цию HPck(str,[,len]) : buf;

pck := HPck('1B 02 00 00 00'); // = тоже самое, готовый п-т #$07+#0+#$1B+#2+#0+#0+#0"
первые 2 байта размера пакета добавляются автоматом
pck := HPck('1B02000000'); // тоже самое
pck := HPck('1B 02',5); // тоже самое, обратить внимание на указанный размер.
Как видим, в ф-ции HPck() размер нужной строки указываем без учета первых байт с длиной пакета.

Во всех случаях мы получаем полную 'правильную' строку #$07+#0+#$1B+#2+#0+#0+#0,
что соответствует пакету "07 00 1B 02 00 00 00" и готова к отправке.

ReadSocket(s : Socket; var buff : str, count : int) : int; - только в socks скрипте
WriteSocket(s : Socket; var buff : str, count : int) : int; - только в socks скрипте
(для пакетных скриптов ф-ция дальше по тексту)

GInt(buf; index ; size : [1..8]) : int; - берет Int как 4 байта из buf[index];
или Word как 2 байта. 'size' может быть от 1 до 8, следовательно, 8 байт = int64
s := #$01+#$02+#$03+#$04+#$05+#$06+#$07+#$08;
Gint(s,3,2) - вернет word 1027 ( $403);
Gint(s,3,4) - вернет int $6050403;
Gint(s,1,8 ) - вернет int64 $807060504030201;
Gint(s,5,1) - вернет byte $05;
Gint(s,6,4) - даст ошибку скрипта. (размер буфера, выход за пределы)

PInt(buf; iw : int/word; index; size : [2,4]); - тоже что и GInt, только записывает.

gBlockPacket; - функция блокирующая данный входной пакет, он дальше никуда не уйдет.
Например запрет на запрос '/gmlist' будет так:
Код:

if (not _gFromServ) and copy(_gBuff,1,3) = HStr('03 00 81') then gBlockPacket;
// код только для WPS.

AnsiToWStr(astr, wstr): int; - перевод Ansi строки 'astr' в WideString 'wstr'.
переменная 'wstr' должна быть объявлена, в нее запишется WideString.
вернет количество байт записанных в 'wstr' или -1 если ошибка.
пример:
ws := ''; // объявление переменной 'ws'.
k := AnsiToWStr('str',ws); // здесь в ws будет ='s.t.r.' (#73 #00 #74 #00 #72 #00)
if k < 0 then writelog('ошибка AnsiToWStr');

Внимание! функция по умолчанию не добавляет два нулевых байта как признак Wide-строки.
если нужны нули в конце: (признак окончания Wide-строки)
k := AnsiToWStr('str'+#0,ws); // здесь в ws будет ='s.t.r...' (#73 #00 #74 #00 #72 #00 #00 #00)

WStrToAnsi(wstr, astr [,n,len]): int; - перевод WideString с позиции 'n' длиной 'len' байт в Ansi.
вернет количество записанных байт в 'astr' или -1 если ошибка.
если 'n' не указан, то по умолчанию он равен '1' (начало строки/буфера),
если размер строки 'len' не указан, то переводится вся строка/буфер 'wstr',
если 'len' = -1, то признак конца строки 'wstr' - два нулевых байта '00 00' подрят.
так же, при 'len' = -1 в 'astr' добавляется признак конца строки (один байт #0)
Внимание! положительный 'len' округляется до ближнего четного, так как Wide-символы двухбайтные.

примеры:
ls := AnsiToWStr(buf,st,10,-1);
st := trim(st); // избавимся от #0 в конце, если он там будет (см. ф-цию 'Trim')
if ls = -1 then begin writelog('ошибка в AnsiToWstr'); exit; end;
if ls > -1 then AfterWideStr := buf[10+ls*2]; // байт после wide-строки.
возьмет из 'buf' с 10 байта wide-стринг, до первого признака конца wide-строки,
запишет его как ansi-стринг в 'st' (с нулем в конце! в этом случае),
вернет количество ЗАПИСАННЫХ байт в 'st'.
Умножая 'ls' на 2 (ls*2) получим количество прочитанных байт (Widestr двухбайтные)
То есть, buf[10+ls*2] - следующий байт после wide-строки, при условии, что не было ошибки (ls <> -1)
для избавления от нуля в конце 'st' можно применить ф-цию Trim(st);

st := ''; ws := ''; // объявим переменные.
AnsiToWStr('AB',ws); // запишем в 'ws' строку 'AB' в виде Wide-строки (#$41 00 #$42 00).
WStrToAnsi('',st) - в 'st' ничего не будет, ф-я вернет 0
WStrToAnsi('',st,1,-1) - в 'st', так же, ничего не будет, ф-я вернет 0
WStrToAnsi(ws,st) - в 'st' будет 'AB' (#$41 #$42), ф-я вернет 2;
WStrToAnsi(ws,st,1,-1) - в 'st' будет 'AB'+нуль (#$41 #$42 #00), ф-я вернет 3;

Профиль Личное сообщение Дом. страница icq
147
l2
Отправлено 12.06.2009 - 17:468
Администраторы
703 сообщений
Мужчина
Статус: Offline
Функции скрипт-языка WPS.(продолжение)

_http://saur.x33.ru/img/t.gif

Системные ф-ции:
функция переходник 'gSys()'
которая дает доступ к системным переменным и функциям.
Название переменных и функций в первом аргументе этой ф-ции.

gSys('Tick') : int - вернет количество миллисекунд прошедших со старта компьютера (стандартная ф-ция GetTickCount)

gSys('Tick',var,ms) : bool- вернет true, если прошло время равное 'ms' или больше
с последнего запуска этой ф-ции (с той же переменной var).
переменную 'var' использовать разную в каждом новом 'Tick' иначе они будут друг другу мешать.

Например, посылаем пакет на сервер каждые 10 секунд (10 сек или больше):
естественно, при отсуствии пакетов , время может быть от 10сек до ближайшего пакета после 10сек.
if _gAbsNumPkt = 1 then begin // первый пакет.
// первый пакет используется, чтобы установить начальные переменные 1 раз.
..
tv := 0; // если поставим 1 , то Tick выполнится с первого раза. иначе только после первых 10 сек.
..
end;
..
if gGSys('Tick',tv,10000) then begin // 10000 ms = 10 сек.
gPSys('Ensends',buf); // посылаем пакет buf на сервер (Ensendc - на клиент, см ниже)
end;

gSys('S3timer'[,time]): int; - 'time' в миллисекундах.
- установка/чтение значения таймера на запуск третьего скрипта.
возвращает текущее значение таймера.
значение '0' выключает таймер.
Если установлен таймер на запуск третьего скрипта, то третий скрипт будет запускаться не только в порядке очереди при каждом пакете, но и каждое 'time' время.
Узнать как запустился скрипт можно по переменной '_gS3onTimer' - она вернет 'true' ('1') если скрипт запустился по таймеру, или 'false' ('0') если скрипт запустился в порядке очереди приема пакета.
Переменная _gS3TimerCount вернет счетчик срабатываний таймера с последнего сброса таймера.
при сбрасывани таймера в ноль (выключении) счетчик _gS3TimerCount обнуляется. (_gS3TimerCount только начиная с WP410F)

Внимание! при включении (не изменении, а именно включении) таймера, первый раз таймер срабатывает сразу, далее через интервал.

_gBuff , в третьем скрипте, при запуске от таймера, либо содержит '03 00 00' либо ничего.
_gOutBuff , при выходе из третьего скрипта, при запуске скрипта от таймера, игнорируется.

gSys('SendC',bf[,len]): int - послать пакет на клиент без шифровки.
если размер пакета не указывать, то он определится автоматически.
gSys('EnSendC',bf[,len]) : int - послать пакет на клиент с шифровкой,
пакет автоматически зашифруется действующими ключами, если они определились(De/EnCode: Tx) , либо, если установлен PDecode в ручную.

gSys('sendS',bf[,len]): int, gSys('EnSendS',bf[,len]) : int- тоже, что и предыдущие ф-ции, но на сервер.

Функции 'EnSendC' и 'EnSendS' шифруют пакет в зависимости от типа трафика, если это трафик la2, то используется метод шифровки 'GSDecode'.

Ф-ции отсыла пакетов возвращают количество удачно отосланых байт,
либо '-1' , если отослать не удалось, т.е. была ошибка.

ключи используемые автоматической системой дешифрации:
! При включенной системе авто-дешифрации, ключи устанавливаются автоматически.
gSys('Kci') : string - получить ключ для пакетов пришедших с клиента.
gSys('Kco') : string - получить ключ для пакетов уходящих на клиент.
gSys('Ksi') : string - получить ключ для пакетов пришедших с сервера.
gSys('Kso') : string - получить ключ для пакетов уходящих на сервер.
gSys('Kci',string) - установить данный ключ. (для остальных соответственно)

gSys('TrafType'[,val]): int; - тип определившегося трафика.
- '0,1' не определен, '2' - la2, '3'..'14' - резерв.
gSys('tPDecode'[,val]): int; - тип де/шифровки пакетов (PDecode),
- '-1' стоит автоопределение, но еще не определен.
'0' - нет де/шифровки, выключено, '-1' - неизвестно, '2' - la2 (GSDecode), '3'..'14' - резерв.
gSys('tParse'[,val]): int; (тип _ParsingPackets) - тип парсинга пакетов.
- '-1' - стоит автоопределение, но еще не определен.
'0' - нет парсинга, '1' - 2 bytes size (la2-style), '3'..'14' - резерв.
gSys('isLS'[,val]): int; - флаг, что определился LS - Login Server (la2)
- возвращает тип LS сервера или 0 если не определился как LS
gSys('isGS'[,val]): int; - флаг, что определился GS - Game Server (la2)
- возвращает тип GS сервера или 0 если не определился как GS
Переменная 'val' устанавливает эти значения принудительно. (критично к изменениям)

gSys('DecGS',buf,key, KeyType) : bool;
- Декодирует буфер пакета 'buf' Гейм-сервера (GS) ключем 'key' (LA2 - функция).
gSys('EncGS', buf, key, Keytype) : bool;
- Кодирует буфер пакета 'buf' Гейм-сервера (GS) ключем 'key' (LA2 - функция).
Ключи 'key' изменяются в соответствии с правилами (де)кодирования GS LA2 (KeyType).
'buf' - бинарная строка буфера/пакета
'key' - бинарная строка с ключем, размер должен соответствовать KeyType.
'KeyType' - см. 'gSys.tKeyType' в 'FS' разделе
Ф-ции возвращают 1 если отработали удачно и -1 если не удачно.

gSys('LSchks',buf[,cs]) : bool; (la2 - функция)
- возвращает 1 (true) если чексумма пакета 'buf' Логин-сервера (LS) сходна с указанной в самом пакете, иначе 0 (false).
! Размер buf должен быть не менее 8, иначе игнорируется.
! Пакет может быть, как с 2 начальными байтами размера пакета, так и без них. Определяется автоматически.
Если присуствует аргумент 'cs', то в нем возвращается значение чексуммы.
Внимание! переменная 'cs' должна быть заранее определена.
например:
cs := -1;
gSys('LSchks',buf,cs);
пример использования см. в скрипте 'wpsc\demo3.sc'

gSys('ALstart'[,0/1]) : int - для текущей сессии запустить автолог (запись лога пакетов) или остановить.
без второго параметра возвращает состояние логерра 0- выключен, 1-включен
(тоже самое в ручную делает кнопка [on/off] на панели AL)

gSys('Killself'); - разорвать соединение, дисконнект. (убивается трид сессии)
(тоже в ручную делает кнопка [Terminate Link] на главной панели Links Online )
gSys('Killself',time) - разорвать соединение, дисконнект через 'time' миллисекунд(1000 = 1 сек).
советую всегда ставить немного задержку, хотя бы 3000 - gSys('Killself',3000);

Профиль Личное сообщение Дом. страница icq
147
l2
Отправлено 12.06.2009 - 17:479
Администраторы
703 сообщений
Мужчина
Статус: Offline
Функции скрипт-языка WPS.(продолжение)

_http://saur.x33.ru/img/t.gif

крипт-функции:
Blowfish:
gSys('BFinit',key) : int; - инициализация ключа BF, ключ = token
возвращает 0 если успешно, или -1 если ошибка.

gSys('BFdecb',buf); - BF кодировка 8-байтного буфера.
gSys('BFencb',buf); - BF декодировка 8-байтного буфера.

gSys('BFdec',buf[,len]); - BF кодировка буфера (пакета)
gSys('BFenc',buf[,len]); - BF декодировка буфера (пакета)
- в этих ф-циях размер буфера(пакета) должен быть кратен 8, иначе последние, не кратные, байты не закодируются.
Пример использования см. в файле 'wpsc\demo3.sc' в архиве.

Base64:
gSys('EnBase64',buf[,len]) : buf; - вернет 'buf' кодированый в Base64.
gSys('DeBase64',buf[,len]) : buf; - вернет декодированный 'buf' из Base64
если (де)кодирование не успешно, вернет пустую строку ''
более подробно о Base64 тут: _http://ru.wikipedia.org/wiki/Base64
пример:
ob := gSys('DeBase64',bi);
if (length(ob) = 0) and (length(bi) <> 0) then Writelog('Ошибка декодирования Base64');

gSys('MD5',buf) : md5; - Возвращает 16 байтный MD5 hash буфера или строки 'buf'.
gSys('SHA1',buf) : sha1; - Возвращает 20 байтный SHA-1 hash буфера или строки 'buf'.

gSys('rnd'[,maxval]) : int; (maxval = 0..$FFFFFFFF)
- возвращает случайное целое число X в пределах от 0 до maxval.
Если maxval не указан, то берется максимальное значение (2^32)

gSys('Rndmize'); - начальная установка счетчика случ. чисел по системному таймеру. (использовать не обязательно, вызывается в каждой сессии автоматически)

StringList(function,a1...a4) : retvalue; - Список строк, с возможностью чтения/записи из/в файл(а)
где 'function':
StringList('Create') : sl; - создать TStringList (sl - integer, объект класса)
StringList('Free', sl); - освободить TStringList
// ф-ции по полной аналогии TStringList в DELPHI
StringList('Clear', sl);
StringList('Delete',sl, index);
StringList('Add',sl, string) : integer;
StringList('AddObject',sl, string, integer) : integer;
StringList('Insert',sl, index, string);
StringList('InsertObject',sl, index, string, integer);
StringList('LoadFromFile',sl, string);
StringList('SaveToFile',sl, string);
StringList('IndexOf',sl, string) : integer;
StringList('IndexOfName',sl, string) : integer;
StringList('IndexOfObject',sl, integer) : integer;
StringList('CommaText',sl[,string]) : string;
StringList('Count',sl) : integer;
StringList('Names',sl,index) : string;
StringList('Objects',sl,index[,integer]) : integer;
StringList('Values',sl,string[,string]) : string;
StringList('Strings',sl,index[,string]) : string;
StringList('Text',sl[,string]) : string;
StringList('Duplicates',sl[,integer]) : integer;
StringList('Sorted',sl[,boolean]) : boolean;
StringList('CaseSensitive',sl[,boolean]) : boolean;
StringList('Sort',sl);
пример (WPS):
sl1 := StringList('Create'); // создали клас
StringList('LoadFromFile',sl1,'c:\temp\slf.txt');
val := StringList('Values',sl1,'ляля');
StringList('Free', sl1); // - обязательно освобождать.

В настоящее время здесь указан не полных список ф-ций.
Так же , ожидается пополнение функций время от времени (и версий PPC)

Профиль Личное сообщение Дом. страница icq
147
l2
Отправлено 12.06.2009 - 17:4710
Администраторы
703 сообщений
Мужчина
Статус: Offline
Настройки в файле 'WPcfg.ini'

Установки WP:
[WP]
autoonlynew=yes - установка автоматом только что запущенных ботов(т.е. ранее запущенные не трогаются)
autogmlist=yes - установка автоматом gmlist'а
autoanchors=yes - установка автоматом anchors
AutoCBuff=yes - установка автоматом c-buff
xxCheckAnchors=yes - также снимает pickup с Appretince's Wand для проверки
useTCheck=no - при выборе токена устанавливать галки из token.wp (сбрасывает галки)
autol2j=no - установка автоматом l2j
autoppeoff=no - установка автоматом PPE-off

установки таймаутов для PPC:
[PPC]
FirstPckNumber=30 - количество первых пакетов для следующей переменной. от 20 до 300.
FisrtPckTimeout=60 - разрыв, если неактивность в первых пакетах. сек. (время выбора персонажа на аккаунте исключается)
проверяется только, если трафик определен (например ла2)
если значение 0 - то выключен. (при запуске двух и более клиентов меньше 20 сек не ставить)
OnCloseTimeout=5 - разрывать в случае неактивности, после прихода пакета от сервера LogOutOk. сек. (2..60c)
Если стоит значение 0 - то выключен. (меньше 2 секунд не ставить, иначе клиент не успеет сообразить и выйдет по дисконнекту)
OnRequestLogOutTimeout=60 - разрывать в случае неактивности, когда клиент послал серверу на запрос LogOut. сек. (25..180c)
Если стоит значение 0 - то выключен. (меньше 30 секунд не советую)
TotalPacketTimeOut=900 - если вообще нету активности, то разрыв. сек. (900 = 15 минут)
минимальное значение 600 (10 минут), максимально 3600 (час.)
UndefinedLinkTimeOut=60 - тамаут по неактивности (секунды) для неопределенных соединений. 20 .. 300 секунд.
NoLookUp=0 - если 1 то раз в час не будет производиться lookup имен хостов через DNS.

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

Внимание! Кроме того существует пользовательский таймаут в опциях PPC.
см. опцию 'таймаут по неактивности' , если больше нуля, то будет разрыв соединения при неактивности, вне зависимости от типа трафика. (cм третий пост этой темы)

По умолчанию стоят оптимальные значения.

Профиль Личное сообщение Дом. страница icq
147
Отправлено 29.08.2009 - 15:4811
Пользователи
57 сообщений
Мужчина
Статус: Offline
Серёг, тут в названии темы написано: WP-PPC - настройка и !П!азличная документация =)
Профиль Личное сообщение Дом. страница icq
0
l2
Отправлено 29.08.2009 - 20:3212
Администраторы
703 сообщений
Мужчина
Статус: Offline
VaduJ, Спасибо, уже исправлено.
Профиль Личное сообщение Дом. страница icq
147
Отправлено 30.08.2009 - 00:4213
Пользователи
57 сообщений
Мужчина
Статус: Offline
Серег) Не исправлено) И в названии второй темы в шапке ошибка. А еще внизу какие-то кракозябры под формой ответа.

Добавлено (30.08.2009, 00:42)
---------------------------------------------

Code
http://s46.radikal.ru/i113/0908/3a/ef268443f911.jpg

Code
http://i016.radikal.ru/0908/63/faf187ce6b02.jpg
Профиль Личное сообщение Дом. страница icq
0
Форум » Lineage2 Клиент » Боты » WP-PPC - настройка и различная документация
  • Страница 1 из 1
  • 1
Поиск: