* A lot of unfinished work, trying to figure stuff out but it ain't really working * The eye colors finally work on the sprite! * Big refactor for HumanoidProfileEditor, crashes upon making a lobby * Fixed Lobby crashing * Moves the eye selection box to a new tab, which fixes selection the box from going off-screen and not expanding the bars * uncommented something I shouldn't have commented out * Moved eye colors back to the appearance tab, still some ui glitches * Made it possible to scroll in the appearance tab * Added "Eye color:" label * Migrating some deprecated functions into their replacements * Merged two private sealed classes into one public class, removing duplication
This commit is contained in:
@@ -55,6 +55,11 @@ namespace Content.Client.GameObjects.Components
|
||||
isFacialHair));
|
||||
}
|
||||
|
||||
internal void EyeColorSelected(Color color)
|
||||
{
|
||||
SendMessage(new EyeColorSelectedMessage((color.RByte, color.GByte, color.BByte)));
|
||||
}
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
@@ -66,6 +71,86 @@ namespace Content.Client.GameObjects.Components
|
||||
}
|
||||
}
|
||||
|
||||
public class ColorSlider : Control
|
||||
{
|
||||
private readonly Slider _slider;
|
||||
private readonly LineEdit _textBox;
|
||||
private byte _colorValue;
|
||||
private bool _ignoreEvents;
|
||||
|
||||
public event Action OnValueChanged;
|
||||
|
||||
public byte ColorValue
|
||||
{
|
||||
get => _colorValue;
|
||||
set
|
||||
{
|
||||
_ignoreEvents = true;
|
||||
_colorValue = value;
|
||||
_slider.Value = value;
|
||||
_textBox.Text = value.ToString();
|
||||
_ignoreEvents = false;
|
||||
}
|
||||
}
|
||||
|
||||
public ColorSlider(string styleClass)
|
||||
{
|
||||
_slider = new Slider
|
||||
{
|
||||
StyleClasses = { styleClass },
|
||||
HorizontalExpand = true,
|
||||
VerticalAlignment = VAlignment.Center,
|
||||
MaxValue = byte.MaxValue
|
||||
};
|
||||
_textBox = new LineEdit
|
||||
{
|
||||
MinSize = (50, 0)
|
||||
};
|
||||
|
||||
AddChild(new HBoxContainer
|
||||
{
|
||||
Children =
|
||||
{
|
||||
_slider,
|
||||
_textBox
|
||||
}
|
||||
});
|
||||
|
||||
_slider.OnValueChanged += _ =>
|
||||
{
|
||||
if (_ignoreEvents)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_colorValue = (byte) _slider.Value;
|
||||
_textBox.Text = _colorValue.ToString();
|
||||
|
||||
OnValueChanged?.Invoke();
|
||||
};
|
||||
|
||||
_textBox.OnTextChanged += ev =>
|
||||
{
|
||||
if (_ignoreEvents)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (int.TryParse(ev.Text, out var result))
|
||||
{
|
||||
result = MathHelper.Clamp(result, 0, byte.MaxValue);
|
||||
|
||||
_ignoreEvents = true;
|
||||
_colorValue = (byte) result;
|
||||
_slider.Value = result;
|
||||
_ignoreEvents = false;
|
||||
|
||||
OnValueChanged?.Invoke();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public class FacialHairStylePicker : HairStylePicker
|
||||
{
|
||||
public override void Populate()
|
||||
@@ -175,91 +260,64 @@ namespace Content.Client.GameObjects.Components
|
||||
OnHairStylePicked?.Invoke(Items[args.ItemIndex].Text);
|
||||
}
|
||||
|
||||
private sealed class ColorSlider : Control
|
||||
{
|
||||
private readonly Slider _slider;
|
||||
private readonly LineEdit _textBox;
|
||||
private byte _colorValue;
|
||||
private bool _ignoreEvents;
|
||||
|
||||
public event Action OnValueChanged;
|
||||
|
||||
public byte ColorValue
|
||||
{
|
||||
get => _colorValue;
|
||||
set
|
||||
{
|
||||
_ignoreEvents = true;
|
||||
_colorValue = value;
|
||||
_slider.Value = value;
|
||||
_textBox.Text = value.ToString();
|
||||
_ignoreEvents = false;
|
||||
}
|
||||
// ColorSlider
|
||||
}
|
||||
|
||||
public ColorSlider(string styleClass)
|
||||
public class EyeColorPicker : Control
|
||||
{
|
||||
_slider = new Slider
|
||||
{
|
||||
StyleClasses = {styleClass},
|
||||
HorizontalExpand = true,
|
||||
VerticalAlignment = VAlignment.Center,
|
||||
MaxValue = byte.MaxValue
|
||||
};
|
||||
_textBox = new LineEdit
|
||||
{
|
||||
MinSize = (50, 0)
|
||||
};
|
||||
public event Action<Color> OnEyeColorPicked;
|
||||
|
||||
AddChild(new HBoxContainer
|
||||
{
|
||||
Children =
|
||||
{
|
||||
_slider,
|
||||
_textBox
|
||||
}
|
||||
});
|
||||
private readonly ColorSlider _colorSliderR;
|
||||
private readonly ColorSlider _colorSliderG;
|
||||
private readonly ColorSlider _colorSliderB;
|
||||
|
||||
_slider.OnValueChanged += _ =>
|
||||
private Color _lastColor;
|
||||
|
||||
public void SetData(Color color)
|
||||
{
|
||||
if (_ignoreEvents)
|
||||
{
|
||||
return;
|
||||
_lastColor = color;
|
||||
|
||||
_colorSliderR.ColorValue = color.RByte;
|
||||
_colorSliderG.ColorValue = color.GByte;
|
||||
_colorSliderB.ColorValue = color.BByte;
|
||||
}
|
||||
|
||||
_colorValue = (byte) _slider.Value;
|
||||
_textBox.Text = _colorValue.ToString();
|
||||
|
||||
OnValueChanged?.Invoke();
|
||||
};
|
||||
|
||||
_textBox.OnTextChanged += ev =>
|
||||
public EyeColorPicker()
|
||||
{
|
||||
if (_ignoreEvents)
|
||||
var vBox = new VBoxContainer();
|
||||
AddChild(vBox);
|
||||
|
||||
vBox.AddChild(_colorSliderR = new ColorSlider(StyleNano.StyleClassSliderRed));
|
||||
vBox.AddChild(_colorSliderG = new ColorSlider(StyleNano.StyleClassSliderGreen));
|
||||
vBox.AddChild(_colorSliderB = new ColorSlider(StyleNano.StyleClassSliderBlue));
|
||||
|
||||
Action colorValueChanged = ColorValueChanged;
|
||||
_colorSliderR.OnValueChanged += colorValueChanged;
|
||||
_colorSliderG.OnValueChanged += colorValueChanged;
|
||||
_colorSliderB.OnValueChanged += colorValueChanged;
|
||||
}
|
||||
|
||||
private void ColorValueChanged()
|
||||
{
|
||||
return;
|
||||
var newColor = new Color(
|
||||
_colorSliderR.ColorValue,
|
||||
_colorSliderG.ColorValue,
|
||||
_colorSliderB.ColorValue
|
||||
);
|
||||
|
||||
OnEyeColorPicked?.Invoke(newColor);
|
||||
|
||||
_lastColor = newColor;
|
||||
}
|
||||
|
||||
if (int.TryParse(ev.Text, out var result))
|
||||
{
|
||||
result = MathHelper.Clamp(result, 0, byte.MaxValue);
|
||||
|
||||
_ignoreEvents = true;
|
||||
_colorValue = (byte) result;
|
||||
_slider.Value = result;
|
||||
_ignoreEvents = false;
|
||||
|
||||
OnValueChanged?.Invoke();
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
// ColorSlider
|
||||
}
|
||||
|
||||
public class MagicMirrorWindow : SS14Window
|
||||
{
|
||||
private readonly HairStylePicker _hairStylePicker;
|
||||
private readonly FacialHairStylePicker _facialHairStylePicker;
|
||||
private readonly EyeColorPicker _eyeColorPicker;
|
||||
|
||||
public MagicMirrorWindow(MagicMirrorBoundUserInterface owner)
|
||||
{
|
||||
@@ -276,10 +334,13 @@ namespace Content.Client.GameObjects.Components
|
||||
_facialHairStylePicker.OnHairStylePicked += newStyle => owner.HairSelected(newStyle, true);
|
||||
_facialHairStylePicker.OnHairColorPicked += newColor => owner.HairColorSelected(newColor, true);
|
||||
|
||||
_eyeColorPicker = new EyeColorPicker {SizeFlagsHorizontal = SizeFlags.FillExpand};
|
||||
_eyeColorPicker.OnEyeColorPicked += newColor => owner.EyeColorSelected(newColor);
|
||||
|
||||
Contents.AddChild(new HBoxContainer
|
||||
{
|
||||
SeparationOverride = 8,
|
||||
Children = {_hairStylePicker, _facialHairStylePicker}
|
||||
Children = {_hairStylePicker, _facialHairStylePicker, _eyeColorPicker}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -291,6 +352,7 @@ namespace Content.Client.GameObjects.Components
|
||||
{
|
||||
_hairStylePicker.Dispose();
|
||||
_facialHairStylePicker.Dispose();
|
||||
_eyeColorPicker.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -298,6 +360,7 @@ namespace Content.Client.GameObjects.Components
|
||||
{
|
||||
_facialHairStylePicker.SetData(initialData.FacialHairColor, initialData.FacialHairName);
|
||||
_hairStylePicker.SetData(initialData.HairColor, initialData.HairName);
|
||||
_eyeColorPicker.SetData(initialData.EyeColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Content.Client.GameObjects.Components.ActionBlocking;
|
||||
using Content.Client.GameObjects.Components.ActionBlocking;
|
||||
using Content.Shared.GameObjects.Components.Body;
|
||||
using Content.Shared.GameObjects.Components.Body.Part;
|
||||
using Content.Shared.GameObjects.Components.Mobs;
|
||||
@@ -63,6 +63,8 @@ namespace Content.Client.GameObjects.Components.Mobs
|
||||
sprite.LayerSetColor(HumanoidVisualLayers.Hair, Appearance.HairColor);
|
||||
sprite.LayerSetColor(HumanoidVisualLayers.FacialHair, Appearance.FacialHairColor);
|
||||
|
||||
sprite.LayerSetColor(HumanoidVisualLayers.Eyes, Appearance.EyeColor);
|
||||
|
||||
sprite.LayerSetState(HumanoidVisualLayers.Chest, Sex == Sex.Male ? "torso_m" : "torso_f");
|
||||
sprite.LayerSetState(HumanoidVisualLayers.Head, Sex == Sex.Male ? "head_m" : "head_f");
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Content.Shared.Preferences;
|
||||
using Content.Shared.Preferences;
|
||||
using Content.Shared.Prototypes;
|
||||
using Content.Shared.Utility;
|
||||
using Robust.Shared.Prototypes;
|
||||
@@ -20,6 +20,7 @@ namespace Content.Client.UserInterface
|
||||
UpdateAgeEdit();
|
||||
UpdateNameEdit();
|
||||
UpdateHairPickers();
|
||||
UpdateEyePickers();
|
||||
}
|
||||
|
||||
private void RandomizeName()
|
||||
|
||||
@@ -47,6 +47,7 @@ namespace Content.Client.UserInterface
|
||||
private readonly OptionButton _backpackButton;
|
||||
private readonly HairStylePicker _hairPicker;
|
||||
private readonly FacialHairStylePicker _facialHairPicker;
|
||||
private readonly EyeColorPicker _eyesPicker;
|
||||
|
||||
private readonly List<JobPrioritySelector> _jobPriorities;
|
||||
private readonly OptionButton _preferenceUnavailableButton;
|
||||
@@ -90,28 +91,25 @@ namespace Content.Client.UserInterface
|
||||
|
||||
#region Randomize
|
||||
|
||||
{
|
||||
var panel = HighlightedContainer();
|
||||
var randomizePanel = HighlightedContainer();
|
||||
var randomizeEverythingButton = new Button
|
||||
{
|
||||
Text = Loc.GetString("Randomize everything")
|
||||
};
|
||||
randomizeEverythingButton.OnPressed += args => { RandomizeEverything(); };
|
||||
panel.AddChild(randomizeEverythingButton);
|
||||
leftColumn.AddChild(panel);
|
||||
}
|
||||
randomizePanel.AddChild(randomizeEverythingButton);
|
||||
leftColumn.AddChild(randomizePanel);
|
||||
|
||||
#endregion Randomize
|
||||
|
||||
#region Name
|
||||
|
||||
{
|
||||
var panel = HighlightedContainer();
|
||||
var hBox = new HBoxContainer
|
||||
var namePanel = HighlightedContainer();
|
||||
var nameHBox = new HBoxContainer
|
||||
{
|
||||
VerticalExpand = true
|
||||
};
|
||||
var nameLabel = new Label {Text = Loc.GetString("Name:")};
|
||||
var nameLabel = new Label { Text = Loc.GetString("Name:") };
|
||||
_nameEdit = new LineEdit
|
||||
{
|
||||
MinSize = (270, 0),
|
||||
@@ -122,13 +120,11 @@ namespace Content.Client.UserInterface
|
||||
{
|
||||
Text = Loc.GetString("Randomize"),
|
||||
};
|
||||
nameRandomButton.OnPressed += _ => RandomizeName();
|
||||
hBox.AddChild(nameLabel);
|
||||
hBox.AddChild(_nameEdit);
|
||||
hBox.AddChild(nameRandomButton);
|
||||
panel.AddChild(hBox);
|
||||
leftColumn.AddChild(panel);
|
||||
}
|
||||
nameRandomButton.OnPressed += args => RandomizeName();
|
||||
nameHBox.AddChild(nameLabel);
|
||||
nameHBox.AddChild(_nameEdit);
|
||||
nameHBox.AddChild(nameRandomButton);
|
||||
randomizePanel.AddChild(nameHBox);
|
||||
|
||||
#endregion Name
|
||||
|
||||
@@ -137,8 +133,22 @@ namespace Content.Client.UserInterface
|
||||
|
||||
#region Appearance
|
||||
|
||||
var appearanceList = new VBoxContainer();
|
||||
|
||||
var appearanceVBox = new VBoxContainer
|
||||
{
|
||||
var appearanceVBox = new VBoxContainer();
|
||||
Children =
|
||||
{
|
||||
new ScrollContainer
|
||||
{
|
||||
VerticalExpand = true,
|
||||
Children =
|
||||
{
|
||||
appearanceList
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
tabContainer.AddChild(appearanceVBox);
|
||||
tabContainer.SetTabTitle(0, Loc.GetString("Appearance"));
|
||||
|
||||
@@ -147,14 +157,13 @@ namespace Content.Client.UserInterface
|
||||
SeparationOverride = 10
|
||||
};
|
||||
|
||||
appearanceVBox.AddChild(sexAndAgeRow);
|
||||
appearanceList.AddChild(sexAndAgeRow);
|
||||
|
||||
#region Sex
|
||||
|
||||
{
|
||||
var panel = HighlightedContainer();
|
||||
var hBox = new HBoxContainer();
|
||||
var sexLabel = new Label {Text = Loc.GetString("Sex:")};
|
||||
var sexPanel = HighlightedContainer();
|
||||
var sexHBox = new HBoxContainer();
|
||||
var sexLabel = new Label { Text = Loc.GetString("Sex:") };
|
||||
|
||||
var sexButtonGroup = new ButtonGroup();
|
||||
|
||||
@@ -188,42 +197,38 @@ namespace Content.Client.UserInterface
|
||||
}
|
||||
};
|
||||
|
||||
hBox.AddChild(sexLabel);
|
||||
hBox.AddChild(_sexMaleButton);
|
||||
hBox.AddChild(_sexFemaleButton);
|
||||
panel.AddChild(hBox);
|
||||
sexAndAgeRow.AddChild(panel);
|
||||
}
|
||||
sexHBox.AddChild(sexLabel);
|
||||
sexHBox.AddChild(_sexMaleButton);
|
||||
sexHBox.AddChild(_sexFemaleButton);
|
||||
sexPanel.AddChild(sexHBox);
|
||||
sexAndAgeRow.AddChild(sexPanel);
|
||||
|
||||
#endregion Sex
|
||||
|
||||
#region Age
|
||||
|
||||
{
|
||||
var panel = HighlightedContainer();
|
||||
var hBox = new HBoxContainer();
|
||||
var ageLabel = new Label {Text = Loc.GetString("Age:")};
|
||||
_ageEdit = new LineEdit {MinSize = (40, 0)};
|
||||
var agePanel = HighlightedContainer();
|
||||
var ageHBox = new HBoxContainer();
|
||||
var ageLabel = new Label { Text = Loc.GetString("Age:") };
|
||||
_ageEdit = new LineEdit { MinSize = (40, 0) };
|
||||
_ageEdit.OnTextChanged += args =>
|
||||
{
|
||||
if (!int.TryParse(args.Text, out var newAge))
|
||||
return;
|
||||
SetAge(newAge);
|
||||
};
|
||||
hBox.AddChild(ageLabel);
|
||||
hBox.AddChild(_ageEdit);
|
||||
panel.AddChild(hBox);
|
||||
sexAndAgeRow.AddChild(panel);
|
||||
}
|
||||
ageHBox.AddChild(ageLabel);
|
||||
ageHBox.AddChild(_ageEdit);
|
||||
agePanel.AddChild(ageHBox);
|
||||
sexAndAgeRow.AddChild(agePanel);
|
||||
|
||||
#endregion Age
|
||||
|
||||
#region Gender
|
||||
|
||||
{
|
||||
var panel = HighlightedContainer();
|
||||
var hBox = new HBoxContainer();
|
||||
var genderLabel = new Label {Text = Loc.GetString("Pronouns:")};
|
||||
var genderPanel = HighlightedContainer();
|
||||
var genderHBox = new HBoxContainer();
|
||||
var genderLabel = new Label { Text = Loc.GetString("Pronouns:") };
|
||||
|
||||
_genderButton = new OptionButton();
|
||||
|
||||
@@ -238,22 +243,22 @@ namespace Content.Client.UserInterface
|
||||
SetGender((Gender) args.Id);
|
||||
};
|
||||
|
||||
hBox.AddChild(genderLabel);
|
||||
hBox.AddChild(_genderButton);
|
||||
panel.AddChild(hBox);
|
||||
sexAndAgeRow.AddChild(panel);
|
||||
}
|
||||
genderHBox.AddChild(genderLabel);
|
||||
genderHBox.AddChild(_genderButton);
|
||||
genderPanel.AddChild(genderHBox);
|
||||
sexAndAgeRow.AddChild(genderPanel);
|
||||
|
||||
#endregion Gender
|
||||
|
||||
#region Hair
|
||||
|
||||
{
|
||||
var panel = HighlightedContainer();
|
||||
panel.HorizontalAlignment = HAlignment.Left;
|
||||
var hairPanel = HighlightedContainer();
|
||||
var hairHBox = new HBoxContainer();
|
||||
|
||||
_hairPicker = new HairStylePicker();
|
||||
_hairPicker = new HairStylePicker
|
||||
{
|
||||
HorizontalAlignment = HAlignment.Center
|
||||
};
|
||||
_hairPicker.Populate();
|
||||
|
||||
_hairPicker.OnHairStylePicked += newStyle =>
|
||||
@@ -298,18 +303,16 @@ namespace Content.Client.UserInterface
|
||||
hairHBox.AddChild(_hairPicker);
|
||||
hairHBox.AddChild(_facialHairPicker);
|
||||
|
||||
panel.AddChild(hairHBox);
|
||||
appearanceVBox.AddChild(panel);
|
||||
}
|
||||
hairPanel.AddChild(hairHBox);
|
||||
appearanceList.AddChild(hairPanel);
|
||||
|
||||
#endregion Hair
|
||||
|
||||
#region Clothing
|
||||
|
||||
{
|
||||
var panel = HighlightedContainer();
|
||||
var hBox = new HBoxContainer();
|
||||
var clothingLabel = new Label {Text = Loc.GetString("Clothing:")};
|
||||
var clothingPanel = HighlightedContainer();
|
||||
var clothingHBox = new HBoxContainer();
|
||||
var clothingLabel = new Label { Text = Loc.GetString("Clothing:") };
|
||||
|
||||
_clothingButton = new OptionButton();
|
||||
|
||||
@@ -322,20 +325,18 @@ namespace Content.Client.UserInterface
|
||||
SetClothing((ClothingPreference) args.Id);
|
||||
};
|
||||
|
||||
hBox.AddChild(clothingLabel);
|
||||
hBox.AddChild(_clothingButton);
|
||||
panel.AddChild(hBox);
|
||||
appearanceVBox.AddChild(panel);
|
||||
}
|
||||
clothingHBox.AddChild(clothingLabel);
|
||||
clothingHBox.AddChild(_clothingButton);
|
||||
clothingPanel.AddChild(clothingHBox);
|
||||
appearanceList.AddChild(clothingPanel);
|
||||
|
||||
#endregion Clothing
|
||||
|
||||
#region Backpack
|
||||
|
||||
{
|
||||
var panel = HighlightedContainer();
|
||||
var hBox = new HBoxContainer();
|
||||
var backpackLabel = new Label {Text = Loc.GetString("Backpack:")};
|
||||
var backpackPanel = HighlightedContainer();
|
||||
var backpackHBox = new HBoxContainer();
|
||||
var backpackLabel = new Label { Text = Loc.GetString("Backpack:") };
|
||||
|
||||
_backpackButton = new OptionButton();
|
||||
|
||||
@@ -349,20 +350,41 @@ namespace Content.Client.UserInterface
|
||||
SetBackpack((BackpackPreference) args.Id);
|
||||
};
|
||||
|
||||
hBox.AddChild(backpackLabel);
|
||||
hBox.AddChild(_backpackButton);
|
||||
panel.AddChild(hBox);
|
||||
appearanceVBox.AddChild(panel);
|
||||
}
|
||||
backpackHBox.AddChild(backpackLabel);
|
||||
backpackHBox.AddChild(_backpackButton);
|
||||
backpackPanel.AddChild(backpackHBox);
|
||||
appearanceList.AddChild(backpackPanel);
|
||||
|
||||
#endregion Clothing
|
||||
}
|
||||
#endregion Backpack
|
||||
|
||||
#endregion
|
||||
#region Eyes
|
||||
|
||||
var eyesPanel = HighlightedContainer();
|
||||
var eyesVBox = new VBoxContainer();
|
||||
var eyesLabel = new Label { Text = Loc.GetString("Eye color:") };
|
||||
|
||||
_eyesPicker = new EyeColorPicker();
|
||||
|
||||
_eyesPicker.OnEyeColorPicked += newColor =>
|
||||
{
|
||||
if (Profile is null)
|
||||
return;
|
||||
Profile = Profile.WithCharacterAppearance(
|
||||
Profile.Appearance.WithEyeColor(newColor));
|
||||
IsDirty = true;
|
||||
};
|
||||
|
||||
eyesVBox.AddChild(eyesLabel);
|
||||
eyesVBox.AddChild(_eyesPicker);
|
||||
eyesPanel.AddChild(eyesVBox);
|
||||
appearanceList.AddChild(eyesPanel);
|
||||
|
||||
#endregion Eyes
|
||||
|
||||
#endregion Appearance
|
||||
|
||||
#region Jobs
|
||||
|
||||
{
|
||||
var jobList = new VBoxContainer();
|
||||
|
||||
var jobVBox = new VBoxContainer
|
||||
@@ -476,13 +498,11 @@ namespace Content.Client.UserInterface
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion Jobs
|
||||
|
||||
#region Antags
|
||||
|
||||
{
|
||||
var antagList = new VBoxContainer();
|
||||
|
||||
var antagVBox = new VBoxContainer
|
||||
@@ -523,18 +543,16 @@ namespace Content.Client.UserInterface
|
||||
IsDirty = true;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
#endregion Antags
|
||||
|
||||
var rightColumn = new VBoxContainer();
|
||||
middleContainer.AddChild(rightColumn);
|
||||
|
||||
#region Import/Export
|
||||
|
||||
{
|
||||
var panelContainer = HighlightedContainer();
|
||||
var hBox = new HBoxContainer();
|
||||
var importExportPanelContainer = HighlightedContainer();
|
||||
var importExportHBox = new HBoxContainer();
|
||||
var importButton = new Button
|
||||
{
|
||||
Text = Loc.GetString("Import"),
|
||||
@@ -547,11 +565,10 @@ namespace Content.Client.UserInterface
|
||||
Disabled = true,
|
||||
ToolTip = "Not yet implemented!"
|
||||
};
|
||||
hBox.AddChild(importButton);
|
||||
hBox.AddChild(exportButton);
|
||||
panelContainer.AddChild(hBox);
|
||||
rightColumn.AddChild(panelContainer);
|
||||
}
|
||||
importExportHBox.AddChild(importButton);
|
||||
importExportHBox.AddChild(exportButton);
|
||||
importExportPanelContainer.AddChild(importExportHBox);
|
||||
rightColumn.AddChild(importExportPanelContainer);
|
||||
|
||||
#endregion Import/Export
|
||||
|
||||
@@ -571,7 +588,7 @@ namespace Content.Client.UserInterface
|
||||
|
||||
#endregion Save
|
||||
|
||||
#endregion
|
||||
#endregion Left
|
||||
|
||||
#region Right
|
||||
|
||||
@@ -621,7 +638,7 @@ namespace Content.Client.UserInterface
|
||||
};
|
||||
box.AddChild(_previewSpriteSide);
|
||||
|
||||
#endregion
|
||||
#endregion Right
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -757,6 +774,11 @@ namespace Content.Client.UserInterface
|
||||
Profile.Appearance.FacialHairStyleName);
|
||||
}
|
||||
|
||||
private void UpdateEyePickers()
|
||||
{
|
||||
_eyesPicker.SetData(Profile.Appearance.EyeColor);
|
||||
}
|
||||
|
||||
private void UpdateSaveButton()
|
||||
{
|
||||
_saveButton.Disabled = Profile is null || !IsDirty;
|
||||
@@ -781,6 +803,7 @@ namespace Content.Client.UserInterface
|
||||
UpdateBackpackControls();
|
||||
UpdateAgeEdit();
|
||||
UpdateHairPickers();
|
||||
UpdateEyePickers();
|
||||
UpdateSaveButton();
|
||||
UpdateJobPriorities();
|
||||
UpdateAntagPreferences();
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#nullable enable
|
||||
#nullable enable
|
||||
using Content.Server.GameObjects.Components.Mobs;
|
||||
using Content.Server.Utility;
|
||||
using Content.Shared.GameObjects.Components;
|
||||
@@ -83,6 +83,14 @@ namespace Content.Server.GameObjects.Components
|
||||
looks.Appearance = looks.Appearance.WithHairColor(color);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case EyeColorSelectedMessage msg:
|
||||
var (eyeR, eyeG, eyeB) = msg.EyeColor;
|
||||
var eyeColor = new Color(eyeR, eyeG, eyeB);
|
||||
|
||||
looks.Appearance = looks.Appearance.WithEyeColor(eyeColor);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -103,7 +111,7 @@ namespace Content.Server.GameObjects.Components
|
||||
UserInterface?.Toggle(actor.playerSession);
|
||||
|
||||
var msg = new MagicMirrorInitialDataMessage(looks.Appearance.HairColor, looks.Appearance.FacialHairColor, looks.Appearance.HairStyleName,
|
||||
looks.Appearance.FacialHairStyleName);
|
||||
looks.Appearance.FacialHairStyleName, looks.Appearance.EyeColor);
|
||||
|
||||
UserInterface?.SendMessage(msg, actor.playerSession);
|
||||
}
|
||||
|
||||
@@ -42,6 +42,17 @@ namespace Content.Shared.GameObjects.Components
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public class EyeColorSelectedMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
public (byte r, byte g, byte b) EyeColor;
|
||||
|
||||
public EyeColorSelectedMessage((byte r, byte g, byte b) color)
|
||||
{
|
||||
EyeColor = color;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable, NetSerializable]
|
||||
public class MagicMirrorInitialDataMessage : BoundUserInterfaceMessage
|
||||
{
|
||||
@@ -49,13 +60,15 @@ namespace Content.Shared.GameObjects.Components
|
||||
public readonly Color FacialHairColor;
|
||||
public readonly string HairName;
|
||||
public readonly string FacialHairName;
|
||||
public readonly Color EyeColor;
|
||||
|
||||
public MagicMirrorInitialDataMessage(Color hairColor, Color facialHairColor, string hairName, string facialHairName)
|
||||
public MagicMirrorInitialDataMessage(Color hairColor, Color facialHairColor, string hairName, string facialHairName, Color eyeColor)
|
||||
{
|
||||
HairColor = hairColor;
|
||||
FacialHairColor = facialHairColor;
|
||||
HairName = hairName;
|
||||
FacialHairName = facialHairName;
|
||||
EyeColor = eyeColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user