Autohotkey has some neat features built into it that allow the end user to have more control over their macros. If you're tired of having to read a long set of instructions about what menus to pin, where they should be placed and exactly how many rows and columns of panels you can have open, this is for you. There are some macros out there for ACTool that already have advanced interfaces asking you to click in various spots to "train" the macro; my scripts use the same idea, but with a slightly nicer interface made possible by Autohotkey's GUI construction abilities.
These are all works in progress; please leave comments at the bottom of the page if you find any problems.
If you're running a macro involving an action causing an attribute timer (like the END timer for mine pulls), make sure that portion of the window remains unblocked. Right now these macros only work with large action buttons; I'm trying to figure out a way to auto-detect what kind of action buttons you've selected and adjusting the script accordingly.
New tale, new macro! The current theory concerning mining yield suggests that clicking on the crystals inside a mine randomly will increase the yield of the mine. To that end, I've rewritten the mining macro that will click one of several pinned crystal menus at random, simulating the random crystal mining behavior. Simply click on as many crystals as you like (I use 9-12), pin the menus up around your window (taking care not to block the part of the screen where the stat timers appear), run the macro and follow the instructions.
The hotkey I've assigned is Ctrl-Alt-M, but you can of course change this by altering the first line (^ stands for Ctrl, ! stands for Alt, # stands for shift. Leave the two colons.)
^!m:: IfWinExist eGenesis Client { WinActivate WinGetPos,,, winWidth, winHeight widthOffset := winWidth - 40 Gui, +AlwaysOnTop +ToolWindow Gui, Font, bold Gui, Add, Text, vMineNumText, Recording mouse position Gui, Font, norm Gui, Add, Text,, ( LTrim Please middle-click on the mine crystal menus, one by one, until you've clicked on all the menus you want to use. Then click the OK button. ) Gui, Add, Button, default gMineSetLoops, OK Gui, Show MineNum = 0 WinGet, GameWinHandle, ID, eGenesis Client loop { WinActivate CoordMode, Mouse, Relative KeyWait, MButton, D KeyWait, MButton MouseGetPos, TestX, TestY, WinHandle if (WinHandle = GameWinHandle) { Gosub, MineRecord } else { Gui, Destroy break } } return MineRecord: MineNum++ MouseGetPos, MineX%MineNum%, MineY%MineNum% GuiControl, Text, MineNumText, %MineNum% mine crystals captured return MineSetLoops: Gui, Destroy Gui, Add, Text,, How many mine pulls? Gui, Add, Edit, Number vNumPulls Gui, Add, Button, default gMineCommit, OK Gui, Show return MineCommit: Gui, Submit Gui, Destroy MineCycle = 0 Gui, +AlwaysOnTop +ToolWindow Gui, Font, bold Gui, Add, Text, vMineCycleText, Cycle %NumPulls% of %NumPulls% Gui, Font, norm Gui, Show GuiControl, Text, MineCycleText, Cycle %MineCycle% of %NumPulls% loop, %NumPulls% { WinActivate, eGenesis Client if (MineCycle = 0) { MouseGetPos, OldMX, OldMY Random, Crystal, 1, MineNum ;BlockInput, Mouse MinePosX := MineX%Crystal% MinePosY := MineY%Crystal% MouseClick, left, %MinePosX%, %MinePosY%,, 0 MouseMove, %OldMX%, %OldMY%, 0 MineCycle++ GuiControl, Text, MineCycleText, Cycle %MineCycle% of %NumPulls% ;BlockInput, Default widthOffset2 := winWidth - 20 PixelGetColor, timerColor, widthOffset2, 145 } else { loop { Sleep, 1000 ;PixelSearch, Px, Py, widthOffset, 140, winWidth, 150, 0x88DCEF PixelSearch, Px, Py, widthOffset, 140, winWidth, 150, %timerColor% if (ErrorLevel = 1 and WinActive("eGenesis Client")) { break } } MouseGetPos, OldMX, OldMY Random, Crystal, 1, MineNum ;BlockInput, Mouse MinePosX := MineX%Crystal% MinePosY := MineY%Crystal% MouseClick, left, %MinePosX%, %MinePosY%,, 0 MouseMove, %OldMX%, %OldMY%, 0 MineCycle++ GuiControl, Text, MineCycleText, Cycle %MineCycle% of %NumPulls% ;BlockInput, Default } } Gui, Destroy Gui, Add, Text,, Middle-click on this window to end the script. Gui, Show return }
If you're having trouble getting this macro to work (your avatar walks but doesn't click on the grass icon), please see the Grass Macro w/ Training below.
Default hotkey is Ctrl-Alt-G, but this can be changed by changing the first line.
; grass collector ^!g:: IfWinExist eGenesis Client { WinActivate WinGetPos,,, winWidth, winHeight minorOffset = 70 majorOffset = 100 winXCenter := winWidth / 2 winYCenter := ((winHeight - 22) / 2) + 32 winXLeft := winXCenter - minorOffset winXFarLeft := winXCenter - majorOffset winXRight := winXCenter + minorOffset winXFarRight := winXCenter + majorOffset winYUp := winYCenter - minorOffset winYFarUp := winYCenter - majorOffset winYDown := winYCenter + minorOffset winYFarDown := winYCenter + majorOffset circleMove = 0 Gui, +AlwaysOnTop +ToolWindow Gui, Add, Text,, How many grass cycles? Gui, Add, Edit, Number vNumGrass Gui, Add, Button, default gGrassCommit, OK Gui, Show return GrassCommit: Gui, Submit Gui, Destroy GrassCycle = 0 Gui, +AlwaysOnTop +ToolWindow Gui, Font, bold Gui, Add, Text, vGrassCycleText, Cycle %NumGrass% of %NumGrass% Gui, Font, norm Gui, Show GuiControl, Text, GrassCycleText, Cycle %GrassCycle% of %NumGrass% WinActivate, eGenesis Client CoordMode, Mouse, Relative loop, %NumGrass% { if circleMove = 0 { MouseClick, left, %winXCenter%, %winYFarUp% circleMove++ } else if circleMove = 1 { MouseClick, left, %winXRight%, %winYUp% circleMove++ } else if circleMove = 2 { MouseClick, left, %winXFarRight%, %winYCenter% circleMove++ } else if circleMove = 3 { MouseClick, left, %winXRight%, %winYDown% circleMove++ } else if circleMove = 4 { MouseClick, left, %winXCenter%, %winYFarDown% circleMove++ } else if circleMove = 5 { MouseClick, left, %winXLeft%, %winYDown% circleMove++ } else if circleMove = 6 { MouseClick, left, %winXFarLeft%, %winYCenter% circleMove++ } else if circleMove = 7 { MouseClick, left, %winXLeft%, %winYUp% circleMove = 0 } loop { PixelSearch, Px, Py, 0, 0, %winWidth%, 30, 0xB46E6C Sleep, 250 if ErrorLevel = 0 { GrassCycle++ GuiControl, Text, GrassCycleText, Cycle %GrassCycle% of %NumGrass% MouseClick, left, %Px%, %Py% Sleep, 2000 break } } } Gui, Destroy return } return
Default hotkey is Ctrl-Alt-Shift-G, but this can be changed by altering the first line.
; grass collector with training ^!+g:: IfWinExist eGenesis Client { WinActivate WinGetPos,,, winWidth, winHeight minorOffset = 70 majorOffset = 100 winXCenter := winWidth / 2 winYCenter := ((winHeight - 22) / 2) + 32 winXLeft := winXCenter - minorOffset winXFarLeft := winXCenter - majorOffset winXRight := winXCenter + minorOffset winXFarRight := winXCenter + majorOffset winYUp := winYCenter - minorOffset winYFarUp := winYCenter - majorOffset winYDown := winYCenter + minorOffset winYFarDown := winYCenter + majorOffset circleMove = 0 Gui, Add, Text,, Recording mouse position`nPlease middle-click on the blue area of the grass icon. Gui, +AlwaysOnTop +ToolWindow Gui, Show WinActivate CoordMode, Mouse, Relative KeyWait, MButton, D MouseGetPos, ColorPosX, ColorPosY detectYMin := ColorPosY - 1 detectYMax := ColorPosY + 1 PixelGetColor, GrassIcon, ColorPosX, ColorPosY Gui, Destroy Gui, +AlwaysOnTop +ToolWindow Gui, Add, Text,, How many grass cycles? Gui, Add, Edit, Number vNumGrass Gui, Add, Button, default gTGrassCommit, OK Gui, Show return TGrassCommit: Gui, Submit Gui, Destroy GrassCycle = 0 Gui, +AlwaysOnTop +ToolWindow Gui, Font, bold Gui, Add, Text, vGrassCycleText, Cycle %NumGrass% of %NumGrass% Gui, Font, norm Gui, Show GuiControl, Text, GrassCycleText, Cycle %GrassCycle% of %NumGrass% WinActivate, eGenesis Client CoordMode, Mouse, Relative BlockInput, MouseMove loop, %NumGrass% { if circleMove = 0 { MouseClick, left, %winXCenter%, %winYFarUp%,, 0 circleMove++ } else if circleMove = 1 { MouseClick, left, %winXRight%, %winYUp%,, 0 circleMove++ } else if circleMove = 2 { MouseClick, left, %winXFarRight%, %winYCenter%,, 0 circleMove++ } else if circleMove = 3 { MouseClick, left, %winXRight%, %winYDown%,, 0 circleMove++ } else if circleMove = 4 { MouseClick, left, %winXCenter%, %winYFarDown%,, 0 circleMove++ } else if circleMove = 5 { MouseClick, left, %winXLeft%, %winYDown%,, 0 circleMove++ } else if circleMove = 6 { MouseClick, left, %winXFarLeft%, %winYCenter%,, 0 circleMove++ } else if circleMove = 7 { MouseClick, left, %winXLeft%, %winYUp%,, 0 circleMove = 0 } BlockInput, MouseMoveOff loop { PixelSearch, Px, Py, 0, %detectYMin%, %winWidth%, %detectYMax%, %GrassIcon% Sleep, 250 if ErrorLevel = 0 { GrassCycle++ GuiControl, Text, GrassCycleText, Cycle %GrassCycle% of %NumGrass% BlockInput, MouseMove MouseClick, left, %Px%, %Py%,, 0 BlockInput, MouseMoveOff Sleep, 2000 break } } } Gui, Destroy return } return
Activate using Ctrl-Alt-S, and walk along the shoreline. 95% of the time it'll pick up slate (occasionally it'll either click too late or miss a slate). If you wish to improve the macro's accuracy at the expense of system performance/frame rate, remove the "Sleep, 5" line from the macro.
; persistent slate macro ^!s:: IfWinExist eGenesis Client { WinActivate WinGetPos,,, winWidth, winHeight widthOffset := winWidth - 300 heightOffset := 50 loop { CoordMode, Mouse, Relative Sleep, 5 PixelSearch, Px, Py, widthOffset, 20, winWidth, 50, 0x006AC0 if (ErrorLevel = 0 and WinActive("eGenesis Client")) { MouseGetPos, OldMX, OldMY MouseClick, left, %Px%, %Py%,, 0 MouseMove, %OldMX%, %OldMY%, 0 Sleep, 2000 } } } return
What is the problem when mining and the macro dont read the stat timers? Nothing is blocking. Screen resolution?
I don't know what I am doing wrong but the macro never clicks on the Work This Mine button and therefore does not pull ore.