FindMan

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
vertijok
Posts: 117
Joined: 2008-09-26 17:06:16
Contact:

FindMan

Post by vertijok »

Code: Select all

Sub FindMan()
uo.set('finddistance','20')
var serial, a, b
b=4
uo.ignorereset()
uo.ignore('self')
repeat
    if UO.InJournal("You have been revealed|You can't seem") then
      p=1
      DelTextInJournal("You have been revealed|You can't seem")
      uo.showjournal(20)
    endif
  if p==1 then
     p=0
      if not uo.hidden() then
        uo.warmode(0)
        uo.useskill("Hiding")
      endif
  else
    uo.findman(b)
    wait(500)
    if uo.findcount()>0 || uo.injournal('attacking you') then
      uo.print('ATAC')
      uo.print(uo.getname('finditem')+' '+str(uo.getdistance('finditem')))
      uo.forget('finditem')
      uo.exec('terminate all; exec GoBrit')
    endif
    wait(100)
  endif
  if b==4 then
    b=6
   else
    b=4
  endif
until uo.dead()
end sub
помогите что тут не так
vertijok
Posts: 117
Joined: 2008-09-26 17:06:16
Contact:

Re: FindMan

Post by vertijok »

vertijok wrote:

Code: Select all

Sub FindMan()
uo.set('finddistance','20')
var serial, a, b
b=4
uo.ignorereset()
uo.ignore('self')
repeat
    if UO.InJournal("You have been revealed|You can't seem") then
      p=1
      DelTextInJournal("You have been revealed|You can't seem")
      uo.showjournal(20)
    endif
  if p==1 then
     p=0
      if not uo.hidden() then
        uo.warmode(0)
        uo.useskill("Hiding")
      endif
  else
    uo.findman(b)
    wait(500)
    if uo.findcount()>0 || uo.injournal('attacking you') then
      uo.print('ATAC')
      uo.print(uo.getname('finditem')+' '+str(uo.getdistance('finditem')))
      uo.forget('finditem')
      uo.exec('terminate all; exec GoBrit')
    endif
    wait(100)
  endif
  if b==4 then
    b=6
   else
    b=4
  endif
until uo.dead()
end sub
помогите что тут не так
Так и не кто не поможет мне :(
Ever1x
Posts: 38
Joined: 2009-02-09 17:12:23

Post by Ever1x »

p=1 ....
You don't have Variable P in your script?
Could u describe your problem?
vertijok
Posts: 117
Joined: 2008-09-26 17:06:16
Contact:

Post by vertijok »

Ever1x wrote:p=1 ....
You don't have Variable P in your script?
Could u describe your problem?
А по руский можна а то я не незню англиский
Successful
Posts: 174
Joined: 2008-12-13 00:00:15

Post by Successful »

Лол)а он не знает русский)словарь в руки и переводи коль надо
vertijok
Posts: 117
Joined: 2008-09-26 17:06:16
Contact:

Post by vertijok »

Successful wrote:Лол)а он не знает русский)словарь в руки и переводи коль надо
в место того чтобы обзывайа лутше помог с проблемой
DreadLord
Posts: 42
Joined: 2009-02-28 15:02:09
Location: Украина
Contact:

Post by DreadLord »

Ever1x wrote:p=1 ....
You don't have Variable P in your script?
Could u describe your problem?


Говорит у тебя не объявлена переменная п.
Т.е. должно быть так:

Code: Select all

var serial, a, b, p
///
vertijok
Posts: 117
Joined: 2008-09-26 17:06:16
Contact:

Post by vertijok »

DreadLord wrote:
Ever1x wrote:p=1 ....
You don't have Variable P in your script?
Could u describe your problem?


Говорит у тебя не объявлена переменная п.
Т.е. должно быть так:

Code: Select all

var serial, a, b, p
спс сечас проверим
vertijok
Posts: 117
Joined: 2008-09-26 17:06:16
Contact:

Re: FindMan

Post by vertijok »

vertijok wrote:
vertijok wrote:

Code: Select all

Sub FindMan()
uo.set('finddistance','20')
var serial, a, b, p
b=4
uo.ignorereset()
uo.ignore('self')
repeat
    if UO.InJournal("You have been revealed|You can't seem") then
      p=1
      DelTextInJournal("You have been revealed|You can't seem")
      uo.showjournal(20)
    endif
  if p==1 then
     p=0
      if not uo.hidden() then
        uo.warmode(0)
        uo.useskill("Hiding")
      endif
  else
    uo.findman(b)
    wait(500)
    if uo.findcount()>0 || uo.injournal('attacking you') then
      uo.print('ATAC')
      uo.print(uo.getname('finditem')+' '+str(uo.getdistance('finditem')))
      uo.forget('finditem')
      uo.exec('terminate all; exec GoBrit')
    endif
    wait(100)
  endif
  if b==4 then
    b=6
   else
    b=4
  endif
until uo.dead()
end sub
помогите что тут не так
Так и не кто не поможет мне :(
мне сказали что етот кусок скрипта написано криво исправти плиз что тут не правельна шард ДРВ заране спасиба
DreadLord
Posts: 42
Joined: 2009-02-28 15:02:09
Location: Украина
Contact:

Post by DreadLord »

Тут наверно будет легче заного написать. Что тебе нужно?

1. Если задетектили, то в хайд
2. Если атачат - стоп скрипт и идем в бриту
правильно?
///
vertijok
Posts: 117
Joined: 2008-09-26 17:06:16
Contact:

Post by vertijok »

DreadLord wrote:Тут наверно будет легче заного написать. Что тебе нужно?

1. Если задетектили, то в хайд
2. Если атачат - стоп скрипт и идем в бриту
правильно?
можна и без хайда проста если чар увидел пк иле криминала то он бежыт в брит да и если его атачит то тоже бежыт в брит и всё больше нечего лишнего
GAUHAR
Posts: 137
Joined: 2006-11-06 21:45:23

Post by GAUHAR »

Боюсь тебя разачаровать, но исправить эту процедуру давольно-таки сложно, так как по моему мнению она скорее всего запускается из основного скрипта и работает парллельно ему, так как в представленном куске скрипта есть несколько переменных смысл которых не понятен могу предложить вариант без них:

Code: Select all

Sub FindMan()
   UO.Set('finddistance','20')
   UO.IgnoreReset()
   UO.Ignore('self')
   DelTextInJournal("attacking you")
   repeat
      UO.FindMan()
      if UO.FindCount() or UO.InJournal('attacking you') then
         UO.Print('ATAC')
         UO.Print(UO.GetName('finditem') + ' ' + str(UO.GetDistance('finditem')))
         UO.Forget('finditem')
         UO.Exec('terminate all; exec GoBrit')
      endif
      if not UO.Hidden() then
         DelTextInJournal("You have hidden")
         DelTextInJournal("You can't seem")
         UO.WarMode(0)
         UO.UseSkill("Hiding")
         while not UO.Hidden() or not UO.InJournal("You have hidden|You can't seem")
            wait(100)
         wend
         UO.ShowJournal(20)
      endif
      wait(100)
   until UO.Dead()
endsub

Но все равно вероятность сбежать от ПК или кого-либо еще остается 50/50. А также при повторном перезапуске всего скрипта твой чар будет вечно стрематься несуществующего персонажа от которого он убегал, так как UO.Forget('finditem') стопроцентно работает только в случае если удаляемый предмет не перемещается и не поворачивается (в общем стоит на месте) или невиден из-за растояния поиска, а в случае с реальным игроком это мало вероятно, потому что пока твой персонаж добежишь до портала в Брит подозрительная личность наверняка сделает хоть один шаг.
Вроде объяснил развернуто, но без всего скрипта решить проблему невозможно.
Плин пока писал ))) тут накомментили не мало )))
vertijok
Posts: 117
Joined: 2008-09-26 17:06:16
Contact:

Post by vertijok »

GAUHAR wrote:Боюсь тебя разачаровать, но исправить эту процедуру давольно-таки сложно, так как по моему мнению она скорее всего запускается из основного скрипта и работает парллельно ему, так как в представленном куске скрипта есть несколько переменных смысл которых не понятен могу предложить вариант без них:

Code: Select all

Sub FindMan()
   UO.Set('finddistance','20')
   UO.IgnoreReset()
   UO.Ignore('self')
   DelTextInJournal("attacking you")
   repeat
      UO.FindMan()
      if UO.FindCount() or UO.InJournal('attacking you') then
         UO.Print('ATAC')
         UO.Print(UO.GetName('finditem') + ' ' + str(UO.GetDistance('finditem')))
         UO.Forget('finditem')
         UO.Exec('terminate all; exec GoBrit')
      endif
      if not UO.Hidden() then
         DelTextInJournal("You have hidden")
         DelTextInJournal("You can't seem")
         UO.WarMode(0)
         UO.UseSkill("Hiding")
         while not UO.Hidden() or not UO.InJournal("You have hidden|You can't seem")
            wait(100)
         wend
         UO.ShowJournal(20)
      endif
      wait(100)
   until UO.Dead()
endsub

Но все равно вероятность сбежать от ПК или кого-либо еще остается 50/50. А также при повторном перезапуске всего скрипта твой чар будет вечно стрематься несуществующего персонажа от которого он убегал, так как UO.Forget('finditem') стопроцентно работает только в случае если удаляемый предмет не перемещается и не поворачивается (в общем стоит на месте) или невиден из-за растояния поиска, а в случае с реальным игроком это мало вероятно, потому что пока твой персонаж добежишь до портала в Брит подозрительная личность наверняка сделает хоть один шаг.
Вроде объяснил развернуто, но без всего скрипта решить проблему невозможно.
Плин пока писал ))) тут накомментили не мало )))
плиз помоги а то не магу копать норм постояна крэш происходит

Code: Select all

################################################################
### Переменные #################################################
################################################################
###
### Для начала подготовится, положить в банк мешок(bag) и такой же в MageChest
### В мешки положить реги рекола Black Pearl, Mandrake Root, Blood Moss
### Самое главное выяснить Серийник банка!!!
### В банк положить руны к дому(одного типа!!! Тип рун в банке и в MageChest должны совпадать!!!)
### Положить в MageChest Руны в шахту(одного типа)
###
################################################################
################################################################
################################################################

var kirka, a, name, run, MageChest
var myXX, myYY, p
p=0

### ID друзей для игнора при поиске ПК и Криминал
var Charon='0x00324C05'
var Buiok='0x000C430F'
var friend3='0x001EEB63'

var x, y, coord
var MCave='2558,501-2578,476'      ; диапозон координат пещеры
var BankBrit='1446,1702-1421,1671'   ; диапозон координат Банка в Брите
var Home='1829,786-1843,800'      ; диапозон координат Дома

var kalitka='0x0847'       ; Тип закрытой калитки
var door='0x06A5'      ; тип закрытой двери в дом

