Новичок в данной теме, помогите разобраться, никак не пойму что происходит, написал простенький скрипт, больше из любопытства:
Код:
var
iItemCount,iObjId,iItemId,iSlot,iCount,i,sme:integer; //сколько вещей в инвентаре
procedure Init; //Вызывается при включении скрипта
begin
iItemCount:=0;
end;
procedure Free; //Вызывается при выключении скрипта
begin
end;
procedure SendMesg(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(17); //голосом героя
WriteS('Внутренний голос'); // кто чревовещает
WriteH(65535);
WriteH(65535); // почему-то без этого мессаги не отправляются
WriteS(msg);
SendToClient;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if FromServer and (pck[1]=#$11) then
// пришел ответ на запрос списка вещей
begin
SendMesg(inttostr(length(pck)));
sme:=0;
SendMesg(IntToStr(sme)+' тек смещение в пакете');
i:=1; // не видел ни разу чтобы в инвентаре совсем было пусто, пусть будет 1
iItemCount:=ReadH(4);
SendMesg(IntToStr(iItemCount)+' слотов занято в инвентаре');
iObjId:=ReadD(sme+6);
iItemId:=ReadD(sme+10);
iSlot:=ReadD(sme+14);
iCount:=ReadQ(sme+18);
// SendMesg(IntToStr(iObjId)+' ID '+IntToStr(i)+' объекта');
// SendMesg(IntToStr(iItemId)+' ID '+IntToStr(i)+' итема');
SendMesg(IntToStr(iSlot)+' слот '+IntToStr(i)+' итема');
SendMesg(IntToStr(iCount)+' количество '+IntToStr(i)+' итема');
// пока проверка цикла вручную со смещением относительно блоков
sme:=$50;
for i:=2 to iItemCount do
begin
SendMesg(IntToStr(sme)+' тек смещение в пакете');
iObjId:=ReadD(sme);
iItemId:=ReadD(sme);
iSlot:=ReadD(sme);
iCount:=ReadQ(sme);
SendMesg(IntToStr(iObjId)+' ID '+IntToStr(i)+' объекта');
SendMesg(IntToStr(iItemId)+' ID '+IntToStr(i)+' итема');
SendMesg(IntToStr(iSlot)+' слот '+IntToStr(i)+' итема');
SendMesg(IntToStr(iCount)+' количество '+IntToStr(i)+' итема');
ReadH(sme); //it1
ReadH(sme); //ct1
ReadH(sme); //ie
ReadD(sme); //bp
ReadH(sme); //elvl
ReadH(sme); //ct2
ReadD(sme); //aid
ReadD(sme); //mana
ReadD(sme); //rt
ReadH(sme); //ae
ReadH(sme); //aev
ReadH(sme); //daf
ReadH(sme); //daw
ReadH(sme); //dawi
ReadH(sme); //dae
ReadH(sme); //dah
ReadH(sme); //dau
ReadH(sme); //ee1
ReadH(sme); //ee2
ReadH(sme); //ee3
ReadD(sme); //?
ReadH(sme); //?
// sme:=sme+$4a; // переходим на след элемент
end;
end;
end.
сам пакет инвентаря выглядит примерно так:
Код:
11
01 00
22 00
3D C8 A4 40 oid
57 03 00 00 id
02 00 00 00 slot
01 00 00 00 00 00 00 00 count
02 00 it2
00 00 ct1
00 00 eq
06 00 00 00 bp
00 00 el
00 00 ct
00 00 00 00 aid
FF FF FF FF mana
F1 D8 FF FF rt
01 00 ae
FE FF aev
00 00 daf
00 00 daw
00 00 dawi
00 00 dae
00 00 dah
00 00 dau
00 00 ee1
00 00 ee2
00 00 ee3
00 00
00 00
00 00
14 D0 A4 40 57 03 00 00 FF FF FF FF 01 00 00 00 00 00 00 00 02 00 00 00 01 00 06 00 00 00 04 00 00 00 00 00 00 00
FF FF FF FF F1 D8 FF FF 01 00 FE FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
и так далее, по количеству итемов в инвентаре. Здесь после цифр короткий комментарий для себя, что обозначают цифры.
скрипт выводит последнюю позицию инвентаря - 31, хотя позиций 34, останавливаясь на смещении 2300, размер пакета - 2523, никак не пойму, почему так.
Может какие гуру подскажут? Версия протокола - 488.