* 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));
|
isFacialHair));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void EyeColorSelected(Color color)
|
||||||
|
{
|
||||||
|
SendMessage(new EyeColorSelectedMessage((color.RByte, color.GByte, color.BByte)));
|
||||||
|
}
|
||||||
|
|
||||||
protected override void Dispose(bool disposing)
|
protected override void Dispose(bool disposing)
|
||||||
{
|
{
|
||||||
base.Dispose(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 class FacialHairStylePicker : HairStylePicker
|
||||||
{
|
{
|
||||||
public override void Populate()
|
public override void Populate()
|
||||||
@@ -175,91 +260,64 @@ namespace Content.Client.GameObjects.Components
|
|||||||
OnHairStylePicked?.Invoke(Items[args.ItemIndex].Text);
|
OnHairStylePicked?.Invoke(Items[args.ItemIndex].Text);
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class ColorSlider : Control
|
// ColorSlider
|
||||||
{
|
|
||||||
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)
|
public class EyeColorPicker : Control
|
||||||
{
|
{
|
||||||
_slider = new Slider
|
public event Action<Color> OnEyeColorPicked;
|
||||||
{
|
|
||||||
StyleClasses = {styleClass},
|
|
||||||
HorizontalExpand = true,
|
|
||||||
VerticalAlignment = VAlignment.Center,
|
|
||||||
MaxValue = byte.MaxValue
|
|
||||||
};
|
|
||||||
_textBox = new LineEdit
|
|
||||||
{
|
|
||||||
MinSize = (50, 0)
|
|
||||||
};
|
|
||||||
|
|
||||||
AddChild(new HBoxContainer
|
private readonly ColorSlider _colorSliderR;
|
||||||
{
|
private readonly ColorSlider _colorSliderG;
|
||||||
Children =
|
private readonly ColorSlider _colorSliderB;
|
||||||
{
|
|
||||||
_slider,
|
|
||||||
_textBox
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
_slider.OnValueChanged += _ =>
|
private Color _lastColor;
|
||||||
|
|
||||||
|
public void SetData(Color color)
|
||||||
{
|
{
|
||||||
if (_ignoreEvents)
|
_lastColor = color;
|
||||||
{
|
|
||||||
return;
|
_colorSliderR.ColorValue = color.RByte;
|
||||||
|
_colorSliderG.ColorValue = color.GByte;
|
||||||
|
_colorSliderB.ColorValue = color.BByte;
|
||||||
}
|
}
|
||||||
|
|
||||||
_colorValue = (byte) _slider.Value;
|
public EyeColorPicker()
|
||||||
_textBox.Text = _colorValue.ToString();
|
|
||||||
|
|
||||||
OnValueChanged?.Invoke();
|
|
||||||
};
|
|
||||||
|
|
||||||
_textBox.OnTextChanged += ev =>
|
|
||||||
{
|
{
|
||||||
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))
|
// ColorSlider
|
||||||
{
|
|
||||||
result = MathHelper.Clamp(result, 0, byte.MaxValue);
|
|
||||||
|
|
||||||
_ignoreEvents = true;
|
|
||||||
_colorValue = (byte) result;
|
|
||||||
_slider.Value = result;
|
|
||||||
_ignoreEvents = false;
|
|
||||||
|
|
||||||
OnValueChanged?.Invoke();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MagicMirrorWindow : SS14Window
|
public class MagicMirrorWindow : SS14Window
|
||||||
{
|
{
|
||||||
private readonly HairStylePicker _hairStylePicker;
|
private readonly HairStylePicker _hairStylePicker;
|
||||||
private readonly FacialHairStylePicker _facialHairStylePicker;
|
private readonly FacialHairStylePicker _facialHairStylePicker;
|
||||||
|
private readonly EyeColorPicker _eyeColorPicker;
|
||||||
|
|
||||||
public MagicMirrorWindow(MagicMirrorBoundUserInterface owner)
|
public MagicMirrorWindow(MagicMirrorBoundUserInterface owner)
|
||||||
{
|
{
|
||||||
@@ -276,10 +334,13 @@ namespace Content.Client.GameObjects.Components
|
|||||||
_facialHairStylePicker.OnHairStylePicked += newStyle => owner.HairSelected(newStyle, true);
|
_facialHairStylePicker.OnHairStylePicked += newStyle => owner.HairSelected(newStyle, true);
|
||||||
_facialHairStylePicker.OnHairColorPicked += newColor => owner.HairColorSelected(newColor, true);
|
_facialHairStylePicker.OnHairColorPicked += newColor => owner.HairColorSelected(newColor, true);
|
||||||
|
|
||||||
|
_eyeColorPicker = new EyeColorPicker {SizeFlagsHorizontal = SizeFlags.FillExpand};
|
||||||
|
_eyeColorPicker.OnEyeColorPicked += newColor => owner.EyeColorSelected(newColor);
|
||||||
|
|
||||||
Contents.AddChild(new HBoxContainer
|
Contents.AddChild(new HBoxContainer
|
||||||
{
|
{
|
||||||
SeparationOverride = 8,
|
SeparationOverride = 8,
|
||||||
Children = {_hairStylePicker, _facialHairStylePicker}
|
Children = {_hairStylePicker, _facialHairStylePicker, _eyeColorPicker}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -291,6 +352,7 @@ namespace Content.Client.GameObjects.Components
|
|||||||
{
|
{
|
||||||
_hairStylePicker.Dispose();
|
_hairStylePicker.Dispose();
|
||||||
_facialHairStylePicker.Dispose();
|
_facialHairStylePicker.Dispose();
|
||||||
|
_eyeColorPicker.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,6 +360,7 @@ namespace Content.Client.GameObjects.Components
|
|||||||
{
|
{
|
||||||
_facialHairStylePicker.SetData(initialData.FacialHairColor, initialData.FacialHairName);
|
_facialHairStylePicker.SetData(initialData.FacialHairColor, initialData.FacialHairName);
|
||||||
_hairStylePicker.SetData(initialData.HairColor, initialData.HairName);
|
_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;
|
||||||
using Content.Shared.GameObjects.Components.Body.Part;
|
using Content.Shared.GameObjects.Components.Body.Part;
|
||||||
using Content.Shared.GameObjects.Components.Mobs;
|
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.Hair, Appearance.HairColor);
|
||||||
sprite.LayerSetColor(HumanoidVisualLayers.FacialHair, Appearance.FacialHairColor);
|
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.Chest, Sex == Sex.Male ? "torso_m" : "torso_f");
|
||||||
sprite.LayerSetState(HumanoidVisualLayers.Head, Sex == Sex.Male ? "head_m" : "head_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.Prototypes;
|
||||||
using Content.Shared.Utility;
|
using Content.Shared.Utility;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
@@ -20,6 +20,7 @@ namespace Content.Client.UserInterface
|
|||||||
UpdateAgeEdit();
|
UpdateAgeEdit();
|
||||||
UpdateNameEdit();
|
UpdateNameEdit();
|
||||||
UpdateHairPickers();
|
UpdateHairPickers();
|
||||||
|
UpdateEyePickers();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RandomizeName()
|
private void RandomizeName()
|
||||||
|
|||||||
@@ -47,6 +47,7 @@ namespace Content.Client.UserInterface
|
|||||||
private readonly OptionButton _backpackButton;
|
private readonly OptionButton _backpackButton;
|
||||||
private readonly HairStylePicker _hairPicker;
|
private readonly HairStylePicker _hairPicker;
|
||||||
private readonly FacialHairStylePicker _facialHairPicker;
|
private readonly FacialHairStylePicker _facialHairPicker;
|
||||||
|
private readonly EyeColorPicker _eyesPicker;
|
||||||
|
|
||||||
private readonly List<JobPrioritySelector> _jobPriorities;
|
private readonly List<JobPrioritySelector> _jobPriorities;
|
||||||
private readonly OptionButton _preferenceUnavailableButton;
|
private readonly OptionButton _preferenceUnavailableButton;
|
||||||
@@ -90,28 +91,25 @@ namespace Content.Client.UserInterface
|
|||||||
|
|
||||||
#region Randomize
|
#region Randomize
|
||||||
|
|
||||||
{
|
var randomizePanel = HighlightedContainer();
|
||||||
var panel = HighlightedContainer();
|
|
||||||
var randomizeEverythingButton = new Button
|
var randomizeEverythingButton = new Button
|
||||||
{
|
{
|
||||||
Text = Loc.GetString("Randomize everything")
|
Text = Loc.GetString("Randomize everything")
|
||||||
};
|
};
|
||||||
randomizeEverythingButton.OnPressed += args => { RandomizeEverything(); };
|
randomizeEverythingButton.OnPressed += args => { RandomizeEverything(); };
|
||||||
panel.AddChild(randomizeEverythingButton);
|
randomizePanel.AddChild(randomizeEverythingButton);
|
||||||
leftColumn.AddChild(panel);
|
leftColumn.AddChild(randomizePanel);
|
||||||
}
|
|
||||||
|
|
||||||
#endregion Randomize
|
#endregion Randomize
|
||||||
|
|
||||||
#region Name
|
#region Name
|
||||||
|
|
||||||
{
|
var namePanel = HighlightedContainer();
|
||||||
var panel = HighlightedContainer();
|
var nameHBox = new HBoxContainer
|
||||||
var hBox = new HBoxContainer
|
|
||||||
{
|
{
|
||||||
VerticalExpand = true
|
VerticalExpand = true
|
||||||
};
|
};
|
||||||
var nameLabel = new Label {Text = Loc.GetString("Name:")};
|
var nameLabel = new Label { Text = Loc.GetString("Name:") };
|
||||||
_nameEdit = new LineEdit
|
_nameEdit = new LineEdit
|
||||||
{
|
{
|
||||||
MinSize = (270, 0),
|
MinSize = (270, 0),
|
||||||
@@ -122,13 +120,11 @@ namespace Content.Client.UserInterface
|
|||||||
{
|
{
|
||||||
Text = Loc.GetString("Randomize"),
|
Text = Loc.GetString("Randomize"),
|
||||||
};
|
};
|
||||||
nameRandomButton.OnPressed += _ => RandomizeName();
|
nameRandomButton.OnPressed += args => RandomizeName();
|
||||||
hBox.AddChild(nameLabel);
|
nameHBox.AddChild(nameLabel);
|
||||||
hBox.AddChild(_nameEdit);
|
nameHBox.AddChild(_nameEdit);
|
||||||
hBox.AddChild(nameRandomButton);
|
nameHBox.AddChild(nameRandomButton);
|
||||||
panel.AddChild(hBox);
|
randomizePanel.AddChild(nameHBox);
|
||||||
leftColumn.AddChild(panel);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion Name
|
#endregion Name
|
||||||
|
|
||||||
@@ -137,8 +133,22 @@ namespace Content.Client.UserInterface
|
|||||||
|
|
||||||
#region Appearance
|
#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.AddChild(appearanceVBox);
|
||||||
tabContainer.SetTabTitle(0, Loc.GetString("Appearance"));
|
tabContainer.SetTabTitle(0, Loc.GetString("Appearance"));
|
||||||
|
|
||||||
@@ -147,14 +157,13 @@ namespace Content.Client.UserInterface
|
|||||||
SeparationOverride = 10
|
SeparationOverride = 10
|
||||||
};
|
};
|
||||||
|
|
||||||
appearanceVBox.AddChild(sexAndAgeRow);
|
appearanceList.AddChild(sexAndAgeRow);
|
||||||
|
|
||||||
#region Sex
|
#region Sex
|
||||||
|
|
||||||
{
|
var sexPanel = HighlightedContainer();
|
||||||
var panel = HighlightedContainer();
|
var sexHBox = new HBoxContainer();
|
||||||
var hBox = new HBoxContainer();
|
var sexLabel = new Label { Text = Loc.GetString("Sex:") };
|
||||||
var sexLabel = new Label {Text = Loc.GetString("Sex:")};
|
|
||||||
|
|
||||||
var sexButtonGroup = new ButtonGroup();
|
var sexButtonGroup = new ButtonGroup();
|
||||||
|
|
||||||
@@ -188,42 +197,38 @@ namespace Content.Client.UserInterface
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
hBox.AddChild(sexLabel);
|
sexHBox.AddChild(sexLabel);
|
||||||
hBox.AddChild(_sexMaleButton);
|
sexHBox.AddChild(_sexMaleButton);
|
||||||
hBox.AddChild(_sexFemaleButton);
|
sexHBox.AddChild(_sexFemaleButton);
|
||||||
panel.AddChild(hBox);
|
sexPanel.AddChild(sexHBox);
|
||||||
sexAndAgeRow.AddChild(panel);
|
sexAndAgeRow.AddChild(sexPanel);
|
||||||
}
|
|
||||||
|
|
||||||
#endregion Sex
|
#endregion Sex
|
||||||
|
|
||||||
#region Age
|
#region Age
|
||||||
|
|
||||||
{
|
var agePanel = HighlightedContainer();
|
||||||
var panel = HighlightedContainer();
|
var ageHBox = new HBoxContainer();
|
||||||
var hBox = new HBoxContainer();
|
var ageLabel = new Label { Text = Loc.GetString("Age:") };
|
||||||
var ageLabel = new Label {Text = Loc.GetString("Age:")};
|
_ageEdit = new LineEdit { MinSize = (40, 0) };
|
||||||
_ageEdit = new LineEdit {MinSize = (40, 0)};
|
|
||||||
_ageEdit.OnTextChanged += args =>
|
_ageEdit.OnTextChanged += args =>
|
||||||
{
|
{
|
||||||
if (!int.TryParse(args.Text, out var newAge))
|
if (!int.TryParse(args.Text, out var newAge))
|
||||||
return;
|
return;
|
||||||
SetAge(newAge);
|
SetAge(newAge);
|
||||||
};
|
};
|
||||||
hBox.AddChild(ageLabel);
|
ageHBox.AddChild(ageLabel);
|
||||||
hBox.AddChild(_ageEdit);
|
ageHBox.AddChild(_ageEdit);
|
||||||
panel.AddChild(hBox);
|
agePanel.AddChild(ageHBox);
|
||||||
sexAndAgeRow.AddChild(panel);
|
sexAndAgeRow.AddChild(agePanel);
|
||||||
}
|
|
||||||
|
|
||||||
#endregion Age
|
#endregion Age
|
||||||
|
|
||||||
#region Gender
|
#region Gender
|
||||||
|
|
||||||
{
|
var genderPanel = HighlightedContainer();
|
||||||
var panel = HighlightedContainer();
|
var genderHBox = new HBoxContainer();
|
||||||
var hBox = new HBoxContainer();
|
var genderLabel = new Label { Text = Loc.GetString("Pronouns:") };
|
||||||
var genderLabel = new Label {Text = Loc.GetString("Pronouns:")};
|
|
||||||
|
|
||||||
_genderButton = new OptionButton();
|
_genderButton = new OptionButton();
|
||||||
|
|
||||||
@@ -238,22 +243,22 @@ namespace Content.Client.UserInterface
|
|||||||
SetGender((Gender) args.Id);
|
SetGender((Gender) args.Id);
|
||||||
};
|
};
|
||||||
|
|
||||||
hBox.AddChild(genderLabel);
|
genderHBox.AddChild(genderLabel);
|
||||||
hBox.AddChild(_genderButton);
|
genderHBox.AddChild(_genderButton);
|
||||||
panel.AddChild(hBox);
|
genderPanel.AddChild(genderHBox);
|
||||||
sexAndAgeRow.AddChild(panel);
|
sexAndAgeRow.AddChild(genderPanel);
|
||||||
}
|
|
||||||
|
|
||||||
#endregion Gender
|
#endregion Gender
|
||||||
|
|
||||||
#region Hair
|
#region Hair
|
||||||
|
|
||||||
{
|
var hairPanel = HighlightedContainer();
|
||||||
var panel = HighlightedContainer();
|
|
||||||
panel.HorizontalAlignment = HAlignment.Left;
|
|
||||||
var hairHBox = new HBoxContainer();
|
var hairHBox = new HBoxContainer();
|
||||||
|
|
||||||
_hairPicker = new HairStylePicker();
|
_hairPicker = new HairStylePicker
|
||||||
|
{
|
||||||
|
HorizontalAlignment = HAlignment.Center
|
||||||
|
};
|
||||||
_hairPicker.Populate();
|
_hairPicker.Populate();
|
||||||
|
|
||||||
_hairPicker.OnHairStylePicked += newStyle =>
|
_hairPicker.OnHairStylePicked += newStyle =>
|
||||||
@@ -298,18 +303,16 @@ namespace Content.Client.UserInterface
|
|||||||
hairHBox.AddChild(_hairPicker);
|
hairHBox.AddChild(_hairPicker);
|
||||||
hairHBox.AddChild(_facialHairPicker);
|
hairHBox.AddChild(_facialHairPicker);
|
||||||
|
|
||||||
panel.AddChild(hairHBox);
|
hairPanel.AddChild(hairHBox);
|
||||||
appearanceVBox.AddChild(panel);
|
appearanceList.AddChild(hairPanel);
|
||||||
}
|
|
||||||
|
|
||||||
#endregion Hair
|
#endregion Hair
|
||||||
|
|
||||||
#region Clothing
|
#region Clothing
|
||||||
|
|
||||||
{
|
var clothingPanel = HighlightedContainer();
|
||||||
var panel = HighlightedContainer();
|
var clothingHBox = new HBoxContainer();
|
||||||
var hBox = new HBoxContainer();
|
var clothingLabel = new Label { Text = Loc.GetString("Clothing:") };
|
||||||
var clothingLabel = new Label {Text = Loc.GetString("Clothing:")};
|
|
||||||
|
|
||||||
_clothingButton = new OptionButton();
|
_clothingButton = new OptionButton();
|
||||||
|
|
||||||
@@ -322,20 +325,18 @@ namespace Content.Client.UserInterface
|
|||||||
SetClothing((ClothingPreference) args.Id);
|
SetClothing((ClothingPreference) args.Id);
|
||||||
};
|
};
|
||||||
|
|
||||||
hBox.AddChild(clothingLabel);
|
clothingHBox.AddChild(clothingLabel);
|
||||||
hBox.AddChild(_clothingButton);
|
clothingHBox.AddChild(_clothingButton);
|
||||||
panel.AddChild(hBox);
|
clothingPanel.AddChild(clothingHBox);
|
||||||
appearanceVBox.AddChild(panel);
|
appearanceList.AddChild(clothingPanel);
|
||||||
}
|
|
||||||
|
|
||||||
#endregion Clothing
|
#endregion Clothing
|
||||||
|
|
||||||
#region Backpack
|
#region Backpack
|
||||||
|
|
||||||
{
|
var backpackPanel = HighlightedContainer();
|
||||||
var panel = HighlightedContainer();
|
var backpackHBox = new HBoxContainer();
|
||||||
var hBox = new HBoxContainer();
|
var backpackLabel = new Label { Text = Loc.GetString("Backpack:") };
|
||||||
var backpackLabel = new Label {Text = Loc.GetString("Backpack:")};
|
|
||||||
|
|
||||||
_backpackButton = new OptionButton();
|
_backpackButton = new OptionButton();
|
||||||
|
|
||||||
@@ -349,20 +350,41 @@ namespace Content.Client.UserInterface
|
|||||||
SetBackpack((BackpackPreference) args.Id);
|
SetBackpack((BackpackPreference) args.Id);
|
||||||
};
|
};
|
||||||
|
|
||||||
hBox.AddChild(backpackLabel);
|
backpackHBox.AddChild(backpackLabel);
|
||||||
hBox.AddChild(_backpackButton);
|
backpackHBox.AddChild(_backpackButton);
|
||||||
panel.AddChild(hBox);
|
backpackPanel.AddChild(backpackHBox);
|
||||||
appearanceVBox.AddChild(panel);
|
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
|
#region Jobs
|
||||||
|
|
||||||
{
|
|
||||||
var jobList = new VBoxContainer();
|
var jobList = new VBoxContainer();
|
||||||
|
|
||||||
var jobVBox = new VBoxContainer
|
var jobVBox = new VBoxContainer
|
||||||
@@ -476,13 +498,11 @@ namespace Content.Client.UserInterface
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion Jobs
|
||||||
|
|
||||||
#region Antags
|
#region Antags
|
||||||
|
|
||||||
{
|
|
||||||
var antagList = new VBoxContainer();
|
var antagList = new VBoxContainer();
|
||||||
|
|
||||||
var antagVBox = new VBoxContainer
|
var antagVBox = new VBoxContainer
|
||||||
@@ -523,18 +543,16 @@ namespace Content.Client.UserInterface
|
|||||||
IsDirty = true;
|
IsDirty = true;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion Antags
|
||||||
|
|
||||||
var rightColumn = new VBoxContainer();
|
var rightColumn = new VBoxContainer();
|
||||||
middleContainer.AddChild(rightColumn);
|
middleContainer.AddChild(rightColumn);
|
||||||
|
|
||||||
#region Import/Export
|
#region Import/Export
|
||||||
|
|
||||||
{
|
var importExportPanelContainer = HighlightedContainer();
|
||||||
var panelContainer = HighlightedContainer();
|
var importExportHBox = new HBoxContainer();
|
||||||
var hBox = new HBoxContainer();
|
|
||||||
var importButton = new Button
|
var importButton = new Button
|
||||||
{
|
{
|
||||||
Text = Loc.GetString("Import"),
|
Text = Loc.GetString("Import"),
|
||||||
@@ -547,11 +565,10 @@ namespace Content.Client.UserInterface
|
|||||||
Disabled = true,
|
Disabled = true,
|
||||||
ToolTip = "Not yet implemented!"
|
ToolTip = "Not yet implemented!"
|
||||||
};
|
};
|
||||||
hBox.AddChild(importButton);
|
importExportHBox.AddChild(importButton);
|
||||||
hBox.AddChild(exportButton);
|
importExportHBox.AddChild(exportButton);
|
||||||
panelContainer.AddChild(hBox);
|
importExportPanelContainer.AddChild(importExportHBox);
|
||||||
rightColumn.AddChild(panelContainer);
|
rightColumn.AddChild(importExportPanelContainer);
|
||||||
}
|
|
||||||
|
|
||||||
#endregion Import/Export
|
#endregion Import/Export
|
||||||
|
|
||||||
@@ -571,7 +588,7 @@ namespace Content.Client.UserInterface
|
|||||||
|
|
||||||
#endregion Save
|
#endregion Save
|
||||||
|
|
||||||
#endregion
|
#endregion Left
|
||||||
|
|
||||||
#region Right
|
#region Right
|
||||||
|
|
||||||
@@ -621,7 +638,7 @@ namespace Content.Client.UserInterface
|
|||||||
};
|
};
|
||||||
box.AddChild(_previewSpriteSide);
|
box.AddChild(_previewSpriteSide);
|
||||||
|
|
||||||
#endregion
|
#endregion Right
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -757,6 +774,11 @@ namespace Content.Client.UserInterface
|
|||||||
Profile.Appearance.FacialHairStyleName);
|
Profile.Appearance.FacialHairStyleName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void UpdateEyePickers()
|
||||||
|
{
|
||||||
|
_eyesPicker.SetData(Profile.Appearance.EyeColor);
|
||||||
|
}
|
||||||
|
|
||||||
private void UpdateSaveButton()
|
private void UpdateSaveButton()
|
||||||
{
|
{
|
||||||
_saveButton.Disabled = Profile is null || !IsDirty;
|
_saveButton.Disabled = Profile is null || !IsDirty;
|
||||||
@@ -781,6 +803,7 @@ namespace Content.Client.UserInterface
|
|||||||
UpdateBackpackControls();
|
UpdateBackpackControls();
|
||||||
UpdateAgeEdit();
|
UpdateAgeEdit();
|
||||||
UpdateHairPickers();
|
UpdateHairPickers();
|
||||||
|
UpdateEyePickers();
|
||||||
UpdateSaveButton();
|
UpdateSaveButton();
|
||||||
UpdateJobPriorities();
|
UpdateJobPriorities();
|
||||||
UpdateAntagPreferences();
|
UpdateAntagPreferences();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
#nullable enable
|
#nullable enable
|
||||||
using Content.Server.GameObjects.Components.Mobs;
|
using Content.Server.GameObjects.Components.Mobs;
|
||||||
using Content.Server.Utility;
|
using Content.Server.Utility;
|
||||||
using Content.Shared.GameObjects.Components;
|
using Content.Shared.GameObjects.Components;
|
||||||
@@ -83,6 +83,14 @@ namespace Content.Server.GameObjects.Components
|
|||||||
looks.Appearance = looks.Appearance.WithHairColor(color);
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -103,7 +111,7 @@ namespace Content.Server.GameObjects.Components
|
|||||||
UserInterface?.Toggle(actor.playerSession);
|
UserInterface?.Toggle(actor.playerSession);
|
||||||
|
|
||||||
var msg = new MagicMirrorInitialDataMessage(looks.Appearance.HairColor, looks.Appearance.FacialHairColor, looks.Appearance.HairStyleName,
|
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);
|
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]
|
[Serializable, NetSerializable]
|
||||||
public class MagicMirrorInitialDataMessage : BoundUserInterfaceMessage
|
public class MagicMirrorInitialDataMessage : BoundUserInterfaceMessage
|
||||||
{
|
{
|
||||||
@@ -49,13 +60,15 @@ namespace Content.Shared.GameObjects.Components
|
|||||||
public readonly Color FacialHairColor;
|
public readonly Color FacialHairColor;
|
||||||
public readonly string HairName;
|
public readonly string HairName;
|
||||||
public readonly string FacialHairName;
|
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;
|
HairColor = hairColor;
|
||||||
FacialHairColor = facialHairColor;
|
FacialHairColor = facialHairColor;
|
||||||
HairName = hairName;
|
HairName = hairName;
|
||||||
FacialHairName = facialHairName;
|
FacialHairName = facialHairName;
|
||||||
|
EyeColor = eyeColor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user