Затрудняюсь в составлеии пакета обмена 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) и отсылаешь на сервер.
Получился вот такой вот пакетыч
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 под неё, то принять участие могут многие.
Идея про l2wh мне нравится. Нужен хостинг, способный выдержать большую нагрузку.
Если даже тысяча человек в одно время будет отсылать данные - это неслабая нагрузка.
Хотя можно сделать локальный буфер и отсылать за один сеанс обмена с сервером например данные за сутки игры.
Реально нужно отсылать данные о спойле/дропе с мобов и их расположение.
ListID и пр. нужно получить один раз и вовсе не нужно забивать трафик неменяющимися данными.