МОИ вопросы (Craft by slonopotam )

Ask for help

Moderators: Murderator+, Murderator

slonopotam
Posts: 270
Joined: 2006-08-05 14:09:06
Contact:

МОИ вопросы (Craft by slonopotam )

Post by slonopotam »

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

Начну с насущного:
Мне сложно разобратся, а тем более написать самому ходилку. Поэтому подобные скрипты всегда сопутствуют новым вопросам.

Может поможет кто написать скрипт:

Code: Select all

Ищет моба, подходит и убивает. И чтоб на этом скрипт заканчивался. 

Просто нашел по типу, подошел, убил, если моб убегает, преследовать и добивать подходя в плотную. Да и финдистанс чтоб указывалось при поиске.
ДРВ
Spoiler
_________________
Антарес
Spoiler|Gostrabaiter|Umhra|Slog
slonopotam
Posts: 270
Joined: 2006-08-05 14:09:06
Contact:

Post by slonopotam »

Вот надрал из разных скриптов. Не работает.

Code: Select all

VAR ups = 1
VAR Vrag = '0x0190'
VAR Totem = '0x40FBA3D7'

sub Start()
repeat
hustle()
   wait(1000)
      until ups>2
end sub


Sub hustle()

UO.Print("//--------------------------\\")
UO.Print("|  ----  ЛОЖКИ  НЕТ   ----  ||")
UO.Print("\\--------------------------//")


GoToTile( 5561, 1881, 1, False ) ; И ВОТ ГДЕТО ЗДЕСЬ ЦИКЛИТСЯ
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5561, 1881, 1, False )
Endif
go 2
GoToTile( 5561, 1876, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5561, 1876, 1, False )
Endif

GoToTile( 5555, 1876, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1876, 1, False )
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5555, 1876, 1, False )
Endif

GoToTile( 5561, 1876, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5561, 1876, 1, False )
Endif

GoToTile( 5561, 1867, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5561, 1867, 1, False )
Endif

GoToTile( 5555, 1867, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1867, 1, False )
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5555, 1867, 1, False )
Endif

GoToTile( 5561, 1867, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5561, 1867, 1, False )
Endif

GoToTile( 5561, 1859, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5561, 1859, 1, False )
Endif

GoToTile( 5556, 1859, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1859, 1, False )
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5556, 1859, 1, False )
Endif

GoToTile( 5561, 1859, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5561, 1859, 1, False )
Endif

GoToTile( 5561, 1851, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5561, 1851, 1, False )
Endif

GoToTile( 5555, 1851, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1851, 1, False )
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5555, 1851, 1, False )
Endif

GoToTile( 5561, 1851, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False )
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5561, 1851, 1, False )
Endif

GoToTile( 5561, 1881, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5561, 1881, 1, False )
Endif

GoToTile( 5538, 1881, 1, False )
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5538, 1881, 1, False )
Ress()
Else
Look()
GoToTile( 5538, 1881, 1, False )
Endif

uo.warmode(0)
UO.Print("//--------------------------\\")
UO.Print("|  -----   ФИГАСЕ !!!  ---  ||")
UO.Print("|  ----  С  ПЕРЕПУГУ  ----  ||")
UO.Print("|  ---  ВСЕХ  ПЕРЕБИЛ  ---  ||")
UO.Print("\\--------------------------//")

wait(30000)

end sub



Sub Ress()
repeat
uo.useobject(Totem)
wait(5000)
until not uo.dead()
wait(30000)
uo.exec('terminate hustle')
Start()
end sub



sub Look()
   VAR Vrag = '0x0190'
   Repeat
      UO.FindType( '0x0190', '-1', '1' )
      If UO.FindCount() > 0 Then
War()
      Else
         wait( 500 )
      Endif
   Until UO.FindCount() == 0
   UO.IgnoreReset()
endsub


Sub War()
if uo.injournal('body') then
uo.deletejournal()
Attack()
endif
end sub







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





sub Attack()
uo.set('finddistance','6') 
VAR LastTimer, Attack 
repeat
UO.DeleteJournal()
UO.FindType(Vrag,-1,'ground')
if UO.FindCount("finditem")>0 then
Attack=UO.GetSerial('finditem')
UO.Exec('warmode 1')
UO.Attack(Attack)
WalkN(0,0,Attack)
LastTimer=UO.Timer()
repeat
wait(2000)
until uo.dead(Attack) or UO.InJournal('Body') OR LastTimer+150<UO.Timer()
endif
wait(500)
next
wait(200)
until uo.dead()
end sub

sub Ranger()
var skin = 1; ea?aou neeieia
var loot = 0; eooeou oaei
var loop = 1; aaoiiao
var dagger = 0x0F51
var body

UO.DeleteJournal()
repeat
repeat
wait(100)
until UO.InJournal("Body of")
body = UO.JournalSerial(UO.InJournal("Body of")-1)
UO.DeleteJournal()
if skin then
if UO.GetDistance(body) <= 2 then
UO.WarMode(0)
UO.SetArm('skin')
UO.WaitTargetObject(body)
UO.UseType(dagger)
wait(1000)
else
endif
UO.WarMode(0)
UO.SetArm('skin')
UO.WaitTargetObject(body)
UO.UseType(dagger)
wait(1000)
endif

if loot then
if UO.GetDistance(body) <= 2 then
F_Loot()
else
endif
endif

if skin then
UO.Arm('Weapon')# Iaaaiuoa i?o?ea aee?iaai aiye aaaaeoa neiaa ,setarm Weapon
endif
UO.WarMode(1)
until not loop
endsub


sub F_Loot()
DIM R[14]
var c
R[1]=0x0df8
R[2]=0x1078
R[3]=0x0EED
R[4]=0x09AA
R[5]=0x0F85
R[6]=0x0F7B
R[7]=0x0F8C
R[8]=0x0F7A
R[9]=0x0F84
R[10]=0x0F88
R[11]=0x0F8D
R[12]=0x0F86
R[13]=0x1BD1
R[14]=0x0F8F

