Jump to content

Wyzzard

Members
  • Posts

    8
  • Joined

  • Last visited

  • Donations

    0.00 USD 

Posts posted by Wyzzard

  1. 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 it

    4. 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

    1alt1main.thumb.jpg.f28abeca594573a7a12481f851d23304.jpg

     

    - 2 alts, 1 main

    2alts1main.thumb.jpg.5ffd3fdbacfd15a8e8488cf6e8a19298.jpg

     

    - 3 alts, 1 main

    3alts1main.thumb.jpg.59f1298287012bfd20432fa6df0d438a.jpg

     

    - 4 alts, 1 main

    4alts1main.thumb.jpg.ef05c78f7286f8fb8a64c99a4e10914e.jpg

     

    - 5 alts, 1 main

    5alts1main.thumb.jpg.e625708082c2ffaf43fc5cd7f3ad20e4.jpg

     

    - 6 alts, 1 main

    6alts1main.thumb.jpg.14c2e336bc794c85531dbbab8754d175.jpg

     

    EnBAltBoxer.ahk

    EnBPlay.ahk

    LaunchEnB.ahk

  2. 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.

  3. 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:

    EnBG13_1.thumb.jpg.4988f1490c92b215a102fb646db938d2.jpg

    EnBG13_2.thumb.jpg.2661b8e16a1a10f5277f1ed9431c8489.jpg

     

    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?

  4. 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?

×
×
  • Create New...