var OreBox, bag, bankbox, rune, CraftChest
var bagreg, chest
bag='0x0E76'         ;тип мешка с регами
bankbox='0x40355E29'      ;Id банка (для того, что бы узнать ID банка, командой ",info" -
            ;- на любой предмет и скопировать из полученной информации -
            ;- значение C= -> 0x40156896 <-
 
rune='0x1F14'         ; Тип руны может быть 2-х типов
            ; '0x1F14' и '0x1F15'

CraftChest='0x402C32D2'      ; Сундук Крафта с паками под руду и инготы

MageChest='0x402B6E6A'      ; Сундуг Мага с паками и мешком-с-регами для Рекола

kirka = "0x0E86"       ;Тип кирки. 2 вида может "0x0E85" и "0x0E86"

OreBox = "0x4050B366"      ;Контейнер для руды

var text1, text2

text1="There is no ore|You have no line|That is to far away|You can't think|You have no line of|too far away|mining in rock."

text2="You put the|You loosen some|You can't think|That is to far away|There is no ore|You have no line of|too far away|mining in rock."

run=118            ; Код клавиши с биндом "AlwesRun"

################################################################
###Функция Main ##########################################
################################################################
sub main()
  uo.exec("exec ressurect")
  uo.exec("exec FindMan")
  uo.exec("exec mine")
end sub

sub r()
var r=uo.getrun('self')
uo.print(str(r))
end sub

################################################################
### Функция mine ############################################
################################################################
sub mine()      ; Kopania
  uo.ignorereset()
  walker(2578,480,1)
  var pause=0
  myXX=uo.getX(); zapominaet mesto otkuda nacel kopati
  myYY=uo.getY();
  var PX, PY, PZ, IX, IY
  PX = UO.GetX()
  PY = UO.GetY()
  PZ = UO.GetZ()
  while UO.Weight<=uo.str*4
    For Iy=-4 to 4
      For Ix=-4 to 4
        uo.deletejournal()
        while not UO.InJournal(text1) && uo.weight<=uo.str*4
          if p==1 then
            if not uo.hidden() then
              InJournal('You have hidden',60)
            endif
          endif
          UO.WaitTargetTile(-1,Str(PX+Ix),Str(PY+Iy),Str(PZ))
          uo.usetype(kirka)
          InJournal(text2,0)
          if uo.injournal('You loosen some') then
            pause=pause+1
            if pause>4 then
              wait(10000)
              pause=0
            endif
          else
            pause=0
          endif
        endif
        wait(200)
      wend
    next
    wait(200)
  next
  wait(200)
wend
uo.exec('exec GoBrit')
end sub
################################################################
###### FindMan #################################################
################################################################
Sub FindMan()
uo.set('finddistance','20')
var serial, a, b, p
b=4
uo.ignorereset()
uo.ignore('self')
repeat
    if UO.InJournal("You have been revealed|You can't seem") then
      p=1
      DelTextInJournal("You have been revealed|You can't seem")
      uo.showjournal(20)
    endif
  if p==1 then
     p=0
      if not uo.hidden() then
        uo.warmode(0)
        uo.useskill("Hiding")
      endif
  else
    uo.findman(b)
    wait(500)
    if uo.findcount()>0 || uo.injournal('attacking you') then
      uo.print('ATAC')
      uo.print(uo.getname('finditem')+' '+str(uo.getdistance('finditem')))
      uo.forget('finditem')
      uo.exec('terminate all; exec GoBrit')
    endif
    wait(100)
  endif
  if b==4 then
    b=6
   else
    b=4
  endif
until uo.dead()
end sub

################################################################
### Функция GoBrit ############################################
################################################################
Sub GoBrit()
uo.exec('terminate mine')
uo.ignorereset()
uo.press(run)
wait(50)
uo.press(35)
 if uo.getrun()==0 then
  uo.press(run)
 endif
walker(2581,480,0)
wait(50)
uo.press(35)
wait(50)
uo.press(35)
wait(50)
uo.press(run)
uo.press(35)
wait(50)
 if uo.getrun()==1 then
  uo.press(run)
 endif
walker(1433,1693,1)
wait(5000)
coord=GetXY('self')
if ComXY(BankBrit,coord)==true then
uo.exec('terminate FindMan; exec GoHome')
else
GoBrit()
endif
end sub

sub GoHome()
OpenChest()
wait(1000)
GotoHomeT()
move()
wait(5000)
OpenChest()
wait(2000)
uo.exec('terminate all; exec main')
end sub

################################################################
### Функция OpenChest #########################################
################################################################
sub OpenChest()
uo.findtype('0x0E42',-1,'ground')
if uo.findcount()>0 then
  uo.useobject(MageChest)
  chest=MageChest
else
  uo.sayu(' bank ')
  chest=bankbox
endif
wait(1000)
CheckLag()
uo.findtype(bag,-1,chest)
bagreg=uo.getserial('finditem')
uo.useobject(bagreg)
wait(1000)
CheckLag()
FindRune(chest)
end sub

################################################################
### Функция FindRune ##########################################
################################################################
sub FindRune(b)
var idrune
uo.findtype(rune,-1,b)
idrune=uo.getserial('finditem')
Cast(idrune)
end sub

################################################################
### Функция Cast(rune) ############################################
################################################################
Sub Cast(rune)
var a
coord=GetXY('self')
if ComXY(Home,coord)==true then
  a=true
 else
  a=false
endif
MoveReg(bagreg)
var mana
if uo.bm>0 && uo.bp>0 && uo.mr>0 then
cast:
  if uo.mana < 20 then
    med()
    wait(2000)
    goto cast
  endif
    mana = uo.mana
    uo.cast('Recall',rune)
    DelTextInJournal("fizzle")
    while mana <= uo.mana
      wait(200)
    wend
    if ComXY(MCave,coord)==false then
     if ComXY(Home,coord)==a then
     wait(1000)
     CheckLag()
     if uo.injournal("fizzle") then
      MoveReg(bagreg)
      goto cast
     endif
      wait(200)
     endif
    endif
else
  uo.print('Stop')
  uo.closeuo()
endif
wait(1000)
end sub

################################################################
### Функция Move reg ##########################################
################################################################
sub MoveReg(id)
   uo.print('Move Reagents')
   var a
   dim reg[3]
      reg[0] = "0x0F7A"   ;Black Pearls
      reg[1] = "0x0F7B"   ;Blood Moss
      reg[2] = "0x0F86"   ;Mandrake Roots
   for a=0 to 2
      if uo.count(reg[a])<1 then
         uo.findtype(reg[a],-1,id)
         uo.moveitem('finditem',2,'backpack')
         wait(700)
         CheckLag()
      endif
   next
endsub

################################################################
### Функция-массив Регов ######################################
################################################################
Sub mreg(reg)
reg[0] = "0x0F7A"       ;Black Pearls
reg[1] = "0x0F7B"       ;Blood Moss
reg[2] = "0x0F86"       ;Mandrake Roots
return reg
end sub

################################################################
### Функция meditation #######################################
################################################################
sub med()
uo.print('Meditation')
while uo.mana < uo.int
  UO.UseSkill("Meditation")
  injournal("You are at peace|You lose your concentration",60)
wend
end sub

################################################################
### Функция Goto Home #########################################
################################################################
sub GotoHomeT()
  uo.set('finddistance',4)
  uo.print('Go to Home')
  if type(kalitka)==true then
    uo.press(121)
    CheckLag()
  else
    wait(200)
  endif
 walker(1831,797,0)
  uo.press(121)
  CheckLag()
  if type(kalitka)==false then
 walker(1831,798,0)
    uo.press(121)
    CheckLag()
  endif
  wait(200)
 walker(1836,798,0)
  if type(door)==true then
    uo.press(121)
    CheckLag()
  else
    wait(200)
  endif
 walker(1836,794,0)
  uo.press(121)
  CheckLag()
  wait(500)
  if type(door)==false then
    uo.press(121)
    CheckLag()
  else
    wait(200)
  endif
  CheckLag()
end sub

Sub type(tip)
uo.findtype(tip,-1,'ground')
if uo.findcount()>0 then
  return true
else
  return false
endif
end sub

################################################################
### Функция MoveOre ##########################################
################################################################
sub move()
uo.useobject(CraftChest)
CheckLag()
uo.print('MOVEORE()')
wait(2000)
var e
dim a[4]
a[0] = 0x19B7
a[1] = 0x19BA
a[2] = 0x19B8
a[3] = 0x19B9
uo.useobject(OreBox)
CheckLag()
for e = 0 to 3
  repeat
    uo.findtype(a[e],-1,'backpack')
    uo.moveitem('finditem',0,OreBox)
    wait(900)
    CheckLag()
  until uo.findcount()==0
next
wait(1000)
MoveHi()
end sub

Sub MoveHi()
var Chest, OreBox, HiOreBox
Chest='0x402C32D2'
OreBox = "0x4050B366"   ;Контейнер для руды
HiOreBox = "0x4050B362"   ;Контейнер для "выхи"
var e, c

dim a[4],x[19]
a[0] = 0x19B9      ;4 and more ore
a[1] = 0x19B7      ;1 ore
a[2] = 0x19BA      ;2 ore
a[3] = 0x19B8      ;3 ore

x[0] = '0x09B9'      ;Acid ore
x[1] = '0x09A4'      ;Cristaline ore
x[2] = '0x0085'      ;Dragon ore
x[3] = '0x09D3'      ;Steel ore
x[4] = '0x09E6'      ;Elvin ore
x[5] = '0x09F0'      ;Gorgan ore
x[6] = '0x008F'      ;Send rock ore
x[7] = '0x04C2'      ;Blood rock ore
x[8] = '0x09DA'      ;Vulcan ore
x[9] = '0x0028'      ;Obsidian ore
x[10] = '0x08AF'   ;Plutonium ore
x[11] = '0x09EC'   ;Blood crest ore
x[12] = '0x0455'   ;Black rock ore
x[13] = '0x010F'   ;Krynite ore
x[14] = '0x0BA7'   ;Eldar ore
x[15] = '0x00CE'   ;Valorite ore
x[16] = '0x052D'   ;Mitheril ore
x[17] = '0x07D5'   ;Verite ore
x[18] = '0x0060'   ;Aqua ore
uo.useobject(HiOreBox)
wait(700)
CheckLag()
for e=0 to 3
  for c=0 to 18
    repeat
        uo.findtype(a[e],x[c],OreBox)
      if uo.findcount()>0 then
        uo.moveitem('finditem',0,HiOreBox)
        CheckLag()
        wait(400)
      endif
      wait(100)
    until uo.findcount()==0
  next
next
end sub

sub ressurect()
repeat
  ; ©dark_kynep
  if UO.Life < 1 then
    uo.useobject('self')
    CheckLag()
    uo.warmode(0)
    UO.LClick(977,56)
    CheckLag()
    wait(1000)
    UO.LClick(267,309)
    CheckLag()
    wait(1000)
    UO.LClick(172,200)
    CheckLag()
    wait(1000)
    walker(2468,531,1)
    uo.useobject('0x4001D120')
    CheckLag()
    walker(2466,542,0)
    CheckLag()
    walker(2506,542,0)
    Alive()
  else
    wait(1000)
    ; UO.Print("You are Alive!!!")
  endif
until uo.dead()
end sub

Sub Alive()
OpenChest()
GotoHomeT()
Heal()
OpenChest()
uo.exec('terminate all; exec main')
end sub

sub Heal()
uo.useobject('0x4023D30F')
CheckLag()
wait(500)
uo.findtype('0x0E21',-1,'0x4023D30F')
uo.moveitem('finditem',10,'backpack',10,10,0)
CheckLag()
wait(500)
repeat
  uo.bandageself()
  wait(5000)
until uo.life==uo.str
wait(500)
uo.useobject(CraftChest)
CheckLag()
wait(500)
uo.findtype(kirka,-1,CraftChest)
uo.moveitem('finditem',1,'backpack',100,10,0)
CheckLag()
wait(500)
end sub

################################################################
### Функция паузы по проверке журнала или таймера ########
################################################################
Sub InJournal(t,time)
;uo.print('EXEC INJOURNAL(T,TIME)')
var timer=uo.timer()
DelTextInJournal(t)
if time==0 then
  ;uo.print('TIME==0')
  while not uo.InJournal(t)
    wait(200)
  wend
else
  ;uo.print('TIME<>0')
  while not uo.InJournal(t) && uo.timer()<timer+time
    wait(200)
  wend
endif
end sub

################################################################
### Функция удаления из журнала Текста ########################
################################################################
Sub DelTextInJournal(msg) ; msg это параметр, см. выше как его передают
var nom=UO.InJournal(msg) ; ищем сообщение и в переменную его
if nom>0 then
  UO.SetJournalLine(Nom - 1," ") ; подменим сообщение
  DelTextInJournal(msg) ; вызов функцией самой себя, рекурсия
endif
end sub

################################################################
### Функция отклик сервера ###############################
################################################################
Sub CheckLag()
DelTextInJournal("backpack") ; вытрим ТОЛЬКО нужные нам сообщения в журнале
UO.Click('backpack') ; одиночный клик по вашему backpack
InJournal("backpack",0)
end sub

################################################################
### Функция World save now ####################################
################################################################
Sub ws()
if uo.injournal("World is saving now...") then
  InJournal("World data saving",1800)
endif
end sub


########################################## ХОДИЛКА 3 ##########################
#var Prec=3 # Как близко следует подойти к цели (Precision)
#var MaxTraceDistance=15 # Максимальная длина обхода. Желательно ставить с расчета возможных препятсвий. Если ставить очень #большие числа, кодилка может пойти в обход пол мира чтобы дойти к соседнему дереву.
#var Speed=2 # Длина шага. Сколько шагов делать за раз. Выше 3 ставить смысла нет. Тоесть тупое умножение шагов. Для ламбера #идеально 3, для майнинга - 1.
#var StepTimeOut=400 # Если уперлись в неопознанный обьект, сколько мсек ждать сдвига с места. Если по простому - таймаут #шага. Если поставить сильно маленькие, ходилка начнет трассировать пустые места.
#UO.SetGlobal("Logging","1")  # - показывать отладочные сообщения.
#UO.SetGlobal("BlindWalk","0") # - не использовать проверку тайлов, а использовать ходьбу наощупь. Для майнинга ОБЯЗАТЕЛЬНО #ВКЛЮЧИТЬ.
#В функции IsPass, содержиться список проходимых тайлов.

#Walker(X,Y,Prec) - идем к цели с координатами X,Y. Возвращает 1 в случае успешного достижения цели, и 0 - при невозможном обходе (путь не найден)
#Tracer(StartDir,Direction) - трассировка 1 шага. Возвращает направление по которому получилось сдвинуться с места. StartDir #- направление последнего движения, Direction (-1 или +1) направление обхода. -1 - по часовой стрелке, +1 против часовой #стрелки. Направления скрипт использует личного формата:
#1 - влево вниз
#2 - вниз
#3 - вправо вниз
#4 - вправо
#5 - вправо вверх
#6 - вверх
#7 - влево вверх
#8 - влево
#Tracer(StartDir,Direction) - идеально подходит для рыбалки вдоль берега так как она будет обходить берег бесконечно (1 #запуск функции = 1 шаг обхода).
#####################################################
# WW  W  WW   AA    LL     Kk KK  EE  EE  RRR       #
# WW  W  WW  AA A   LL     Kk K   EEE     R  R      #
# WW  W  WW  AA A   LL     KKK    EEEEE   R R       #
# WW WW  WW  AAAA   LL     KKK    EEE     RRR       #
#  WWW WWW  AA   A   LLLL  KK Kk  EE  EE  R  RR     #
####################################################
var MaxTraceDistance=10
var TraceLoopIncrease=5 #Увеличение MaxTraceDistance при исчерпании количества ходов
var LimitTrace=20 #Сколько шагов в ОБЕ стороны от начальной точки обхода прекращают ходилку (выхода нет).
var Speed=1
var StepTimeOut=600 #Таймаут шага. Устанавливать не в размер пинга, а в размер шага + размер пинга.
# Для ходьбы - 500+Ping
# Для бега/ходьбы на лошади - 300+Ping
# Бег на лошади - 150 + Ping

var CheckCnt=2 #Количество слепых проверок. УВЕЛИЧИВАЕТ В СТОЛЬКО РАЗ ТАЙМАУТ. Использовать только на БЫСТРОМ но НЕСТАБИЛЬНОМ коннекте. При большом пинге будет УЖАС.
var DynamicPause=30 #Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора.

Sub Walker(GoX,GoY,Prec)
uo.warmode(0)
UO.SetGlobal("Logging","0")
UO.SetGlobal("BlindWalk","0")
var LastDir
var MoveRes
var TracerCnt
UO.SetGlobal("GlobalGoX",str(GoX))
UO.SetGlobal("GlobalGoY",str(GoY))
while not IsEnd(GoX,GoY,Prec)
  TracerCnt = MaxTraceDistance
  repeat
    LogInfo('Just walking')
    LastDir=GoUntilHit(GoX,GoY,Prec)
   
    if IsEnd(GoX,GoY,Prec) then
      return 1
    end if
   
    LogInfo('Tracing')
    MoveRes = FullAroundTrace(LastDir,GoX,GoY,Prec,TracerCnt)
    if TracerCnt > LimitTrace then
      return 0
    endif
    TracerCnt = TracerCnt + TraceLoopIncrease
  until MoveRes == 1
wend
return 1
end sub

Sub FullAroundTrace(StartDir,GoX,GoY,Prec,MaxTrace)
var LineX=UO.GetX()
var LineY=UO.GetY()
var CurDir=StartDir
var Direction=CountDirection(GoX,GoY,CurDir,Prec)
var StartX,StartY
var MovesDone=0
repeat
  StartX=UO.GetX()
  StartY=UO.GetY()
  CurDir=Tracer(CurDir,Direction,Prec)
  if (CurDir==GetDir(GoX,GoY,Prec)) then
    return 1
  endif
  if MovesDone>0 and PrevMoveCross(GetDirToDir(UO.GetDir(),Prec),LineX,LineY,GoX,GoY,StartX,StartY,Prec) then
    return 1
  end if
  MovesDone=MovesDone+1
  CurDir=AddToDir(CurDir,-Direction,Prec)
until MovesDone>MaxTrace
return 0
end sub

Sub CountDirection(GoX,GoY,StartDir,Prec)
var GoDir=GetDir(GoX,GoY,Prec)
var MyX=UO.GetX()
var MyY=UO.GetY()
if GoDir<StartDir then
  return -1
end if
if GoDir>StartDir then
  return 1
end if
if Abs(MyX-GoX)>Abs(MyY-GoY) then
  if (GoDir==3 and GoY>MyY) OR (GoDir==7 and GoY<MyY) then
    return -1
  else
    return 1
  end if
else
  if (GoDir==1 and GoX<MyX) or (GoDir==5 and GoX>MyX) then
    return -1
  else
    return 1
  end if
end if
end sub

Sub PrevMoveCross(Dir,x1,y1,x2,y2,StartX,StartY,Prec)
var x3,y3,x4,y4
x3=StartX
y3=StartY
x4=StartX+(XFromDir(Dir)-StartX)*Speed
y4=StartY+(YFromDir(Dir)-StartY)*Speed
return LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec)
end sub

