Broadcast Message Changes

1. Added config option for auto processes to use broadcast keyword
2. Added config to global settings
This commit is contained in:
Brett Hewitson 2022-03-22 22:20:37 +10:00
parent 220b3d9c77
commit fc658b04dd
22 changed files with 196 additions and 55 deletions

View file

@ -882,6 +882,9 @@
<setting name="SectionServerDetailsIsExpanded" serializeAs="String">
<value>False</value>
</setting>
<setting name="RCON_MessageCommand" serializeAs="String">
<value>Broadcast</value>
</setting>
</ServerManagerTool.Config>
</userSettings>
</configuration>

View file

@ -12,7 +12,7 @@ namespace ServerManagerTool {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.0.3.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.1.0.0")]
public sealed partial class Config : global::System.Configuration.ApplicationSettingsBase {
private static Config defaultInstance = ((Config)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Config())));
@ -3126,5 +3126,17 @@ namespace ServerManagerTool {
this["SectionServerDetailsIsExpanded"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Broadcast")]
public string RCON_MessageCommand {
get {
return ((string)(this["RCON_MessageCommand"]));
}
set {
this["RCON_MessageCommand"] = value;
}
}
}
}

View file

@ -860,5 +860,8 @@
<Setting Name="SectionServerDetailsIsExpanded" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="RCON_MessageCommand" Type="System.String" Scope="User">
<Value Profile="(Default)">Broadcast</Value>
</Setting>
</Settings>
</SettingsFile>

View file

