Спасибо. Значит просто иногда пакеты кривые, потому что на l2.ru вместо 3 int иногда приходит только один.
Пример:
Код:
[62] SystemMessage, 13:37:17 [24 b]
62 DF 08 04 02 61 7D 0F 00 02 64 8D 0F 00 01 C8 | bЯ...a}...d....И
9B 01 49 10 00 00 00 00
Кстати, в Ertheia оптимизацию провели (размеры полей сократили).
[SRC="pascal"]GDSystemMsg.Id := ReadH;
if EndOfPacket(False) then
begin
Amount := 0;
end
else
begin
Amount := ReadC;
end;
if (Amount < 0) or (Amount > 50) then raise Exception.Create('Invalid amount.');
SetLength(Strings, Amount);
for I := 0 to Amount - 1 do
begin
ObjectId := ReadC;
S := '';
case ObjectId of
0: // TEXT
begin
S := ReadS;
end;
1: // NUMBER
begin
if Index = Length(Pck) - 1 then N := ReadH else N := ReadD;
S := IntToStr(N);
end;
2: // NPC
begin
Id := ReadD;
Dec(Id, 1000000);
if GameData.GetNPCName(Id, GDNPCName) then S := GDNPCName.Name;
if S = '' then S := Format('[NPC #%d]', [Id]);
end;
3, 8: // ITEM
begin
Id := ReadD;
if ObjectId = 8 then ReadD;
S := GetItemName(Id);
if S = '' then S := Format('[Item #%d]', [Id]);
end;
4: // SKILL
begin
Id := ReadD;
L := ReadH;
S := Format('[Skill #%d-%d]', [Id, L]);
end;
5: // CASTLE
begin
Id := ReadH;
S := Format('[Castle #%d]', [Id]);
end;
6: // ITEM_NUMBER
begin
Q := ReadQ;
S := IntToStr(Q);
end;
7: // ZONE_NAME
begin
Ch.Pos.X := ReadD;
Ch.Pos.Y := ReadD;
Ch.Pos.Z := ReadD;
S := Format('[%d, %d, %d]', [Ch.Pos.X, Ch.Pos.Y, Ch.Pos.Z]);
end;
9: // ELEMENT_NAME
begin
Id := ReadC;
S := Format('[Element #%d]', [Id]);
end;
10: // INSTANCE_NAME
begin
Id := ReadH;
S := Format('[Instance #%d]', [Id]);
end;
11: // UNKNOWN
begin
Id := ReadD;
S := Format('[Unknown #%d]', [Id]);
end;
12: // PLAYER_NAME
begin
S := ReadS;
end;
13: // SYSTEM_STRING
begin
Id := ReadH;
S := Format('[System #%d]', [Id]);
end;
15: // CLASS
begin
Id := ReadH;
S := ClassToStr(Id);
end;
16: // UNKNOWN
begin
N := ReadD;
if N <> 0 then
begin
ReadD;
ReadD;
end;
S := '[Unknown Type 16]';
end;
19: // Byte
begin
S := IntToStr(ReadC);
end;
else
begin
if Home then raise Exception.Create(Format('Unknown piece type (%d)', [ObjectId])) else Exit;
end;
end;
Strings[I] := S;
end;
if not EndOfPacket(Home) then Exit;
[/SRC]
hLaPEx, Evermore, hAuthD, L2on, ...