for c=1 to 14
repeat
uo.findtype(R[c],"-1","lastcorpse")
if UO.FindCount()>0 and Uo.GetDistance("lastcorpse")<=4 then
UO.Grab("0","finditem")
wait(1200)
end if
until UO.FindCount()<1
wait(10)
next
endsub

sub Numb(num)
if num>=0 then
return num
else
return num*(-1)
end if
end sub

sub WalkN(x,y,Target)
VAR i,StepSucess
VAR dx,dy,Exit=0

While Exit<>1
If Target<>"" Then
dx=UO.GetX(Target)-UO.GetX()
dy=UO.GetY(Target)-UO.GetY()
If UO.GetDistance(Target)<2 Then
Exit=1
Endif
Else
dx=x-UO.GetX()
dy=y-UO.GetY()
If dx==0 AND dy==0 Then
Exit=1
Endif

Endif

If dx<>0 AND dy<>0 Then
If dx>0 AND dy>0 Then
StepSucess=Go(3,40,300);SE - DownArrow
Endif

If dx>0 AND dy<0 Then
StepSucess=Go(1,39,300);NE - RightArrow
Endif

If dx<0 AND dy>0 Then
StepSucess=Go(5,37,300);SW - LeftArrow
Endif

If dx<0 AND dy<0 Then
StepSucess=Go(7,38,300);WN - UpArrow
Endif

Endif

If dx<>0 AND dy==0 Then
If dx>0 Then
StepSucess=Go(2,34,300);E - PgDown
If StepSucess==-1 Then
StepSucess=Go(3,40,300);SE - DownArrow
If StepSucess==-1 Then
StepSucess=Go(1,39,300);NE - RightArrow
Endif
Endif
Endif

If dx<0 Then
StepSucess=Go(6,36,300);W - Home
If StepSucess==-1 Then
StepSucess=Go(7,38,300);WN - UpArrow
If StepSucess==-1 Then
StepSucess=Go(5,37,300);SW - LeftArrow
Endif
Endif
Endif
Endif


If dx==0 AND dy<>0 Then
If dy>0 Then
StepSucess=Go(4,35,300);S - End
If StepSucess==-1 Then
StepSucess=Go(3,40,300);SE - DownArrow
If StepSucess==-1 Then
StepSucess=Go(5,37,300);SW - LeftArrow
Endif
Endif
Endif

If dy<0 Then
StepSucess=Go(0,33,300);N - PgUp
If StepSucess==-1 Then
StepSucess=Go(7,38,300);WN - UpArrow
If StepSucess==-1 Then
StepSucess=Go(1,39,300);NE - RightArrow
Endif
Endif
Endif
Endif
Wend
end sub


sub Go(dir,key,walkwait)
VAR x,y

x=UO.GetX()
y=UO.GetY()

while UO.GetDir()<>dir
UO.Press(key)
wait(walkwait)
If UO.GetDir()<>dir Then
Endif
wend

UO.Press(key)
wait(walkwait)

If x==UO.GetX() AND y==UO.GetY() Then
Endif

If x==UO.GetX() AND y==UO.GetY() Then
return -1
Else
return 1
Endif
end sub
Last edited by slonopotam on 2006-11-11 14:16:50, edited 1 time in total.
ДРВ
Spoiler
_________________
Антарес
Spoiler|Gostrabaiter|Umhra|Slog
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post by Scripts Writer »

Неужели ты не напишешь:

поиск моба?

Подойти к мобу смотри:

Code: Select all

Sub WalkN(x,y,Target)

Здесь за x -надо взять uo.GetX('finditem') ,y - uo.GetY('finditem'), Target - finditem. собственно.
finditem- найденый по типу моб. Понял? Другими словами в скрипте это будет смотреться так:

Code: Select all

WalkN(uo.GetX('finditem'),uo.GetY('finditem'),'finditem') 
.
Тут в аргументах функции сам понял-должны быть координаты и сериал объекта к какому идем. Мой тебе совет юзать ходилку Savage - SuperWalk. Имхо наиболее надежная.

Неужели ты не напишешь атаку моба ?
А ждать пока моб не умрёт?

Вот и весь твой скрипт. Теперь воплащай по командам.
slonopotam
Posts: 270
Joined: 2006-08-05 14:09:06
Contact:

Post by slonopotam »

Это ппц !!!

Этот ........ гдето в цыкл уходит, где, невижу. :evil: :evil:


Смысл скрипта. Шард Антарес. Орк таун. Перс ходит по комнатам и бьет визардов. Если умирает, идет к тотему и ресается, потом начинает все сначало.


Code: Select all

VAR ups = 1
VAR Vrag = '0x0190'
VAR Totem = '0x40FBA3D7'

sub Start()
repeat
hustle()
   wait(1000)
      until ups>2
end sub


Sub hustle()

UO.Print("//--------------------------\\")
UO.Print("|  ----  ЛОЖКИ  НЕТ   ----  ||")
UO.Print("\\--------------------------//")


GoToTile( 5561, 1881, 1, False ) ; go 2
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5561, 1881, 1, False ) ; go 2
Endif

GoToTile( 5561, 1876, 1, False ) ; go 3
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5561, 1876, 1, False ) ; go 3
Endif

GoToTile( 5555, 1876, 1, False ) ; go 10
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1876, 1, False ) ; go 3
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5555, 1876, 1, False ) ; go 10
Endif

GoToTile( 5561, 1876, 1, False ) ; go 3
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5561, 1876, 1, False ) ; go 3
Endif

GoToTile( 5561, 1867, 1, False ) ; go 4
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5561, 1867, 1, False ) ; go 4
Endif

GoToTile( 5555, 1867, 1, False ) ; go 9
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1867, 1, False ) ; go 4
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5555, 1867, 1, False ) ; go 9
Endif

