PDA

Просмотр полной версии : Определение ObjectID


ERASE
27.01.2009, 19:12
Если есть у кого кусок кода, прошу скинуть... Желательно, если он будет простенький и небольшой, т.к. пытался разобраться в куске кода из скрипта на заточку - не особо получилось... (Ну, хотя, было 4 часа ночи где-то... :) ).

Суть вопроса: в инвентаре есть вещь, например, адена, OID которой нужно определить при включении скрипта, допустим. ID адены известен.

За кусочек кода буду благодарен. :)

QaK
27.01.2009, 19:49
//Считываем параметры одной вещи
procedure SetItem(var PckPos:integer;ItemIndex:byte);
begin Inventory[ItemIndex].ItemType1:=ps.ReadHEx(ppck^,PckPos); //1
inc(PckPos,2);
Inventory[ItemIndex].ObjectID:=ps.ReadDEx(ppck^,PckPos); //2
inc(PckPos,4);
Inventory[ItemIndex].ItemID:=ps.ReadDEx(ppck^,PckPos); //3
inc(PckPos,8);
Inventory[ItemIndex].ItemCount:=ps.ReadDEx(ppck^,PckPos); //4
inc(PckPos,4);
Inventory[ItemIndex].ItemType2:=ps.ReadHEx(ppck^,PckPos); //5
inc(PckPos,2);
Inventory[ItemIndex].CustType1:=ps.ReadHEx(ppck^,PckPos); //6
inc(PckPos,2);
Inventory[ItemIndex].IsEquipped:=ps.ReadHEx(ppck^,PckPos); //7
inc(PckPos,2);
Inventory[ItemIndex].BodyPart:=ps.ReadDEx(ppck^,PckPos); //8
inc(PckPos,4);
Inventory[ItemIndex].EnchantLevel:=ps.ReadHEx(ppck^,PckPos); //9
inc(PckPos,2);
Inventory[ItemIndex].CustType2:=ps.ReadHEx(ppck^,PckPos); //10
inc(PckPos,2);
Inventory[ItemIndex].AugID:=ps.ReadDEx(ppck^,PckPos); //11
inc(PckPos,4);
Inventory[ItemIndex].ShadowTime:=ps.ReadDEx(ppck^,PckPos); //12
inc(PckPos,40);
end;

//Для пакета Inventory Init
procedure ExtractInvInfo;
var c1,c2:integer;
begin SetLength(Inventory,ps.ReadHEx(ppck^,5)); //количество вещей в инвентаре
if Length(Inventory)<>0 then
c2:=7;
for c1:=0 to Length(Inventory)-1 do //пробегаем по всем предметам
begin SetItem(c2,c1); //считываем параметры одного предмета
end;

end;

это для пакета InventoryInit.

ERASE
27.01.2009, 20:17
Ёпть... А можно, пожалуйста, комментов побольше?:)

Grinch
27.01.2009, 20:19
хех шутку оценил для грации ) из длл на делфе :)

ERASE
27.01.2009, 20:21
Нужный мне кусок с ОИД:
procedure SetItem(var PckPos:integer;ItemIndex:byte);
begin
Inventory[ItemIndex].ObjectID:=ps.ReadDEx(ppck^,PckPos); //OID
inc(PckPos,4);
end;

Или писать полностью всю процедуру?

Эту процедуру запускаем при получении пакета InventoryInit, правильно?:

procedure ExtractInvInfo;
var c1,c2:integer;
begin SetLength(Inventory,ps.ReadHEx(ppck^,5)); //Определяем кол-во вещей?
if Length(Inventory)<>0 then
c2:=7;
for c1:=0 to Length(Inventory)-1 do //пробегаем по всем предметам
begin SetItem(c2,c1); //считываем параметры одного предмета
end;
end;

В итоге, он ОИД пишет в Inventory[номер айтима].ObjectID ?

Grinch
27.01.2009, 20:31
ERASE, ты определись сначала ты скрипт пишешь или длл? сразу объясняю в чем разница в скриптах пакет хак передает строки байт а в длл массивы т.е. в скрипте 1-й байт типа пакета, а в длл 2-й байт тип пакета и 2 байта перед ним размер этого пакета так что procedure ExtractInvInfo; надо перешать смещение, и в скрипте масив объявить да и в длл не забудь. и определись с хрониками :) это кусочег особенно procedure SetItem(var PckPos:integer;ItemIndex:byte); для ОФФ сервера Грации пат1.

ERASE
27.01.2009, 20:37
Я пишу скрипт и просил для скрипта:) До дллок мне далеко:)
Интерлюд у меня...:)

QaK
27.01.2009, 21:04
Грих, выдери кусок из того скрипта, а то я его опять похерил.

Grinch
27.01.2009, 21:10
Ген того скрипта это что ? я его кажись то ж похерил :) точней пропал в неизвестном направление скриптик.

ERASE
27.01.2009, 21:11
Че за скрипт?:) И можно ли все-таки для меня его как-то выдрать?))

QaK
27.01.2009, 21:55
ERASE, попробую поискать, скрипт изначально задумывался как бот =) только заброшен был давно ...

NLObP
27.01.2009, 22:03
пытался разобраться в куске кода из скрипта на заточку

Ещё раз посмотри в нём внимательно процедуры:

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
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;
//.................................................. ............................
procedure InventoryUpdate;
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); //количество итемов
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,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;
//.................................................. ............................

ERASE
27.01.2009, 22:08
:) Кстати, что-то с оид есть в скриптах на заточку...

Добавлено через 2 минуты
Я не из этого скрипта смотрел, но ща попробую разобраться...

Добавлено через 1 минуту
Эмммм... Это для определения всех параметров всех вещей... А мне нужно только ОИД адены в инвентаре... Сейчас попробую открутить все, кроме оид...

NLObP
27.01.2009, 22:13
А мне нужно только ОИД адены в инвентаре...

Возьми готовое и не мучай нас. Три подпрограммы, которые могут найти всё, что угодно в инвентаре. Кстати их уже выкладывали в теме с готовыми функциями.

ERASE
27.01.2009, 22:23
Ну мне просто интересно...:) В любом случае, спасибо всем:)