diff --git a/game_eggs/steamcmd_servers/satisfactory/README.md b/game_eggs/steamcmd_servers/satisfactory/README.md index e8c1782a..3b74719f 100644 --- a/game_eggs/steamcmd_servers/satisfactory/README.md +++ b/game_eggs/steamcmd_servers/satisfactory/README.md @@ -1,5 +1,5 @@ # Satisfactory -***Server version currently marked as experimental by the Satisfactory developers! Egg loads fine, but your mileage may vary in-game.*** +***Updating your Egg?**: Ensure any existing servers have the latest Startup Command, new Startup Variables are set, **and you reinstall server!*** ___ ### Authors / Contributors @@ -46,6 +46,13 @@ ___ 💻 💡 + + +
AlienXAXS +
+
+ 💡 + @@ -60,18 +67,15 @@ ___ - Configuration of the Server Query, Beacon, and Game ports. - Configurable to automatically check for server updates on start via SteamCMD. Forcing validation is also configurable. - *[Experimental]* Max player configuration. -- Misc. settings listed below can be configured by an admin client via the game's UI, and are currently **not** set via the Egg: - - Server Password - - Admin Password - - Auto-Save on Player Disconnect - - Pause When No Players Online - - ...and possibly more as the client's UI is developed further for more configuration options. +- Autosave amount and interval configuration. +- Disable crash reporting if desired. +- ...and other advanced networking and server branch configurable settings. ___ ### Server Ports - Default server ports are listed below, but all three ports can be changed freely. - **Note:** The Primary/Default/Game Port for your server in Pterodactyl will be Satisfactory's `-Port=????` game port, even though clients will **connect with the Query port**. - It is recommended to distance ports of other running Satisfactory servers in Pterodactyl by **increments of 100** (it is currently unknown what the minimum increment is, but an increment of +1 caused cross-server talk in testing). Also, your internal ports **must match** your external ports on your network (ie. you can't have an external port of 7778 forwarded to your 7777 internal port; they must match). -- ***All three ports are required to be open for normal server behavior!*** +- ***All three ports are required to be open/allocated for normal server behavior!*** | Port | Default (UDP) | |---------|---------| @@ -80,39 +84,60 @@ ___ | Server Query | 15777 | ___ -### Installation Requirements/Instructions -- No major requirements, other than RAM and Disk space noted below. -- You *do not* need to own the base game to host this server. -- However, to fully "initialize" your server, a client who owns the game must log into the server to "claim" it and create a new session. The generated session will not be written to disk until the first save occurs. -- Currently, there is no way to save the session on server stop. Therefore, ensure the session is saved or the last player has disconnected (causing an auto-save) before stopping the server. -___ -### Minimum RAM Requirement -This server requires a minimum of 4096 MiB of RAM to boot, but the developers recommend 6144 to 8192 MiB of RAM for 4 players or large save files. -___ -### Minimum Disk Requirement -This server requires just under 5 GB of disk space to safely run properly. However, save files could easily surpass this amount, so 7-10 GB is recommended. -___ -### Save File Location -[According to the developer](https://www.youtube.com/watch?v=Nn-1s87JJxc), save files will be able to be uploaded and downloaded by clients via their game client in the future. Until then, below is the save file location in case you would like to upload or download a save file manually: +### Installation/System Requirements -`/home/container/.config/Epic/FactoryGame/Saved/SaveGames/server` +| | Bare Minimum | Recommended | +|---------|---------|---------| +| Processor | Recent x86/64 (AMD/Intel) processor. No 32 bit or ARM support. | Favours higher single-core performance over multiple cores. | +| RAM | 4096 MiB | 6144-8192 MiB (especially for 4 players or large save files) | +| Storage | 5 GB | 7-10 GB (or more, depending on save size or frequency) | +| Network | 0.512 Mbit/s | 1-5 Mbit/s ([may require server *and* client config tweeks](https://satisfactory.fandom.com/wiki/Multiplayer#Temporary_lag_solution)) | +| Host OS | Most stable Linux OS branches should work | Using the latest kernel version for your installed OS can prevent some edge-case installation/boot issues. | +| Game Ownership | Not required to start. | Required to fully "initialize" (see [Server Initialization](#server-initialization) below) | -Single-player save files can be uploaded here and are playable if desired. +___ +### Server Initialization +For a server to be fully "initialized", a client who owns the game must log into the server to "claim" it and create an administrator password. Then, a new session can be created via the "Create Game" tab in-game, or an existing save file can be uploaded (see [Save Files](#save-files) below). + +Misc. settings listed below can be configured by an admin client via the game's "Server Settings" tab, and are currently **not** set via the Egg: +- Server Password +- Admin Password +- Auto-Save on Player Disconnect +- Pause When No Players Online +- ...and possibly more as the client's UI is developed further for more configuration options. +___ +### Save Files +An existing save file (including single-player saves) can currently be uploaded to the server via two different methods: +- "Manage Saves" tab via a client in-game (Recommended) +- Manually via the File Manager or SFTP + +Save files are located in this directory: +``` +/home/container/.config/Epic/FactoryGame/Saved/SaveGames/server +``` +*Note: A manually uploaded save will only load if it is (a.) loaded manually via the "Manage Saves" tab in-game, (b.) it is the only save file present, or (c.) its existing session name (not its file name) matches the existing save's session name *and* has the most recent time stamp.* + +***Warning:*** Stopping the server **does not** currently save your game! Ensure it is saved before stopping the server. + +If you have forgotten your administrator password or would generally like to reset your server as if it were new, you can delete the following file: +``` +/home/container/.config/Epic/FactoryGame/Saved/SaveGames/ServerSettings. +``` ___ ### Console Commands As of v5.0.4, the console tab in the client server manager is the only way to execute commands. Entering commands via Pterodactyl do nothing. -[List of known commands can be found via the Wiki](https://satisfactory.fandom.com/wiki/Dedicated_servers#Commands) +[List of known commands can be found via the Wiki.](https://satisfactory.fandom.com/wiki/Dedicated_servers#Console_commands) ___ ### Errors/Warnings -The following errors or warnings you see in the console can safely be ignored: +##### The following errors or warnings you see in the console can safely be ignored: ```log steamclient.so: cannot open shared object file: No such file or directory [S_API] SteamAPI_Init(): Loaded '/home/container/.steam/sdk64/steamclient.so' OK. (First tried local 'steamclient.so') LogSteamShared: Warning: Steam Dedicated Server API failed to initialize. ``` -The local file of 'steamclient.so' was attempted to be loaded, but could not because it is not present, causing the warning message. However, the backup `/home/container/.steam/sdk64/steamclient.so` is loaded successfully (this is the correct behavior according to the [Wiki](https://satisfactory.fandom.com/wiki/Dedicated_servers#No_Such_File_or_Directory)). +The local file of 'steamclient.so' was attempted to be loaded, but could not because it is not present, causing the warning message. However, the backup `/home/container/.steam/sdk64/steamclient.so` is loaded successfully (this is the correct behavior according to the [Wiki](https://satisfactory.fandom.com/wiki/Dedicated_servers#SteamAPI_Init.28.29:_Sys_LoadModule_filed_to_load:_.2Fpath.2Fto.2F.steam.2Fsdk64.2Fsteamclient.so)). ```log Warning: failed to init SDL thread priority manager: SDL not found diff --git a/game_eggs/steamcmd_servers/satisfactory/egg-satisfactory.json b/game_eggs/steamcmd_servers/satisfactory/egg-satisfactory.json index c03d1ee1..eba455ed 100644 --- a/game_eggs/steamcmd_servers/satisfactory/egg-satisfactory.json +++ b/game_eggs/steamcmd_servers/satisfactory/egg-satisfactory.json @@ -1,5 +1,5 @@ { - "_comment": "Pterodactyl Satisfactory Egg ~ Red-Thirten, Kubi, matthewp, Software-Noob, and Zarklord ~ 2021-10-28", + "_comment": "Pterodactyl Satisfactory Egg ~ Red-Thirten, Kubi, matthewp, Software-Noob, and Zarklord ~ 2021-11-19", "meta": { "version": "PTDL_v1", "update_url": null @@ -9,19 +9,19 @@ "description": "Satisfactory is a first-person open-world factory building game with a dash of exploration and combat. Play alone or with friends, explore an alien planet, create multi-story factories, and enter conveyor belt heaven!", "features": null, "images": [ - "ghcr.io\/pterodactyl\/games:source" + "ghcr.io\/parkervcp\/games:source" ], "file_denylist": [], "startup": ".\/Engine\/Binaries\/Linux\/UE4Server-Linux-Shipping FactoryGame ?listen -Port={{SERVER_PORT}} -ServerQueryPort={{QUERY_PORT}} -BeaconPort={{BEACON_PORT}} -multihome=0.0.0.0", "config": { - "files": "{\r\n \"FactoryGame\/Saved\/Config\/LinuxServer\/Game.ini\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \"MaxPlayers\": \"MaxPlayers={{server.build.env.MAX_PLAYERS}}\"\r\n }\r\n }\r\n}", + "files": "{\r\n \"FactoryGame\/Saved\/Config\/LinuxServer\/Game.ini\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \"MaxPlayers\": \"MaxPlayers={{server.build.env.MAX_PLAYERS}}\"\r\n }\r\n },\r\n \"FactoryGame\/Saved\/Config\/LinuxServer\/Engine.ini\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \"mNumRotatingAutosaves\": \"mNumRotatingAutosaves={{server.build.env.NUM_AUTOSAVES}}\",\r\n \"bAgreeToCrashUpload\": \"bAgreeToCrashUpload={{server.build.env.UPLOAD_CRASH_REPORT}}\",\r\n \"InitialConnectTimeout\": \"InitialConnectTimeout={{server.build.env.INIT_CONNECT_TIMEOUT}}\",\r\n \"ConnectionTimeout\": \"ConnectionTimeout={{server.build.env.CONNECT_TIMEOUT}}\"\r\n }\r\n },\r\n \"FactoryGame\/Saved\/Config\/LinuxServer\/GameUserSettings.ini\": {\r\n \"parser\": \"file\",\r\n \"find\": {\r\n \"mFloatValues\": \"mFloatValues=((\\\"FG.AutosaveInterval\\\", {{server.build.env.AUTOSAVE_INTERVAL}}))\",\r\n \"mIntValues\": \"mIntValues=((\\\"FG.NetworkQuality\\\", {{server.build.env.NETWORK_QUALITY}}))\"\r\n }\r\n }\r\n}", "startup": "{\r\n \"done\": \"Engine Initialization\"\r\n}", "logs": "{}", - "stop": "^CC" + "stop": "^C" }, "scripts": { "installation": { - "script": "#!\/bin\/bash\r\n\r\n# File: Pterodactyl Satisfactory Egg - egg-satisfactory.json\r\n# Authors: Red-Thirten, Kubi, matthewp, Software-Noob, and Zarklord\r\n# Date: 2021\/10\/28\r\n# License: MIT License\r\n\r\n## Download and install SteamCMD\r\ncd \/tmp\r\ncurl -sSL -o steamcmd.tar.gz http:\/\/media.steampowered.com\/installer\/steamcmd_linux.tar.gz\r\nmkdir -p \/mnt\/server\/steamcmd\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n# Install game server using SteamCMD\r\n.\/steamcmd.sh +login anonymous +force_install_dir \/mnt\/server +app_update ${SRCDS_APPID} validate +exit\r\n\r\n# Set up 32 and 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk{32,64}\r\ncp -v linux32\/steamclient.so \/mnt\/server\/.steam\/sdk32\/steamclient.so\r\ncp -v linux64\/steamclient.so \/mnt\/server\/.steam\/sdk64\/steamclient.so\r\n\r\n## Satisfactory setup\r\n# Check for successful installation and make the core binary executable.\r\ncd \/mnt\/server\/Engine\/Binaries\/Linux\r\nif [[ ! -f UE4Server-Linux-Shipping ]]; then\r\n echo -e \"\\n\\nSteamCMD failed to install the Satisfactory Dedicated Server!\"\r\n echo -e \"\\tTry reinstalling the server again.\\n\"\r\n exit 1\r\nelse\r\n chmod +x UE4Server-Linux-Shipping\r\nfi\r\n\r\n# Make Config directory and default Game.ini file (since it is not created automatically by the server)\r\nmkdir -p \/mnt\/server\/FactoryGame\/Saved\/Config\/LinuxServer\/ && cd \"$_\"\r\nif [ ! -f Game.ini ]; then\r\n echo -e \"\\nGame.ini config file missing. Creating default.\"\r\n cat > Game.ini << EOF\r\n[\/Script\/Engine.GameSession]\r\nMaxPlayers=${MAX_PLAYERS}\r\nEOF\r\nfi\r\n\r\necho -e \"\\n\\nSatisfactory Dedicated Server successfully installed!\\n\"", + "script": "#!\/bin\/bash\r\n\r\n# File: Pterodactyl Satisfactory Egg - egg-satisfactory.json\r\n# Authors: Red-Thirten, Kubi, matthewp, Software-Noob, and Zarklord\r\n# Date: 2021\/11\/19\r\n# License: MIT License\r\n\r\n## Download and install SteamCMD\r\ncd \/tmp\r\ncurl -sSL -o steamcmd.tar.gz http:\/\/media.steampowered.com\/installer\/steamcmd_linux.tar.gz\r\nmkdir -p \/mnt\/server\/steamcmd\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\nchown -R root:root \/mnt\r\nexport HOME=\/mnt\/server\r\n\r\n# Install game server using SteamCMD\r\n.\/steamcmd.sh +force_install_dir \/mnt\/server +login anonymous +app_update ${SRCDS_APPID} $( [[ -z ${SRCDS_BETAID} ]] || printf %s \"-beta ${SRCDS_BETAID}\" ) $( [[ -z ${SRCDS_BETAPASS} ]] || printf %s \"-betapassword ${SRCDS_BETAPASS}\" ) validate +exit\r\n\r\n# Set up 32 and 64 bit libraries\r\nmkdir -p \/mnt\/server\/.steam\/sdk{32,64}\r\ncp -v linux32\/steamclient.so \/mnt\/server\/.steam\/sdk32\/steamclient.so\r\ncp -v linux64\/steamclient.so \/mnt\/server\/.steam\/sdk64\/steamclient.so\r\n\r\n## Satisfactory setup\r\n# Check for successful installation and make the core binary executable.\r\ncd \/mnt\/server\/Engine\/Binaries\/Linux\r\nif [[ ! -f UE4Server-Linux-Shipping ]]; then\r\n echo -e \"\\n\\nSteamCMD failed to install the Satisfactory Dedicated Server!\"\r\n echo -e \"\\tTry reinstalling the server again.\\n\"\r\n exit 1\r\nelse\r\n chmod +x UE4Server-Linux-Shipping\r\nfi\r\n\r\n# Make Config directory and default .ini files (since they are not initially present before first server start)\r\nmkdir -p \/mnt\/server\/FactoryGame\/Saved\/Config\/LinuxServer\/ && cd \"$_\"\r\n# Currently, this will delete & re-create certain .ini files during a re-install if they are already present.\r\n# While undesirable, this is required due to a current Pterodactyl ini config parser limitation.\r\n# When the patch to this limitation hits the production branch, this will be updated.\r\nrm -f Engine.ini Game.ini GameUserSettings.ini\r\n\r\necho -e '\\nCreating default \"Engine.ini\" configuration file...'\r\ncat > Engine.ini << EOF\r\n[\/Script\/FactoryGame.FGSaveSession]\r\nmNumRotatingAutosaves=${NUM_AUTOSAVES}\r\n\r\n[CrashReportClient]\r\nbAgreeToCrashUpload=${UPLOAD_CRASH_REPORT}\r\n\r\n[\/Script\/OnlineSubsystemUtils.IpNetDriver]\r\nInitialConnectTimeout=${INIT_CONNECT_TIMEOUT}\r\nConnectionTimeout=${CONNECT_TIMEOUT}\r\nEOF\r\n\r\necho -e 'Creating default \"Game.ini\" configuration file...'\r\ncat > Game.ini << EOF\r\n[\/Script\/Engine.GameSession]\r\nMaxPlayers=${MAX_PLAYERS}\r\nEOF\r\n\r\necho -e 'Creating default \"GameUserSettings.ini\" configuration file...'\r\ncat > GameUserSettings.ini << EOF\r\n[\/Script\/FactoryGame.FGGameUserSettings]\r\nmIntValues=((\"FG.NetworkQuality\", ${NETWORK_QUALITY}))\r\nmFloatValues=((\"FG.AutosaveInterval\", ${AUTOSAVE_INTERVAL}))\r\nEOF\r\n\r\necho -e \"\\nSatisfactory Dedicated Server successfully installed!\\n\"", "container": "ghcr.io\/pterodactyl\/installers:debian", "entrypoint": "bash" } @@ -63,15 +63,87 @@ "user_editable": true, "rules": "string|nullable" }, + { + "name": "Autosave Interval", + "description": "How often, in seconds, the server should generate a new autosave (ex. 300 = 5 min). Keep in mind that shorter times mean that while the server will save the game more often, it also means a potential drop in server performance. NOTE: This overrides any \"FG.AutosaveInterval\" commands made to the console!", + "env_variable": "AUTOSAVE_INTERVAL", + "default_value": "300", + "user_viewable": true, + "user_editable": true, + "rules": "required|numeric|min:1" + }, + { + "name": "Number of Rotating Autosaves", + "description": "Number of session auto-saves for the server to keep before the oldest save is deleted and the others are moved down the list.", + "env_variable": "NUM_AUTOSAVES", + "default_value": "3", + "user_viewable": true, + "user_editable": true, + "rules": "required|integer|min:0" + }, + { + "name": "Upload Crash Reports", + "description": "Accepted values are \"true\" or \"false\". Determines if the server should upload any crash reports to the developer to help pinpoint issues for future patches.", + "env_variable": "UPLOAD_CRASH_REPORT", + "default_value": "true", + "user_viewable": true, + "user_editable": true, + "rules": "required|string|in:true,false" + }, { "name": "[Experimental] Max Players", - "description": "The server and client are currently not optimized to support more than 4 players. However, you can override this value here at your own risk of poor performance.", + "description": "[Requires server re-install to change default value!] The server and client are currently not optimized to support more than 4 players. However, you can override this value here at your own risk of poor performance.", "env_variable": "MAX_PLAYERS", "default_value": "4", "user_viewable": true, "user_editable": true, "rules": "required|integer|min:1" }, + { + "name": "[Advanced] Client Initial Connection Timeout", + "description": "Time in seconds to wait for a new client connection to be established before destroying the connection.", + "env_variable": "INIT_CONNECT_TIMEOUT", + "default_value": "30", + "user_viewable": true, + "user_editable": true, + "rules": "required|numeric|min:1" + }, + { + "name": "[Advanced] Client Established Connection Timeout", + "description": "Time in seconds to wait before considering an established client connection timed out. Typically shorter than the time to wait on an initial connection because this connection should already have been setup and any interruption should be trapped quicker.", + "env_variable": "CONNECT_TIMEOUT", + "default_value": "20", + "user_viewable": true, + "user_editable": true, + "rules": "required|numeric|min:1" + }, + { + "name": "[Advanced] Network Quality", + "description": "[0 = Low, 1 = Medium, 2 = High, 3 = Ultra] Sets the network configuration for the game server (shouldn't need to be changed). NOTE: This overrides any \"FG.NetworkQuality\" commands made to the console!", + "env_variable": "NETWORK_QUALITY", + "default_value": "3", + "user_viewable": true, + "user_editable": true, + "rules": "required|integer|between:0,3" + }, + { + "name": "[Advanced] Beta ID", + "description": "Used to download or switch to any current\/future non-primary branches of the game server. Leave empty to use the main branch of the server. \"Automatic Updates\" and \"Validate Server Files\" must be set to \"1\" to switch branches if the server is already installed. NOTE: Any non-primary branches may not be fully compatible!", + "env_variable": "SRCDS_BETAID", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "string|nullable" + }, + { + "name": "[Advanced] Beta Password", + "description": "To be used in tandem with \"Beta ID\" if any branches require a password. Leave empty when not using \"Beta ID\".", + "env_variable": "SRCDS_BETAPASS", + "default_value": "", + "user_viewable": true, + "user_editable": true, + "rules": "string|nullable" + }, { "name": "[Advanced] Satisfactory Dedicated Server App ID", "description": "Steam App ID used for installation and updates. Rarely needs to be changed.",