Page 1 of 1

Ходилка для мининга

Posted: 2007-07-23 15:26:29
by Azzi
Плиз подскожите как поставить ходинку в мининг скрипт
тока ходилка нужна чтобы обходила припядствия
плиз помогите....
заранея спасиба :roll:

Posted: 2007-07-23 16:50:36
by Mihail
сверху топик прилеплен с ходилками.. с инструкциями

Re: Ходилка для мининга

Posted: 2007-07-23 18:40:54
by Scripts Writer
Azzi wrote:Плиз подскожите как поставить ходинку в мининг скрипт
тока ходилка нужна чтобы обходила припядствия
плиз помогите....
заранея спасиба :roll:


Смотря какая структура у скрипта:

1 Если стоим на одном месте например(minround Edred'a) то ходилка понадобится только для того чтоб подойти к сундуку (в зависимости от форм. параметров у скрипта(обычно это координаты X,Y) надо прописать их при вызове получая координаты объекта к которому надо подойти через )

Code: Select all

uo.GetX("к чему подходим")
uo.GetY("к чему подходим")


Тогда вызов ходилки будет один раз в случае достижения максимального веса (чтоб выгрузиться).

2 Если структура скрипта в виде массива тайлов по которым надо ходить и которые надо будет тут же перекапывать(например берём их из файла,или они объявленны в самом скрипте) то ходилку надо будет вызывать в цикле постоянно изменяя фактические параметры,- тайлы по которым надо будет ходить и которые будут обкапываться.

3 Могут быть объявлены 2-3 точки при достижении которых начинается скрипт вида minround, тогда надо ходилку прописать в случае завершения обкопки одной точки но не достижения максимального веса при котором начиналась бы выгрузка.

Так что- Телепаты в отпуске

Re: Ходилка для мининга

Posted: 2007-08-17 14:49:40
by kuviCk
Azzi wrote:Плиз подскожите как поставить ходинку в мининг скрипт
тока ходилка нужна чтобы обходила припядствия
плиз помогите....
заранея спасиба :roll:

Code: Select all

(C) SerrouS
sub InitStack()
uo.SetGlobal('STACK', '0')
end sub
 
sub Push( param )
var Check=val(uo.GetGlobal('STACK')) ; количество элементов в стеке
uo.SetGlobal('STACK',str(Check + 1))
uo.SetGlobal('STACK_'+str(Check), param)
end sub
 
sub Pop ()
var Check=val(uo.GetGlobal('STACK')) ; количество элементов в стеке
if Check then
uo.SetGlobal('STACK',str(Check - 1))
return uo.GetGlobal('STACK_'+str(Check - 1))
else
return ''
end if
end sub

sub GoToXY(X,Y,prec)
dim Turn[8] ; индекс - ГетДир, значение поворот направо под 45 градусов
Turn[0] = 39
Turn[1] = 34
Turn[2] = 40
Turn[3] = 35
Turn[4] = 37
Turn[5] = 36
Turn[6] = 38
Turn[7] = 33
 
dim DeltaX[8]; индекс - аналогично, значение - изменение координаты при проходе стенки
dim DeltaY[8]
DeltaX[0] = 1
DeltaX[1] = 1
DeltaX[2] = 1
DeltaX[3] = 0
DeltaX[4] = -1
DeltaX[5] = -1
DeltaX[6] = -1
DeltaX[7] = 0

DeltaY[0] = -1
DeltaY[1] = 0
DeltaY[2] = 1
DeltaY[3] = 1
DeltaY[4] = 1
DeltaY[5] = 0
DeltaY[6] = -1
DeltaY[7] = -1

var MoveX,MoveY
var CurrentX,CurrentY
var LastX=0,LastY=0,LastD=-1

var pathFind=0
var Index
var recursInd=0
var fout=0
var stepdelay=1000

InitStack()
repeat
CurrentX=uo.GetX()
CurrentY=uo.GetY()

MoveX=CurrentX-X
if MoveX<0 then
MoveX=0-dx
end if

dy=CurrentY-Y
if MoveY<0 then
MoveY=0-MoveY
end if

if MoveY>MoveX then
MoveX=MoveY
end if

if MoveX<=prec then
return
end if

if CurrentX==X and CurrentY==Y then
return
end if

LastX=CurrentX
LastY=CurrentY
LastD=uo.GetDir()

if CurrentX==X and Current>Y then
uo.Press(33)
end if

if CurrentX==X and CurrentY<Y then
uo.Press(35)
end if

if CurrentX<X and CurrentY==Y then
uo.Press(34)
end if

if CurrentX<X and CurrentY>Y then
uo.Press(39)
end if

if CurrentX<X and CurrentY<Y then
uo.Press(40)
end if

if CurrentX>X and CurrentY==Y then
uo.Press(36)
end if

if CurrentX>X and CurrentY>Y then
uo.Press(38)
end if

if CurrentX>X and CurrentY<Y then
uo.Press(37)
end if

uo.Print('KeyPressed')
wait(stepdelay)

if LastX==uo.GetX() and LastY==uo.GetY() and LastD==uo.GetDir() then
uo.Print('PathFind')
recursInd=0
repeat
#################################################
Index=LastD
uo.Print(str(Index))
fout=0
repeat ; идем в обход пока не упремся снова или не кончится стена
uo.Print('Iteration')
CurrentX=uo.GetX()
CurrentY=uo.GetY()
LastD=uo.GetDir()
uo.Press(Turn[ Index ])
wait(stepdelay)
if (uo.GetX()==LastX and uo.GetY()==LastY and LastD==uo.GetDir()) then
fout=1 ; уперлись
else
MoveX=uo.GetX()-CurrentX
MoveY=uo.GetY()-CurrentY
uo.Print('deltas '+str(MoveX)+' '+str(MoveY))
if DeltaX[ Index ]==MoveX and DeltaY[ Index ]==MoveY then
fout=2 ; препятствие пройдено
end if
end if
until fout
uo.Print('fout '+ str(fout))
if fout==1 then ; уходим на следующий поворот
recursInd=recursInd+1
Push(str( ind ))
;ld = ind
else ; fout == 2
; надо попытаться восстановить контекст из стека, или выйти из обхода
uo.Print('Iter '+ str(recursInd))
pathFind=0
if recursInd then ; восстановление
pathFind=1
recursInd=recursInd-1
LastD=val(Pop())-1
if LastD==-1 then
LastD=7
end if
uo.Press(turn[LastD])
wait(stepdelay) ; в сиkу того, что ондо нажатие меняет напрваление
end if
end if
#################################################
until not recursInd and not pathFind
uo.Print('PathFind END')
end if

until 0
end sub


Posted: 2007-08-18 00:30:26
by Ururu
Лучшая (на мой вгляд) ходилка от Sergious.

Code: Select all

GoToTile( OX, OY, N, S )

Posted: 2007-08-18 08:31:21
by Question_GimFlex
Ururu wrote:Лучшая (на мой вгляд) ходилка от Sergious.

Code: Select all

GoToTile( OX, OY, N, S )


полную рабочую версию вс тудию плз, умоляю

Posted: 2007-08-18 11:29:43
by Ururu
by Sergious
edit Edred

Code: Select all

GoToTile( 1913, 276, 1, False )


Code: Select all

Sub GoToTile( OX, OY, N, S ) 
   VAR myx, myy, MD, J
   VAR Lx1, Ly1
   VAR Lx2, Ly2
   VAR Sx, Sy
   VAR T
   VAR Des = N
   VAR MoveDelay = 100
   J = 1
   MD = MoveDelay * 1.5
   myx = uo.getx()
   myy = uo.gety()
   MoveOnce( GetDir( uo.getx(), uo.gety(), ox, oy), MD, False)
   Sx = 0
   Sy = 0
   Lx1 = uo.getx() / 2
   Ly1 = uo.gety() / 2
   Lx2 = Lx1 / 2
   Ly2 = Ly1 / 2
   T = UO.Timer()
   If (GetDistance(ox, oy) <> N) OR ( (NOT S) AND GetDistance(ox, oy) > N ) Then
      UO.Exec('exec PermResend')
   EndIf
   While ( (GetDistance(ox, oy) <> N) OR ((NOT S) and GetDistance(ox, oy) > N) ) and ( OX >= 0 ) and ( OY >= 0 )
      If ( (UO.Timer() - T) * 15 > MoveDelay ) Then
         T = UO.Timer()
         Lx2 = Lx1
         Ly2 = Ly1
         Lx1 = myx
         Ly1 = myy
         myx = uo.getx()
         myy = uo.gety()
      endIf
      MD=MoveDelay
      If ((OX-uo.getx())*(OX-uo.getx())+(OY-uo.gety())*(OY-uo.gety())>0) Then
         MD = MD * 3 / GetDistance( ox, oy )
      EndIf
      wait(MD)
      If GetDistance( OX, OY ) > Des Then
         MoveOnce(GetDir(uo.GetX(),uo.GetY(),ox,oy),MD,False)
      Else
         If S Then
            If GetDistance(OX,OY)<Des Then
               If GetDistance(OX,OY)<>0 Then
                  MoveOnce(GetDir(ox,oy,uo.GetX(),uo.GetY()),MD,False)
               Else
                  MoveOnce(GetDir(uo.GetX(),uo.GetY(),Lx2,Ly2),MD,False)
               EndIf
            EndIf
         EndIf
      EndIf
      If GetDistance(OX,OY)<>Des Then
         If (Lx2==uo.getx()) and (Ly2==uo.gety()) Then
            If (Sx<>uo.getx()) or (Sy<>uo.gety()) Then
               J=1
            EndIf
            J=J+1
            UO.Resend()
            Sx = uo.getx()
            Sy = uo.gety()
            Stun(ox,oy,J)
         EndIf
      EndIf
   Wend
   UO.Exec( 'terminate PermResend' )
endsub
;
; ============ MOVEONCE ===
; Процедура MoveOnce - хождение в определённую сторону
; Направления:
; Система направлений по клавишам Нумпада
; 8 = 1 | 2 = -1
; 9 = 2 | 1 = -2
; 6 = 3 | 4 = -3
; 3 = 4 | 7 = -4
;
; Такая система позволяет с лёгкостью получать направление, обратное
; данному...
;
Sub MoveOnce( Dir, Del, Rev )
   VAR Num
   Var MoveNumber = 1
   If Rev Then
      Num = MoveNumber + 1
   Else
      Num = MoveNumber
   EndIf
   If ( Num > 0 ) and ( Dir <> 0 ) Then
      If Dir == 1 Then
         UO.Press( 38, Num, Del )
      EndIf
      If Dir == 2 Then
         UO.Press( 33, Num, Del )
      EndIf
      If Dir == 3 Then
         UO.Press( 39, Num, Del )
      EndIf
      If Dir == 4 Then
         UO.Press( 34, Num, Del )
      EndIf
      If Dir == -1 Then
         UO.Press( 40, Num-1, Del )
      EndIf
      If Dir == -2 Then
         UO.Press( 35, Num, Del )
      EndIf
      If Dir == -3 Then
         UO.Press( 37, Num, Del )
      EndIf
      If Dir == -4 Then
         UO.Press( 36, Num, Del )
      EndIf
      If Rev Then
         If Dir <> -1 Then
            UO.Press( 40, 1, Del )
         EndIf
      EndIf
   EndIf
endsub
;
; ============== GETDIR ===
; Функция GetDir возвращает направление, по которому надо идти
; к координате
;
Sub GetDir( myx, myy, ox, oy )
   VAR I, J
   J = 0
   VAR X = ox - myx
   VAR Y = oy - myy
   I = GetQDir( Abs(X), Abs(Y) )
   If X >= 0 Then
      If Y >= 0 Then
         If I == 1 Then
            J = -2
         Else
            If I == 2 Then
               J = -1
            Else
               If I == 3 Then
                  J = 4
               EndIf
            EndIf
         EndIf
      Else
         If I == 1 Then
            J = 2
         Else
            If I == 2 Then
               J = 3
            Else
               If I == 3 Then
                  J = 4
               EndIf
            EndIf
         EndIf
      EndIf
   Else
      If Y >= 0 Then
         If I == 1 Then
            J = -2
         Else
            If I == 2 Then
               J = -3
            Else
               If I == 3 Then
                  J = -4
               EndIf
            EndIf
         EndIf
      Else
         If I == 1 Then
            J = 2
         Else
            If I == 2 Then
               J = 1
            Else
               If I == 3 Then
                  J = -4
               EndIf
            EndIf
         EndIf
      EndIf
   EndIf
   RETURN J
endsub
;
; =============== GETQDIR ===
;
;
Sub GetQDir( x, y )
   VAR Ep = 0.172
   VAR J = 0
   If X == 0 Then
      J = 1
   Else
      If ( Y / X ) < Ep Then
         J = 3
      Else
         If ( X / Y ) < Ep Then
            J = 1
         Else
            J = 2
         EndIf
      EndIf
   EndIf
   RETURN J
endsub
;
; ============== GETDISTANCE ===
; Функция GetDistance возвращает расстояние до координат
; (как UO.GetDistance - до объекта)
;
; Почему так - потому что учим математику :)
;
Sub GetDistance( X, Y )
   VAR A, B, C
   A = abs( X - UO.GetX() )
   B = abs( Y - UO.GetY() )
   If A > B Then
      C = A
   Else
      C = B
   EndIf
   Return C
