function Initialize-SystemConfiguration { Write-Log "`nSetting High Performance power plan..." Set-HighPerformancePowerPlan Write-Log "`nRenaming computer..." Rename-PCToMac Write-Log "`nDisabling UAC and notifications..." Disable-UACAndNotifications Write-Log "`nSetting main connection as PRIVATE..." Get-NetConnectionProfile | Where-Object { $_.InterfaceAlias -like "*Ethernet*" } | Set-NetConnectionProfile -NetworkCategory Private Write-Log "`nAdjusting System Time..." try { Set-Service w32time -StartupType Automatic -ErrorAction SilentlyContinue Start-Service w32time -ErrorAction SilentlyContinue w32tm /resync /force | Out-Null Write-Log "System time synchronized." } catch { Write-Log "Could not synchronize system time: $_" } } Add-Type -AssemblyName System.Windows.Forms [System.Windows.Forms.Application]::EnableVisualStyles() # ===== Configurações de versão Maio2026 ===== $VersionDual = "2026.05.21.2" $VersionDualR = "2026.05.21.2" $VersionBotoneira = "2026.01.13.1" $ReleaseBaseUrl = "https://ndlabversions.pilotgamingsys.com/devel" # Verify Admin Rights if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole( [Security.Principal.WindowsBuiltInRole]::Administrator)) { [System.Windows.Forms.MessageBox]::Show("Restarting as Administrator...") Start-Process powershell "-ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs exit } function Write-Log { param ($text) $outputBox.AppendText("$text`r`n") $outputBox.ScrollToCaret() } function Stop-Unity { Write-Log "Stopping unity.exe and cabinet.exe if running..." try { Stop-Process -Name "unity" -Force -ErrorAction Stop Write-Log "unity.exe process stopped." } catch { Write-Log "unity.exe was not running or could not be stopped." } try { Stop-Process -Name "cabinet" -Force -ErrorAction Stop Write-Log "cabinet.exe process stopped." } catch { Write-Log "cabinet.exe was not running or could not be stopped." } } function Update-StartBat { param ([string]$Mode) $batPath = "C:\pilotgames\start.bat" if ($Mode -eq "Portrait") { $content = @" cd /D C:\pilotgames\NDGDRelease powershell -command "Start-Process cabinet.exe -Verb runas -ArgumentList '-screen-height', '1920', '-screen-width','1080', '-screen-fullscreen', '0', '-popupwindow'" "@ } else { $content = @" cd /D C:\pilotgames\BRGDRelease powershell -command "Start-Process cabinet.exe -Verb runas -ArgumentList '-screen-height', '1080', '-screen-width','1920', '-screen-fullscreen', '0', '-popupwindow'" "@ } Write-Log "Updating start.bat for $Mode..." Set-Content -Path $batPath -Value $content -Force -Encoding ASCII Write-Log "start.bat updated." } function Get-ModeVersion { param ([string]$Mode) switch ($Mode) { "Dual" { return $VersionDual } "DualR" { return $VersionDualR } "Botoneira" { return $VersionBotoneira } default { throw "Unknown mode: $Mode" } } } function Get-ModeOrientation { param ([string]$Mode) switch ($Mode) { "Dual" { return "Dual" } "DualR" { return "Dual" } "Botoneira" { return "Portrait" } default { throw "Unknown mode: $Mode" } } } function Get-ModeDisplayName { param ([string]$Mode) switch ($Mode) { "Portrait" { return "Portrait CabTab" } "Dual" { return "Dual" } "DualR" { return "Dual Rua" } "Botoneira" { return "Botoneira" } default { return $Mode } } } function Download-ReleaseZip { param ( [string]$Version ) $downloadsPath = "C:\pilotgames\downloads" if (-not (Test-Path $downloadsPath)) { New-Item -ItemType Directory -Path $downloadsPath -Force | Out-Null } # Verifica primeiro se a release já existe localmente $localFiles = @( (Join-Path $downloadsPath "NDGDRelease-$Version.zip"), (Join-Path $downloadsPath "BRGDRelease-$Version.zip") ) foreach ($file in $localFiles) { if (Test-Path $file) { Write-Log "Release encontrada localmente:" Write-Log $file Write-Log "Download ignorado." return $file } } # Não encontrou localmente, determina qual arquivo baixar if ($ReleaseBaseUrl -match "br") { $zipFileName = "BRGDRelease-$Version.zip" } else { $zipFileName = "NDGDRelease-$Version.zip" } $zipUrl = "$ReleaseBaseUrl/$zipFileName" $zipDest = Join-Path $downloadsPath $zipFileName Write-Log "Downloading release package..." Write-Log "URL: $zipUrl" try { Invoke-WebRequest -Uri $zipUrl -OutFile $zipDest -UseBasicParsing Write-Log "Download completed: $zipDest" return $zipDest } catch { throw "Failed to download file from $zipUrl. $_" } } function Install-Pilot { param ([string]$Mode) $outputBox.Clear() $displayMode = Get-ModeDisplayName -Mode $Mode Write-Log "Starting $displayMode installation..." $version = Get-ModeVersion -Mode $Mode $orient = Get-ModeOrientation -Mode $Mode Write-Log "Selected mode: $displayMode" Write-Log "Selected version: $version" Write-Log "Selected orientation: $orient" Write-Log "`nRenaming PC using MAC address..." $mac = (Get-NetAdapter -InterfaceAlias "*Ethernet*" | Select-Object -First 1 -ExpandProperty MacAddress) -replace '-', '' if ($mac) { Rename-Computer -NewName "$mac" -Force Write-Log "Computer renamed to: $mac" Write-Log "Please restart the computer to apply the change.`n" } else { Write-Log "Could not retrieve MAC address.`n" } Write-Log "`nSetting main connection as PRIVATE..." Get-NetConnectionProfile | Where-Object { $_.InterfaceAlias -like "*Ethernet*" } | Set-NetConnectionProfile -NetworkCategory Private Write-Log "`nAdjusting System Time..." try { Set-Service w32time -StartupType Automatic -ErrorAction SilentlyContinue Start-Service w32time -ErrorAction SilentlyContinue w32tm /resync /force | Out-Null Write-Log "System time synchronized." } catch { Write-Log "Could not synchronize system time: $_" } Write-Log "Stopping PilotGameAgent service..." Stop-Service -Name "PilotGameAgent" -Force -ErrorAction SilentlyContinue Stop-Unity Push-Location "C:\pilotgames" try { #Write-Log "Clearing downloads folder..." #Remove-Item -Path "C:\pilotgames\downloads\*" -Force -Recurse -ErrorAction SilentlyContinue Write-Log "Removing backup folders..." Remove-Item -Path "C:\pilotgames\BRGDRelease.bak" -Recurse -Force -ErrorAction SilentlyContinue Remove-Item -Path "C:\pilotgames\NDGDRelease.bak" -Recurse -Force -ErrorAction SilentlyContinue Write-Log "Waiting 10 seconds..." Start-Sleep -Seconds 10 if (Test-Path "C:\pilotgames\BRGDRelease") { Write-Log "Backing up BRGDRelease folder..." Move-Item "C:\pilotgames\BRGDRelease" "C:\pilotgames\BRGDRelease.bak" -Force -ErrorAction SilentlyContinue } if (Test-Path "C:\pilotgames\NDGDRelease") { Write-Log "Backing up NDGDRelease folder..." Move-Item "C:\pilotgames\NDGDRelease" "C:\pilotgames\NDGDRelease.bak" -Force -ErrorAction SilentlyContinue } $zipPath = Download-ReleaseZip -Version $version Write-Log "Unzipping file into C:\pilotgames..." Add-Type -AssemblyName System.IO.Compression.FileSystem [System.IO.Compression.ZipFile]::ExtractToDirectory($zipPath, "C:\pilotgames") Update-StartBat -Mode $orient Write-Log "Waiting 20 seconds..." Start-Sleep -Seconds 20 Write-Log "Starting PilotGameAgent service..." Set-Service -Name "PilotGameAgent" -StartupType Automatic -PassThru | Out-Null Start-Service -Name "PilotGameAgent" Write-Log "$displayMode installation completed successfully." } catch { Write-Log "Installation error: $_" } finally { Pop-Location } } function Set-HighPerformancePowerPlan { Write-Log "`nActivating High Performance power plan..." $highPerf = powercfg -l | Where-Object { $_ -match "High performance" -or $_ -match "Alto desempenho" } if ($highPerf) { $guid = ($highPerf -split '\s+')[3] powercfg -setactive $guid powercfg -change -monitor-timeout-ac 0 powercfg -change -monitor-timeout-dc 0 powercfg -change -standby-timeout-ac 0 powercfg -change -standby-timeout-dc 0 powercfg -change -disk-timeout-ac 0 powercfg -change -disk-timeout-dc 0 Write-Log "Power settings applied successfully.`n" } else { Write-Log "High Performance power plan not found.`n" } } function Rename-PCToMac { Write-Log "`nRenaming PC using MAC address..." $mac = (Get-NetAdapter -InterfaceAlias "*Ethernet*" | Select-Object -First 1 -ExpandProperty MacAddress) -replace '-', '' if ($mac) { Rename-Computer -NewName "$mac" -Force Write-Log "Computer renamed to: $mac" Write-Log "Please restart the computer to apply the change.`n" } else { Write-Log "Could not retrieve MAC address.`n" } } function Install-CommonTools { Write-Log "`nInstalling tools and dependencies via winget..." try { winget install -e --id Notepad++.Notepad++ --accept-source-agreements --accept-package-agreements winget install -e --id Microsoft.DotNet.DesktopRuntime.8 --accept-source-agreements --accept-package-agreements winget install -e --id Microsoft.VCRedist.2015+.x64 --accept-source-agreements --accept-package-agreements Write-Log "Installation completed.`n" } catch { Write-Log "Installation error: $_" } } function Disable-UACAndNotifications { Write-Log "`nDisabling UAC and notifications..." try { Set-ItemProperty -Path REGISTRY::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System -Name EnableLUA -Value 0 Set-ItemProperty -Path REGISTRY::HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System -Name ConsentPromptBehaviorAdmin -Value 0 New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender Security Center\Notifications" -Force | Out-Null Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows Defender Security Center\Notifications" -Name "DisableEnhancedNotifications" -Type DWord -Value 1 Set-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Search -Name SearchBoxTaskbarMode -Value 0 -Type DWord -Force Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False Write-Log "UAC and notifications disabled.`n" } catch { Write-Log "Error while configuring system: $_" } } function Upgrade-PortraitCabTab { $OriginalLocation = Get-Location $CabTabPath = "C:\PilotDownloads\CabTabInstall" $PilotPath = "C:\pilotgames" $DownloadsPath = Join-Path $PilotPath "downloads" function Invoke-Step { param( [string]$Description, [scriptblock]$Command ) Write-Log "" Write-Log "========================================" Write-Log $Description try { & $Command Write-Log "[ OK ] $Description" } catch { Write-Log "[ERRO] $Description" Write-Log $_ throw } } try { Initialize-SystemConfiguration foreach ($Path in @($CabTabPath,$PilotPath,$DownloadsPath)) { if (!(Test-Path $Path)) { throw "Pasta não encontrada: $Path" } } Set-Location $CabTabPath Write-Log "Diretório atual: $(Get-Location)" Invoke-Step "Copiando credentials.dat" { Copy-Item ".\credentials.dat" $PilotPath -Force } Invoke-Step "Copiando deployAgent.bat" { Copy-Item ".\deployAgent.bat" $PilotPath -Force } Invoke-Step "Copiando deployCabinet.bat" { Copy-Item ".\deployCabinet.bat" $PilotPath -Force } Invoke-Step "Copiando site_director.cfg" { Copy-Item ".\site_director.cfg" $PilotPath -Force } Invoke-Step "Copiando start.bat" { Copy-Item ".\start.bat" $PilotPath -Force } Invoke-Step "Copiando InstallGameAgentService.bat" { Copy-Item ".\InstallGameAgentService.bat" $PilotPath -Force } Invoke-Step "Copiando OHGDRelease" { Copy-Item ".\OHGDRelease-2026.05.07.1.zip" $DownloadsPath -Force } Invoke-Step "Copiando PilotGameAgentRelease" { Copy-Item ".\PilotGameAgentRelease-2026.6.2.1.zip" $DownloadsPath -Force } Invoke-Step "Importando configurações do registro" { reg import "PG Settings.reg" } Invoke-Step "Instalando .NET Desktop Runtime" { $proc = Start-Process ` ".\windowsdesktop-runtime-8.0.15-win-x64.exe" ` -ArgumentList "/quiet /norestart" ` -Wait ` -PassThru if ($proc.ExitCode -ne 0) { throw "Instalação do Runtime retornou ExitCode $($proc.ExitCode)" } } Set-Location $PilotPath Invoke-Step "Removendo C:\pilot" { Remove-Item "C:\pilot" -Recurse -Force -ErrorAction SilentlyContinue } Invoke-Step "Parando serviço PilotGameAgent" { Stop-Service PilotGameAgent -ErrorAction SilentlyContinue } Invoke-Step "Removendo serviço PilotGameAgent" { sc.exe delete PilotGameAgent | Out-Null } Invoke-Step "Renomeando game_agent" { if (Test-Path ".\game_agent.ND") { Remove-Item ".\game_agent.ND" -Recurse -Force } if (Test-Path ".\game_agent") { Rename-Item ".\game_agent" "game_agent.ND" } } Invoke-Step "Criando novo diretório game_agent" { New-Item ".\game_agent" -ItemType Directory -Force | Out-Null } Invoke-Step "Executando deployAgent" { & ".\deployAgent.bat" "2026.6.2.1" } Invoke-Step "Instalando serviço PilotGameAgent" { & ".\InstallGameAgentService.bat" } Invoke-Step "Configurando serviço para Automático" { Set-Service PilotGameAgent -StartupType Automatic } Invoke-Step "Limpando arquivos antigos" { Remove-Item ".\NDGDRelease*.zip" -Force -ErrorAction SilentlyContinue Remove-Item ".\NDGDRelease.bak" -Recurse -Force -ErrorAction SilentlyContinue Remove-Item ".\BRGDRelease.bak" -Recurse -Force -ErrorAction SilentlyContinue } Invoke-Step "Criando backup das releases" { if (Test-Path ".\NDGDRelease") { Move-Item ".\NDGDRelease" ".\NDGDRelease.bak" } if (Test-Path ".\BRGDRelease") { Move-Item ".\BRGDRelease" ".\BRGDRelease.bak" } } Invoke-Step "Executando deployCabinet" { & ".\deployCabinet.bat" "2026.05.07.1" } Invoke-Step "Reiniciando Explorer" { taskkill /IM explorer.exe /F | Out-Null } Invoke-Step "Iniciando serviço PilotGameAgent" { Start-Service PilotGameAgent } Write-Log "" Write-Log "========================================" Write-Log "Upgrade Portrait CabTab concluído com sucesso." Write-Log "========================================" } catch { Write-Log "" Write-Log "========================================" Write-Log "FALHA DURANTE O UPGRADE" Write-Log $_ Write-Log "========================================" throw } finally { Set-Location $OriginalLocation } } # GUI $form = New-Object System.Windows.Forms.Form $form.Text = "Pilot Installer" $form.Size = New-Object System.Drawing.Size(820, 560) $form.StartPosition = "CenterScreen" $buttonsPanel = New-Object System.Windows.Forms.FlowLayoutPanel $buttonsPanel.Location = New-Object System.Drawing.Point(10, 10) $buttonsPanel.Size = New-Object System.Drawing.Size(780, 80) $buttonsPanel.AutoSize = $false $buttonsPanel.WrapContents = $true $buttonsPanel.FlowDirection = [System.Windows.Forms.FlowDirection]::LeftToRight $buttonsPanel.Padding = New-Object System.Windows.Forms.Padding(0) $buttonsPanel.Margin = New-Object System.Windows.Forms.Padding(0) $form.Controls.Add($buttonsPanel) $buttons = @( @{ Text = "Install Portrait CabTab"; Action = { Initialize-SystemConfiguration; Upgrade-PortraitCabTab } }, @{ Text = "Install Dual"; Action = { Initialize-SystemConfiguration; Install-Pilot -Mode "Dual" } }, @{ Text = "Install Dual Rua"; Action = { Initialize-SystemConfiguration; Install-Pilot -Mode "DualR" } }, @{ Text = "Install Botoneira"; Action = { Initialize-SystemConfiguration; Install-Pilot -Mode "Botoneira" } }, @{ Text = "Exit"; Action = { $form.Close() } } ) foreach ($btn in $buttons) { $button = New-Object System.Windows.Forms.Button $button.Text = $btn.Text $button.Size = New-Object System.Drawing.Size(180, 30) $button.Margin = New-Object System.Windows.Forms.Padding(5) $button.Add_Click($btn.Action) $buttonsPanel.Controls.Add($button) } $outputBox = New-Object System.Windows.Forms.TextBox $outputBox.Multiline = $true $outputBox.ScrollBars = "Vertical" $outputBox.ReadOnly = $true $outputBox.Size = New-Object System.Drawing.Size(780, 420) $outputBox.Location = New-Object System.Drawing.Point(10, 100) $outputBox.Font = New-Object System.Drawing.Font("Consolas",10) $outputBox.Name = "OutputTextBox" $form.Controls.Add($outputBox) $form.Topmost = $true $form.ShowDialog()