PDA

Просмотр полной версии : Продажа через пакет


HinoRyuu
23.08.2010, 18:31
На сервере gracia final (l2j сборка) хочу сделать покупку и продажи вещи через пакет.Пакет на покупку ловится,посылается и данная вещь покупается.
B0 1E 27 00 00 40 16 40 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00
его расшифровка:
Tип: 0xB0 (MultiSellChoose)
Pазмер: 43+2
Время прихода: 17:25:35:954
0002 d ListID: 10014 (0x0000271E)
0006 d EntryID: 4200000 (0x00401640)
000A q Amount: 1
0012 h Unknown: 0 (0x0000)
0014 d Unknown: 0 (0x00000000)
0018 d Unknown: 0 (0x00000000)
001C h DefAttrFire: 65534 (0xFFFE)
001E h DefAttrWater: 0 (0x0000)
0020 h DefAttrWind: 0 (0x0000)
0022 h DefAttrEarth: 0 (0x0000)
0024 h DefAttrHoly: 0 (0x0000)
0026 h DefAttrDark: 0 (0x0000)
0028 h Enchantment: 0 (0x0000)
002A h EntryID: 0 (0x0000)

так же ловится пакет продажи этой же вещи
37 00 00 00 00 01 00 00 00 03 1B 01 10 D0 19 00 00 01 00 00 00 00 00 00 00
расшифровка:
Tип: 0x37 (RequestSellItem)
Pазмер: 25+2
Время прихода: 17:28:48:572
0002 d ListID: 0 (0x00000000)
0006 d ListSize: 1 (0x00000001)
[Начало повторяющегося блока 1/1]
000A d ObjectID: 268507907 (0x10011B03)
000E d ItemID: Посох Тайн ID:6608 (0x19D0) (0x000019D0)
0012 q Count: 1
[Конец повторяющегося блока 1/1]

но при посылке открывается инвентарь и вещь продаваться не хочет...
Реально ли сделать продажу...и если да...в чем моя ошибка?

alexteam
23.08.2010, 18:35
в
000A d ObjectID: 268507907 (0x10011B03)

HinoRyuu
23.08.2010, 18:45
alexteam, извините...но я не совсем понял...если вам не трудно можете объяснить?заранее спасибо...

J-Fobos
23.08.2010, 18:45
http://coderx.ru/showthread.php?t=5345

HinoRyuu
23.08.2010, 19:06
J-Fobos, если я правильно понял...там описан скрипт покупки..а мне нужно как то реализовать через пакет продажу...так как при отправки пакета на продажу ничего не происходит и только инвентарь открывается....

Добавлено через 10 минут
alexteam, и как это можно исправить?...

J-Fobos
23.08.2010, 20:14
J-Fobos, если я правильно понял...там описан скрипт покупки..а мне нужно как то реализовать через пакет продажу...так как при отправки пакета на продажу ничего не происходит и только инвентарь открывается....

Угу, там покупка, у вас продажа, там проблема с ObjectID и здесь проблема с ObjectID

HinoRyuu
23.08.2010, 21:12
J-Fobos, хм...спасибо буду думать..взял тот скрипт...теперь буду думать как разобраться..спасибо...

Добавлено через 18 минут
я так понимаю тут надо модифицировать пакет RequestSellItem...хм..
тоесть эту строку надо полностью менять
If (ConnectName=Nick) and FromServer and (pck[1] = #$11) then begin
ListID:=ReadD(6);
SendMsg2('Поймали пакет #$11');
buf:=#$1F; WriteD(ListID); WriteD(1); WriteD(6599); WriteD(1);
SendMsg2('Модифицировали пакет RequestBuyItem, ListID= ' + IntToStr(ListID));
SendToServerEx(Nick);


ListID:=ReadD(6);
SendMsg2('Поймали пакет #$11');
buf:=#$1F; WriteD(ListID); WriteD(1); WriteD(6599); WriteD(1);
сможете мне это объяснить если не сложно?
я так понимаю WriteD(6599) это ид вещи? WriteD(1) а это количество?

J-Fobos
23.08.2010, 21:50
Я так понял вы той темы до конца не просмотрели :)
Чтоб много не писать и не повторять сказанного в прошлой теме отвечу так:

При покупке в магазине сервер отсылает пакет с списком вещей доступных для покупки. В этом пакете есть такой параметр как ListID. В пакете, которым вы будете покупать предмет (из представленного списке) передается полученный ранее ListID.

При попытке продать предмет учитывается что список доступных для продажи предметов уже у вас имеется (это содержимое сумки), после выбора предмета из этого списка на сервер отправляется пакет с ObjectID предмета и его количеством.

ListID и ObjectID почти всегда разные. Чтобы узнать ListID надо просто считывать его с пакета списка продажи. Чтобы узнать ObjectID надо считывать его либо с пакета в котором передается список купленных вещей, либо в пакета содержимого инвентаря. Лично я предпочитаю использовать список содержимого инвентаря, но оттуда вытащить нужный ObjectID чуть сложнее.

HinoRyuu
23.08.2010, 22:50
спасибо.
вот у меня что-то типа такого получилось
const
Nick='HinoRyuu';
var
ListID:integer;
Timer01: TTimer;
TimerCyrcle:integer;

procedure SendMsg2(msg:string);
begin
buf:=#$4A; WriteD(0); WriteD(10); WriteS(''); WriteS(msg);
SendToClientEx(Nick);
end;


procedure Init;
begin
Timer01:=TTimer.Create(nil);
Timer01.OnTimer:=@OnTimer01;
Timer01.enabled:=true;
Timer01.interval:=1000;
TimerCyrcle:=1;
end;

procedure OnTimer01(Sender: TObject);
begin
case TimerCyrcle of
1:begin
buf:=hstr('B0 1E 27 00 00 40 16 40 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FE FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00');
SendToServerEx(Nick);
SendMsg2('Отправился пакет 1');
Inc(TimerCyrcle);
end;
2:begin
buf:=hstr('37 00 00 00 00 01 00 00 00 EC 0E 01 10 D0 19 00 00 01 00 00 00 00 00 00 00');
SendToServerEx(Nick);
SendMsg2('Отправился пакет 2 и таймер остановился');
TimerCyrcle:=1;
Timer01.enabled:=false;
end;
end;

end;
procedure Free;
begin
Timer01.free;
end;


begin
If (ConnectName=Nick) and FromServer and (pck[1] = #$11) then
begin
ListID:=ReadD(6);
buf:=#$1F; WriteD(ListID); WriteD(1); WriteD(6608); WriteD(1);
SendToServerEx(Nick);
SendMsg2('Модифицировали пакет RequestSellItem, ListID= ' + IntToStr(ListID));


end;
end.
но все равно идет только покупка арки...а продажу не хочет делать...если вам не трудно скажите в чем у меня ошибка... 6608 ид арки.

J-Fobos
23.08.2010, 23:28
Не используйте скрипт с той темы, он в вашем случаи не подходит, свой напишите :)
У вас проблема та же, но ситуация другая.

NLObP
23.08.2010, 23:34
HinoRyuu, я писал скрипт на продажу (http://coderx.ru/showthread.php?t=347), глянь его, может поможет.

HinoRyuu
23.08.2010, 23:43
J-Fobos, ну как я понимаю тут есть таймер + отправка пакетов тоесть насколько я понимаю надо изменить только низ скрипта...

Добавлено через 2 минуты
NLObP, спасибо =) надеюсь поможет=)