Page 1 of 1

Помогите найти ошибку в скрипте

Posted: 2006-02-28 22:05:40
by Boris
Скрипт работает нормльно. Но после того как проходит весь массив и он начинает заново, то выдает ошибвку в строке f.open. Это самое начало практически

Code: Select all

sub main()
var Ms1 = "There is no ore here to mine"
var Ms2 = "You got hit"
var Ms3 = "You cannot mine that"
var f=file("C:\kopka2.dat") ## - Путь к файлу в котором будут хранится координаты
var k,wei
DIM Gx[82]
DIM Gy[82]
uo.say('.macro on')
while 1<2
   f.open() 
   for k=1 to 82
       Beg:
       uo.deletejournal()
       Gx[k]=safe call f.ReadNumber() 
       Gy[k]=safe call f.ReadNumber() 
       uo.print('Idem kopat v to4ku X=' + str(Gx[k]))
       uo.print('Idem kopat v to4ku Y=' + str(Gy[k]))
       Walker(Gx[k],Gy[k])
         If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) <> '0x0E85' Then 
            UO.Equipt( 'Rhand', '0x0E85' ) 
               repeat 
                 wait(200) 
               until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == '0x0E85' 
         Endif     
        If UO.Waiting() Then 
           UO.CancelTarget() 
        Endif  
        uo.waittargetself()
        wait(200)	
        uo.usetype('0x0E85') 
        repeat
          wait(500)
        until UO.InJournal(ms1) or UO.InJournal(ms2) or UO.InJournal(ms3) 
        if UO.InJournal(ms2) then
           uo.deletejournal()
           UO.Exec("playwav C:\alarm1")
              while UO.Life < UO.STR or UO.InJournal(ms1)
                wait(200)
                if UO.Life < 1 then
                   uo.warmode( 1 )
                      repeat
                        wait(200)
                      until UO.Life < 1
                   goto Beg
                end if
              wend
        
       end if
       wei = ( UO.Str * 4 ) - 120
       if UO.Weight > wei then
          Razgruz()
       end if
       wait(4000)
  next
  f.close()
  uo.print('1 cikl zaverwen')
  wait(1000)
wend
end sub

Sub ProDrop(T,C)
UO.FindType(T,C,'backpack') 
Var b = UO.GetSerial("finditem")
UO.FindType(T,C,'ground') 
Var g = UO.GetSerial("finditem")
UO.MoveItem(b, "0", g,str(uo.getx(g)),str(uo.gety(g)),"0")
Wait(1000)
end sub

Sub Razgruz()
Walker(2426,176)
Walker(2449,176)

UO.Set('finddistance','2')
UO.FindType(0x0FB1,-1,'ground')
wait(200)
If UO.FindCount() <> 0 Then
    repeat
       UO.FindType('0x19B9')
       wait(200)
           IF UO.FindCount() > 0 Then
               If UO.GetColor('finditem') == '0x04AA' Then #Gold
                    ProDrop(0x19B9,0x04AA)
                end if
                wait(200) 
                If UO.GetColor('finditem') == '0x0455' Then #BlackRock
                    ProDrop(0x19B9,0x0455)
                end if
                wait(200) 
                If UO.GetColor('finditem') == '0x0515' Then #Vailorite
                   ProDrop(0x19B9,0x0515)
                end if
                wait(200)
                If UO.GetColor('finditem') == '0x052D' Then #Mifril
                    ProDrop(0x19B9,0x052D)
                end if
                wait(200)
                If UO.GetColor('finditem') == '0x0481' Then #Winter
                    ProDrop(0x19B9,0x0481)
                end if
                wait(200)
                If UO.GetColor('finditem') == '0x04C2' Then #blud
                    ProDrop(0x19B9,0x04C2)
                end if
                wait(200)
                If UO.GetColor('finditem') == '0x04DF' Then #azur
                    ProDrop(0x19B9,0x04DF)
                end if
                wait(200)
                If UO.GetColor('finditem') == '0x0947' Then #verit
                    ProDrop(0x19B9,0x0947)
                end if
                UO.UseObject('finditem')
                wait(1200)
          EndIf
      until UO.FindCount() == 0
UO.Print("Tenepb pa3/\o>|<uM")
else
UO.Print("Forge not found")
endIf

#############Iron
If UO.Count(0x1BF2, 0x0000) > 0 Then
ProDrop(0x1BF2, 0x0000)
EndIF
############Rasty 
If UO.Count(0x1BF2,0x0750) > 0 Then
ProDrop(0x1BF2,0x0750)
EndIF
############Bronze
If UO.Count(0x1BF2, 0x0488) > 0 Then
  ProDrop(0x1BF2, 0x0488)
EndIF
############Old Copper
If UO.Count(0x1BF2, 0x0949) > 0 Then
  ProDrop(0x1BF2, 0x0949)
EndIF
############Dull Copper
If UO.Count(0x1BF2, 0x060A) > 0 Then
  ProDrop(0x1BF2, 0x060A)
EndIF
############Copper 
If UO.Count(0x1BF2, 0x0641) > 0 Then
  ProDrop(0x1BF2, 0x0641)
EndIF
############Pirit 
If UO.Count(0x1BF2, 0x09EE) > 0 Then
  ProDrop(0x1BF2, 0x09EE)
EndIF
############Silver
If UO.Count(0x1BF8, 0x0482) > 0 Then
  ProDrop(0x1BF8, 0x0482)