Sub LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec)
if x1==x3 and y1==y3 then
  return false
end if
var z1=(x3-x1)*(y2-y1)-(y3-y1)*(x2-x1)
var z2=(x4-x1)*(y2-y1)-(y4-y1)*(x2-x1)
if z1*z2>0 then
  return false
else
  LogInfo('Vector info:')
  LogInfo('x1= '+str(x1))
  LogInfo('y1= '+str(y1))
  LogInfo('x2= '+str(x2))
  LogInfo('y2= '+str(y2))
  LogInfo('x3= '+str(x3))
  LogInfo('y3= '+str(y3))
  LogInfo('x4= '+str(x4))
  LogInfo('y4= '+str(y4))
  return true
end if
end sub

Sub IsDiap(X,X0,X1,Prec)
if X<=X0+Prec and X>=X1-Prec OR X>=X0-Prec and X<=X1+Prec then
  return true
end if
return false
end sub

Sub GoUntilHit(GoX,GoY,Prec)
var LastDir
LastDir=GetDir(GoX,GoY,Prec)
var CouldMove
repeat
  LastDir=GetDir(GoX,GoY,Prec)
  if LastDir<>0 and not IsEnd(GoX,GoY,Prec) then
    CouldMove=TryDir(LastDir,Prec)
  end if
until LastDir==0 or IsEnd(GoX,GoY,Prec) or not CouldMove
return LastDir
end sub

Sub IsEnd(GoX,GoY,Prec)
if Abs(UO.GetX()-GoX)<=Prec and Abs(UO.GetY()-GoY)<=Prec then
  LogInfo('END FOUND')
  return true
else
  return false
end if
end sub

Sub GetDir(GoX,GoY,Prec)
var MyX=UO.GetX()
var MyY=UO.GetY()
var DiffX=Abs(UO.GetX()-GoX)
var DiffY=Abs(UO.GetY()-GoY)
var GoDir=0
if (DiffX/(DiffY+0.1))>=2 then
  if (MyX>GoX) then
    GoDir=7
  else
    GoDir=3
  end if
else
 
  if (DiffY/(DiffX+0.1))>=2 then
    if (MyY>GoY) then
      GoDir=5
    else
      GoDir=1
    end if
  else
   
    if (MyX>GoX) and (MyY>GoY) then
      GoDir=6
    else
      if (MyX>GoX) and (MyY<GoY) then
        GoDir=8
      else
        if (MyX<GoX) and (MyY>GoY) then
          GoDir=4
        else
          if (MyX<GoX) and (MyY<GoY) then
            GoDir=2
          end if
        end if
      end if
    end if
  end if
end if
return GoDir
end sub

Sub Tracer(StartDir,Direction,Prec)
var CurDir=StartDir
var Result
repeat
  Result=TryDir(CurDir,Prec)
  if not Result then
    CurDir=AddToDir(CurDir,Direction,Prec)
  end if
until Result
return Result
end sub

Sub AddToDir(Dir,Cnt,Prec)
var NewDir=Dir
NewDir=NewDir+Cnt
while NewDir>8
  NewDir=NewDir-8
wend
while NewDir<1
  NewDir=NewDir+8
wend
return NewDir
end sub

Sub TryDir(Dir,Prec)
var BegX=UO.GetX() # Ia?aeuiia O
var BegY=UO.GetY() # Ia?aeuiia Y
var Counter=0
var GoX=BegX
var GoY=BegY
GoX=XFromDir(Dir)
GoY=YFromDir(Dir)
if not IsPass(GoX,GoY) then
  LogInfo(str(GoX)+':'+str(GoY)+' is not passable')
  return false
end if
return TurnAndGoDir(Dir,Prec)
end sub

Sub XFromDir(Dir)
if Dir==2 OR Dir==3 Or Dir==4 then
  return (UO.GetX()+1)
end if
if Dir==6 OR Dir==7 Or Dir==8 then
  return (UO.GetX()-1)
end if
return (UO.GetX())
end sub

Sub YFromDir(Dir)
if Dir==8 OR Dir==1 Or Dir==2 then
  return (UO.GetY()+1)
end if
if Dir==4 OR Dir==5 Or Dir==6 then
  return (UO.GetY()-1)
end if
return (UO.GetY())
end sub

Sub TurnAndGoDir(Dir,Prec)
var StartDir=GetDirToDir(UO.GetDir(),Prec)
var StartX=UO.GetX()
var StartY=UO.GetY()
var EndDir
var Counter=0
var TestCounter=CheckCnt

#Direction Test
repeat
  Counter = 0
  LogInfo('Dir: '+str(StartDir)+' Counter: '+str(Counter))
  PressDir(Dir)
  repeat
    EndDir=GetDirToDir(UO.GetDir(),Prec)
    wait(DynamicPause)
    Counter=Counter+1
  until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause
  TestCounter = TestCounter - 1
  LogInfo('Dir: '+str(EndDir)+' Counter: '+str(Counter))
until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause

if Counter>=StepTimeOut/DynamicPause  then
  LogInfo('Direction timeout reached')
  return 0
end if
#End direction Test

if StartY<>UO.GetY() or StartX<>UO.GetX() then
  return Dir
end if

#Start Primary test
TestCounter=CheckCnt
repeat
  GoDir(Dir,Prec)
  Counter=0
  repeat
    wait(DynamicPause)
    Counter=Counter+1
  until StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause
  TestCounter = TestCounter - 1
until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause
#End primary test

if Counter>=StepTimeOut/DynamicPause then
  LogInfo('Step timeout reached')
  return 0
else
  return Dir
end if
end sub

Sub GetDirToDir(GotDir,Prec)
var ChangedDir=-GotDir
ChangedDir=AddToDir(ChangedDir,5,Prec)
return ChangedDir
end sub

Sub DirToInj(Dir)
dim Dirs[9]
Dirs[1]=1
Dirs[2]=2
Dirs[3]=3
Dirs[4]=6
Dirs[5]=9
Dirs[6]=8
Dirs[7]=7
Dirs[8]=4

return (Dirs[Dir])
end sub

Sub PressDir(Dir)
dim Dirs[9]
Dirs[1]=35
Dirs[2]=40
Dirs[3]=34
Dirs[4]=39
Dirs[5]=33
Dirs[6]=38
Dirs[7]=36
Dirs[8]=37

UO.Press(Dirs[Dir],1)
end sub

Sub GoDir(Dir,Prec)
dim Dirs[9]
Dirs[1]=35
Dirs[2]=40
Dirs[3]=34
Dirs[4]=39
Dirs[5]=33
Dirs[6]=38
Dirs[7]=36
Dirs[8]=37

var DistanceX=Abs(UO.GetX()-val(UO.GetGlobal("GlobalGoX")))
var DistanceY=Abs(UO.GetY()-val(UO.GetGlobal("GlobalGoY")))
var GoDistance
if (DistanceX-Prec)<Speed then
  GoDistance=DistanceX-Prec
else
  if (DistanceY-Prec)<Speed then
    GoDistance=DistanceY-Prec
  else
    GoDistance=Speed
  endif
endif

UO.Press(Dirs[Dir],GoDistance)
end sub

Sub IsPass(X,Y)
if UO.GetGlobal("BlindWalk") then
  return true
endif

dim Types[60]
Types[1]=3
Types[2]=25
Types[3]=51
Types[4]=63
Types[5]=113
Types[6]=140
Types[7]=172
Types[8]=219
Types[9]=232
Types[10]=235
Types[11]=239
Types[12]=243
Types[13]=248
Types[14]=251
Types[15]=264
Types[16]=267
Types[17]=282
Types[18]=289
Types[19]=321
Types[20]=379
Types[21]=420
Types[22]=440
Types[23]=476
Types[24]=499
Types[25]=513
Types[26]=542
Types[27]=578
Types[28]=586
Types[29]=622
Types[30]=700
Types[31]=804
Types[32]=1740
Types[33]=1758
Types[34]=1770
Types[35]=1779
Types[36]=1779
Types[37]=1881
Types[38]=1886
Types[39]=1801
Types[40]=1805
Types[41]=1813
Types[42]=1820
Types[43]=1831
Types[44]=1833
Types[45]=1843
Types[46]=1850
Types[47]=1873
Types[48]=1876
Types[49]=1885
Types[50]=1888
Types[51]=1946
Types[52]=1969
Types[53]=2500
Types[54]=2539

for var i=1 TO 53 STEP 2
  if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then
    return true
  end if
next
return false
end sub

Sub LogInfo(Line)
if not UO.GetGlobal("Logging")=="0" then
  UO.TextOpen()
  UO.TextPrint(str(UO.GetX())+":"+str(UO.GetY())+" - "+Line);
end if
end sub

Sub Abs(X)
if X>0 then
  return X
else
  return (-X)
end if
end sub
##########################################

Sub GetXY(man)
var xy
x=uo.getx(man)
y=uo.gety(man)
xy=str(x)+','+str(y)
return xy
end sub

Sub ComXY(coordinate,coord)
var myx, myy, x1, y1, L, pref, minx, maxx, miny, maxy
L=len(coordinate)
;uo.print('Длина строки = '+str(L))
;wait(100)
 x1=XY(coordinate,'-',0)
;uo.print('Координаты а: '+x1)
;wait(100)
 y1=XY(coordinate,'-',1)
;uo.print('Координаты б: '+y1)
;wait(100)
 minx=XY(x1,',',0)
;uo.print('Координата minx: '+minx)
;wait(100)
 miny=XY(x1,',',1)
uo.print('Координата miny: '+miny)
wait(100)
 maxx=XY(y1,',',0)
;uo.print('Координата maxx: '+maxx)
;wait(100)
 maxy=XY(y1,',',1)
;uo.print('Координата maxy: '+maxy)
;wait(100)
 myx=XY(coord,',',0)
;uo.print('Координата myx: '+myx)
;wait(1000)
 myy=XY(coord,',',1)
;uo.print('Координата myy: '+myy)
 if minx>maxx then
   x=minx
;uo.print('X1=MinX='+x1)
;wait(100)
   minx=maxx
;uo.print('MinX=MaxX='+minx)
;wait(100)
   maxx=x
;uo.print('maxx=x1='+minx)
;wait(100)
 endif
 if miny>maxy then
   y=miny
;uo.print('Y1=MinY='+y)
;wait(100)
   miny=maxy
;uo.print('MinY=MaxY='+miny)
;wait(100)
   maxy=y
;uo.print('maxy=y1='+maxy)
;wait(100)
 endif
; wait(100)
 if myx>minx && myx<maxx && myy>miny && myy<maxy then
   return true
  else
   return false
 endif
end sub

Sub XY(con,d,c)
var pref, L, z
 L=len(con)
 for pref=0 to L
  if con[pref]==d then
   if c==0 then
     z=left(con,pref)
   endif
   wait(50)
   if c==1 then
     z=right(con,L-pref-1)
   endif
  endif
 next
return z
end sub
спасиба что хочеш памочь
GAUHAR
Posts: 137
Joined: 2006-11-06 21:45:23

Post by GAUHAR »

Постараюсь помочь, обещать не буду. Ушел ковырять скрипт.
vertijok
Posts: 117
Joined: 2008-09-26 17:06:16
Contact:

Post by vertijok »

GAUHAR wrote:Постараюсь помочь, обещать не буду. Ушел ковырять скрипт.
СПС тебе бальшое :o ууурраааа наканецта нашолся добрый человек каторый сможет мне помочь
GAUHAR
Posts: 137
Joined: 2006-11-06 21:45:23

