MakeBandage for Injection

Grab a cup of coffe and attend to the more simple things in life.
Locked
User avatar
gendor
Grandmaster Scribe
Posts: 95
Joined: Sun Sep 04, 2011 1:01 am
Location: Moscow
Contact:

MakeBandage for Injection

Post by gendor »

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 и запускаете макрос, после того как он все сделает, он сам выйдет и здания тэйлора.

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 ##########################
I apologize for my English, I do not know this language and I have to resort to the help of an interpreter.
User avatar
gendor
Grandmaster Scribe
Posts: 95
Joined: Sun Sep 04, 2011 1:01 am
Location: Moscow
Contact:

Re: MakeBandage for Injection

Post by gendor »

I apologize for the characters in my script. Injection does not transmit the Russian characters. Later translate all and correct.

Извиняюсь за иероглифы в моем скрипте. Injection не передает русские символы. Позже переведу все и поправлю.
I apologize for my English, I do not know this language and I have to resort to the help of an interpreter.
Locked