View Full Version : [Other] Diablo 2 Resurrected multibox project
Kaynin
08-12-2021, 08:34 AM
Hey all,
Old timer and long retired WoW multiboxer here, working on a new project!
I am excited for the D2R launch and am preparing a 3 character box for it. (I think 3 is a nice sweet spot for a decent increase in exp as well as MF purposes.
Currently I am playing around with my set up and prepare myself using d2 classic. I had plenty of d2 classic keys still lying around that I could still redeem.
https://www.dual-boxing.com/attachment.php?attachmentid=2481&stc=1
Don't mind the low quality, just wanted to make the file tiny and it was enough to get the point across of my set up :rolleyes:
Right now, I have a two pc set up, one instance on the main PC and two on the secondary PC.
Programs I use:
Input Director - For mouse sharing across network
(interesting tidbit, enabling the windows option to activate windows on hover, found in ease of access center, will somehow stop playing sound from my client PC when I am active on my main PC, which is great. I can't get it to work the other way around though. So when I go to my client PC game, I hear both the client and main PC's game sounds :( But it is already great that it mutes my client when I go main.)
SoundIt - For sound networking
It's not the greatest of sound quality, but it works well.
Sanboxie - for second instance on second PC
Not sure if D2R will require this, but classic does. We'll see.
Windowed borderless gaming - for the instances on second PC
note: it struggles with enlarged windows, so instead use different windows resolution and scaling to get the desired window size to make sure your mouse doesn't jump all over the place.
I am also interested in trying ISBoxer 2, but I havent gotten my hands on it yet.
I am looking to 3-box on hardcore (I'm not a masochist, really) using a sorceress, a singing barb and a summoner druid.
I am currently looking into using autohotkey for some keysharing. Right now I have to move them all individually, which is not ideal. Although the main purpose is to get 3 player games, which is already achieved, making things easier on myself is always nice of course.
Who else is interested in boxing D2R? I welcome any ideas people have on how to better my set up.
Kaynin
08-12-2021, 01:07 PM
Autohotkey Update
Figured out how to use autohotkey over local network.
First, you need a shared map on both pc's with full permissions. (So that is a local map on both PC's that is shared with the other PC.)
Then in my case as I run one instance on my main PC and two on my secondary, these are the scripts I run. (two scripts running on both PC's)
Main PC script 1:
After starting the script I have 2 seconds to make the diablo II instance active, then it stores its ID in a variable. Because I only have to initialize one instance on this PC, the script is running after that. (I might figure out a way to avoid having to initialize the windows, but I had some trouble getting autohotkey to target diablo without this more forceful method)
For the test I have only used the c key which is the inventory key in my case for testing purposes. It checks to see if I am currently active in the game window, if I am it writes two files, one locally and one on the other PC's shared folder.
#NoEnv
sleep 2000
WinGet, diablo1_id, ID, A
MsgBox, First instance set ("%diablo1_id%").
$c::
IfWinActive, ahk_id %diablo1_id%
{
keypress := "c"
FileAppend, %keypress%`n, commandPC1.txt
FileAppend, %keypress%`n, \\SECONDPC\shared\commandPC2.txt
} else {
Send c
}
return
Main PC script 2:
Again, initializing the window by activating the game window two seconds after starting the script. The rest is just a loop checking to see if anything needs done. (For example, if winactive and c is pressed, the first script makes a file and then this one executes the keypress.
When I wasn't saving these txt files locally for this script, it was lagging and barely working. That's why you need a local folder on both pc's that are shared with full permissions.
#NoEnv
sleep 2000
WinGet, diablo1_id, ID, A
MsgBox, First instance set ("%diablo1_id%").
Loop {
commandline := ""
if FileExist("commandPC1.txt") {
FileReadLine, commandline, commandPC1.txt, 1
if (commandline != "") {
ControlSend,, %commandline%, ahk_id %diablo1_id%
FileDelete, commandPC1.txt
}
}
}
Second PC script 1:
This time I have to initialize two windows. (I run both of these instances of diablo in Sandboxie in two seperate sandboxes named diablobox1 and diablobox2, I have the settings of these sandboxes to show sandbox name in title. This isn't needed for this script, but it is needed for windowed borderless gaming.)
The script much like main pc script 1 is pretty much the same.
#NoEnv
sleep 2000
WinGet, diablo2_id, ID, A
MsgBox, Second instance set ("%diablo2_id%").
sleep 2000
WinGet, diablo3_id, ID, A
MsgBox, Third instance set ("%diablo3_id%").
$c::
IfWinActive, ahk_id %diablo2_id%
{
keypress := "c"
FileAppend, %keypress%`n, \\FIRSTPC\shared\commandPC1.txt
FileAppend, %keypress%`n, commandPC2.txt
}
else IfWinActive, ahk_id %diablo3_id%
{
keypress := "c"
FileAppend, %keypress%`n, \\FIRSTPC\shared\commandPC1.txt
FileAppend, %keypress%`n, commandPC2.txt
} else {
send c
}
return
Second PC script 2:
And again like the main PC script, except double initialization and an extra controlsend to send the key to both instances.
#NoEnv
sleep 2000
WinGet, diablo2_id, ID, A
MsgBox, Second instance set ("%diablo2_id%").
sleep 2000
WinGet, diablo3_id, ID, A
MsgBox, Third instance set ("%diablo3_id%").
Loop {
commandline := ""
if FileExist("commandPC2.txt") {
FileReadLine, commandline, commandPC2.txt, 1
if (commandline != "") {
ControlSend,, %commandline%, ahk_id %diablo2_id%
ControlSend,, %commandline%, ahk_id %diablo3_id%
FileDelete, commandPC2.txt
}
}
}
This is running lagfree for me now. Although at the moment it just opens inventory on all three instances across pc's. With a little work it will be copying skills.
This is it for me today and tomorrow is beta so not sure yet what I want to do with sending mouse clicks.
Inventory spam in action:
https://www.youtube.com/watch?v=mspw0OcNQ9U
Purpleflavor
08-13-2021, 10:13 PM
I'm thinking about it (D2R). I'm boxing D3 atm, season 24 just trying to get the transmogs before it's too late. I use ISBoxer on one pc for 4 accounts and it's the easiest boxing setup i have ever done. It took less then 5 minutes from "fresh start to ready" with the setup wizard, being an experienced user.
As for multi-pc, i havent done this yet, but everyone i've seen talk about multi-pc setup says it's ridiculously easy to do.
Weird group comp you picked. Pally is such a good support with auras you should consider one or two. Conviction is the ultimate group aura.
Kaynin
08-13-2021, 11:51 PM
I know the comp is weird, but I like weird builds. :P
UPDATE:
Might be beta things, but so far I have only gotten one instance per PC to work. Also the autohotkey scripts above that I had working, didn't work at all for D2R so I had to update those.
Anyway, might want to hold out on buying extra copies until release and make sure it is even possible to run more than one instance on a single PC.
Autohotkey script for mouse movement that I got to work between two pc's while using input director:
First Instance on PC1
#NoEnv
CoordMode, Mouse, Window
SetTitleMatchMode 2
$NumpadSub::
ExitApp
return
#If WinActive("box1")
LButton::
MouseGetPos, xpos, ypos
slavexpos := Round(3 * (xpos / 8), 0)
slaveypos := Round(3 * (ypos / 8), 0)
keypressPC1 := "123456789012345 " xpos " " ypos
keypressPC2 := "123456789012345 " slavexpos " " slaveypos
FileAppend, %keypressPC1%`n, commandPC1.txt
FileAppend, %keypressPC2%`n, \\ALIENWOLF\shared\commandPC2.txt
keypress := ""
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
return
#NoEnv
CoordMode, Mouse, Window
SetTitleMatchMode 2
SetControlDelay -1
Loop {
if FileExist("commandPC1.txt") {
FileReadLine, commandline, commandPC1.txt, 1
StringLen, Length, commandline
if (commandline != "") {
if (Length >= 15) {
StringSplit, pos_array, commandline, %A_Space%
DllCall("SetCursorPos", int, pos_array2, int, pos_array3)
ControlClick, x%pos_array2% y%pos_array3%, box1
FileDelete, commandPC1.txt
} else {
ControlSend,, %commandline%, box1
FileDelete, commandPC1.txt
}
}
commandline := ""
pos_array := ""
}
}
Second Instance on PC2
#NoEnv
CoordMode, Mouse, Window
SetTitleMatchMode 2
$NumpadSub::
ExitApp
return
#If WinActive("box2")
LButton::
MouseGetPos, xpos, ypos
slavexpos := Round(8 * (xpos / 3), 0)
slaveypos := Round(8 * (ypos / 3), 0)
keypressPC1 := "123456789012345 " slavexpos " " slaveypos
keypressPC2 := "123456789012345 " xpos " " ypos
FileAppend, %keypressPC1%`n, \\UORUFU\shared\commandPC1.txt
FileAppend, %keypressPC2%`n, commandPC2.txt
keypress := ""
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
return
#NoEnv
CoordMode, Mouse, Window
SetTitleMatchMode 2
SetControlDelay -1
Loop {
if FileExist("commandPC2.txt") {
FileReadLine, commandline, commandPC2.txt, 1
StringLen, Length, commandline
if (commandline != "") {
if (Length >= 15) {
StringSplit, pos_array, commandline, %A_Space%
DllCall("SetCursorPos", int, pos_array2, int, pos_array3)
ControlClick, x%pos_array2% y%pos_array3%, box2
FileDelete, commandPC2.txt
} else {
ControlSend,, %commandline%, box2
FileDelete, commandPC2.txt
}
}
commandline := ""
pos_array := ""
}
}
I used Window Title Changer program to change the name of the instances to "box1" and "box2". Easier to initialize. Although unnecessary if I can't figure out how to run multiple instances on one PC. (as I could just look for the normal win title with only one instance active).
My main instance was at 4k resolution and secondary instance at 1440x810, hence the calculation for slavexpos and slaveypos, if you run all instances in same resolution, no calculations need to be done.
In any case, copying movement worked like a charm with this script, so a dual box at the very least is gonna be possible for me. (Really want to Tribox d2 though, there is a lot of good reason, drop wise mostly, to run at players 3.
Right now I am trying to figure out how to open multiple instances on 1 PC, but it might be just a beta build thing why it isn't working.
I got as far as opening two instances, one with sandboxie, but the sandboxie one could start the game and enter lobby, but not join any game. As soon as I join a game on that instance it goes black and unresponsive.
https://www.dual-boxing.com/attachment.php?attachmentid=2482&stc=1
https://ibb.co/r3Y8z58 (https://ibb.co/r3Y8z58) (Fullscreen)
https://www.dual-boxing.com/attachment.php?attachmentid=2483&stc=1
https://ibb.co/DGc9bjx (https://ibb.co/DGc9bjx) (Fullscreen)
Even though on the second you can see that my second instance 'technically' entered the game. ;(
Kaynin
08-14-2021, 04:52 PM
Okay, I think I've got the movement mostly down.
It still needs a few tweaks, but here are my ahk scripts for dualboxing D2R on two PC's.
PC1 Script 1:
#NoEnv
CoordMode, Mouse, Window
SetTitleMatchMode 2
AutoTrim, Off
MouseIsOver(WinTitle) {
MouseGetPos,,, Win
return WinExist(WinTitle . " ahk_id " . Win)
}
#If WinActive("box1") and MouseIsOver("box1")
LButton::
GetKeyState, capsstate, Pause, D
MouseGetPos, xpos, ypos
If (capsstate == "D")
{
slavexpos := Round(3 * (xpos / 8), 0)
slaveypos := Round(3 * (ypos / 8), 0)
keypressPC2 := "MB|" slavexpos "|" slaveypos "|0|LEFT"
FileAppend, %keypressPC2%`n, \\192.168.1.2\shared\commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC2 := ""
} else
{
slavexpos := Round(3 * (xpos / 8), 0)
slaveypos := Round(3 * (ypos / 8), 0)
keypressPC1 := "MB|" xpos "|" ypos "|0|LEFT"
keypressPC2 := "MB|" slavexpos "|" slaveypos "|0|LEFT"
FileAppend, %keypressPC1%`n, commandPC1.txt
FileAppend, %keypressPC2%`n, \\192.168.1.2\shared\commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC1 := ""
keypressPC2 := ""
}
return
#If WinActive("box1") and MouseIsOver("box1")
RButton::
GetKeyState, capsstate, Pause, D
MouseGetPos, xpos, ypos
If (capsstate == "D")
{
slavexpos := Round(3 * (xpos / 8), 0)
slaveypos := Round(3 * (ypos / 8), 0)
keypressPC2 := "MB|" slavexpos "|" slaveypos "|0|RIGHT"
FileAppend, %keypressPC2%`n, \\192.168.1.2\shared\commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC2 := ""
} else
{
slavexpos := Round(3 * (xpos / 8), 0)
slaveypos := Round(3 * (ypos / 8), 0)
keypressPC1 := "MB|" xpos "|" ypos "|0|RIGHT"
keypressPC2 := "MB|" slavexpos "|" slaveypos "|0|RIGHT"
FileAppend, %keypressPC1%`n, commandPC1.txt
FileAppend, %keypressPC2%`n, \\192.168.1.2\shared\commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC1 := ""
keypressPC2 := ""
}
return
#If WinActive("box1") and MouseIsOver("box1")
+LButton::
GetKeyState, capsstate, Pause, D
MouseGetPos, xpos, ypos
If (capsstate == "D")
{
slavexpos := Round(3 * (xpos / 8), 0)
slaveypos := Round(3 * (ypos / 8), 0)
keypressPC2 := "MB|" slavexpos "|" slaveypos "|1|LEFT"
FileAppend, %keypressPC2%`n, \\192.168.1.2\shared\commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC2 := ""
} else
{
slavexpos := Round(3 * (xpos / 8), 0)
slaveypos := Round(3 * (ypos / 8), 0)
keypressPC1 := "MB|" xpos "|" ypos "|1|LEFT"
keypressPC2 := "MB|" slavexpos "|" slaveypos "|1|LEFT"
FileAppend, %keypressPC1%`n, commandPC1.txt
FileAppend, %keypressPC2%`n, \\192.168.1.2\shared\commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC1 := ""
keypressPC2 := ""
}
return
#If WinActive("box1") and MouseIsOver("box1")
+RButton::
GetKeyState, capsstate, Pause, D
MouseGetPos, xpos, ypos
If (capsstate == "D")
{
slavexpos := Round(3 * (xpos / 8), 0)
slaveypos := Round(3 * (ypos / 8), 0)
keypressPC2 := "MB|" slavexpos "|" slaveypos "|1|RIGHT"
FileAppend, %keypressPC2%`n, \\192.168.1.2\shared\commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC2 := ""
} else
{
slavexpos := Round(3 * (xpos / 8), 0)
slaveypos := Round(3 * (ypos / 8), 0)
keypressPC1 := "MB|" xpos "|" ypos "|1|RIGHT"
keypressPC2 := "MB|" slavexpos "|" slaveypos "|1|RIGHT"
FileAppend, %keypressPC1%`n, commandPC1.txt
FileAppend, %keypressPC2%`n, \\192.168.1.2\shared\commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC1 := ""
keypressPC2 := ""
}
return
PC1 Script 2:
#NoEnv
CoordMode, Mouse, Window
SetTitleMatchMode 2
SetControlDelay -1
Loop {
state := GetKeyState("LShift")
if (state == "U") {
ControlSend,,{LShift up}, box1
}
if FileExist("commandPC1.txt") {
FileReadLine, commandline, commandPC1.txt, 1
StringLen, Length, commandline
if (commandline != "") {
StringSplit, pos_array, commandline, "|"
If (pos_array1 == "MB") {
DllCall("SetCursorPos", int, pos_array2, int, pos_array3)
If (pos_array4 == "1") {
ControlSend,,{RShift down}, box1
ControlClick, x%pos_array2% y%pos_array3%, box1,, %pos_array5%
ControlSend,,{RShift up}, box1
} else {
ControlClick, x%pos_array2% y%pos_array3%, box1,, %pos_array5%
}
pos_array := ""
commandline := ""
}
else {
ControlSend,, %commandline%, box1
commandline := ""
}
FileDelete, commandPC1.txt
}
}
}
(PC2 scripts in post below, ran into character length restriction)
Renamed PC1 instance to "box1" and PC2 instance to "box2" with window title changer and the script is now completely compatible with Input Director. (I had some issues with active windows, having both instances active at times, but an extra test to check if the mouse is over the active window as well fixed that.
https://www.youtube.com/watch?v=DzL84FJJlwY
As you can see, even though I am not very familiar with this set up, it is already looking viable.
Right now I can mute the main instance and reasjust the second char. (Using my capslock key that is remapped to pause), I also need a pause on the second char still to make things even better. After that, its just more simply key cloning to allow with skill changing and I'm set.
All in all pretty happy with my little D2R beta project so far. Still a bit unhappy to be limited to one client per PC atm. Hoping that will change for release.
Kaynin
08-14-2021, 04:53 PM
PC2 Script 1:
#NoEnv
CoordMode, Mouse, Window
SetTitleMatchMode 2
AutoTrim, Off
MouseIsOver(WinTitle) {
MouseGetPos,,, Win
return WinExist(WinTitle . " ahk_id " . Win)
}
#If WinActive("box2") and MouseIsOver("box2")
LButton::
GetKeyState, capsstate, Pause, D
MouseGetPos, xpos, ypos
If (capsstate == "D")
{
slavexpos := Round(8 * (xpos / 3), 0)
slaveypos := Round(8 * (ypos / 3), 0)
keypressPC1 := "MB|" slavexpos "|" slaveypos "|0|LEFT"
FileAppend, %keypressPC1%`n, \\192.168.1.235\shared\commandPC1.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC2 := ""
} else
{
slavexpos := Round(8 * (xpos / 3), 0)
slaveypos := Round(8 * (ypos / 3), 0)
keypressPC2 := "MB|" xpos "|" ypos "|0|LEFT"
keypressPC1 := "MB|" slavexpos "|" slaveypos "|0|LEFT"
FileAppend, %keypressPC1%`n, \\192.168.1.235\shared\commandPC1.txt
FileAppend, %keypressPC2%`n, commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC1 := ""
keypressPC2 := ""
}
return
#If WinActive("box2") and MouseIsOver("box2")
RButton::
GetKeyState, capsstate, Pause, D
MouseGetPos, xpos, ypos
If (capsstate == "D")
{
slavexpos := Round(8 * (xpos / 3), 0)
slaveypos := Round(8 * (ypos / 3), 0)
keypressPC1 := "MB|" slavexpos "|" slaveypos "|0|RIGHT"
FileAppend, %keypressPC1%`n, \\192.168.1.235\shared\commandPC1.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC2 := ""
} else
{
slavexpos := Round(8 * (xpos / 3), 0)
slaveypos := Round(8 * (ypos / 3), 0)
keypressPC2 := "MB|" xpos "|" ypos "|0|RIGHT"
keypressPC1 := "MB|" slavexpos "|" slaveypos "|0|RIGHT"
FileAppend, %keypressPC1%`n, \\192.168.1.235\shared\commandPC1.txt
FileAppend, %keypressPC2%`n, commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC1 := ""
keypressPC2 := ""
}
return
#If WinActive("box2") and MouseIsOver("box2")
+LButton::
GetKeyState, capsstate, Pause, D
MouseGetPos, xpos, ypos
If (capsstate == "D")
{
slavexpos := Round(8 * (xpos / 3), 0)
slaveypos := Round(8 * (ypos / 3), 0)
keypressPC1 := "MB|" slavexpos "|" slaveypos "|1|LEFT"
FileAppend, %keypressPC1%`n, \\192.168.1.235\shared\commandPC1.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC2 := ""
} else
{
slavexpos := Round(8 * (xpos / 3), 0)
slaveypos := Round(8 * (ypos / 3), 0)
keypressPC2 := "MB|" xpos "|" ypos "|1|LEFT"
keypressPC1 := "MB|" slavexpos "|" slaveypos "|1|LEFT"
FileAppend, %keypressPC1%`n, \\192.168.1.235\shared\commandPC1.txt
FileAppend, %keypressPC2%`n, commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC1 := ""
keypressPC2 := ""
}
return
#If WinActive("box2") and MouseIsOver("box2")
+RButton::
GetKeyState, capsstate, Pause, D
MouseGetPos, xpos, ypos
If (capsstate == "D")
{
slavexpos := Round(8 * (xpos / 3), 0)
slaveypos := Round(8 * (ypos / 3), 0)
keypressPC1 := "MB|" slavexpos "|" slaveypos "|1|RIGHT"
FileAppend, %keypressPC1%`n, \\192.168.1.235\shared\commandPC1.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC2 := ""
} else
{
slavexpos := Round(8 * (xpos / 3), 0)
slaveypos := Round(8 * (ypos / 3), 0)
keypressPC2 := "MB|" xpos "|" ypos "|1|RIGHT"
keypressPC1 := "MB|" slavexpos "|" slaveypos "|1|RIGHT"
FileAppend, %keypressPC1%`n, \\192.168.1.235\shared\commandPC1.txt
FileAppend, %keypressPC2%`n, commandPC2.txt
xpos := ""
ypos := ""
slavexpos := ""
slaveypos := ""
keypressPC1 := ""
keypressPC2 := ""
}
return
PC2 Script 2:
#NoEnv
CoordMode, Mouse, Window
SetTitleMatchMode 2
SetControlDelay -1
Loop {
state := GetKeyState("LShift")
if (state == "U") {
ControlSend,,{LShift up}, box2
}
if FileExist("commandPC2.txt") {
FileReadLine, commandline, commandPC2.txt, 1
StringLen, Length, commandline
if (commandline != "") {
StringSplit, pos_array, commandline, "|"
If (pos_array1 == "MB") {
DllCall("SetCursorPos", int, pos_array2, int, pos_array3)
If (pos_array4 == "1") {
ControlSend,,{RShift down}, box2
ControlClick, x%pos_array2% y%pos_array3%, box2,, %pos_array5%
ControlSend,,{RShift up}, box2
} else {
ControlClick, x%pos_array2% y%pos_array3%, box2,, %pos_array5%
}
pos_array := ""
commandline := ""
}
else {
ControlSend,, %commandline%, box2
commandline := ""
}
FileDelete, commandPC2.txt
}
}
}
PS: I am sure I could trim these scripts, and some things might be redundant. But it seems to be less robust with all the variable emptying and extra meat.
ragni
08-28-2021, 10:10 PM
Please tell me where or what those side monitors can be purchased at/found
Kaynin
08-30-2021, 02:30 AM
The monitors are pretty overkill for this particular usecase.
My main monitor is an Asus PG43UQ and the side monitor is an Asus PG278Q
napster1150
09-04-2021, 01:25 AM
Were you able to get 2 clients running in the beta? I'd prefer to avoid KVMs if possible.
vollekanne
09-22-2021, 05:51 PM
Hi guys.
i want to know if anyone tried VMware Workstation 16.x ?
The v16 have DirectX 11 support if u use the latest VMware tools, so i think its possible to run x clients on one Computer.
Im going to try it tomorrow for start.
napster1150
09-25-2021, 08:58 AM
Hi guys.
i want to know if anyone tried VMware Workstation 16.x ?
The v16 have DirectX 11 support if u use the latest VMware tools, so i think its possible to run x clients on one Computer.
Im going to try it tomorrow for start.
D2R runs in DirectX 12.
napster1150
09-25-2021, 09:07 AM
The best solution I have found so far is to run the second account on my laptop and remote access it on my other monitor. Teamviewer seems to be the client with the least frame drop for this in my experience. I was unable to find any VM that support Direct X12 3D acceleration, so it seems that for any VM solution, while it may launch, the game would run extremely laggy as it would not be able to fully (or at all) utilize your graphics card.
Left0s
09-25-2021, 12:46 PM
Hello everybody,
I have checked it with both VMWare Workstaiton 15.5.6 and 16.1.2
16.1.2 build-17966106
Unfortunately it doesnt work.
After the installation of the game is completed and you press "play" it shows this message.
"Failed to initialize graphics device. Please ensure your PC meets the minimum system requirements and your drivers are up to date."
I did a research about this and the main problem is that it is not possible to passthrough any PCIe device (or GPU) to your VMware Workstation.
https://communities.vmware.com/t5/VMware-Workstation-Pro/VM-have-direct-connection-to-the-host-GPU/td-p/1860425
The only VMware product which has PCI passthrough capability is vSphere/ESXi. ESXi can be installed only on server OS.
If you try to setup VMWare with a Windows Server (Guest) and into this guest setup vShpere/ESXi it goes too far.
Considering the problem with the VMWare workstation PCIe passthrough you will get the same results.
Another possible solution could be Hyper-V because it can be installed into Windows 10 Pro and it also supports PCIe passthrough BUT again based on what i have found so far, during the configuration of a new VM into Hyper-V at some point you have to "...disassociate the device from the host OS and then associate it with the VM"
device = HOST Graphics or GPU
Source: https://searchvirtualdesktop.techtarget.com/tip/Running-GPU-passthrough-for-a-virtual-desktop-with-Hyper-V
So if i associate my graphics (GTX1060) to VM into Hyper-V then i will have problem with the D2R that i want to run in host machine. I GUESS
PFFFFF LOST all my Saturday trying to find solution on this.
Tilted as hell.
Last thing before i throw my whole setup from the window i did 30mins meditation and then i took a laptop... to run my second D2R box.
GL to everybody and IF anybody find a solution which doesnt need second machine please do let us know here.
MiRai
09-25-2021, 01:47 PM
I would just like to say that this thread is incredibly amusing. ;)
vollekanne
09-27-2021, 09:01 AM
Blizzard system specs only say u need a directx GPU but not dx11 or dx12 at all.
I tried vmware util latest v16.x but vmware do not run DX12.
Its possible to run dx12 on vmware ESXI but u need a second GPU and config pci passthrough to run the GPU direct in the vm.
This let u install the GPU like a real GPU in the vm.
I tried run two battlent instances on two windows guests that have no acces to each other installations but battlent detect it when u try to run a second client.
Now i run a second client on a notebook using AnyDesk.
stefanhc
09-30-2021, 10:39 AM
Hi Kaynin,
Thank you so much for posting your AHK scripts and process. I am trying to do the same on D2R but I am struggling with your screen resolution formula. My main screen is 2560x1440 and my laptop screen is 1920x1080. I understand that you use "8 * (xpos / 3)" to convert the cursor location from main to secondary screen, but how do I figure out the code for my resolution to do the same?
EDIT: I managed to figure it out at 8 / 6 and 6 / 8. However, on my main screen, box 2 does not react. And when I click on Box 2 screen, my main screen moves but Box 2 does not. Not sure where I went wrong here.
Kind regards,
Stefan
vBulletin® v4.2.2, Copyright ©2000-2025, Jelsoft Enterprises Ltd.