Page 1 of 1

Эх скоко не лазил ... ну простите меня ..

Posted: 2009-06-11 23:46:48
by zimglads
но блин ... надо банальный манинг )))
бегаем по тайлам и обкапываемся вокруг .. затем иф вес>300 бежим в банк и скидуем в сумочку ид вобью сам ) добераем кирок если в паке меньше 2 но не больше 4 и репит по кругу .. ну мона ещё еду добавить ... а то на форуме скоко не лазил везде какие-то или сильно сложные или слишком простые )) золотая средина нуна ))

а ещё просьба без хайда )) ну и поля где надо "иф нотжурнал промазал по земле / там нема/ и т.п. тоже сам заполню" навсяк пожар .. шард Forgoten World..

П.С. знаю что вас всех достало ) но простите уж... :?

вобще-то нашол примерный скрипт на хождение и обкапывание вокруг ..

Code: Select all

sub Mining_Carve() 
var i 
dim x[6],y[6] 
x[0]=2577 
y[0]=481 
x[1]=2572 
y[1]=477 
x[2]=2570 
y[2]=481 
x[3]=2570            
y[3]=486 
x[4]=2564 
y[4]=486 
x[5]=2561
y[5]=490 
    repeat 
       for i=0 to 5  
             smartwalk(x[i],y[i]) 
             mining() 
       next 
    until uo.weight>=uo.str*4 
endsub 
sub Mining() 
   var x,y 
        for x=-2 to 2 
           for y=-2 to 2 
                 if x==0 and y==0 then 
                      wait(500) 
                 else 
                      uo.deletejournal() 
                      uo.waittargettile('0',str(uo.getx('self')+x),str(uo.gety('self')+y),'0') 
                      uo.usetype('NPF') 
                             repeat 
                                   wait(300) 
                             until uo.injournal('that is too far away |there is no ore here to mine |in rock') 
                 endif 
            next 
      next 
endsub 
Sub Checklag() 
   deljournal('a backpack') 
   uo.click('backpack') 
   repeat 
      wait(50) 
   until uo.injournal('a backpack') 
endsub 
Sub deljournal(msg) 
   while uo.injournal(msg) 
      uo.setjournalline(uo.injournal(msg)-1,"") 
   wend 
endsub 
Sub st(x,y,stepdelay) 
   var xn=uo.getx('self'),yn=uo.gety('self'),xp,yp 
      if uo.getdir('self')<>x then 
         uo.press(y) 
         wait(100) 
         checklag() 
      endif 
   uo.press(y) 
   wait(stepdelay) 
   checklag() 
   xp=uo.getx('self') 
   yp=uo.gety('self') 
      if xn==xp and yn==yp then 
         uo.press(y) 
         wait(stepdelay) 
         checklag() 
         xp=uo.getx('self') 
         yp=uo.gety('self') 
      endif 
      if xn==xp and yn==yp then 
         uo.press(y) 
         wait(stepdelay) 
         checklag() 
         xp=uo.getx('self') 
         yp=uo.gety('self') 
      endif 
      if xn==xp and yn==yp then 
         return 0 
      else 
         return uo.getdir('self')+1 
      endif    
endsub 
#Millerbeer 2009 
#моя  ходилка типа с зачатками интеллекта :-) 
Sub SmartWalk(xk,yk) 
   var xn,yn,stepdelay,gon,tempx,tempy,i,z,q,m,count='z',flag=0,prec=1;prec-точность с какой надо подходить к клетке 
   dim sx[4], sy[4], px[100], py[100] 
      repeat 
         xn=uo.getx('self') 
         yn=uo.gety('self') 
         stepdelay=200 
            if xn>xk && yn>yk then 
               gon=st(7,38,stepdelay) 
            endif 
            if xn>xk && yn==yk then 
               gon=st(6,36,stepdelay) 
            endif 
            if xn>xk && yn<yk then 
               gon=st(5,37,stepdelay) 
            endif 
            if xn<xk && yn>yk then 
               gon=st(1,39,stepdelay) 
            endif 
            if xn<xk && yn==yk then 
               gon=st(2,34,stepdelay) 
            endif 
            if xn<xk && yn<yk then 
               gon=st(3,40,stepdelay) 
            endif 
            if xn==xk && yn>yk then 
               gon=st(0,33,stepdelay) 
            endif 
            if xn==xk && yn<yk then 
               gon=st(4,35,stepdelay) 
            endif 
            if xn==xk && yn==yk then 
                       uo.print('Шеф, я на месте!!!') 
                       return 
            endif 
            if gon==0 && dist(xn,yn,xk,yk)==1 then 
               uo.print('Сорри, шеф, малость недошёл!!!') 
               return 
            endif 
            if gon==0 && dist(xn,yn,xk,yk)>1 then 
               repeat 
                     if count=='z' then 
                        count=0 
                        px[count]=uo.getx('self') 
                        py[count]=uo.gety('self') 
                     endif 
                     if count>=0 then 
                        z=0 
                           for i=0 to count 
                              if uo.getx('self')==px[i] && uo.gety('self')==py[i] then 
                                 z=1 
                              endif 
                           next 
                           if z==0 then 
                              count=count+1 
                                 if count==101 then 
                                    count=0 
                                 endif 
                              px[count]=uo.getx('self') 
                              py[count]=uo.gety('self') 
                           endif 
                     endif 
                  sx[0]=uo.getx('self') 
                  sy[0]=uo.gety('self')-1 
                  sx[1]=uo.getx('self')+1 
                  sy[1]=uo.gety('self') 
                  sx[2]=uo.getx('self') 
                  sy[2]=uo.gety('self')+1 
                  sx[3]=uo.getx('self')-1 
                  sy[3]=uo.gety('self') 
                     for i=0 to 2 
                        for z=0 to 2 
                           if dist(sx[z],sy[z],xk,yk) > dist(sx[z+1],sy[z+1],xk,yk) then 
                              tempx=sx[z+1] 
                              tempy=sy[z+1] 
                              sx[z+1]=sx[z] 
                              sy[z+1]=sy[z] 
                              sx[z]=tempx 
                              sy[z]=tempy 
                           endif 
                        next 
                     next 
                     if count>=0 then 
                        i=0 
                        q=0 
                           repeat 
                              for z=0 to count 
                                 if sx[i]==px[z] && sy[i]==py[z] then 
                                    tempx=sx[i] 
                                    tempy=sy[i] 
                                       for m=i to 2 
                                          sx[m]=sx[m+1] 
                                          sy[m]=sy[m+1] 
                                       next 
                                    sx[3]=tempx 
                                    sy[3]=tempy 
                                    q=q+1 
                                    flag=1 
                                 endif 
                              next 
                              if flag==0 then 
                                 i=i+1 
                              else 
                                 flag=0 
                              endif 
                           until i>=3 || q>=3 
                     endif 
                  i=0 
                     repeat 
                        tempx=uo.getx('self') 
                        tempy=uo.gety('self') 
                        if tempx>sx[i] && tempy==sy[i] then 
                           gon=st(6,36,stepdelay) 
                        else 
                           if tempx<sx[i] && tempy==sy[i] then 
                              gon=st(2,34,stepdelay) 
                           else 
                              if tempx==sx[i] && tempy>sy[i] then 
                                 gon=st(0,33,stepdelay) 
                              else 
                                 if tempx==sx[i] && tempy<sy[i] then 
                                    gon=st(4,35,stepdelay) 
                                 else 
                                    if tempx==xk && tempy==yk then 
                                               uo.print('Шеф, я на месте!!!') 
                                               return 
                                    else 
                                       if gon==0 && dist(sx[i],sy[i],xk,yk)==1 then 
                                          uo.print('Сорри, шеф, недошёл!!!') 
                                          return 
                                       endif 
                                    endif 
                                 endif 
                              endif 
                           endif 
                        endif 
                        i=i+1 
                     until gon || i>3 
               until dist(uo.getx('self'),uo.gety('self'),xk,yk)<=1 
            endif 
      until dist(uo.getx('self'),uo.gety('self'),xk,yk)<=prec 
endsub 
Sub Dist(x1,y1,x2,y2) 
   var dx,dy 
      if x1-x2 > 0 then 
         dx=x1-x2 
      else 
         if x1-x2 < 0 then 
            dx=x2-x1 
         else 
            dx=0 
         endif 
      endif 
      if y1-y2 > 0 then 
         dy=y1-y2 
      else 
         if y1-y2 < 0 then 
            dy=y2-y1 
         else 
            dy=0 
         endif 
      endif 
      if dx>=dy then 
         return dx 
      else 
         return dy 
      endif 
endsub 
но тут нету скидывания в банк..
банк у меня открываеться по принципу

Code: Select all

UO.UseObject(0x4001CCDE) 
		CheckLag()
			UO.UseObject(0x400D0A53)
(но я незнаю как его туда вклеить и как добавить сброс ресурсов ..) понимаю что чёто тип
,moveitem object [quantity containerobject/ground [x y z]]
в моём случае ето походу
moveitem Type=0x19B9 "0" "0x400D0A53"

поправил масив координат .. и попытался поправить журнал (сообщения что выдаёт еси там далеко или нема руды) но нехотит копать .. запускаю 1 копка и всё

фразы которые говорит серв когда не нужно продолжать копать
Try mining in rock.
that is too far away.
there is no ore here to mine.

а после которых нужно копать думаю не стоит писать ? =)
а ещё есть обход антимакроса .. который как правило срабатывает при одевании кирки и ето приводит макрос в ступор .. т.к. ласт действие походу получаеться не таргет ...

Posted: 2009-06-12 09:52:34
by $!@m
Самая большая проблема - дойти от банка к шахте. Если пешкарусом - ищи ходилки, но 90% что запаришся :) Лучше летать по рунке или рунбуке. Конструкция проста:

Code: Select all

cast('Recall',<dune id>)
Далее нужна опкопка и ходилка по шахте. Обкопку можно в принципе разделить на однотайловую и многотайловую. Сиречь или выкопал 1 тайл и пошел дальше, либо стал, обкопался со всех сторон, пошел дальше. Если тебе не нужен хайдинг, то, думаю, не нужна и обкопка тебе нужна однотайловая. Алгоритм:

