| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- using Content.Client.Audio;
- using Content.Client.GameTicking.Managers;
- using Content.Client.LateJoin;
- using Content.Client.Lobby.UI;
- using Content.Client.Message;
- using Content.Client.UserInterface.Systems.Chat;
- using Content.Client.Voting;
- using Content.Shared.CCVar;
- using Robust.Client;
- using Robust.Client.Console;
- using Robust.Client.ResourceManagement;
- using Robust.Client.UserInterface;
- using Robust.Client.UserInterface.Controls;
- using Robust.Shared.Configuration;
- using Robust.Shared.Timing;
- namespace Content.Client.Lobby
- {
- public sealed class LobbyState : Robust.Client.State.State
- {
- [Dependency] private readonly IBaseClient _baseClient = default!;
- [Dependency] private readonly IConfigurationManager _cfg = default!;
- [Dependency] private readonly IClientConsoleHost _consoleHost = default!;
- [Dependency] private readonly IEntityManager _entityManager = default!;
- [Dependency] private readonly IResourceCache _resourceCache = default!;
- [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!;
- [Dependency] private readonly IGameTiming _gameTiming = default!;
- [Dependency] private readonly IVoteManager _voteManager = default!;
- private ClientGameTicker _gameTicker = default!;
- private ContentAudioSystem _contentAudioSystem = default!;
- protected override Type? LinkedScreenType { get; } = typeof(LobbyGui);
- public LobbyGui? Lobby;
- protected override void Startup()
- {
- if (_userInterfaceManager.ActiveScreen == null)
- {
- return;
- }
- Lobby = (LobbyGui) _userInterfaceManager.ActiveScreen;
- var chatController = _userInterfaceManager.GetUIController<ChatUIController>();
- _gameTicker = _entityManager.System<ClientGameTicker>();
- _contentAudioSystem = _entityManager.System<ContentAudioSystem>();
- _contentAudioSystem.LobbySoundtrackChanged += UpdateLobbySoundtrackInfo;
- chatController.SetMainChat(true);
- _voteManager.SetPopupContainer(Lobby.VoteContainer);
- LayoutContainer.SetAnchorPreset(Lobby, LayoutContainer.LayoutPreset.Wide);
- var lobbyNameCvar = _cfg.GetCVar(CCVars.ServerLobbyName);
- var serverName = _baseClient.GameInfo?.ServerName ?? string.Empty;
- Lobby.ServerName.Text = string.IsNullOrEmpty(lobbyNameCvar)
- ? Loc.GetString("ui-lobby-title", ("serverName", serverName))
- : lobbyNameCvar;
- var width = _cfg.GetCVar(CCVars.ServerLobbyRightPanelWidth);
- Lobby.RightSide.SetWidth = width;
- UpdateLobbyUi();
- Lobby.CharacterPreview.CharacterSetupButton.OnPressed += OnSetupPressed;
- Lobby.ReadyButton.OnPressed += OnReadyPressed;
- Lobby.ReadyButton.OnToggled += OnReadyToggled;
- _gameTicker.InfoBlobUpdated += UpdateLobbyUi;
- _gameTicker.LobbyStatusUpdated += LobbyStatusUpdated;
- _gameTicker.LobbyLateJoinStatusUpdated += LobbyLateJoinStatusUpdated;
- }
- protected override void Shutdown()
- {
- var chatController = _userInterfaceManager.GetUIController<ChatUIController>();
- chatController.SetMainChat(false);
- _gameTicker.InfoBlobUpdated -= UpdateLobbyUi;
- _gameTicker.LobbyStatusUpdated -= LobbyStatusUpdated;
- _gameTicker.LobbyLateJoinStatusUpdated -= LobbyLateJoinStatusUpdated;
- _contentAudioSystem.LobbySoundtrackChanged -= UpdateLobbySoundtrackInfo;
- _voteManager.ClearPopupContainer();
- Lobby!.CharacterPreview.CharacterSetupButton.OnPressed -= OnSetupPressed;
- Lobby!.ReadyButton.OnPressed -= OnReadyPressed;
- Lobby!.ReadyButton.OnToggled -= OnReadyToggled;
- Lobby = null;
- }
- public void SwitchState(LobbyGui.LobbyGuiState state)
- {
- // Yeah I hate this but LobbyState contains all the badness for now.
- Lobby?.SwitchState(state);
- }
- private void OnSetupPressed(BaseButton.ButtonEventArgs args)
- {
- SetReady(false);
- Lobby?.SwitchState(LobbyGui.LobbyGuiState.CharacterSetup);
- }
- private void OnReadyPressed(BaseButton.ButtonEventArgs args)
- {
- if (!_gameTicker.IsGameStarted)
- {
- return;
- }
- new LateJoinGui().OpenCentered();
- }
- private void OnReadyToggled(BaseButton.ButtonToggledEventArgs args)
- {
- SetReady(args.Pressed);
- }
- public override void FrameUpdate(FrameEventArgs e)
- {
- if (_gameTicker.IsGameStarted)
- {
- Lobby!.StartTime.Text = string.Empty;
- var roundTime = _gameTiming.CurTime.Subtract(_gameTicker.RoundStartTimeSpan);
- Lobby!.StationTime.Text = Loc.GetString("lobby-state-player-status-round-time", ("hours", roundTime.Hours), ("minutes", roundTime.Minutes));
- return;
- }
- Lobby!.StationTime.Text = Loc.GetString("lobby-state-player-status-round-not-started");
- string text;
- if (_gameTicker.Paused)
- {
- text = Loc.GetString("lobby-state-paused");
- }
- else if (_gameTicker.StartTime < _gameTiming.CurTime)
- {
- Lobby!.StartTime.Text = Loc.GetString("lobby-state-soon");
- return;
- }
- else
- {
- var difference = _gameTicker.StartTime - _gameTiming.CurTime;
- var seconds = difference.TotalSeconds;
- if (seconds < 0)
- {
- text = Loc.GetString(seconds < -5 ? "lobby-state-right-now-question" : "lobby-state-right-now-confirmation");
- }
- else if (difference.TotalHours >= 1)
- {
- text = $"{Math.Floor(difference.TotalHours)}:{difference.Minutes:D2}:{difference.Seconds:D2}";
- }
- else
- {
- text = $"{difference.Minutes}:{difference.Seconds:D2}";
- }
- }
- Lobby!.StartTime.Text = Loc.GetString("lobby-state-round-start-countdown-text", ("timeLeft", text));
- }
- private void LobbyStatusUpdated()
- {
- UpdateLobbyBackground();
- UpdateLobbyUi();
- }
- private void LobbyLateJoinStatusUpdated()
- {
- Lobby!.ReadyButton.Disabled = _gameTicker.DisallowedLateJoin;
- }
- private void UpdateLobbyUi()
- {
- if (_gameTicker.IsGameStarted)
- {
- Lobby!.ReadyButton.Text = Loc.GetString("lobby-state-ready-button-join-state");
- Lobby!.ReadyButton.ToggleMode = false;
- Lobby!.ReadyButton.Pressed = false;
- Lobby!.ObserveButton.Disabled = false;
- }
- else
- {
- Lobby!.StartTime.Text = string.Empty;
- Lobby!.ReadyButton.Text = Loc.GetString(Lobby!.ReadyButton.Pressed ? "lobby-state-player-status-ready": "lobby-state-player-status-not-ready");
- Lobby!.ReadyButton.ToggleMode = true;
- Lobby!.ReadyButton.Disabled = false;
- Lobby!.ReadyButton.Pressed = _gameTicker.AreWeReady;
- Lobby!.ObserveButton.Disabled = true;
- }
- if (_gameTicker.ServerInfoBlob != null)
- {
- Lobby!.ServerInfo.SetInfoBlob(_gameTicker.ServerInfoBlob);
- }
- }
- private void UpdateLobbySoundtrackInfo(LobbySoundtrackChangedEvent ev)
- {
- if (ev.SoundtrackFilename == null)
- {
- Lobby!.LobbySong.SetMarkup(Loc.GetString("lobby-state-song-no-song-text"));
- }
- else if (
- ev.SoundtrackFilename != null
- && _resourceCache.TryGetResource<AudioResource>(ev.SoundtrackFilename, out var lobbySongResource)
- )
- {
- var lobbyStream = lobbySongResource.AudioStream;
- var title = string.IsNullOrEmpty(lobbyStream.Title)
- ? Loc.GetString("lobby-state-song-unknown-title")
- : lobbyStream.Title;
- var artist = string.IsNullOrEmpty(lobbyStream.Artist)
- ? Loc.GetString("lobby-state-song-unknown-artist")
- : lobbyStream.Artist;
- var markup = Loc.GetString("lobby-state-song-text",
- ("songTitle", title),
- ("songArtist", artist));
- Lobby!.LobbySong.SetMarkup(markup);
- }
- }
- private void UpdateLobbyBackground()
- {
- if (_gameTicker.LobbyBackground != null)
- {
- Lobby!.Background.Texture = _resourceCache.GetResource<TextureResource>(_gameTicker.LobbyBackground );
- }
- else
- {
- Lobby!.Background.Texture = null;
- }
- }
- private void SetReady(bool newReady)
- {
- if (_gameTicker.IsGameStarted)
- {
- return;
- }
- _consoleHost.ExecuteCommand($"toggleready {newReady}");
- }
- }
- }
|