Shadow, покупка разорвана на несколько этапов.
покупка состоит из следующих шагов:
1. Мы начинаем покупку установив таргет на продавце:
таргет на продавце, пауза, снова таргет (c04=Action, c04=Action)
2. Потом ждем сообщения от продавца:
приходит s0F=NpcHtmlMessage:d(MessageID)s(HTML)d(d)
3.Выбираем требуемый пункт:
шлем выбранный пункт из меню c21=RequestBypassToServer:s(Cmd)
4. Опять ждем сообщения от продавца:
приходит s11=BuyList:d(Money)h(ListID)w(ListCount)w(ItemTyp e1)h(ObjectID)i(ItemID)d(maxcnt)w(ItemType2)w(h)d( ItemBodyPart)
5. По нужному ID подсчитывае сколько надо вещей Count, запоминаем ListId.
6. Всё это шлем в пакете покупки:
шлем c1F=RequestBuyItem:h(ListID)d(BuyCount)i(ItemID)d( Count)
Замечание:
Так как в основном цикле приходят пакеты, даже когда мы их не ждём, то надо дополнительно флагами, например ReadyToMultiSell, разрешать отслеживание тех или иных пакетов.
Замечание:
Так как в основном цикле приходят пакеты, даже когда мы их не ждём, то надо дополнительно флагами, например ReadyToMultiSell, разрешать отслеживание тех или иных пакетов.
PS: надеюсь понятно.
Это понятно, сам принцип покупки мне давно известен, и (криво), но реализован в моей версии посредством циклов.
Я говорю вот о чем. Предположим свободно 80 слотов. И получается что все 80 раз будет посылаться таргет, байпасс, и РМС, что не есть хорошо. Хотя нужно послать один раз таргет, один раз байпасс, и 80 раз рекуестмультиселл. При обмене соотвественно таргет на другого кота, байпасс, и нужное количество РМС для обмена.
Предположим свободно 80 слотов. И получается что все 80 раз будет посылаться таргет, байпасс, и РМС, что не есть хорошо. Хотя нужно послать один раз таргет, один раз байпасс, и 80 раз рекуестмультиселл. При обмене соотвественно таргет на другого кота, байпасс, и нужное количество РМС для обмена.
Так у меня ведь не RequestBuyItem, а RequestMultiSell, тоесть обмен. А там такого нет.
Добавлено через 13 часов 42 минуты
Переделал обменную часть от рыбалки. Но периодически он останавливается. И постоянно слетает коннект. Посмотрите, что я не так сделал:
delphi Код:
//******************************************************************************//..............................................................................// Закупкаprocedure Shoping(Sender: TObject);
begin
timer.Enabled:=False;
Change.Enabled:=False;
// if ShopMode=1 then beginif NeedToBuy thenexit; //если еще не обменяли предыдущую вещь, то выходим сразуif(RoyOID=0)thenbegin//(RoyOID=0) or
Shops.Enabled:=False; //останавливаем торговлю
stats.Lines.Add('Не определены OID! Требуется отбежать подальше и вернуться.');
exit; //выходимend;
AdenaCounter(CoLChangeCount, CanChange, CanBuy);
if(Adena<ItemPrice)thenbegin
Shops.Enabled:=False; //останавливаем
stats.Lines.Add('Не хватает денег.');
NeedToChange:=True;
// Shops.Enabled:=True;exit;
end;
if(EmptySlots<=2)thenbegin//проверка на выход
Shops.Enabled:=False; //останавливаем торговлю
TargetAttacker('Roy', RoyOID); //таргет
msg.Lines.Add('Всё закупили!');
CurEnchLvl:=0;
Edit2.text:=IntToStr(CurEnchLvl);
EditBuyDelay.Enabled:=False;
timer.Enabled:=True;
endelsebegin
msg.Lines.Add('Цель Roy >');
TargetAttacker('Roy', RoyOID); //таргет
msg.Lines.Add('Готовы обменять: '+IntToStr(EmptySlots-2));
NeedToBuy:=True; //готовы обмениватьend;
end;
//..............................................................................//..............................................................................// Обменprocedure OnChange(Sender: TObject);
begin
timer.Enabled:=False;
Shops.Enabled:=False;
if NeedToChange thenexit; //если еще не обменяли предыдущую вещь, то выходим сразуif(WinnieOID=0)thenbegin//(RoyOID=0) or
Change.Enabled:=False; //останавливаем торговлю
stats.Lines.Add('Не определены OID! Требуется отбежать подальше и вернуться.');
exit; //выходимend;
AdenaCounter(CoLChangeCount, CanChange, CanBuy);
if(Adena>=1900000000)thenbegin//проверка на выход
Change.Enabled:=False; //останавливаем
TargetAttacker('Roy', RoyOID); //таргет
msg.Lines.Add('Всё обменяли!');
timer.Enabled:=True;
endelsebegin
msg.Lines.Add('Цель Winnie >');
TargetAttacker('Winnie', WinnieOID); //таргет
msg.Lines.Add('Готовы обменять: '+IntToStr(ColChangeCount));
NeedToChange:=True; //готовы обмениватьend;
end;
//..............................................................................//****************************************************************************** //******************************************************************************procedure OnTimer(Sender: TObject);
begin
EditItemVal.Text:=IntToStr(SumItem(ItemID));
EditScrollVal.Text:=IntToStr(SumItem(ScrollID));
if(Adena<=99000000)thenbegin
stats.Lines.Add('Деньги закончились! Меняем...');
timer.Enabled:=False;
NeedToChange:=True;// else exit;
Change.Enabled:=True;
end;
if(CurEnchLvl>=StrToInt(Edit1.Text))thenbegin
stats.Lines.Add('Sum '+IntToStr(SumItem(ItemID))+' lvl'+IntToStr(CurEnchLvl)+' Ed'+(Edit1.Text));
timer.enabled:=false;
//Пакет RequestItemList
buf:=hstr('0F');
SendToServerEx(Name);
delay(50);
stats.Lines.Add('Достигнут требуемый уровень! Закупаем...');
stats.Lines.Add('Свободно слотов: '+IntToStr(EmptySlots));
if(EmptySlots>0)thenbegin
ButtonBuyItems.Enabled:=True;
ButtonBuyItems.Caption:=((ComboBoxItem.Text)+': '+IntToStr(EmptySlots)+'шт.');
end;
{ if (SumItem(ItemID)>=10) and (CurEnchLvl>=StrToInt(Edit1.Text)) then begin
stats.Lines.Add('Max '+IntToStr(MaxEnchLvl));
stats.Lines.Add('Заточено 10шт '+IntToStr(MaxEnchLvl)+' уровня!');
inc(MaxEnchLvl);
stats.Lines.Add('Увеличиваем уровень: '+IntToStr(MaxEnchLvl));
Edit1.Text:=(IntToStr(MaxEnchLvl));
end; }
NeedToBuy:=True;
Shops.Enabled:=True;
//exit;end;
if(SumItem(ItemID)<=StrToInt(EditKeepItems.Text))thenbegin
timer.enabled:=false;
buf:=hstr('0F');
SendToServerEx(Name);
stats.Lines.Add('Ограничение по поломкам - '+IntToStr(EditKeepItems.Text)+'! Закупаем...');
delay(50);
NeedToBuy:=True;
Shops.Enabled:=True;
end;
ScrollOID:=GetItem(ScrollID,0);
if(ScrollOID<=3)thenbegin
stats.Lines.Add('Свитки закончились! Покупаем...');
timer.enabled:=False;
//***** Закупка заточек *
BuyScroll;
//***********************
delay(50);
timer.enabled:=True;
//exit;end;
UseItem(ScrollOID);
msg.Lines.Add('Задействовали скролл ScrollID='+IntToStr(scrollID)+' ScrollOID='+IntToStr(ScrollOID));
ready:=true; //готовы затачиватьend;
//==============================================================================// вызывается при приходе каждого пакета, если скрипт включен//******************************************************************************Begin//****************************************************************************if pck=''thenexit;
//****************************************************************************if NeedToChange and(WinnieOID<>0)thenbeginif(ConnectName=Name)and FromServer thenbegincase pck[1] of
#$0F: begin
msg.Lines.Add('S>Пакет NpcHtmlMessage #$0F');
msg.Lines.Add(IntToStr(ReadD(4)));
if(ReadD(2)=WinnieOID)thenbegin
delay(350);
RequestByPassToServer('menu_select?ask=-303&reply=576');
msg.Lines.Add('C>Пакет RequestBypassToServer');
end;
end;
#$D0: begin
msg.Lines.Add('S>Пакет MultiSellList #$D0');
delay(350);
RequestMultiSellItem(576, 3, 100);
NeedToChange:=False;
end;
end;
end;
end;
if NeedToBuy and(RoyOID<>0)thenbeginif(ConnectName=Name)and FromServer thenbegincase pck[1] of
#$0F: begin
msg.Lines.Add('S>Пакет NpcHtmlMessage #$0F');
msg.Lines.Add(IntToStr(ReadD(4)));
if(ReadD(2)=RoyOID)thenbegin
delay(350);
RequestByPassToServer('menu_select?ask=-303&reply='+IntToStr(ItemListID));
msg.Lines.Add('C>Пакет RequestBypassToServer '+IntToStr(ItemListID));
end;
end;
#$D0: begin
msg.Lines.Add('S>Пакет MultiSellList #$D0');
delay(350);
RequestMultiSellItem(ItemListID, ItemEntryID, ItemCount);
NeedToBuy:=False;
end;
end;
end;
end;
//****************************************************************************
Может зря я два таймера использовал, и можно на одном это сделать?
__________________
Shadows anywhere...
Последний раз редактировалось Shadow, 16.08.2008 в 23:47.
Причина: Добавлено сообщение