Автоматизация заточки предметов до необходимого уровня by NLObP
Возможности скрипта
--------------------
+ Панель управления;
+ Затачиваем по очереди все предметы с ItemID пока не переломаем
или не заточим. Один предмет всегда остаётся.
Необходимо затариться оружием, заточками и валерьянкой.
Name='NLObP'; //Вписать сюда имя чара
//установить константу в зависимости от типа игры (С4 или Интерлюд)
interlude=true; //Interlude - true, C4 - false
Внимание!
Из комбобокса обязательно надо выбрать вещь, чтобы скрипт узнал
ID и количество, только потом ставить напротив галочку.
Галочки снимать не надо, если кончились заточки/вещи - можно сразу идти
покупать и продолжать заточку.
В инвентаре должно быть не менее двух одинаковых затачиваемых вещей, степень заточки значения не имеет
Скрипт распространяется как есть, и я не несу ответственности за то, что ВЫ натворили у себя, его используя.
Вобщем посмотрел в пакетах ОбджектИД продавцов, и пытался их отловить через скрипт, чтобы понять какой у них ИД, чтобы смещение вычислить. Так ничего и не получилось. Пользуюсь таргетом через явный ОИД. Чего скажешь по скрипту и предыдущему вопросу?
Вобщем посмотрел в пакетах ОбджектИД продавцов, и пытался их отловить через скрипт, чтобы понять какой у них ИД, чтобы смещение вычислить. Так ничего и не получилось. Пользуюсь таргетом через явный ОИД. Чего скажешь по скрипту и предыдущему вопросу?
Иди в место где есть 1-2 NPC, там проще будет. Отследи пакеты NpcInfo и сравни NpcID в пришедших пакетах и из npcsid.ini для них же. Разница и будет kID.
Пробуешь подсчитать разницу между тем что в NpcInfo и тем что должно быть и это будет kID. Понятно? Как определишь kID, тогда сможишь соотносить NpcID с NpcObjectId.
delphi Код:
#$16: begin
msg.Lines.Add('S>Пакет NpcInfo #$16'+inttostr(ReadD(2)));
// OID ID
AppendNpc(ReadD(2), ReadD(6)); //добавляем в базу данныхif(FishermanID=ReadD(6)-kID)thenbegin
EditFishermanOID.text:=inttostr(ReadD(2));
FishermanOID:=strtoint(EditFishermanOID.text);
end;
end;
По скрипту пока ничего не скажу, проверить работу негде.
2 NLObP
Все, спасибо, разобрался. Проблема была в том что у меня были неверные ID продавцов, которые мне выдал IG. Теперь нашел верные, смещение такое же.
Подскажи пожалуйста, как реализовать данный алгоритм:
Вводные: Мы знаем кол-во Аден, цену итема, и кол-во свободных слотов.
К примеру. Есть 2млрд Аден, цена АС 200млн, свободно 40 слотов.
Понятное дело что за раз мы столько не купим, поэтому я как понимаю нужно что-то типа этого:
Код:
начало
запрос кол-ва аден
если (ценашмотки*свободслотов<аден) то
закупка по циклу на свободслоты
иначе
цикл до свободслотов
закупка на сколько хватит
обмен денег
конец
конец
Сейчас оно у меня в таком виде:
delphi Код:
procedure BuyItems(EmptySlots: integer); //тут видимо вообще не нужно указывать переменную, тк она глобальнаяvar
Cnt, IoA: integer; //Item on Adenabeginif InBase thenbegin
AdenaCounter(CoLChangeCount, CanChange, CanBuy);
if CanChange then CoLChange;
TargetAttacker('Roy', RoyOID);
AdenaCounter(CoLChangeCount, CanChange, CanBuy);
IoA:=(trunc(Adena/ItemPrice));
// TargetAttacker(ObjectID);
RequestByPassToServer('menu_select?ask=-303&reply='+IntToStr(ItemListID));
delay(500); // ждем окноif(IoA>EmptySlots)thenbeginfor Cnt:=1to EmptySlots dobegin
RequestMultiSellItem(ItemListID, ItemEntryID, BuyItemCount);
delay(BuyDelay);
end;
endelsebeginfor Cnt:=1to IoA dobegin
RequestMultiSellItem(ItemListID, ItemEntryID, BuyItemCount);
delay(BuyDelay);
end;
end;
end;
end;
И всетаки, как сделать закупку чтобы с каждым итемом база обновлялась? А то происходит вот что:
Тоесть сначала пробегает цикл, потом он успевает сменить таргет, и только после этого итемы начинают заносится в базу. Из-за этого было переполнение кошелька.
Циклы не используй в главном потоке. Используй сквозное программирование. Учти, твой скрипт вызывается в секунду несколько раз. Не нужно тормозить обмен клиента с сервером.
В главной секции 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.
Причина: Добавлено сообщение