В главной секции begin ... end. должна быть, по возможности, только реакция на приходящие пакеты, то есть вызов соответствующих подпрограмм.
Добавлено через 2 минуты
Цитата:
Сообщение от freak
можно пример для работы на c4?
пожалуйста.
К кому и какому скрипту относится вопрос? Если к моему то там просто настроить его надо. Для этого почитать в начале скрипта описание.
Код:
Name='имя_чара'; //Вписать сюда имя чара
//установить константу в зависимости от типа игры (С4 или Интерлюд)
interlude=false; //Interlude - true, C4 - false
2 NLObP
А у меня циклов в главной секции нет. Все циклы в процедурах.
Вообщем ковыряю твою рыбалку на предмет корректной закупки. Вроде суть понял, но есть вопросы:
1. Не понятно как вызывать закупку при поломке шмоток, или когда все заточилось. Предполагаю что в процедуре ОнТаймер ставить ReadyToMultiSell:=True; Но как-то еще нужно считать сколько слотов, сколько можно закупить, и тд.
2. Он будет кидать таргет, байпас, и мультиселл при входе каждого пакета?
3. Например, я поставил оставлять 5 итемов вместо 1, и вот уже в инвентаре есть 5 итемов с нужным уровнем. Как сделать чтобы он оставлял именно те 5 что точил в текущем цикле? Типа есть 5 штук +16, а в текущем (с новой закупки) он заточил только до +10. Нужно считать именно те 5 штук +10 что точили, исключая 5 с заданым уровнем, закупаем еще, и дальше точим.
4. ReadyToMultiSell ловится в главной секции без привязки к конкретным пакетам?
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.
Причина: Добавлено сообщение