From be6cb75122d40f87133441793b8751b4d7c0d817 Mon Sep 17 00:00:00 2001 From: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Date: Fri, 24 Dec 2021 17:32:33 -0800 Subject: [PATCH] Add a wait time for the rules popup (#5823) * Create new rules popup * Implement accept and quit buttons * Add rules accept timer Forces the player to read the rules by making them wait. Speed reading the rules took me just under 45 seconds which means it'll take longer than that if someone's reading this for the first time. * Fix info rules header * Change _rulesPopup to local variable --- Content.Client/HUD/GameHud.cs | 9 --- Content.Client/Info/RulesAndInfoWindow.cs | 2 +- Content.Client/Info/RulesControl.xaml | 6 ++ Content.Client/Info/RulesControl.xaml.cs | 23 +++++++ Content.Client/Info/RulesManager.cs | 34 ++++++++-- Content.Client/Info/RulesPopup.xaml | 24 +++++++ Content.Client/Info/RulesPopup.xaml.cs | 69 +++++++++++++++++++++ Content.Shared/CCVar/CCVars.cs | 10 +++ Resources/Locale/en-US/info/info-window.ftl | 4 -- Resources/Locale/en-US/info/rules.ftl | 5 ++ 10 files changed, 167 insertions(+), 19 deletions(-) create mode 100644 Content.Client/Info/RulesControl.xaml create mode 100644 Content.Client/Info/RulesControl.xaml.cs create mode 100644 Content.Client/Info/RulesPopup.xaml create mode 100644 Content.Client/Info/RulesPopup.xaml.cs create mode 100644 Resources/Locale/en-US/info/rules.ftl diff --git a/Content.Client/HUD/GameHud.cs b/Content.Client/HUD/GameHud.cs index e3a02e0170..95d601b98f 100644 --- a/Content.Client/HUD/GameHud.cs +++ b/Content.Client/HUD/GameHud.cs @@ -6,7 +6,6 @@ using Content.Client.Info; using Content.Client.Resources; using Content.Client.Stylesheets; using Content.Client.Targeting; -using Content.Shared; using Content.Shared.CCVar; using Content.Shared.HUD; using Content.Shared.Input; @@ -304,8 +303,6 @@ namespace Content.Client.HUD _rulesAndInfoWindow = new RulesAndInfoWindow(); - IoCManager.Resolve().OpenRulesAndInfoWindow += OpenRulesAndInfoWindow; - _rulesAndInfoWindow.OnClose += () => _buttonInfo.Pressed = false; _inputManager.SetInputCommand(ContentKeyFunctions.OpenInfo, @@ -431,12 +428,6 @@ namespace Content.Client.HUD LC.SetGrowVertical(VoteContainer, LC.GrowDirection.End); } - private void OpenRulesAndInfoWindow() - { - _rulesAndInfoWindow.OpenCentered(); - _buttonInfo.Pressed = true; - } - private void ButtonInfoOnOnToggled() { _buttonInfo.StyleClasses.Remove(TopButton.StyleClassRedTopButton); diff --git a/Content.Client/Info/RulesAndInfoWindow.cs b/Content.Client/Info/RulesAndInfoWindow.cs index 817c114269..383d6c6a25 100644 --- a/Content.Client/Info/RulesAndInfoWindow.cs +++ b/Content.Client/Info/RulesAndInfoWindow.cs @@ -43,7 +43,7 @@ namespace Content.Client.Info private void PopulateRules(Info rulesList) { - AddSection(rulesList, Loc.GetString("ui-info-header-rules"), "Rules.txt", true); + AddSection(rulesList, Loc.GetString("ui-rules-header"), "Rules.txt", true); } private void PopulateTutorial(Info tutorialList) diff --git a/Content.Client/Info/RulesControl.xaml b/Content.Client/Info/RulesControl.xaml new file mode 100644 index 0000000000..3b24764688 --- /dev/null +++ b/Content.Client/Info/RulesControl.xaml @@ -0,0 +1,6 @@ + diff --git a/Content.Client/Info/RulesControl.xaml.cs b/Content.Client/Info/RulesControl.xaml.cs new file mode 100644 index 0000000000..6675715b30 --- /dev/null +++ b/Content.Client/Info/RulesControl.xaml.cs @@ -0,0 +1,23 @@ +using Robust.Client.AutoGenerated; +using Robust.Client.ResourceManagement; +using Robust.Client.UserInterface.Controls; +using Robust.Client.UserInterface.XAML; +using Robust.Shared.IoC; +using Robust.Shared.Localization; + +namespace Content.Client.Info; + +[GenerateTypedNameReferences] +public partial class RulesControl : BoxContainer +{ + [Dependency] private readonly IResourceCache _resourceManager = default!; + + public RulesControl() + { + RobustXamlLoader.Load(this); + IoCManager.InjectDependencies(this); + + AddChild(new InfoSection(Loc.GetString("ui-rules-header"), + _resourceManager.ContentFileReadAllText($"/Server Info/Rules.txt"), true)); + } +} diff --git a/Content.Client/Info/RulesManager.cs b/Content.Client/Info/RulesManager.cs index 3bccbddc77..2986b9c244 100644 --- a/Content.Client/Info/RulesManager.cs +++ b/Content.Client/Info/RulesManager.cs @@ -1,10 +1,11 @@ using System; using System.Globalization; -using System.IO; using Content.Client.Lobby; using Content.Client.Viewport; using Content.Shared.CCVar; +using Robust.Client.Console; using Robust.Client.State; +using Robust.Client.UserInterface; using Robust.Shared.Configuration; using Robust.Shared.ContentPack; using Robust.Shared.IoC; @@ -16,9 +17,9 @@ public sealed class RulesManager { [Dependency] private readonly IResourceManager _resource = default!; [Dependency] private readonly IConfigurationManager _configManager = default!; + [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; [Dependency] private readonly IStateManager _stateManager = default!; - - public event Action? OpenRulesAndInfoWindow; + [Dependency] private readonly IClientConsoleHost _consoleHost = default!; public void Initialize() { @@ -39,8 +40,10 @@ public sealed class RulesManager else SaveLastReadTime(); - if (showRules) - OpenRulesAndInfoWindow?.Invoke(); + if (!showRules) + return; + + ShowRules(_configManager.GetCVar(CCVars.RulesWaitTime)); } /// @@ -52,4 +55,25 @@ public sealed class RulesManager sw.Write(DateTime.UtcNow.ToUniversalTime()); } + + private void ShowRules(float time) + { + var rulesPopup = new RulesPopup + { + Timer = time + }; + rulesPopup.OnQuitPressed += OnQuitPressed; + rulesPopup.OnAcceptPressed += OnAcceptPressed; + _userInterfaceManager.RootControl.AddChild(rulesPopup); + } + + private void OnQuitPressed() + { + _consoleHost.ExecuteCommand("quit"); + } + + private void OnAcceptPressed() + { + SaveLastReadTime(); + } } diff --git a/Content.Client/Info/RulesPopup.xaml b/Content.Client/Info/RulesPopup.xaml new file mode 100644 index 0000000000..dc004af5a2 --- /dev/null +++ b/Content.Client/Info/RulesPopup.xaml @@ -0,0 +1,24 @@ + + + + + + + + public static readonly CVarDef SalvageForced = CVarDef.Create("salvage.forced", "", CVar.SERVERONLY); + + /* + * Rules + */ + + /// + /// Time that players have to wait before rules can be accepted. + /// + public static readonly CVarDef RulesWaitTime = + CVarDef.Create("rules.time", 45f, CVar.SERVER | CVar.REPLICATED); } } diff --git a/Resources/Locale/en-US/info/info-window.ftl b/Resources/Locale/en-US/info/info-window.ftl index fccbcdb06c..77446221ce 100644 --- a/Resources/Locale/en-US/info/info-window.ftl +++ b/Resources/Locale/en-US/info/info-window.ftl @@ -5,10 +5,6 @@ ui-info-title = Information ui-info-tab-rules = Server Rules ui-info-tab-tutorial = Tutorial -## Rules tab - -ui-info-header-rules = SS14 Official Server Rules - ## Tutorial tab ui-info-text-controls = You can review and rebind SS14s controls in the diff --git a/Resources/Locale/en-US/info/rules.ftl b/Resources/Locale/en-US/info/rules.ftl new file mode 100644 index 0000000000..9973bf8728 --- /dev/null +++ b/Resources/Locale/en-US/info/rules.ftl @@ -0,0 +1,5 @@ +# Rules + +ui-rules-header = SS14 Official Server Rules +ui-rules-accept = I have read and agree to follow the rules +ui-rules-wait = The accept button will be enabled after {$time} seconds.