@ -2655,7 +2655,7 @@ namespace ServerManagerTool.Lib
if (string.IsNullOrWhiteSpace(message) || !SendMessages)
return false;
var sent = await SendCommandAsync($"{ServerRCON.RCON_COMMAND_BROADCAST} {message}", false);
var sent = await SendCommandAsync($"{Config.Default.RCON_MessageCommand.ToLower()} {message}", false);
if (sent)
{

View file

@ -323,7 +323,8 @@ namespace ServerManagerTool.Lib
command.suppressOutput = false;
command.lines = HandleListPlayersCommand(command.lines);
}
else if (command.command.Equals(RCON_COMMAND_GETCHAT, StringComparison.OrdinalIgnoreCase))
if (command.command.Equals(RCON_COMMAND_GETCHAT, StringComparison.OrdinalIgnoreCase))
{
// TODO: Extract the player name from the chat
var lines = command.lines.Where(l => !string.IsNullOrEmpty(l) && l != NoResponseOutput);
@ -342,12 +343,14 @@ namespace ServerManagerTool.Lib
}
}
}
else if (command.command.Equals(RCON_COMMAND_BROADCAST, StringComparison.OrdinalIgnoreCase))
if (command.command.Equals(RCON_COMMAND_BROADCAST, StringComparison.OrdinalIgnoreCase))
{
LogEvent(LogEventType.Chat, command.rawCommand);
command.suppressOutput = true;
}
else if (command.command.Equals(RCON_COMMAND_SERVERCHAT, StringComparison.OrdinalIgnoreCase))
if (command.command.Equals(RCON_COMMAND_SERVERCHAT, StringComparison.OrdinalIgnoreCase))
{
LogEvent(LogEventType.Chat, command.rawCommand);
command.suppressOutput = true;

View file

@ -1166,7 +1166,7 @@ namespace ServerManagerTool.Lib
if (string.IsNullOrWhiteSpace(message))
return false;
var sent = await SendCommandAsync($"{ServerRCON.RCON_COMMAND_BROADCAST} {message}", false);
var sent = await SendCommandAsync($"{Config.Default.RCON_MessageCommand.ToLower()} {message}", false);
if (sent)
{

View file

@ -7,6 +7,29 @@
<link href="http://arkservermanager.freeforums.net/" />
<updated>2022-03-22T00:00:00Z</updated>
<entry>
<id>urn:uuid:95C9671F-4AEC-4433-AD68-CF91854FEC1B</id>
<title>1.1.422 (1.1.422.1)</title>
<summary>1.1.422.1</summary>
<link href="" />
<updated>2022-03-22T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">CHANGE</u>
<br/>
<ul>
<li>Changed the auto process message broadcast to use a config setting, not a hardcoded value.</li>
</ul>
</p>
</div>
</content>
<author>
<name>bletch</name>
<email>bletch1971@hotmail.com</email>
</author>
</entry>
<entry>
<id>urn:uuid:B6B3F1F1-610F-4294-9891-43DD245A5E0A</id>
<title>1.1.421 (1.1.421.1)</title>

View file

@ -5,21 +5,21 @@
<title>Ark Server Manager Version Feed</title>
<subtitle>This is the Ark Server Manager beta version feed.</subtitle>
<link href="http://arkservermanager.freeforums.net/" />
<updated>2022-03-22T00:00:00Z</updated>
<updated>2022-03-23T00:00:00Z</updated>
<entry>
<id>urn:uuid:B6B3F1F1-610F-4294-9891-43DD245A5E0A</id>
<title>1.1.421 (1.1.421.1)</title>
<summary>1.1.421.1</summary>
<id>urn:uuid:95C9671F-4AEC-4433-AD68-CF91854FEC1B</id>
<title>1.1.422 (1.1.422.1)</title>
<summary>1.1.422.1</summary>
<link href="" />
<updated>2022-03-22T00:00:00Z</updated>
<updated>2022-03-23T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">BUGFIX</u>
<u style="font-size: .9em;">CHANGE</u>
<br/>
<ul>
<li>Fixed a bug that would prevent auto processes from sending through broadcast messages to the clients.</li>
<li>Changed the auto process message broadcast to use a config setting, not a hardcoded value.</li>
</ul>
</p>
</div>

View file

@ -441,7 +441,7 @@ namespace ServerManagerTool
execute: (_) =>
{
var message = _globalizer.GetResourceString("RCON_SaveWorldLabel");
this.ServerRCON.IssueCommand($"{ServerRCON.RCON_COMMAND_BROADCAST} {message}");
this.ServerRCON.IssueCommand($"{Config.Default.RCON_MessageCommand.ToLower()} {message}");
this.ServerRCON.IssueCommand(Config.Default.ServerSaveCommand);
},
@ -458,7 +458,7 @@ namespace ServerManagerTool
execute: (_) =>
{
var message = _globalizer.GetResourceString("RCON_DestroyWildDinosLabel");
this.ServerRCON.IssueCommand($"{ServerRCON.RCON_COMMAND_BROADCAST} {message}");
this.ServerRCON.IssueCommand($"{Config.Default.RCON_MessageCommand.ToLower()} {message}");
this.ServerRCON.IssueCommand(ServerRCON.RCON_COMMAND_WILDDINOWIPE);
},
@ -801,6 +801,10 @@ namespace ServerManagerTool
switch (effectiveMode)
{
case InputMode.Command:
this.ServerRCON.IssueCommand(commandText);
break;
case InputMode.Broadcast:
this.ServerRCON.IssueCommand($"{ServerRCON.RCON_COMMAND_BROADCAST} {commandText}");
break;
@ -815,16 +819,6 @@ namespace ServerManagerTool
this.ServerRCON.IssueCommand($"{ServerRCON.RCON_COMMAND_SERVERCHAT} {commandText}");
}
break;
case InputMode.Command:
this.ServerRCON.IssueCommand(commandText);
break;
#if false
case InputMode.Chat:
this.ServerRCON.IssueCommand(textBox.Text);
break;
#endif
}
}

View file

@ -657,6 +657,9 @@
<setting name="SectionServerDetailsIsExpanded" serializeAs="String">
<value>False</value>
</setting>
<setting name="RCON_MessageCommand" serializeAs="String">
<value>Broadcast</value>
</setting>
</ServerManagerTool.Config>
</userSettings>
</configuration>

View file

@ -12,7 +12,7 @@ namespace ServerManagerTool {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.0.3.0")]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.1.0.0")]
public sealed partial class Config : global::System.Configuration.ApplicationSettingsBase {
private static Config defaultInstance = ((Config)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Config())));
@ -2309,5 +2309,17 @@ namespace ServerManagerTool {
this["SectionServerDetailsIsExpanded"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("Broadcast")]
public string RCON_MessageCommand {
get {
return ((string)(this["RCON_MessageCommand"]));
}
set {
this["RCON_MessageCommand"] = value;
}
}
}
}

View file