GoToTile( 5561, 1867, 1, False ) ; go 4
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5561, 1867, 1, False ) ; go 4
Endif

GoToTile( 5561, 1859, 1, False ) ; go 5
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5561, 1859, 1, False ) ; go 5
Endif

GoToTile( 5556, 1859, 1, False ) ; go 8
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1859, 1, False ) ; go 5
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5556, 1859, 1, False ) ; go 8
Endif

GoToTile( 5561, 1859, 1, False ) ; go 5
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5561, 1859, 1, False ) ; go 5
Endif

GoToTile( 5561, 1851, 1, False ) ; go 6
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5561, 1851, 1, False ) ; go 6
Endif

GoToTile( 5555, 1851, 1, False ) ; go 7
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1851, 1, False ) ; go 6
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5555, 1851, 1, False ) ; go 7
Endif

GoToTile( 5561, 1851, 1, False ) ; go 6
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5561, 1881, 1, False ) ; go 2
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5561, 1851, 1, False ) ; go 6
Endif

GoToTile( 5561, 1881, 1, False ) ; go 2
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5561, 1881, 1, False ) ; go 2
Endif

GoToTile( 5538, 1881, 1, False ) ; go 1
If uo.dead() Then
uo.warmode(0)
UO.Print("GAME OVER")
GoToTile( 5538, 1881, 1, False ) ; go 1
Ress()
Else
Look()
GoToTile( 5538, 1881, 1, False ) ; go 1
Endif

uo.warmode(0)
UO.Print("//--------------------------\\")
UO.Print("|  -----   ФИГАСЕ !!!  ---  ||")
UO.Print("|  ----  С  ПЕРЕПУГУ  ----  ||")
UO.Print("|  ---  ВСЕХ  ПЕРЕБИЛ  ---  ||")
UO.Print("\\--------------------------//")

wait(30000)

end sub



Sub Ress()
repeat
uo.useobject(Totem)
wait(5000)
until not uo.dead()
wait(30000)
uo.exec('terminate hustle')
Start()
end sub

Sub War()
If UO.Count(Vrag) == 0 Then
Attack()
Else
wait(100)
Endif
end sub











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


sub Look()
   VAR Vrag = '0x0190'
   Repeat
      UO.FindType( '0x0190', '-1', '1' )
      If UO.FindCount() > 0 Then
War()
      Else
         wait( 500 )
      Endif
   Until UO.FindCount() == 0
   UO.IgnoreReset()
endsub


Sub War()
if uo.injournal('body') then
uo.deletejournal()
Attack()
endif
end sub


sub Attack()
uo.set('finddistance','6') 
VAR LastTimer, Attack 
repeat
UO.DeleteJournal()
UO.FindType(Vrag,-1,'ground')
if UO.FindCount("finditem")>0 then
Attack=UO.GetSerial('finditem')
UO.Exec('warmode 1')
UO.Attack(Attack)
WalkN(0,0,Attack)
LastTimer=UO.Timer()
repeat
wait(2000)
until uo.dead(Attack) or UO.InJournal('Body') OR LastTimer+150<UO.Timer()
endif
wait(500)
next
wait(200)
until uo.dead()
end sub

sub Ranger()
var skin = 1; ea?aou neeieia
var loot = 0; eooeou oaei
var loop = 1; aaoiiao
var dagger = 0x0F51
var body

UO.DeleteJournal()
repeat
repeat
wait(100)
until UO.InJournal("Body of")
body = UO.JournalSerial(UO.InJournal("Body of")-1)
UO.DeleteJournal()
if skin then
if UO.GetDistance(body) <= 2 then
UO.WarMode(0)
UO.SetArm('skin')
UO.WaitTargetObject(body)
UO.UseType(dagger)
wait(1000)
else
endif
UO.WarMode(0)
UO.SetArm('skin')
UO.WaitTargetObject(body)
UO.UseType(dagger)
wait(1000)
endif

if loot then
if UO.GetDistance(body) <= 2 then
F_Loot()
else
endif
endif

if skin then
UO.Arm('Weapon')# Iaaaiuoa i?o?ea aee?iaai aiye aaaaeoa neiaa ,setarm Weapon
endif
UO.WarMode(1)
until not loop
endsub


sub F_Loot()
DIM R[14]
var c
R[1]=0x0df8
R[2]=0x1078
R[3]=0x0EED
R[4]=0x09AA
R[5]=0x0F85
R[6]=0x0F7B
R[7]=0x0F8C
R[8]=0x0F7A
R[9]=0x0F84
R[10]=0x0F88
R[11]=0x0F8D
R[12]=0x0F86
R[13]=0x1BD1
R[14]=0x0F8F

for c=1 to 14
repeat
uo.findtype(R[c],"-1","lastcorpse")
if UO.FindCount()>0 and Uo.GetDistance("lastcorpse")<=4 then
UO.Grab("0","finditem")
wait(1200)
end if
until UO.FindCount()<1
wait(10)
next
endsub

sub Numb(num)
if num>=0 then
return num
else
return num*(-1)
end if
end sub

sub WalkN(x,y,Target)
VAR i,StepSucess
VAR dx,dy,Exit=0

While Exit<>1
If Target<>"" Then
dx=UO.GetX(Target)-UO.GetX()
dy=UO.GetY(Target)-UO.GetY()
If UO.GetDistance(Target)<2 Then
Exit=1
Endif
Else
dx=x-UO.GetX()
dy=y-UO.GetY()
If dx==0 AND dy==0 Then
Exit=1
Endif

Endif

If dx<>0 AND dy<>0 Then
If dx>0 AND dy>0 Then
StepSucess=Go(3,40,300);SE - DownArrow
Endif

If dx>0 AND dy<0 Then
StepSucess=Go(1,39,300);NE - RightArrow
Endif

If dx<0 AND dy>0 Then
StepSucess=Go(5,37,300);SW - LeftArrow
Endif

If dx<0 AND dy<0 Then
StepSucess=Go(7,38,300);WN - UpArrow
Endif

