Skip to content

Commit 3752d85

Browse files
committed
Windrose: add Windrose+ option
1 parent f5c316f commit 3752d85

9 files changed

Lines changed: 569 additions & 6 deletions

windrose.kvp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
Meta.DisplayName=Windrose
2-
Meta.Description=Windrose Dedicated Server
2+
Meta.Description=Windrose Dedicated Server with Windrose+ option
33
Meta.OS=Windows, Linux
44
Meta.AarchSupport=Unknown
55
Meta.Arch=x86_64
6-
Meta.Author=Greelan
6+
Meta.Author=Greelan, DatGuyMcCaully
77
Meta.URL=https://windrosecrew.com/
88
Meta.DisplayImageSource=url:https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/3041230/7e838d87d787735d5d29d72777c5ee55653dfb2b/header.jpg
99
Meta.EndpointURIFormat=
@@ -21,7 +21,7 @@ Meta.Prerequisites=[]
2121
Meta.ExtraContainerPackages=[]
2222
Meta.ConfigReleaseState=NotSpecified
2323
Meta.NoCommercialUsage=False
24-
Meta.ConfigVersion=3
24+
Meta.ConfigVersion=4
2525
Meta.ReleaseNotes=
2626
Meta.BreakingReleaseNotes=
2727
Meta.AppConfigId=719703a2-78d0-45fc-86c7-3d548aba1706
@@ -39,7 +39,7 @@ App.WindowsCommandLineArgs=
3939
App.CommandLineArgs={{$PlatformArgs}} R5 {{$FormattedArgs}} -stdout -FullStdOutLogOutput
4040
App.UseLinuxIOREDIR=False
4141
App.AppSettings={}
42-
App.EnvironmentVariables={"SteamAppId":"3041230","WINEPREFIX":"{{$FullRootDir}}.wine","WINEARCH":"win64","WINEDEBUG":"-all"}
42+
App.EnvironmentVariables={"SteamAppId":"3041230","WINEPREFIX":"{{$FullRootDir}}.wine","WINEARCH":"win64","WINEDEBUG":"-all","WINEDLLOVERRIDES":"dwmapi=n,b"}
4343
App.CommandLineParameterFormat=-{0}={1}
4444
App.CommandLineParameterDelimiter=
4545
App.ExitMethod=OS_CLOSE
@@ -79,7 +79,7 @@ App.TelnetLoginFormat={0}
7979
App.TelnetNewLineType=Default
8080
App.TailLogFilePath={{$FullBaseDir}}R5/Saved/Logs/R5.log
8181
App.UpdateSources=@IncludeJson[windroseupdates.json]
82-
App.PreStartStages=[]
82+
App.PreStartStages=@IncludeJson[windrosestart.json]
8383
App.CommandTriggers={}
8484
App.UserActions=[]
8585
App.ForceUpdate=False
@@ -100,7 +100,7 @@ App.ApplicationReadyMode=RegexMatch
100100
App.QuiesceCommand=
101101
App.DequiesceCommand=
102102
App.QuiesceSettleDelayMilliseconds=5
103-
Console.FilterMatchRegex=(\e\[(\d+;)*(\d+)?[ABCDHJKfmsu]|\e\[?[?\>\=\da-z]+|ProtonFixes\[\d+\] WARN: Skipping fix execution\. We are probably running a unit test\.)
103+
Console.FilterMatchRegex=\e\[(\d+;)*(\d+)?[ABCDHJKfmsu]|\e\[?[?\>\=\da-z]+
104104
Console.FilterMatchReplacement=
105105
Console.ThrowawayMessageRegex=^(WARNING|ERROR): Shader.+$
106106
Console.AppReadyRegex=^\[[\d\.]+-[\d\.]+:\d+\]\[[\d ]+\]LogGlobalStatus: UEngine::LoadMap Load map complete.*$

windroseconfig.json

Lines changed: 275 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,5 +137,280 @@
137137
"CIS": "CIS",
138138
"EU": "EU and NA"
139139
}
140+
},
141+
{
142+
"DisplayName": "Enable RCON",
143+
"Category": "Windrose:stadia_controller",
144+
"Subcategory": "WindrosePlus:extension:2",
145+
"Description": "If set, the Windrose+ RCON will be enabled",
146+
"Keywords": "rcon,dashboard,enable,enabled,rcon.enabled",
147+
"FieldName": "rcon.enabled",
148+
"InputType": "checkbox",
149+
"ParamFieldName": "$.rcon.enabled",
150+
"DefaultValue": "true",
151+
"EnumValues": {
152+
"False": "false",
153+
"True": "true"
154+
}
155+
},
156+
{
157+
"DisplayName": "RCON Password",
158+
"Category": "Windrose:stadia_controller",
159+
"Subcategory": "WindrosePlus:extension:2",
160+
"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",
161+
"Keywords": "rcon,dashboard,password,rcon.password",
162+
"FieldName": "rcon.password",
163+
"InputType": "password",
164+
"ParamFieldName": "$.rcon.password",
165+
"DefaultValue": "{{newguid()}}",
166+
"EnumValues": {}
167+
},
168+
{
169+
"DisplayName": "Enable Server Query",
170+
"Category": "Windrose:stadia_controller",
171+
"Subcategory": "WindrosePlus:extension:2",
172+
"Description": "If set, Windrose+ server query responses will be enabled",
173+
"Keywords": "query,enable,enabled,query.enabled",
174+
"FieldName": "query.enabled",
175+
"InputType": "checkbox",
176+
"ParamFieldName": "$.query.enabled",
177+
"DefaultValue": "true",
178+
"EnumValues": {
179+
"False": "false",
180+
"True": "true"
181+
}
182+
},
183+
{
184+
"DisplayName": "Server Query Interval",
185+
"Category": "Windrose:stadia_controller",
186+
"Subcategory": "WindrosePlus:extension:2",
187+
"Description": "Sets the interval for server query responses. Lower values provide more frequent updates but increase server load",
188+
"Keywords": "query,interval,server.query.interval_ms",
189+
"FieldName": "query.interval_ms",
190+
"InputType": "number",
191+
"MinValue": "0",
192+
"ParamFieldName": "$.query.interval_ms",
193+
"DefaultValue": "5000",
194+
"Placeholder": "5000",
195+
"Suffix": "milliseconds",
196+
"EnumValues": {}
197+
},
198+
{
199+
"DisplayName": "Server Admins",
200+
"Category": "Windrose:stadia_controller",
201+
"Subcategory": "WindrosePlus:extension:2",
202+
"Description": "Sets a list of [Steam64 IDs](https://steamid.io/) of server admins. Admins can run all wp.* commands without the Windrose+ RCON",
203+
"Keywords": "rcon,dashboard,admin,steam,ids,admin.steam_ids",
204+
"FieldName": "admin.steam_ids",
205+
"InputType": "list",
206+
"ParamFieldName": "$.admin.steam_ids",
207+
"DefaultValue": "[]",
208+
"Special": "array:text",
209+
"EnumValues": {}
210+
},
211+
{
212+
"DisplayName": "Unlock All Ships",
213+
"Category": "Windrose:stadia_controller",
214+
"Subcategory": "WindrosePlus:extension:2",
215+
"Description": "If set, all ships will be unlocked",
216+
"Keywords": "features,unlock,all,ships,features.unlock_all_ships",
217+
"FieldName": "features.unlock_all_ships",
218+
"InputType": "checkbox",
219+
"ParamFieldName": "$.features.unlock_all_ships",
220+
"DefaultValue": "false",
221+
"EnumValues": {
222+
"False": "false",
223+
"True": "true"
224+
}
225+
},
226+
{
227+
"DisplayName": "Unlock All Recipes",
228+
"Category": "Windrose:stadia_controller",
229+
"Subcategory": "WindrosePlus:extension:2",
230+
"Description": "If set, all recipes will be unlocked",
231+
"Keywords": "features,unlock,all,recipes,features.unlock_all_recipes",
232+
"FieldName": "features.unlock_all_recipes",
233+
"InputType": "checkbox",
234+
"ParamFieldName": "$.features.unlock_all_recipes",
235+
"DefaultValue": "false",
236+
"EnumValues": {
237+
"False": "false",
238+
"True": "true"
239+
}
240+
},
241+
{
242+
"DisplayName": "XP Multiplier",
243+
"Category": "Windrose:stadia_controller",
244+
"Subcategory": "WindrosePlus:extension:2",
245+
"Description": "Sets the experience gain multiplier. 1.0 = default, 2.0 = double XP",
246+
"Keywords": "xp,experience,multiplier.multipliers.xp",
247+
"FieldName": "multipliers.xp",
248+
"InputType": "number",
249+
"MinValue": "0.1",
250+
"MaxValue": "100",
251+
"ParamFieldName": "$.multipliers.xp",
252+
"DefaultValue": "1.0",
253+
"Placeholder": "1.0",
254+
"MultipleOf": "0.000001",
255+
"EnumValues": {}
256+
},
257+
{
258+
"DisplayName": "Loot Multiplier",
259+
"Category": "Windrose:stadia_controller",
260+
"Subcategory": "WindrosePlus:extension:2",
261+
"Description": "Sets the loot drop rate multiplier. 1.0 = default, 2.0 = double loot",
262+
"Keywords": "loot,drop,multiplier,multipliers.loot",
263+
"FieldName": "multipliers.loot",
264+
"InputType": "number",
265+
"MinValue": "0.1",
266+
"MaxValue": "100",
267+
"ParamFieldName": "$.multipliers.loot",
268+
"DefaultValue": "1.0",
269+
"Placeholder": "1.0",
270+
"MultipleOf": "0.000001",
271+
"EnumValues": {}
272+
},
273+
{
274+
"DisplayName": "Stack Size Multiplier",
275+
"Category": "Windrose:stadia_controller",
276+
"Subcategory": "WindrosePlus:extension:2",
277+
"Description": "Sets the item stack size multiplier. 5.0 = five times the default stack size",
278+
"Keywords": "stack,size,inventory,multiplier,multipliers.stack_size",
279+
"FieldName": "multipliers.stack_size",
280+
"InputType": "number",
281+
"MinValue": "0.1",
282+
"MaxValue": "100",
283+
"ParamFieldName": "$.multipliers.stack_size",
284+
"DefaultValue": "1.0",
285+
"Placeholder": "1.0",
286+
"MultipleOf": "0.000001",
287+
"EnumValues": {}
288+
},
289+
{
290+
"DisplayName": "Craft Cost Multiplier",
291+
"Category": "Windrose:stadia_controller",
292+
"Subcategory": "WindrosePlus:extension:2",
293+
"Description": "Sets the crafting resource cost multiplier. 0.5 = half the normal crafting cost",
294+
"Keywords": "crafting,cost,multiplier,multipliers.craft_cost",
295+
"FieldName": "multipliers.craft_cost",
296+
"InputType": "number",
297+
"MinValue": "0.1",
298+
"MaxValue": "100",
299+
"ParamFieldName": "$.multipliers.craft_cost",
300+
"DefaultValue": "1.0",
301+
"Placeholder": "1.0",
302+
"MultipleOf": "0.000001",
303+
"EnumValues": {}
304+
},
305+
{
306+
"DisplayName": "Crop Speed Multiplier",
307+
"Category": "Windrose:stadia_controller",
308+
"Subcategory": "WindrosePlus:extension:2",
309+
"Description": "Sets the crop growth speed multiplier. 2.0 = crops grow twice as fast",
310+
"Keywords": "farming,crop,speed,multiplier,multipliers.crop_speed",
311+
"FieldName": "multipliers.crop_speed",
312+
"InputType": "number",
313+
"MinValue": "0.1",
314+
"MaxValue": "100",
315+
"ParamFieldName": "$.multipliers.crop_speed",
316+
"DefaultValue": "1.0",
317+
"Placeholder": "1.0",
318+
"MultipleOf": "0.000001",
319+
"EnumValues": {}
320+
},
321+
{
322+
"DisplayName": "Cooking Speed Multiplier",
323+
"Category": "Windrose:stadia_controller",
324+
"Subcategory": "WindrosePlus:extension:2",
325+
"Description": "Sets the cooking/fermentation/smelting speed multiplier. 2.0 = twice as fast",
326+
"Keywords": "cooking,fermentation,smelting,speed,multiplier,multipliers.cooking_speed",
327+
"FieldName": "multipliers.cooking_speed",
328+
"InputType": "number",
329+
"MinValue": "0.1",
330+
"MaxValue": "100",
331+
"ParamFieldName": "$.multipliers.cooking_speed",
332+
"DefaultValue": "1.0",
333+
"Placeholder": "1.0",
334+
"MultipleOf": "0.000001",
335+
"EnumValues": {}
336+
},
337+
{
338+
"DisplayName": "Harvest Yield Multiplier",
339+
"Category": "Windrose:stadia_controller",
340+
"Subcategory": "WindrosePlus:extension:2",
341+
"Description": "Sets the amount of resources gathered from harvesting. 2.0 = double yield",
342+
"Keywords": "harvest,yield,resources,multiplier,multipliers.harvest_yield",
343+
"FieldName": "multipliers.harvest_yield",
344+
"InputType": "number",
345+
"MinValue": "0.1",
346+
"MaxValue": "100",
347+
"ParamFieldName": "$.multipliers.harvest_yield",
348+
"DefaultValue": "1.0",
349+
"Placeholder": "1.0",
350+
"MultipleOf": "0.000001",
351+
"EnumValues": {}
352+
},
353+
{
354+
"DisplayName": "Inventory Size Multiplier",
355+
"Category": "Windrose:stadia_controller",
356+
"Subcategory": "WindrosePlus:extension:2",
357+
"Description": "Player inventory slot count multiplier",
358+
"Keywords": "inventory,size,slots,multiplier,multipliers.inventory_size",
359+
"FieldName": "multipliers.inventory_size",
360+
"InputType": "number",
361+
"MinValue": "0.5",
362+
"MaxValue": "10",
363+
"ParamFieldName": "$.multipliers.inventory_size",
364+
"DefaultValue": "1.0",
365+
"Placeholder": "1.0",
366+
"MultipleOf": "0.000001",
367+
"EnumValues": {}
368+
},
369+
{
370+
"DisplayName": "Carry Weight Multiplier",
371+
"Category": "Windrose:stadia_controller",
372+
"Subcategory": "WindrosePlus:extension:2",
373+
"Description": "Sets the player carry weight multiplier",
374+
"Keywords": "weight,carry,multiplier,multipliers.weight",
375+
"FieldName": "multipliers.weight",
376+
"InputType": "number",
377+
"MinValue": "0.1",
378+
"MaxValue": "10",
379+
"ParamFieldName": "$.multipliers.weight",
380+
"DefaultValue": "1.0",
381+
"Placeholder": "1.0",
382+
"MultipleOf": "0.000001",
383+
"EnumValues": {}
384+
},
385+
{
386+
"DisplayName": "Points Per Level Multiplier",
387+
"Category": "Windrose:stadia_controller",
388+
"Subcategory": "WindrosePlus:extension:2",
389+
"Description": "Sets the skill points granted per level up. 2.0 = double points",
390+
"Keywords": "points,level,skill,multiplier,multipliers.points_per_level",
391+
"FieldName": "multipliers.points_per_level",
392+
"InputType": "number",
393+
"MinValue": "1",
394+
"MaxValue": "10",
395+
"ParamFieldName": "$.multipliers.points_per_level",
396+
"DefaultValue": "1.0",
397+
"Placeholder": "1.0",
398+
"MultipleOf": "0.000001",
399+
"EnumValues": {}
400+
},
401+
{
402+
"DisplayName": "Install Windrose+",
403+
"Category": "Updates",
404+
"Subcategory": "Runtime Configuration:build:3",
405+
"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",
406+
"Keywords": "install,windrose+,windrose,plus,InstallWindrosePlus",
407+
"FieldName": "InstallWindrosePlus",
408+
"InputType": "checkbox",
409+
"ParamFieldName": "InstallWindrosePlus",
410+
"DefaultValue": "false",
411+
"EnumValues": {
412+
"False": "false",
413+
"True": "true"
414+
}
140415
}
141416
]

windrosemetaconfig.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,11 @@
44
"AutoMap": true,
55
"Importable": true,
66
"ConfigType": "json"
7+
},
8+
{
9+
"ConfigFile": "windrose_plus.json",
10+
"AutoMap": true,
11+
"Importable": true,
12+
"ConfigType": "json"
713
}
814
]

