From 54d22218c85183848344c6845983f2e02a29a514 Mon Sep 17 00:00:00 2001 From: gitnl Date: Sun, 10 May 2026 12:51:00 +0000 Subject: [PATCH] AFSM --- AFSM.ps1 | 485 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 485 insertions(+) create mode 100644 AFSM.ps1 diff --git a/AFSM.ps1 b/AFSM.ps1 new file mode 100644 index 0000000..9bb7e59 --- /dev/null +++ b/AFSM.ps1 @@ -0,0 +1,485 @@ +# Abiotic Factor Server Manager +Add-Type -AssemblyName System.Windows.Forms +Add-Type -AssemblyName System.Drawing + +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$configPath = "$scriptDir\server_config.json" +$script:serverProcess = $null + +# Load/Save Config +function Load-Config { + if (Test-Path $configPath) { + try { + $cfg = Get-Content $configPath -Raw | ConvertFrom-Json + $txtSteamCMDDir.Text = $cfg.SteamCMDDir + $txtInstallDir.Text = $cfg.InstallDir + $txtMaxPlayers.Text = $cfg.MaxPlayers + $txtPort.Text = $cfg.Port + $txtQueryPort.Text = $cfg.QueryPort + $txtServerPassword.Text = $cfg.ServerPassword + $txtAdminPassword.Text = $cfg.AdminPassword + $txtServerName.Text = $cfg.ServerName + $chkUseLogin.Checked = $cfg.UseLogin + $txtSteamUser.Text = $cfg.SteamUser + } catch { + Set-Defaults + } + } else { + Set-Defaults + } + Update-SteamCMDStatus +} + +function Set-Defaults { + $txtSteamCMDDir.Text = "$env:ProgramFiles\SteamCMD" + $txtInstallDir.Text = "" + $txtMaxPlayers.Text = "6" + $txtPort.Text = "7777" + $txtQueryPort.Text = "27015" + $txtServerPassword.Text = "" + $txtAdminPassword.Text = "" + $txtServerName.Text = "My Abiotic Factor Server" + $chkUseLogin.Checked = $false + $txtSteamUser.Text = "" + $txtSteamPass.Text = "" +} + +function Save-Config { + $cfg = @{ + SteamCMDDir = $txtSteamCMDDir.Text + InstallDir = $txtInstallDir.Text + MaxPlayers = $txtMaxPlayers.Text + Port = $txtPort.Text + QueryPort = $txtQueryPort.Text + ServerPassword = $txtServerPassword.Text + AdminPassword = $txtAdminPassword.Text + ServerName = $txtServerName.Text + UseLogin = $chkUseLogin.Checked + SteamUser = $txtSteamUser.Text + } + $cfg | ConvertTo-Json | Out-File $configPath -Encoding UTF8 -Force +} + +function Update-SteamCMDStatus { + $exe = "$($txtSteamCMDDir.Text)\steamcmd.exe" + if (Test-Path $exe) { + $lblStatus.Text = "SteamCMD: Ready" + $lblStatus.ForeColor = "Green" + $btnInstallSteamCMD.Enabled = $false + $btnInstallSteamCMD.Text = "SteamCMD Installed" + } else { + $lblStatus.Text = "SteamCMD: Not Found" + $lblStatus.ForeColor = "Red" + $btnInstallSteamCMD.Enabled = $true + $btnInstallSteamCMD.Text = "Install SteamCMD" + } +} + +function Install-SteamCMD { + $path = $txtSteamCMDDir.Text + if (-not $path) { return } + + if (Test-Path "$path\steamcmd.exe") { + Update-SteamCMDStatus + return + } + + New-Item -ItemType Directory -Path $path -Force | Out-Null + + $zip = "$env:TEMP\steamcmd.zip" + $wc = New-Object System.Net.WebClient + $wc.DownloadFile("https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip", $zip) + + $shell = New-Object -ComObject Shell.Application + $shell.NameSpace($zip).Items() | ForEach-Object { $shell.NameSpace($path).CopyHere($_, 16) } + Start-Sleep -Seconds 2 + Remove-Item $zip -Force + + Update-SteamCMDStatus + Save-Config +} + +function Update-Server { + if (-not (Test-Path "$($txtSteamCMDDir.Text)\steamcmd.exe")) { + [System.Windows.Forms.MessageBox]::Show("Please install SteamCMD first!", "Error", "OK", "Error") + return + } + + $installDir = $txtInstallDir.Text + if (-not $installDir) { + $installDir = "$($txtSteamCMDDir.Text)\AbioticFactorServer" + $txtInstallDir.Text = $installDir + Save-Config + } + + New-Item -ItemType Directory -Path $installDir -Force | Out-Null + + $appId = "2857200" + + $scriptFile = [System.IO.Path]::GetTempFileName() + ".txt" + + $scriptContent = "force_install_dir `"$installDir`"`n" + + if ($chkUseLogin.Checked -and $txtSteamUser.Text) { + $scriptContent += "login `"$($txtSteamUser.Text)`" `"$($txtSteamPass.Text)`"`n" + } else { + $scriptContent += "login anonymous`n" + } + + $scriptContent += "app_update $appId validate`nquit`n" + $scriptContent | Out-File $scriptFile -Encoding ASCII + + $batchFile = [System.IO.Path]::GetTempFileName() + ".bat" + $cmdContent = "@echo off`ncd /d `"$($txtSteamCMDDir.Text)`"`n`"$($txtSteamCMDDir.Text)\steamcmd.exe`" +runscript `"$scriptFile`"`necho Update complete`ntimeout /t 3 /nobreak > nul" + $cmdContent | Out-File $batchFile -Encoding ASCII + + Start-Process "cmd.exe" -ArgumentList "/c `"$batchFile`"" -Wait -NoNewWindow + + Start-Sleep -Seconds 1 + Remove-Item $scriptFile -Force -ErrorAction SilentlyContinue + Remove-Item $batchFile -Force -ErrorAction SilentlyContinue +} + +function Start-Server { + $installDir = $txtInstallDir.Text + if (-not $installDir) { + [System.Windows.Forms.MessageBox]::Show("Please set Game Install Directory first!", "Error", "OK", "Error") + return + } + + $serverExe = Join-Path $installDir "AbioticFactor\Binaries\Win64\AbioticFactorServer-Win64-Shipping.exe" + if (-not (Test-Path $serverExe)) { + [System.Windows.Forms.MessageBox]::Show("Server not found! Please run Update Server first.", "Error", "OK", "Error") + return + } + + $binariesDir = Join-Path $installDir "AbioticFactor\Binaries\Win64" + $appIdFile = Join-Path $binariesDir "steam_appid.txt" + "2896390" | Out-File -FilePath $appIdFile -Encoding ASCII -Force + + $args = "-log -newconsole -useperfthreads -NoAsyncLoadingThread -MaxServerPlayers=$($txtMaxPlayers.Text) -PORT=$($txtPort.Text) -QueryPort=$($txtQueryPort.Text)" + + if ($txtServerPassword.Text) { $args += " -ServerPassword=`"$($txtServerPassword.Text)`"" } + if ($txtAdminPassword.Text) { $args += " -AdminPassword=`"$($txtAdminPassword.Text)`"" } + if ($txtServerName.Text) { $args += " -SteamServerName=`"$($txtServerName.Text)`"" } + + try { + $script:serverProcess = Start-Process -FilePath $serverExe -ArgumentList $args -WorkingDirectory $binariesDir -PassThru + $btnStop.Enabled = $true + $btnStart.Enabled = $false + $btnUpdate.Enabled = $false + $lblStatusValue.Text = "Server: RUNNING" + $lblStatusValue.ForeColor = "Green" + } catch { + [System.Windows.Forms.MessageBox]::Show("Failed to start server: $_", "Error", "OK", "Error") + } +} + +function Stop-Server { + if ($script:serverProcess -and (-not $script:serverProcess.HasExited)) { + $script:serverProcess.Kill() + $script:serverProcess.WaitForExit(3000) + } + + Get-Process -Name "AbioticFactorServer-Win64-Shipping" -ErrorAction SilentlyContinue | ForEach-Object { + try { $_.Kill() } catch {} + } + + $script:serverProcess = $null + $btnStop.Enabled = $false + $btnStart.Enabled = $true + $btnUpdate.Enabled = $true + $lblStatusValue.Text = "Server: STOPPED" + $lblStatusValue.ForeColor = "Red" +} + +function Browse-Directory { + param($txtBox) + $dlg = New-Object System.Windows.Forms.FolderBrowserDialog + if ($dlg.ShowDialog() -eq "OK") { + $txtBox.Text = $dlg.SelectedPath + if ($txtBox.Name -eq "txtSteamCMDDir") { Update-SteamCMDStatus } + Save-Config + } +} + +# Create Form +$form = New-Object System.Windows.Forms.Form +$form.Text = "Abiotic Factor Server Manager" +$form.Size = New-Object System.Drawing.Size(850, 600) +$form.StartPosition = "CenterScreen" + +# Status Panel +$statusPanel = New-Object System.Windows.Forms.Panel +$statusPanel.BackColor = "Control" +$statusPanel.Location = New-Object System.Drawing.Point(0, 0) +$statusPanel.Size = New-Object System.Drawing.Size(850, 80) +$statusPanel.BorderStyle = "FixedSingle" + +$lblStatusValue = New-Object System.Windows.Forms.Label +$lblStatusValue.Text = "Server: STOPPED" +$lblStatusValue.ForeColor = "Red" +$lblStatusValue.Font = New-Object System.Drawing.Font("Microsoft Sans Serif", 10, [System.Drawing.FontStyle]::Bold) +$lblStatusValue.Location = New-Object System.Drawing.Point(10, 10) +$lblStatusValue.Size = New-Object System.Drawing.Size(200, 25) +$statusPanel.Controls.Add($lblStatusValue) + +$lblPortValue = New-Object System.Windows.Forms.Label +$lblPortValue.Text = "Port: 7777" +$lblPortValue.Location = New-Object System.Drawing.Point(10, 35) +$lblPortValue.Size = New-Object System.Drawing.Size(200, 20) +$statusPanel.Controls.Add($lblPortValue) + +$lblServerNameValue = New-Object System.Windows.Forms.Label +$lblServerNameValue.Font = New-Object System.Drawing.Font("Microsoft Sans Serif", 9, [System.Drawing.FontStyle]::Bold) +$lblServerNameValue.Location = New-Object System.Drawing.Point(250, 10) +$lblServerNameValue.Size = New-Object System.Drawing.Size(400, 25) +$statusPanel.Controls.Add($lblServerNameValue) + +$lblPasswordValue = New-Object System.Windows.Forms.Label +$lblPasswordValue.Location = New-Object System.Drawing.Point(250, 35) +$lblPasswordValue.Size = New-Object System.Drawing.Size(200, 20) +$statusPanel.Controls.Add($lblPasswordValue) + +$form.Controls.Add($statusPanel) + +# Button Panel +$buttonPanel = New-Object System.Windows.Forms.Panel +$buttonPanel.Location = New-Object System.Drawing.Point(0, 85) +$buttonPanel.Size = New-Object System.Drawing.Size(850, 45) +$form.Controls.Add($buttonPanel) + +$btnUpdate = New-Object System.Windows.Forms.Button +$btnUpdate.Text = "1. Update" +$btnUpdate.Size = New-Object System.Drawing.Size(100, 35) +$btnUpdate.Location = New-Object System.Drawing.Point(10, 5) +$btnUpdate.Add_Click({ Update-Server }) +$buttonPanel.Controls.Add($btnUpdate) + +$btnStart = New-Object System.Windows.Forms.Button +$btnStart.Text = "2. Start" +$btnStart.Size = New-Object System.Drawing.Size(100, 35) +$btnStart.Location = New-Object System.Drawing.Point(120, 5) +$btnStart.BackColor = "LightGreen" +$btnStart.Add_Click({ Start-Server }) +$buttonPanel.Controls.Add($btnStart) + +$btnStop = New-Object System.Windows.Forms.Button +$btnStop.Text = "3. Stop" +$btnStop.Size = New-Object System.Drawing.Size(100, 35) +$btnStop.Location = New-Object System.Drawing.Point(230, 5) +$btnStop.BackColor = "LightCoral" +$btnStop.Enabled = $false +$btnStop.Add_Click({ Stop-Server }) +$buttonPanel.Controls.Add($btnStop) + +$btnSave = New-Object System.Windows.Forms.Button +$btnSave.Text = "Save Config" +$btnSave.Size = New-Object System.Drawing.Size(80, 35) +$btnSave.Location = New-Object System.Drawing.Point(340, 5) +$btnSave.Add_Click({ Save-Config }) +$buttonPanel.Controls.Add($btnSave) + +# Settings Panel +$settingsPanel = New-Object System.Windows.Forms.Panel +$settingsPanel.Location = New-Object System.Drawing.Point(0, 135) +$settingsPanel.Size = New-Object System.Drawing.Size(850, 450) +$settingsPanel.AutoScroll = $true +$form.Controls.Add($settingsPanel) + +# SteamCMD +$lbl1 = New-Object System.Windows.Forms.Label +$lbl1.Text = "SteamCMD Dir:" +$lbl1.Location = New-Object System.Drawing.Point(10, 10) +$lbl1.Size = New-Object System.Drawing.Size(100, 25) +$settingsPanel.Controls.Add($lbl1) + +$txtSteamCMDDir = New-Object System.Windows.Forms.TextBox +$txtSteamCMDDir.Location = New-Object System.Drawing.Point(120, 8) +$txtSteamCMDDir.Size = New-Object System.Drawing.Size(500, 25) +$settingsPanel.Controls.Add($txtSteamCMDDir) + +$btnBrowse1 = New-Object System.Windows.Forms.Button +$btnBrowse1.Text = "Browse" +$btnBrowse1.Location = New-Object System.Drawing.Point(630, 7) +$btnBrowse1.Size = New-Object System.Drawing.Size(70, 27) +$btnBrowse1.Add_Click({ Browse-Directory $txtSteamCMDDir }) +$settingsPanel.Controls.Add($btnBrowse1) + +$btnInstallSteamCMD = New-Object System.Windows.Forms.Button +$btnInstallSteamCMD.Location = New-Object System.Drawing.Point(710, 7) +$btnInstallSteamCMD.Size = New-Object System.Drawing.Size(100, 27) +$btnInstallSteamCMD.Add_Click({ Install-SteamCMD }) +$settingsPanel.Controls.Add($btnInstallSteamCMD) + +$lblStatus = New-Object System.Windows.Forms.Label +$lblStatus.Location = New-Object System.Drawing.Point(120, 40) +$lblStatus.Size = New-Object System.Drawing.Size(300, 25) +$settingsPanel.Controls.Add($lblStatus) + +# Install Dir +$lbl2 = New-Object System.Windows.Forms.Label +$lbl2.Text = "Game Install Dir:" +$lbl2.Location = New-Object System.Drawing.Point(10, 75) +$lbl2.Size = New-Object System.Drawing.Size(100, 25) +$settingsPanel.Controls.Add($lbl2) + +$txtInstallDir = New-Object System.Windows.Forms.TextBox +$txtInstallDir.Location = New-Object System.Drawing.Point(120, 73) +$txtInstallDir.Size = New-Object System.Drawing.Size(600, 25) +$settingsPanel.Controls.Add($txtInstallDir) + +$btnBrowse2 = New-Object System.Windows.Forms.Button +$btnBrowse2.Text = "Browse" +$btnBrowse2.Location = New-Object System.Drawing.Point(730, 72) +$btnBrowse2.Size = New-Object System.Drawing.Size(70, 27) +$btnBrowse2.Add_Click({ Browse-Directory $txtInstallDir }) +$settingsPanel.Controls.Add($btnBrowse2) + +# Steam Login +$loginGroup = New-Object System.Windows.Forms.GroupBox +$loginGroup.Text = "Steam Login (optional)" +$loginGroup.Location = New-Object System.Drawing.Point(10, 115) +$loginGroup.Size = New-Object System.Drawing.Size(800, 80) +$settingsPanel.Controls.Add($loginGroup) + +$chkUseLogin = New-Object System.Windows.Forms.CheckBox +$chkUseLogin.Text = "Use Login" +$chkUseLogin.Location = New-Object System.Drawing.Point(10, 20) +$chkUseLogin.Size = New-Object System.Drawing.Size(80, 25) +$chkUseLogin.Add_CheckStateChanged({ + $txtSteamUser.Enabled = $chkUseLogin.Checked + $txtSteamPass.Enabled = $chkUseLogin.Checked +}) +$loginGroup.Controls.Add($chkUseLogin) + +$lblUser = New-Object System.Windows.Forms.Label +$lblUser.Text = "Username:" +$lblUser.Location = New-Object System.Drawing.Point(100, 23) +$lblUser.Size = New-Object System.Drawing.Size(70, 20) +$loginGroup.Controls.Add($lblUser) + +$txtSteamUser = New-Object System.Windows.Forms.TextBox +$txtSteamUser.Location = New-Object System.Drawing.Point(175, 20) +$txtSteamUser.Size = New-Object System.Drawing.Size(150, 25) +$txtSteamUser.Enabled = $false +$loginGroup.Controls.Add($txtSteamUser) + +$lblPass = New-Object System.Windows.Forms.Label +$lblPass.Text = "Password:" +$lblPass.Location = New-Object System.Drawing.Point(340, 23) +$lblPass.Size = New-Object System.Drawing.Size(70, 20) +$loginGroup.Controls.Add($lblPass) + +$txtSteamPass = New-Object System.Windows.Forms.TextBox +$txtSteamPass.Location = New-Object System.Drawing.Point(415, 20) +$txtSteamPass.Size = New-Object System.Drawing.Size(150, 25) +$txtSteamPass.PasswordChar = '*' +$txtSteamPass.Enabled = $false +$loginGroup.Controls.Add($txtSteamPass) + +# Server Config +$serverGroup = New-Object System.Windows.Forms.GroupBox +$serverGroup.Text = "Server Settings" +$serverGroup.Location = New-Object System.Drawing.Point(10, 210) +$serverGroup.Size = New-Object System.Drawing.Size(800, 160) +$settingsPanel.Controls.Add($serverGroup) + +$lblMax = New-Object System.Windows.Forms.Label +$lblMax.Text = "Max Players:" +$lblMax.Location = New-Object System.Drawing.Point(15, 25) +$lblMax.Size = New-Object System.Drawing.Size(85, 25) +$serverGroup.Controls.Add($lblMax) + +$txtMaxPlayers = New-Object System.Windows.Forms.TextBox +$txtMaxPlayers.Location = New-Object System.Drawing.Point(105, 23) +$txtMaxPlayers.Size = New-Object System.Drawing.Size(80, 25) +$serverGroup.Controls.Add($txtMaxPlayers) + +$lblPort = New-Object System.Windows.Forms.Label +$lblPort.Text = "Game Port:" +$lblPort.Location = New-Object System.Drawing.Point(220, 25) +$lblPort.Size = New-Object System.Drawing.Size(70, 25) +$serverGroup.Controls.Add($lblPort) + +$txtPort = New-Object System.Windows.Forms.TextBox +$txtPort.Location = New-Object System.Drawing.Point(295, 23) +$txtPort.Size = New-Object System.Drawing.Size(80, 25) +$serverGroup.Controls.Add($txtPort) + +$lblQuery = New-Object System.Windows.Forms.Label +$lblQuery.Text = "Query Port:" +$lblQuery.Location = New-Object System.Drawing.Point(410, 25) +$lblQuery.Size = New-Object System.Drawing.Size(80, 25) +$serverGroup.Controls.Add($lblQuery) + +$txtQueryPort = New-Object System.Windows.Forms.TextBox +$txtQueryPort.Location = New-Object System.Drawing.Point(495, 23) +$txtQueryPort.Size = New-Object System.Drawing.Size(80, 25) +$serverGroup.Controls.Add($txtQueryPort) + +$lblPassServer = New-Object System.Windows.Forms.Label +$lblPassServer.Text = "Server PW:" +$lblPassServer.Location = New-Object System.Drawing.Point(15, 60) +$lblPassServer.Size = New-Object System.Drawing.Size(85, 25) +$serverGroup.Controls.Add($lblPassServer) + +$txtServerPassword = New-Object System.Windows.Forms.TextBox +$txtServerPassword.Location = New-Object System.Drawing.Point(105, 58) +$txtServerPassword.Size = New-Object System.Drawing.Size(150, 25) +$serverGroup.Controls.Add($txtServerPassword) + +$lblAdmin = New-Object System.Windows.Forms.Label +$lblAdmin.Text = "Admin PW:" +$lblAdmin.Location = New-Object System.Drawing.Point(280, 60) +$lblAdmin.Size = New-Object System.Drawing.Size(85, 25) +$serverGroup.Controls.Add($lblAdmin) + +$txtAdminPassword = New-Object System.Windows.Forms.TextBox +$txtAdminPassword.Location = New-Object System.Drawing.Point(370, 58) +$txtAdminPassword.Size = New-Object System.Drawing.Size(150, 25) +$serverGroup.Controls.Add($txtAdminPassword) + +$lblName = New-Object System.Windows.Forms.Label +$lblName.Text = "Server Name:" +$lblName.Location = New-Object System.Drawing.Point(15, 95) +$lblName.Size = New-Object System.Drawing.Size(85, 25) +$serverGroup.Controls.Add($lblName) + +$txtServerName = New-Object System.Windows.Forms.TextBox +$txtServerName.Location = New-Object System.Drawing.Point(105, 93) +$txtServerName.Size = New-Object System.Drawing.Size(350, 25) +$serverGroup.Controls.Add($txtServerName) + +# Event handlers +$txtPort.Add_TextChanged({ + $lblPortValue.Text = "Port: $($txtPort.Text)" + Save-Config +}) + +$txtServerName.Add_TextChanged({ + $lblServerNameValue.Text = $txtServerName.Text + Save-Config +}) + +$txtServerPassword.Add_TextChanged({ + if ($txtServerPassword.Text) { + $lblPasswordValue.Text = "PW: Set" + } else { + $lblPasswordValue.Text = "PW: None" + } + Save-Config +}) + +$txtMaxPlayers.Add_TextChanged({ Save-Config }) +$txtQueryPort.Add_TextChanged({ Save-Config }) +$txtAdminPassword.Add_TextChanged({ Save-Config }) + +# Initialize display values +$lblPortValue.Text = "Port: $($txtPort.Text)" +$lblServerNameValue.Text = $txtServerName.Text +$lblPasswordValue.Text = "PW: None" + +# Load config and show +Load-Config +$form.ShowDialog() \ No newline at end of file