Endif

If dx<>0 AND dy==0 Then
If dx>0 Then
StepSucess=Go(2,34,300);E - PgDown
If StepSucess==-1 Then
StepSucess=Go(3,40,300);SE - DownArrow
If StepSucess==-1 Then
StepSucess=Go(1,39,300);NE - RightArrow
Endif
Endif
Endif

If dx<0 Then
StepSucess=Go(6,36,300);W - Home
If StepSucess==-1 Then
StepSucess=Go(7,38,300);WN - UpArrow
If StepSucess==-1 Then
StepSucess=Go(5,37,300);SW - LeftArrow
Endif
Endif
Endif
Endif


If dx==0 AND dy<>0 Then
If dy>0 Then
StepSucess=Go(4,35,300);S - End
If StepSucess==-1 Then
StepSucess=Go(3,40,300);SE - DownArrow
If StepSucess==-1 Then
StepSucess=Go(5,37,300);SW - LeftArrow
Endif
Endif
Endif

If dy<0 Then
StepSucess=Go(0,33,300);N - PgUp
If StepSucess==-1 Then
StepSucess=Go(7,38,300);WN - UpArrow
If StepSucess==-1 Then
StepSucess=Go(1,39,300);NE - RightArrow
Endif
Endif
Endif
Endif
Wend
end sub


sub Go(dir,key,walkwait)
VAR x,y

x=UO.GetX()
y=UO.GetY()

while UO.GetDir()<>dir
UO.Press(key)
wait(walkwait)
If UO.GetDir()<>dir Then
Endif
wend

UO.Press(key)
wait(walkwait)

If x==UO.GetX() AND y==UO.GetY() Then
Endif

If x==UO.GetX() AND y==UO.GetY() Then
return -1
Else
return 1
Endif
end sub
ДРВ
Spoiler
_________________
Антарес
Spoiler|Gostrabaiter|Umhra|Slog
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post by Scripts Writer »

Такие шедевры пишут люди типо тебя, которые не рассуждают алгоритмически.Многие так начинали.
Посмотри критерии написания нормальных скриптов. Пост ёко есть-какими должны быть скрипты.
GimFlex
Expert!
Posts: 766
Joined: 2005-01-07 13:22:19
Contact:

Post by GimFlex »

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

Code: Select all

;Описание:
;
;чар стоит в магазе где респятся вендоры муж. или жен. пола
;если вендор обнаружен то подходим киляем и лутаем
;лутаются все вещи, кот. были в трупе (для простоты, но можно выборочно исп. скрипт на лут)
;как все слутает прячется в хайд и ждет следущего вендора
;
;Настройка:
;
;ничего не надо приходим в магаз и запускаем
; в инже желательно чтобы галки стояли "TWI" и "Target XYZ fix"
;
;from GimFlex aka Question


sub boneapetite()
var vendor='';тут ничего не меняй
var corpse='';тут тоже -)
var t1='0x0190'#man
var t2='0x0191'#woman
uo.set('finddistance','6'); размер поиска в зависимости от магаза от 1 до 14 ставь
while not uo.dead()
uo.findtype(t1,'-1','ground')
if uo.findcount()>0 then
 vendor=uo.getserial('finditem')
 while uo.getdistance(vendor)>2
  GotoXY(uo.getx(vendor),uo.gety(vendor),2)
 wend 
 uo.warmode(1)
 uo.deletejournal()
 uo.attack(vendor)
       repeat
         wait(100)         
         if uo.getdistance(vendor)>2 then
            GotoXY(uo.getx(vendor),uo.gety(vendor),2)
         end if
       until uo.injournal("Body of")
       CheckLag()
      uo.warmode(0)
      wait(100)
      uo.deletejournal()
  corpse=uo.getserial('lastcorpse')
  uo.useobject(corpse)
  wait(700)
  CheckLag()
  uo.findtype('-1','-1',corpse)
  while uo.findcount()>0
   uo.moveitem('finditem','all','backpack')
   wait(700)
   CheckLag()
   uo.findtype('-1','-1',corpse)
  wend
endif
CheckLag()
uo.findtype(t2,'-1','ground')
if uo.findcount()>0 then
 vendor=uo.getserial('finditem')
 while uo.getdistance(vendor)>2
  GotoXY(uo.getx(vendor),uo.gety(vendor),2)
 wend 
 uo.warmode(1)
 uo.deletejournal()
 uo.attack(vendor)
       repeat
         wait(100)         
         if uo.getdistance(vendor)>2 then
            GotoXY(uo.getx(vendor),uo.gety(vendor),2)
         end if
       until uo.injournal("Body of")
      uo.warmode(0)
      wait(100)
      uo.deletejournal()
  corpse=uo.getserial('lastcorpse')
  uo.useobject(corpse)
  wait(700)
  CheckLag()
  uo.findtype('-1','-1',corpse)
  while uo.findcount()>0
   uo.moveitem('finditem','all','backpack')
   wait(700)
   CheckLag()
   uo.findtype('-1','-1',corpse)
  wend
endif
CheckLag()
ToHide()
wait(5000)
CheckLag()
wend
end sub