Post by GAUHAR »

Вроде что-то исправил, но есть некоторые моменты которые я не смог проверить. Не проверил ресалку, не было возможности, да и сомнения у меня что она будет работать, так как при появлении всяких криминальных элементов и ПК, ресалка вырубается. Еще есть момент с гейтом из шахты в Брит. Если в гейт можно рпойти только по двойному клику, то в скритпе в процедуре GoBrit() закомментирована строка:

Code: Select all

UO.UseObject('')   ;ID гейта из Минокской шахты в Брит.
Раскомментируй ее и вставь ID гейта.
Так же чар не будет прятаться, потому что добыча руды и уход в хайд не синхронизированы.
Ну и сам скрипт:

Code: Select all

################################################################
### Переменные #################################################
################################################################
###
### Для начала подготовится, положить в банк мешок(bag) и такой же в MageChest
### В мешки положить реги рекола Black Pearl, Mandrake Root, Blood Moss
### Самое главное выяснить Серийник банка!!!
### В банк положить руны к дому(одного типа!!! Тип рун в банке и в MageChest должны совпадать!!!)
### Положить в MageChest Руны в шахту(одного типа)
###
################################################################
################################################################
################################################################

   var a, coord  #, x, y - здесь они не нужны.  , name - нигде не встречается.
   var myXX, myYY, p = 0
   var bagreg, Chest

   ### ID друзей для игнора при поиске ПК и Криминал (эти переменные лишние)
   #var Charon='0x00324C05'   #Этот скрипт друзьей нигде не игнорирует.
   #var Buiok='0x000C430F'    #Скрипт ищет всех и должен убегать от
   #var friend3='0x001EEB63'  #всех серых и ПК. (поэтому закомментировал)

   var MCave='2558,501-2578,476'      ;диапозон координат пещеры
   var BankBrit='1446,1702-1421,1671' ;диапозон координат Банка в Брите
   var Home='1829,786-1843,800'       ;диапозон координат Дома

   var kalitka='0x0847'         ;Тип закрытой калитки
   var door='0x06A5'            ;тип закрытой двери в дом
   VAR bag='0x0E76'             ;тип мешка с регами
   VAR bankbox='0x40355E29'     ;Id банка (для того, что бы узнать ID банка, командой ",info" -
                                ;- на любой предмет и скопировать из полученной информации -
                                ;- значение C= -> 0x40156896 <-
   VAR rune='0x1F14'            ;Тип руны может быть 2-х типов
                                ; '0x1F14' и '0x1F15'
   VAR CraftChest='0x402C32D2'  ;Сундук Крафта с паками под руду и инготы
   VAR MageChest='0x402B6E6A'   ;Сундук Мага с паками и мешком-с-регами для Рекола
   VAR kirka = "0x0E86"         ;Тип кирки. 2 вида может "0x0E85" и "0x0E86"
   VAR OreBox = "0x4050B366"    ;Контейнер для руды
   VAR HiOreBox = "0x4050B362"  ;Контейнер для "выхи"
   VAR text1="There is no ore|You have no line|That is to far away|You can't think|You have no line of|too far away|mining in rock."
   VAR text2="You put the|You loosen some|You can't think|That is to far away|There is no ore|You have no line of|too far away|mining in rock."
   VAR run=118                  ;Код клавиши с биндом "AlwesRun"

################################################################
### Функция Main ###############################################
################################################################
sub main()
   UO.exec("exec ressurect")
   UO.exec("exec FindMan")
   UO.exec("exec mine")
endsub

#По всей видимости это был тест функции GetRun.
#В данном скрипте не нужно. (закомментировал)
#sub r()
#   var r = UO.getrun('self')
#   UO.print(str(r))
#endsub

################################################################
### Функция mine ##################################№№№##########
################################################################
sub mine()      ; Kopania
   UO.ignorereset()
   walker(2578,480,1)
   var pause=0
   myXX=UO.getX(); zapominaet mesto otkuda nacel kopati
   myYY=UO.getY();
   var PX, PY, PZ, IX, IY
   PX = UO.GetX()
   PY = UO.GetY()
   PZ = UO.GetZ()
   while UO.Weight <= (UO.STR * 4)
      For Iy=-4 to 4
         For Ix=-4 to 4
            UO.deletejournal()
            while not UO.Dead() and not UO.InJournal(text1) && UO.weight<=UO.str*4
               if p==1 then
                  if not UO.hidden() then
                     InJournal('You have hidden',60)
                  endif
               endif
               UO.WaitTargetTile(-1,Str(PX+Ix),Str(PY+Iy),Str(PZ))
               UO.usetype(kirka)
               InJournal(text2,0)
               if UO.injournal('You loosen some') then
                  pause=pause+1
                  if pause>4 then
                     wait(10000)
                     pause=0
                  endif
                else
                  pause=0
               endif
               wait(200)
            wend
         next
         wait(200)
      next
      wait(200)
   wend
   UO.exec('exec GoBrit')
endsub

################################################################
###### FindMan #################################################
################################################################
Sub FindMan()
   UO.set('finddistance','20')
   var b=4, p=0
   UO.ignorereset()
   UO.ignore('self')
   repeat
      if UO.InJournal("You have been revealed|You can't seem") then
         p=1
         DelTextInJournal("You have been revealed|You can't seem")
         UO.showjournal(20)
      endif
      if p==1 then
         p=0
         if not UO.hidden() then
            UO.warmode(0)
            UO.useskill("Hiding")
         endif
       else
         UO.findman(b)
         wait(500)
         if UO.findcount()>0 || UO.injournal('attacking you') then
            UO.print('ATAC')
            UO.print(UO.getname('finditem')+' '+str(UO.getdistance('finditem')))
            UO.forget('finditem')
            UO.exec('terminate all; exec GoBrit')
         endif
         wait(100)
      endif
      if b==4 then
         b=6
       else
         b=4
      endif
   until UO.dead()
endsub

################################################################
### Функция GoBrit #################################№###########
################################################################
Sub GoBrit()
   UO.exec('terminate mine')
   UO.ignorereset()
   UO.press(run)
   wait(50)
   UO.press(35)
   if UO.getrun()==0 then
      UO.press(run)
   endif
   walker(2581,480,0)
   #UO.UseObject('')   ;ID гейта из Минокской шахты в Брит.
   wait(50)
   UO.press(35)
   wait(50)
   UO.press(35)
   wait(50)
   UO.press(run)
   UO.press(35)
   wait(50)
   if UO.getrun()==1 then
      UO.press(run)
   endif
   walker(1433,1693,1)
   wait(5000)
   coord=GetXY('self')
   if ComXY(BankBrit,coord)==true then
      UO.exec('terminate FindMan; exec GoHome')
    else
      GoBrit()
   endif
endsub

sub GoHome()
   OpenChest()
   wait(1000)
   GotoHomeT()
   move()
   wait(5000)
   OpenChest()
   wait(2000)
   UO.exec('terminate all; exec main')
endsub

################################################################
### Функция OpenChest ############################№#############
################################################################
sub OpenChest()
   UO.findtype('0x0E42',-1,'ground')
   if UO.findcount()>0 then
      UO.useobject(MageChest)
      chest=MageChest
    else
      UO.Say("bank")
      chest=bankbox
   endif
   wait(1000)
   CheckLag()
   UO.findtype(bag,-1,chest)
   bagreg=UO.getserial('finditem')
   UO.useobject(bagreg)
   wait(1000)
   CheckLag()
   FindRune(chest)
endsub

################################################################
### Функция FindRune ###############################№###########
################################################################
sub FindRune(b)
   var idrune
   UO.findtype(rune,-1,b)
   idrune=UO.getserial('finditem')
   Cast(idrune)
endsub

################################################################
### Функция Cast(rune) #########################################
################################################################
Sub Cast(rune)
   var a
   coord = GetXY('self')
   if ComXY(Home,coord)==true then
      a=true
    else
      a=false
   endif
   MoveReg(bagreg)

   var mana
   if UO.bm>0 && UO.bp>0 && UO.mr>0 then
      cast:
      if UO.mana < 20 then
         med()
         wait(2000)
         goto cast
      endif
      mana = UO.mana
      UO.cast('Recall',rune)
      DelTextInJournal("fizzle")
      while mana <= UO.mana
         wait(200)
      wend
      if ComXY(MCave,coord)==false then
         if ComXY(Home,coord)==a then
            wait(1000)
            CheckLag()
            if UO.injournal("fizzle") then
               MoveReg(bagreg)
               goto cast
            endif
            wait(200)
         endif
      endif
    else
      UO.print('Stop')
      UO.closeuo()
   endif
   wait(1000)
endsub

################################################################
### Функция Move reg ###########################################
################################################################
sub MoveReg(id)
   UO.print('Move Reagents')
   var a
   dim reg[3]
      reg[0] = "0x0F7A"   ;Black Pearls
      reg[1] = "0x0F7B"   ;Blood Moss
      reg[2] = "0x0F86"   ;Mandrake Roots
   for a=0 to 2
      if UO.count(reg[a])<1 then
         UO.findtype(reg[a],-1,id)
         UO.moveitem('finditem',2,'backpack')
         wait(700)
         CheckLag()
      endif
   next
endsub

################################################################
### Функция-массив Регов #######################################
################################################################
#Функция нигде не встречается, поэтому закомментировал.
#Sub mreg(reg)
#   reg[0] = "0x0F7A"       ;Black Pearls
#   reg[1] = "0x0F7B"       ;Blood Moss
#   reg[2] = "0x0F86"       ;Mandrake Roots
#   return reg
#endsub

################################################################
### Функция meditation #########################################
################################################################
sub med()
   UO.print('Meditation')
   while UO.mana < UO.int
      UO.UseSkill("Meditation")
      injournal("You are at peace|You lose your concentration",60)
   wend
endsub

################################################################
### Функция Goto Home ##########################################
################################################################
sub GotoHomeT()
   UO.set('finddistance',4)
   UO.print('Go to Home')
   if type(kalitka)==true then
      UO.press(121)
      CheckLag()
    else
      wait(200)
   endif
   walker(2895,584,0)
   UO.press(121)
   CheckLag()
   if type(kalitka)==false then
      walker(2895,584,0)
      UO.press(121)
      CheckLag()
   endif
   wait(200)
   walker(2895,584,0)
   if type(door)==true then
      UO.press(121)
      CheckLag()
    else
      wait(200)
   endif
   walker(2895,584,0)
   UO.press(121)
   CheckLag()
   wait(500)
   if type(door)==false then
      UO.press(121)
      CheckLag()
    else
      wait(200)
   endif
   CheckLag()
endsub

Sub type(tip)
   UO.findtype(tip,-1,'ground')
   if UO.findcount()>0 then
      return true
    else
      return false
   endif
endsub

################################################################
### Функция MoveOre ############################################
################################################################
sub move()
   UO.useobject(CraftChest)
   CheckLag()
   UO.print('MOVEORE')
   wait(2000)
   var e
   dim a[4]
      a[0] = 0x19B7
      a[1] = 0x19BA
      a[2] = 0x19B8
      a[3] = 0x19B9
   UO.useobject(OreBox)
   CheckLag()
   for e = 0 to 3
      repeat
         UO.findtype(a[e],-1,'backpack')
         UO.moveitem('finditem',0,OreBox)
         wait(900)
         CheckLag()
      until UO.findcount()==0
   next
   wait(1000)
   MoveHi()
endsub

Sub MoveHi()
   var e, c
   dim a[4],x[19]
      a[0] = 0x19B9      ;4 and more ore
      a[1] = 0x19B7      ;1 ore
      a[2] = 0x19BA      ;2 ore
      a[3] = 0x19B8      ;3 ore

      x[0] = '0x09B9'    ;Acid ore
      x[1] = '0x09A4'    ;Cristaline ore
      x[2] = '0x0085'    ;Dragon ore
      x[3] = '0x09D3'    ;Steel ore
      x[4] = '0x09E6'    ;Elvin ore
      x[5] = '0x09F0'    ;Gorgan ore
      x[6] = '0x008F'    ;Send rock ore
      x[7] = '0x04C2'    ;Blood rock ore
      x[8] = '0x09DA'    ;Vulcan ore
      x[9] = '0x0028'    ;Obsidian ore
      x[10] = '0x08AF'   ;Plutonium ore
      x[11] = '0x09EC'   ;Blood crest ore
      x[12] = '0x0455'   ;Black rock ore
      x[13] = '0x010F'   ;Krynite ore
      x[14] = '0x0BA7'   ;Eldar ore
      x[15] = '0x00CE'   ;Valorite ore
      x[16] = '0x052D'   ;Mitheril ore
      x[17] = '0x07D5'   ;Verite ore
      x[18] = '0x0060'   ;Aqua ore
   UO.useobject(HiOreBox)
   wait(700)
   CheckLag()
   for e=0 to 3
      for c=0 to 18
         repeat
            UO.findtype(a[e],x[c],OreBox)
            if UO.findcount()>0 then
               UO.moveitem('finditem',0,HiOreBox)
               CheckLag()
               wait(400)
            endif
            wait(100)
         until UO.findcount()==0
      next
   next
endsub

sub ressurect()
   repeat
      ; ©dark_kynep
      if UO.Life < 1 then
         UO.useobject('self')
         CheckLag()
         UO.warmode(0)
         UO.LClick(977,56)
         CheckLag()
         wait(1000)
         UO.LClick(267,309)
         CheckLag()
         wait(1000)
         UO.LClick(172,200)
         CheckLag()
         wait(1000)
         walker(2468,531,1)
         UO.useobject('0x4001D120')
         CheckLag()
         walker(2466,542,0)
         CheckLag()
         walker(2506,542,0)
         Alive()
       else
         wait(1000)
         ;UO.Print("You are Alive!!!")
      endif
   until 1==2  #UO.dead()
endsub

Sub Alive()
   OpenChest()
   GotoHomeT()
   Heal()
   OpenChest()
   UO.exec('terminate all; exec main')
endsub

sub Heal()
   UO.useobject('0x4023D30F')
   CheckLag()
   wait(500)
   UO.findtype('0x0E21',-1,'0x4023D30F')
   UO.moveitem('finditem',10,'backpack',10,10,0)
   CheckLag()
   wait(500)
   repeat
      UO.bandageself()
      wait(5000)
   until UO.life==UO.str
   wait(500)
   UO.useobject(CraftChest)
   CheckLag()
   wait(500)
   UO.findtype(kirka,-1,CraftChest)
   UO.moveitem('finditem',1,'backpack',100,10,0)
   CheckLag()
   wait(500)
endsub

################################################################
### Функция паузы по проверке журнала или таймера ##############
################################################################
Sub InJournal(t,time)
   ;UO.print('EXEC INJOURNAL(T,TIME)')
   var timer=UO.timer()
   DelTextInJournal(t)
   if time==0 then
      ;UO.print('TIME==0')
      while not UO.Dead() and not UO.InJournal(t)
         wait(200)
      wend
    else
      ;UO.print('TIME<>0')
      while not UO.Dead() and not UO.InJournal(t) && UO.timer()<timer+time
         wait(200)
      wend
   endif
endsub

################################################################
### Функция удаления из журнала Текста #########################
################################################################
Sub DelTextInJournal(msg) ; msg это параметр, см. выше как его передают
   var nom=UO.InJournal(msg) ; ищем сообщение и в переменную его
   if nom>0 then
      UO.SetJournalLine(Nom - 1," ") ; подменим сообщение
      DelTextInJournal(msg) ; вызов функцией самой себя, рекурсия
   endif
endsub

################################################################
### Функция отклик сервера #####################################
################################################################
Sub CheckLag()
   DelTextInJournal("backpack") ; вытрим ТОЛЬКО нужные нам сообщения в журнале
   UO.Click('backpack') ; одиночный клик по вашему backpack
   #InJournal("backpack",0)
   while not UO.InJournal("backpack")
      wait(100)
   wend
endsub

################################################################
### Функция World save now #####################################
################################################################
Sub ws()
   if UO.injournal("World is saving now...") then
      InJournal("World data saving",1800)
   endif
endsub


########################### ХОДИЛКА 3 ##########################
#var Prec=3 # Как близко следует подойти к цели (Precision)
#var MaxTraceDistance=15 # Максимальная длина обхода. Желательно ставить с расчета возможных препятсвий. Если ставить очень #большие числа, кодилка может пойти в обход пол мира чтобы дойти к соседнему дереву.
#var Speed=2 # Длина шага. Сколько шагов делать за раз. Выше 3 ставить смысла нет. Тоесть тупое умножение шагов. Для ламбера #идеально 3, для майнинга - 1.
#var StepTimeOut=400 # Если уперлись в неопознанный обьект, сколько мсек ждать сдвига с места. Если по простому - таймаут #шага. Если поставить сильно маленькие, ходилка начнет трассировать пустые места.
#UO.SetGlobal("Logging","1")  # - показывать отладочные сообщения.
#UO.SetGlobal("BlindWalk","0") # - не использовать проверку тайлов, а использовать ходьбу наощупь. Для майнинга ОБЯЗАТЕЛЬНО #ВКЛЮЧИТЬ.
#В функции IsPass, содержиться список проходимых тайлов.

#Walker(X,Y,Prec) - идем к цели с координатами X,Y. Возвращает 1 в случае успешного достижения цели, и 0 - при невозможном обходе (путь не найден)
#Tracer(StartDir,Direction) - трассировка 1 шага. Возвращает направление по которому получилось сдвинуться с места. StartDir #- направление последнего движения, Direction (-1 или +1) направление обхода. -1 - по часовой стрелке, +1 против часовой #стрелки. Направления скрипт использует личного формата:
#1 - влево вниз
#2 - вниз
#3 - вправо вниз
#4 - вправо
#5 - вправо вверх
#6 - вверх
#7 - влево вверх
#8 - влево
#Tracer(StartDir,Direction) - идеально подходит для рыбалки вдоль берега так как она будет обходить берег бесконечно (1 #запуск функции = 1 шаг обхода).

#####################################################
# WW  W  WW   AA    LL     Kk KK  EE  EE  RRR       #
# WW  W  WW  AA A   LL     Kk K   EEE     R  R      #
# WW  W  WW  AA A   LL     KKK    EEEEE   R R       #
# WW WW  WW  AAAA   LL     KKK    EEE     RRR       #
#  WWW WWW  AA   A   LLLL  KK Kk  EE  EE  R  RR     #
#####################################################
   var MaxTraceDistance=10
   var TraceLoopIncrease=5 #Увеличение MaxTraceDistance при исчерпании количества ходов
   var LimitTrace=20 #Сколько шагов в ОБЕ стороны от начальной точки обхода прекращают ходилку (выхода нет).
   var Speed=1
   var StepTimeOut=600  #Таймаут шага. Устанавливать не в размер пинга, а в размер шага + размер пинга.
                        # Для ходьбы - 500+Ping
                        # Для бега/ходьбы на лошади - 300+Ping
                        # Бег на лошади - 150 + Ping
   var CheckCnt=2 #Количество слепых проверок. УВЕЛИЧИВАЕТ В СТОЛЬКО РАЗ ТАЙМАУТ. Использовать только на БЫСТРОМ но НЕСТАБИЛЬНОМ коннекте. При большом пинге будет УЖАС.
   var DynamicPause=30 #Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора.

Sub Walker(GoX,GoY,Prec)
   UO.warmode(0)
   UO.SetGlobal("Logging","0")
   UO.SetGlobal("BlindWalk","0")
   var LastDir
   var MoveRes
   var TracerCnt
   UO.SetGlobal("GlobalGoX",str(GoX))
   UO.SetGlobal("GlobalGoY",str(GoY))
   while not IsEnd(GoX,GoY,Prec)
      TracerCnt = MaxTraceDistance
      repeat
         LogInfo('Just walking')
         LastDir=GoUntilHit(GoX,GoY,Prec)
         if IsEnd(GoX,GoY,Prec) then
            return 1
         endif
         LogInfo('Tracing')
         MoveRes = FullAroundTrace(LastDir,GoX,GoY,Prec,TracerCnt)
         if TracerCnt > LimitTrace then
            return 0
         endif
         TracerCnt = TracerCnt + TraceLoopIncrease
      until MoveRes == 1
   wend
   return 1
endsub

Sub FullAroundTrace(StartDir,GoX,GoY,Prec,MaxTrace)
   var LineX=UO.GetX()
   var LineY=UO.GetY()
   var CurDir=StartDir
   var Direction=CountDirection(GoX,GoY,CurDir,Prec)
   var StartX,StartY
   var MovesDone=0
   repeat
      StartX=UO.GetX()
      StartY=UO.GetY()
      CurDir=Tracer(CurDir,Direction,Prec)
      if (CurDir==GetDir(GoX,GoY,Prec)) then
         return 1
      endif
      if MovesDone>0 and PrevMoveCross(GetDirToDir(UO.GetDir(),Prec),LineX,LineY,GoX,GoY,StartX,StartY,Prec) then
         return 1
      endif
      MovesDone=MovesDone+1
      CurDir=AddToDir(CurDir,-Direction,Prec)
   until MovesDone>MaxTrace
   return 0
endsub

Sub CountDirection(GoX,GoY,StartDir,Prec)
   var GoDir=GetDir(GoX,GoY,Prec)
   var MyX=UO.GetX()
   var MyY=UO.GetY()
   if GoDir<StartDir then
      return -1
   endif
   if GoDir>StartDir then
      return 1
   endif
   if Abs(MyX-GoX)>Abs(MyY-GoY) then
      if (GoDir==3 and GoY>MyY) OR (GoDir==7 and GoY<MyY) then
         return -1
       else
         return 1
      endif
    else
      if (GoDir==1 and GoX<MyX) or (GoDir==5 and GoX>MyX) then
         return -1
       else
         return 1
      endif
   endif
endsub

Sub PrevMoveCross(Dir,x1,y1,x2,y2,StartX,StartY,Prec)
   var x3,y3,x4,y4
   x3=StartX
   y3=StartY
   x4=StartX+(XFromDir(Dir)-StartX)*Speed
   y4=StartY+(YFromDir(Dir)-StartY)*Speed
   return LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec)
