Затрудняюсь в составлеии пакета обмена 1ккк аден на этот итем.
Наведите хотябы на мыслю
Посмотри как организован обмен предметов в рыбалке:
delphi Код:
//***************************************************************// Вся торговля здесь!!!//***************************************************************procedure OnTrade(Sender: TObject);
begincase trade of
...
//-------------------------------------------------//обмениваем у фишермана на пруфы//-------------------------------------------------400: beginif ReadyToMultiSell thenexit; //если еще не обменяли предыдущую вещь, то выходим сразу//мы у фишермана, обмениваем всё на пруфыif FishermanOID=0thenbegin
Trade1.enabled:=false; //останавливаем торговлю
msg.Lines.Add('Не готовы к торговле, нет OID фишермана! Требуется отбежать подальше и вернуться.');
exit; //выходимend;
if TradeCount=TradeMultiItemCount thenbegin//проверка на выход из массива
Trade1.enabled:=false; //останавливаем торговлю
msg.Lines.Add('Всё обменяли!');
case MestoLovli of1: begin cmd:='fishing'; MestoLovli1; end;
2: begin cmd:='fishing'; MestoLovli2; end;
3: begin cmd:='fishing'; MestoLovli3; end;
end;
msg.Lines.Add('Бежим на берег...');
TradeCount:=0;
endelsebeginif(TradeMultiItem[TradeCount]<>FO)and(TradeMultiItem[TradeCount]<>GFO)thenbeginif FindItem(TradeMultiItem[TradeCount])<>0thenbegin
TargetAttacker(FishermanOID); //фишермана в таргет
msg.Lines.Add('Готовы обменять:'+inttostr(TradeMultiItem[TradeCount]));
ReadyToMultiSell:=true; //готовы обмениватьendelse msg.Lines.Add('Нет такого предмета:'+inttostr(TradeMultiItem[TradeCount]));
Trd:=TradeCount;
end;
inc(TradeCount);
msg.Lines.Add('TradeCount/TradeMultiItemCount:'+inttostr(TradeCount)+'/'+inttostr(TradeMultiItemCount-1));
end;
end;
end;
end;
//......................................
...
//***************************************************************// вызывается при приходе каждого пакета, если скрипт включен//***************************************************************begin//****************************************************************************//не обрабатываем пустые пакетыif pck=''thenexit;
...
//****************************************************************************//обмен состоит из следующих шагов://1. таргет на продавце, пауза, снова таргет (c04=Action, c04=Action)//2. приходит s0F=NpcHtmlMessage:d(MessageID)s(HTML)d(d)//3. шлем выбранный пункт из меню c21=RequestBypassToServer:s(Cmd)//4. приходит sD0=MultiSellList:d(listId)d(page_beg)d(page_end)d(onpage)d(entrycount)d(EntryId)b(?)w(prodcount)w(itemcount<)w(pItemId)d(?)w(ptype2)d(pcount)w(penchant)w(iItemId)w(itype2)d(icount)w(ienchant)//5. FindItem(ID) найдем OID, Count нужной вещи по ID//6. шлем cA7=RequestMultiSellChoose:h(ListID)d(EntryID)d(Amount)//****************************************************************************if ReadyToMultiSell and(FishermanOID<>0)thenbeginif(ConnectName=Name)and FromServer thenbegincase pck[1] of//после того как мы взяли в таргет продавца приходит этот пакет//s0F=NpcHtmlMessage:d(MessageID)s(HTML)d(d)
#$0F: begin
msg.Lines.Add('S>Пакет NpcHtmlMessage #$0F');
if ReadD(2)=FishermanOID thenbegin//шлем запрос выбора пункта - продажа//c21=RequestBypassToServer:s(Cmd)
delay(1000);
RequestByPassToServer(getmultisell);
msg.Lines.Add('C>Пакет RequestBypassToServer #$21 (multisell)');
end;
end;
//после выбора пункта - обмен, приходит этот пакет//sD0=MultiSellList:d(listId)d(page_beg)d(page_end)d(onpage)d(entrycount)d(EntryId)b(?)w(prodcount)w(itemcount<)w(pItemId)d(?)w(ptype2)d(pcount)w(penchant)w(iItemId)w(itype2)d(icount)w(ienchant)
#$D0: begin
msg.Lines.Add('S>Пакет MultiSellList #$D0');
ListID:=ReadD(2); //запоминаем, он все время разный
msg.Lines.Add('ListID='+inttostr(ListID));
//шлем запрос на обмен//cA7=RequestMultiSellChoose:h(ListID)d(EntryID)d(Amount)
msg.Lines.Add('C>Пакет RequestMultiSellChoose #$A7(ListId:'+IntToStr(ListId)+' EntryId:'+IntToStr(Trd*2+1)+' Count:'+IntToStr(ItemBase2[3,1])+')');
delay(1000);
//в java -> EntryId * k=100000
RequestMultiSellItem(ListId,Trd*2+1,ItemBase2[3,1]);
ReadyToMultiSell:=false;
end;
end;
end;
end;
...
end.
Если в двух словах, то заранее определяешь из пакета sD0=MultiSellList - EntryId, оно постоянно для твоего предмета и каждый раз при обмене определяешь из этого же пакета sD0=MultiSellList - ListID.
Затем формируешь по полученным данным cA7=RequestMultiSellChoose:h(ListID)d(EntryID)d(Am ount) и отсылаешь на сервер.
Посмотри как организован обмен предметов в рыбалке:
delphi Код:
//***************************************************************// Вся торговля здесь!!!//***************************************************************procedure OnTrade(Sender: TObject);
begincase trade of
...
//-------------------------------------------------//обмениваем у фишермана на пруфы//-------------------------------------------------400: beginif ReadyToMultiSell thenexit; //если еще не обменяли предыдущую вещь, то выходим сразу//мы у фишермана, обмениваем всё на пруфыif FishermanOID=0thenbegin
Trade1.enabled:=false; //останавливаем торговлю
msg.Lines.Add('Не готовы к торговле, нет OID фишермана! Требуется отбежать подальше и вернуться.');
exit; //выходимend;
if TradeCount=TradeMultiItemCount thenbegin//проверка на выход из массива
Trade1.enabled:=false; //останавливаем торговлю
msg.Lines.Add('Всё обменяли!');
case MestoLovli of1: begin cmd:='fishing'; MestoLovli1; end;
2: begin cmd:='fishing'; MestoLovli2; end;
3: begin cmd:='fishing'; MestoLovli3; end;
end;
msg.Lines.Add('Бежим на берег...');
TradeCount:=0;
endelsebeginif(TradeMultiItem[TradeCount]<>FO)and(TradeMultiItem[TradeCount]<>GFO)thenbeginif FindItem(TradeMultiItem[TradeCount])<>0thenbegin
TargetAttacker(FishermanOID); //фишермана в таргет
msg.Lines.Add('Готовы обменять:'+inttostr(TradeMultiItem[TradeCount]));
ReadyToMultiSell:=true; //готовы обмениватьendelse msg.Lines.Add('Нет такого предмета:'+inttostr(TradeMultiItem[TradeCount]));
Trd:=TradeCount;
end;
inc(TradeCount);
msg.Lines.Add('TradeCount/TradeMultiItemCount:'+inttostr(TradeCount)+'/'+inttostr(TradeMultiItemCount-1));
end;
end;
end;
end;
//......................................
...
//***************************************************************// вызывается при приходе каждого пакета, если скрипт включен//***************************************************************begin//****************************************************************************//не обрабатываем пустые пакетыif pck=''thenexit;
...
//****************************************************************************//обмен состоит из следующих шагов://1. таргет на продавце, пауза, снова таргет (c04=Action, c04=Action)//2. приходит s0F=NpcHtmlMessage:d(MessageID)s(HTML)d(d)//3. шлем выбранный пункт из меню c21=RequestBypassToServer:s(Cmd)//4. приходит sD0=MultiSellList:d(listId)d(page_beg)d(page_end)d(onpage)d(entrycount)d(EntryId)b(?)w(prodcount)w(itemcount<)w(pItemId)d(?)w(ptype2)d(pcount)w(penchant)w(iItemId)w(itype2)d(icount)w(ienchant)//5. FindItem(ID) найдем OID, Count нужной вещи по ID//6. шлем cA7=RequestMultiSellChoose:h(ListID)d(EntryID)d(Amount)//****************************************************************************if ReadyToMultiSell and(FishermanOID<>0)thenbeginif(ConnectName=Name)and FromServer thenbegincase pck[1] of//после того как мы взяли в таргет продавца приходит этот пакет//s0F=NpcHtmlMessage:d(MessageID)s(HTML)d(d)
#$0F: begin
msg.Lines.Add('S>Пакет NpcHtmlMessage #$0F');
if ReadD(2)=FishermanOID thenbegin//шлем запрос выбора пункта - продажа//c21=RequestBypassToServer:s(Cmd)
delay(1000);
RequestByPassToServer(getmultisell);
msg.Lines.Add('C>Пакет RequestBypassToServer #$21 (multisell)');
end;
end;
//после выбора пункта - обмен, приходит этот пакет//sD0=MultiSellList:d(listId)d(page_beg)d(page_end)d(onpage)d(entrycount)d(EntryId)b(?)w(prodcount)w(itemcount<)w(pItemId)d(?)w(ptype2)d(pcount)w(penchant)w(iItemId)w(itype2)d(icount)w(ienchant)
#$D0: begin
msg.Lines.Add('S>Пакет MultiSellList #$D0');
ListID:=ReadD(2); //запоминаем, он все время разный
msg.Lines.Add('ListID='+inttostr(ListID));
//шлем запрос на обмен//cA7=RequestMultiSellChoose:h(ListID)d(EntryID)d(Amount)
msg.Lines.Add('C>Пакет RequestMultiSellChoose #$A7(ListId:'+IntToStr(ListId)+' EntryId:'+IntToStr(Trd*2+1)+' Count:'+IntToStr(ItemBase2[3,1])+')');
delay(1000);
//в java -> EntryId * k=100000
RequestMultiSellItem(ListId,Trd*2+1,ItemBase2[3,1]);
ReadyToMultiSell:=false;
end;
end;
end;
end;
...
end.
Если в двух словах, то заранее определяешь из пакета sD0=MultiSellList - EntryId, оно постоянно для твоего предмета и каждый раз при обмене определяешь из этого же пакета sD0=MultiSellList - ListID.
Затем формируешь по полученным данным cA7=RequestMultiSellChoose:h(ListID)d(EntryID)d(Am ount) и отсылаешь на сервер.
ЕТ оможет быть причиной того что.
Кна сервре покупаю вещь. копирую ето пакет( с покупокой ето й вещи, в отсылку пакета серверу) и рпинажатии "отослать". открываеться оконо с нпк. но итем сам не покупаеться, Потому что... Каждый новый пакет приходящий от сервера про покупку какого ибо итема имеет измененный Id итема по какомуто Закону. Играю на Хб
Получился вот такой вот пакетыч
A7 9E 86 01 00 A0 86 01 00 01 00 00 00
Впринцыпе что то, на что то меняется, вот только в сист. чате пишет - неправильное кол-во предметов =(
Получился вот такой вот пакетыч
A7 9E 86 01 00 A0 86 01 00 01 00 00 00
Впринцыпе что то, на что то меняется, вот только в сист. чате пишет - неправильное кол-во предметов =(
Для того, чтобы пробовать сделать пакет, для контроля сделай все действия в клиенте (можно несколько раз) и смотри какие пакеты и как формируются. Конкретно можешь уточнить длину пакета A7 (вроде 4 байт в конце не хватает) и можешь узнать EntryID конкретных, интересных тебе, предметов в Гмшопе. Не забывай, ListID при каждом запросе магазина, разный.
Почему это ListID разный? ListId для мультиселлов один и тот же (работал как я явой, так и с русс оффом). Имеется в виду, что ListID не меняется, если работать с одним и тем же мультиселлом
A7 ListID EntryID Count
Причём EntryID включает номер вещи по порядку в multisell листе + четыре нуля + и в конце дописывается заточка вещи.
После Count ещё один dword параметр равный 0 не обязателен
З.Ы. ListID разный тока для BuyList'ов. причём в L2phx ошибка в формате пакета BuyList (для русс оффа так точно, т.е. парт2 грация)
07=BuyList:...h(ItemType2)h(0)
Должен быть d
Последний раз редактировалось AdDa, 11.11.2008 в 13:32.
Ну если h - это 4-ре байта, то всё гуд
Просто... l2phx выкидывает ошибку на русс офф, когда пытаемся просмотреть пакет BuyList. Обработка идёт в цикле (от кол-ва итемов в листе) и как я понимаю происходит выход за цикл.
з.ы. можно ещё и multisell листов нормальную обрабатку сделать. Вот пример с русс оффа(часть скрипта):
Добавлено через 7 минут
А если были бы желающие - я не прочь сделать чё-нить вроде l2wh.com + hIngame.
Собирать базу русс оффа (дропа, координат мобов, buy и multisell листов ну и прочую хрень). А-ля hInGame, чтобы игроки могли иметь хоть какую-то пользу, а остальным - аналог l2wh.com (сбор данных).
Последний раз редактировалось AdDa, 11.11.2008 в 17:39.
Причина: Добавлено сообщение
AdDa, думаю для сбора БД на руофф лучше написать минибота (может и в режиме ИГ) чем скрипт для пакетхака + можно ещё сделать список вывесок трейдов в крупных городах и может ещё какуюнить статистику
__________________
Я здесь практически не появляюсь!, Skype - ikskor
Если бот - то в режиме иг.
Чем лучше l2phx, чем Бот. Кол-во людей шаряших в написании скриптов больше гораздо, чем тех, кто может написать бота и для этого нужны знания только протола ла2. Если продумать архитектуру + переделать l2phx под неё, то принять участие могут многие.