У кого какие идеи как модифицировать функцию работы с пакетом 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] ofinteger; //все предметы в инвентареprocedure ItemList;
{Создаем базу Items}var
i, j, k: integer;
ListCount: integer;
begin
j:=4; //смещение для ListCount
ListCount:=ReadH(j); //количество итемов не должно превышать max!for i:=1to maxitems dobeginif(i<=ListCount)thenbegin
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); //AugmentationIDinc(j,40);
endelsefor k:=1to12do BaseItems[i,k]:=0; // забиваем нулямиend;
end;
//..............................................................................procedure InventoryUpdate; //пакет 21, Создает базу ObjectID по ItemIDvar
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:=1to ListCount dobegin
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 of1: k:=0; //добавлен новый предмет2: k:=ObjectID; //изменен предмет в инвентаре3: begin//удаленfor ii:=1to maxitems doif(BaseItems[ii,2]=ObjectID)thenbeginfor k:=1to12do BaseItems[ii,k]:=0;
break;
end;
end;
end;
for ii:=1to maxitems dobeginif(BaseItems[ii,2]=k)thenbegin
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;
beginfor i:=1to maxitems doif(BaseItems[i,FieldIn]=ID)thenbegin
Result:=BaseItems[i,FieldOut];
exit;
end;
Result:=-1;
end;
Fer123, Double = 32bit. с ним врядли чтото получится если учесть что у нас 64битная переменная.
NLObP, в принципе так и должно быть.
плагин должен расширять скриптовый движек и управляться с скрипта
(под управлением я понимаю задания индефикаторов/офсетов для пакетов на которые реагирует плагин, его настройка, запуск и останов такового.)
в принципе ничего ОСОБОАРХИсложного в плагинах вообще нет.
Ну так получается нет проблем и не надо плугин писать...
+ если variant = любой тип, то можно будет без проблем вывести например в форму без всяких inttostr()...
Последний раз редактировалось Fer123, 19.06.2009 в 14:57.