Sub GotoXY(x,y,k)
   var kop
   VAR i,j,m
   VAR dir,ldir,rdir,key,olddir
   VAR dx,dy,Exit=0
   VAR CacheLimit=9,CacheIndex="Text"
   DIM CacheX[10], CacheY[10]
   
   CacheX[0]="Test"
   kop=0
   While Exit<>1   
     
      for j=-1 to 1
       for m=-1 to 1
         dx=x-UO.GetX()
         dy=y-UO.GetY()
         If dx==j AND dy==m Then
            Exit=1
         Endif
       next
      next
           
      If dx<>0 AND dy<>0 Then
         If dx>0 AND dy>0 Then ; GoSE
            dir=3
            ldir=2
            rdir=4
            key=40 ; DownArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==2 Then ; GoNE
                  dir=1
                  ldir=0
                  rdir=1
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=5
                  rdir=6
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif

         If dx>0 AND dy<0 Then ; GoNE
            dir=1
            ldir=0
            rdir=2
            key=39 ; RightArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==0 Then ; GoWN
                  dir=7
                  ldir=6
                  rdir=7
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSE
                  dir=3
                  ldir=3
                  rdir=4
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif

         If dx<0 AND dy>0 Then ; GoSW
            dir=5
            ldir=4
            rdir=6
            key=37 ; LeftArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==6 Then ; GoWN
                  dir=7
                  ldir=7
                  rdir=0
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSE
                  dir=3
                  ldir=2
                  rdir=3
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif

         If dx<0 AND dy<0 Then ; GoWN
            dir=7
            ldir=6
            rdir=0
            key=38 ; UpArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==0 Then ; GoNE
                  dir=1
                  ldir=1
                  rdir=2
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=4
                  rdir=5
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
      Endif
   
      If dx<>0 AND dy==0 Then
         If dx>0 Then ; GoE
            dir=2
            key=34 ; PgDown
            olddir=UO.GetDir()
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==2 Then ; GoSE
                  dir=3
                  ldir=3
                  rdir=4
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoNE
                  dir=1
                  ldir=1
                  rdir=0
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
         
         If dx<0 Then ; GoW
            dir=6
            key=36 ; Home key
            olddir=UO.GetDir()
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==0 Then ; GoWN
                  dir=7
                  ldir=7
                  rdir=0
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=4
                  rdir=5
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
      Endif

      If dx==0 AND dy<>0 Then
         If dy>0 Then ; GoS
            dir=4
            key=35 ; End
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==2 Then ; GoSE
                  dir=3
                  ldir=2
                  rdir=3
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=6
                  rdir=5
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
         
         If dy<0 Then ;GoN
            dir=0
            key=33 ; PgUp
            olddir=UO.GetDir()
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==2 Then ; GoNE
                  dir=1
                  ldir=1
                  rdir=2
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoWN
                  dir=7
                  ldir=7
                  rdir=6
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
      Endif
     endif
   Wend
end sub


Sub StepEdit(x,y,dir,key)
   VAR walkwait=300
   VAR ErrLevel=0
   If UO.GetDir()<>dir Then
      UO.Press(key)
      wait(walkwait)
      If UO.GetDir()<>dir Then
         CheckLag()
      Endif
   Endif
   UO.Press(key)
   wait(walkwait)
   If x==UO.GetX() AND y==UO.GetY() Then
      CheckLag()
      If x==UO.GetX() AND y==UO.GetY() Then
         ErrLevel=1
      Endif
   Endif
   Return ErrLevel
end sub


Sub StepArrow(x,y,dir,ldir,rdir,key)
   VAR walkwait=300
   VAR ErrLevel=0
   If UO.GetDir()<>dir Then
      UO.Press(key)
      wait(walkwait)
      If UO.GetDir()<>dir AND UO.GetDir()<>ldir AND UO.GetDir()<>rdir Then
         CheckLag()
      Endif
   Endif

   If UO.GetX()==x AND UO.GetY()==y Then
      UO.Press(key)
      wait(walkwait)
      If UO.GetDir()==dir AND UO.GetX()==x AND UO.GetY()==y Then
         CheckLag()
         If UO.GetDir()==dir AND UO.GetX()==x AND UO.GetY()==y Then         
            ErrLevel=1
         Endif
      Endif
   Endif
   Return ErrLevel
end sub

Sub CheckLag()
    UO.DeleteJournal()
    UO.Click('backpack')
    repeat
       wait(50)
    until UO.InJournal('backpack')
end sub

Sub ToHide()
while not uo.hidden()
   UO.DeleteJournal()
   uo.useskill("Hiding")
   repeat
      wait(10)
   until UO.InJournal("You have hidden yourself well") or UO.InJournal("You can't seem to hide here.") or UO.InJournal("You are preoccupied with thoughts of battle.")
   if UO.InJournal("You are preoccupied with thoughts of battle.") then
      uo.exec("warmode 1")
      wait(100)
      uo.exec("warmode 0")
      wait(100)
   end if
wend
end sub
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post by Scripts Writer »

А заигнорить себя не хочешь?! Или на шарде у игроков отличные от муж. и жен. полов нпс типы?
GimFlex
Expert!
Posts: 766
Joined: 2005-01-07 13:22:19
Contact:

Post by GimFlex »

You Must Die wrote:А заигнорить себя не хочешь?! Или на шарде у игроков отличные от муж. и жен. полов нпс типы?


угу в точку различные
slonopotam
Posts: 270
Joined: 2006-08-05 14:09:06
Contact:

Post by slonopotam »

Да на это есть скрипт, такой ненадо.
Нужно именно чтоб бегал, догонял, ресался.
ДРВ
Spoiler
_________________
Антарес
Spoiler|Gostrabaiter|Umhra|Slog
slonopotam
Posts: 270
Joined: 2006-08-05 14:09:06
Contact:

Post by slonopotam »

Переделал, чтоб читался легче... Но помоему легче не стало.

Смысл скрипта. Шард Антарес. Орк таун. Перс ходит по комнатам и бьет визардов. Если умирает, идет к тотему и ресается, потом начинает все сначало.

После того как в 1 раз идет по координатам,

Code: Select all

GoToTile( 5561, 1881, 1, False )

Гдето циклится и встает, хотя скрипт работать продолжает.



Code: Select all

VAR ups = 1
VAR Vrag = '0x0190'
VAR Totem = '0x40FBA3D7'
###############################################################################
####                          задаем общий цыкл                     ###########
###############################################################################
sub Start()
   repeat
hustle()
   wait(1000)
   until ups>2
end sub

