PDA

Просмотр полной версии : [Tutorial] как писать свои скрипты и использовать чужие в Ppc


ExE
16.07.2008, 21:39
PPC имеет 2 встроенных скрипт-движка: WPS и FS (FastScript). Обучаться будем на примере WPS.

Для начала я расскажу как вообще подгружать скрипты:
1) Открываем P-C панель
2) Переходим на вкладку ScriptTester
3) Переключаемся на скрипт-движок WPS
4) Пишем свой скрипт или вставляем чужой
5) Нажимаем *Script Run*
6) Если скрипт-движок не обнаружил ошибок в коде, то будет выдано примерно следующее:
Код:

.running {WPS text script} 16.09.2007 15:37:51
.end (time: 0ms.)

7) Теперь жмем Save, чтобы сохранить скрипт
8) Переходим на вкладку Servers/Scripts
9) Выбираем заданное условие выбора скриптов (в нашем случае это должно быть правило с названием RFOnline.ru)
9) Выбираем свободный слот для привязки скрипта к правилу (для каждого правила может быть привязано до 3х скриптов)
10) Нажимаем [...] - Файл скрипта
11) Выбираем скрипт, который мы сохранили

Если вы хотите изменить скрипт в процессе его работы, то:
1) Переходим на вкладку Links Online
2) Выбираем текущее соединение
3) Нажимаем Редактировать скрипты онлайн
4) Изменяем скрипт
5) Нажимаем кнопку Write, чтобы обновить скрипт в памяти. Если мы накосячили в процессе редактирования и хотим вернуть исходный скрипт из памяти, то для этого существует кнопка Read.

Узнать больше можно тут:
_[Ссылки могут видеть только зарегистрированные и активированные пользователи]

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

// RF Online ::: Отправка сообщений в общий чат от любого ника by Mastermind
//
// Использование:
// Написать в общий чат следующее сообщение: msg [ник, от имени которого отправляем сообщение] [сообщение]
if (not _gFromServ) and copy(_gBuff,3,2) = HStr('02 02') then begin
i := 6;
while BufToHex(_gBuff[i]) <> '20' do i := i + 1;
i := i + 3;
if copy(_gBuff,i,4) = HStr('6D 73 67 20') then begin
i := i + 4;
nick := '';
while BufToHex(_gBuff[i]) <> '20' do begin
nick := nick + BufToHex(_gBuff[i]);
i := i + 1;
end;
i := i + 1;
msg := '';
while BufToHex(_gBuff[i]) <> '00' do begin
msg := msg + BufToHex(_gBuff[i]);
i := i + 1;
end;
st := nick + '203A20' + msg;
len := inttohex(length(st)/2);
st := '0202' + len + st + '00';
_gOutBuff := HPck(st);
end;
end;

Построчные комментарии к скрипту:
Код:

// Входящий пакет
// 29 00 | 02 02 | 23 | 5B D2 F0 E8 E0 F0 E8 E9 5D 4D 61 73 74 65 72 6D 69 6E 64 20 3A 20 6D 73 67 20 47 4D 20 48 65 6C 6C 6F 21 | 00

// Начало скрипта
// Если пакет не от сервера (т.е. от клиента) и, начиная с 3его байта, 2 байта имеют значение 02 02 (т.е. пакет типа 02 02 - сообщение в общий чат), тогда...
if (not _gFromServ) and copy(_gBuff,3,2) = HStr('02 02') then begin

// Присваиваем переменной i значение 6. Переменная i будет выступать в качестве некого указателя на конкретный байт пакета, т.е. сейчас наш указатель установлен на байт 5B
i := 6;

// Пока 16тиричное значение i-ого байта входящего пакета не равно 20 = [пробел] смешаем указатель вправо на единицу, т.е. после выполнения цикла указатель будет иметь значение 25 и расположен на байте 20
while BufToHex(_gBuff[i]) <> '20' do i := i + 1;

// Смещаем указатель на 3 позиции вправо, т.е. i = 28, и устанавливаем его на байт 6D
i := i + 3;

// Если с 28 байта четыре последующих байта имеют значение 6D 73 67 20 = msg[пробел], тогда...
if copy(_gBuff,i,4) = HStr('6D 73 67 20') then begin

// i = 32, текущий байт = 47
i := i + 4;

// Присваиваем переменной nick пустую строку
nick := '';

// Пока 16тиричное значение i-ого байта входящего пакета не равно 20 = [пробел] ...
while BufToHex(_gBuff[i]) <> '20' do begin

// Пристыковываем справа к строке nick 16тиричное значение i-ого байта
nick := nick + BufToHex(_gBuff[i]);

// Увеличиваем i на единицу
i := i + 1;

// Конец цикла, nick = 47 4D
end;

// Указатель находиться на 33 позиции входящего пакета, а именно на байте 20. Смещаем указатель на следующий байт (48).
i := i + 1;

// Присваиваем переменной msg пустую строку
msg := '';

// Пока 16тиричное значение i-ого байта входящего пакета не равно 00 = нуль-байт ...
while BufToHex(_gBuff[i]) <> '00' do begin

// Пристыковываем справа к строке nick 16тиричное значение i-ого байта
msg := msg + BufToHex(_gBuff[i]);

// Увеличиваем i на единицу
i := i + 1;

// Конец цикла, msg = 48 65 6C 6C 6F 21
end;

// Присваиваем переменной st строку-сообщение, передаваемое в чат - 47 4D | 20 3A 20 | 48 65 6C 6C 6F 21
st := nick + '203A20' + msg;

// Определяем длину строки-сообщения, переводим ее в 16тиричную систему и присваиваем это значение переменной len
len := inttohex(length(st)/2);

// Добавляем тип пакета слева (02 02) и нуль-байт справа (00). st = 02 02 | 0B | 47 4D | 20 3A 20 | 48 65 6C 6C 6F 21 | 00
st := '0202' + len + st + '00';

// Добавляем 2 байта размера, собираем пакет и помещаем его в выходной буфер
_gOutBuff := HPck(st);

// Конец условия
end;
// Конец скрипта
end;

// Исходящий пакет
// 11 00 | 02 02 | 0B | 47 4D 20 3A 20 48 65 6C 6C 6F 21 | 00