@ -635,5 +635,8 @@
<Setting Name="SectionServerDetailsIsExpanded" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">False</Value>
</Setting>
<Setting Name="RCON_MessageCommand" Type="System.String" Scope="User">
<Value Profile="(Default)">Broadcast</Value>
</Setting>
</Settings>
</SettingsFile>

View file

@ -523,6 +523,8 @@
<sys:String x:Key="InputMode_Command">Command</sys:String>
<sys:String x:Key="InputMode_Global">Global</sys:String>
<sys:String x:Key="InputMode_Broadcast">Broadcast</sys:String>
<sys:String x:Key="InputMode_Alert">Alert (requires Pippi mod)</sys:String>
<sys:String x:Key="InputMode_Server">Server (requires Pippi mod)</sys:String>
<sys:String x:Key="ConsoleStatus_Disconnected">Disconnected</sys:String>
<sys:String x:Key="ConsoleStatus_Connected">Connected</sys:String>
@ -922,6 +924,9 @@
<sys:String x:Key="GlobalSettings_Alerts_ModUpdateDetectedTooltip">This message will be displayed when the server manager detects one or more mods are out of date.</sys:String>
<sys:String x:Key="GlobalSettings_Alerts_ForceRespawnDinosLabel">Force Respawn Creatures Warning:</sys:String>
<sys:String x:Key="GlobalSettings_Alerts_ForceRespawnDinosTooltip">This message will be displayed when the server is being started and a wild creature wipe is scheduled.</sys:String>
<sys:String x:Key="GlobalSettings_RCON_ModeLabel">RCON Broadcast Mode:</sys:String>
<sys:String x:Key="GlobalSettings_RCON_ModeTooltip">Select the method used by the server manager to send auto process messages to the game clients via RCON.</sys:String>
<!--#endregion-->
<!--#region Server Settings Control-->

View file

@ -2548,7 +2548,7 @@ namespace ServerManagerTool.Lib
if (string.IsNullOrWhiteSpace(message) || !SendMessages)
return false;
var sent = await SendCommandAsync($"{ServerRcon.RCON_COMMAND_BROADCAST} {message}", false);
var sent = await SendCommandAsync($"{Config.Default.RCON_MessageCommand.ToLower()} {message}", false);
if (sent)
{

View file

@ -27,6 +27,8 @@ namespace ServerManagerTool.Lib
public const string NoResponseOutput = "NO_RESPONSE";
public const string RCON_COMMAND_BROADCAST = "broadcast";
public const string RCON_COMMAND_ALERT = "alert";
public const string RCON_COMMAND_SERVER = "server";
public const string RCON_COMMAND_LISTPLAYERS = "#managerplayerlist#";
public event EventHandler PlayersCollectionUpdated;
@ -245,16 +247,28 @@ namespace ServerManagerTool.Lib
//
// Perform per-command special processing to extract data
//
if (command?.command?.Equals(RCON_COMMAND_LISTPLAYERS, StringComparison.OrdinalIgnoreCase) ?? false)
{
command.suppressCommand = true;
command.suppressOutput = false;
}
if (command?.command?.Equals(RCON_COMMAND_BROADCAST, StringComparison.OrdinalIgnoreCase) ?? false)
{
LogEvent(LogEventType.Chat, command.rawCommand);
command.suppressOutput = true;
}
if (command?.command?.Equals(RCON_COMMAND_LISTPLAYERS, StringComparison.OrdinalIgnoreCase) ?? false)
if (command?.command?.Equals(RCON_COMMAND_ALERT, StringComparison.OrdinalIgnoreCase) ?? false)
{
command.suppressCommand = true;
command.suppressOutput = false;
LogEvent(LogEventType.Chat, command.rawCommand);
command.suppressOutput = true;
}
if (command?.command?.Equals(RCON_COMMAND_SERVER, StringComparison.OrdinalIgnoreCase) ?? false)
{
LogEvent(LogEventType.Chat, command.rawCommand);
command.suppressOutput = true;
}
}

View file