##############################################################################
######                        основной скрипт                        #########
##############################################################################
Sub hustle()
UO.Print("//--------------------------\\")
UO.Print("|  ----  ЛОЖКИ  НЕТ   ----  ||")
UO.Print("\\--------------------------//")
GoToTile( 5561, 1881, 1, False )  ; ХОДИМ ПО КООРДИНАТАМ
If uo.dead() Then   ;  ПРОВЕРКА НА ТО ЖИВ ИЛИ НЕТ
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5538, 1881, 1, False ) ; ЕСЛИ МЕРТВ ТО ИДЕМ РЕСАТСЯ
    Ress()    ;  ЗАПУСКАЕМ СКРИПТ НА РЕСС
   Else
  Look()    ;  ЕСЛИ ЖИВ ЗАПУСКАЕМ СКРИПТ НА КИЛЛИНГ
 GoToTile( 5561, 1881, 1, False ) ; ВОЗВРАЩАЕМСЯ ТУДА ГДЕ НАЧАЛИ КИЛЛИНГ
Endif
GoToTile( 5561, 1876, 1, False ) ; ИДЕМ ДАЛЬШЕ
If uo.dead() Then     ;  И ТАК ДАЛЕЕ
 uo.warmode(0)
  UO.Print("GAME OVER")
  GoToTile( 5561, 1881, 1, False )
   GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5561, 1876, 1, False )
Endif
GoToTile( 5555, 1876, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5561, 1876, 1, False )
    GoToTile( 5561, 1881, 1, False )
     GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5555, 1876, 1, False )
Endif
GoToTile( 5561, 1876, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5561, 1881, 1, False )
    GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5561, 1876, 1, False )
Endif
GoToTile( 5561, 1867, 1, False ) 
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5561, 1881, 1, False )
    GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5561, 1867, 1, False )
Endif
GoToTile( 5555, 1867, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5561, 1867, 1, False )
    GoToTile( 5561, 1881, 1, False )
     GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5555, 1867, 1, False )
Endif
GoToTile( 5561, 1867, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5561, 1881, 1, False )
    GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5561, 1867, 1, False )
Endif
GoToTile( 5561, 1859, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5561, 1881, 1, False )
    GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5561, 1859, 1, False )
Endif
GoToTile( 5556, 1859, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5561, 1859, 1, False )
    GoToTile( 5561, 1881, 1, False )
     GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5556, 1859, 1, False )
Endif
GoToTile( 5561, 1859, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5561, 1881, 1, False )
    GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5561, 1859, 1, False )
Endif
GoToTile( 5561, 1851, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5561, 1881, 1, False )
    GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5561, 1851, 1, False )
Endif
GoToTile( 5555, 1851, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5561, 1851, 1, False )
    GoToTile( 5561, 1881, 1, False )
     GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5555, 1851, 1, False )
Endif
GoToTile( 5561, 1851, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5561, 1881, 1, False )
    GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5561, 1851, 1, False )
Endif
GoToTile( 5561, 1881, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5561, 1881, 1, False )
Endif
GoToTile( 5538, 1881, 1, False )
If uo.dead() Then
 uo.warmode(0)
  UO.Print("GAME OVER")
   GoToTile( 5538, 1881, 1, False )
    Ress()
   Else
  Look()
 GoToTile( 5538, 1881, 1, False )
Endif

uo.warmode(0)
UO.Print("//--------------------------\\")   ; ВСЕХ ПЕРЕБИЛ
UO.Print("|  -----   ФИГАСЕ !!!  ---  ||")
UO.Print("|  ----  С  ПЕРЕПУГУ  ----  ||")
UO.Print("|  ---  ВСЕХ  ПЕРЕБИЛ  ---  ||")
UO.Print("\\--------------------------//")

wait(30000)  ; ЖДЕМ 30 СЕК

end sub

#############################################################################
###            РЕСАЕМСЯ НА ТОТЕМЕ                                         ###
#############################################################################

Sub Ress()          ;  МОДУЛЬ НА РЕСС
 repeat   
  uo.useobject(Totem)    ЮЗАЕМ РЕСС ТОТЕМ
 wait(5000)     ;ЖДЕМ
until not uo.dead()   ; КОРОЧЕ ПОКА НЕ ОЖИВЕМ БУДЕМ ДОЛБИТСЯ В ТОТЕМ
 wait(30000)     ; ЖДЕМ 30 СЕК (РЕСП МОБОВ)
  uo.exec('terminate hustle')  ; УБИВАЕМ ОСНОВНОЙ СКРИПТ
 Start()  ; ЗАПУСКАЕМ ЗАНОВО
end sub

#############################################################################
###                 МОДУЛЬ ПОИСКА                                         ###
#############################################################################


sub Look()   ;  МОДУЛЬ ПОИСКА ВРАЖИН
   VAR Vrag = '0x0190'  ; ВОТ ЭТИХ ( ПО ТИПУ)
   Repeat
      UO.FindType( '0x0190', '-1', '1' )
      If UO.FindCount() > 0 Then  ;  НАШЛИ ???
War()    ;   ВАЛИМ ЕГО
      Else
         wait( 500 )   ; ИНАЧЕ БЬЕМ
      Endif
   Until UO.FindCount() == 0
   UO.IgnoreReset()   ;  НУ ЧТОБ С ПЕРЕПУГУ НЕ ПОВРЕДИТСЯ =)
endsub

#############################################################################
###            МОДУЛЬ ЗАПУСКА ОСНОВНОГО КИЛЛА                             ###
#############################################################################


Sub War()       ; МОДУЛЬ ЗАПУСКА КИЛЛИНГА
 if uo.injournal('body') then   ; ПОКА НЕ УБЪЕМ
  uo.deletejournal()
  Attack()   ;  ЗАПУСК КИЛЛА
 endif
end sub


#############################################################################
###            А ТУТ МЫ ИХ И УБИВАЕМ И ДОГОНЯЕМ                           ###
#############################################################################

sub Attack()
 uo.set('finddistance','6') 
  VAR LastTimer, Attack 
   repeat
  UO.DeleteJournal()
 UO.FindType(Vrag,-1,'ground')
