Цитата:
Сообщение от Nickers
Как смещения редактировать под версии?
|
Берешь конкретный сервер, точишся руками, смотришь пакеты: ItemList, InventoryUpdate. Если во всех предметах видно правильное описание по ItemID (смещение 10 и 78 по рисунку), то смотришь, в например этот кусок скрипта:
delphi Код:
procedure ItemList;
var
i, j, k: integer;
ListSize: integer;
begin
j:=4; //пропускаем дo ListSize
ListSize:=ReadH(j);
for i:=1 to ListSize do
if (i<=ListSize) then begin
BaseItems[i,1]:=ReadH(j); //ItemType1- 1:одето броня. 0:бижа. 4:в рюкзаке
BaseItems[i,2]:=ReadD(j); //ObjectID
BaseItems[i,3]:=ReadD(j); //ItemID
BaseItems[i,4]:=ReadD(j); //LocationSlot
BaseItems[i,5]:=ReadD(j); // q Amount:
j:=j+4; // q Amount:
BaseItems[i,6]:=ReadH(j); //ItemType2
BaseItems[i,7]:=ReadH(j); // CustomType1
BaseItems[i,8]:=ReadH(j); //isEquipped:
BaseItems[i,9]:=ReadD(j); //BodyPart
BaseItems[i,10]:=ReadH(j); //EnchantLevel
inc(j,30);// ФИНАЛ
end else for k:=1 to 10 do BaseItems[i,k]:=0; // забиваем нулями
if (0<ItemID) then objectOID:=GetObjectID(ItemID);//находим по ItemID предмет с ObjectID
end;
Нас интересуют смещения ObjectID, EnchantLevel и кусочек скрипта - inc(j,30). Так вот. На рисунке, в первом блоке EnchantLevel находится по смещению 36 он размером 2 байта, за ним идет CustType2 смещение 38. Оно нам и надо. В следующем блоке ObjectID по смещению - 74. Вычисляем разницу 74-38=36. Вот поэтому сюда inc(j,30); надо не 30, а 36 вставить. Так как по видимому другие хроники. Процедура должна быть такая:
delphi Код:
procedure ItemList;
var
i, j, k: integer;
ListSize: integer;
begin
j:=4; //пропускаем дo ListSize
ListSize:=ReadH(j);
for i:=1 to ListSize do
if (i<=ListSize) then begin
BaseItems[i,1]:=ReadH(j); //ItemType1- 1:одето броня. 0:бижа. 4:в рюкзаке
BaseItems[i,2]:=ReadD(j); //ObjectID
BaseItems[i,3]:=ReadD(j); //ItemID
BaseItems[i,4]:=ReadD(j); //LocationSlot
BaseItems[i,5]:=ReadD(j); // q Amount:
j:=j+4; // q Amount:
BaseItems[i,6]:=ReadH(j); //ItemType2
BaseItems[i,7]:=ReadH(j); // CustomType1
BaseItems[i,8]:=ReadH(j); //isEquipped:
BaseItems[i,9]:=ReadD(j); //BodyPart
BaseItems[i,10]:=ReadH(j); //EnchantLevel
inc(j,36);// ФИНАЛ
end else for k:=1 to 10 do BaseItems[i,k]:=0; // забиваем нулями
if (0<ItemID) then objectOID:=GetObjectID(ItemID);//находим по ItemID предмет с ObjectID
end;
С пакетом и процедурой InventoryUpdate, поступаем аналогично.
Кроме этого из лога надо проверить соответствие ID пакетов, тем которые в скрипте. Ну и сама логика заточки в скрипте должна соответствовать хроникам сервера.