MakeBandage for Injection
Posted: Thu Nov 03, 2011 6:17 am
While doing today bandages, quickly drew a macro for the manufacture of bandages. The essence is that you come to taylor in Skara Brae and run the macro, after all he will do, he will be released and the building taylor.
Пока делал сегодня бинты, быстренько нарисовал макрос на изготовление бинтов. Суть в том, что вы подходите к тэйлору в Skara Brae и запускаете макрос, после того как он все сделает, он сам выйдет и здания тэйлора.
Пока делал сегодня бинты, быстренько нарисовал макрос на изготовление бинтов. Суть в том, что вы подходите к тэйлору в Skara Brae и запускаете макрос, после того как он все сделает, он сам выйдет и здания тэйлора.
Code: Select all
################## Äåëàåì áèíòû ##########################
Sub MakeBandages()
Walker(2880,3497,0)
BallOfYarn()
Walker(2880,3500,10)
Walker(2877,3497,0)
BallOfCloth()
Walker(2876,3498,0)
Walker(2880,3499,0)
Walker(2887,3503,0)
end sub
sub BallOfYarn()
var Pile = "0x0DF8" ; Pile of Wool
var Wheel = "0x1015" ; Spinning wheel
var timeleft_BallOfYarn
UO.DeleteJournal("cliloc# 0x6B90")
uo.findtype(Pile,-1,'my')
repeat
timeleft_BallOfYarn = 5000
UO.DeleteJournal("cliloc# 0x6B90")
uo.findtype(Wheel,-1,'ground')
uo.waittargetobject('finditem')
uo.findtype(Pile,-1,'my')
uo.useobject('finditem')
repeat
wait(150)
timeleft_BallOfYarn = timeleft_BallOfYarn - 150
until UO.InJournal("cliloc# 0x6B90") or timeleft_BallOfYarn <= 0
wait(100)
until not uo.findcount()
uo.Print('Done.')
end sub
sub BallOfCloth()
var Yarn = "0x0E1D" ; Ball of Yarn
var Loom = "0x1062" ; Upright loom
var timeleft_BallOfCloth
uo.Set('finddistance', 1)
uo.findtype(Yarn,-1,'my')
repeat
timeleft_BallOfCloth = 5000
uo.findtype(Loom,-1,'ground')
uo.waittargetobject('finditem')
uo.findtype(Yarn,-1,'my')
uo.useobject('finditem')
wait(1000)
until not uo.findcount()
uo.Print('Done.')
end sub
######################## ÊÎÍÅÖ ################################
########################################## ÕÎÄÈËÊÀ ################################
#var Prec=3 # Êàê áëèçêî ñëåäóåò ïîäîéòè ê öåëè (Precision)
#var MaxTraceDistance=15 # Ìàêñèìàëüíàÿ äëèíà îáõîäà. Æåëàòåëüíî ñòàâèòü ñ ðàñ÷åòà âîçìîæíûõ ïðåïÿòñâèé. Åñëè ñòàâèòü î÷åíü #áîëüøèå ÷èñëà, êîäèëêà ìîæåò ïîéòè â îáõîä ïîë ìèðà ÷òîáû äîéòè ê ñîñåäíåìó äåðåâó.
#var Speed=2 # Äëèíà øàãà. Ñêîëüêî øàãîâ äåëàòü çà ðàç. Âûøå 3 ñòàâèòü ñìûñëà íåò. Òîåñòü òóïîå óìíîæåíèå øàãîâ. Äëÿ ëàìáåðà #èäåàëüíî 3, äëÿ ìàéíèíãà - 1.
#var StepTimeOut=400 # Åñëè óïåðëèñü â íåîïîçíàííûé îáüåêò, ñêîëüêî ìñåê æäàòü ñäâèãà ñ ìåñòà. Åñëè ïî ïðîñòîìó - òàéìàóò #øàãà. Åñëè ïîñòàâèòü ñèëüíî ìàëåíüêèå, õîäèëêà íà÷íåò òðàññèðîâàòü ïóñòûå ìåñòà.
#UO.SetGlobal("Logging","1") # - ïîêàçûâàòü îòëàäî÷íûå ñîîáùåíèÿ.
#UO.SetGlobal("BlindWalk","0") # - íå èñïîëüçîâàòü ïðîâåðêó òàéëîâ, à èñïîëüçîâàòü õîäüáó íàîùóïü. Äëÿ ìàéíèíãà ÎÁßÇÀÒÅËÜÍÎ #ÂÊËÞ×ÈÒÜ.
#Â ôóíêöèè IsPass, ñîäåðæèòüñÿ ñïèñîê ïðîõîäèìûõ òàéëîâ.
#Walker(X,Y,Prec) - èäåì ê öåëè ñ êîîðäèíàòàìè X,Y. Âîçâðàùàåò 1 â ñëó÷àå óñïåøíîãî äîñòèæåíèÿ öåëè, è 0 - ïðè íåâîçìîæíîì îáõîäå (ïóòü íå íàéäåí)
#Tracer(StartDir,Direction) - òðàññèðîâêà 1 øàãà. Âîçâðàùàåò íàïðàâëåíèå ïî êîòîðîìó ïîëó÷èëîñü ñäâèíóòüñÿ ñ ìåñòà. StartDir #- íàïðàâëåíèå ïîñëåäíåãî äâèæåíèÿ, Direction (-1 èëè +1) íàïðàâëåíèå îáõîäà. -1 - ïî ÷àñîâîé ñòðåëêå, +1 ïðîòèâ ÷àñîâîé #ñòðåëêè. Íàïðàâëåíèÿ ñêðèïò èñïîëüçóåò ëè÷íîãî ôîðìàòà:
#1 - âëåâî âíèç
#2 - âíèç
#3 - âïðàâî âíèç
#4 - âïðàâî
#5 - âïðàâî ââåðõ
#6 - ââåðõ
#7 - âëåâî ââåðõ
#8 - âëåâî
#Tracer(StartDir,Direction) - èäåàëüíî ïîäõîäèò äëÿ ðûáàëêè âäîëü áåðåãà òàê êàê îíà áóäåò îáõîäèòü áåðåã áåñêîíå÷íî (1 #çàïóñê ôóíêöèè = 1 øàã îáõîäà).
#####################################################
# WW W WW AA LL Kk KK EE EE RRR #
# WW W WW AA A LL Kk K EEE R R #
# WW W WW AA A LL KKK EEEEE R R #
# WW WW WW AAAA LL KKK EEE RRR #
# WWW WWW AA A LLLL KK Kk EE EE R RR #
####################################################
var MaxTraceDistance=10
var TraceLoopIncrease=2#Óâåëè÷åíèå MaxTraceDistance ïðè èñ÷åðïàíèè êîëè÷åñòâà õîäîâ
var LimitTrace=15#Ñêîëüêî øàãîâ â ÎÁÅ ñòîðîíû îò íà÷àëüíîé òî÷êè îáõîäà ïðåêðàùàþò õîäèëêó (âûõîäà íåò).
var Speed=1
var StepTimeOut=300#Òàéìàóò øàãà. Óñòàíàâëèâàòü íå â ðàçìåð ïèíãà, à â ðàçìåð øàãà + ðàçìåð ïèíãà.
# Äëÿ õîäüáû - 500+Ping
# Äëÿ áåãà/õîäüáû íà ëîøàäè - 300+Ping
# Áåã íà ëîøàäè - 150 + Ping
var CheckCnt=1 #Êîëè÷åñòâî ñëåïûõ ïðîâåðîê. ÓÂÅËÈ×ÈÂÀÅÒ Â ÑÒÎËÜÊÎ ÐÀÇ ÒÀÉÌÀÓÒ. Èñïîëüçîâàòü òîëüêî íà ÁÛÑÒÐÎÌ íî ÍÅÑÒÀÁÈËÜÍÎÌ êîííåêòå. Ïðè áîëüøîì ïèíãå áóäåò ÓÆÀÑ.
var DynamicPause=30 #Ìèíèìàëüíûå ïàóçû â öèêëàõ. ×åì ìåíüøå ÷èñëî - òåì ìåíüøå ðûâêîâ è òåì áîëüøå íàãðóçêà ïðîöåññîðà.
Sub Walker(GoX,GoY,Prec)
UO.SetGlobal("Logging","0")
UO.SetGlobal("BlindWalk","0")
var LastDir
var MoveRes
var TracerCnt
UO.SetGlobal("GlobalGoX",str(GoX))
UO.SetGlobal("GlobalGoY",str(GoY))
while not IsEnd(GoX,GoY,Prec)
TracerCnt = MaxTraceDistance
repeat
LogInfo('Just walking')
LastDir=GoUntilHit(GoX,GoY,Prec)
if IsEnd(GoX,GoY,Prec) then
return 1
end if
LogInfo('Tracing')
MoveRes = FullAroundTrace(LastDir,GoX,GoY,Prec,TracerCnt)
if TracerCnt > LimitTrace then
return 0
endif
TracerCnt = TracerCnt + TraceLoopIncrease
until MoveRes == 1
wend
return 1
end sub
Sub FullAroundTrace(StartDir,GoX,GoY,Prec,MaxTrace)
var LineX=UO.GetX()
var LineY=UO.GetY()
var CurDir=StartDir
var Direction=CountDirection(GoX,GoY,CurDir,Prec)
var StartX,StartY
var MovesDone=0
repeat
StartX=UO.GetX()
StartY=UO.GetY()
CurDir=Tracer(CurDir,Direction,Prec)
if (CurDir==GetDir(GoX,GoY,Prec)) then
return 1
endif
if MovesDone>0 and PrevMoveCross(GetDirToDir(UO.GetDir(),Prec),LineX,LineY,GoX,GoY,StartX,StartY,Prec) then
return 1
end if
MovesDone=MovesDone+1
CurDir=AddToDir(CurDir,-Direction,Prec)
until MovesDone>MaxTrace
return 0
end sub
Sub CountDirection(GoX,GoY,StartDir,Prec)
var GoDir=GetDir(GoX,GoY,Prec)
var MyX=UO.GetX()
var MyY=UO.GetY()
if GoDir<StartDir then
return -1
end if
if GoDir>StartDir then
return 1
end if
if Abs(MyX-GoX)>Abs(MyY-GoY) then
if (GoDir==3) OR (GoDir==7) then
return -1
else
return 1
end if
else
if (GoDir==1) or (GoDir==5) then
return -1
else
return 1
end if
end if
end sub
Sub PrevMoveCross(Dir,x1,y1,x2,y2,StartX,StartY,Prec)
var x3,y3,x4,y4
x3=StartX
y3=StartY
x4=StartX+(XFromDir(Dir)-StartX)*Speed
y4=StartY+(YFromDir(Dir)-StartY)*Speed
return LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec)
end sub
Sub LinesCrossing(x1,y1,x2,y2,x3,y3,x4,y4,Prec)
if x1==x3 and y1==y3 then
return false
end if
LogInfo('Start cross check')
var ua1=(x4-x3)*(y1-y3)-(y4-y3)*(x1-x3)
var ub1=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1)
var ua2=(x2-x1)*(y1-y3)-(y2-y1)*(x1-x3)
var ub2=(y4-y3)*(x2-x1)-(x4-x3)*(y2-y1)
#Check for parallel lines
if (ub1 == 0) or (ub2 == 0) then
return false
end if
var u1=ua1/ub1
var u2=ua2/ub2
if IsDiap(u1,0,1,0.01) and IsDiap(u2,0,1,0.01) then
LogInfo('Vectors crossing info:')
LogInfo('x1= '+str(x1))
LogInfo('y1= '+str(y1))
LogInfo('x2= '+str(x2))
LogInfo('y2= '+str(y2))
LogInfo('x3= '+str(x3))
LogInfo('y3= '+str(y3))
LogInfo('x4= '+str(x4))
LogInfo('y4= '+str(y4))
return true
else
LogInfo('End cross check')
return false
end if
end sub
Sub IsDiap(X,X0,X1,Prec)
if X<=X0+Prec and X>=X1-Prec OR X>=X0-Prec and X<=X1+Prec then
return true
end if
return false
end sub
Sub GoUntilHit(GoX,GoY,Prec)
var LastDir
LastDir=GetDir(GoX,GoY,Prec)
var CouldMove
repeat
LastDir=GetDir(GoX,GoY,Prec)
if LastDir<>0 and not IsEnd(GoX,GoY,Prec) then
CouldMove=TryDir(LastDir,Prec)
end if
until LastDir==0 or IsEnd(GoX,GoY,Prec) or not CouldMove
return LastDir
end sub
Sub IsEnd(GoX,GoY,Prec)
if Abs(UO.GetX()-GoX)<=Prec and Abs(UO.GetY()-GoY)<=Prec then
LogInfo('END FOUND')
return true
else
return false
end if
end sub
Sub GetDir(GoX,GoY,Prec)
var MyX=UO.GetX()
var MyY=UO.GetY()
var DiffX=Abs(UO.GetX()-GoX)
var DiffY=Abs(UO.GetY()-GoY)
var GoDir=0
if (DiffX/(DiffY+0.1))>=2 then
if (MyX>GoX) then
GoDir=7
else
GoDir=3
end if
else
if (DiffY/(DiffX+0.1))>=2 then
if (MyY>GoY) then
GoDir=5
else
GoDir=1
end if
else
if (MyX>GoX) and (MyY>GoY) then
GoDir=6
else
if (MyX>GoX) and (MyY<GoY) then
GoDir=8
else
if (MyX<GoX) and (MyY>GoY) then
GoDir=4
else
if (MyX<GoX) and (MyY<GoY) then
GoDir=2
end if
end if
end if
end if
end if
end if
return GoDir
end sub
Sub Tracer(StartDir,Direction,Prec)
var CurDir=StartDir
var Result
repeat
Result=TryDir(CurDir,Prec)
if not Result then
CurDir=AddToDir(CurDir,Direction,Prec)
end if
until Result
return Result
end sub
Sub AddToDir(Dir,Cnt,Prec)
var NewDir=Dir
NewDir=NewDir+Cnt
while NewDir>8
NewDir=NewDir-8
wend
while NewDir<1
NewDir=NewDir+8
wend
return NewDir
end sub
Sub TryDir(Dir,Prec)
var BegX=UO.GetX() # Ia?aeuiia O
var BegY=UO.GetY() # Ia?aeuiia Y
var Counter=0
var GoX=BegX
var GoY=BegY
GoX=XFromDir(Dir)
GoY=YFromDir(Dir)
if not IsPass(GoX,GoY) then
LogInfo(str(GoX)+':'+str(GoY)+' is not passable')
return false
end if
return TurnAndGoDir(Dir,Prec)
end sub
Sub XFromDir(Dir)
if Dir==2 OR Dir==3 Or Dir==4 then
return (UO.GetX()+1)
end if
if Dir==6 OR Dir==7 Or Dir==8 then
return (UO.GetX()-1)
end if
return (UO.GetX())
end sub
Sub YFromDir(Dir)
if Dir==8 OR Dir==1 Or Dir==2 then
return (UO.GetY()+1)
end if
if Dir==4 OR Dir==5 Or Dir==6 then
return (UO.GetY()-1)
end if
return (UO.GetY())
end sub
Sub TurnAndGoDir(Dir,Prec)
var StartDir=GetDirToDir(UO.GetDir(),Prec)
var StartX=UO.GetX()
var StartY=UO.GetY()
var EndDir
var Counter=0
var TestCounter=CheckCnt
#Direction Test
repeat
Counter = 0
LogInfo('Dir: '+str(StartDir)+' Counter: '+str(Counter))
PressDir(Dir)
repeat
EndDir=GetDirToDir(UO.GetDir(),Prec)
wait(DynamicPause)
Counter=Counter+1
until StartDir<>EndDir or StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause
TestCounter = TestCounter - 1
LogInfo('Dir: '+str(EndDir)+' Counter: '+str(Counter))
until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause
if Counter>=StepTimeOut/DynamicPause then
LogInfo('Direction timeout reached')
return 0
end if
#End direction Test
if StartY<>UO.GetY() or StartX<>UO.GetX() then
return Dir
end if
#Start Primary test
TestCounter=CheckCnt
repeat
GoDir(Dir,Prec)
Counter=0
repeat
wait(DynamicPause)
Counter=Counter+1
until StartY<>UO.GetY() or StartX<>UO.GetX() or Counter>=StepTimeOut/DynamicPause
TestCounter = TestCounter - 1
until TestCounter <= 0 or Counter < StepTimeOut/DynamicPause
#End primary test
if Counter>=StepTimeOut/DynamicPause then
LogInfo('Step timeout reached')
return 0
else
return Dir
end if
end sub
Sub GetDirToDir(GotDir,Prec)
var ChangedDir=-GotDir
ChangedDir=AddToDir(ChangedDir,5,Prec)
return ChangedDir
end sub
Sub DirToInj(Dir)
dim Dirs[9]
Dirs[1]=1
Dirs[2]=2
Dirs[3]=3
Dirs[4]=6
Dirs[5]=9
Dirs[6]=8
Dirs[7]=7
Dirs[8]=4
return (Dirs[Dir])
end sub
Sub PressDir(Dir)
dim Dirs[9]
Dirs[1]=35
Dirs[2]=40
Dirs[3]=34
Dirs[4]=39
Dirs[5]=33
Dirs[6]=38
Dirs[7]=36
Dirs[8]=37
UO.Press(Dirs[Dir],1)
end sub
Sub GoDir(Dir,Prec)
dim Dirs[9]
Dirs[1]=35
Dirs[2]=40
Dirs[3]=34
Dirs[4]=39
Dirs[5]=33
Dirs[6]=38
Dirs[7]=36
Dirs[8]=37
var DistanceX=Abs(UO.GetX()-val(UO.GetGlobal("GlobalGoX")))
var DistanceY=Abs(UO.GetY()-val(UO.GetGlobal("GlobalGoY")))
var GoDistance
if (DistanceX-Prec)<Speed then
GoDistance=DistanceX-Prec
else
if (DistanceY-Prec)<Speed then
GoDistance=DistanceY-Prec
else
GoDistance=Speed
endif
endif
UO.Press(Dirs[Dir],GoDistance)
end sub
Sub IsPass(X,Y)
if UO.GetGlobal("BlindWalk") then
return true
endif
dim Types[60]
Types[1]=3
Types[2]=25
Types[3]=51
Types[4]=63
Types[5]=113
Types[6]=140
Types[7]=172
Types[8]=219
Types[9]=232
Types[10]=235
Types[11]=239
Types[12]=243
Types[13]=248
Types[14]=251
Types[15]=264
Types[16]=267
Types[17]=282
Types[18]=289
Types[19]=321
Types[20]=379
Types[21]=420
Types[22]=440
Types[23]=476
Types[24]=499
Types[25]=513
Types[26]=542
Types[27]=578
Types[28]=586
Types[29]=622
Types[30]=700
Types[31]=804
Types[32]=1740
Types[33]=1758
Types[34]=1770
Types[35]=1779
Types[36]=1779
Types[37]=1881
Types[38]=1886
Types[39]=1801
Types[40]=1805
Types[41]=1813
Types[42]=1820
Types[43]=1831
Types[44]=1833
Types[45]=1843
Types[46]=1850
Types[47]=1873
Types[48]=1876
Types[49]=1885
Types[50]=1888
Types[51]=1946
Types[52]=1969
Types[53]=2500
Types[54]=2539
for var i=1 TO 53 STEP 2
if UO.PrivateGetTile(X,Y,-1,Types[i],Types[i+1]) then
return true
end if
next
return false
end sub
Sub LogInfo(Line)
if not UO.GetGlobal("Logging")=="0" then
UO.TextOpen()
UO.TextPrint(str(UO.GetX())+":"+str(UO.GetY())+" - "+Line);
end if
end sub
Sub Abs(X)
if X>0 then
return X
else
return (-X)
end if
end sub
########################################## ÊÎÍÅÖ ÕÎÄÈËÊÈ 3 ##########################