EndIF
############Shadow
If UO.Count(0x1BF2, 0x0770) > 0 Then
  ProDrop(0x1BF2, 0x0770)
EndIF
############Agapit
If UO.Count(0x1BF2, 0x0400) > 0 Then
  ProDrop(0x1BF2, 0x0400)
EndIF
############Ambers
If UO.Count(0x0F25,0x0000) > 0 Then
  ProDrop(0x0F25,0x0000)
EndIF
############karti
If UO.Count(0x14ED) > 0 Then
 while uo.count('0x14ED')
 uo.findtype('0x14ED','-1','Bpack')
 wait(200)
 uo.moveitem('finditem','-1','0x5BFD8B81')
 wait(1000)
 wend
EndIF
uo.print('UgeM KonaTb :-)')

Walker(2426,176)
end sub


##################################################### 
# 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 Prec=0 
var MaxTraceDistance=15 
var Speed=2 
var StepTimeOut=600 

Sub Walker(GoX,GoY) 
  UO.SetGlobal("Logging","0") 
  UO.SetGlobal("BlindWalk","0") 
  var LastDir 
  UO.SetGlobal("GlobalGoX",str(GoX)) 
  UO.SetGlobal("GlobalGoY",str(GoY)) 
  while not IsEnd(GoX,GoY) 
    LogInfo('Just walking') 
    LastDir=GoUntilHit(GoX,GoY) 
    if not IsEnd(GoX,GoY) then 
      LogInfo('Tracing') 
      FullAroundTrace(LastDir,GoX,GoY) 
    end if 
  wend 
end sub 

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

Sub CountDirection(GoX,GoY,StartDir) 
  var GoDir=GetDir(GoX,GoY) 
  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) 
  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) 
end sub 

Sub LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4) 
  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) 
  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) 
  var LastDir 
  LastDir=GetDir(GoX,GoY) 
  var CouldMove 
  repeat 
    LastDir=GetDir(GoX,GoY) 
    if LastDir<>0 and not IsEnd(GoX,GoY) then 
      CouldMove=TryDir(LastDir) 
    end if 
  until LastDir==0 or IsEnd(GoX,GoY) or not CouldMove 
  return LastDir 
end sub 

Sub IsEnd(GoX,GoY) 
  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) 
  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) 
  var CurDir=StartDir 
  var Result 
  repeat 
    Result=TryDir(CurDir) 
    if not Result then 
      CurDir=AddToDir(CurDir,Direction) 
    end if 
  until Result 
  return Result 
end sub 

Sub AddToDir(Dir,Cnt) 
  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) 
  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) 
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) 
  var StartDir=GetDirToDir(UO.GetDir()) 
  var StartX=UO.GetX() 
  var StartY=UO.GetY() 
  var EndDir 
  var Counter=0 
  GoDir(Dir) 
  repeat 
    EndDir=GetDirToDir(UO.GetDir()) 
    wait(100) 
    Counter=Counter+1 
  until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=8 
  if Counter>=8 then 
  return 0 
  end if 
  if StartY<>UO.GetY() or StartX<>UO.GetX() then 
  return Dir 
  else 
  GoDir(Dir) 
    repeat 
      wait(100) 
      Counter=Counter+1 
    until StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/100 
    if Counter>=StepTimeOut/100 then 
      LogInfo('Step timeout reached') 
      return 0 
    else 
      return Dir 
    end if 
  end if 
end sub 

Sub GetDirToDir(GotDir) 
   var ChangedDir=-GotDir 
   ChangedDir=AddToDir(ChangedDir,5) 
   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 GoDir(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 

   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

Posted: 2006-02-28 22:49:45
by agem
1) Если массив объявлен как Gx[82], то его элементы нумеруются от 0 до 81, а не от 1 до 82. Соответственно, цикл for k=1 to 82 ошибочный.

2) Зачем каждый раз в цикле заново считывать координаты? Достаточно будет считать их один раз.

Posted: 2006-02-28 22:51:15
by Blood Slayer
Я думаю что инжа просто не хочет по второму разу открывать тот же фаил ... он уже загружен ... попробуй поставить f.open() перед while

З.Ы.Я канечно не все понимаю ... но что то знаю. :)

Posted: 2006-02-28 23:55:16
by Boris
agem wrote:1) Если массив объявлен как Gx[82], то его элементы нумеруются от 0 до 81, а не от 1 до 82. Соответственно, цикл for k=1 to 82 ошибочный.
просто масив идет с 1 эллемента а не с 0, ну хотя исправлю
agem wrote: 2) Зачем каждый раз в цикле заново считывать координаты? Достаточно будет считать их один раз.
я честно сказать взял эту команду из друго скрипта на форуме, а описание ее не нашел.

Posted: 2006-02-28 23:56:07
by Boris
Blood Slayer wrote:Я думаю что инжа просто не хочет по второму разу открывать тот же фаил ... он уже загружен ... попробуй поставить f.open() перед while

З.Ы.Я канечно не все понимаю ... но что то знаю. :)
а я после массива поставил f.close()
просто ошибка выскакивает и я пробовал ее по разному исправить

Posted: 2006-03-01 00:31:03
by Blood Slayer
Boris wrote:
Blood Slayer wrote:Я думаю что инжа просто не хочет по второму разу открывать тот же фаил ... он уже загружен ... попробуй поставить f.open() перед while

З.Ы.Я канечно не все понимаю ... но что то знаю. :)
а я после массива поставил f.close()
просто ошибка выскакивает и я пробовал ее по разному исправить
Ну я просто только начало почитал :)