Первые шаги изучения протокола AA привели к созданию примерочной.
С помощью программы вы сможете узнать, как выглядит на персонажах тот или иной игровой предмет (одежда и оружие). Амуниция отображается непосредственно в игре (в окне выбора персонажа), поэтому для работы программы требуется наличие официального клиента ArcheAge. Программа работает автономно, игровой аккаунт не нужен, официальные серверы могут быть отключены.
Ссылка: http://aaplay.ru/static/files/wardrobe.zip
Добавлено через 24 минуты
Чтобы добавить полезности, вот так отсылаю список персонажей:
[SRC="pascal"]procedure TGame.SendPlayerList(Stream: TGameStream; Char: TCharacter);
var
P: TGamePacket;
S: RawByteString;
I: Integer;
procedure WriteItem(ItemId: Integer);
var
I: Integer;
begin
P.WriteD(ItemId);
if ItemId > 0 then
begin
P.WriteD(1); // ObjectId
for I := 1 to 6 do P.WriteC(0);
P.WriteC(1);
for I := 1 to 3 do P.WriteC(0);
P.WriteC(1);
for I := 1 to 4 do P.WriteC(0);
P.WriteC(1);
for I := 1 to 62 do P.WriteC(0);
P.WriteC(3);
for I := 1 to 16 do P.WriteC(0);
end;
end;
begin
P := TGamePacket.Create;
try
P.Id := $003901DD;
P.WriteC(1);
P.WriteC(1);
P.WriteD(Char.Id);
P.WriteS(Char.Name);
P.WriteC(Char.Model.race);
P.WriteC(Char.Model.gender);
P.WriteC(Char.Level);
P.WriteC($64);
P.WriteC(1);
P.WriteC(0);
P.WriteC(0);
P.WriteD($178);
P.WriteD(180); // zone_id?
P.WriteC(101); // faction_id?
for I := 1 to 21 do P.WriteC(0);
WriteItem(Char.Chest);
WriteItem(Char.Head);
WriteItem(Char.Legs);
WriteItem(Char.Gloves);
WriteItem(Char.Feet);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
WriteItem(Char.Weapon);
WriteItem(Char.WeaponExtra);
WriteItem(Char.WeaponRanged);
WriteItem(Char.Instrument);
P.WriteD(Char.Model.face);
P.WriteD(Char.Model.hair_id);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(Char.Model.body);
S := RawByteString(#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$01 +
#$0B#$0B#$00#$00#$00#$00#$28#$5F#$CD#$03#$00#$00#$00#$00#$40#$2F +
#$C1#$03#$AC#$7D#$FC#$42#$03);
P.WriteB(@S[1], Length(S));
P.WriteD(Char.Model.hair_color_id);
P.WriteD(Char.Model.skin_color_id);
P.WriteD(0);
P.WriteD(0);
P.WriteSingle(1);
P.WriteSingle(1);
P.WriteD(0);
P.WriteD(0);
P.WriteD(Char.Model.face_fixed_decal_asset_0_id);
P.WriteSingle(Char.Model.face_fixed_decal_asset_0_weight);
P.WriteD(Char.Model.face_fixed_decal_asset_1_id);
P.WriteSingle(Char.Model.face_fixed_decal_asset_1_weight);
P.WriteD(Char.Model.face_fixed_decal_asset_2_id);
P.WriteSingle(Char.Model.face_fixed_decal_asset_2_weight);
P.WriteD(Char.Model.face_fixed_decal_asset_3_id);
P.WriteSingle(Char.Model.face_fixed_decal_asset_3_weight);
P.WriteD(0);
P.WriteD(Char.Model.face_normal_map_id);
P.WriteD(0);
P.WriteSingle(1);
P.WriteD(0);
P.WriteD(Char.Model.left_pupil_color);
P.WriteD(Char.Model.right_pupil_color);
P.WriteD(Char.Model.eyebrow_color);
P.WriteD(Char.Model.deco_color);
S := HexToStr(Char.Model.modifier);
P.WriteH(Length(S));
if S <> '' then
begin
P.WriteB(@S[1], Length(S));
end;
P.WriteD(500); // очки работы
S := RawByteString(#$BF +
#$F5#$F0#$52#$00#$00#$00#$00#$00#$00#$6B#$52#$EF#$52#$00#$00#$00 +
#$00#$00#$00#$00#$00#$6B#$52#$EF#$52#$00#$00#$00#$00#$00#$00#$00 +
#$00#$7A#$F5#$F0#$52#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00 +
#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00 +
#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00 +
#$00#$00#$00#$00#$00#$00#$00#$00#$00#$03#$00#$00#$00#$00#$00#$00 +
#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00 +
#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00 +
#$00#$00#$5E#$D5#$F0#$52#$00#$00#$00#$00);
P.WriteB(@S[1], Length(S));
Stream.Send(P);
finally
FreeAndNil(P);
end;
end;[/SRC]
С помощью программы вы сможете узнать, как выглядит на персонажах тот или иной игровой предмет (одежда и оружие). Амуниция отображается непосредственно в игре (в окне выбора персонажа), поэтому для работы программы требуется наличие официального клиента ArcheAge. Программа работает автономно, игровой аккаунт не нужен, официальные серверы могут быть отключены.
Ссылка: http://aaplay.ru/static/files/wardrobe.zip
Добавлено через 24 минуты
Чтобы добавить полезности, вот так отсылаю список персонажей:
[SRC="pascal"]procedure TGame.SendPlayerList(Stream: TGameStream; Char: TCharacter);
var
P: TGamePacket;
S: RawByteString;
I: Integer;
procedure WriteItem(ItemId: Integer);
var
I: Integer;
begin
P.WriteD(ItemId);
if ItemId > 0 then
begin
P.WriteD(1); // ObjectId
for I := 1 to 6 do P.WriteC(0);
P.WriteC(1);
for I := 1 to 3 do P.WriteC(0);
P.WriteC(1);
for I := 1 to 4 do P.WriteC(0);
P.WriteC(1);
for I := 1 to 62 do P.WriteC(0);
P.WriteC(3);
for I := 1 to 16 do P.WriteC(0);
end;
end;
begin
P := TGamePacket.Create;
try
P.Id := $003901DD;
P.WriteC(1);
P.WriteC(1);
P.WriteD(Char.Id);
P.WriteS(Char.Name);
P.WriteC(Char.Model.race);
P.WriteC(Char.Model.gender);
P.WriteC(Char.Level);
P.WriteC($64);
P.WriteC(1);
P.WriteC(0);
P.WriteC(0);
P.WriteD($178);
P.WriteD(180); // zone_id?
P.WriteC(101); // faction_id?
for I := 1 to 21 do P.WriteC(0);
WriteItem(Char.Chest);
WriteItem(Char.Head);
WriteItem(Char.Legs);
WriteItem(Char.Gloves);
WriteItem(Char.Feet);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
WriteItem(Char.Weapon);
WriteItem(Char.WeaponExtra);
WriteItem(Char.WeaponRanged);
WriteItem(Char.Instrument);
P.WriteD(Char.Model.face);
P.WriteD(Char.Model.hair_id);
P.WriteD(0);
P.WriteD(0);
P.WriteD(0);
P.WriteD(Char.Model.body);
S := RawByteString(#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$01 +
#$0B#$0B#$00#$00#$00#$00#$28#$5F#$CD#$03#$00#$00#$00#$00#$40#$2F +
#$C1#$03#$AC#$7D#$FC#$42#$03);
P.WriteB(@S[1], Length(S));
P.WriteD(Char.Model.hair_color_id);
P.WriteD(Char.Model.skin_color_id);
P.WriteD(0);
P.WriteD(0);
P.WriteSingle(1);
P.WriteSingle(1);
P.WriteD(0);
P.WriteD(0);
P.WriteD(Char.Model.face_fixed_decal_asset_0_id);
P.WriteSingle(Char.Model.face_fixed_decal_asset_0_weight);
P.WriteD(Char.Model.face_fixed_decal_asset_1_id);
P.WriteSingle(Char.Model.face_fixed_decal_asset_1_weight);
P.WriteD(Char.Model.face_fixed_decal_asset_2_id);
P.WriteSingle(Char.Model.face_fixed_decal_asset_2_weight);
P.WriteD(Char.Model.face_fixed_decal_asset_3_id);
P.WriteSingle(Char.Model.face_fixed_decal_asset_3_weight);
P.WriteD(0);
P.WriteD(Char.Model.face_normal_map_id);
P.WriteD(0);
P.WriteSingle(1);
P.WriteD(0);
P.WriteD(Char.Model.left_pupil_color);
P.WriteD(Char.Model.right_pupil_color);
P.WriteD(Char.Model.eyebrow_color);
P.WriteD(Char.Model.deco_color);
S := HexToStr(Char.Model.modifier);
P.WriteH(Length(S));
if S <> '' then
begin
P.WriteB(@S[1], Length(S));
end;
P.WriteD(500); // очки работы
S := RawByteString(#$BF +
#$F5#$F0#$52#$00#$00#$00#$00#$00#$00#$6B#$52#$EF#$52#$00#$00#$00 +
#$00#$00#$00#$00#$00#$6B#$52#$EF#$52#$00#$00#$00#$00#$00#$00#$00 +
#$00#$7A#$F5#$F0#$52#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00 +
#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00 +
#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00 +
#$00#$00#$00#$00#$00#$00#$00#$00#$00#$03#$00#$00#$00#$00#$00#$00 +
#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00 +
#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00#$00 +
#$00#$00#$5E#$D5#$F0#$52#$00#$00#$00#$00);
P.WriteB(@S[1], Length(S));
Stream.Send(P);
finally
FreeAndNil(P);
end;
end;[/SRC]
hLaPEx, Evermore, hAuthD, L2on, ...