endsub

Sub LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec)
   if x1==x3 and y1==y3 then
      return false
   endif
   var z1=(x3-x1)*(y2-y1)-(y3-y1)*(x2-x1)
   var z2=(x4-x1)*(y2-y1)-(y4-y1)*(x2-x1)
   if z1*z2>0 then
      return false
    else
      LogInfo('Vector info:')
      LogInfo('x1= '+str(x1))
      LogInfo('y1= '+str(y1))
      LogInfo('x2= '+str(x2))
      LogInfo('y2= '+str(y2))
      LogInfo('x3= '+str(x3))
      LogInfo('y3= '+str(y3))
      LogInfo('x4= '+str(x4))
      LogInfo('y4= '+str(y4))
      return true
   endif
endsub

Sub IsDiap(X,X0,X1,Prec)
   if X<=X0+Prec and X>=X1-Prec OR X>=X0-Prec and X<=X1+Prec then
      return true
   endif
   return false
endsub

Sub GoUntilHit(GoX,GoY,Prec)
   var LastDir
   LastDir=GetDir(GoX,GoY,Prec)
   var CouldMove
   repeat
      LastDir=GetDir(GoX,GoY,Prec)
      if LastDir<>0 and not IsEnd(GoX,GoY,Prec) then
         CouldMove=TryDir(LastDir,Prec)
      endif
   until LastDir==0 or IsEnd(GoX,GoY,Prec) or not CouldMove
   return LastDir
endsub

Sub IsEnd(GoX,GoY,Prec)
   if Abs(UO.GetX()-GoX)<=Prec and Abs(UO.GetY()-GoY)<=Prec then
      LogInfo('END FOUND')
      return true
    else
         if Abs(UO.GetX()-GoX)>=100 and Abs(UO.GetY()-GoY)>=100 then
            LogInfo('END FOUND')
            return true
          else
            return false
         endif
      #return false
   endif
endsub

Sub GetDir(GoX,GoY,Prec)
   var MyX=UO.GetX()
   var MyY=UO.GetY()
   var DiffX=Abs(UO.GetX()-GoX)
   var DiffY=Abs(UO.GetY()-GoY)
   var GoDir=0
   if (DiffX/(DiffY+0.1))>=2 then
      if (MyX>GoX) then
         GoDir=7
       else
         GoDir=3
      endif
    else
      if (DiffY/(DiffX+0.1))>=2 then
         if (MyY>GoY) then
            GoDir=5
          else
            GoDir=1
         endif
       else
         if (MyX>GoX) and (MyY>GoY) then
            GoDir=6
          else
            if (MyX>GoX) and (MyY<GoY) then
               GoDir=8
             else
               if (MyX<GoX) and (MyY>GoY) then
                  GoDir=4
                else
                  if (MyX<GoX) and (MyY<GoY) then
                     GoDir=2
                  endif
               endif
            endif
         endif
      endif
   endif
   return GoDir
endsub

Sub Tracer(StartDir,Direction,Prec)
   var CurDir=StartDir
   var Result
   repeat
      Result=TryDir(CurDir,Prec)
      if not Result then
         CurDir=AddToDir(CurDir,Direction,Prec)
      endif
   until Result
   return Result
endsub

Sub AddToDir(Dir,Cnt,Prec)
   var NewDir=Dir
   NewDir=NewDir+Cnt
   while NewDir>8
      NewDir=NewDir-8
   wend
   while NewDir<1
      NewDir=NewDir+8
   wend
   return NewDir
endsub

Sub TryDir(Dir,Prec)
   var BegX=UO.GetX() # Ia?aeuiia O
   var BegY=UO.GetY() # Ia?aeuiia Y
   var Counter=0
   var GoX=BegX
   var GoY=BegY
   GoX=XFromDir(Dir)
   GoY=YFromDir(Dir)
   if not IsPass(GoX,GoY) then
      LogInfo(str(GoX)+':'+str(GoY)+' is not passable')
      return false
   endif
   return TurnAndGoDir(Dir,Prec)
endsub

Sub XFromDir(Dir)
   if Dir==2 OR Dir==3 Or Dir==4 then
      return (UO.GetX()+1)
   endif
   if Dir==6 OR Dir==7 Or Dir==8 then
      return (UO.GetX()-1)
   endif
   return (UO.GetX())
endsub

Sub YFromDir(Dir)
   if Dir==8 OR Dir==1 Or Dir==2 then
      return (UO.GetY()+1)
   endif
   if Dir==4 OR Dir==5 Or Dir==6 then
      return (UO.GetY()-1)
   endif
   return (UO.GetY())
endsub

Sub TurnAndGoDir(Dir,Prec)
   var StartDir=GetDirToDir(UO.GetDir(),Prec)
   var StartX=UO.GetX()
   var StartY=UO.GetY()
   var EndDir
   var Counter=0
   var TestCounter=CheckCnt
   #Direction Test
   repeat
      Counter = 0
      LogInfo('Dir: '+str(StartDir)+' Counter: '+str(Counter))
      PressDir(Dir)
      repeat
         EndDir=GetDirToDir(UO.GetDir(),Prec)
         wait(DynamicPause)
         Counter=Counter+1
      until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause
      TestCounter = TestCounter - 1
      LogInfo('Dir: '+str(EndDir)+' Counter: '+str(Counter))
   until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause
   if Counter>=StepTimeOut/DynamicPause  then
      LogInfo('Direction timeout reached')
      return 0
   endif
   #End direction Test
   if StartY<>UO.GetY() or StartX<>UO.GetX() then
      return Dir
   endif
   #Start Primary test
   TestCounter=CheckCnt
   repeat
      GoDir(Dir,Prec)
      Counter=0
      repeat
         wait(DynamicPause)
         Counter=Counter+1
      until StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause
      TestCounter = TestCounter - 1
   until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause
   #End primary test
   if Counter>=StepTimeOut/DynamicPause then
      LogInfo('Step timeout reached')
      return 0
    else
      return Dir
   endif
