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