1
0

ClientPreferencesManager.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using System.Linq;
  2. using Content.Shared.Preferences;
  3. using Robust.Client;
  4. using Robust.Client.Player;
  5. using Robust.Shared.Network;
  6. using Robust.Shared.Utility;
  7. namespace Content.Client.Lobby
  8. {
  9. /// <summary>
  10. /// Receives <see cref="PlayerPreferences" /> and <see cref="GameSettings" /> from the server during the initial
  11. /// connection.
  12. /// Stores preferences on the server through <see cref="SelectCharacter" /> and <see cref="UpdateCharacter" />.
  13. /// </summary>
  14. public sealed class ClientPreferencesManager : IClientPreferencesManager
  15. {
  16. [Dependency] private readonly IClientNetManager _netManager = default!;
  17. [Dependency] private readonly IBaseClient _baseClient = default!;
  18. [Dependency] private readonly IPlayerManager _playerManager = default!;
  19. public event Action? OnServerDataLoaded;
  20. public GameSettings Settings { get; private set; } = default!;
  21. public PlayerPreferences Preferences { get; private set; } = default!;
  22. public void Initialize()
  23. {
  24. _netManager.RegisterNetMessage<MsgPreferencesAndSettings>(HandlePreferencesAndSettings);
  25. _netManager.RegisterNetMessage<MsgUpdateCharacter>();
  26. _netManager.RegisterNetMessage<MsgSelectCharacter>();
  27. _netManager.RegisterNetMessage<MsgDeleteCharacter>();
  28. _baseClient.RunLevelChanged += BaseClientOnRunLevelChanged;
  29. }
  30. private void BaseClientOnRunLevelChanged(object? sender, RunLevelChangedEventArgs e)
  31. {
  32. if (e.NewLevel == ClientRunLevel.Initialize)
  33. {
  34. Settings = default!;
  35. Preferences = default!;
  36. }
  37. }
  38. public void SelectCharacter(ICharacterProfile profile)
  39. {
  40. SelectCharacter(Preferences.IndexOfCharacter(profile));
  41. }
  42. public void SelectCharacter(int slot)
  43. {
  44. Preferences = new PlayerPreferences(Preferences.Characters, slot, Preferences.AdminOOCColor);
  45. var msg = new MsgSelectCharacter
  46. {
  47. SelectedCharacterIndex = slot
  48. };
  49. _netManager.ClientSendMessage(msg);
  50. }
  51. public void UpdateCharacter(ICharacterProfile profile, int slot)
  52. {
  53. var collection = IoCManager.Instance!;
  54. profile.EnsureValid(_playerManager.LocalSession!, collection);
  55. var characters = new Dictionary<int, ICharacterProfile>(Preferences.Characters) {[slot] = profile};
  56. Preferences = new PlayerPreferences(characters, Preferences.SelectedCharacterIndex, Preferences.AdminOOCColor);
  57. var msg = new MsgUpdateCharacter
  58. {
  59. Profile = profile,
  60. Slot = slot
  61. };
  62. _netManager.ClientSendMessage(msg);
  63. }
  64. public void CreateCharacter(ICharacterProfile profile)
  65. {
  66. var characters = new Dictionary<int, ICharacterProfile>(Preferences.Characters);
  67. var lowest = Enumerable.Range(0, Settings.MaxCharacterSlots)
  68. .Except(characters.Keys)
  69. .FirstOrNull();
  70. if (lowest == null)
  71. {
  72. throw new InvalidOperationException("Out of character slots!");
  73. }
  74. var l = lowest.Value;
  75. characters.Add(l, profile);
  76. Preferences = new PlayerPreferences(characters, Preferences.SelectedCharacterIndex, Preferences.AdminOOCColor);
  77. UpdateCharacter(profile, l);
  78. }
  79. public void DeleteCharacter(ICharacterProfile profile)
  80. {
  81. DeleteCharacter(Preferences.IndexOfCharacter(profile));
  82. }
  83. public void DeleteCharacter(int slot)
  84. {
  85. var characters = Preferences.Characters.Where(p => p.Key != slot);
  86. Preferences = new PlayerPreferences(characters, Preferences.SelectedCharacterIndex, Preferences.AdminOOCColor);
  87. var msg = new MsgDeleteCharacter
  88. {
  89. Slot = slot
  90. };
  91. _netManager.ClientSendMessage(msg);
  92. }
  93. private void HandlePreferencesAndSettings(MsgPreferencesAndSettings message)
  94. {
  95. Preferences = message.Preferences;
  96. Settings = message.Settings;
  97. OnServerDataLoaded?.Invoke();
  98. }
  99. }
  100. }