rendered paste bodyOpt ( "CaretCoordMode" , 2 )
opt ( "ColorMode" , 1 )
opt ( "MouseCoordMode" , 2 )
opt ( "PixelCoordMode" , 2 )
HotKeySet( "{END}", "End" )
func end()
Exit
EndFunc
#region variables declaration and loading
;global user defined variables
global $MouseDropSleep = 50
global $DropAllInvHotkey = "{PGDN}", $StashHotkey = "{PGUP}"
HotKeySet( $DropAllInvHotkey, "DropInventory" )
HotKeySet( $StashHotkey, "Stash" )
; Globals buffer array's
;===================================
global $InvRef[10][4], $StaRef[6][8], $NpcRef[10][10], $CubeRef[3][4], $Belt4[4][4], $Belt3[4][3], $Belt2[4][2] , $Belt1[4][1]
global $UsedInvSpaces[10][4]
Global Const $XDiff = -3, $YDiff = -22
LoadBoxesRef()
;===============================================================
; function LoadBoxesRef()
; Load Empty Inventory, Stash, VendorTrade, And belt references
; stored in $InvRef[x][y] , $StaRef[x][y] , $NpcRef[x][y] , $CubeRef[x][y]
;===============================================================
Func LoadBoxesRef()
For $i = 0 To 9
For $j = 0 To 3
$InvRef[$i][$j] = IniRead( "mm.Boxes.Ref.ini", "Empty Inventory reference", "X" & $i & "Y" & $j, "ERROR")
Next
Next
For $i = 0 To 5
For $j = 0 To 7
$StaRef[$i][$j] = IniRead( "mm.Boxes.Ref.ini", "Empty Stash reference", "X" & $i & "Y" & $j, "ERROR")
Next
Next
For $i = 0 To 9
For $j = 0 To 9
$NpcRef[$i][$j] = IniRead( "mm.Boxes.Ref.ini", "Empty Npc reference", "X" & $i & "Y" & $j, "ERROR")
Next
Next
For $i = 0 To 2
For $j = 0 To 3
$CubeRef[$i][$j] = IniRead( "mm.Boxes.Ref.ini", "Empty Cube reference", "X" & $i & "Y" & $j, "ERROR")
Next
Next
For $i = 0 To 3
For $j = 0 To 3
$Belt4[$i][$j] = IniRead( "mm.Boxes.Ref.ini", "Empty Belt 4 rows reference", "X" & $i & "Y" & $j, "ERROR")
Next
Next
For $i = 0 To 3
For $j = 0 To 2
$Belt3[$i][$j] = IniRead( "mm.Boxes.Ref.ini", "Empty Belt 3 rows reference", "X" & $i & "Y" & $j, "ERROR")
Next
Next
For $i = 0 To 3
For $j = 0 To 1
$Belt2[$i][$j] = IniRead( "mm.Boxes.Ref.ini", "Empty Belt 2 rows reference", "X" & $i & "Y" & $j, "ERROR")
Next
Next
For $i = 0 To 3
For $j = 0 To 0
$Belt1[$i][$j] = IniRead( "mm.Boxes.Ref.ini", "Empty Belt 1 rows reference", "X" & $i & "Y" & $j, "ERROR" )
Next
Next
EndFunc
#endregion
#region test
while 1
Sleep(100)
WEnd
#endregion
#region Inv stuff
func Stash()
if PixelChecksum( 50, 450, 140, 500, 10 ) <> 1015225423 Then
return 0
EndIf
MouseMove( 30, 40 , 0 )
local $tmpInvRef = GetInventoryArray(), $tmpStaRef = GetStashArray(), $tmpFreeStashSpace = 0, $tmpUsedInvSpace = 0 _
,$ItemsToStash = 0, $itemsStashed = 0
for $x = 0 to 9
for $y = 0 to 3
if $tmpInvRef[ $x ] [ $y ] == "+" then $tmpUsedInvSpace += 1
Next
Next
for $x = 0 to 5
for $y = 0 to 7
if $tmpStaRef[ $x ] [ $y ] == "o" then $tmpFreeStashSpace += 1
Next
Next
if $tmpFreeStashSpace < $tmpUsedInvSpace then
$ItemsToStash = $tmpFreeStashSpace
Else
$ItemsToStash = $tmpUsedInvSpace
EndIf
for $x = 0 to 9
for $y = 0 to 3
if $itemsStashed == $ItemsToStash then return 1
if $tmpInvRef[ $x ] [ $y ] == "+" then
;stash the item at the current index
;find the a free inv spot
for $x2 = 0 to 5
for $y2 = 0 to 7
if $tmpStaRef[ $x2 ] [ $y2 ] == "o" then
;free space here
if not PickInInv( $x, $y ) then
MsgBox( 0, "", "PickInInv failed" )
Exit
EndIf
if not PlaceInStash( $x2, $y2 ) then
MsgBox( 0, "", "PlaceInStash failed" )
Exit
EndIf
;reset that space as used
$tmpStaRef[ $x2 ] [ $y2 ] = "+"
ExitLoop 2
EndIf
Next
Next
EndIf
Next
Next
return 1
EndFunc
func DropInventory()
if PixelChecksum( 50, 450, 140, 500, 10 ) == 1015225423 Then ;stash is open
MouseMove( 20, 30, 0 )
local $tmpInvRef = GetInventoryArray(), $tmpStaRef = GetStashArray(), $tmpFreeInvSpace = 0, $tmpUsedStaSpace = 0 _
,$ItemsToMove = 0, $itemsMoved = 0
for $x = 0 to 9
for $y = 0 to 3
if $tmpInvRef[ $x ] [ $y ] == "o" then $tmpFreeInvSpace += 1
Next
Next
for $x = 0 to 5
for $y = 0 to 7
if $tmpStaRef[ $x ] [ $y ] == "+" then $tmpUsedStaSpace += 1
Next
Next
if $tmpFreeInvSpace < $tmpUsedStaSpace then
$ItemsToMove = $tmpFreeInvSpace
Else
$ItemsToMove = $tmpUsedStaSpace
EndIf
for $x = 0 to 5
for $y = 0 to 7
if $itemsMoved == $ItemsToMove then return 1
if $tmpStaRef[ $x ] [ $y ] == "+" then
;stash item here
for $x2 = 0 to 9
for $y2 = 0 to 3
if $tmpInvRef[ $x2 ] [ $y2 ] == "o" then
;free place in inv here.
if not PickInStash( $x, $y ) then
MsgBox( 0, "", "PickInStash failed" )
Exit
EndIf
if not PlaceInInv( $x2, $y2 ) then
MsgBox( 0, "", "PlaceInInv failed" )
Exit
EndIf
$tmpInvRef[ $x2 ] [ $y2 ] = "+"
ExitLoop 2
EndIf
Next
Next
$itemsMoved += 1
EndIf
Next
Next
ElseIf AreaShotCheckSum(740, 275, 780, 325, 6) == 199944749 then ;inv is open
MouseMove( 30, 40 , 0 )
$tmpInvRef = GetInventoryArray()
for $x = 0 to 9
for $y = 0 to 3
if $tmpInvRef[ $x ] [ $y ] == "+" then
;something is there drop it
if not PickInInv( $x, $y ) then
MsgBox( 0, "", "PickInInv failed" )
Exit
EndIf
;Sleep( $MouseDropSleep )
if not FreeMouseBuffer() then
MsgBox( 0, "", "FreeMouseBuffer failed" )
Exit
EndIf
EndIf
Next
Next
Else
return 0
;MsgBox( 0, "", "Drop inv function: Inventory is not open" )
;Exit
EndIf
return 1
EndFunc
func FreeMouseBuffer()
for $i = 0 to 8
MouseMove( 375, 300, 0 )
Sleep( 50 )
MouseDown( "Left" )
Sleep( 10 )
MouseUp( "Left" )
Sleep( $MouseDropSleep )
for $i = 0 to 1000 / $MouseDropSleep
if FreeCursor() then
return 1
EndIf
Sleep( $MouseDropSleep )
Next
Next
return 0
EndFunc
func PickInStash( $x, $y )
$x = $x * 29 + 160
$y = $y * 29 + 160
;MouseMove( 20, 30 )
if not WaitFreeCursor() Then
MsgBox( 0, "", "Item is already on cursor while trying to pick an item from inv. ERROR. Closing script" )
Exit
EndIf
for $i = 0 to 8
MouseMove( $x, $y, 1 )
Sleep( $MouseDropSleep * 2 )
MouseDown( "Left" )
Sleep( 20 )
MouseDown( "Left" )
Sleep( 20 )
MouseUp( "Left" )
if WaitNotFreeCursor() then return 1
Next
return 0
EndFunc
func PlaceInStash( $x, $y )
if not WaitNotFreeCursor() then
MsgBox( 0, "", "We want to stash but there is no item in the cursor buffer. ERROR. closing script" )
Exit
EndIf
$x = $x * 29 + 160
$y = $y * 29 + 160
for $i = 0 to 8
MouseMove( $x, $y, 0 )
Sleep( $MouseDropSleep * 2)
MouseDown( "Left" )
Sleep( 20 )
MouseDown( "Left" )
Sleep( 20 )
MouseUp( "Left" )
if WaitFreeCursor() then return 1
Next
return 0
EndFunc
func PlaceInInv( $x, $y )
if not WaitNotFreeCursor() then
MsgBox( 0, "", "We want to stash but there is no item in the cursor buffer. ERROR. closing script" )
Exit
EndIf
$x = $x * 29 + 426
$y = $y * 29 + 341
for $i = 0 to 8
MouseMove( $x, $y, 1 )
Sleep( $MouseDropSleep * 2)
MouseDown( "Left" )
Sleep( 20 )
MouseDown( "Left" )
Sleep( 20 )
MouseUp( "Left" )
Sleep( $MouseDropSleep )
if WaitFreeCursor() then return 1
Sleep( Random( 200, 300 ) )
Next
return 0
EndFunc
Func PickInInv($x, $y)
;MouseMove( 20, 30 )
if not WaitFreeCursor() Then
MsgBox( 0, "", "Item is already on cursor while trying to pick an item from inv. ERROR. Closing script" )
Exit
EndIf
$x = $x * 29 + 426
$y = $y * 29 + 341
for $i = 0 to 8
MouseMove( $x, $y, 0 )
Sleep( $MouseDropSleep * 2 )
MouseDown( "Left" )
Sleep( 20 )
MouseDown( "Left" )
Sleep( 20 )
MouseUp( "Left" )
if WaitNotFreeCursor() then return 1
Next
return 0
EndFunc
;===============================================================================================
; WAIT UNTIL the cursor is NOT free: return 1 if NOT free, 0 if yes, but with 5 seconds timout
;===============================================================================================
Func WaitNotFreeCursor()
$CursTimeOut = 0
Do
If NotFreeCursor()==1 Then
Return 1
Else
Sleep ($MouseDropSleep * 2)
$CursTimeOut = $CursTimeOut + 1
EndIf
Until ($CursTimeOut > 5)
Return 0
EndFunc
;===============================================================================================
; WAIT UNTIL the cursor is free: return 1 if free, 0 if not, but with 5 seconds timout
;===============================================================================================
Func WaitFreeCursor()
$CursTimeOut = 0
Do
If FreeCursor()==1 Then
Return 1
Else
Sleep ($MouseDropSleep * 2)
$CursTimeOut = $CursTimeOut + 1
EndIf
Until ($CursTimeOut > 5)
Return 0
EndFunc
;===============================================================================================
; VALIDATE if the cursor is Free: return 1 if free, 0 if not
;===============================================================================================
Func FreeCursor()
$MCoords = MouseGetPos()
$XM = $MCoords[0]
$YM = $MCoords[1]
$MPixel1 = PixelGetColor ($XM + 18, $YM + 24)
$MPixel2 = PixelGetColor ($XM + 9, $YM + 13)
$MPixel3 = PixelGetColor ($XM + 17, $YM + 16)
$MPixel4 = PixelGetColor ($XM + 27, $YM + 13)
$MPixel5 = PixelGetColor ($XM + 23, $YM + 19)
$MPixel6 = PixelGetColor ($XM + 23, $YM + 18)
$MPixel7 = PixelGetColor ($XM + 23, $YM + 16)
If ( $MPixel1 == 527368 AND $MPixel2 == 1580056 AND $MPixel3 == 1582121 AND $MPixel4 == 2698281 AND $MPixel5 == 3749945 AND $MPixel6 == 4868426 AND $MPixel7 == 6514019 ) Then
Return 1
Else
Return 0
EndIf
EndFunc
;===============================================================================================
; VALIDATE if the cursor is NOT free: return 1 if free, 0 if not
;===============================================================================================
Func NotFreeCursor()
$MCoords = MouseGetPos()
$XM = $MCoords[0]
$YM = $MCoords[1]
$MPixel1 = PixelGetColor ($XM + 18, $YM + 24)
$MPixel2 = PixelGetColor ($XM + 9, $YM + 13)
$MPixel3 = PixelGetColor ($XM + 17, $YM + 16)
$MPixel4 = PixelGetColor ($XM + 27, $YM + 13)
$MPixel5 = PixelGetColor ($XM + 23, $YM + 19)
$MPixel6 = PixelGetColor ($XM + 23, $YM + 18)
$MPixel7 = PixelGetColor ($XM + 23, $YM + 16)
If ( NOT ( $MPixel1 == 527368 AND $MPixel2 == 1580056 AND $MPixel3 == 1582121 AND $MPixel4 == 2698281 AND $MPixel5 == 3749945 AND $MPixel6 == 4868426 AND $MPixel7 == 6514019 ) ) Then
Return 1
Else
Return 0
EndIf
EndFunc
;return an array of xy stash. "+" == something is there "o" = nothing is there
func GetStashArray()
return ShotDiff( $StaRef, BoxesAreaShot( "Stash" ) , "Stash" )
EndFunc
;return an array of xy inventory. "+" == something is there "o" = nothing is there
Func GetInventoryArray()
return ShotDiff( $InvRef, BoxesAreaShot( "Inventory" ), "Inventory" )
EndFunc
Func ShotDiff($ShotA, $ShotB, $ShotRefName)
Select
Case $ShotRefName = "Inventory"
$EmptyShotRef = $InvRef
$Xboxes = 10
$Yboxes = 4
Case $ShotRefName = "Stash"
$EmptyShotRef = $StaRef
$Xboxes = 6
$Yboxes = 8
Case $ShotRefName = "Npc"
$EmptyShotRef = $NpcRef
$Xboxes = 10
$Yboxes = 10
Case $ShotRefName = "Cube"
$EmptyShotRef = $CubeRef
$Xboxes = 3
$Yboxes = 4
Case $ShotRefName = "Belt4"
$EmptyShotRef = $Belt4
$Xboxes = 4
$Yboxes = 4
Case $ShotRefName = "Belt3"
$EmptyShotRef = $Belt3
$Xboxes = 4
$Yboxes = 3
Case $ShotRefName = "Belt2"
$EmptyShotRef = $Belt2
$Xboxes = 4
$Yboxes = 2
Case $ShotRefName = "Belt1"
$EmptyShotRef = $Belt1
$Xboxes = 4
$Yboxes = 1
EndSelect
Dim $AShotDiff[$Xboxes][$Yboxes]
For $ib = 0 To ($Xboxes - 1)
For $jb = 0 To ($Yboxes - 1)
If ($ShotA[$ib][$jb] <> $ShotB[$ib][$jb]) Then
$AShotDiff[$ib][$jb] = "+"
If ($ShotB[$ib][$jb] == $EmptyShotRef[$ib][$jb]) Then
$AShotDiff[$ib][$jb] = "o"
EndIf
Else
$AShotDiff[$ib][$jb] = "o"
EndIf
Next
Next
Return $AShotDiff
EndFunc
;============================================================
; function BoxesAreaShot($Area)
; Generic shot with parameters: 6 pixels sum formula / box.
; "Inventory" = inventory, "Stash" = stash,
; "Npc" = npc, "Cube" = cube, "Beltx" = where x= 1,2,3 or 4
; ( depends of belt rows...) Return the array $AreaShot
; note: rejuv OR full potions rejuv alway return 42123954
; returns Dim $AreaShot[$NRows][$NCols] with a checksum of all item
;============================================================
Func BoxesAreaShot($Area)
$BoxesXOffset = 29
$BoxesYOffset = 29
$InBoxXOffset_1 = 0
$InBoxYOffset_1 = 0
$InBoxXOffset_2 = 20
$InBoxYOffset_2 = 0
$InBoxXOffset_3 = 20
$InBoxYOffset_3 = 20
$InBoxXOffset_4 = 00
$InBoxYOffset_4 = 20
$InBoxXOffset_5 = 5
$InBoxYOffset_5 = 10
$InBoxXOffset_6 = 10
$InBoxYOffset_6 = 15
Select
Case $Area == "Inventory"
$NRows = 10
$NCols = 4
$X0 = 426
$Y0 = 341
Case $Area == "Stash"
$NRows = 6
$NCols = 8
$X0 = 160
$Y0 = 168
Case $Area == "Cube"
$NRows = 3
$NCols = 4
$X0 = 204
$Y0 = 224
Case $Area == "Npc"
$NRows = 10
$NCols = 10
$X0 = 101
$Y0 = 149
EndSelect
If StringInStr ($Area, "Belt") Then
$BoxesXOffset = 31
$BoxesYOffset = 32
$InBoxXOffset_1 = 0
$InBoxYOffset_1 = 1
$InBoxXOffset_2 = 0
$InBoxYOffset_2 = 1
$InBoxXOffset_3 = 0
$InBoxYOffset_3 = 1
$InBoxXOffset_4 = 0
$InBoxYOffset_4 = 1
$InBoxXOffset_5 = 0
$InBoxYOffset_5 = 1
$InBoxXOffset_6 = 0
$InBoxYOffset_6 = 1
$NRows = 4
$X0 = 442
Select
Case $Area == "Belt4"
$NCols = 4
$Y0 = 513
Case $Area == "Belt3"
$NCols = 3
$Y0 = 545
Case $Area == "Belt2"
$NCols = 2
$Y0 = 577
Case $Area == "Belt1"
$NCols = 1
$Y0 = 609
EndSelect
EndIf
Dim $X[$NRows]
Dim $Y[$NCols]
$X[0] = $X0 + $XDiff
$Y[0] = $Y0 + $YDiff
For $i = 1 To ($NRows - 1)
$X[$i] = ($X[($i-1)] + $BoxesXOffset)
Next
For $j = 1 To ($NCols - 1)
$Y[$j] = ($Y[($j-1)] + $BoxesYOffset)
Next
Dim $AreaShot[$NRows][$NCols]
For $i = 0 To ($NRows - 1)
For $j = 0 To ($NCols - 1)
$Apix_1 = (Int(PixelGetColor($X[$i] + $InBoxXOffset_1,$Y[$j] + $InBoxYOffset_1)))
$Apix_2 = (Int(PixelGetColor($X[$i] + $InBoxXOffset_2,$Y[$j] + $InBoxYOffset_2)))
$Apix_3 = (Int(PixelGetColor($X[$i] + $InBoxXOffset_3,$Y[$j] + $InBoxYOffset_3)))
$Apix_4 = (Int(PixelGetColor($X[$i] + $InBoxXOffset_4,$Y[$j] + $InBoxYOffset_4)))
$Apix_5 = (Int(PixelGetColor($X[$i] + $InBoxXOffset_5,$Y[$j] + $InBoxYOffset_5)))
$Apix_6 = (Int(PixelGetColor($X[$i] + $InBoxXOffset_6,$Y[$j] + $InBoxYOffset_6)))
$AreaShot[$i][$j] = ($Apix_1 + $Apix_2 + $Apix_3 + $Apix_4 + $Apix_5 + $Apix_6)
Next
Next
Return $AreaShot
EndFunc
;============================================================\
; Function AreaShotCheckSum ($XStart, $YStart, $XStop, $YStop, $Step)
; Area checkSum, can be used to check BNet Screens.
;============================================================
Func AreaShotCheckSum ($XStart, $YStart, $XStop, $YStop, $Step)
$XStart = $XStart + $XDiff
$YStart = $YStart + $YDiff
$XStop = $XStop + $XDiff
$YStop = $YStop + $YDiff
$CheckSum = 0
For $X = $XStart To $XStop Step $Step
For $Y = $YStart To $YStop Step $Step
$Apix = PixelGetColor($X,$Y)
$CheckSum = $CheckSum + $Apix
Next
Next
Return $CheckSum
EndFunc
#endregion
#region autolag
#endregion