Тема: L2PacketHack 3.5.x
Показать сообщение отдельно
Старый 02.07.2009, 22:01   #938
Местный
 
Аватар для Yegor
 
Регистрация: 05.04.2009
Сообщений: 1,436
Сказал Спасибо: 306
Имеет 122 спасибок в 98 сообщенях
Yegor пока неопределено
По умолчанию

Tип: 0x62 (SystemMessage)
Pазмер: 43+2
Время прихода: 22:28:29:140
0002 d MsgID: $c1 получает от цели $c2 $s3 урона. ID:2262 (0x08D6)
0006 d typesCount: 3 (0x00000003)
0008 d typePar: тип параметра, может принимать значения:

0 - значит это строка (подставляеться вместо $cx)
1 - просто числовое значение (integer 4 байта) (подставляеться вместо $sx)
2 - id NPC (integer 4 байта) (подставляеться вместо $cx)
3 - id предмета (integer 4 байта) (подставляеться вместо $sx)
4 - id скила (integer 4 байта + ещё 4 байта которые я игнорирую) (подставляеться вместо $sx)
7 - где то видел но не нашел этого пакета в логах (12 байт)

могут быть и другие значения типов параметров, но мне пока не попадались.

x - это порядковый номер параметра, все значения в пакете идут по порядку как в строке.

Ну а потом идет собственно само значение и так по кругу typesCount раз.

Теперь мой вариант как прочитать этот пакет:

delphi Код:
var   lastSystemMessage: record     msgID: integer;     msgUnformatedString: string;     msgText: string;   end; function TL2WorldData.GetL2SystemMessage(const pck: string): boolean; var   i, j: integer;   typesCount: integer;   parType: integer;   st: string;   objSt: string;   sPar: string;   iPar: integer; begin   Result:= false;   if pck[1] <> #$62 then exit;   i:= 2;   lastSystemMessage.msgID := ReadD(pck, i);   typesCount:= ReadD(pck, i);   lastSystemMessage.msgUnformatedString:= sysMsgIdList.Values[IntToStr(lastSystemMessage.msgID)];   st:= lastSystemMessage.msgUnformatedString;   for j:= 0 to typesCount - 1 do   begin     parType:= ReadD(pck, i);     case parType of       0: begin         sPar:= ReadS(pck, i);         st:= AnsiReplaceStr(st, '$c' + IntToStr(j + 1), sPar);       end;       1: begin         iPar:= ReadD(pck, i);         st:= AnsiReplaceStr(st, '$s' + IntToStr(j + 1), IntToStr(iPar));       end;       2: begin         iPar:= ReadD(pck, i);         objSt:= NpcIdList.Values[IntToStr(iPar - 1000000)];         st:= AnsiReplaceStr(st, '$c' + IntToStr(j + 1), objSt);       end;       3: begin         iPar:= ReadD(pck, i);         objSt:= ItemIdList.Values[IntToStr(iPar)];         st:= AnsiReplaceStr(st, '$s' + IntToStr(j + 1), objSt);       end;       4: begin         iPar:= ReadD(pck, i);         objSt:= SkillIDList.Values[IntToStr(iPar)];         st:= AnsiReplaceStr(st, '$s' + IntToStr(j + 1), objSt);         inc(i, 4);       end;       7: begin         inc(i, 12);       end;       else       begin         SendMSG('Неизвестный идентефикатор параметра в пакета SystemMesage (ID: '           + IntToStr(lastSystemMessage.msgID) + ') '  + IntToStr(parType));         Exit;// выходим дабы не наделать горя, так как неизвестно сколько байт считывать       end;     end;   end;   lastSystemMessage.msgText:= st;   Result:= true; end;

Последний раз редактировалось Yegor, 02.07.2009 в 22:07.
Yegor вне форума   Ответить с цитированием
За это сообщение Yegor нажился спасибкой от: