Исправьте пожалуйста!

Ask for scripts here

Moderators: Murderator+, Murderator

Post Reply
200790
Posts: 20
Joined: 2013-01-15 15:24:07

Исправьте пожалуйста!

Post by 200790 »

Что бы если моба убил не я он не пытался слутать из трупа то что указано для лута, а закрывал ячейку где лут моба или просто дальше включал поиск и ждал пока реснеться он.
а то иногда тупит изза этого.

Code: Select all

var distance='6' # ????????? ?????? ?????
   var corpser='0' # 1-?????? ???? # 0-?? ?????? ????
   
sub main()
   var n, m, mob
   var tweapon=uo.getserial(uo.objatlayer('Rhand'))
   var tshield=uo.getserial(uo.objatlayer('Lhand'))
   
   Dim npc[10]
   npc[0]=2 # count
   npc[1]='0x03CA'
   npc[2]='0x0018'
   npc[3]=''
   
   Dim loot[50]
   loot[0]=2 # count
   loot[1]='0x0EED'
   loot[2]='0x0F7E'
   loot[3]='0x0E34'
   loot[3]='0x1F58'
   
   uo.set('finddistance',distance)
   while 1
      for n=1 to npc[0]
         uo.findtype(npc[n],-1,'ground')
         if uo.findcount() then
            uo.useobject(tweapon)
            uo.useobject(tshield)
            wait(100)
            mob=uo.getserial('finditem')
            kill(mob)
            uo.useobject('lastcorpse')
            checklag()
            wait(1000)
            for m=1 to loot[0]
               while uo.getquantity('<'+loot[m])
                  uo.moveitem('<'+loot[m])
                  wait(700)
               wend
            next
            while uo.life<uo.str-20 and uo.count('0x0E21')
               uo.bandageself()
               wait(3500)
            wend
            if uo.count('0x0E20') then
               uo.waittargettype('0x1008')
               uo.usetype('0x0E20')
               wait(1000)
            endif
         endif
      next
      wait(1000)
   wend
endsub
sub kill(mob)
   var n
   checklag()
   for n=0 to 100
      uo.attack(mob)
      if uo.getdistance(mob)>1 then
         walkn(0,0,mob)
      endif
      if uo.injournal('Body of') then
         if corpser==1 then
            uo.waittargetobject('lastcorpse')
            wait(100)
            uo.usetype('0x0F51')
            wait(500)   
         endif
         return
      endif
      wait(1000)
   next
endsub
sub WalkN(x,y,Target) ########################################## ???????
   VAR LastTimer
   LastTimer=UO.Timer()
   VAR i
   VAR dir,ldir,rdir,key,olddir
   VAR dx,dy,Exit=0
   VAR CacheLimit=9,CacheIndex="Text"
   DIM CacheX[10], CacheY[10]
   
   CacheX[0]="Test"
   uo.say('')   
   While Exit<>1   
      If Target<>"" Then
         dx=UO.GetX(Target)-UO.GetX()
         dy=UO.GetY(Target)-UO.GetY()         
         If UO.GetDistance(Target)<2 OR LastTimer+100<UO.Timer() Then
            wait(1000)
            return
         Endif
      Else
         dx=x-UO.GetX()
         dy=y-UO.GetY()
         If dx==0 AND dy==0 OR LastTimer+100<UO.Timer() Then
            return
         Endif
      Endif   
      If dx<>0 AND dy<>0 Then
         If dx>0 AND dy>0 Then ; GoSE
            dir=3
            ldir=2
            rdir=4
            key=40 ; DownArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==2 Then ; GoNE
                  dir=1
                  ldir=0
                  rdir=1
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=5
                  rdir=6
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
         If dx>0 AND dy<0 Then ; GoNE
            dir=1
            ldir=0
            rdir=2
            key=39 ; RightArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==0 Then ; GoWN
                  dir=7
                  ldir=6
                  rdir=7
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSE
                  dir=3
                  ldir=3
                  rdir=4
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
         If dx<0 AND dy>0 Then ; GoSW
            dir=5
            ldir=4
            rdir=6
            key=37 ; LeftArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==6 Then ; GoWN
                  dir=7
                  ldir=7
                  rdir=0
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSE
                  dir=3
                  ldir=2
                  rdir=3
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
         If dx<0 AND dy<0 Then ; GoWN
            dir=7
            ldir=6
            rdir=0
            key=38 ; UpArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==0 Then ; GoNE
                  dir=1
                  ldir=1
                  rdir=2
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=4
                  rdir=5
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
      Endif
      If dx<>0 AND dy==0 Then
         If dx>0 Then ; GoE
            dir=2
            key=34 ; PgDown
            olddir=UO.GetDir()
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==2 Then ; GoSE
                  dir=3
                  ldir=3
                  rdir=4
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoNE
                  dir=1
                  ldir=1
                  rdir=0
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif       
         If dx<0 Then ; GoW
            dir=6
            key=36 ; Home key
            olddir=UO.GetDir()
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==0 Then ; GoWN
                  dir=7
                  ldir=7
                  rdir=0
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=4
                  rdir=5
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
      Endif
      If dx==0 AND dy<>0 Then
         If dy>0 Then ; GoS
            dir=4
            key=35 ; End
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==2 Then ; GoSE
                  dir=3
                  ldir=2
                  rdir=3
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=6
                  rdir=5
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif     
         If dy<0 Then ;GoN
            dir=0
            key=33 ; PgUp
            olddir=UO.GetDir()
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==2 Then ; GoNE
                  dir=1
                  ldir=1
                  rdir=2
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoWN
                  dir=7
                  ldir=7
                  rdir=6
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
      Endif
   Wend
end sub
sub StepEdit(x,y,dir,key)
   VAR walkwait=150
   VAR ErrLevel=0
   If UO.GetDir()<>dir Then
      UO.Press(key)
      wait(walkwait)
      If UO.GetDir()<>dir Then
         CheckLag()
      Endif
   Endif
   UO.Press(key)
   wait(walkwait)
   If x==UO.GetX() AND y==UO.GetY() Then
      CheckLag()
      If x==UO.GetX() AND y==UO.GetY() Then
         ;zatik
         ErrLevel=1
      Endif
   Endif
   Return ErrLevel
end sub
sub StepArrow(x,y,dir,ldir,rdir,key)
   VAR walkwait=150
   VAR ErrLevel=0
   If UO.GetDir()<>dir Then
      UO.Press(key)
      wait(walkwait)
      If UO.GetDir()<>dir AND UO.GetDir()<>ldir AND UO.GetDir()<>rdir Then
         CheckLag()
      Endif
   Endif
   If UO.GetX()==x AND UO.GetY()==y Then
      UO.Press(key)
      wait(walkwait)
      If UO.GetDir()==dir AND UO.GetX()==x AND UO.GetY()==y Then
         CheckLag()
         If UO.GetDir()==dir AND UO.GetX()==x AND UO.GetY()==y Then
            ;zatik         
            ErrLevel=1
         Endif
      Endif
   Endif
   Return ErrLevel
end sub
sub checklag()
   repeat
      UO.DeleteJournal()
      UO.Click('backpack')
   until backpack()==1
endsub
sub backpack()
   var n
   for n=0 to 200
      if uo.injournal('a backpack') then
         return 1
      endif
      wait(200)
   next
endsub
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Исправьте пожалуйста!

Post by Mirage »

Прелести работы с журналом.

Переделывать чтобы вместо сообщения проверял координату X у монсра.

Как то вот так:

Code: Select all

sub kill(mob)
   var n
   checklag()
   for n=0 to 100
      uo.attack(mob)
      repeat
         if uo.getdistance(mob)>1 then
            walkn(0,0,mob)
         else
            wait(100)
         end if
      until uo.dead() or uo.GetX(mob)==0
      if uo.injournal('Body of') then
         if corpser==1 then
            uo.waittargetobject('lastcorpse')
            wait(100)
            uo.usetype('0x0F51')
            wait(500)   
         endif
         return
      endif
      wait(1000)
   next
endsub
200790
Posts: 20
Joined: 2013-01-15 15:24:07

Re: Исправьте пожалуйста!

Post by 200790 »

Всё ровно....а может чар пытается порезать, а не полутать...ведь если убил не я рипера то по идее не открывает пак трупа?
Я журнал сфоткаю и пришлю что пишет...и после этого новую цель не ищет.
а если я убиваю и лутаю то норм
200790
Posts: 20
Joined: 2013-01-15 15:24:07

Re: Исправьте пожалуйста!

Post by 200790 »

Вот что происходит если убью не я моба...пытается полутать его и зацикливается.
а можно сделать что бы если 1 раз не получилось слутать то прекращал делать это?
Или какие варианты еще?
Image
200790
Posts: 20
Joined: 2013-01-15 15:24:07

Re: Исправьте пожалуйста!

Post by 200790 »

Помогите плиз.
новый появляется моб, а толку нет)
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Исправьте пожалуйста!

Post by Mirage »

А ну так написал бы что если убивает другой - лутать ты можешь через определенное время - это по дефолту но не на всех серверах работает.

Code: Select all

var j = 0
            for m=1 to loot[0]
               while uo.getquantity('<'+loot[m]) or j = 0
                  uo.moveitem('<'+loot[m])
                  wait(700)
                    if uo.injournal('loot this corpsw yet') then
                       j == 1
                    endif
               wend
            next

PS Писал на коленке, если работать не будет то вечером покажу как у меня это выглядит (значительно меньше строк с чуть чуть более широким функционалом).
200790
Posts: 20
Joined: 2013-01-15 15:24:07

Re: Исправьте пожалуйста!

Post by 200790 »

спасибо за старания-гениальный вы!
попробую сегодня, отпишусь.

А var j = 0 не было в скрипте, вписать нужно после строк ?)

Code: Select all

kill(mob)
uo.useobject('lastcorpse')
checklag()
wait(1000)



Не знаю ошибку пишет и указывает на строку while uo.getquantity('<'+loot[m]) or j = 0

тогда вечером буду ждать когда сможете подправить)

И еще...лутает почему то первые 2 наименования, гп например и бланк скроллы, а камушки-реги итд нехочет...может скорость большая?
200790
Posts: 20
Joined: 2013-01-15 15:24:07

Re: Исправьте пожалуйста!

Post by 200790 »

Да и еще правильно ли я понимаю что

Code: Select all

 while uo.getquantity('<'+loot[m])
                  uo.moveitem('<'+loot[m])
                  wait(2500)


то что в скобках это скорость лута?
изначально было 500 я на 2500 поменял.
или в скрипте нет скорости лута?
Envy
Posts: 30
Joined: 2012-12-26 11:37:25
Location: Киев
Contact:

Re: Исправьте пожалуйста!

Post by Envy »

Mirage wrote:А ну так написал бы что если убивает другой - лутать ты можешь через определенное время - это по дефолту но не на всех серверах работает.

Code: Select all

var j = 0
            for m=1 to loot[0]
               while uo.getquantity('<'+loot[m]) or j = 0
                  uo.moveitem('<'+loot[m])
                  wait(700)
                    if uo.injournal('loot this corpsw yet') then
                       j == 1
                    endif
               wend
            next

PS Писал на коленке, если работать не будет то вечером покажу как у меня это выглядит (значительно меньше строк с чуть чуть более широким функционалом).

Не работает. Покажите как должно быть, если можна. :oops:
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Исправьте пожалуйста!

Post by Mirage »

У меня старая убивалка выглядела вот так:

Code: Select all

sub KillIt()
   VAR MaxVes = 600
   VAR n=1
   var animal='0x000D'
   uo.ignorereset()
   
   Repeat
      uo.Set('finddistance', n)
      uo.FindType(animal, -1, 'ground')
      if uo.FindCount() then
         uo.resend()
         n=1
         uo.attack('finditem')
         repeat
            if uo.GetDistance('finditem') > 2 then
               walker(uo.GetX('finditem'),uo.GetY('finditem'),2)
            else
               wait(100)
            end if
         until uo.dead() or uo.GetX('finditem')==0
         wait(100)
         Loot()
      else
         n=n+1 ; если монстр не найден то увеличиваем радиус поиска
         if n>10 then
            n=1
         endif
      end if
      Loot()  ; лут
   Until uo.Dead() || UO.Weight > MaxVes
   hanthome() ; оттаскивает хабар домой.
end sub


А вот так не будет пытаться слутать не свой труп.

Code: Select all

Sub Loot()
   var a
   DIM G[4]
   G[0] = '0x0EED'; деньги
   G[1] = '0x0F7E';
   G[2] = '0x0E34';
   G[3] = '0x1F58';
   var body = '0x2006'
   var corpse
   UO.Set('quiet','1')
   uo.set('finddistance', '3')
   uo.findtype(body, -1, 'ground')
   if uo.findcount() and Uo.GetDistance( body ) < 4 then
      corpse = uo.getSerial('finditem')
      uo.deletejournal()
      uo.useobject(corpse)
      checklag()
      if NOT uo.injournal('loot this corpsw yet') then
         For a=0 to 3
            UO.FindType( G[a], -1, corpse )
            while UO.FindCount()
               uo.moveitem('finditem','0','backpack')
               wait(500)
               UO.FindType( G[a], -1, corpse )
            wend
         next
      endif
      UO.Hide(corpse)
      UO.Ignore(corpse)
   endif
   uo.Set('finddistance', 1)
   UO.Set('quiet','0')
endsub
Post Reply