Wyzzard
-
Posts
8 -
Joined
-
Last visited
-
Donations
0.00 USD
Posts posted by Wyzzard
-
-
I have created a new script (attached here) you can use in place of the EnBAltBoxer.ahk above. It is one with no screen distortion, and no title bars or borders.
-
I have improved Wolfie's multiboxing script, and will be posting screenshots here and scripts and how to set it up.
This uses Wolfie's scripts at:
My script simply adds alternative layouts, and I have extended what Wolfie has done. To get it running, do the following:
1. This was designed on Windows 10
2. For this to work, your alt monitor must be minimum resolution of 2560 x 1440.
3. Download https://autohotkey.com/ and install it4. Go to the following topic, download http://www.rmkrs.nl/download/Net7MultiClientUnlocker.zip, and follow the instructions on installing it.
5. Download the scripts attached to this message (EnBAltBoxer.ahk, EnBPlay.ahk, LaunchEnB.ahk), and place them somewhere on your computer (mine are inside a AHK directory inside the main Earth & Beyond folder)
6. Right click on each of the scripts, and in the security tab, check run as administrator
7. Right click on the EnbAltBoxer.ahk script, and open with notepad. Look for "MainMonitor" and "AltMonitor" and set them to the number of your monitors in display properties on your PC.
8. Right click on the LaunchEnB.ahk script and open with notepad or sublime text. Replace the following paths with the path to match what you have on your PC:
- C:\Program Files (x86)\Net-7\bin\LaunchNet7.exe
- C:\Program Files (x86)\Net-7\bin\
- C:\Program Files (x86)\Net-7\bin\Net7MultiClientUnlocker.exe- C:\Program Files (x86)\Net-7\bin\Net7MultiClientUnlocker
9. Create a desktop shortcut of EnBAltBoxer.ahk, and right click on the shortcut and click properties. Under the Shortcut tab, click Advanced at the bottom, and check the box for Run as administrator.
10. You are ready to give it a try. Click your desktop shortcut to EnbAltBoxer.
11. At the prompt, it asks you how many alts you wish to load. Type in 0 (no alts), 1, 2, 3, 4, 5, or 6, and press enter. **NOTE: If you enter text, it will default to 6 alts. So enter a valid number.
12. Wait till all windows are loaded, and then enjoy.
Gotchas:
- If a alt window fails for any reason or the alt gets disconnected, you can rerun the EnbAltBoxer and it will recreate the lost alt window (be sure to select the number of alts you had before the disconnect)- Always make your left most monitor your main display in display properties to keep the error from happening where you cannot click inside the alt windows with your mouse. Not sure why this happens.
- 1 alt, 1 main
- 2 alts, 1 main
- 3 alts, 1 main
- 4 alts, 1 main
- 5 alts, 1 main
- 6 alts, 1 main
-
So, it turns out there are issues. I cannot left click in any of the created windows to do anything. Also, when creating the windows, they all get placed at the top left corner of the main monitor.
-
Please help Wolfie.... cannot get this working at all. Feel free to email me directly if need be @ rjacobsen2009@gmail.com
I figured out what was wrong. I had to right click on each one of the shortcuts on the desktop and allow them to run as administrator. Sorry for the bother.
-
On 5/3/2017 at 10:16 PM, wolfie said:
Ok, now for the scripts. You don't have to put them where I did, but, hey, I like to keep all game assets in one place. So Net-7, the Starship creator, and these scripts are all inside my main EnB folder.
In the case of the scripts, I created an AHK folder.
First script: LaunchEnB.ahk
; ============================================================================================== ; ; This script runs an instance of Earth and Beyond ; ; It runs Net-7, hits the Play, Dismisses the Terms Window and sets the title to "EnBLoad" ; ============================================================================================== #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. ; #Warn ; Enable warnings to assist with detecting common errors. SendMode Input ; Recommended for new scripts due to its superior speed and reliability. SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. #singleinstance force ; Allow only one to run at a time Progress, w200,, Please do not disturb the process. , Loading EnB Instance Progress, 10 Gosub, LoadMultiUnlocker Progress, 20 Run , *RunAs D:\Programs\Games\Earth & Beyond\Net-7\bin\LaunchNet7.exe, D:\Programs\Games\Earth & Beyond\Net-7\bin\ ; Handle the Net-7 Launcher WinWaitActive, LaunchNet7 Sleep 5000 WinSetTitle, Net7 Sleep 2000 SendInput {Return} Progress, 40 BlockInput, On ; When the terms notice comes up alter the title and dismiss WinWaitActive, Earth & Beyond Progress, 50 Sleep 1000 WinSetTitle, Loader Sleep 1000 SendInput {Enter} Sleep 1000 Progress, 75 ; Wait until the main window initializes and rename it WinWaitActive, Earth & Beyond Progress, 90 WinSetTitle, EnBLoad BlockInput, Off Progress, 100 Progress, Off Exit LoadMultiUnlocker: IfWinNotExist , Net7 multi client unlocker { Run , *RunAs D:\Wolfie\Downloads\_Downloads\Other Games\ENB\Net7MultiClientUnlocker\Net7MultiClientUnlocker.exe, D:\Wolfie\Downloads\_Downloads\Other Games\ENB\Net7MultiClientUnlocker Sleep 2000 WinWaitActive, Net7 multi client unlocker WinMinimize } Return
The LaunchEnB script is what actually loads the programs such as MultiUnlocker and Net-7 proxy app. You will need to edit the 2 paths within this file.
While this file isn't intended to run alone it can. It will launch Enb and leave the window titled "EnBLoad". This is normal as its whats expected by the next script.
Second Script: EnbLaunchClients.ahk
; ============================================================================================== ; ; This script launches the main EnB window and 1 to 6 alt windows as provided by a single number ; on the commandline. ; ; Call with no parameters and it will default to the main window and a single alt ; Call with 1 parameter and it will create that many alt windows and tile them. ; Example: ; EnbLaunchClients.ahk 4 ; Launches main window and 4 alts (total of 5) ; ; This secript will detect the number and window size of monitors. The main EnB instance will ; load on your primary monitor. ; ; If only one alt is requested, it will consume the next monitor. ; ; If more than one alt was requested the second monitor will be divided into a 2 x 2 grid that ; will support up to 4 alts not being overlapped. ; ; If more than 4 alts are requested, it will permit up to 5 but #5 and #6 will be centered ; vertically on the second monitor and they will overlap the other alt windows. ; ; For some reason if I try 6 or more clients, I get the "Already Running" dialog. So, this ; script caps at 5. ; ============================================================================================== #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. ; #Warn ; Enable warnings to assist with detecting common errors. SendMode Input ; Recommended for new scripts due to its superior speed and reliability. SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. ; ============================================================================================== ; Config Section ; ============================================================================================== ; Use PrintScn and drop a copy of an EnB window into paint. Then pixel peep to get the settings. ; These are default for my Windows 10 setup ; WindowsTitleBarHeight = 27 ; Uppwer title bar area WindowsBorder = 2 ; The side and bottom borders EBMainWindowExtraPaddingW = 5 ; Makes its width 5px smaller(in case you want to get to your desktop) EBMainWindowExtraPaddingH = 5 ; Makes its height 5px smaller(in case you want to get to your desktop) EBAltWindowExtraPaddingW = 5 ; Makes its width 5px smaller(in case you want to get to your desktop) EBAltWindowExtraPaddingH = 5 ; Makes its height 5px smaller(in case you want to get to your desktop) ; ============================================================================================== ; ============================================================================================== ; Global Vars Section ; ============================================================================================== EBMainMonitor = 1 EBMainMonitorTop = -1 EBMainMonitorLeft = -1 EBMainMonitorW = -1 EBMainMonitorH = -1 EBMainWindowW = -1 EBMainWindowH = -1 EBAltMonitor = 1 EBAltMonitorTop = -1 EBAltMonitorLeft = -1 EBAltMonitorW = -1 EBAltMonitorH = -1 EBAltWindowW = -1 EBAltWindowH = -1 EBAltCount = 1 ; ============================================================================================== ;Grab the command line count if 0 = 1 EBAltCount = %1% ;Limit to 5 alts if EBAltCount > 5 EBAltCount := 5 DetectMonitors() ;MsgBox, Main Monitor %EBMainMonitor% at %EBMainMonitorTop% x %EBMainMonitorLeft% is %EBMainMonitorW%w x %EBMainMonitorH%h Game is %EBMainWindowW%w x %EBMainWindowH%h ;MsgBox, Alt Monitor %EBAltMonitor% at %EBAltMonitorTop% x %EBAltMonitorLeft% is %EBAltMonitorW%w x %EBAltMonitorH%h Game is EBAlt %EBAltWindowW%w x %EBAltWindowH%h LoadMainEBWindow() Loop %EBAltCount% { LoadAltEBWindow( a_index ) } ;BlockInput, Off CoordMode, Mouse, Client Run, EnBPlay.ahk ExitApp LoadMainEBWindow() { global SplashTextOn, 400, 200, Loading, Loading Main Window WinMove, Loading, , EBMainMonitorLeft,EBMainMonitorTop IfWinNotExist , EnBMain { SetWindowSize( EBMainWindowW, EBMainWindowH ) Run LaunchEnB.ahk WinWaitActive, EnBLoad WinSetTitle, EnBMain ;WinMove,,,%EBMainMonitorLeft%,%EBMainMonitorTop% } SplashTextOff } LoadAltEBWindow(TheAltNumber) { global ;BlockInput, On local TheAlt = "EnBAlt" + TheAltNumber local GridAlt := TheAltNumber -1 local Grid0 := (GridAlt & 1) = 1 local Grid2 := (GridAlt & 2) = 2 local Grid4 := (GridAlt & 4) = 4 local AltWindowT := EBAltMonitorTop local AltWindowL := EBAltMonitorLeft ;msgbox %Grid0% %Grid2% %Grid4% AltWindowL := Round( AltWindowL + ( Grid0 * ( EBAltWindowW + ( WindowsBorder * 2 ) + EBAltWindowExtraPaddingW ) ) ) AltWindowT := Round( AltWindowT + ( Grid2 * ( EBAltWindowH + WindowsTitleBarHeight + WindowsBorder + EBAltWindowExtraPaddingH ) ) ) AltWindowT := Round( AltWindowT + ( Grid4 * ( EBAltWindowH / 2 ) ) ) ;msgbox %AltWindowL% %AltWindowT% SplashTextOn, 300, 100, Loading, `nLoading Alt %TheAltNumber% of %EBAltCount% `n`nPlacing window at %AltWindowL% x %AltWindowT% WinMove, Loading, , AltWindowL,AltWindowT IfWinNotExist , %TheAlt% { SetWindowSize( EBAltWindowW, EBAltWindowH ) Run LaunchEnB.ahk WinWaitActive, EnBLoad WinSetTitle, %TheAlt% WinMove,,,AltWindowL,AltWindowT } Sleep 1000 SplashTextOff } DetectMonitors() { global local AltFrameH = 0 local AltFrameW = 0 SysGet, MonitorCount, MonitorCount SysGet, MonitorPrimary, MonitorPrimary If MonitorCount >= 2 { EBMainMonitor = %MonitorPrimary% If EBMainMonitor = 1 EBAltMonitor := EBMainMonitor + 1 If EBMainMonitor > 1 EBAltMonitor := EBMainMonitor - 1 } Loop, %MonitorCount% { SysGet, MonitorName, MonitorName, %A_Index% SysGet, Monitor, Monitor, %A_Index% SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index% If (A_Index = EBMainMonitor) { EBMainMonitorTop = %MonitorTop% EBMainMonitorLeft = %MonitorLeft% EBMainMonitorW := MonitorWorkAreaRight - MonitorWorkAreaLeft EBMainMonitorH := MonitorWorkAreaBottom - MonitorWorkAreaTop } If (A_Index = EBAltMonitor) { EBAltMonitor = %A_Index% EBAltMonitorTop = %MonitorTop% EBAltMonitorLeft = %MonitorLeft% EBAltMonitorW := MonitorWorkAreaRight - MonitorWorkAreaLeft EBAltMonitorH := MonitorWorkAreaBottom - MonitorWorkAreaTop } } ; Set EB Window Sizes EBMainWindowW := Round( ( EBMainMonitorW - (10 + ( WindowsBorder * 2) ) ) - EBMainWindowExtraPaddingW ) EBMainWindowH := Round( ( EBMainMonitorH - (10 + ( WindowsTitleBarHeight + WindowsBorder) ) )- EBMainWindowExtraPaddingH ) AltFrameH := ( WindowsTitleBarHeight + WindowsBorder) AltFrameW := ( WindowsBorder * 2) ; Assumed settings for only 1 alt EBAltWindowW := Round( EBAltMonitorW - ( AltFrameW + EBAltWindowExtraPaddingW ) ) EBAltWindowH := Round( EBAltMonitorH - ( AltFrameH + EBAltWindowExtraPaddingH ) ) ;If the alt count is more than 1 assume a 2x2 grid if EBAltCount > 1 { EBAltWindowW := Round( ( EBAltMonitorW - ( ( AltFrameW + EBAltWindowExtraPaddingW ) * 2) ) / 2 ) EBAltWindowH := Round( ( EBAltMonitorH - ( ( AltFrameH + EBAltWindowExtraPaddingH ) * 2) ) / 2 ) } } SetWindowSize( WindowWidth, WindowHeight ) { If WindowWidth > 100 && WindowWidth < 10000 && WindowHeight > 100 && WindowWidth > 100 && WindowWidth < 10000 { ;MsgBox, Applying Registry: %WindowWidth% x %WindowHeight% RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Westwood Studios\Earth and Beyond\Render, RenderDeviceWidth, %WindowWidth% RegWrite, REG_DWORD, HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Westwood Studios\Earth and Beyond\Render, RenderDeviceHeight, %WindowHeight% ;MsgBox, Set: %WindowWidth% x %WindowHeight% } }
This script takes care of loading the main window, the alts as well as calculating their proper window sizes. There is a config section at the top of this file. If your windows theme has odd sizes for the titlebars and borders, you may wish to screenshot a EnB window and throw it into paint to verify your border sizes and title bar height.
Also in the config section are 4 variables for controlling extra padding around the windows. I like to have a bit of squeeze between the windows so I can click between them. This helps a lot if you are running 5 alts (6 total) as the 5th one will overlap two on the second monitor. And you can then click between the windows to access it if you need to. Set the padding to 0 if you don't like it. Easy.
This script grabs the monitor details from windows. It selects the main display for the main EnB window. It selects your other monitor for the alts. If you have more than 2 monitors it will choose the monitor next to the main. If your main is #1 it will choose monitor #2 for the alts. If your main monitor is #2 it will choose monitor #1 for the alts. If you have only one monitor, it obviously will load them all on the one.
If you do not like how the script picks monitors, check this section:
If MonitorCount >= 2 { EBMainMonitor = %MonitorPrimary% If EBMainMonitor = 1 EBAltMonitor := EBMainMonitor + 1 If EBMainMonitor > 1 EBAltMonitor := EBMainMonitor - 1 }
Replace it with:
EBMainMonitor := 1 EBAltMonitor := 2
And edit the numbers after the "=" to be whatever monitor number you want to force the windows to.
The rest is automatic. It grabs the display sizes and handles the math for window sizes minus the padding you specified and minus the standard boards and titlebar. Then pokes that into the registry prior to launching the first script.
Once the LaunchEnB.ahk loads a copy of EnB, its left with a window titled "EnBLoad". This script then takes that window and renames it to "EnBMain" or "EnBAlt1" or whatever the sequence is. It moves that window to the calculated display position. It then calls the launch script again and repeats the process until the required number of copies are run.
Last Script: EnBPlay.ahk
; ============================================================================================== ; ; This script is the play time script and handles feeding commands to the alts as well as the ; main window. ; ; ============================================================================================== #NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases. ; #Warn ; Enable warnings to assist with detecting common errors. SendMode Input ; Recommended for new scripts due to its superior speed and reliability. SetWorkingDir %A_ScriptDir% ; Ensures a consistent starting directory. #singleinstance force ; ============================================================================================== ; Global Vars Section ; ============================================================================================== MainMouseX:=0 MainMouseY:=0 ; ============================================================================================== ; ============================================================================================== ; Main Startup Section ; ============================================================================================== CoordMode, Mouse, Client GetWindowSizeByTitle("EnBMain",w,h) EBMain := new ObjectXY(w,h) EBMainLocations:= New EnBWindowLocations(EBMain.x,EBMain.y) GetWindowSizeByTitle("EnBAlt1",w,h) EBAlt := new ObjectXY(w,h) EBAltLocations:= New EnBWindowLocations(EBAlt.x,EBAlt.y) MsgBox EnB Play Script Initialized.`nReady to play. WinActivate, EnBMain SaveMainMouse() ; ============================================================================================== #IfWinActive EnBMain ;~~~~~~~~~~~~~~~~~~~~~ [ Main Window Only Macros ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;=========================================================== ; Formations ;=========================================================== Numpad1:: KeyWait Control Gosub, FormationPipe Return Numpad2:: KeyWait Control Gosub, FormationBlock Return Numpad3:: KeyWait Control Gosub, FormationSlot Return Numpad4:: KeyWait Control Gosub, FormationAlt Return ;=========================================================== ;=========================================================== ; Alt Targeting and Firing ;=========================================================== Numpad5:: Gosub, AltSelectMainTarget Return Numpad6:: SendToAlts(" ") ActivateMain() Return ;=========================================================== ;=========================================================== ; Looting ;=========================================================== !Numpad5:: AltSelectMainTarget("EnBAlt1") AltLoot("EnBAlt1") Return !Numpad6:: AltSelectMainTarget("EnBAlt2") AltLoot("EnBAlt2") Return !Numpad7:: AltSelectMainTarget("EnBAlt3") AltLoot("EnBAlt3") Return !Numpad8:: AltSelectMainTarget("EnBAlt4") AltLoot("EnBAlt4") Return !Numpad9:: KeyWait Alt IfWinExist , EnBMain { FromMainXY( "SelectedObjectAction",LootButtonX,LootButtonY) FromMainXY( "LootTopSlot",LootSlotX,LootSlotY) WinActivate, EnBMain SendInput {Click, %LootButtonX% , %LootButtonY% } Sleep 1000 SendInput {Click, %LootSlotX%, %LootSlotY% } Sleep 000 SendInput {Click, %LootButtonX% , %LootButtonY% } } Return ;=========================================================== ;=========================================================== ; Gateing and Registration ;=========================================================== !NumpadAdd:: KeyWait Alt Gosub, ItemActionAllAlts ; Operates Main Action on selected thing (gate, dock, etc) Return !NumpadSub:: KeyWait Alt Gosub, ItemSecondActionAllAlts ; Operates Secondary Action on selected thing (register for example) Return NumpadAdd:: Gosub, ItemActionMain ; Operates Main Action on selected thing (gate, dock, etc) Return NumpadSub:: Gosub, ItemSecondActionMain ; Operates Secondary Action on selected thing (register for example) Return ^NumpadAdd:: KeyWait Control Gosub, AltsAcceptWormhole ; Accepts Wormhole on all alts Return ^NumpadSub:: KeyWait Control Gosub, AltsRejectWormhole ; Rejects Wormhole on all alts Return ;=========================================================== ;=========================================================== ; Inventory Sales ;=========================================================== ^SC029:: KeyWait Control MainSellWholePanel() Return !SC029:: KeyWait Alt loop 12 { Send, {Ctrl Down}{Click}{Ctrl up} Sleep 100 } return ;=========================================================== ;~~~~~~~~~~~~~~~~~~~~~ [ Main Window Only Macros ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #IfWinActive #IfWinActive EnBAlt ;~~~~~~~~~~~~~~~~~~~~~ [ Alt Window Only Macros ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;=========================================================== ; Inventory Sales ;=========================================================== ^SC029:: KeyWait Control AltSellWholePanel() Return !SC029:: KeyWait Alt loop 12 { Send, {Ctrl Down}{Click}{Ctrl up} Sleep 100 } return ;=========================================================== ;~~~~~~~~~~~~~~~~~~~~~ [ Alt Window Only Macros ] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #IfWinActive ;=========================================================== ; Utilities ;=========================================================== FormationPipe: FromMainXY( "Formation", FormX, FormY) FromMainXY( "FormationPipe", OptX, OptY) ActivateMain() Click, %FormX%,%FormY% Sleep 1500 Click, %OptX%,%OptY% Sleep 1000 Gosub, FormationAlt ActivateMain() Return FormationBlock: FromMainXY( "Formation", FormX, FormY) FromMainXY( "FormationBlock", OptX, OptY) ActivateMain() Click, %FormX%,%FormY% Sleep 1500 Click, %OptX%,%OptY% Sleep 1000 Gosub, FormationAlt ActivateMain() Return FormationSlot: FromMainXY( "Formation", FormX, FormY) FromMainXY( "FormationSlot", OptX, OptY) ActivateMain() Click, %FormX%,%FormY% Sleep 1500 Click, %OptX%,%OptY% Sleep 1000 Gosub, FormationAlt ActivateMain() Return FormationAlt: ;SendToWindow("EnBAlt1", "`,") SendToAlts("`,") Return AltSelectMainTarget: SaveMainMouse() WinGet, winList, List, EnBAlt Loop % winList { _hWin := winList%A_Index% WinGetTitle, title, ahk_id %_hWin% AltSelectMainTarget(title) } RestoreMainMouse() Return ItemActionAllAlts: FromAltXY( "SelectedObjectAction", OptX, OptY) WinGet, winList, List, EnBAlt Loop % winList { _hWin := winList%A_Index% WinGetTitle, title, ahk_id %_hWin% ClickOnWindow(title,OptX,OptY) } RestoreMainMouse() Return ItemSecondActionAllAlts: FromAltXY( "SelectedObjectSecondaryAction", OptX, OptY) WinGet, winList, List, EnBAlt Loop % winList { _hWin := winList%A_Index% WinGetTitle, title, ahk_id %_hWin% ClickOnWindow(title,OptX,OptY) } RestoreMainMouse() Return ItemActionMain: FromMainXY( "SelectedObjectAction", OptX, OptY) ClickOnWindow("EnBMain",OptX,OptY) Return ItemSecondActionMain: FromMainXY( "SelectedObjectSecondaryAction", OptX, OptY) ClickOnWindow("EnBMain",OptX,OptY) Return AltsAcceptWormhole: FromAltXY( "WormHoleAccept", OptX, OptY) WinGet, winList, List, EnBAlt Loop % winList { _hWin := winList%A_Index% WinGetTitle, title, ahk_id %_hWin% ClickOnWindow(title,OptX,OptY) } RestoreMainMouse() Return AltsRejectWormhole: FromAltXY( "WormHoleReject", OptX, OptY) WinGet, winList, List, EnBAlt Loop % winList { _hWin := winList%A_Index% WinGetTitle, title, ahk_id %_hWin% ClickOnWindow(title,OptX,OptY) } RestoreMainMouse() Return AltLoot(TheAlt) { local lX,lY IfWinExist , %TheAlt% { FromAltXY( "SelectedObjectAction",LootButtonX,LootButtonY) FromAltXY( "LootTopSlot",LootSlotX,LootSlotY) FromAltXY( "SelectedObject",ObjectX,ObjectY) ;msgbox %LootButtonX% %LootButtonY% CoordMode, Mouse, Client MouseGetPos, lX,lY WinActivate, %TheAlt% SendInput {Click, %LootButtonX%,%LootButtonY%} Sleep 1000 SendInput {Click, %LootSlotX%,%LootSlotY%} Sleep 500 SendInput {Click right %ObjectX%, %ObjectY%} Sleep 500 WinActivate, EnBMain MouseMove, lX, lY } } AltSelectMainTarget(TheAlt) { IfWinExist , %TheAlt% { FromAltXY( "GroupLeaderTarget",tgtX,tgtY) ;msgbox %tgtX% %tgtY% WinActivate, %TheAlt% SendInput {Click, %tgtX%, %tgtY%} Sleep 500 } } AltSellWholePanel() { local ClickDelay := 200 local MouseLow := 0 local MouseHigh := 20 local r := 0 local c := 0 local s := "" loop 4 { ; Row Loop r := a_index Loop 3 { ; Col Loop c := a_index s := "InventoryC" . c . "R" . r SetMouseDelay, Rand(MouseLow,MouseHigh) FromAltXY( s,tgtX,tgtY) MouseMove %tgtX%,%tgtY% Sleep 100+Rand(ClickDelay) SendEvent +{Click} } } ; Row Loop } MainSellWholePanel() { local ClickDelay := 200 local MouseLow := 0 local MouseHigh := 20 local r := 0 local c := 0 local s := "" loop 4 { ; Row Loop r := a_index Loop 3 { ; Col Loop c := a_index s := "InventoryC" . c . "R" . r SetMouseDelay, Rand(MouseLow,MouseHigh) FromMainXY( s,tgtX,tgtY) MouseMove %tgtX%,%tgtY% Sleep 100+Rand(ClickDelay) SendEvent +{Click} } } ; Row Loop } ;=========================================================== ; Core Utilities ;=========================================================== ActivateMain() { WinActivate, EnBMain Sleep 250 } SendToAlts(SendToAll) { SendIt := SendToAll WinGet, winList, List, EnBAlt Loop % winList { _hWin := winList%A_Index% WinGetTitle, title, ahk_id %_hWin% SendToWindow(title,SendIt) } } ClickOnWindow(TheWindow,X,Y) { IfWinExist , %TheWindow% { SetMouseDelay 100 WinActivate, %TheWindow% SendInput {Click, %X%,%Y%} Sleep 100 } } SendToWindow(TheWindow,TextToSend) { IfWinExist , %TheWindow% { WinActivate %TheWindow% Send %TextToSend% Sleep 150 } } SaveMainMouse() { global WinActivate, EnBMain local lX,lY MouseGetPos, lX,lY MainMouseX := lX MainMouseY := lY } RestoreMainMouse() { global ; SplashTextOn, 400, 300, Mouse, Mouse Stored: %MainMouseX% x %MainMouseY% ; Sleep 5000 ; SplashTextOff WinActivate, EnBMain MouseMove, MainMouseX, MainMouseY } Rand( a=0.0, b=1 ) { IfEqual,a,,Random,,% r := b = 1 ? Rand(0,0xFFFFFFFF) : b Else Random,r,a,b Return r } GetWindowSizeByTitle(WindowTitle, ByRef WinWidth := "", ByRef WinHeight := "", WinMode := 1) { local TheWindowID WinGet, TheWindowID, ID, %WindowTitle% fnWinGetPos(TheWindowID, , , WinWidth, WinHeight, WinMode) } fnWinGetPos(hWnd, ByRef x := "", ByRef y := "", ByRef Width := "", ByRef Height := "", Mode := 0) { VarSetCapacity(WRECT, 8 * 2, 0), i := {} , h := DllCall("User32.dll\GetWindowRect", "Ptr", hWnd, "Ptr", &WRECT) if (Mode=1||Mode=3) VarSetCapacity(CRECT, 8 * 2, 0) , h := DllCall("User32.dll\GetClientRect", "Ptr", hWnd, "Ptr", &CRECT) if (Mode=2||Mode=3) DllCall("User32.dll\ClientToScreen", "Ptr", hWnd, "Ptr", &WRECT) , DllCall("User32.dll\ClientToScreen", "Ptr", hWnd, "Ptr", &CRECT) i.x := x := NumGet(WRECT, 0, "Int"), i.y := y := NumGet(WRECT, 4, "Int") , i.h := i.Height := Height := NumGet(Mode=1||Mode=3?CRECT:WRECT, 12, "Int") - (Mode=1||Mode=3?0:y) , i.w := i.Width := Width := NumGet(Mode=1||Mode=3?CRECT:WRECT, 8, "Int") - (Mode=1||Mode=3?0:x) return i, ErrorLevel := !h } Class EnBWindowLocations{ ; These were the dimesnions on which all the points were measured Static BaseClientWidth = 1901 ; Don't Change these! Static BaseClientHeight = 1038 ; Don't Change these! Static WindowWidth := This.BaseClientWidth Static WindowHeight := This.BaseClientHeight Static ScaleWidth := 1 Static ScaleHeight := 1 Static Coords := {} Static TempScale = New ObjectXY() __New( WinWidth, WinHeight ) { This.Coords["SelectedObject"] := New ObjectXY(1700,870) This.Coords["SelectedObjectAction"] := New ObjectXY(1835,697) This.Coords["SelectedObjectSecondaryAction"] := New ObjectXY(1762,697) This.Coords["GroupLeaderTarget"] := New ObjectXY(1818,626) This.Coords["Formation"] := New ObjectXY(1755,360) This.Coords["FormationPipe"] := New ObjectXY(1677,300) This.Coords["FormationBlock"] := New ObjectXY(1752,300) This.Coords["FormationSlot"] := New ObjectXY(1832,300) This.Coords["LootTopSlot"] := New ObjectXY(1696,316) This.Coords["WormHoleAccept"] := New ObjectXY(760,555) This.Coords["WormHoleReject"] := New ObjectXY(1150,555) This.Coords["InventoryC1R1"] := New ObjectXY(90,414) This.Coords["InventoryC1R2"] := New ObjectXY(90,495) This.Coords["InventoryC1R3"] := New ObjectXY(90,578) This.Coords["InventoryC1R4"] := New ObjectXY(90,658) This.Coords["InventoryC2R1"] := New ObjectXY(202,414) This.Coords["InventoryC2R2"] := New ObjectXY(202,495) This.Coords["InventoryC2R3"] := New ObjectXY(202,578) This.Coords["InventoryC2R4"] := New ObjectXY(202,658) This.Coords["InventoryC3R1"] := New ObjectXY(318,414) This.Coords["InventoryC3R2"] := New ObjectXY(318,495) This.Coords["InventoryC3R3"] := New ObjectXY(318,578) This.Coords["InventoryC3R4"] := New ObjectXY(318,658) ; Set up the scaling This.WindowWidth := WinWidth This.WindowHeight := WinHeight This.ScaleWidth := This.WindowWidth / This.BaseClientWidth This.ScaleHeight := This.WindowHeight / This.BaseClientHeight } Set(name, X, Y) { return This.Coords[name] := New ObjectXY(X,Y) } Get(name) { local tmp = New ObjectXY() This.TempScale := This.Coords[name] tmp.x := This.TempScale.x tmp.y := This.TempScale.y return tmp } GetScaled(name) { local tmp = New ObjectXY() This.TempScale := This.Coords[name] tmp.x := This.TempScale.x tmp.y := This.TempScale.y tmp.x := Round( tmp.x * This.ScaleWidth ) tmp.y := Round( tmp.y * This.ScaleHeight ) return tmp }} Class ObjectXY { x := 0 y := 0 __New(xIn,yIn){ This.x := xIn This.y := yIn } } FromXY_old(obj, ByRef X, ByRef Y){ x := obj.x y := obj.y } FromMainXY(Setting, ByRef X, ByRef Y){ global local obj := EBMainLocations.GetScaled(Setting) local x1 := obj.x local y1 := obj.y X := obj.x Y := obj.y } FromAltXY(Setting, ByRef X, ByRef Y){ global local obj := EBAltLocations.GetScaled(Setting) X := obj.x Y := obj.y }
This script gets launched at the end of the EnbLaunchClients.ahk script. Once this script initializes, you will see the "EnB Play Script Initialized." dialog box appear (see previous screenshots). This indicates that the play script is ready for action.
This play script listens for the various keboard shortcuts that I programmed into it and then takes care of sending keystrokes to the main or alt windows or clicking the mouse on various areas of the windows. The class at the end of the script "Class EnBWindowLocations" contains the mouse X/Y positions on MY default window size of 1901x1038. It performs scaling FROM those settings TO whatever size YOUR windows are. Don't edit those positions! It calculates them so they are right for whatever your monitor size is and whatever size the windows loaded as. So if you change the padding or have a bigger or smaller desktop than I do, the numbers will scale automatically by the program.
I tried to label the main groups of hotkeys so its easy to tweak them as you want or add your own. As I said, these are NOT meant for a human to type. You probably don't want to hit Alt-NumPad5 for an alt to loot. Or Ctl-NumPadPlus to accept a wormhole. These were made quirky to stay out of the way of EnB's standard FPS key settings. And I use them in my G13 and G15:
Except for chatting, I never touch the normal QUERTY keys while playing. One hand on the G13, one on the mouse. I ran out of keys on blue (non-combat) so I programmed G13 and G16 (lower left corner of the G15 keyboard) to refuse and accept wormholes as these aren't used much and its quick to hit them using my left hand thats normally on the G13 pad.
The exception to that is the quick sales and quick buys. Ctl-Tilde will attempt to sell a 12 slot inventory panel, whats visible. Due to EnB's bot detection (at least I think thats what it is) it misses some. I have randomized the click times, randomized the waits and I simply can't get it to sell 100% of the time.
The other key combo is Alt-Tilde. It buys 12 of whatever you have selected from the vendor. Very rapidly. Extremely handy for fillin up your hold with trade goods quickly so you can get on the road. I set it to 12 just so it didn't run me broke if I accidentally hit it. If you wish to change the number of buys, search the play script for "!SC029::". Right after that is a "loop 12". Change the 12 to however many you want to buy when hitting this key combo. The "!" means ALT. The "SC029" is the scancode for the Tilde key (top left corner on standard keyboards next to "1".
Again, you can change the key combos to whatever you desire in the play script. And then program your keyboard or arrange them to suit a normal keyboard play style.
Wolfie, I am having a problem. I followed your steps exactly, but when I click one of the EnbLaunchClients.ahk shortcuts, it gets to the Net 7 launch window where you click Play, and it stops there. What am I missing? -
I want to say I am thoroughly excited to see the game back up! I am a software engineer / web developer, and I will try to swing some advertisements out there to bring people here. I want to see this game grow so much that EA regrets letting it die.
- 1
-
I have followed your guide on the FAQ exactly, everything appears to be working, but when I try to log into the game, it will not accept my username/password. I am using the same username and password I used to log into this website and write this help message. Is there another username and password I am supposed to use? What host am I supposed to connect to?
in Technical Support
Posted
I know my username and password, and for some reason I cannot log into the game? Can I get some help please?