Validate that job and antag prototypes can actually be set in character profiles, rather than just checking if the prototype exists. Make preferences system just call existing validation code when loading prototype from database, instead of some hacked-together stuff. Also I made the character profile validation logic take dependencies in via parameter because fuck resolves.
122 lines
4.4 KiB
C#
122 lines
4.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Content.Shared.Preferences;
|
|
using Robust.Client;
|
|
using Robust.Shared.Configuration;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Network;
|
|
using Robust.Shared.Prototypes;
|
|
using Robust.Shared.Utility;
|
|
|
|
namespace Content.Client.Preferences
|
|
{
|
|
/// <summary>
|
|
/// Receives <see cref="PlayerPreferences" /> and <see cref="GameSettings" /> from the server during the initial
|
|
/// connection.
|
|
/// Stores preferences on the server through <see cref="SelectCharacter" /> and <see cref="UpdateCharacter" />.
|
|
/// </summary>
|
|
public sealed class ClientPreferencesManager : IClientPreferencesManager
|
|
{
|
|
[Dependency] private readonly IClientNetManager _netManager = default!;
|
|
[Dependency] private readonly IBaseClient _baseClient = default!;
|
|
[Dependency] private readonly IConfigurationManager _cfg = default!;
|
|
[Dependency] private readonly IPrototypeManager _prototypes = default!;
|
|
|
|
public event Action? OnServerDataLoaded;
|
|
|
|
public GameSettings Settings { get; private set; } = default!;
|
|
public PlayerPreferences Preferences { get; private set; } = default!;
|
|
|
|
public void Initialize()
|
|
{
|
|
_netManager.RegisterNetMessage<MsgPreferencesAndSettings>(HandlePreferencesAndSettings);
|
|
_netManager.RegisterNetMessage<MsgUpdateCharacter>();
|
|
_netManager.RegisterNetMessage<MsgSelectCharacter>();
|
|
_netManager.RegisterNetMessage<MsgDeleteCharacter>();
|
|
|
|
_baseClient.RunLevelChanged += BaseClientOnRunLevelChanged;
|
|
}
|
|
|
|
private void BaseClientOnRunLevelChanged(object? sender, RunLevelChangedEventArgs e)
|
|
{
|
|
if (e.NewLevel == ClientRunLevel.Initialize)
|
|
{
|
|
Settings = default!;
|
|
Preferences = default!;
|
|
}
|
|
}
|
|
|
|
public void SelectCharacter(ICharacterProfile profile)
|
|
{
|
|
SelectCharacter(Preferences.IndexOfCharacter(profile));
|
|
}
|
|
|
|
public void SelectCharacter(int slot)
|
|
{
|
|
Preferences = new PlayerPreferences(Preferences.Characters, slot, Preferences.AdminOOCColor);
|
|
var msg = new MsgSelectCharacter
|
|
{
|
|
SelectedCharacterIndex = slot
|
|
};
|
|
_netManager.ClientSendMessage(msg);
|
|
}
|
|
|
|
public void UpdateCharacter(ICharacterProfile profile, int slot)
|
|
{
|
|
profile.EnsureValid(_cfg, _prototypes);
|
|
var characters = new Dictionary<int, ICharacterProfile>(Preferences.Characters) {[slot] = profile};
|
|
Preferences = new PlayerPreferences(characters, Preferences.SelectedCharacterIndex, Preferences.AdminOOCColor);
|
|
var msg = new MsgUpdateCharacter
|
|
{
|
|
Profile = profile,
|
|
Slot = slot
|
|
};
|
|
_netManager.ClientSendMessage(msg);
|
|
}
|
|
|
|
public void CreateCharacter(ICharacterProfile profile)
|
|
{
|
|
var characters = new Dictionary<int, ICharacterProfile>(Preferences.Characters);
|
|
var lowest = Enumerable.Range(0, Settings.MaxCharacterSlots)
|
|
.Except(characters.Keys)
|
|
.FirstOrNull();
|
|
|
|
if (lowest == null)
|
|
{
|
|
throw new InvalidOperationException("Out of character slots!");
|
|
}
|
|
|
|
var l = lowest.Value;
|
|
characters.Add(l, profile);
|
|
Preferences = new PlayerPreferences(characters, Preferences.SelectedCharacterIndex, Preferences.AdminOOCColor);
|
|
|
|
UpdateCharacter(profile, l);
|
|
}
|
|
|
|
public void DeleteCharacter(ICharacterProfile profile)
|
|
{
|
|
DeleteCharacter(Preferences.IndexOfCharacter(profile));
|
|
}
|
|
|
|
public void DeleteCharacter(int slot)
|
|
{
|
|
var characters = Preferences.Characters.Where(p => p.Key != slot);
|
|
Preferences = new PlayerPreferences(characters, Preferences.SelectedCharacterIndex, Preferences.AdminOOCColor);
|
|
var msg = new MsgDeleteCharacter
|
|
{
|
|
Slot = slot
|
|
};
|
|
_netManager.ClientSendMessage(msg);
|
|
}
|
|
|
|
private void HandlePreferencesAndSettings(MsgPreferencesAndSettings message)
|
|
{
|
|
Preferences = message.Preferences;
|
|
Settings = message.Settings;
|
|
|
|
OnServerDataLoaded?.Invoke();
|
|
}
|
|
}
|
|
}
|