endsub

Sub GetDirToDir(GotDir,Prec)
   var ChangedDir=-GotDir
   ChangedDir=AddToDir(ChangedDir,5,Prec)
   return ChangedDir
endsub

Sub DirToInj(Dir)
   dim Dirs[9]
      Dirs[1]=1
      Dirs[2]=2
      Dirs[3]=3
      Dirs[4]=6
      Dirs[5]=9
      Dirs[6]=8
      Dirs[7]=7
      Dirs[8]=4
   return (Dirs[Dir])
endsub

Sub PressDir(Dir)
   dim Dirs[9]
      Dirs[1]=35
      Dirs[2]=40
      Dirs[3]=34
      Dirs[4]=39
      Dirs[5]=33
      Dirs[6]=38
      Dirs[7]=36
      Dirs[8]=37
   UO.Press(Dirs[Dir],1)
endsub

Sub GoDir(Dir,Prec)
   dim Dirs[9]
      Dirs[1]=35
      Dirs[2]=40
      Dirs[3]=34
      Dirs[4]=39
      Dirs[5]=33
      Dirs[6]=38
      Dirs[7]=36
      Dirs[8]=37
   var DistanceX=Abs(UO.GetX()-val(UO.GetGlobal("GlobalGoX")))
   var DistanceY=Abs(UO.GetY()-val(UO.GetGlobal("GlobalGoY")))
   var GoDistance
   if (DistanceX-Prec)<Speed then
      GoDistance=DistanceX-Prec
    else
      if (DistanceY-Prec)<Speed then
         GoDistance=DistanceY-Prec
       else
         GoDistance=Speed
      endif
   endif
   UO.Press(Dirs[Dir],GoDistance)
endsub

Sub IsPass(X,Y)
   if UO.GetGlobal("BlindWalk") then
      return true
   endif
   dim Types[60]
      Types[1]=3
      Types[2]=25
      Types[3]=51
      Types[4]=63
      Types[5]=113
      Types[6]=140
      Types[7]=172
      Types[8]=219
      Types[9]=232
      Types[10]=235
      Types[11]=239
      Types[12]=243
      Types[13]=248
      Types[14]=251
      Types[15]=264
      Types[16]=267
      Types[17]=282
      Types[18]=289
      Types[19]=321
      Types[20]=379
      Types[21]=420
      Types[22]=440
      Types[23]=476
      Types[24]=499
      Types[25]=513
      Types[26]=542
      Types[27]=578
      Types[28]=586
      Types[29]=622
      Types[30]=700
      Types[31]=804
      Types[32]=1740
      Types[33]=1758
      Types[34]=1770
      Types[35]=1779
      Types[36]=1779
      Types[37]=1881
      Types[38]=1886
      Types[39]=1801
      Types[40]=1805
      Types[41]=1813
      Types[42]=1820
      Types[43]=1831
      Types[44]=1833
      Types[45]=1843
      Types[46]=1850
      Types[47]=1873
      Types[48]=1876
      Types[49]=1885
      Types[50]=1888
      Types[51]=1946
      Types[52]=1969
      Types[53]=2500
      Types[54]=2539
   for var i=1 TO 53 STEP 2
      if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then
         return true
      endif
   next
   return false
endsub

Sub LogInfo(Line)
   if not UO.GetGlobal("Logging")=="0" then
      UO.TextOpen()
      UO.TextPrint(str(UO.GetX())+":"+str(UO.GetY())+" - "+Line);
   endif
endsub

Sub Abs(X)
   if X>0 then
      return X
    else
      return (-X)
   endif
endsub
################################################################
# конец ходилки ################################################
################################################################

#Функция возвращает коодринаты чара строкой через запятую.
Sub GetXY(man)
   var x, y, xy
   x=UO.getx(man)
   y=UO.gety(man)
   xy=str(x)+','+str(y)
   return xy
endsub

#Функция возвращает результат проверки:
#находится ли чар в указанной области координат.
Sub ComXY(coordinate,coord)  #область координат, текущие координаты чара.
   var myx, myy, x1, y1, L, pref, minx, maxx, miny, maxy, x, y
   L=len(coordinate)
   ;UO.print('Длина строки = '+str(L))
   ;wait(100)
   x1=XY(coordinate,'-',0)
   ;UO.print('Координаты а: '+x1)
   ;wait(100)
   y1=XY(coordinate,'-',1)
   ;UO.print('Координаты б: '+y1)
   ;wait(100)
   minx=XY(x1,',',0)
   ;UO.print('Координата minx: '+minx)
   ;wait(100)
   miny=XY(x1,',',1)
   UO.print('Координата miny: '+miny)
   wait(100)
   maxx=XY(y1,',',0)
   ;UO.print('Координата maxx: '+maxx)
   ;wait(100)
   maxy=XY(y1,',',1)
   ;UO.print('Координата maxy: '+maxy)
   ;wait(100)
   myx=XY(coord,',',0)
   ;UO.print('Координата myx: '+myx)
   ;wait(1000)
   myy=XY(coord,',',1)
   ;UO.print('Координата myy: '+myy)
   if minx>maxx then
      x=minx
      ;UO.print('X1=MinX='+x1)
      ;wait(100)
      minx=maxx
      ;UO.print('MinX=MaxX='+minx)
      ;wait(100)
      maxx=x
      ;UO.print('maxx=x1='+minx)
      ;wait(100)
   endif
   if miny>maxy then
      y=miny
      ;UO.print('Y1=MinY='+y)
      ;wait(100)
      miny=maxy
      ;UO.print('MinY=MaxY='+miny)
      ;wait(100)
      maxy=y
      ;UO.print('maxy=y1='+maxy)
      ;wait(100)
   endif
   ; wait(100)
   if myx>minx && myx<maxx && myy>miny && myy<maxy then
      return true
    else
      return false
   endif
endsub

#Функция возвращает часть строки.
#   con - строка
#   d - разделитель
#   c - если 0, то вернуть часть строки до разделителя
#       если 1, то вернуть часть строки после разделителя.
Sub XY(con,d,c)
   var pref, L, z
   L=len(con)
   for pref=0 to L
      if con[pref]==d then
         if c==0 then
            z=left(con,pref)
         endif
         wait(50)
         if c==1 then
            z=right(con,L-pref-1)
         endif
      endif
   next
   return z
endsub
vertijok
Posts: 117
Joined: 2008-09-26 17:06:16
Contact:

Post by vertijok »

GAUHAR wrote:Вроде что-то исправил, но есть некоторые моменты которые я не смог проверить. Не проверил ресалку, не было возможности, да и сомнения у меня что она будет работать, так как при появлении всяких криминальных элементов и ПК, ресалка вырубается. Еще есть момент с гейтом из шахты в Брит. Если в гейт можно рпойти только по двойному клику, то в скритпе в процедуре GoBrit() закомментирована строка:

Code: Select all

UO.UseObject('')   ;ID гейта из Минокской шахты в Брит.
Раскомментируй ее и вставь ID гейта.
Так же чар не будет прятаться, потому что добыча руды и уход в хайд не синхронизированы.
Ну и сам скрипт:

Code: Select all

