У кого какие идеи как модифицировать функцию работы с пакетом ItemList и ItemListUpdate
В свете того, что количество предметов стало 8 байт?
Взято из исходников L2Jserver:
Код:
Тип: 0x11 (ItemList)
Размер: 3205+2
Время прихода: 12:25:14:515
0002 h ShowWindow: 0 (0x0000)
0004 h ItemCount: 50 (0x0032)
[Начало повторяющегося блока 1/50]
0006 h ItemTypeID: 4 (0x0004)
0008 d ObjectID: 271856921 (0x10343519)
0012 d ItemID: Руда Духов ID:3031 (0x0BD7) (0x00000BD7)
0016 d LocationSlot: 0 (0x00000000)
0020 q Amount: 565
0028 h ItemType2: 5 (0x0005)
0030 h CustomType1: 0 (0x0000)
0032 h isEquipped: 0 (0x0000)
0034 d BodyPart: 0 (0x00000000)
0038 h EnchantLevel: 0 (0x0000)
0040 h CustType2: 0 (0x0000)
0042 h AugmentationData: 0 (0x0000)
0044 h AugmentationData: 0 (0x0000)
0046 d Mana: -1 (0xFFFFFFFF)
0050 h AttackElement: 65534 (0xFFFE)
0052 h AttackElementPower: 0 (0x0000)
0054 h FireDefElementPower: 0 (0x0000)
0056 h WaterDefElementPower: 0 (0x0000)
0058 h WindDefElementPower: 0 (0x0000)
0060 h EarthDefElementPower: 0 (0x0000)
0062 h HolyDefElementPower: 0 (0x0000)
0064 h UnholyDefElementPower: 0 (0x0000)
0066 d RemainingTime: -1 (0xFFFFFFFF)
[Конец повторяющегося блока 1/50]
[Начало повторяющегося блока 2/50]
0070 h ItemTypeID: 4 (0x0004)
0072 d ObjectID: 269019733 (0x1008EA55)
0076 d ItemID: Зелье Возмездия ID:4680 (0x1248) (0x00001248)
0080 d LocationSlot: 1 (0x00000001)
0084 q Amount: 5
0092 h ItemType2: 5 (0x0005)
0094 h CustomType1: 0 (0x0000)
0096 h isEquipped: 0 (0x0000)
0098 d BodyPart: 0 (0x00000000)
0102 h EnchantLevel: 0 (0x0000)
0104 h CustType2: 0 (0x0000)
0106 h AugmentationData: 0 (0x0000)
0108 h AugmentationData: 0 (0x0000)
0110 d Mana: -1 (0xFFFFFFFF)
0114 h AttackElement: 65534 (0xFFFE)
0116 h AttackElementPower: 0 (0x0000)
0118 h FireDefElementPower: 0 (0x0000)
0120 h WaterDefElementPower: 0 (0x0000)
0122 h WindDefElementPower: 0 (0x0000)
0124 h EarthDefElementPower: 0 (0x0000)
0126 h HolyDefElementPower: 0 (0x0000)
0128 h UnholyDefElementPower: 0 (0x0000)
0130 d RemainingTime: -1 (0xFFFFFFFF)
[Конец повторяющегося блока 2/50]
Теперь так не прокатывает:
delphi Код:
var
BaseItems: array[1..maxitems, 1..12] of integer; //все предметы в инвентаре
procedure ItemList;
{Создаем базу Items}
var
i, j, k: integer;
ListCount: integer;
begin
j:=4; //смещение для ListCount
ListCount:=ReadH(j); //количество итемов не должно превышать max!
for i:=1 to maxitems do
begin
if (i<=ListCount) then
begin
BaseItems[i,1]:=ReadH(j); //ItemType1
BaseItems[i,2]:=ReadD(j); //ObjectID
BaseItems[i,3]:=ReadD(j); //ItemID
BaseItems[i,4]:=ReadD(j); //LocationSlot
BaseItems[i,5]:=ReadD(j); //Count
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
BaseItems[i,11]:=ReadH(j); //CustType2
BaseItems[i,12]:=ReadD(j); //AugmentationID
inc(j,40);
end else
for k:=1 to 12 do BaseItems[i,k]:=0; // забиваем нулями
end;
end;
//..............................................................................
procedure InventoryUpdate; //пакет 21, Создает базу ObjectID по ItemID
var
i, ii, j, k, ListCount, UpdType : integer;
ItemType1, ObjectID, ItemID, LocationSlot, Count, ItemType2, CustomType1,
isEquipped, BodyPart, EnchantLevel, CustType2, AugmentationID :integer;
additem : boolean;
begin
additem:=true;
ListCount:=ReadH(2); //количество итемов
//debugmsg('ListCount='+inttostr(ListCount));
j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
for i:=1 to ListCount do
begin
UpdType:=ReadH(j);
ItemType1:=ReadH(j);
ObjectID:=ReadD(j);
ItemID:=ReadD(j);
LocationSlot:=ReadD(j);
Count:=ReadD(j);
ItemType2:=ReadH(j);
CustomType1:=ReadH(j);
isEquipped:=ReadH(j);
BodyPart:=ReadD(j);
EnchantLevel:=ReadH(j);
CustType2:=ReadH(j);
AugmentationID:=ReadD(j);
case UpdType of
1: k:=0; //добавлен новый предмет
2: k:=ObjectID; //изменен предмет в инвентаре
3: begin //удален
for ii:=1 to maxitems do
if (BaseItems[ii,2]=ObjectID) then
begin
for k:=1 to 12 do BaseItems[ii,k]:=0;
break;
end;
end;
end;
for ii:=1 to maxitems do
begin
if (BaseItems[ii,2]=k) then
begin
BaseItems[ii,1]:=ItemType1;
//BaseItems[ii,2]:=ObjectID;
BaseItems[ii,3]:=ItemID;
BaseItems[ii,4]:=LocationSlot;
BaseItems[ii,5]:=Count;
BaseItems[ii,6]:=ItemType2;
BaseItems[ii,7]:=CustomType1;
BaseItems[ii,8]:=isEquipped;
BaseItems[ii,9]:=BodyPart;
BaseItems[ii,10]:=EnchantLevel;
BaseItems[ii,11]:=CustType2;
BaseItems[ii,12]:=AugmentationID;
break;
end;
end;
inc(j,38);
end;
end;
function GetItem(ID, FieldIn, FieldOut : integer): integer;
{GetInv(по чему будем искать, номер того по чему будем искать, номер того что надо найти)
где:
ID - искомый код;
FieldIn - по какому полю ищем;
FieldOut - какое поле возвращаем;
1=ItemType1; 2=ObjectID;3=ItemID;4=LocationSlot;5=Count;6=ItemType2;7=CustomType1;
8=isEquipped;9=BodyPart;10=EnchantLevel;11=CustType2;12=AugmentationID;
ex1: GetInv(6408,2,1) - вернет ObjectID свадебного платья, если онное лежит в
инвентаре, иначе вернет -1
ex2: GetInv(6408,2,8) - вернет уровень заточки первого попавшегося в инвентаре
свадебного платья, если свадебного платья нет, то вернет -1
}
var
i: integer;
begin
for i:=1 to maxitems do
if (BaseItems[i,FieldIn]=ID) then begin
Result:=BaseItems[i,FieldOut];
exit;
end;
Result:=-1;
end;
Добавлено через 1 минуту
Код:
11=ItemList:h(ShowWindow)h(ItemCount:Loop.01.0023)h(ItemTypeID)d(ObjectID)d(ItemID:Get.Func01)d(LocationSlot)q(Amount)h(ItemType2)h(CustomType1)h(isEquipped)d(BodyPart)h(EnchantLevel)h(CustType2)h(AugmentationData)h(AugmentationData)d(Mana)h(AttackElement)h(AttackElementPower)h(FireDefElementPower)h(WaterDefElementPower)h(WindDefElementPower)h(EarthDefElementPower)h(HolyDefElementPower)h(UnholyDefElementPower)d(RemainingTime)
Код:
21=InventoryUpdate:h(Count:Loop.1.0023)h(UpdateType:01-add,02-modify,03-remove)h(ItemType1)d(ObjectID)d(ItemID:Get.Func01)d(LocationSlot)q(Quantity)h(ItemType2)h(CustomType1)h(Equipped)d(BodyPart)h(EnchantLevel)h(CustType2)d(AugmentationBonus)d(Mana)h(AttackElement)h(AttackElementPower)h(FireDefElementPower)h(WaterDefElementPower)h(WindDefElementPower)h(EarthDefElementPower)h(HolyDefElementPower)h(UnholyDefElementPower)d(RemainingTime)