if UO.FindCount("finditem")>0 then
 Attack=UO.GetSerial('finditem')
  UO.Exec('warmode 1')
   UO.Attack(Attack)
  WalkN(0,0,Attack)
 LastTimer=UO.Timer()
repeat
 wait(2000)
 until uo.dead(Attack) or UO.InJournal('Body') OR LastTimer+150<UO.Timer()
endif
 wait(500)
  next
  wait(200)
 until uo.dead()
end sub

sub Ranger()
var skin = 1; ea?aou neeieia
var loot = 0; eooeou oaei
var loop = 1; aaoiiao
var dagger = 0x0F51
var body

UO.DeleteJournal()
repeat
repeat
wait(100)
until UO.InJournal("Body of")
body = UO.JournalSerial(UO.InJournal("Body of")-1)
UO.DeleteJournal()
if skin then
if UO.GetDistance(body) <= 2 then
UO.WarMode(0)
UO.SetArm('skin')
UO.WaitTargetObject(body)
UO.UseType(dagger)
wait(1000)
else
endif
UO.WarMode(0)
UO.SetArm('skin')
UO.WaitTargetObject(body)
UO.UseType(dagger)
wait(1000)
endif

if loot then
if UO.GetDistance(body) <= 2 then
F_Loot()
else
endif
endif

if skin then
UO.Arm('Weapon')# Iaaaiuoa i?o?ea aee?iaai aiye aaaaeoa neiaa ,setarm Weapon
endif
UO.WarMode(1)
until not loop
endsub


sub F_Loot()
DIM R[14]
var c
R[1]=0x0df8
R[2]=0x1078
R[3]=0x0EED
R[4]=0x09AA
R[5]=0x0F85
R[6]=0x0F7B
R[7]=0x0F8C
R[8]=0x0F7A
R[9]=0x0F84
R[10]=0x0F88
R[11]=0x0F8D
R[12]=0x0F86
R[13]=0x1BD1
R[14]=0x0F8F

for c=1 to 14
repeat
uo.findtype(R[c],"-1","lastcorpse")
if UO.FindCount()>0 and Uo.GetDistance("lastcorpse")<=4 then
UO.Grab("0","finditem")
wait(1200)
end if
until UO.FindCount()<1
wait(10)
next
endsub

sub Numb(num)
if num>=0 then
return num
else
return num*(-1)
end if
end sub

sub WalkN(x,y,Target)
VAR i,StepSucess
VAR dx,dy,Exit=0

While Exit<>1
If Target<>"" Then
dx=UO.GetX(Target)-UO.GetX()
dy=UO.GetY(Target)-UO.GetY()
If UO.GetDistance(Target)<2 Then
Exit=1
Endif
Else
dx=x-UO.GetX()
dy=y-UO.GetY()
If dx==0 AND dy==0 Then
Exit=1
Endif

Endif

If dx<>0 AND dy<>0 Then
If dx>0 AND dy>0 Then
StepSucess=Go(3,40,300);SE - DownArrow
Endif

If dx>0 AND dy<0 Then
StepSucess=Go(1,39,300);NE - RightArrow
Endif

If dx<0 AND dy>0 Then
StepSucess=Go(5,37,300);SW - LeftArrow
Endif

If dx<0 AND dy<0 Then
StepSucess=Go(7,38,300);WN - UpArrow
Endif

Endif

If dx<>0 AND dy==0 Then
If dx>0 Then
StepSucess=Go(2,34,300);E - PgDown
If StepSucess==-1 Then
StepSucess=Go(3,40,300);SE - DownArrow
If StepSucess==-1 Then
StepSucess=Go(1,39,300);NE - RightArrow
Endif
Endif
Endif

If dx<0 Then
StepSucess=Go(6,36,300);W - Home
If StepSucess==-1 Then
StepSucess=Go(7,38,300);WN - UpArrow
If StepSucess==-1 Then
StepSucess=Go(5,37,300);SW - LeftArrow
Endif
Endif
Endif
Endif


If dx==0 AND dy<>0 Then
If dy>0 Then
StepSucess=Go(4,35,300);S - End
If StepSucess==-1 Then
StepSucess=Go(3,40,300);SE - DownArrow
If StepSucess==-1 Then
StepSucess=Go(5,37,300);SW - LeftArrow
Endif
Endif
Endif

If dy<0 Then
StepSucess=Go(0,33,300);N - PgUp
If StepSucess==-1 Then
StepSucess=Go(7,38,300);WN - UpArrow
If StepSucess==-1 Then
StepSucess=Go(1,39,300);NE - RightArrow
Endif
Endif
Endif
Endif
Wend
end sub


sub Go(dir,key,walkwait)
VAR x,y

x=UO.GetX()
y=UO.GetY()

while UO.GetDir()<>dir
UO.Press(key)
wait(walkwait)
If UO.GetDir()<>dir Then
Endif
wend

UO.Press(key)
wait(walkwait)

If x==UO.GetX() AND y==UO.GetY() Then
Endif

If x==UO.GetX() AND y==UO.GetY() Then
return -1
Else
return 1
Endif
end sub










########################################################################
### ЭТА ХОДИЛКА ЧУЖАЯ, ПОЭТОМУ В ОТЛИЧИИ ОТ ОСТАЛЬНОГО, РАБОТАЕТ =)) ###
########################################################################


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








Переделал, чтоб читался легче... Но помоему легче не стало.
ДРВ
Spoiler
_________________
Антарес
Spoiler|Gostrabaiter|Umhra|Slog
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post by Scripts Writer »

Да убей ты этот скрипт.
slonopotam
Posts: 270
Joined: 2006-08-05 14:09:06
Contact:

Post by slonopotam »

Другой надо писать, но помоему, получится не лучше :shock:
ДРВ
Spoiler
_________________
Антарес
Spoiler|Gostrabaiter|Umhra|Slog
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post by Scripts Writer »

