|
Wpf с самого начала 2.1 - Rising Force Online - Уязвимости, баги, читы и статьи по RF Online. |
25.03.2009, 16:58
|
#1
|
|
|
|
Пехотинец
|
Регистрация: 07.12.2008
Сообщений: 75
Популярность: 247
Сказал(а) спасибо: 55
Поблагодарили 99 раз(а) в 32 сообщениях
|
Снова решил поднять тему о скриптописании в впф. Гайд в виде для "блондинок" я писать не буду, но постараюсь достаточно подробно разобрать все основные моменты. Чтение "WPF с самого начала 2.0" не нужно вообще. И так начнем...
Перед всеми начинающими скриптописателями после освоения всех функции WPF встает вопрос - а как это юзать? Готовые примеры в интернете искать занятие не благодарное т.к. либо найдете что то очень сложное либо не найдете вообще.
Для начала следует усвоить что WPF(ныне WPP) использует язык Delphi в качестве основы. Соответственно у тех, кто уже умеет кое-как программировать на Delphi, проблем возникнуть не должно.
По сути говоря сам скрипт, представляет собой одну большууууюю функцию, которая начинается со слова "var". Это слово является знаком объявления переменных.
Пример:
Код:
var //знак объявления переменных
ID : int //объявили целоисчеслительную переменную "ID"
BEGIN //знак начала выполнения нашего скрипта.
ID := 1;
END. //знак конца выполнения нашего скрипта.
Скрипт WPP выполняется при каждом пакете в любую сторону, так что нам нужны условия, при которых будет выполняться сам скрипт.
Пример:
Код:
var //знак объявления переменных
ID : int; //объявили целоисчеслительную переменную "ID"
BEGIN //знак начала выполнения нашего скрипта.
if ID = 0 then //если ID = 0 тогда
ID := 1;
END. //знак конца выполнения нашего скрипта.
В WPP любая объявленная переменная автоматически получает значение "0". Таким образом, нам не нужно делать лишние движения для присваивания переменной числа 0.
Все проверки строятся по одному принципу: |если| |условие| |тогда| - if something then притом независимо от значений условие может возвращать лишь два значения 0 и 1 или ПРАВДА или ЛОЖЬ (TRUE or FALSE) --- ПРАВДА - условие выполнилось, ЛОЖЬ - условие НЕ выполнилось. Таким образом, условие "if ID then" будет выполняться ВСЕГДА, если ID не равен 0 так же как "if 999 then". Для более грамотного вида преобразуем наш скрипт:
Пример:
Код:
var //знак объявления переменных
ID : int; //объявили целоисчеслительную переменную "ID"
BEGIN //знак начала выполнения нашего скрипта.
if not ID then //если ID = 0 тогда
ID := 1;
END. //знак конца выполнения нашего скрипта.
Подробные описания "not", "xor", "or", и "and" вы можете посмотреть в любом справочнике в интернете. Сюда копировать это я не вижу смысла.
Для того чтобы поставить реакцию скрипта на определенный пакет в WPP нам нужны две функции.
1: _gFromServ - пакет от сервера, тогда как - not _gFromServ - пакет от клиента.
2: StrCmp(s1, s2) - сравнивает две строки(s1 и s2) и если они равны друг другу - возвращает 1(ПРАВДА).
Если с _gFromServ все понятно, то с StrCmp(s1, s2) не все так просто. Для того чтобы скрипт сработал только на определенный пакет нам нужно использовать внутри еще две функции внутри StrCmp.
1: copy(_строка_ , _номер баита, с которого копировать_ , _количество байт_) - копирует определенное количество байт.
2: Hstr(строка) - превращает нашу строку в последовательность HEX символов.
Проще всего это будет объяснить на примере:
Пример:
Код:
var //знак объявления переменных
ID : int; //объявили целоисчеслительную переменную "ID"
BEGIN //знак начала выполнения нашего скрипта.
if (not _gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then { если пакет от клиента и если начиная с 3го байта пакета 2 байта равны HEX 03 00 тогда }
ID := 1;
END. //знак конца выполнения нашего скрипта.
Всё!
(с) Stormraider
Перед тем как начать вторую часть нашего гайда, я покажу вам нескольких функции и две переменные, которые почти всегда используются в скрипте.
Сначала о переменных: для работы с пакетами в WPP выделены две переменные-строки, а именно _gBuff и _gOutBuff. Объясню по подробнее:
1._gBuff = переменная, которая отвечает за тот пакет, который получает WPP. Редактировать ее нельзя.
2._gOutBuff = переменная, которая отвечает за тот пакет, который выходит из скрипта.
Если по понятнее, то чаще всего это выглядит вот так:
пакет приходит в WPP -> проверки по _gBuff(if ***** then) -> изменения в конечном пакете через _gOutBuff -> пакет ушел дальше.
Во всей этой цепочке используется один и тот же пакет.
Теперь о функциях:
1.gSys.SendS(s1); - отправляет строку s1 на сервер
2.gSys.SendC(s1); - отправляет строку s1 к клиенту
3.writelogin(s1); - крайне нужная функция, которая записывает в лог строку (НЕ ВЗДУМАЙТЕ ЗАПИСАТЬ В ЛОГ ПАКЕТ, ТАКИМ ОБРАЗОМ, в лучшем случае это не сработает, а в худшем WPP просто пошлет весь скрипт. Как это делается правильно, я покажу в конце этой части.)
Перейдем к примерам:
1 Пример: допустим, вам нужно, чтобы WPP ловил какой-то пакет и заменял его своим.
Пример:
Код:
var //знак объявления переменных
stroka1 : string; //объявили строковую переменную stroka1
Procedure OnCreate; //Одна из вложенных процедур в WPP, но о ней ниже...
begin
stroka1 := Hstr('11 22 33 44 55 66 77 88 99'); //присвоили переменной stroka1 строку хекс 11 22 33 44 55 66 77 88 99
end;
BEGIN
if (not _gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then { если пакет от клиента и если начиная с 3го байта пакета 2 байта равны HEX 03 00 тогда }
_gOutBuff := stroka1; //переменная _gOutBuff будет равна stroka1, по-другому это будет вот так : _gOutBuff := Hstr('11 22 33 44 55 66 77 88 99');
END.
Объясню несколько нюансов, которые я не затронул в предыдущем уроке:
1. Каждая строчка команд в скрипте ОБЯЗАТЕЛЬНО должна заканчиваться "; " таким образом, WPP понимает, что здесь заканчивается одна команда и начинается другая. К командам сравнения if *** then это не относится. Так же после самого последнего end ставится не "; " а ". " что показывает WPP, что скрипт закончен. Все предыдущие end должны заканчиваться "; " хотя и тут есть одно исключение, но об этом потом.
2. Для присваивания переменной чего-либо используется ":=" тогда как "=" используется в операциях сравнения.
3. Регистр символов в кодовых фразах не обязателен к соблюдению но крайне желателен для того чтобы вам было удобнее читать то что вы накатали.
Так же как вы заметили, появилась процедура OnCreate. Подробнее о процедурах и функциях я объясню в следующих уроках, а пока вам следует знать, что внутри этой процедуры (между begin и end можно присвоить вашим переменным стартовые значения.
2 Пример: допустим, вам нужно, чтобы WPP ловил какой-то пакет от сервера и в ответ слал ему что либо:
Пример:
Код:
var //знак объявления переменных
stroka1 : string; //объявили строковую переменную stroka1
Procedure OnCreate; //Одна из вложенных процедур в WPP, но о ней ниже...
begin
stroka1 := Hstr('11 22 33 44 55 66 77 88 99'); //присвоили переменной stroka1 строку хекс 11 22 33 44 55 66 77 88 99
end;
BEGIN
if (_gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then { если пакет от клиента и если начиная с 3го байта пакета 2 байта равны HEX 03 00 тогда }
gSys.SendS(stroka1); // шлем серверу stroka1
END.
Прошу заметить что пакет, который пришел в WPP и подошел под условие, продолжит идти дальше. Для того что бы этого не произошло нужно использовать функцию gBlockPacket; которая не позволит уйти пакету куда либо дальше. Преобразуем наш скрипт до нужного вида:
Пример:
Код:
var //знак объявления переменных
stroka1 : string; //объявили строковую переменную stroka1
Procedure OnCreate; //Одна из вложенных процедур в WPP, но о ней ниже...
begin
stroka1 := Hstr('11 22 33 44 55 66 77 88 99'); //присвоили переменной stroka1 строку хекс 11 22 33 44 55 66 77 88 99
end;
BEGIN
if (_gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then begin { если пакет от клиента и если, начиная с 3го байта пакета 2 байта равны HEX 03 00, тогда начинаем }
gSys.SendS(stroka1); // шлем серверу stroka1
gBlockPacket; //заблокирует пакет _gBuff к дальнейшему перемещению
end; //заканчиваем
END.
В наверняка увидели, что после проверки условия появилась фраза begin. Эта фраза используется здесь для того чтобы обозначить начало команд, которые должны выполнится если условие равно 1(Правда). Нужно для того чтобы выполнилась цепочка команд после проверки условия. Заканчивается оно должно end; . Если бы мы не поставили эти две фразы то команда gBlockPacket; выполнялась бы всегда независимо от того истинно ли условие или ложно.
Ну и напоследок расскажу, как добавить в лог пакет. Для этого нам нужна функция BufToHex(s1); которая переводит строку пакета в нормальную текстовую строку.
Пример:
Код:
ar //знак объявления переменных
BEGIN
if (_gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then
WriteLog(BufToHex(_gBuff));
END.
Либо по-другому (используя функцию WriteLogHexB(s1); которая будет аналогична WriteLog(BufToHex(s1)) ).
Пример:
var //знак объявления переменных
BEGIN
if (_gFromServ) and StrCmp(copy(_gBuff,3,2), HStr('03 00')) then
WriteLogHexB(_gBuff);
END.
Всё!
(с)Stormraider
Последний раз редактировалось Ivan_32; 25.03.2009 в 17:38.
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 04:19.
|
|