CatStation/Content.Client/Lobby/UI/CharacterSetupGui.xaml.cs
2026-07-15 01:46:23 +07:00

137 lines
5.1 KiB
C#

using Content.Client.Info;
using Content.Client.Info.PlaytimeStats;
using Content.Client.Resources;
using Content.Corvax.Interfaces.Client;
using Content.Shared.CCVar;
using Content.Shared.Preferences;
using Robust.Client.AutoGenerated;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
using Robust.Client.UserInterface;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Configuration;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
namespace Content.Client.Lobby.UI
{
/// <summary>
/// Holds the entire character setup GUI, from character picks to individual character editing.
/// </summary>
[GenerateTypedNameReferences]
public sealed partial class CharacterSetupGui : Control
{
[Dependency] private IClientPreferencesManager _preferencesManager = default!;
[Dependency] private IPrototypeManager _protomanager = default!;
[Dependency] private IResourceCache _resourceCache = default!;
[Dependency] private IConfigurationManager _cfg = default!;
[Dependency] private ISharedPlayerManager _playerManager = default!;
private readonly Button _createNewCharacterButton;
public event Action<int>? SelectCharacter;
public event Action<int>? DeleteCharacter;
public CharacterSetupGui(HumanoidProfileEditor profileEditor)
{
RobustXamlLoader.Load(this);
IoCManager.InjectDependencies(this);
var panelTex = _resourceCache.GetTexture("/Textures/Interface/Nano/button.svg.96dpi.png");
var back = new StyleBoxTexture
{
Texture = panelTex,
Modulate = new Color(37, 37, 42)
};
back.SetPatchMargin(StyleBox.Margin.All, 10);
BackgroundPanel.PanelOverride = back;
_createNewCharacterButton = new Button
{
Text = Loc.GetString("character-setup-gui-create-new-character-button"),
};
_createNewCharacterButton.OnPressed += args =>
{
_preferencesManager.CreateCharacter(HumanoidCharacterProfile.Random().WithJobFromCvar(_cfg));
ReloadCharacterPickers();
args.Event.Handle();
};
CharEditor.AddChild(profileEditor);
RulesButton.OnPressed += _ => new RulesAndInfoWindow().Open();
StatsButton.OnPressed += _ => new PlaytimeStatsWindow().OpenCentered();
_cfg.OnValueChanged(CCVars.SeeOwnNotes, p => AdminRemarksButton.Visible = p, true);
_cfg.OnValueChanged(CCVars.GameMaxCharacterSlots, _ => ReloadCharacterPickers());
// Corvax-Sponsors-Start
if (IoCManager.Instance!.TryResolveType<ISponsorWindowCreator>(out var creator))
{
SponsorButton.Visible = true;
SponsorButton.OnPressed += _ => creator.OpenWindow();
}
// Corvax-Sponsors-End
}
/// <summary>
/// Disposes and reloads all character picker buttons from the preferences data.
/// </summary>
public void ReloadCharacterPickers()
{
_createNewCharacterButton.Orphan();
Characters.RemoveAllChildren();
var numberOfFullSlots = 0;
var characterButtonsGroup = new ButtonGroup();
if (!_preferencesManager.ServerDataLoaded)
{
return;
}
var maxCharactersSlots = _cfg.GetCVar(CCVars.GameMaxCharacterSlots);
_createNewCharacterButton.ToolTip =
Loc.GetString("character-setup-gui-create-new-character-button-tooltip",
("maxCharacters", maxCharactersSlots));
var selectedSlot = _preferencesManager.Preferences?.SelectedCharacterIndex;
foreach (var (slot, character) in _preferencesManager.Preferences!.Characters)
{
numberOfFullSlots++;
var characterPickerButton = new CharacterPickerButton(_protomanager,
_playerManager,
characterButtonsGroup,
character,
slot == selectedSlot);
if (slot >= maxCharactersSlots)
{
characterPickerButton.SetOnlyStyleClass(ContainerButton.StylePseudoClassDisabled);
characterPickerButton.ToolTip =
Loc.GetString("character-setup-gui-create-new-character-button-tooltip",
("maxCharacters", maxCharactersSlots));
}
Characters.AddChild(characterPickerButton);
characterPickerButton.OnPressed += args =>
{
SelectCharacter?.Invoke(slot);
};
characterPickerButton.OnDeletePressed += () =>
{
DeleteCharacter?.Invoke(slot);
};
}
_createNewCharacterButton.Disabled = numberOfFullSlots >= maxCharactersSlots;
Characters.AddChild(_createNewCharacterButton);
}
}
}