windroseports.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,12 @@
55
"Ref": "GamePort",
66
"Name": "Game Port",
77
"Description": "Port used for direct connection game traffic"
8+
},
9+
{
10+
"Protocol": "TCP",
11+
"Port": 8780,
12+
"Ref": "HTTPPort",
13+
"Name": "Windrose+ Dashboard Port",
14+
"Description": "Port used for Windrose+ dashboard and API traffic"
815
}
916
]

windroserundashboard.ps1

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Arguments: [http_port]
2+
3+
$serverProcess = "$PSScriptRoot\windrose\4129620\R5\Binaries\Win64\WindroseServer-Win64-Shipping.exe"
4+
5+
# Check if Windrose server starts successfully within 1 minute
6+
# If not, exit
7+
$serverStarted = $false
8+
for ($i = 1; $i -le 60; $i++) {
9+
if (Get-WmiObject Win32_Process | Where-Object {$_.ExecutablePath -eq "$serverProcess"} -ErrorAction SilentlyContinue) {
10+
$serverStarted = $true
11+
break
12+
}
13+
Start-Sleep -Seconds 1
14+
}
15+
if (-not $serverStarted) { exit 0 }
16+
17+
# Start the Windrose+ dashboard
18+
$dashboardJob = Start-Job -ScriptBlock {
19+
param($scriptRoot, $port)
20+
& powershell.exe -NoProfile -ExecutionPolicy Bypass -File "$scriptRoot\windrose\4129620\windrose_plus\server\windrose_plus_server.ps1" -Port $port -GameDir "$scriptRoot\windrose\4129620"
21+
} -ArgumentList $PSScriptRoot, $args[0]
22+
23+
# Exit if dashboard fails to start
24+
Start-Sleep -Seconds 10
25+
Receive-Job -Id $dashboardJob.Id
26+
if ((Get-Job -Id $dashboardJob.Id).State -ne 'Running') {
27+
Receive-Job -Id $dashboardJob.Id
28+
exit 0
29+
}
30+
31+
# Monitor server process and terminate dashboard
32+
# when server terminates
33+
while ($true) {
34+
Receive-Job -Id $dashboardJob.Id
35+
if (-not (Get-WmiObject Win32_Process | Where-Object {$_.ExecutablePath -eq "$serverProcess"} -ErrorAction SilentlyContinue)) {
36+
Stop-Job -Id $dashboardJob.Id
37+
Receive-Job -Id $dashboardJob.Id
38+
Remove-Job -Id $dashboardJob.Id -Force
39+
exit 0
40+
}
41+
Start-Sleep -Seconds 1
42+
}

0 commit comments

Comments
 (0)