Показать сообщение отдельно
Старый 16.09.2007, 20:37   #5
Mastermind
Гость
Аватар для Mastermind
Сообщений: n/a
Благодарностей:
0 всего

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

Внимание! В скрипте я намеренно допустил 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

Последний раз редактировалось Mastermind; 17.09.2007 в 22:22.
 
Ответить с цитированием