PDA

Просмотр полной версии : снова инвентарь


oldog
08.07.2014, 12:18
Новичок в данной теме, помогите разобраться, никак не пойму что происходит, написал простенький скрипт, больше из любопытства:


var
iItemCount,iObjId,iItemId,iSlot,iCount,i,sme:integ er; //сколько вещей в инвентаре

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.

oldog
14.07.2014, 08:45
Нашел косяк, скрипт "затыкается" на чтении количества итемов (ReadQ(смещение_на_кол-во_итемов)), у меня в инвентаре лежало 4ккк аден, как только убираешь, то все работает нормально.
В связи с этим вопрос: что делать в этом случае?

kpa9pt
14.07.2014, 12:37
Нашел косяк, скрипт "затыкается" на чтении количества итемов (ReadQ(смещение_на_кол-во_итемов)), у меня в инвентаре лежало 4ккк аден, как только убираешь, то все работает нормально.
В связи с этим вопрос: что делать в этом случае?

Слушай, как то уж у тебя больно замудрёно выглядит простая вещь как создание базы инвентаря:o
Прости слишком глаз тупит, могу в помощь проверенную парой лет процедуру скинуть, не подводит:)


procedure Itemlist;
var
i,count:integer;
checkIndex:integer;

begin
count:=readh(4);
for i:=1 to (count+1) do
begin
itemBase[1,i]:=ReadD((i-1)*68+6); //OID
itemBase[2,i]:=ReadD((i-1)*68+6+4); //ItemID
itemBase[3,i]:=Readq((i-1)*68+6+4+4+4); //ItemCount
itemBase[4,i]:=ReadH((i-1)*68+6+4+4+4+4+4+2+2); //isEquipped
end;
end;


И не знаю, как другим, но мне она кажется в миллион раз понятней чем твоя:confused:

oldog
14.07.2014, 12:53
Слушай, как то уж у тебя больно замудрёно выглядит простая вещь как создание базы инвентаря:o
Прости слишком глаз тупит, могу в помощь проверенную парой лет процедуру скинуть, не подводит:)


И не знаю, как другим, но мне она кажется в миллион раз понятней чем твоя:confused:

в том то и дело, что у меня количество полей отличается от стандартных хроник, поэтому твоя процедура работать не будет. ничего мудреного вроде нету, все тоже самое, что и ты отправил, только свойств побольше, ну и кроме того у меня количество предметов в ячейке измеряется QWORD, макс можно 999999999999 свитков например положить в ячейку. но функция ReadQ получается неправильно работает с таким числом. потом если интересно будет могу выложить полный скрипт.

SeregaZ
15.07.2014, 12:10
99999999999 ты не запишешь в 4 этих как его там... в четыре символа? в 4 байта? и в связи с чем ReadQ по идее должно читать только 4 байта - Q - Quad по идее.