Это кусок где отправляется пакет запрос списка инвентаря, а сама процедура чтения инвентаря здесь - procedure ItemList, а его апдейт здесь - procedure InventoryUpdate;
procedure ItemList;
{Создаем базу Items}
//11=ItemList:h(ShowWindow)h(ListSize:Loop.01.0021)h(ItemType1)d(ObjectID)
// d(ItemID:Get.Func01)d(LocationSlot)d(Count)h(ItemType2)h(CustomType1)
// h(isEquipped)d(BodyPart)h(EnchantLevel)h(CustType2)d(AugmentationID)
// d(Mana)d(AttackAttrElement)d(AttackAttrElementVal)d(DefAttrFire)
// d(DefAttrWater)d(DefAttrWind)d(DefAttrEarth)d(DefAttrHoly)d(DefAttrUnholy)
var
i, j, k: integer;
ListCount: integer;
begin
и
Код:
procedure InventoryUpdate; //пакет 27, Создает базу 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
procedure ItemList;
{Создаем базу Items}
//11=ItemList:h(ShowWindow)h(ListSize:Loop.01.0021)h(ItemType1)d(ObjectID)
// d(ItemID:Get.Func01)d(LocationSlot)d(Count)h(ItemType2)h(CustomType1)
// h(isEquipped)d(BodyPart)h(EnchantLevel)h(CustType2)d(AugmentationID)
// d(Mana)d(AttackAttrElement)d(AttackAttrElementVal)d(DefAttrFire)
// d(DefAttrWater)d(DefAttrWind)d(DefAttrEarth)d(DefAttrHoly)d(DefAttrUnholy)
var
i, j, k: integer;
ListCount: integer;
begin
эти куски?
- вот это вот целиком, если можно - именно эта процедура создает твой список итемов в сумке, вторая отвечает только за апдейт. И уточни насколько полностью не видит итемлист - весь абсолютно или начиная со 2го итема в списке ошибочно выводит?
Добавлено через 10 минут
Я нашел вроде чегото у себя - но не факт что это именно от финала, выглядит довольно жутко:
rocedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemID
//1B=ItemListPacket:w(window)w(ListCount)w(itemType1)h(ObjectID)i(ItemID)d(count)w(itemType2)w(CustType1)w(isEquipped)d(BodyPart)w(EnchantLevel)w(CustType2)d(Augment)d(--)
var
i, j, ListCount: integer;
begin
for i:=1 to max do begin
//очищаем масив
ItemBase[1,i]:=0; //OID
ItemBase[2,i]:=0; //ID
ItemBase[3,i]:=0; //kol-vo
ItemBase[4,i]:=0; //lvl
end;
j:=4; //смещение для ListCount
ListCount:=ReadH(j); //количество итемов не должно превышать max!
//if ListCount>maxitems then msg.Lines.Add('Внимание! Не все вещи влезли в массив. ListCount>Max='+IntToStr(ListCount)+'/'+IntToStr(maxitems));
j:=8; //смещение для ObjectID
//Пробегаем по Инвентарю и сохраняем ObjectID соответствующие необходимым ItemID
for i:=1 to ListCount do begin
itemBase[1,i]:=ReadD(j); //OID
itemBase[2,i]:=ReadD(j); //ItemID
//-------Изменен формат пакета в камаеле
ReadD(j);
//---------------------------------
itemBase[3,i]:=ReadD(j); //кол-во
inc(j,10);
itemBase[4,i]:=ReadH(j);//EnchantLevel
msg.Lines.Add('i='+inttostr(i)+' ItemOID='+IntToStr(ItemBase[1,i])+' ItemID='+IntToStr(ItemBase[2,i])+' ItemKol='+IntToStr(ItemBase[3,i])+' ItemLVL='+IntToStr(ItemBase[4,i]));
if interlude then inc(j,44) else inc(j,8); // так же изменены смещения в связи с добавлением новых свойств итемов
msg.Lines.Add('j='+inttostr(j));
end;
//вносим изменения в чекбоксы
StringList.Clear;
try
for i:=1 to ListCount do begin
try
//StringList.Add(ItemsName[ItemBase[2,i]-1]); //записываем название вещей из инвентаря
StringList.Add(ItemsName.Values[IntToStr(ItemBase[2,i])]); //записываем название вещей из инвентаря
except;
msg.Lines.Add('Пропускаем! Нет ItemID='+inttostr(ItemBase[2,i])+' в itemsid.ini');
end
end;
except;
msg.Lines.Add('ошибка в CreateItemBase->StringList.Add()');
msg.Lines.Add(inttostr(ItemBase[2,i]));
exit;
end;
if not CheckBoxItem.Checked then begin //наполняем комбобокс
with ComboBoxItem do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
if not CheckBoxScroll.Checked then begin //наполняем комбобокс
with ComboBoxScroll do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
end;
PS: никогда не доверяйте комментариям в скрипте
__________________ На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."
А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
Последний раз редактировалось Breadfan, 19.01.2010 в 02:16.
Причина: Добавлено сообщение
procedure ItemList;
{Создаем базу Items}
//11=ItemList:h(ShowWindow)h(ListSize:Loop.01.0021)h(ItemType1)d(ObjectID)
// d(ItemID:Get.Func01)d(LocationSlot)d(Count)h(ItemType2)h(CustomType1)
// h(isEquipped)d(BodyPart)h(EnchantLevel)h(CustType2)d(AugmentationID)
// d(Mana)d(AttackAttrElement)d(AttackAttrElementVal)d(DefAttrFire)
// d(DefAttrWater)d(DefAttrWind)d(DefAttrEarth)d(DefAttrHoly)d(DefAttrUnholy)
var
i, j, k: integer;
ListCount: integer;
begin
j:=4; //смещение для ListCount
ListCount:=ReadH(j); //количество итемов не должно превышать max!
for i:=1 to maxitems do
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
//debugmsg('OID='+inttostr(BaseItems[i,2])+' ID='+inttostr(BaseItems[i,3]));
inc(j,40);
end else for k:=1 to 12 do BaseItems[i,k]:=0; // забиваем нулями
//вносим изменения в чекбоксы
StringList.Clear;
try
for i:=1 to ListCount do begin
try
//StringList.Add(ItemsName[ItemBase[2,i]-1]); //записываем название вещей из инвентаря
StringList.Add(ItemsName.Values[IntToStr(BaseItems[i,3])]); //записываем название вещей из инвентаря
except;
//msg.Lines.Add('Пропускаем! Нет ItemID='+inttostr(BaseItems[i,3])+' в itemsid.ini');
end
end;
except;
//msg.Lines.Add('ошибка в CreateItemBase->StringList.Add()');
//msg.Lines.Add(inttostr(BaseItems[i,3]));
exit;
end;
if not CheckBoxItem.Checked then begin //наполняем комбобокс
with ComboBoxItem do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
if not CheckBoxScroll.Checked then begin //наполняем комбобокс
with ComboBoxScroll do
begin
Items.Clear;
Items.Assign(StringList);
ItemIndex:=0;
end;
end;
end;
Теперь понято, вот кусок из моего скрипта. Предложенный Вами кусок не работает, выделяет красным строку "for i:=1 to max do begin". Теперь дляменя остается загадкой как подогнать эту часть к моему покету "ItemLiist" (см.выше). На сечет инвенторя: при запуске там нет ни чего, но после заточки ручками пишет (Автоматизация заточки by NLObP для Грации!
Улучшили ItemID=0 ItemOID=0 ItemEnchLvl=0) и после появляется в строке выбора следующее: Забытый клинок 2 шт (на самом деле 20шт), Ивовый посох (незнаю что это и в сумке это нет), потом идут 4 пустые строки, опять непонятный итем и т.д. посщитал все строки(пустые и непонятные), по количеству совпадает с количеством итемов в инвентаре.
И еще вопрос://установить константу в зависимости от типа игры (С4 или Интерлюд)
interlude=true; //Interlude - true, C4 - false. Что писать? Уменя ведь Грация Финал.
Предложенный Вами кусок не работает, выделяет красным строку "for i:=1 to max do begin".
- ну это и не удивительно - это как раз яркий пример внутривидовой борьбы версий скриптов, за место в ареале обитания...там переменные разноименные используются просто...ты пакет ItemPacket выложил бы уж свой...только не с ".... кучей итемов", достаточно несколько штук в сумке оставить и все.
Цитата:
Сообщение от IceFloe
Что писать? Уменя ведь Грация Финал.
- соответственно - ничего, это просто след старых версий.
Цитата:
Сообщение от IceFloe
На сечет инвенторя: при запуске там нет ни чего
- при запуске скрипта - у перса инвентарь открывается ?
ЗЫ: Флуд разводим только изза того, что 80% пишушим (лень\некогда\...) изначально выложить свой итемлист блин
__________________ На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."
А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
Последний раз редактировалось Breadfan, 19.01.2010 в 12:14.
IceFloe, попробуй отсортировать итем лист в порядке возрастания ItemID. Когда писал скрипт у меня было сортировано по ID. Может в этом косяк?
PS: скрипт не предназначен для блессед точек.
Как отсортировывать?
Свитки обычные.
ItemList
Код:
0x11 (ItemList)
Размер: 2117+2
Время прихода: 12:15:14:281
0002 h ShowWindow: 1 (0x0001)
0004 h ItemCount: 33 (0x0021)
[Начало повторяющегося блока 1/33]
0006 h ItemTypeID: 4 (0x0004)
0008 d ObjectID: 268577286 (0x10022A06)
000C d ItemID: Адена ID:57 (0x0039) (0x00000039)
0010 d LocationSlot: 0 (0x00000000)
0014 q Amount: 36860000000
001C h ItemType2: 4 (0x0004)
001E h CustomType1: 0 (0x0000)
0020 h isEquipped: 0 (0x0000)
0022 d BodyPart: 0 (0x00000000)
0026 h EnchantLevel: 0 (0x0000)
0028 h CustType2: 0 (0x0000)
002A d AugmentID: 0 (0x00000000)
002E d Mana: -1 (0xFFFFFFFF)
0032 h AttackElement: 65534 (0xFFFE)
0034 h AttackElementPower: 0 (0x0000)
0036 h FireDefElementPower: 0 (0x0000)
0038 h WaterDefElementPower: 0 (0x0000)
003A h WindDefElementPower: 0 (0x0000)
003C h EarthDefElementPower: 0 (0x0000)
003E h HolyDefElementPower: 0 (0x0000)
0040 h UnholyDefElementPower: 0 (0x0000)
0042 d RemainingTime: -1 (0xFFFFFFFF)
0046
[Конец повторяющегося блока 1/33]
[Начало повторяющегося блока 2/33]
0046 h ItemTypeID: 4 (0x0004)
0048 d ObjectID: 268495620 (0x1000EB04)
004C d ItemID: Свиток: Зачаровать оружие (S) ID:959 (0x03BF) (0x000003BF)
0050 d LocationSlot: 1 (0x00000001)
0054 q Amount: 1008
005C h ItemType2: 5 (0x0005)
005E h CustomType1: 0 (0x0000)
0060 h isEquipped: 0 (0x0000)
0062 d BodyPart: 0 (0x00000000)
0066 h EnchantLevel: 0 (0x0000)
0068 h CustType2: 0 (0x0000)
006A d AugmentID: 0 (0x00000000)
006E d Mana: -1 (0xFFFFFFFF)
0072 h AttackElement: 65534 (0xFFFE)
0074 h AttackElementPower: 0 (0x0000)
0076 h FireDefElementPower: 0 (0x0000)
0078 h WaterDefElementPower: 0 (0x0000)
007A h WindDefElementPower: 0 (0x0000)
007C h EarthDefElementPower: 0 (0x0000)
007E h HolyDefElementPower: 0 (0x0000)
0080 h UnholyDefElementPower: 0 (0x0000)
0082 d RemainingTime: -1 (0xFFFFFFFF)
[Конец повторяющегося блока 2/33]
[Начало повторяющегося блока 3/33]
0086 h ItemTypeID: 0 (0x0000)
0088 d ObjectID: 268578422 (0x10022E76)
008C d ItemID: Забытый Клинок ID:6583 (0x19B7) (0x000019B7)
0090 d LocationSlot: 2 (0x00000002)
0094 q Amount: 1
009C h ItemType2: 0 (0x0000)
009E h CustomType1: 0 (0x0000)
00A0 h isEquipped: 0 (0x0000)
00A2 d BodyPart: 128 (0x00000080)
00A6 h EnchantLevel: 2 (0x0002)
00A8 h CustType2: 0 (0x0000)
00AA d AugmentID: 0 (0x00000000)
00AE d Mana: -1 (0xFFFFFFFF)
00B2 h AttackElement: 65534 (0xFFFE)
00B4 h AttackElementPower: 0 (0x0000)
00B6 h FireDefElementPower: 0 (0x0000)
00B8 h WaterDefElementPower: 0 (0x0000)
00BA h WindDefElementPower: 0 (0x0000)
00BC h EarthDefElementPower: 0 (0x0000)
00BE h HolyDefElementPower: 0 (0x0000)
00C0 h UnholyDefElementPower: 0 (0x0000)
00C2 d RemainingTime: -1 (0xFFFFFFFF)
[Конец повторяющегося блока 3/33]
[Начало повторяющегося блока 4/33]
00C6 h ItemTypeID: 0 (0x0000)
00C8 d ObjectID: 268578354 (0x10022E32)
00CC d ItemID: Забытый Клинок ID:6583 (0x19B7) (0x000019B7)
00D0 d LocationSlot: 3 (0x00000003)
00D4 q Amount: 1
00DC h ItemType2: 0 (0x0000)
00DE h CustomType1: 0 (0x0000)
00E0 h isEquipped: 0 (0x0000)
00E2 d BodyPart: 128 (0x00000080)
00E6 h EnchantLevel: 3 (0x0003)
00E8 h CustType2: 0 (0x0000)
00EA d AugmentID: 0 (0x00000000)
00EE d Mana: -1 (0xFFFFFFFF)
00F2 h AttackElement: 65534 (0xFFFE)
00F4 h AttackElementPower: 0 (0x0000)
00F6 h FireDefElementPower: 0 (0x0000)
00F8 h WaterDefElementPower: 0 (0x0000)
00FA h WindDefElementPower: 0 (0x0000)
00FC h EarthDefElementPower: 0 (0x0000)
00FE h HolyDefElementPower: 0 (0x0000)
0100 h UnholyDefElementPower: 0 (0x0000)
0102 d RemainingTime: -1 (0xFFFFFFFF)
0106
[Конец повторяющегося блока 4/33]
адена, свитки и 2 меча
Цитата:
- при запуске скрипта - у перса инвентарь открывается ?
Если не ошибаюсь команда SORT есть, которая сортирует тестовые файлы.
Код:
SORT [/R] [/+n] [/M килобайтов] [/L язык] [/REC символов]
[[диск1:][путь1]имя_файла1] [/T [диск2:][путь2]]
[/O [диск3:][путь3]имя_файла3]
/+n Задает число символов, n, до начала каждого
сравнения. /+3 показывает, что каждое
сравнение будет начинаться с третьего символа
каждой строки. Строки меньше чем n символов
собираются перед всеми остальными строками.
По умолчанию, сравнение начинается с первого
символа каждой строки.
/L[OCALE] язык Перекрывает установленные в системе по умолчанию
язык и раскладку заданными. Пока существует
возможность только одного выбора: ""C"" -
наиболее быстрый способ упорядочивания
последовательности.
Сортировка всегда идет без учета регистра.
/M[EMORY] килобайтов Задает количество основной памяти, используемой
для сортировки, в килобайтах. Размер памяти
должен быть не менее 160КБ. При явном задании
размера памяти именно это количество будет,
использовано невзирая на то, какое количество
основной памяти доступно в системе.
Наилучшей производительности можно добиться, не
задавая размер памяти. По умолчанию, сортировка
выполняется за один проход (без временного
файла), используя максимально доступный размер
памяти. В остальных случаях, сортировка
выполняется за два прохода (с сохранением
частично отсортированных данных во временном
файле), так что количество памяти, используемой
для обоих проходов, - одинаково. По умолчанию,
максимальный объем памяти равен 90% доступной
основной памяти, если входными и выходными
потоками являются файлы на диске, и 45% доступной
основной памяти - иначе.
/REC[ORD_MAXIMUM] символов Определяет максимальное число символов в записи
(по умолчанию 4096, максимальное 65535).
/R[EVERSE] Обратный порядок сортировки; т.е. сортировка
идет от Я до А, и затем от 9 до 0.
[диск1:][путь1]имя_файла1 Определяет имя сортируемого файла. Если оно
опущено, то будет использоваться стандартный
поток ввода. Явное задание сортируемого файла
работает быстрее, чем перенаправление того же
файла в качестве стандартного потока ввода.
/T[EMPORARY]
[диск2:][путь2] Определяет путь к папке, содержащей рабочие
файлы сортировки, в том случае, когда данные
не помещаются в основной памяти. По умолчанию
используется системная временная папка.
/O[UTPUT]
[диск3:][путь3]имя_файла3 Определяет имя файла, в котором сохраняются
отсортированные результаты. Если оно опущено
данные записываются в стандартный поток вывода.
Явное задание файла вывода работает быстрее чем
перенаправление стандартного потока вывода
в этот же файл.
Ошибка скорее всего происходит изза разной размерности типов данных...в скрипте, для определения количества итемов, используется простое DWord - 4 байта (BaseItems[i,5]:=ReadD(j); //Count ), а в том листке что ты выложил (кстати, это совсем не то что я просил) - показано что используется тип данных размерностью в 8 байт...как вариант - можешь просто вставить пустые сдвиги: ---------
ReadD(j); -----> сдвиг указателя на 4 байта
BaseItems[i,5]:=ReadD(j); //Count
--------- только это надо и в CreateBase и в Update делать...
__________________ На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."
А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
Последний раз редактировалось Breadfan, 20.01.2010 в 11:52.