diff --git a/windrose.kvp b/windrose.kvp index 82114a582..893d8d251 100644 --- a/windrose.kvp +++ b/windrose.kvp @@ -1,16 +1,16 @@ Meta.DisplayName=Windrose -Meta.Description=Windrose Dedicated Server +Meta.Description=Windrose Dedicated Server with Windrose+ option Meta.OS=Windows, Linux Meta.AarchSupport=Unknown Meta.Arch=x86_64 -Meta.Author=Greelan +Meta.Author=Greelan, DatGuyMcCaully Meta.URL=https://windrosecrew.com/ Meta.DisplayImageSource=url:https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/3041230/7e838d87d787735d5d29d72777c5ee55653dfb2b/header.jpg Meta.EndpointURIFormat= Meta.ConfigManifest=windroseconfig.json Meta.MetaConfigManifest=windrosemetaconfig.json Meta.ConfigRoot=windrose.kvp -Meta.MinAMPVersion=2.6.0.0 +Meta.MinAMPVersion=2.7.2.4 Meta.SpecificDockerImage=cubecoders/ampbase:wine-stable Meta.DockerRequired=False Meta.DockerBaseReadOnly=False @@ -21,7 +21,7 @@ Meta.Prerequisites=[] Meta.ExtraContainerPackages=[] Meta.ConfigReleaseState=NotSpecified Meta.NoCommercialUsage=False -Meta.ConfigVersion=4 +Meta.ConfigVersion=5 Meta.ReleaseNotes= Meta.BreakingReleaseNotes= Meta.AppConfigId=719703a2-78d0-45fc-86c7-3d548aba1706 @@ -39,7 +39,7 @@ App.WindowsCommandLineArgs= App.CommandLineArgs={{$PlatformArgs}} R5 {{$FormattedArgs}} -stdout -FullStdOutLogOutput App.UseLinuxIOREDIR=False App.AppSettings={} -App.EnvironmentVariables={"SteamAppId":"3041230","WINEPREFIX":"{{$FullRootDir}}.wine","WINEARCH":"win64","WINEDEBUG":"-all"} +App.EnvironmentVariables={"SteamAppId":"3041230","WINEPREFIX":"{{$FullRootDir}}.wine","WINEARCH":"win64","WINEDEBUG":"-all","WINEDLLOVERRIDES":"dwmapi=n,b","WINDROSEPLUS_DISABLE_MULTIPLIER_PAK":"{{WINDROSEPLUS_DISABLE_MULTIPLIER_PAK}}"} App.CommandLineParameterFormat=-{0}={1} App.CommandLineParameterDelimiter= App.ExitMethod=OS_CLOSE @@ -79,7 +79,7 @@ App.TelnetLoginFormat={0} App.TelnetNewLineType=Default App.TailLogFilePath={{$FullBaseDir}}R5/Saved/Logs/R5.log App.UpdateSources=@IncludeJson[windroseupdates.json] -App.PreStartStages=[] +App.PreStartStages=@IncludeJson[windrosestart.json] App.CommandTriggers={} App.UserActions=[] App.ForceUpdate=False @@ -100,7 +100,7 @@ App.ApplicationReadyMode=RegexMatch App.QuiesceCommand= App.DequiesceCommand= App.QuiesceSettleDelayMilliseconds=5 -Console.FilterMatchRegex=(\e\[(\d+;)*(\d+)?[ABCDHJKfmsu]|\e\[?[?\>\=\da-z]+|ProtonFixes\[\d+\] WARN: Skipping fix execution\. We are probably running a unit test\.) +Console.FilterMatchRegex=\e\[(\d+;)*(\d+)?[ABCDHJKfmsu]|\e\[?[?\>\=\da-z]+ Console.FilterMatchReplacement= Console.ThrowawayMessageRegex=^(WARNING|ERROR): Shader.+$ Console.AppReadyRegex=^\[[\d\.]+-[\d\.]+:\d+\]\[[\d ]+\]LogGlobalStatus: UEngine::LoadMap Load map complete.*$ diff --git a/windroseconfig.json b/windroseconfig.json index 46386fa45..b2cad4719 100644 --- a/windroseconfig.json +++ b/windroseconfig.json @@ -152,5 +152,323 @@ "False": "false", "True": "true" } + }, + { + "DisplayName": "Enable RCON", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "If set, the Windrose+ RCON will be enabled", + "Keywords": "rcon,dashboard,enable,enabled,rcon.enabled", + "FieldName": "rcon.enabled", + "InputType": "checkbox", + "ParamFieldName": "$.rcon.enabled", + "DefaultValue": "true", + "EnumValues": { + "False": "false", + "True": "true" + } + }, + { + "DisplayName": "RCON Password", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the password for the Windrose+ RCON. This password is also used for the Windrose+ dashboard login. Default is a strong random password. Blank = disabled", + "Keywords": "rcon,dashboard,password,rcon.password", + "FieldName": "rcon.password", + "InputType": "password", + "ParamFieldName": "$.rcon.password", + "DefaultValue": "{{newguid()}}", + "EnumValues": {} + }, + { + "DisplayName": "Enable Server Query", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "If set, Windrose+ server query responses will be enabled", + "Keywords": "query,enable,enabled,query.enabled", + "FieldName": "query.enabled", + "InputType": "checkbox", + "ParamFieldName": "$.query.enabled", + "DefaultValue": "true", + "EnumValues": { + "False": "false", + "True": "true" + } + }, + { + "DisplayName": "Server Query Interval", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the interval for server query responses. Lower values provide more frequent updates but increase server load", + "Keywords": "query,interval,server.query.interval_ms", + "FieldName": "query.interval_ms", + "InputType": "number", + "MinValue": "0", + "ParamFieldName": "$.query.interval_ms", + "DefaultValue": "5000", + "Placeholder": "5000", + "Suffix": "milliseconds", + "EnumValues": {} + }, + { + "DisplayName": "Server Admins", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets a list of [Steam64 IDs](https://steamid.io/) of server admins. Admins can run all wp.* commands without the Windrose+ RCON", + "Keywords": "rcon,dashboard,admin,steam,ids,admin.steam_ids", + "FieldName": "admin.steam_ids", + "InputType": "list", + "ParamFieldName": "$.admin.steam_ids", + "DefaultValue": "[]", + "Special": "array:text", + "EnumValues": {} + }, + { + "DisplayName": "Dashboard IP Binding Selection Mode", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets whether the IP binding of the Windrose+ dashboard should be automatically set, or whether it should be set to the instance's Application IP Binding or the IP set under Dashboard IP Binding. Note that on Windows the forced binding is 'localhost' only unless the Network Service user has appropriate ACL permissions", + "Keywords": "ip,binding,dashboard", + "FieldName": "HTTPBinding", + "InputType": "enum", + "ParamFieldName": "HTTPBinding", + "DefaultValue": "", + "EnumValues": { + "": "Automatic (default)", + "{{$ApplicationIPBinding}}": "Application IP Binding", + "{{ManualIPBinding}}": "Manual" + } + }, + { + "DisplayName": "Dashboard IP Binding", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the IP binding for the Windrose+ dashboard, if 'Manual' is selected as the Dashboard IP Binding Selection Mode", + "Keywords": "manual,ip,binding,dashboard", + "FieldName": "ManualIPBinding", + "InputType": "text", + "ParamFieldName": "ManualIPBinding", + "DefaultValue": "", + "EnumValues": {} + }, + { + "DisplayName": "Unlock All Ships", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "If set, all ships will be unlocked", + "Keywords": "features,unlock,all,ships,features.unlock_all_ships", + "FieldName": "features.unlock_all_ships", + "InputType": "checkbox", + "ParamFieldName": "$.features.unlock_all_ships", + "DefaultValue": "false", + "EnumValues": { + "False": "false", + "True": "true" + } + }, + { + "DisplayName": "Unlock All Recipes", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "If set, all recipes will be unlocked", + "Keywords": "features,unlock,all,recipes,features.unlock_all_recipes", + "FieldName": "features.unlock_all_recipes", + "InputType": "checkbox", + "ParamFieldName": "$.features.unlock_all_recipes", + "DefaultValue": "false", + "EnumValues": { + "False": "false", + "True": "true" + } + }, + { + "DisplayName": "XP Multiplier", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the experience gain multiplier. 1.0 = default, 2.0 = double XP", + "Keywords": "xp,experience,multiplier.multipliers.xp", + "FieldName": "multipliers.xp", + "InputType": "number", + "MinValue": "0.1", + "MaxValue": "100", + "ParamFieldName": "$.multipliers.xp", + "DefaultValue": "1.0", + "Placeholder": "1.0", + "MultipleOf": "0.000001", + "EnumValues": {} + }, + { + "DisplayName": "Loot Multiplier", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the loot drop rate multiplier. 1.0 = default, 2.0 = double loot", + "Keywords": "loot,drop,multiplier,multipliers.loot", + "FieldName": "multipliers.loot", + "InputType": "number", + "MinValue": "0.1", + "MaxValue": "100", + "ParamFieldName": "$.multipliers.loot", + "DefaultValue": "1.0", + "Placeholder": "1.0", + "MultipleOf": "0.000001", + "EnumValues": {} + }, + { + "DisplayName": "Stack Size Multiplier", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the item stack size multiplier. 5.0 = five times the default stack size", + "Keywords": "stack,size,inventory,multiplier,multipliers.stack_size", + "FieldName": "multipliers.stack_size", + "InputType": "number", + "MinValue": "0.1", + "MaxValue": "100", + "ParamFieldName": "$.multipliers.stack_size", + "DefaultValue": "1.0", + "Placeholder": "1.0", + "MultipleOf": "0.000001", + "EnumValues": {} + }, + { + "DisplayName": "Craft Efficiency Multiplier", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the crafting efficiency multiplier. 2.0 = half the normal crafting cost (lower ingredient counts), 0.5 = double the normal crafting cost (higher ingredient counts)", + "Keywords": "crafting,efficiency,multiplier,multipliers.craft_efficiency", + "FieldName": "multipliers.craft_efficiency", + "InputType": "number", + "MinValue": "0.1", + "MaxValue": "100", + "ParamFieldName": "$.multipliers.craft_efficiency", + "DefaultValue": "1.0", + "Placeholder": "1.0", + "MultipleOf": "0.000001", + "EnumValues": {} + }, + { + "DisplayName": "Crop Speed Multiplier", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the crop growth speed multiplier. 2.0 = crops grow twice as fast", + "Keywords": "farming,crop,speed,multiplier,multipliers.crop_speed", + "FieldName": "multipliers.crop_speed", + "InputType": "number", + "MinValue": "0.1", + "MaxValue": "100", + "ParamFieldName": "$.multipliers.crop_speed", + "DefaultValue": "1.0", + "Placeholder": "1.0", + "MultipleOf": "0.000001", + "EnumValues": {} + }, + { + "DisplayName": "Cooking Speed Multiplier", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the cooking/fermentation/smelting speed multiplier. 2.0 = twice as fast", + "Keywords": "cooking,fermentation,smelting,speed,multiplier,multipliers.cooking_speed", + "FieldName": "multipliers.cooking_speed", + "InputType": "number", + "MinValue": "0.1", + "MaxValue": "100", + "ParamFieldName": "$.multipliers.cooking_speed", + "DefaultValue": "1.0", + "Placeholder": "1.0", + "MultipleOf": "0.000001", + "EnumValues": {} + }, + { + "DisplayName": "Harvest Yield Multiplier", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the amount of resources gathered from harvesting. 2.0 = double yield", + "Keywords": "harvest,yield,resources,multiplier,multipliers.harvest_yield", + "FieldName": "multipliers.harvest_yield", + "InputType": "number", + "MinValue": "0.1", + "MaxValue": "100", + "ParamFieldName": "$.multipliers.harvest_yield", + "DefaultValue": "1.0", + "Placeholder": "1.0", + "MultipleOf": "0.000001", + "EnumValues": {} + }, + { + "DisplayName": "Inventory Size Multiplier", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Player inventory slot count multiplier", + "Keywords": "inventory,size,slots,multiplier,multipliers.inventory_size", + "FieldName": "multipliers.inventory_size", + "InputType": "number", + "MinValue": "0.5", + "MaxValue": "10", + "ParamFieldName": "$.multipliers.inventory_size", + "DefaultValue": "1.0", + "Placeholder": "1.0", + "MultipleOf": "0.000001", + "EnumValues": {} + }, + { + "DisplayName": "Carry Weight Multiplier", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the player carry weight multiplier", + "Keywords": "weight,carry,multiplier,multipliers.weight", + "FieldName": "multipliers.weight", + "InputType": "number", + "MinValue": "0.1", + "MaxValue": "10", + "ParamFieldName": "$.multipliers.weight", + "DefaultValue": "1.0", + "Placeholder": "1.0", + "MultipleOf": "0.000001", + "EnumValues": {} + }, + { + "DisplayName": "Points Per Level Multiplier", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "Sets the skill points granted per level up. 2.0 = double points", + "Keywords": "points,level,skill,multiplier,multipliers.points_per_level", + "FieldName": "multipliers.points_per_level", + "InputType": "number", + "MinValue": "1", + "MaxValue": "10", + "ParamFieldName": "$.multipliers.points_per_level", + "DefaultValue": "1.0", + "Placeholder": "1.0", + "MultipleOf": "0.000001", + "EnumValues": {} + }, + { + "DisplayName": "Skip/Remove Multiplier PAK", + "Category": "Windrose:stadia_controller", + "Subcategory": "WindrosePlus:extension:2", + "Description": "If set, the multiplier PAK file generated by Windrose+ will be skipped/removed on server start", + "Keywords": "multiplier,pak,disable,skip,remove,WINDROSEPLUS_DISABLE_MULTIPLIER_PAK", + "FieldName": "WINDROSEPLUS_DISABLE_MULTIPLIER_PAK", + "InputType": "checkbox", + "ParamFieldName": "WINDROSEPLUS_DISABLE_MULTIPLIER_PAK", + "DefaultValue": "0", + "EnumValues": { + "False": "0", + "True": "1" + } + }, + { + "DisplayName": "Install Windrose+", + "Category": "Updates", + "Subcategory": "Runtime Configuration:build:3", + "Description": "If set, [Windrose+](https://github.com/humangenome/WindrosePlus) will be installed when the server is updated, and the PAK builder and dashboard run when the server is started. Includes UE4SS experimental build. Note: your instance must have a Dashboard Port allocated by AMP", + "Keywords": "install,windrose+,windrose,plus,InstallWindrosePlus", + "FieldName": "InstallWindrosePlus", + "InputType": "checkbox", + "ParamFieldName": "InstallWindrosePlus", + "DefaultValue": "false", + "EnumValues": { + "False": "false", + "True": "true" + } } ] \ No newline at end of file diff --git a/windrosemetaconfig.json b/windrosemetaconfig.json index 40bbefb3f..f7bfe9119 100644 --- a/windrosemetaconfig.json +++ b/windrosemetaconfig.json @@ -4,5 +4,11 @@ "AutoMap": true, "Importable": true, "ConfigType": "json" + }, + { + "ConfigFile": "windrose_plus.json", + "AutoMap": true, + "Importable": true, + "ConfigType": "json" } ] \ No newline at end of file diff --git a/windroseports.json b/windroseports.json index 05a5d6528..27253a445 100644 --- a/windroseports.json +++ b/windroseports.json @@ -5,5 +5,12 @@ "Ref": "GamePort", "Name": "Game Port", "Description": "Port used for direct connection game traffic" + }, + { + "Protocol": "TCP", + "Port": 8780, + "Ref": "HTTPPort", + "Name": "Windrose+ Dashboard Port", + "Description": "Port used for Windrose+ dashboard and API traffic" } ] \ No newline at end of file diff --git a/windroserundashboard.ps1 b/windroserundashboard.ps1 new file mode 100644 index 000000000..40c416c01 --- /dev/null +++ b/windroserundashboard.ps1 @@ -0,0 +1,42 @@ +# Arguments: [http_port] (bind_ip) + +$serverProcess = "$PSScriptRoot\windrose\4129620\R5\Binaries\Win64\WindroseServer-Win64-Shipping.exe" + +# Check if Windrose server starts successfully within 1 minute +# If not, exit +$serverStarted = $false +for ($i = 1; $i -le 60; $i++) { + if (Get-WmiObject Win32_Process | Where-Object {$_.ExecutablePath -eq "$serverProcess"} -ErrorAction SilentlyContinue) { + $serverStarted = $true + break + } + Start-Sleep -Seconds 1 +} +if (-not $serverStarted) { exit 0 } + +# Start the Windrose+ dashboard +$dashboardJob = Start-Job -ScriptBlock { + param($scriptRoot, $port, $bindIp) + & powershell.exe -NoProfile -ExecutionPolicy Bypass -File "$scriptRoot\windrose\4129620\windrose_plus\server\windrose_plus_server.ps1" -Port $port $(if ($bindIp) { "-BindIp", $bindIp }) -GameDir "$scriptRoot\windrose\4129620" +} -ArgumentList $PSScriptRoot, $args[0], $args[1] + +# Exit if dashboard fails to start +Start-Sleep -Seconds 10 +Receive-Job -Id $dashboardJob.Id +if ((Get-Job -Id $dashboardJob.Id).State -ne 'Running') { + Receive-Job -Id $dashboardJob.Id + exit 0 +} + +# Monitor server process and terminate dashboard +# when server terminates +while ($true) { + Receive-Job -Id $dashboardJob.Id + if (-not (Get-WmiObject Win32_Process | Where-Object {$_.ExecutablePath -eq "$serverProcess"} -ErrorAction SilentlyContinue)) { + Stop-Job -Id $dashboardJob.Id + Receive-Job -Id $dashboardJob.Id + Remove-Job -Id $dashboardJob.Id -Force + exit 0 + } + Start-Sleep -Seconds 1 +} diff --git a/windroserundashboard.sh b/windroserundashboard.sh new file mode 100644 index 000000000..3b899a5bd --- /dev/null +++ b/windroserundashboard.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# Arguments: [http_port] (bind_ip) + +scriptDir=$(pwd) +serverProcess="Z:${scriptDir//\//\\}\\windrose\\4129620\\R5\\Binaries\\Win64\\WindroseServer-Win64-Shipping.exe" +export TEMP=${TMPDIR:-/tmp} + +# Check if Windrose server starts successfully within 1 minute +# If not, exit +serverStarted=false +for i in $(seq 1 60); do + serverPid=$(ps aux | grep -F "${serverProcess}" | grep -v grep | awk '{print $2}') + if [[ -n "$serverPid" ]]; then + serverStarted=true + break + fi + sleep 1 +done +if ! $serverStarted; then + exit 0 +fi + +# Start the Windrose+ dashboard +cd ./windrose/4129620 +powershell/pwsh -NoProfile -File "$scriptDir/windrose/4129620/windrose_plus/server/windrose_plus_server.ps1" -Port $1 ${2:+-BindIp "$2"} -GameDir "$scriptDir/windrose/4129620" & +dashboardPid=$! + +# Exit if dashboard fails to start +sleep 10 +if ! kill -0 "$dashboardPid" 2>/dev/null; then + exit 0 +fi + +# Monitor server process and terminate dashboard +# when server terminates or SIGTERM/SIGINT received +trap 'kill $dashboardPid' SIGTERM SIGINT +while true; do + if ! kill -0 "$serverPid" 2>/dev/null; then + kill "$dashboardPid" >/dev/null 2>&1 + exit 0 + fi + sleep 1 +done diff --git a/windrosestart.json b/windrosestart.json new file mode 100644 index 000000000..7ef07f308 --- /dev/null +++ b/windrosestart.json @@ -0,0 +1,68 @@ +[ + { + "UpdateStageName": "Windrose+ PAK Rebuild", + "UpdateSourcePlatform": "Windows", + "UpdateSource": "Executable", + "UpdateSourceData": "powershell.exe", + "UpdateSourceArgs": "-NoProfile -ExecutionPolicy Bypass -File \"{{$FullBaseDir}}windrose_plus/tools/WindrosePlus-BuildPak.ps1\" -ServerDir \"{{$FullRootDir}}4129620\"", + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "SkipOnFailure": true + }, + { + "UpdateStageName": "Windrose+ PAK Rebuild", + "UpdateSourcePlatform": "Linux", + "UpdateSource": "Executable", + "UpdateSourceData": "/bin/bash", + "UpdateSourceArgs": "-c \"export TEMP=${TMPDIR-/tmp}; cd \\\"{{$FullBaseDir}}\\\" && powershell/pwsh ./windrose_plus/tools/WindrosePlus-BuildPak.ps1 -ServerDir \\\"{{$FullRootDir}}4129620\\\"\"", + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "SkipOnFailure": true + }, + { + "UpdateStageName": "Dashboard Script Download", + "UpdateSourcePlatform": "Windows", + "UpdateSource": "FetchURL", + "UpdateSourceData": "https://raw.githubusercontent.com/CubeCoders/AMPTemplates/main/windroserundashboard.ps1", + "UpdateSourceArgs": "rundashboard.ps1", + "UpdateSourceTarget": "{{$FullInstanceDir}}", + "OverwriteExistingFiles": true, + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "SkipOnFailure": false + }, + { + "UpdateStageName": "Dashboard Script Download", + "UpdateSourcePlatform": "Linux", + "UpdateSource": "FetchURL", + "UpdateSourceData": "https://raw.githubusercontent.com/CubeCoders/AMPTemplates/main/windroserundashboard.sh", + "UpdateSourceArgs": "rundashboard.sh", + "UpdateSourceTarget": "{{$FullInstanceDir}}", + "OverwriteExistingFiles": true, + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "SkipOnFailure": false + }, + { + "UpdateStageName": "Run Windrose+ Dashboard", + "UpdateSourcePlatform": "Windows", + "UpdateSource": "Executable", + "UpdateSourceData": "powershell.exe", + "UpdateSourceArgs": "-NoProfile -ExecutionPolicy Bypass -File ./rundashboard.ps1 {{$HTTPPort}} {{HTTPBinding}}", + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "RunInBackground": true, + "SkipOnFailure": true + }, + { + "UpdateStageName": "Run Windrose+ Dashboard", + "UpdateSourcePlatform": "Linux", + "UpdateSource": "Executable", + "UpdateSourceData": "/bin/bash", + "UpdateSourceArgs": "-c \"chmod +x rundashboard.sh; ./rundashboard.sh {{$HTTPPort}} {{HTTPBinding}} &\"", + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "RunInBackground": true, + "SkipOnFailure": true + } +] \ No newline at end of file diff --git a/windroseupdates.json b/windroseupdates.json index 968b7de1b..68f88e8fd 100644 --- a/windroseupdates.json +++ b/windroseupdates.json @@ -34,5 +34,93 @@ "UpdateSourceData": "/bin/bash", "UpdateSourceArgs": "-c \"rm -rf \\\"{{$FullRootDir}}.wine\\\" >/dev/null 2>&1; WINEPREFIX=\\\"{{$FullRootDir}}.wine\\\" WINEARCH=win64 WINEDEBUG=-all /usr/bin/wineboot --init\"", "SkipOnFailure": false + }, + { + "UpdateStageName": "Windrose+ Download", + "UpdateSourcePlatform": "All", + "UpdateSource": "GithubRelease", + "UpdateSourceArgs": "HumanGenome/WindrosePlus", + "UpdateSourceData": "WindrosePlus.zip", + "UpdateSourceTarget": "{{$FullBaseDir}}", + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "UnzipUpdateSource": true, + "OverwriteExistingFiles": true, + "DeleteAfterExtract": true, + "SkipOnFailure": false + }, + { + "UpdateStageName": "Windrose+ Installation", + "UpdateSourcePlatform": "Windows", + "UpdateSource": "Executable", + "UpdateSourceData": "powershell.exe", + "UpdateSourceArgs": "-NoProfile -ExecutionPolicy Bypass -File \"{{$FullBaseDir}}install.ps1\" -GameDir \"{{$FullRootDir}}4129620\"", + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "SkipOnFailure": false + }, + { + "UpdateStageName": "PowerShell Download", + "UpdateSourcePlatform": "Linux", + "UpdateSource": "Executable", + "UpdateSourceData": "/bin/bash", + "UpdateSourceArgs": "-c \"cd \\\"{{$FullBaseDir}}\\\"; if [[ -x powershell/pwsh ]]; then InstalledVersion=v$(powershell/pwsh -version | sed \\\"s/PowerShell //\\\"); else InstalledVersion=\\\"\\\"; fi; LatestVersion=$(wget -qO- https://api.github.com/repos/PowerShell/PowerShell/releases/latest | jq -r .tag_name); if [[ -z \\\"$LatestVersion\\\" ]]; then echo \\\"Failed to fetch latest PowerShell version\\\" && exit 1; fi; if [[ \\\"$InstalledVersion\\\" == \\\"$LatestVersion\\\" ]]; then echo \\\"PowerShell $LatestVersion already installed. Skipping\\\" && exit 0; fi; rm -rf powershell; mkdir -p powershell; PwshVersion=${LatestVersion#v}; wget -qO powershell.tar.gz \\\"https://github.com/PowerShell/PowerShell/releases/download/$LatestVersion/powershell-$PwshVersion-linux-x64.tar.gz\\\" || { echo \\\"PowerShell download failed. Aborting\\\"; exit 1; }; tar -xzf powershell.tar.gz -C powershell && rm -f powershell.tar.gz && chmod +x powershell/pwsh && echo \\\"PowerShell $LatestVersion downloaded\\\"\"", + "SkipOnFailure": false + }, + { + "UpdateStageName": "Windrose+ Installation", + "UpdateSourcePlatform": "Linux", + "UpdateSource": "Executable", + "UpdateSourceData": "/bin/bash", + "UpdateSourceArgs": "-c \"export TEMP=${TMPDIR-/tmp}; cd \\\"{{$FullBaseDir}}\\\" && powershell/pwsh -NoProfile -File ./install.ps1 -GameDir \\\"{{$FullRootDir}}4129620\\\"\"", + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "SkipOnFailure": true + }, + { + "UpdateStageName": "Repak Download", + "UpdateSourcePlatform": "Linux", + "UpdateSource": "GithubRelease", + "UpdateSourceArgs": "trumank/repak", + "UpdateSourceData": "repak_cli-x86_64-unknown-linux-gnu.tar.xz", + "UpdateSourceTarget": "{{$FullBaseDir}}windrose_plus/tools/bin", + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "OverwriteExistingFiles": true, + "SkipOnFailure": false + }, + { + "UpdateStageName": "Retoc Download", + "UpdateSourcePlatform": "Linux", + "UpdateSource": "GithubRelease", + "UpdateSourceArgs": "trumank/retoc", + "UpdateSourceData": "retoc_cli-x86_64-unknown-linux-gnu.tar.xz", + "UpdateSourceTarget": "{{$FullBaseDir}}windrose_plus/tools/bin", + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "OverwriteExistingFiles": true, + "SkipOnFailure": false + }, + { + "UpdateStageName": "Repak and Retoc Installation", + "UpdateSourcePlatform": "Linux", + "UpdateSource": "Executable", + "UpdateSourceData": "/bin/bash", + "UpdateSourceArgs": "-c \"cd \\\"{{$FullBaseDir}}windrose_plus/tools/bin\\\" && tar -xf repak_cli-x86_64-unknown-linux-gnu.tar.xz --strip-components=1 && tar -xf retoc_cli-x86_64-unknown-linux-gnu.tar.xz --strip-components=1 && chmod +x repak retoc && rm -f repak.exe retoc.exe && mv repak repak.exe && mv retoc retoc.exe && rm -f repak_cli-x86_64-unknown-linux-gnu.tar.xz retoc_cli-x86_64-unknown-linux-gnu.tar.xz\"", + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "SkipOnFailure": false + }, + { + "UpdateStageName": "Default windrose_plus.json Download", + "UpdateSourcePlatform": "All", + "UpdateSource": "FetchURL", + "UpdateSourceData": "https://raw.githubusercontent.com/CubeCoders/AMPTemplates/main/windrosewindrose_plus.json", + "UpdateSourceTarget": "{{$FullBaseDir}}", + "UpdateSourceArgs": "windrose_plus.json", + "OverwriteExistingFiles": false, + "UpdateSourceConditionSetting": "InstallWindrosePlus", + "UpdateSourceConditionValue": "true", + "SkipOnFailure": false } ] \ No newline at end of file diff --git a/windrosewindrose_plus.json b/windrosewindrose_plus.json new file mode 100644 index 000000000..c49fad814 --- /dev/null +++ b/windrosewindrose_plus.json @@ -0,0 +1,33 @@ +{ + "rcon": { + "enabled": true, + "password": "", + "port": 27320 + }, + "query": { + "enabled": true, + "interval_ms": 5000 + }, + "admin": { + "steam_ids": [] + }, + "features": { + "unlock_all_ships": false, + "unlock_all_recipes": false + }, + "multipliers": { + "xp": 1.0, + "harvest_yield": 1.0, + "inventory_size": 1.0, + "stack_size": 1.0, + "weight": 1.0, + "loot": 1.0, + "points_per_level": 1.0, + "crop_speed": 1.0, + "cooking_speed": 1.0, + "craft_efficiency": 1.0 + }, + "debug": { + "log_level": "info" + } +} \ No newline at end of file