################################################################
### Переменные #################################################
################################################################
###
### Для начала подготовится, положить в банк мешок(bag) и такой же в MageChest
### В мешки положить реги рекола Black Pearl, Mandrake Root, Blood Moss
### Самое главное выяснить Серийник банка!!!
### В банк положить руны к дому(одного типа!!! Тип рун в банке и в MageChest должны совпадать!!!)
### Положить в MageChest Руны в шахту(одного типа)
###
################################################################
################################################################
################################################################

   var a, coord  #, x, y - здесь они не нужны.  , name - нигде не встречается.
   var myXX, myYY, p = 0
   var bagreg, Chest

   ### ID друзей для игнора при поиске ПК и Криминал (эти переменные лишние)
   #var Charon='0x00324C05'   #Этот скрипт друзьей нигде не игнорирует.
   #var Buiok='0x000C430F'    #Скрипт ищет всех и должен убегать от
   #var friend3='0x001EEB63'  #всех серых и ПК. (поэтому закомментировал)

   var MCave='2558,501-2578,476'      ;диапозон координат пещеры
   var BankBrit='1446,1702-1421,1671' ;диапозон координат Банка в Брите
   var Home='1829,786-1843,800'       ;диапозон координат Дома

   var kalitka='0x0847'         ;Тип закрытой калитки
   var door='0x06A5'            ;тип закрытой двери в дом
   VAR bag='0x0E76'             ;тип мешка с регами
   VAR bankbox='0x40355E29'     ;Id банка (для того, что бы узнать ID банка, командой ",info" -
                                ;- на любой предмет и скопировать из полученной информации -
                                ;- значение C= -> 0x40156896 <-
   VAR rune='0x1F14'            ;Тип руны может быть 2-х типов
                                ; '0x1F14' и '0x1F15'
   VAR CraftChest='0x402C32D2'  ;Сундук Крафта с паками под руду и инготы
   VAR MageChest='0x402B6E6A'   ;Сундук Мага с паками и мешком-с-регами для Рекола
   VAR kirka = "0x0E86"         ;Тип кирки. 2 вида может "0x0E85" и "0x0E86"
   VAR OreBox = "0x4050B366"    ;Контейнер для руды
   VAR HiOreBox = "0x4050B362"  ;Контейнер для "выхи"
   VAR text1="There is no ore|You have no line|That is to far away|You can't think|You have no line of|too far away|mining in rock."
   VAR text2="You put the|You loosen some|You can't think|That is to far away|There is no ore|You have no line of|too far away|mining in rock."
   VAR run=118                  ;Код клавиши с биндом "AlwesRun"

################################################################
### Функция Main ###############################################
################################################################
sub main()
   UO.exec("exec ressurect")
   UO.exec("exec FindMan")
   UO.exec("exec mine")
endsub

#По всей видимости это был тест функции GetRun.
#В данном скрипте не нужно. (закомментировал)
#sub r()
#   var r = UO.getrun('self')
#   UO.print(str(r))
#endsub

################################################################
### Функция mine ##################################№№№##########
################################################################
sub mine()      ; Kopania
   UO.ignorereset()
   walker(2578,480,1)
   var pause=0
   myXX=UO.getX(); zapominaet mesto otkuda nacel kopati
   myYY=UO.getY();
   var PX, PY, PZ, IX, IY
   PX = UO.GetX()
   PY = UO.GetY()
   PZ = UO.GetZ()
   while UO.Weight <= (UO.STR * 4)
      For Iy=-4 to 4
         For Ix=-4 to 4
            UO.deletejournal()
            while not UO.Dead() and not UO.InJournal(text1) && UO.weight<=UO.str*4
               if p==1 then
                  if not UO.hidden() then
                     InJournal('You have hidden',60)
                  endif
               endif
               UO.WaitTargetTile(-1,Str(PX+Ix),Str(PY+Iy),Str(PZ))
               UO.usetype(kirka)
               InJournal(text2,0)
               if UO.injournal('You loosen some') then
                  pause=pause+1
                  if pause>4 then
                     wait(10000)
                     pause=0
                  endif
                else
                  pause=0
               endif
               wait(200)
            wend
         next
         wait(200)
      next
      wait(200)
   wend
   UO.exec('exec GoBrit')
endsub

################################################################
###### FindMan #################################################
################################################################
Sub FindMan()
   UO.set('finddistance','20')
   var b=4, p=0
   UO.ignorereset()
   UO.ignore('self')
   repeat
      if UO.InJournal("You have been revealed|You can't seem") then
         p=1
         DelTextInJournal("You have been revealed|You can't seem")
         UO.showjournal(20)
      endif
      if p==1 then
         p=0
         if not UO.hidden() then
            UO.warmode(0)
            UO.useskill("Hiding")
         endif
       else
         UO.findman(b)
         wait(500)
         if UO.findcount()>0 || UO.injournal('attacking you') then
            UO.print('ATAC')
            UO.print(UO.getname('finditem')+' '+str(UO.getdistance('finditem')))
            UO.forget('finditem')
            UO.exec('terminate all; exec GoBrit')
         endif
         wait(100)
      endif
      if b==4 then
         b=6
       else
         b=4
      endif
   until UO.dead()
endsub

################################################################
### Функция GoBrit #################################№###########
################################################################
Sub GoBrit()
   UO.exec('terminate mine')
   UO.ignorereset()
   UO.press(run)
   wait(50)
   UO.press(35)
   if UO.getrun()==0 then
      UO.press(run)
   endif
   walker(2581,480,0)
   #UO.UseObject('')   ;ID гейта из Минокской шахты в Брит.
   wait(50)
   UO.press(35)
   wait(50)
   UO.press(35)
   wait(50)
   UO.press(run)
   UO.press(35)
   wait(50)
   if UO.getrun()==1 then
      UO.press(run)
   endif
   walker(1433,1693,1)
   wait(5000)
   coord=GetXY('self')
   if ComXY(BankBrit,coord)==true then
      UO.exec('terminate FindMan; exec GoHome')
    else
      GoBrit()
   endif
endsub

sub GoHome()
   OpenChest()
   wait(1000)
   GotoHomeT()
   move()
   wait(5000)
   OpenChest()
   wait(2000)
   UO.exec('terminate all; exec main')
endsub

################################################################
### Функция OpenChest ############################№#############
################################################################
sub OpenChest()
   UO.findtype('0x0E42',-1,'ground')
   if UO.findcount()>0 then
      UO.useobject(MageChest)
      chest=MageChest
    else
      UO.Say("bank")
      chest=bankbox
   endif
   wait(1000)
   CheckLag()
   UO.findtype(bag,-1,chest)
   bagreg=UO.getserial('finditem')
   UO.useobject(bagreg)
   wait(1000)
   CheckLag()
   FindRune(chest)
endsub

################################################################
### Функция FindRune ###############################№###########
################################################################
sub FindRune(b)
   var idrune
   UO.findtype(rune,-1,b)
   idrune=UO.getserial('finditem')
   Cast(idrune)
endsub

################################################################
### Функция Cast(rune) #########################################
################################################################
Sub Cast(rune)
   var a
   coord = GetXY('self')
   if ComXY(Home,coord)==true then
      a=true
    else
      a=false
   endif
   MoveReg(bagreg)

   var mana
   if UO.bm>0 && UO.bp>0 && UO.mr>0 then
      cast:
      if UO.mana < 20 then
         med()
         wait(2000)
         goto cast
      endif
      mana = UO.mana
      UO.cast('Recall',rune)
      DelTextInJournal("fizzle")
      while mana <= UO.mana
         wait(200)
      wend
      if ComXY(MCave,coord)==false then
         if ComXY(Home,coord)==a then
            wait(1000)
            CheckLag()
            if UO.injournal("fizzle") then
               MoveReg(bagreg)
               goto cast
            endif
            wait(200)
         endif
      endif
    else
      UO.print('Stop')
      UO.closeuo()
   endif
   wait(1000)
endsub

################################################################
### Функция Move reg ###########################################
################################################################
sub MoveReg(id)
   UO.print('Move Reagents')
   var a
   dim reg[3]
      reg[0] = "0x0F7A"   ;Black Pearls
      reg[1] = "0x0F7B"   ;Blood Moss
      reg[2] = "0x0F86"   ;Mandrake Roots
   for a=0 to 2
      if UO.count(reg[a])<1 then
         UO.findtype(reg[a],-1,id)
         UO.moveitem('finditem',2,'backpack')
         wait(700)
         CheckLag()
      endif
   next
endsub

################################################################
### Функция-массив Регов #######################################
################################################################
#Функция нигде не встречается, поэтому закомментировал.
#Sub mreg(reg)
#   reg[0] = "0x0F7A"       ;Black Pearls
#   reg[1] = "0x0F7B"       ;Blood Moss
#   reg[2] = "0x0F86"       ;Mandrake Roots
#   return reg
#endsub

################################################################
### Функция meditation #########################################
################################################################
sub med()
   UO.print('Meditation')
   while UO.mana < UO.int
      UO.UseSkill("Meditation")
      injournal("You are at peace|You lose your concentration",60)
   wend
endsub

################################################################
### Функция Goto Home ##########################################
################################################################
sub GotoHomeT()
   UO.set('finddistance',4)
   UO.print('Go to Home')
   if type(kalitka)==true then
      UO.press(121)
      CheckLag()
    else
      wait(200)
   endif
   walker(2895,584,0)
   UO.press(121)
   CheckLag()
   if type(kalitka)==false then
      walker(2895,584,0)
      UO.press(121)
      CheckLag()
   endif
   wait(200)
   walker(2895,584,0)
   if type(door)==true then
      UO.press(121)
      CheckLag()
    else
      wait(200)
   endif
   walker(2895,584,0)
   UO.press(121)
   CheckLag()
   wait(500)
   if type(door)==false then
      UO.press(121)
      CheckLag()
    else
      wait(200)
   endif
   CheckLag()
endsub

Sub type(tip)
   UO.findtype(tip,-1,'ground')
   if UO.findcount()>0 then
      return true
    else
      return false
   endif
endsub

################################################################
### Функция MoveOre ############################################
################################################################
sub move()
   UO.useobject(CraftChest)
   CheckLag()
   UO.print('MOVEORE')
   wait(2000)
   var e
   dim a[4]
      a[0] = 0x19B7
      a[1] = 0x19BA
      a[2] = 0x19B8
      a[3] = 0x19B9
   UO.useobject(OreBox)
   CheckLag()
   for e = 0 to 3
      repeat
         UO.findtype(a[e],-1,'backpack')
         UO.moveitem('finditem',0,OreBox)
         wait(900)
         CheckLag()
      until UO.findcount()==0
   next
   wait(1000)
   MoveHi()
endsub

Sub MoveHi()
   var e, c
   dim a[4],x[19]
      a[0] = 0x19B9      ;4 and more ore
      a[1] = 0x19B7      ;1 ore
      a[2] = 0x19BA      ;2 ore
      a[3] = 0x19B8      ;3 ore

      x[0] = '0x09B9'    ;Acid ore
      x[1] = '0x09A4'    ;Cristaline ore
      x[2] = '0x0085'    ;Dragon ore
      x[3] = '0x09D3'    ;Steel ore
      x[4] = '0x09E6'    ;Elvin ore
      x[5] = '0x09F0'    ;Gorgan ore
      x[6] = '0x008F'    ;Send rock ore
      x[7] = '0x04C2'    ;Blood rock ore
      x[8] = '0x09DA'    ;Vulcan ore
      x[9] = '0x0028'    ;Obsidian ore
      x[10] = '0x08AF'   ;Plutonium ore
      x[11] = '0x09EC'   ;Blood crest ore
      x[12] = '0x0455'   ;Black rock ore
      x[13] = '0x010F'   ;Krynite ore
      x[14] = '0x0BA7'   ;Eldar ore
      x[15] = '0x00CE'   ;Valorite ore
      x[16] = '0x052D'   ;Mitheril ore
      x[17] = '0x07D5'   ;Verite ore
      x[18] = '0x0060'   ;Aqua ore
   UO.useobject(HiOreBox)
   wait(700)
   CheckLag()
   for e=0 to 3
      for c=0 to 18
         repeat
            UO.findtype(a[e],x[c],OreBox)
            if UO.findcount()>0 then
               UO.moveitem('finditem',0,HiOreBox)
               CheckLag()
               wait(400)
            endif
            wait(100)
         until UO.findcount()==0
      next
   next
endsub

sub ressurect()
   repeat
      ; ©dark_kynep
      if UO.Life < 1 then
         UO.useobject('self')
         CheckLag()
         UO.warmode(0)
         UO.LClick(977,56)
         CheckLag()
         wait(1000)
         UO.LClick(267,309)
         CheckLag()
         wait(1000)
         UO.LClick(172,200)
         CheckLag()
         wait(1000)
         walker(2468,531,1)
         UO.useobject('0x4001D120')
         CheckLag()
         walker(2466,542,0)
         CheckLag()
         walker(2506,542,0)
         Alive()
       else
         wait(1000)
         ;UO.Print("You are Alive!!!")
      endif
   until 1==2  #UO.dead()
endsub

Sub Alive()
   OpenChest()
   GotoHomeT()
   Heal()
   OpenChest()
   UO.exec('terminate all; exec main')
endsub

sub Heal()
   UO.useobject('0x4023D30F')
   CheckLag()
   wait(500)
   UO.findtype('0x0E21',-1,'0x4023D30F')
   UO.moveitem('finditem',10,'backpack',10,10,0)
   CheckLag()
   wait(500)
   repeat
      UO.bandageself()
      wait(5000)
   until UO.life==UO.str
   wait(500)
   UO.useobject(CraftChest)
   CheckLag()
   wait(500)
   UO.findtype(kirka,-1,CraftChest)
   UO.moveitem('finditem',1,'backpack',100,10,0)
   CheckLag()
   wait(500)
endsub

################################################################
### Функция паузы по проверке журнала или таймера ##############
################################################################
Sub InJournal(t,time)
   ;UO.print('EXEC INJOURNAL(T,TIME)')
   var timer=UO.timer()
   DelTextInJournal(t)
   if time==0 then
      ;UO.print('TIME==0')
      while not UO.Dead() and not UO.InJournal(t)
         wait(200)
      wend
    else
      ;UO.print('TIME<>0')
      while not UO.Dead() and not UO.InJournal(t) && UO.timer()<timer+time
         wait(200)
      wend
   endif
endsub

################################################################
### Функция удаления из журнала Текста #########################
################################################################
Sub DelTextInJournal(msg) ; msg это параметр, см. выше как его передают
   var nom=UO.InJournal(msg) ; ищем сообщение и в переменную его
   if nom>0 then
      UO.SetJournalLine(Nom - 1," ") ; подменим сообщение
      DelTextInJournal(msg) ; вызов функцией самой себя, рекурсия
   endif
endsub

################################################################
### Функция отклик сервера #####################################
################################################################
Sub CheckLag()
   DelTextInJournal("backpack") ; вытрим ТОЛЬКО нужные нам сообщения в журнале
   UO.Click('backpack') ; одиночный клик по вашему backpack
   #InJournal("backpack",0)
   while not UO.InJournal("backpack")
      wait(100)
   wend
endsub

################################################################
### Функция World save now #####################################
################################################################
Sub ws()
   if UO.injournal("World is saving now...") then
      InJournal("World data saving",1800)
   endif
endsub


########################### ХОДИЛКА 3 ##########################
#var Prec=3 # Как близко следует подойти к цели (Precision)
#var MaxTraceDistance=15 # Максимальная длина обхода. Желательно ставить с расчета возможных препятсвий. Если ставить очень #большие числа, кодилка может пойти в обход пол мира чтобы дойти к соседнему дереву.
#var Speed=2 # Длина шага. Сколько шагов делать за раз. Выше 3 ставить смысла нет. Тоесть тупое умножение шагов. Для ламбера #идеально 3, для майнинга - 1.
#var StepTimeOut=400 # Если уперлись в неопознанный обьект, сколько мсек ждать сдвига с места. Если по простому - таймаут #шага. Если поставить сильно маленькие, ходилка начнет трассировать пустые места.
#UO.SetGlobal("Logging","1")  # - показывать отладочные сообщения.
#UO.SetGlobal("BlindWalk","0") # - не использовать проверку тайлов, а использовать ходьбу наощупь. Для майнинга ОБЯЗАТЕЛЬНО #ВКЛЮЧИТЬ.
#В функции IsPass, содержиться список проходимых тайлов.

#Walker(X,Y,Prec) - идем к цели с координатами X,Y. Возвращает 1 в случае успешного достижения цели, и 0 - при невозможном обходе (путь не найден)
#Tracer(StartDir,Direction) - трассировка 1 шага. Возвращает направление по которому получилось сдвинуться с места. StartDir #- направление последнего движения, Direction (-1 или +1) направление обхода. -1 - по часовой стрелке, +1 против часовой #стрелки. Направления скрипт использует личного формата:
#1 - влево вниз
#2 - вниз
#3 - вправо вниз
#4 - вправо
#5 - вправо вверх
#6 - вверх
#7 - влево вверх
#8 - влево
#Tracer(StartDir,Direction) - идеально подходит для рыбалки вдоль берега так как она будет обходить берег бесконечно (1 #запуск функции = 1 шаг обхода).

#####################################################
# WW  W  WW   AA    LL     Kk KK  EE  EE  RRR       #
# WW  W  WW  AA A   LL     Kk K   EEE     R  R      #
# WW  W  WW  AA A   LL     KKK    EEEEE   R R       #
# WW WW  WW  AAAA   LL     KKK    EEE     RRR       #
#  WWW WWW  AA   A   LLLL  KK Kk  EE  EE  R  RR     #
#####################################################
   var MaxTraceDistance=10
   var TraceLoopIncrease=5 #Увеличение MaxTraceDistance при исчерпании количества ходов
   var LimitTrace=20 #Сколько шагов в ОБЕ стороны от начальной точки обхода прекращают ходилку (выхода нет).
   var Speed=1
   var StepTimeOut=600  #Таймаут шага. Устанавливать не в размер пинга, а в размер шага + размер пинга.
                        # Для ходьбы - 500+Ping
                        # Для бега/ходьбы на лошади - 300+Ping
                        # Бег на лошади - 150 + Ping
   var CheckCnt=2 #Количество слепых проверок. УВЕЛИЧИВАЕТ В СТОЛЬКО РАЗ ТАЙМАУТ. Использовать только на БЫСТРОМ но НЕСТАБИЛЬНОМ коннекте. При большом пинге будет УЖАС.
   var DynamicPause=30 #Минимальные паузы в циклах. Чем меньше число - тем меньше рывков и тем больше нагрузка процессора.

Sub Walker(GoX,GoY,Prec)
   UO.warmode(0)
   UO.SetGlobal("Logging","0")
   UO.SetGlobal("BlindWalk","0")
   var LastDir
   var MoveRes
   var TracerCnt
   UO.SetGlobal("GlobalGoX",str(GoX))
   UO.SetGlobal("GlobalGoY",str(GoY))
   while not IsEnd(GoX,GoY,Prec)
      TracerCnt = MaxTraceDistance
      repeat
         LogInfo('Just walking')
         LastDir=GoUntilHit(GoX,GoY,Prec)
         if IsEnd(GoX,GoY,Prec) then
            return 1
         endif
         LogInfo('Tracing')
         MoveRes = FullAroundTrace(LastDir,GoX,GoY,Prec,TracerCnt)
         if TracerCnt > LimitTrace then
            return 0
         endif
         TracerCnt = TracerCnt + TraceLoopIncrease
      until MoveRes == 1
   wend
   return 1
endsub

Sub FullAroundTrace(StartDir,GoX,GoY,Prec,MaxTrace)
   var LineX=UO.GetX()
   var LineY=UO.GetY()
   var CurDir=StartDir
   var Direction=CountDirection(GoX,GoY,CurDir,Prec)
   var StartX,StartY
   var MovesDone=0
   repeat
      StartX=UO.GetX()
      StartY=UO.GetY()
      CurDir=Tracer(CurDir,Direction,Prec)
      if (CurDir==GetDir(GoX,GoY,Prec)) then
         return 1
      endif
      if MovesDone>0 and PrevMoveCross(GetDirToDir(UO.GetDir(),Prec),LineX,LineY,GoX,GoY,StartX,StartY,Prec) then
         return 1
      endif
      MovesDone=MovesDone+1
      CurDir=AddToDir(CurDir,-Direction,Prec)
   until MovesDone>MaxTrace
   return 0
endsub

Sub CountDirection(GoX,GoY,StartDir,Prec)
   var GoDir=GetDir(GoX,GoY,Prec)
   var MyX=UO.GetX()
   var MyY=UO.GetY()
   if GoDir<StartDir then
      return -1
   endif
   if GoDir>StartDir then
      return 1
   endif
   if Abs(MyX-GoX)>Abs(MyY-GoY) then
      if (GoDir==3 and GoY>MyY) OR (GoDir==7 and GoY<MyY) then
         return -1
       else
         return 1
      endif
    else
      if (GoDir==1 and GoX<MyX) or (GoDir==5 and GoX>MyX) then
         return -1
       else
         return 1
      endif
   endif
endsub

Sub PrevMoveCross(Dir,x1,y1,x2,y2,StartX,StartY,Prec)
   var x3,y3,x4,y4
   x3=StartX
   y3=StartY
   x4=StartX+(XFromDir(Dir)-StartX)*Speed
   y4=StartY+(YFromDir(Dir)-StartY)*Speed
   return LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec)