slonopotam wrote:Другой надо писать, но помоему, получится не лучше :shock:


Зря сомневаешься что получится хуже- ты только уясни критерии скрипта и делай так как надо-примеров полно.
GimFlex
Expert!
Posts: 766
Joined: 2005-01-07 13:22:19
Contact:

Post by GimFlex »

slonopotam wrote:Другой надо писать, но помоему, получится не лучше :shock:


был бы я щас в том месте где орки написал бы с нуля а так извени :wink:
slonopotam
Posts: 270
Joined: 2006-08-05 14:09:06
Contact:

Post by slonopotam »

Question_GimFlex wrote:
slonopotam wrote:Другой надо писать, но помоему, получится не лучше :shock:


был бы я щас в том месте где орки написал бы с нуля а так извени :wink:


Так велком на Антарес. :D
ДРВ
Spoiler
_________________
Антарес
Spoiler|Gostrabaiter|Umhra|Slog
slonopotam
Posts: 270
Joined: 2006-08-05 14:09:06
Contact:

Post by slonopotam »

Новый вопрос.
Чар бегает, убивает мобов. Убил 1 побежал к другому, убил и т.д. Тоесть нашел моба, подбежал, и бьет пока не появится сообщение "body". Потом заново. А если я не 1 там бегаю, получается буду реагировать и на боди от других чаров?? Как можно узнать что я убил моба, если не брать во внимание журнал, а конкретно "боди".
ДРВ
Spoiler
_________________
Антарес
Spoiler|Gostrabaiter|Umhra|Slog
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post by Scripts Writer »

1. Имя монстра. (Body of zombie [0])

2. После появления Body в журнале можешь повторить повторный поиск около себя(1-2 клетки) :
а) Трупа твоего нпс
б) Живого твоего нпс
В обоих случаях, даже если ктото и убил моба далеко, то труп ты не найдёшь => моб которого ты бил-живой. Ну и поиск живого моба тож самое- если в журнале боди, ищи-если найден около себя(1-2 клетки) то продолжаем бить пока в журнале нет боди ...

Перед циклом в котором проверка условия на наличие Боди в журнале, зделай просто еще один цикл на поиск. Смотри пример:

Code: Select all

 uo.DeleteJournal()
 uo.Set('finddistance','2')
 repeat
   uo.FindType(npc,'-1','ground')
   if uo.FindCount() then
     repeat
       uo.Attack('finditem')
       wait(1000)
     until uo.InJournal('Body')
     uo.DeleteJournal()
   else
     # Loot() ...
   end if
 until not uo.FindCount()


Грубый пример 2ух циклов с выходом в случае выполнения 2ух условий: в журнале боди и отсутствием живого нпс в радиусе 2ух клеток. (можешь еще поиск трупа ввести вокруг себя как третье условие смерти моба когда выполнятся предыдущие 2 )

п.с. Могу ошибаться, но помоему еще можно

Code: Select all

while not uo.Dead([object])
использовать.
GenDor
Posts: 45
Joined: 2006-11-06 00:55:40
Contact:

Post by GenDor »

Вот те простенькая норм ходилка:

Code: Select all

###     ХОДИЛКА    ###

sub gotoxy(x,y,prec)
var ld=0,ldc=0
var dx,dy
var mx,my
var ox,oy,mk,k
#uo.print(">")
#uo.track("1",str(x),str(y))
start:
mx=UO.GetX()
my=UO.GetY()
dx=mx-x
if dx<0 then
dx=0-dx
endif
dy=my-y
if dy<0 then
dy=0-dy
endif
if dy>dx then
dx=dy
end if
if dx<=prec then
return
end if
if not ldc then
uo.print(STR(dx))
end if
if dx<3 then
mk=70
else
mk=15
end if

ox=mx
oy=my
for k=1 to mk
mx=UO.GetX()
my=UO.GetY()
if mx<>ox or my<>oy then
goto sdidapl
end if
wait(10)
next
sdidapl:

mx=UO.GetX()
my=UO.GetY()
dx=mx-x
if dx<0 then
dx=0-dx
endif
dy=my-y
if dy<0 then
dy=0-dy
endif
if dy>dx then
dx=dy
end if

if dx<=prec then
return
end if
if ld==dx then
ldc=ldc+1
if ldc>100 then
uo.print("Can not reach location!")
return
end if
else
ld=dx
end if

if mx==x then
if my==y then
return
endif
if my>y then
#UO.Print("UR")
UO.Press(33)
goto start
endif
#UO.Print("DL")
UO.Press(35)
goto start
end if
if mx<x then
if my>y then
#UO.Print("R")
UO.Press(39)
goto start
endif
if my==y then
#UO.Print("DR")
UO.Press(34)
goto start
endif
#UO.Print("D")
UO.Press(40)
goto start
end if
if my<y then
#UO.Print("L")
UO.Press(37)
goto start
endif
if my==y then
#UO.Print("LU")
UO.Press(36)
goto start
endif
#UO.Print("U")
UO.Press(38)
goto start
end sub
[img][/img]
slonopotam
Posts: 270
Joined: 2006-08-05 14:09:06
Contact:

Post by slonopotam »

Я правильно проверяю жим мой чар или нет?

Code: Select all

If uo.dead() Then
...
Else
...
end if

Есть другие варианты?
ДРВ
Spoiler
_________________
Антарес
Spoiler|Gostrabaiter|Umhra|Slog
slonopotam
Posts: 270
Joined: 2006-08-05 14:09:06
Contact:

Post by slonopotam »

Как сделать проверку на заполненость бекпака? Тоесть

Code: Select all

If в бекпаке > 200 итемов Then
script()
Else
script2()
end if


Так надо??

Code: Select all

If UO.Count()> 200 Then
script()
Else
script2()
End if
ДРВ
Spoiler
_________________
Антарес
Spoiler|Gostrabaiter|Umhra|Slog
Post Reply