@ -1153,7 +1153,7 @@ namespace ServerManagerTool.Lib
if (string.IsNullOrWhiteSpace(message))
return false;
var sent = await SendCommandAsync($"{ServerRcon.RCON_COMMAND_BROADCAST} {message}", false);
var sent = await SendCommandAsync($"{Config.Default.RCON_MessageCommand.ToLower()} {message}", false);
if (sent)
{

View file

@ -743,6 +743,11 @@
<cctl:AnnotatedSlider Grid.Row="6" Grid.Column="0" Margin="0" Label="{DynamicResource GlobalSettings_LoggingMaxArchiveDaysLabel}" Value="{Binding Config.LoggingMaxArchiveDays}" Minimum="1" Maximum="365" SmallChange="1" LargeChange="5" TickFrequency="5" LabelRelativeWidth="Auto" SliderRelativeWidth="15*" SuffixRelativeWidth="Auto" SuffixRelativeMinWidth="40" Suffix="{DynamicResource SliderUnits_Days}" ToolTip="{DynamicResource GlobalSettings_LoggingMaxArchiveDaysTooltip}" IsEnabled="{Binding Config.LoggingEnabled}"/>
<cctl:AnnotatedSlider Grid.Row="7" Grid.Column="0" Margin="0" Label="{DynamicResource GlobalSettings_LoggingMaxArchiveFilesLabel}" Value="{Binding Config.LoggingMaxArchiveFiles}" Minimum="1" Maximum="1000" SmallChange="1" LargeChange="5" TickFrequency="5" LabelRelativeWidth="Auto" SliderRelativeWidth="15*" SuffixRelativeWidth="Auto" SuffixRelativeMinWidth="40" Suffix="{DynamicResource SliderUnits_Files}" ToolTip="{DynamicResource GlobalSettings_LoggingMaxArchiveFilesTooltip}" IsEnabled="{Binding Config.LoggingEnabled}"/>
<StackPanel Grid.Row="7" Grid.Column="1" Margin="0" Orientation="Horizontal">
<Label Content="{DynamicResource GlobalSettings_RCON_ModeLabel}" VerticalAlignment="Center"/>
<ComboBox Name="RconMessageModesComboBox" Margin="5" ItemsSource="{Binding ElementName=GlobalSettings, Path=RconMessageModes}" SelectedValue="{Binding Config.RCON_MessageCommand}" ToolTip="{DynamicResource GlobalSettings_RCON_ModeTooltip}" SelectedValuePath="ValueMember" DisplayMemberPath="DisplayMember" PreviewMouseWheel="ComboBox_PreviewMouseWheel"/>
</StackPanel>
</Grid>
</GroupBox>
</Grid>

View file

@ -35,6 +35,7 @@ namespace ServerManagerTool
public static readonly DependencyProperty WindowStatesServerMonitorProperty = DependencyProperty.Register(nameof(WindowStatesServerMonitor), typeof(ComboBoxItemList), typeof(GlobalSettingsControl), new PropertyMetadata(null));
public static readonly DependencyProperty DiscordBotLogLevelsProperty = DependencyProperty.Register(nameof(DiscordBotLogLevels), typeof(ComboBoxItemList), typeof(GlobalSettingsControl), new PropertyMetadata(null));
public static readonly DependencyProperty DiscordBotWhitelistProperty = DependencyProperty.Register(nameof(DiscordBotWhitelist), typeof(List<DiscordBotWhitelistItem>), typeof(GlobalSettingsControl), new PropertyMetadata(null));
public static readonly DependencyProperty RconMessageModesProperty = DependencyProperty.Register(nameof(RconMessageModes), typeof(ComboBoxItemList), typeof(GlobalSettingsControl), new PropertyMetadata(null));
public GlobalSettingsControl()
{
@ -50,6 +51,7 @@ namespace ServerManagerTool
PopulateWindowsStatesMainWindowComboBox();
PopulateWindowsStatesServerMonitorWindowComboBox();
PopulateDiscordBotLogLevelsComboBox();
PopulateRconMessageModesComboBox();
DiscordBotWhitelist = new List<DiscordBotWhitelistItem>();
if (Config.DiscordBotWhitelist != null)
@ -114,6 +116,12 @@ namespace ServerManagerTool
set { SetValue(DiscordBotWhitelistProperty, value); }
}
public ComboBoxItemList RconMessageModes
{
get { return (ComboBoxItemList)GetValue(RconMessageModesProperty); }
set { SetValue(RconMessageModesProperty, value); }
}
public void ApplyChangesToConfig()
{
if (Config.DiscordBotWhitelist is null)
@ -414,6 +422,7 @@ namespace ServerManagerTool
PopulateWindowsStatesMainWindowComboBox();
PopulateWindowsStatesServerMonitorWindowComboBox();
PopulateRconMessageModesComboBox();
App.Instance.OnResourceDictionaryChanged(Config.CultureName);
}
@ -554,6 +563,27 @@ namespace ServerManagerTool
}
}
private void PopulateRconMessageModesComboBox()
{
var selectedValue = this.RconMessageModesComboBox?.SelectedValue ?? Config.RCON_MessageCommand;
var list = new ComboBoxItemList();
foreach (InputMode inputMode in Enum.GetValues(typeof(InputMode)))
{
if (inputMode == InputMode.Command)
continue;
var displayMember = _globalizer.GetResourceString($"InputMode_{inputMode}") ?? inputMode.ToString();
list.Add(new Common.Model.ComboBoxItem(inputMode.ToString(), displayMember));
}
this.RconMessageModes = list;
if (this.RconMessageModesComboBox != null)
{
this.RconMessageModesComboBox.SelectedValue = selectedValue;
}
}
#region Discord Bot Whitelist
private void AddDiscordBotWhitelist_Click(object sender, RoutedEventArgs e)
{

View file

@ -7,6 +7,31 @@
<link href="http://servermanagers.freeforums.net/" />
<updated>2022-03-22T00:00:00Z</updated>
<entry>
<id>urn:uuid:59A5E20B-D3B2-4FDB-8E03-F0C3022C344F</id>
<title>1.1.65 (1.1.65.1)</title>
<summary>1.1.65.1</summary>
<link href="" />
<updated>2022-03-23T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">CHANGE</u>
<br/>
<ul>
<li>RCON Window - added two addional RCON broadcast methods, both require Pippi mod - Alert and Server.</li>
<li>Global Settings - added RCON broadcast mode droplist, so auto processes can send messages via RCON using this mode.</li>
<li>Auto Processes - changed the message broadcast to use the new config setting, not a hardcoded value.</li>
</ul>
</p>
</div>
</content>
<author>
<name>bletch</name>
<email>bletch1971@hotmail.com</email>
</author>
</entry>
<entry>
<id>urn:uuid:674D8E81-FB1B-42D9-8309-41AE40D5192F</id>
<title>1.1.64 (1.1.64.1)</title>

View file

@ -5,21 +5,23 @@
<title>Conan Server Manager Version Feed</title>
<subtitle>This is the Conan Server Manager beta version feed.</subtitle>
<link href="http://servermanagers.freeforums.net/" />
<updated>2022-03-22T00:00:00Z</updated>
<updated>2022-03-23T00:00:00Z</updated>
<entry>
<id>urn:uuid:674D8E81-FB1B-42D9-8309-41AE40D5192F</id>
<title>1.1.64 (1.1.64.1)</title>
<summary>1.1.64.1</summary>
<id>urn:uuid:59A5E20B-D3B2-4FDB-8E03-F0C3022C344F</id>
<title>1.1.65 (1.1.65.1)</title>
<summary>1.1.65.1</summary>
<link href="" />
<updated>2022-03-22T00:00:00Z</updated>
<updated>2022-03-23T00:00:00Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml" style="font-family: Arial, Verdana, Helvetica, Sans-Serif;font-size: .8em;">
<p>
<u style="font-size: .9em;">BUGFIX</u>
<u style="font-size: .9em;">CHANGE</u>
<br/>
<ul>
<li>Fixed a bug that would prevent auto processes from sending through broadcast messages to the clients.</li>
<li>RCON Window - added two addional RCON broadcast methods, both require Pippi mod - Alert and Server.</li>
<li>Global Settings - added RCON broadcast mode droplist, so auto processes can send messages via RCON using this mode.</li>
<li>Auto Processes - changed the message broadcast to use the new config setting, not a hardcoded value.</li>
</ul>
</p>
</div>

View file

@ -27,8 +27,9 @@ namespace ServerManagerTool
public enum InputMode
{
Command,
//Global,
Broadcast,
Alert,
Server,
}
public enum InputWindowMode
@ -633,12 +634,20 @@ namespace ServerManagerTool
switch (effectiveMode)
{
case InputMode.Command:
this.ServerRcon.IssueCommand(commandText);
break;
case InputMode.Broadcast:
this.ServerRcon.IssueCommand($"{ServerRcon.RCON_COMMAND_BROADCAST} {commandText}");
break;
case InputMode.Command:
this.ServerRcon.IssueCommand(commandText);
case InputMode.Alert:
this.ServerRcon.IssueCommand($"{ServerRcon.RCON_COMMAND_ALERT} {commandText}");
break;
case InputMode.Server:
this.ServerRcon.IssueCommand($"{ServerRcon.RCON_COMMAND_SERVER} {commandText}");
break;
}
@ -737,6 +746,14 @@ namespace ServerManagerTool
{
yield return new RconOutput_Broadcast(command.args);
}
else if(command.command.Equals(ServerRcon.RCON_COMMAND_ALERT, StringComparison.OrdinalIgnoreCase))
{
yield return new RconOutput_Broadcast(command.args);
}
else if(command.command.Equals(ServerRcon.RCON_COMMAND_SERVER, StringComparison.OrdinalIgnoreCase))
{
yield return new RconOutput_Broadcast(command.args);
}
else
{
yield return new RconOutput_Command($"> {command.rawCommand}");

View file

@ -71,20 +71,7 @@
<cctl:AnnotatedSlider Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Margin="1" Label="{DynamicResource ShutdownWindow_ShutdownIntervalLabel}" Value="{Binding ShutdownInterval}" Minimum="0" Maximum="60" SmallChange="1" LargeChange="5" TickFrequency="1" LabelRelativeWidth="Auto" SliderRelativeWidth="15*" SuffixRelativeWidth="Auto" Suffix="{DynamicResource SliderUnits_Minutes}" IsEnabled="{Binding ShutdownStarted, Converter={StaticResource InvertBooleanConverter}}" ToolTip="{DynamicResource ShutdownWindow_ShutdownIntervalTooltip}"/>
<CheckBox Grid.Row="2" Grid.Column="0" Margin="5" Content="{DynamicResource ShutdownWindow_BackupWorldFileLabel}" IsChecked="{Binding BackupWorldFile}" IsEnabled="{Binding ShutdownStarted, Converter={StaticResource InvertBooleanConverter}}" ToolTip="{DynamicResource ShutdownWindow_BackupWorldFileTooltip}" HorizontalAlignment="Left">
<CheckBox.Style>
<Style BasedOn="{StaticResource {x:Type CheckBox}}" TargetType="{x:Type CheckBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding Server.Profile.SOTF_Enabled}" Value="True">
<Setter Property="Visibility" Value="Collapsed"/>
</DataTrigger>
<DataTrigger Binding="{Binding Server.Profile.SOTF_Enabled}" Value="False">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</CheckBox.Style>
</CheckBox>
<CheckBox Grid.Row="2" Grid.Column="0" Margin="5" Content="{DynamicResource ShutdownWindow_BackupWorldFileLabel}" IsChecked="{Binding BackupWorldFile}" IsEnabled="{Binding ShutdownStarted, Converter={StaticResource InvertBooleanConverter}}" ToolTip="{DynamicResource ShutdownWindow_BackupWorldFileTooltip}" HorizontalAlignment="Left"/>
<CheckBox Grid.Row="2" Grid.Column="1" Margin="5" Content="{DynamicResource ShutdownWindow_UpdateServerLabel}" IsChecked="{Binding UpdateServer}" IsEnabled="{Binding ShutdownStarted, Converter={StaticResource InvertBooleanConverter}}" ToolTip="{DynamicResource ShutdownWindow_UpdateServerTooltip}" HorizontalAlignment="Left"/>
<CheckBox Grid.Row="3" Grid.Column="0" Margin="5" Content="{DynamicResource ShutdownWindow_RestartServerLabel}" IsChecked="{Binding RestartServer}" IsEnabled="{Binding ShutdownStarted, Converter={StaticResource InvertBooleanConverter}}" ToolTip="{DynamicResource ShutdownWindow_RestartServerTooltip}" HorizontalAlignment="Left"/>