diff --git a/SS14.Launcher/Api/ServerApi.cs b/SS14.Launcher/Api/ServerApi.cs index af59e17a5..2f684eec0 100644 --- a/SS14.Launcher/Api/ServerApi.cs +++ b/SS14.Launcher/Api/ServerApi.cs @@ -13,6 +13,8 @@ public sealed record ServerStatus( int PlayerCount, [property: JsonPropertyName("soft_max_players")] int SoftMaxPlayerCount, + [property: JsonPropertyName("panic_bunker")] + bool? PanicBunker, [property: JsonPropertyName("tags")] string[]? Tags); /// diff --git a/SS14.Launcher/Models/ServerStatus/IServerStatusData.cs b/SS14.Launcher/Models/ServerStatus/IServerStatusData.cs index e94835bea..8c675b958 100644 --- a/SS14.Launcher/Models/ServerStatus/IServerStatusData.cs +++ b/SS14.Launcher/Models/ServerStatus/IServerStatusData.cs @@ -25,4 +25,6 @@ public interface IServerStatusData : INotifyPropertyChanged int PlayerCount { get; set; } int SoftMaxPlayerCount { get; set; } + + bool? PanicBunker { get; set; } } diff --git a/SS14.Launcher/Models/ServerStatus/ServerStatusCache.Data.cs b/SS14.Launcher/Models/ServerStatus/ServerStatusCache.Data.cs index 9e7b86b50..0485090c3 100644 --- a/SS14.Launcher/Models/ServerStatus/ServerStatusCache.Data.cs +++ b/SS14.Launcher/Models/ServerStatus/ServerStatusCache.Data.cs @@ -11,6 +11,7 @@ public sealed class ServerStatusData : ObservableObject, IServerStatusData private TimeSpan? _ping; private int _playerCount; private int _softMaxPlayerCount; + private bool? _panicBunker; private ServerStatusCode _status = ServerStatusCode.FetchingStatus; private ServerStatusInfoCode _statusInfo = ServerStatusInfoCode.NotFetched; private ServerInfoLink[]? _links; @@ -77,6 +78,12 @@ public int SoftMaxPlayerCount set => SetProperty(ref _softMaxPlayerCount, value); } + public bool? PanicBunker + { + get => _panicBunker; + set => SetProperty(ref _panicBunker, value); + } + public ServerInfoLink[]? Links { get => _links; diff --git a/SS14.Launcher/Models/ServerStatus/ServerStatusCache.cs b/SS14.Launcher/Models/ServerStatus/ServerStatusCache.cs index ed43bf64a..0698eb6f9 100644 --- a/SS14.Launcher/Models/ServerStatus/ServerStatusCache.cs +++ b/SS14.Launcher/Models/ServerStatus/ServerStatusCache.cs @@ -124,6 +124,7 @@ public static void ApplyStatus(ServerStatusData data, ServerApi.ServerStatus sta data.Name = status.Name; data.PlayerCount = status.PlayerCount; data.SoftMaxPlayerCount = status.SoftMaxPlayerCount; + data.PanicBunker = status.PanicBunker; var baseTags = status.Tags ?? Array.Empty(); var inferredTags = ServerTagInfer.InferTags(status); diff --git a/SS14.Launcher/Utility/ServerFilter.cs b/SS14.Launcher/Utility/ServerFilter.cs index b82fdb367..75b1a9ce2 100644 --- a/SS14.Launcher/Utility/ServerFilter.cs +++ b/SS14.Launcher/Utility/ServerFilter.cs @@ -57,4 +57,5 @@ public enum ServerFilterCategory : byte EighteenPlus = 4, PlayerCount = 5, Hub = 6, + Bunker = 7, } diff --git a/SS14.Launcher/ViewModels/MainWindowTabs/ServerEntryViewModel.cs b/SS14.Launcher/ViewModels/MainWindowTabs/ServerEntryViewModel.cs index aecb72430..567d7c2e6 100644 --- a/SS14.Launcher/ViewModels/MainWindowTabs/ServerEntryViewModel.cs +++ b/SS14.Launcher/ViewModels/MainWindowTabs/ServerEntryViewModel.cs @@ -94,6 +94,38 @@ public string ServerStatusString } } + public string BunkerIcon + { + get + { + switch (_cacheData.PanicBunker) + { + case true: + return "⏲️"; //TODO: replace this with a proper icon. This might be doable in 126? We'd rather not step on Visne's toes for now, so a system-dependant emoji will do. + case null: + return "?"; + default: + return ""; + } + } + } + + public string BunkerText + { + get + { + switch (_cacheData.PanicBunker) + { + case true: + return "Panic Bunker Enabled"; + case false: + return "Panic Bunker Disabled"; + default: + return "Missing Panic Bunker Information"; + } + } + } + public string Description { get @@ -213,6 +245,12 @@ private void OnCacheDataOnPropertyChanged(object? _, PropertyChangedEventArgs ar OnPropertyChanged(nameof(ServerStatusString)); break; + case nameof(IServerStatusData.PanicBunker): + OnPropertyChanged(nameof(ServerStatusString)); + OnPropertyChanged(nameof(BunkerIcon)); + OnPropertyChanged(nameof(BunkerText)); + break; + case nameof(IServerStatusData.Status): OnPropertyChanged(nameof(IsOnline)); OnPropertyChanged(nameof(ServerStatusString)); diff --git a/SS14.Launcher/ViewModels/MainWindowTabs/ServerListFiltersViewModel.cs b/SS14.Launcher/ViewModels/MainWindowTabs/ServerListFiltersViewModel.cs index 939c5aeb8..411bc7274 100644 --- a/SS14.Launcher/ViewModels/MainWindowTabs/ServerListFiltersViewModel.cs +++ b/SS14.Launcher/ViewModels/MainWindowTabs/ServerListFiltersViewModel.cs @@ -27,12 +27,14 @@ public sealed partial class ServerListFiltersViewModel : ObservableObject private readonly FilterListCollection _filtersRolePlay = new(); private readonly FilterListCollection _filtersEighteenPlus = new(); private readonly FilterListCollection _filtersHub = new(); + private readonly FilterListCollection _filtersBunker = new(); public ObservableCollection FiltersLanguage => _filtersLanguage; public ObservableCollection FiltersRegion => _filtersRegion; public ObservableCollection FiltersRolePlay => _filtersRolePlay; public ObservableCollection FiltersEighteenPlus => _filtersEighteenPlus; public ObservableCollection FiltersHub => _filtersHub; + public ObservableCollection FiltersBunker => _filtersBunker; public ServerFilterViewModel FilterPlayerCountHideEmpty { get; } public ServerFilterViewModel FilterPlayerCountHideFull { get; } @@ -73,6 +75,11 @@ public ServerListFiltersViewModel(DataManager dataManager, LocalizationManager l _loc.GetString("filters-18-no"), new ServerFilter(ServerFilterCategory.EighteenPlus, ServerFilter.DataFalse), this)); + FiltersBunker.Add(new ServerFilterViewModel("Yes", "Yes", + new ServerFilter(ServerFilterCategory.Bunker, ServerFilter.DataTrue), this)); + FiltersBunker.Add(new ServerFilterViewModel("No", "No", + new ServerFilter(ServerFilterCategory.Bunker, ServerFilter.DataFalse), this)); + FilterPlayerCountHideEmpty = new ServerFilterViewModel( _loc.GetString("filters-player-count-hide-empty-desc"), _loc.GetString("filters-player-count-hide-empty"), @@ -276,6 +283,21 @@ public void ApplyFilters(List list) eighteenPlus = false; } + bool? panicBunker = null; + if (GetFilter(ServerFilterCategory.Bunker, ServerFilter.DataTrue)) + { + panicBunker = true; + } + + if (GetFilter(ServerFilterCategory.Bunker, ServerFilter.DataFalse)) + { + // Having both + if (panicBunker == true) + panicBunker = null; + else + panicBunker = false; + } + for (var i = 0; i < list.Count; i++) { var server = list[i]; @@ -299,6 +321,12 @@ bool DoesServerMatch(ServerStatusData server) return false; } + if (panicBunker != null) + { + if (panicBunker != server.PanicBunker) + return false; + } + if (!CheckCategoryFilterSet(categorySetLanguage, server.Tags, Tags.TagLanguage, PrimaryLanguageTag)) return false; diff --git a/SS14.Launcher/Views/MainWindowTabs/ServerEntryView.xaml b/SS14.Launcher/Views/MainWindowTabs/ServerEntryView.xaml index 5c8ec4f26..21a5b5612 100644 --- a/SS14.Launcher/Views/MainWindowTabs/ServerEntryView.xaml +++ b/SS14.Launcher/Views/MainWindowTabs/ServerEntryView.xaml @@ -23,6 +23,14 @@ MinWidth="80" Margin="10, 0" /> + + + + + + diff --git a/SS14.Launcher/Views/MainWindowTabs/ServerListFiltersView.xaml b/SS14.Launcher/Views/MainWindowTabs/ServerListFiltersView.xaml index e1a028518..86cdcbc9d 100644 --- a/SS14.Launcher/Views/MainWindowTabs/ServerListFiltersView.xaml +++ b/SS14.Launcher/Views/MainWindowTabs/ServerListFiltersView.xaml @@ -57,6 +57,11 @@ + + + + diff --git a/SS14.Launcher/Views/MainWindowTabs/ServerListTabView.xaml b/SS14.Launcher/Views/MainWindowTabs/ServerListTabView.xaml index e416a7168..5ca7cede5 100644 --- a/SS14.Launcher/Views/MainWindowTabs/ServerListTabView.xaml +++ b/SS14.Launcher/Views/MainWindowTabs/ServerListTabView.xaml @@ -34,6 +34,17 @@ + + + + + + + + + + +