Code: Select all

UO.WaitTargetTile(<координаты чара>);
UO.UseType(<кирка>);
UO.DeleteJournal();
repeat
   wait(*); * - задержка порядка 300 ~ 500
until UO.InJournal(<нужное сообщение журнала>);
Если обкопка вокруг себя на несколько тайлов, то нужно сделать вложенный цикл для прицела киркой в координаты +2/-2 от чара (или на сколько там достаешь киркой копать).
В зависимости от шарда и своего майнинга можно/нужно добавить проверку на количество попыток выкопать. На многих шардах с алгоритмом ожидания в журнале "выкопал"/"нечего копать" и маленьким майнингом можно надолго встрять на тайле с высокой рудой. Проверка проста, каждый цикл добавлять к счетчику единицу, соотв. в условии until кроме журнала дописать и проверку на счетчик.

Следующий этап - переход на следующий тайл. Если копаешь по одному тайлу - переход на 1 тайл. Обкапываешся - соотв. переход на кол-во тайлов, при которых не будешь цеплять уже выкопанные, это вроде ясно. Снова-таки. Если нет ничего архисложного, лучше выбрать себе для копки прямоугольный участок такого размера, чтоб за его полный проход выкапывать себе почти максимальный вес.
Ходить в таком случае лучше без "ходилок", простыми

Code: Select all

Send(*)
Выглядеть должно примерно так:

Code: Select all

for a=0 to N
  for b=0 to M
    <процедура копки>
  <сделать шаг в сторону увеличения М>
  next
  <сделать шаг в сторону N>
  <изменить направление хотьбы для М>
next
M & N - соотв. ширина и длина прямоугольника, по которому ходим.
Шаг делается "нажатием" кнопки на клавиатуре. Направления соотв. направлениям на цифровой клавиатуре с выключенным NumLock. Коды кнопок можно узнать в самой оболочке редактирования скрипта в инже.

Итак, уже имеем алгоритм копания в шахте. Допустим, благополучно вскопали прямоугольник, надо вернуться. Снова-таки, лучше реколится. Процедура та же, кастуем рекол на руну к банку.
Открываем банк, сгружаем руду, берем расходники.
Открывать банк ты умеешь, как сгрузить?
Ищем в паке руду:

Code: Select all

UO.FindType(<руда>)
Функция вернет значение FindCount - кол-во найденных вещей; и finditem - ИД найденного обьекта, одного.
Итак, мы сможем перенести finditem в контейнер банка. Так мы переместим 1 кучку руды. Т.к. их будет больше (и разной), то впихнем все это в цикл, и будем делать до тех пор, пока после поиска FindType FindCount не станет =0. Что означает найдено 0 обьектов, подходящий по типу.

Итак, знаем алгоритм отгруза руды. Теперь загрузка расходников. Это кирки и реги для рекола. Алгоритм: ищем в паке кирки, если меньше нужного - загребаем из банка. То же с регами. Комманды те же, что при отгрузе, только меняются местами контейнеры, для проверки ищем в паке, для загрузки ищем в банке и из банка берем в пак.

Снова реколимся в шахту.

ПС: писать целиком не буду, имейте совесть и учите программирование :)
Синтаксис всех комманд в http://yoko.netroof.net/help/

Posted: 2009-06-12 12:07:36
by zimglads
банк у меня прямо в шахте ) так что код я прально тот написал )) впринципе хороший вариант про однотайловые написал .. щас попробую ... а можеш подсказать ещё как сделать чтобы макрос давал таргет и я просто ходил и проклацывал нужные места а он ето допустим потом записал в d:/koordinati.txt и пошол по ним копать ?

Posted: 2009-06-12 14:40:50
by Edikus
меня всегда убивает все Эти "нужен банальный" и последуйщее описание скрипта минимум на 300 строчек.

...

Posted: 2009-06-12 14:49:09
by zimglads
ну можно ведь просто бегать да скидовать ) ето ведь не 300 строк ? О_о

Posted: 2009-06-13 08:58:34
by $!@m
Смотри, насчет однотайловой копки - удобно, но надо чуток скрипт "придерживать" перед копкой, а то инжа после шага не мгновенно определяет координаты, это, пожалуй, единственная проблемма. Если задержка в 0.1 - 0.2 сек не смертельна, то копай под ногами по одному тайлу и не парься.

Насчет координат - если копаешь с пола, то все-таки лучше просто раздели шахту на прямоугольники и копай в них простым скриптом. Такой вариат предпочтительней. И вообще - чем проще, тем лучше. И надежнее.

Если хочешь увидеть скрипт, какой пишет коорды в файл и потом по ним ходит - посмотри в разделе Топ Кв. скрипт на ламбер с записью координат. Писал Ветеран, если память не сдает. Вот глянь и подумай, "а мож ну его нах?".

Posted: 2009-06-13 14:16:17
by zimglads
спс какраз добрался до однотайловой копки )) уже усё чотко )