endsub
;
; ============= PERP ===
; Функция Perp возвращает направление, перпендикулярное введённому
;
Sub Perp( Dir )
   VAR D = Dir
   If Dir == 1 Then
      D = 3
   EndIf
   If Dir == 2 Then
      D = 4
   EndIf
   If Dir == 3 Then
      D = -1
   EndIf
   If Dir == 4 Then
      D = -2
   EndIf
   If Dir == -1 Then
      D = -3
   EndIf
   If Dir == -2 Then
      D = -4
   EndIf
   If Dir == -3 Then
      D = 1
   EndIf
   If Dir == -4 Then
      D = 2
   EndIf
   RETURN D
endsub
;
; =============== STUN ===
; Обход препятствий
;
Sub Stun( X, Y, N )
   VAR I
   VAR myx
   VAR myy
   VAR MoveDelay = 100
   myx = uo.getx()
   myy = uo.gety()
   For I=1 to N
      MoveOnce(perp(GetDir(myx,myy,x,y)),MoveDelay,False)
   Next
   Wait(MoveDelay)
   UO.Resend()
   If (myx==uo.getx()) and (myy==uo.gety()) Then
      For I=1 to N
         MoveOnce(-perp(GetDir(myx,myy,x,y)),MoveDelay,False)
      Next
      Wait(MoveDelay)
      UO.Resend()
   EndIf
   If (myx==uo.getx()) and (myy==uo.gety()) Then
      For I=1 to N
         MoveOnce(-GetDir(myx,myy,x,y),MoveDelay,False)
      Next
      Wait(MoveDelay)
      Stun(x,y,N)
   EndIf   
endsub
;
; ============= ABS ===
; Убирает знак минуса в отрицательных числах
;
Sub abs( a )
   VAR b
   If a < 0 Then
      b = -a
   Else
      b = a
   endif
   return b
endsub
;
; ============== PERMRESEND ===
;
Sub PermResend()
   Var Mn = 9
   VAR MoveDelay = 100
   Repeat
      UO.Resend()
      Wait( MoveDelay * Mn )
   Until ( 1 > 2 )
Endsub

Posted: 2007-08-18 11:47:12
by Question_GimFlex
что значит false и 1

Posted: 2007-08-18 21:00:01
by I'm
Дай догадаюсь что то 1 означает встать на клетку или подойти к клетке,
а что то точность с которой можно не вставать на клетку. Хотя не могу быть уверен ибо не смотрел дальше

Code: Select all

GoToTile( 1913, 276, 1, False )
=)

Posted: 2007-08-18 22:15:48
by Ururu
да, на сколько точно подходить

Posted: 2007-08-19 01:40:37
by Grin
Если S "включить", то чар будет держатся всегда растояния в N.