Изучаем скрипты WP. Часть восьмая
Мы уже с вами научились добывать команды с сервера, однако отправлять их в ручную, не совсем удобно. И в этом вы могли
сами убедиться, если не пропускали предыдущие занятия. Поэтому пришла пора все наши команды перенести в скрипт и доверить
ему задачу по отправке/приёму пакетов. В этой главе, мы с вами создадим скрипт, который будет принимать ID стрюнеров и
записывать эти ID в отдельный файл на диске. Полезность данного скрипта мала, но мы ведь только учимся и для наших целей
скрипт вполне подойдёт.
Прежде всего давайте создадим каркас для нашего будущего скрипта и определимся как прицепить наш скрипт.
Когда мы отправляли пакеты в ручную, мы помещали шестнадцатеричный код в редактор, выбирали активное соединение и только
после этого отправляли пакет. В случае самостоятельного скрипта, никаких активных соединений уже не будет и нам нужно
самим определиться с адресом отправки пакета. Проблема в том, что у каждой карты, свой собственный ID. В этом вы можете
убедиться просмотрев данную тему:
http://zhyk.ru/forum/showpost.php?p=578920&postcount=1
Так как же быть спросите вы? Дело в том, что ID-карт действительно разные, но вот порт у них у всех одинаковый (8080). Здесь
то нам и приходит на помощь WP. Как вы уже наверное знаете, на вкладке "Proxy PC/PPC панель/ServersScripts", в правой
части, есть условия соединения (по имени сервера, по IP-сервера, по порту). Здесь нам нужно будет прописать порт 8080 и
поставить галочку напротив "порт" и естественно прицепить наш скрипт. Ну чтож, давайте этим и займемся.
Перейдите во вкладку ScriptTester и сохраните наш будущий скрипт в формате .fsc, вернитесь на вкладку Servers/Scripts и
подцепите наш скрипт к порту 8080. Также не забудьте в MI-панели выбрать ваш браузер (если у вас firefox, то вместо браузера
выбираете процесс plugin-container.exe), метод D3/H1, галочки F2 и F3, ип - любой, порт из списка - прописываете 8080.
Ок, все приготовления завершены, теперь наберите в ScriptTester следующий текст. Набирать текст рекомендую вручную, а не
тупо копировать готовый код. И старайтесь, когда пишите, каждую строчку понять. Если возникнут трудности, то комментарии
находятся чуть ниже. Итак, вот код скрипта:
Код:
var SpisokMobov: TStringList;
procedure OnCreate;
begin
SpisokMobov:=TStringList.Create;
end;
procedure OnDestroy;
begin
SpisokMobov.Free;
end;
begin
if (_gFromServ=true) and hStrCmp(_gBuff,1,7,'30 7c 4b 7c 39 39 38')
then
begin
SpisokMobov.Add(Copy(_gBuff,5,8));
SpisokMobov.SaveToFile('c:\LogMobov.txt');
end;
end.
Комментарий к коду. В первой строчке, мы создаём глобальную переменную SpisokMobov класса TStringList. Естественно вы можете
назвать переменную по-своему, но помните, что имя переменной рекомендуется создавать осмысленным (как в данном случае).
Класс TStringList - это просто список строк. Пример:
99800391
99800392
99800393
99800394
Поскольку мы создаём список (свой собственный объект), то нам потребуются две процедуры: OnCreate и OnDestroy. В процедуре
OnCreate как вы уже наверное дагадались мы создадим наш список, а в процедуре OnDestroy мы его удалим при завершении скрипта.
Для создания списка используется метод Create, а для того чтобы этот список удалить из памяти, используется метод Free.
В главном теле скрипта (между служебными словами begin/end.) мы записываем условие записи в список. Т.е. нам нужно
не все подряд пакеты записывать в список а лишь те, которые приходят от сервера к клиенту. Причём из этих пакетов требуется
выбрать те, где находится ID моба и отбросить лишнюю служебную информацию.
Для того, чтобы определить каким является пакет (от клиента к серверу или от сервера к клиенту), служит системная переменная
PPC скрипт-движка FS _gFromServ.
Если _gFromServ=true, то это пакет от сервера к клиенту
Если _gFromServ=false, то это пакет от клиента к серверу
Отлично, с этим разобрались, но нам же нужны не все входящие пакеты, а лишь те которые содержат ID моба. Добывать команды
вы уже умеете, поэтому я здесь останавливаться не буду. Отмечу лишь то, что ID можно достать из разных пакетов, я например
выбрал этот:
307C4B7C3939383030333937000D0A (шестнадцатеричный код)
0|k|99800397... (символьный код)
Естественно нам нужен не весь шестнадцатеричный код, а лишь его часть (ведь у каждого моба свой ID). Сколько символов взять
для сравнения строк, решать вам, я например выбрал 7 символов (30 7c 4b 7c 39 39 38).
Функция hStrCmp как вы уже поняли служит для сравнения сток. У этой функции 4 параметра:
1-ый параметр: буфер из которого нужно взять часть строки для сравнения
2-ой параметр: с какой позиции начинается эта часть
3-ий параметр: количество символов части
4-ый параметр: строка в шестнадцатеричном коде, с которой идёт сравнение нужной части
Таким образом, условие записи можно расшифровать так: если пакет входящий и содержит ID моба, то выполнить дальнейшие действия.
Ну а дальнейшие действия, это ни что иное как добавление ID моба в список и сохранение этого списка в файл.
для добавления в список, используется метод Add. Для записи в файл, используется метод SaveToFile.
_gBuff - входящий буфер
_gOutBuff - исходящий буфер
Описание функции Copy из справочника:
Copy(s, inx, count) : str - возвращает подстроку из сткроки 's' начиная с 'inx' номера символа, количеством 'count'.
(стандартная ф-ция). Так же, возвращает из бинарного буфера 's' начиная с 'inx' количеством 'count' байт/символов.
Copy('skjd123lsd',3,2) - вернет 'jd'
Как видите, в коде нет ничего сложного. Работать данный скрипт начнёт сразу после загрузки звёздной карты и прекратит работу
после выхода из звёздной карты.
Если вы посмотрите на результат работы скрипта (откроете полученный файл с ID мобов), то обнаружите, что некоторые ID будут
повторяться. Естественно этот недостаток нужно убрать. И убрать этот недостаток придётся вам самостоятельно. Да, да, вы не
ослышались, это будет вам домашнее задание. Ну и по традиции, кто выполнит правильно первым домашнее задание, тот получит
от меня наивысшую оценку (спасибку).
На этом данную статью заканчиваю. изучайте, экспериментируйте и ждите следующих глав.