PDA

Просмотр полной версии : Работа с инвентарем в Грации


NLObP
19.06.2009, 01:18
У кого какие идеи как модифицировать функцию работы с пакетом 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]



Теперь так не прокатывает:

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:=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=ItemT ype2;7=CustomType1;
8=isEquipped;9=BodyPart;10=EnchantLevel;11=CustTyp e2;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;

[I]Добавлено через 1 минуту
11=ItemList:h(ShowWindow)h(ItemCount:Loop.01.0023) h(ItemTypeID)d(ObjectID)d(ItemID:Get.Func01)d(Loca tionSlot)q(Amount)h(ItemType2)h(CustomType1)h(isEq uipped)d(BodyPart)h(EnchantLevel)h(CustType2)h(Aug mentationData)h(AugmentationData)d(Mana)h(AttackEl ement)h(AttackElementPower)h(FireDefElementPower)h (WaterDefElementPower)h(WindDefElementPower)h(Eart hDefElementPower)h(HolyDefElementPower)h(UnholyDef ElementPower)d(RemainingTime)

21=InventoryUpdate:h(Count:Loop.1.0023)h(UpdateTyp e:01-add,02-modify,03-remove)h(ItemType1)d(ObjectID)d(ItemID:Get.Func01) d(LocationSlot)q(Quantity)h(ItemType2)h(CustomType 1)h(Equipped)d(BodyPart)h(EnchantLevel)h(CustType2 )d(AugmentationBonus)d(Mana)h(AttackElement)h(Atta ckElementPower)h(FireDefElementPower)h(WaterDefEle mentPower)h(WindDefElementPower)h(EarthDefElementP ower)h(HolyDefElementPower)h(UnholyDefElementPower )d(RemainingTime)

alexteam
19.06.2009, 01:20
дописать readq writeq. int64 хули..

NLObP
19.06.2009, 01:24
alexteam, а массив предметов какой делать?
BaseItems: array[1..maxitems, 1..12] of integer;

Добавлено через 1 минуту
дописать readq writeq. int64
ReadF сейчас есть, это не оно?

alexteam
19.06.2009, 12:34
эм... в фс нет int64... тяжкий случай...
прийдеться разбор, хранение и управление инвентарем реализовывать в плагине...
и управлять онным с скрипта.

Fer123
19.06.2009, 13:27
Может Double или variant. По крайней мере у меня с вариантом получилось. Присвоил и вывел максимальное число int64 9223372036854775807

NLObP
19.06.2009, 14:29
Fer123, для количества отдельный массив завести или весь массив делать double? Как лучше?

Добавлено через 2 минуты
прийдеться разбор, хранение и управление инвентарем реализовывать в плагине...
и управлять онным с скрипта.

Мне кажеться надо уже на плагины совсем переходить, без скриптов, всё время какие-то ограничения.

alexteam
19.06.2009, 14:43
Fer123, Double = 32bit. с ним врядли чтото получится если учесть что у нас 64битная переменная.


NLObP, в принципе так и должно быть.
плагин должен расширять скриптовый движек и управляться с скрипта
(под управлением я понимаю задания индефикаторов/офсетов для пакетов на которые реагирует плагин, его настройка, запуск и останов такового.)
в принципе ничего ОСОБОАРХИсложного в плагинах вообще нет.

Fer123
19.06.2009, 14:45
NLObP, лучше весь массив variant а не double
alexteam, а что на счет variant у меня ведь получилось присвоить max int64?

alexteam
19.06.2009, 14:48
Fer123, варианту все равно. вариант = любой тип. его вообще можно использовать везде %)

Fer123
19.06.2009, 14:50
Ну так получается нет проблем и не надо плугин писать...
+ если variant = любой тип, то можно будет без проблем вывести например в форму без всяких inttostr()...

Breadfan
19.06.2009, 16:02
Ну в свете того что очень редко требуется все 8 байт для значения - я использовал команду ReadD(j), просто для сдвига указателя - пока проблем не возникало, ну а еще можно считывать двa ReadD и вычислять из них в самом скрипте

v0ltag3
03.07.2009, 12:20
никаких идей? :(

alexteam
03.07.2009, 12:27
читаем посты выше ?

pppok
03.07.2009, 12:56
читаем посты выше ?

Ну я читал... до меня доперло только что в ini заменить пакеты нужно... оно получилось, теперь itemlist норм приходит, но заточка NLOBp всеравно неверно видит... не могу разобраться что сделать :)
//QaK:учи матчасть

v0ltag3
03.07.2009, 13:42
читаем посты выше ?

у меня получилось сделать, но потом не удачные изменения понесли за собой фатальные последствия... начну делать с нуля, когда будет свободное время. Просто спрашиваю, может кто-то сделал, пускай поделится :)

alexteam
03.07.2009, 14:32
При чем тут ини файл к 8байтной переменной ?

pppok
03.07.2009, 14:36
При чем тут ини файл к 8байтной переменной ?

при том что пакетхак криво принимал itemlist... там были надписи типо колво = -65534 итд... короче замнил в ини файле пакеты 11 и 21 и теперь распознается норм, но скрипт заточки по прежнему видит items криво...(дело не в itemsid.ini - его я полностью под срв переделал, 100% все верно ниче не накривил) :) а вот что в скрипте менять я вообще хз...

alexteam
04.07.2009, 12:31
а, ты про то как сам пх разбирает пакет ориентируясь на инишку...
а я с чего-то думал что тут обсуждение разбора онного пакета из под скриптов 0_о

Breadfan
04.07.2009, 16:06
Да это все лечится заданием нужных смещений в самом начале скрипта в зависимости от типа хроник, сам скрип минимально модифицируется и становится универсальным - тут есть масса тому примеров. Кроме того, когда нужно просто пропускать какие то ненужные байты (например когда переносим скрипт с Ц4 на какойнть жуткий Хеллбаунд) - просто сдвигай указатель командой Read_() (по ситуации уже смотри че там, ReadD или еще что).Если конечно делаешь все только под себя то можно конкретно вбивать нужные числа, а если нет - в блоке констант задаешь тип хроник и требуемые сдвиги для них...

Я обычно просто искал инфу в сети о структуре нужного пакета конкретной хроники в Инете, и подправлял как мне надо

Во поумнел как.....ща полезу в свои посты первые самые...почитаю....

Sn00pu
07.07.2009, 13:07
Где этот фаил itemsid.ini в клиенте или в pbx ???

NLObP
07.07.2009, 15:14
Где этот фаил itemsid.ini в клиенте или в pbx ???

В пакетхаке. В клиенте нет такого файла, там *.dat файлы.

Yegor
07.07.2009, 18:10
Не вижу проблемы, ну и что что переменная 8 байт, последние 4 байта всегда равны нулю скорее всего и их просто проппускаем а ориентируемся по первым 4ем.

Fer123
07.07.2009, 18:22
Просто в грации финал лимит на адену теперь 99ккк а в 4 байта влезет только 2^32 а так впринципе можно

Yegor
07.07.2009, 19:07
Fer123, делаесм 2 раза ReadD(...) и вычисляем
число = d1 * $ffffffff + d2; результат помещается в Int64

Fer123
07.07.2009, 22:22
да дело в том что функция то есть для этого ReadQ() но нет nt64 в fastscript. Разве что тип variant.