Построчные комментарии к скрипту
Внимание! В скрипте я намеренно допустил 2 ошибки, которые расчитаны на ваше знание документации к WP PPC и умение отлаживать работу скриптов через Auto Logger / Script Log. Скрипт без ошибок представлен под хайдом в предыдущем сообщении.
Код:
// Входящий пакет
// 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 := HStr(st);
// Конец условия
end;
// Конец скрипта
// Выходящий пакет
// 11 00 | 02 02 | 0B | 47 4D 20 3A 20 48 65 6C 6C 6F 21 | 00