endsub

Sub LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec)
   if x1==x3 and y1==y3 then
      return false
   endif
   var z1=(x3-x1)*(y2-y1)-(y3-y1)*(x2-x1)
   var z2=(x4-x1)*(y2-y1)-(y4-y1)*(x2-x1)
   if z1*z2>0 then
      return false
    else
      LogInfo('Vector info:')
      LogInfo('x1= '+str(x1))
      LogInfo('y1= '+str(y1))
      LogInfo('x2= '+str(x2))
      LogInfo('y2= '+str(y2))
      LogInfo('x3= '+str(x3))
      LogInfo('y3= '+str(y3))
      LogInfo('x4= '+str(x4))
      LogInfo('y4= '+str(y4))
      return true
   endif
endsub

Sub IsDiap(X,X0,X1,Prec)
   if X<=X0+Prec and X>=X1-Prec OR X>=X0-Prec and X<=X1+Prec then
      return true
   endif
   return false
endsub

Sub GoUntilHit(GoX,GoY,Prec)
   var LastDir
   LastDir=GetDir(GoX,GoY,Prec)
   var CouldMove
   repeat
      LastDir=GetDir(GoX,GoY,Prec)
      if LastDir<>0 and not IsEnd(GoX,GoY,Prec) then
         CouldMove=TryDir(LastDir,Prec)
      endif
   until LastDir==0 or IsEnd(GoX,GoY,Prec) or not CouldMove
   return LastDir
endsub

Sub IsEnd(GoX,GoY,Prec)
   if Abs(UO.GetX()-GoX)<=Prec and Abs(UO.GetY()-GoY)<=Prec then
      LogInfo('END FOUND')
      return true
    else
         if Abs(UO.GetX()-GoX)>=100 and Abs(UO.GetY()-GoY)>=100 then
            LogInfo('END FOUND')
            return true
          else
            return false
         endif
      #return false
   endif
endsub

Sub GetDir(GoX,GoY,Prec)
   var MyX=UO.GetX()
   var MyY=UO.GetY()
   var DiffX=Abs(UO.GetX()-GoX)
   var DiffY=Abs(UO.GetY()-GoY)
   var GoDir=0
   if (DiffX/(DiffY+0.1))>=2 then
      if (MyX>GoX) then
         GoDir=7
       else
         GoDir=3
      endif
    else
      if (DiffY/(DiffX+0.1))>=2 then
         if (MyY>GoY) then
            GoDir=5
          else
            GoDir=1
         endif
       else
         if (MyX>GoX) and (MyY>GoY) then
            GoDir=6
          else
            if (MyX>GoX) and (MyY<GoY) then
               GoDir=8
             else
               if (MyX<GoX) and (MyY>GoY) then
                  GoDir=4
                else
                  if (MyX<GoX) and (MyY<GoY) then
                     GoDir=2
                  endif
               endif
            endif
         endif
      endif
   endif
   return GoDir
endsub

Sub Tracer(StartDir,Direction,Prec)
   var CurDir=StartDir
   var Result
   repeat
      Result=TryDir(CurDir,Prec)
      if not Result then
         CurDir=AddToDir(CurDir,Direction,Prec)
      endif
   until Result
   return Result
endsub

Sub AddToDir(Dir,Cnt,Prec)
   var NewDir=Dir
   NewDir=NewDir+Cnt
   while NewDir>8
      NewDir=NewDir-8
   wend
   while NewDir<1
      NewDir=NewDir+8
   wend
   return NewDir
endsub

Sub TryDir(Dir,Prec)
   var BegX=UO.GetX() # Ia?aeuiia O
   var BegY=UO.GetY() # Ia?aeuiia Y
   var Counter=0
   var GoX=BegX
   var GoY=BegY
   GoX=XFromDir(Dir)
   GoY=YFromDir(Dir)
   if not IsPass(GoX,GoY) then
      LogInfo(str(GoX)+':'+str(GoY)+' is not passable')
      return false
   endif
   return TurnAndGoDir(Dir,Prec)
endsub

Sub XFromDir(Dir)
   if Dir==2 OR Dir==3 Or Dir==4 then
      return (UO.GetX()+1)
   endif
   if Dir==6 OR Dir==7 Or Dir==8 then
      return (UO.GetX()-1)
   endif
   return (UO.GetX())
endsub

Sub YFromDir(Dir)
   if Dir==8 OR Dir==1 Or Dir==2 then
      return (UO.GetY()+1)
   endif
   if Dir==4 OR Dir==5 Or Dir==6 then
      return (UO.GetY()-1)
   endif
   return (UO.GetY())
endsub

Sub TurnAndGoDir(Dir,Prec)
   var StartDir=GetDirToDir(UO.GetDir(),Prec)
   var StartX=UO.GetX()
   var StartY=UO.GetY()
   var EndDir
   var Counter=0
   var TestCounter=CheckCnt
   #Direction Test
   repeat
      Counter = 0
      LogInfo('Dir: '+str(StartDir)+' Counter: '+str(Counter))
      PressDir(Dir)
      repeat
         EndDir=GetDirToDir(UO.GetDir(),Prec)
         wait(DynamicPause)
         Counter=Counter+1
      until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause
      TestCounter = TestCounter - 1
      LogInfo('Dir: '+str(EndDir)+' Counter: '+str(Counter))
   until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause
   if Counter>=StepTimeOut/DynamicPause  then
      LogInfo('Direction timeout reached')
      return 0
   endif
   #End direction Test
   if StartY<>UO.GetY() or StartX<>UO.GetX() then
      return Dir
   endif
   #Start Primary test
   TestCounter=CheckCnt
   repeat
      GoDir(Dir,Prec)
      Counter=0
      repeat
         wait(DynamicPause)
         Counter=Counter+1
      until StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause
      TestCounter = TestCounter - 1
   until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause
   #End primary test
   if Counter>=StepTimeOut/DynamicPause then
      LogInfo('Step timeout reached')
      return 0
    else
      return Dir
   endif
endsub

Sub GetDirToDir(GotDir,Prec)
   var ChangedDir=-GotDir
   ChangedDir=AddToDir(ChangedDir,5,Prec)
   return ChangedDir
endsub

Sub DirToInj(Dir)
   dim Dirs[9]
      Dirs[1]=1
      Dirs[2]=2
      Dirs[3]=3
      Dirs[4]=6
      Dirs[5]=9
      Dirs[6]=8
      Dirs[7]=7
      Dirs[8]=4
   return (Dirs[Dir])
endsub

Sub PressDir(Dir)
   dim Dirs[9]
      Dirs[1]=35
      Dirs[2]=40
      Dirs[3]=34
      Dirs[4]=39
      Dirs[5]=33
      Dirs[6]=38
      Dirs[7]=36
      Dirs[8]=37
   UO.Press(Dirs[Dir],1)
endsub

Sub GoDir(Dir,Prec)
   dim Dirs[9]
      Dirs[1]=35
      Dirs[2]=40
      Dirs[3]=34
      Dirs[4]=39
      Dirs[5]=33
      Dirs[6]=38
      Dirs[7]=36
      Dirs[8]=37
   var DistanceX=Abs(UO.GetX()-val(UO.GetGlobal("GlobalGoX")))
   var DistanceY=Abs(UO.GetY()-val(UO.GetGlobal("GlobalGoY")))
   var GoDistance
   if (DistanceX-Prec)<Speed then
      GoDistance=DistanceX-Prec
    else
      if (DistanceY-Prec)<Speed then
         GoDistance=DistanceY-Prec
       else
         GoDistance=Speed
      endif
   endif
   UO.Press(Dirs[Dir],GoDistance)
endsub

Sub IsPass(X,Y)
   if UO.GetGlobal("BlindWalk") then
      return true
   endif
   dim Types[60]
      Types[1]=3
      Types[2]=25
      Types[3]=51
      Types[4]=63
      Types[5]=113
      Types[6]=140
      Types[7]=172
      Types[8]=219
      Types[9]=232
      Types[10]=235
      Types[11]=239
      Types[12]=243
      Types[13]=248
      Types[14]=251
      Types[15]=264
      Types[16]=267
      Types[17]=282
      Types[18]=289
      Types[19]=321
      Types[20]=379
      Types[21]=420
      Types[22]=440
      Types[23]=476
      Types[24]=499
      Types[25]=513
      Types[26]=542
      Types[27]=578
      Types[28]=586
      Types[29]=622
      Types[30]=700
      Types[31]=804
      Types[32]=1740
      Types[33]=1758
      Types[34]=1770
      Types[35]=1779
      Types[36]=1779
      Types[37]=1881
      Types[38]=1886
      Types[39]=1801
      Types[40]=1805
      Types[41]=1813
      Types[42]=1820
      Types[43]=1831
      Types[44]=1833
      Types[45]=1843
      Types[46]=1850
      Types[47]=1873
      Types[48]=1876
      Types[49]=1885
      Types[50]=1888
      Types[51]=1946
      Types[52]=1969
      Types[53]=2500
      Types[54]=2539
   for var i=1 TO 53 STEP 2
      if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then
         return true
      endif
   next
   return false
endsub

Sub LogInfo(Line)
   if not UO.GetGlobal("Logging")=="0" then
      UO.TextOpen()
      UO.TextPrint(str(UO.GetX())+":"+str(UO.GetY())+" - "+Line);
   endif
endsub

Sub Abs(X)
   if X>0 then
      return X
    else
      return (-X)
   endif
endsub
################################################################
# конец ходилки ################################################
################################################################

#Функция возвращает коодринаты чара строкой через запятую.
Sub GetXY(man)
   var x, y, xy
   x=UO.getx(man)
   y=UO.gety(man)
   xy=str(x)+','+str(y)
   return xy
endsub

#Функция возвращает результат проверки:
#находится ли чар в указанной области координат.
Sub ComXY(coordinate,coord)  #область координат, текущие координаты чара.
   var myx, myy, x1, y1, L, pref, minx, maxx, miny, maxy, x, y
   L=len(coordinate)
   ;UO.print('Длина строки = '+str(L))
   ;wait(100)
   x1=XY(coordinate,'-',0)
   ;UO.print('Координаты а: '+x1)
   ;wait(100)
   y1=XY(coordinate,'-',1)
   ;UO.print('Координаты б: '+y1)
   ;wait(100)
   minx=XY(x1,',',0)
   ;UO.print('Координата minx: '+minx)
   ;wait(100)
   miny=XY(x1,',',1)
   UO.print('Координата miny: '+miny)
   wait(100)
   maxx=XY(y1,',',0)
   ;UO.print('Координата maxx: '+maxx)
   ;wait(100)
   maxy=XY(y1,',',1)
   ;UO.print('Координата maxy: '+maxy)
   ;wait(100)
   myx=XY(coord,',',0)
   ;UO.print('Координата myx: '+myx)
   ;wait(1000)
   myy=XY(coord,',',1)
   ;UO.print('Координата myy: '+myy)
   if minx>maxx then
      x=minx
      ;UO.print('X1=MinX='+x1)
      ;wait(100)
      minx=maxx
      ;UO.print('MinX=MaxX='+minx)
      ;wait(100)
      maxx=x
      ;UO.print('maxx=x1='+minx)
      ;wait(100)
   endif
   if miny>maxy then
      y=miny
      ;UO.print('Y1=MinY='+y)
      ;wait(100)
      miny=maxy
      ;UO.print('MinY=MaxY='+miny)
      ;wait(100)
      maxy=y
      ;UO.print('maxy=y1='+maxy)
      ;wait(100)
   endif
   ; wait(100)
   if myx>minx && myx<maxx && myy>miny && myy<maxy then
      return true
    else
      return false
   endif
endsub

#Функция возвращает часть строки.
#   con - строка
#   d - разделитель
#   c - если 0, то вернуть часть строки до разделителя
#       если 1, то вернуть часть строки после разделителя.
Sub XY(con,d,c)
   var pref, L, z
   L=len(con)
   for pref=0 to L
      if con[pref]==d then
         if c==0 then
            z=left(con,pref)
         endif
         wait(50)
         if c==1 then
            z=right(con,L-pref-1)
         endif
      endif
   next
   return z
endsub
Праблема уже в том что если он увидел гдето 5 пк то после того как они ущли нету их в миноке то он кабута их видет и убегает в брит
Post Reply