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;