Assumes
* you have the Steam version of the game for Windows
* you have a spare Windows 7 license to use for the virtual machine
* you can follow instructions - i'm not supporting this if you can't get it to work.
* you are comfortable with the command line - If you can't change directories, you're going to have a bad time.
System Requirements
* Some form of Hypervisor - Hyper-V, VMWare Player/Workstation, Virtual Box - basically anything that will run Windows 7
* You know your Steam Login details
* Factorio is *really* sensitive netcode wise. If *any* player connected lags, you all lag. It sucks, but if you have friends with shitty internet, I wouldn't invite them to your games. That said, I've played with 5 players (2 lan, 1 in Sydney, 1 in Melbourne) for 20-30 hours at a time just fine. The more players you have, the more upstream *ALL* players need (not just the host). So long as everyone is under 120ms to eachother, with a *stable* ping and ADSL2 upload, you should be fine.
* I built this on my 5930K X99-A PCIE M2 SSD system. Performance wise, YMMV. If in doubt give it more ram and place the VM on an SSD.
Disclaimer
This is not a secure VM.
This is not a particularly well scripted VM.
This is not a hardened install of Windows 7.
If it gets crypto'd, hacked, or whatever its not my fault. I built this VM in about 15 minutes one day when the local server multiplayer started running like shit.
I spent about an hour scripting the update stuff and its not code i'm particularly proud of. In fact it took me twice as long as all of that to write this post.
You can probably make it better - hell I'll probably do it. But its a starting point for you.
If this explodes in a firey mess and eats your dog, I apologise but i accept no liability.
Can't you script most of this?
Well yes - but you really shouldn't take people's scripts from the internet that involve installing applications, using your SteamID details, configuring firewalls, etc and just run them.
Its a bad idea. And a good way to have your stuff owned.
Step 1 - Build your VM
1. After creating my virtual machine, I just used a Vanilla Windows 7 Pro SP1 x64 install - nothing special here. For ease of uses sake, I called my VM
Code: Select all
Factorio
2. Install your Hypervisor's suggested drivers/tools (e.g VMWare Tools, Hyper-V Integration Services, etc)
3. (Optional) After you login, setup autologin to windows - you can do this via
Note i didn't bother updating my VM because i was never going to publish it to the web.1. Click Start, type netplwiz, and then press Enter.
2. In the User Accounts dialog box, click the account you want to automatically log on to.If it is available, clear the Users Must Enter A User Name And Password To Use This Computer check box.
3. Click OK.
4. In the Automatically Log On dialog box, enter the user’s password twice and click OK.
4. (Optional) Give your VM a static IP / DHCP Reservation for easier router forwarding
5. I turned UAC off and set run all applications as admin on - you can do this via;
1. Run - >Accept the UAC promptCode: Select all
%windir%\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f
2. Run - >Accept the UAC promptCode: Select all
%windir%\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v ConsentPromptBehaviorAdmin /t REG_DWORD /d 0 /f
3. Run ->Code: Select all
shutdown -r -t 0 -f
Step 2 - Install SteamCMD, and connect to your account
https://developer.valvesoftware.com/wiki/SteamCMD
1. Download SteamCMD from here - https://steamcdn-a.akamaihd.net/client/ ... eamcmd.zip
2. I install all of SteamCMD into c:\steamcmd
3. Open a command prompt and change directory to c:\steamcmd
4. Launch SteamCMD and auth your steamguard to this pc
Code: Select all
steamcmd.exe
login <your steam username>
<your steam password>
Code: Select all
<your steamguard ID emailed to you by Valve>
Step 3 - Download Factorio to your VM
Still within SteamCMD now type
Code: Select all
force_install dir c:\factorio
app_update 427520 validate
Code: Select all
quit
Step 4 - Configure Factorio Game launches
1. Browse to C:\ and make a folder called "scripts"
2. Download this application (SendSignalCtrlC.exe) from dropbox - https://dl.dropboxusercontent.com/u/490 ... lCtrlC.exe (mirror https://dl.dropboxusercontent.com/u/490 ... lCtrlC.exe)
This file will send a Ctrl+C to a process - allowing Factorio to save the game and quit gracefully. I did not write/compile this script - it was found in this thread http://stackoverflow.com/questions/8130 ... er.com/web Author source is here - http://www.latenighthacking.com/project ... endSignal/
3. Save the following scripts in the c:\scripts folder
NOTE YOU WILL NEED TO UPDATE <your steam username> AND <your steam password> IN THE BELOW SCRIPT FOR IT TO WORK
update_factorio.cmd
Code: Select all
@tasklist /FI "IMAGENAME eq factorio.exe" 2>NUL | find /I /N "factorio.exe">NUL
if "%ERRORLEVEL%"=="0" GOTO :CLOSE_FACTORIO
if "%ERRORLEVEL%"=="1" GOTO :UPDATE_FACTORIO
:CLOSE_FACTORIO
@ECHO CLOSE_FACTORIO
@echo off
for /f "tokens=2 delims=," %%F in ('tasklist /nh /fi "imagename eq factorio.exe" /fo csv') do set factoriopid=%%~F
@echo on
start /w c:\scripts\SendSignalCtrlC64.exe %factoriopid%
tasklist /FI "IMAGENAME eq factorio.exe" 2>NUL | find /I /N "factorio.exe">NUL
if "%ERRORLEVEL%"=="0" GOTO :CLOSE_FACTORIO
icacls %appdata%\Factorio\saves\* /grant Everyone:F /t
GOTO :UPDATE_FACTORIO_RESTART
:UPDATE_FACTORIO
@ECHO UPDATE_FACTORIO
start /W c:\steamcmd\steamcmd.exe +login <your steam username> <your steam password> +force_install_dir c:\factorio +app_update 427520 validate +quit
GOTO :EOF
:UPDATE_FACTORIO_RESTART
@ECHO UPDATE_FACTORIO_RESTART
start /WAIT c:\steamcmd\steamcmd.exe +login <your steam username> <your steam password> +force_install_dir c:\factorio +app_update 427520 validate +quit
IF "%factariolan%"=="YES" start "explorer.exe" "C:\Users\Factorio\Desktop\Launch Last Game - LAN.lnk"
IF "%factariolan%"=="NO" start "explorer.exe" "C:\Users\Factorio\Desktop\Launch Last Game - WAN.lnk"
GOTO :END
:END
@ECHO ENDING
find_newest_save_and_launch-lan.cmd
Code: Select all
@setlocal enableextensions enabledelayedexpansion
@setx /m factariolan "YES"
@echo off
cd \
cd %appdata%\factorio\saves
for /f "tokens=*" %%a in ('dir /b /od') do (
set newest=%%a
if "x!newest:~-4!"=="x.zip" (
set newest=!newest:~0,-4!
))
cd \
cd c:\factorio\bin\x64
echo f| factorio --start-server %newest% --autosave-interval 15 --autosave-slots 3 --latency-ms 40
Code: Select all
@setlocal enableextensions enabledelayedexpansion
@setx /m factariolan "NO"
@echo off
cd \
cd %appdata%\factorio\saves
for /f "tokens=*" %%a in ('dir /b /od') do (
set newest=%%a
if "x!newest:~-4!"=="x.zip" (
set newest=!newest:~0,-4!
))
cd \
cd c:\factorio\bin\x64
echo f| factorio --start-server %newest% --autosave-interval 15 --autosave-slots 3 --latency-ms 140
Code: Select all
:CLOSE_FACTORIO
@echo off
for /f "tokens=2 delims=," %%F in ('tasklist /nh /fi "imagename eq factorio.exe" /fo csv') do set factoriopid=%%~F
@echo on
c:\scripts\SendSignalCtrlC64.exe %factoriopid%
tasklist /FI "IMAGENAME eq factorio.exe" 2>NUL | find /I /N "factorio.exe">NUL
if "%ERRORLEVEL%"=="0" GOTO :CLOSE_FACTORIO
icacls %appdata%\Factorio\saves\* /grant Everyone:F /t
exit
Code: Select all
Wmic.exe shadowcopy call create ClientAccessible,"C:\"
Launch Last Game - LAN
Code: Select all
target - C:\scripts\find_newest_save_and_launch-lan.cmd < nul
Code: Select all
target - C:\scripts\find_newest_save_and_launch-wan.cmd < nul
Code: Select all
target - C:\scripts\update_factorio.cmd < nul
Code: Select all
C:\scripts\find_and_close_factorio_with_save.cmd < nul
mods
Code: Select all
target - %appdata%\Factorio\mods
Code: Select all
target - %appdata%\Factorio\saves
1. (Optional) Run Task Scheduler and setup an Update on Startup task
2. (Optional) Run Task Scheduler and setup a Volume Shadow Copy taskRun ->Right Click on Task Scheduler Library -> Create TaskCode: Select all
%windir%\system32\taskschd.msc /s
General Tab
Name - Update Factorio
Use the following user account - NT AUTHORITY\SYSTEM - n.b click change user or group, search for SYSTEM, click ok
Run with highest privileges - check
Configure for - Windows 7
Triggers Tab
New -> Begin the task: -> At Startup, ensure Enabled is checked -> Ok
Actions Tab
New -> Start a Program -> Browse -> C:\scripts\update_factorio.cmd -> Ok
Settings Tab
Allow task to be run on demand - check
Stop the task if it runs longer than - check, 1 hour
If the running task does not end when requested, force it to stop - check
If the task is running, then the following rule applies: -> Do not start a new instance
Click Ok to save and close
Step 6 - Create File shares so you can copy save games and mods in and out of the serverRight Click on Task Scheduler Library -> Create TaskCode: Select all
%windir%\system32\taskschd.msc /s
General Tab
Name - Shadow Copy C
Use the following user account - NT AUTHORITY\SYSTEM - n.b click change user or group, search for SYSTEM, click ok
Run with highest privileges - check
Configure for - Windows 7
Triggers Tab
New -> Begin the task: -> On a schedule -> Check Daily -> Set time to rounded hour (e.g 8:00:00 AM) -> Recur every: 1 days -> Repeat Task every 1 Hour for a duration of Indefinitely -> ensure Enabled is checked -> Ok
Actions Tab
New -> Start a Program -> Browse -> C:\scripts\create_shadowcopy.bat -> Ok
Settings Tab
Allow task to be run on demand - check
Run task as soon as possible after a scheduled start is missed - check
If the task fails, restart every -> 15 minutes
Attempt to restart up to: -> 3 times
Stop the task if it runs longer than - check, 1 hour
If the running task does not end when requested, force it to stop - check
If the task is running, then the following rule applies: -> Do not start a new instance
Click Ok to save and close
1. Change Control Panel -> Network and Sharing Centre -> Advanced Sharing Settings -> Home or Work (Current Profile) to
Then restart the VMTurn on Network Discovery
Turn on File and Printer Sharing
Turn off Public Folder sharing
Use 128-bit encryption
Turn off password protected sharing
Use user accounts and passwords to connect to other computers
2. In Windows Explorer, browse to "%appdata%\Factorio% - if this folder does not exist, create it
3. Create a Folder called "mods", share it to "everyone" with read/write privileges and set the NTFS permissions for "everyone" to "Full Control"
4. Create a Folder called "saves", share it to "everyone" with read/write privileges and set the NTFS permissions for "everyone" to "Full Control"
5. Test that you can browse from your PC to \\factorio\saves and \\factorio\mods
Step 7 - Lock down your Steam account password that is stored in plain text
Because Factorio hasn't published a dedicated server app to Steam, you need to login to an account to download/update Factorio. This means you've saved your Steam account password in plain text. To restrict access to it, you need to lock down your c:\scripts folder with NTFS security. This is not perfect. If someone has direct console access to your VM and logs into your Factorio user, they can read your steam password - but you have Steam Guard enabled right?
1. Browse to the C:\
Step 8 - Open UDP Port 34197 for your Factorio ServerRight Click Scripts -> Properties -> Security Tab -> Advanced
Click Change Permissions
Untick "Include inheritable permissions from this object's parent" -> Select Add
Select the Item "Users (FACTORIO\users)" -> Remove
Select the Item "Authenticated Users" -> Remove
Click Add -> Type Factorio -> Check names -> Ok -> tick "Full Control" "Allow" -> Ok
Click Ok
Click Ok
Click Ok
1. Open ports on the Factorio Server
2. (Optional) Open port 34197 UDP on your Router to your Factorio Server so Internet players can connect - every router is different, check http://portforward.com/english/routers/port_forwarding/ or whatever.Run -> cmdCode: Select all
netsh advfirewall firewall add rule name="Factorio UDP In" program="C:\Factorio\bin\x64\Factorio.exe" service="factorioudp" description="Factorio UDP" enable=Yes profile=Private dir=IN localip=ANY remoteip=ANY localport=34197 remoteport=34197 protocol=UDP interface=ANY action=allow netsh advfirewall firewall add rule name="Factorio UDP Out" program="C:\Factorio\bin\x64\Factorio.exe" service="factorioudp" description="Factorio UDP" enable=Yes profile=Private dir=OUT localip=ANY remoteip=ANY localport=34197 remoteport=34197 protocol=UDP interface=ANY action=allow
Hokay, so if you've done all the above, you should have a fairly robust Factorio Dedicated Server. It will update when you reboot the VM or if you run the "Update Factorio" shortcut.
Step 9 - How to play (finally)
1. Start your server.
If you try to run it straight off the bat with either of the Launch Last Game shortcuts - it won't work. Those shortcuts search the Saves folder for the last game you saved (or the game autosaved), and start the server with that game. So copy in a current save to the \\factorio\saves folder on your network and off you go. I like to start a Multiplayer game on my own PC, saving the map until i get a decent enough start, then copying that save up to the server for everyone to pile in.
If you have mods - you have to ensure *everyone* has the same mods (name AND version) - otherwise they can't connect (nor can the server start) - so copy those into \\factorio\mods - and distribute them with your fellow factorians - remember it belongs in their %appdata%\factorio\mods folder.
Save games seem to upgrade within major versions (e.g version 12 games will upgrade ok).
2. Connect to your server - Start Factorio -> Play -> Multiplayer -> Connect to Game -> Factorio (if you're a LAN player. If you're an Internet player joining your friend put their web facing IP in there, they can find it via typing "what is my ip" into google.)