Переделал, чтоб читался легче... Но помоему легче не стало.
Смысл скрипта. Шард Антарес. Орк таун. Перс ходит по комнатам и бьет визардов. Если умирает, идет к тотему и ресается, потом начинает все сначало.
Гдето циклится и встает, хотя скрипт работать продолжает.
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
Переделал, чтоб читался легче... Но помоему легче не стало.