Files
LuaCsForBarotraumaEP/Barotrauma/BarotraumaClient/ClientSource/Settings/MultiplayerPreferences.cs
2022-02-26 02:43:01 +09:00

112 lines
4.6 KiB
C#

#nullable enable
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Xml.Linq;
using Barotrauma.Extensions;
using Microsoft.Xna.Framework;
namespace Barotrauma
{
class MultiplayerPreferences
{
public readonly struct JobPreference
{
public JobPreference(Identifier jobIdentifier, int variant)
{
JobIdentifier = jobIdentifier;
Variant = variant;
}
public JobPreference(XElement element) : this(
element.GetAttributeIdentifier("identifier", Identifier.Empty),
element.GetAttributeInt("variant", -1)) { }
public readonly Identifier JobIdentifier;
public readonly int Variant;
public static bool operator ==(JobPreference a, JobPreference b)
=> a.JobIdentifier == b.JobIdentifier && a.Variant == b.Variant;
public static bool operator !=(JobPreference a, JobPreference b) => !(a == b);
public override bool Equals(object? obj)
=> obj is JobPreference jp && jp == this;
public bool Equals(JobPreference other) => other == this;
public override int GetHashCode() => HashCode.Combine(JobIdentifier, Variant);
}
public readonly List<JobPreference> JobPreferences = new List<JobPreference>();
public CharacterTeamType TeamPreference;
public string PlayerName = string.Empty;
public readonly HashSet<Identifier> TagSet = new HashSet<Identifier>();
public int HairIndex = -1;
public int BeardIndex = -1;
public int MoustacheIndex = -1;
public int FaceAttachmentIndex = -1;
public Color HairColor = Color.Black;
public Color FacialHairColor = Color.Black;
public Color SkinColor = Color.Black;
public static MultiplayerPreferences Instance { get; private set; } = new MultiplayerPreferences();
private MultiplayerPreferences() { }
private MultiplayerPreferences(IEnumerable<XElement> elements)
{
foreach (var element in elements)
{
PlayerName = element.GetAttributeString("name", PlayerName);
TagSet.UnionWith(element.GetAttributeIdentifierArray("tags", Array.Empty<Identifier>()));
HairIndex = element.GetAttributeInt(nameof(HairIndex), HairIndex);
BeardIndex = element.GetAttributeInt(nameof(BeardIndex), BeardIndex);
MoustacheIndex = element.GetAttributeInt(nameof(MoustacheIndex), MoustacheIndex);
FaceAttachmentIndex = element.GetAttributeInt(nameof(FaceAttachmentIndex), FaceAttachmentIndex);
HairColor = element.GetAttributeColor(nameof(HairColor), HairColor);
FacialHairColor = element.GetAttributeColor(nameof(FacialHairColor), FacialHairColor);
SkinColor = element.GetAttributeColor(nameof(SkinColor), SkinColor);
foreach (var subElement in element.GetChildElements("job"))
{
JobPreferences.Add(new JobPreference(subElement));
}
}
}
public static void Init(params XElement?[] elements)
{
Instance = new MultiplayerPreferences(elements.Where(e => e != null)!);
}
public void SaveTo(XElement element)
{
element.SetAttributeValue("name", PlayerName);
element.SetAttributeValue("tags", string.Join(",", TagSet));
element.SetAttributeValue(nameof(HairIndex), HairIndex);
element.SetAttributeValue(nameof(BeardIndex), BeardIndex);
element.SetAttributeValue(nameof(MoustacheIndex), MoustacheIndex);
element.SetAttributeValue(nameof(FaceAttachmentIndex), FaceAttachmentIndex);
element.SetAttributeValue(nameof(HairColor), HairColor.ToStringHex());
element.SetAttributeValue(nameof(FacialHairColor), FacialHairColor.ToStringHex());
element.SetAttributeValue(nameof(SkinColor), SkinColor.ToStringHex());
foreach (var jobPreference in JobPreferences)
{
element.Add(new XElement("job",
new XAttribute("identifier", jobPreference.JobIdentifier.Value),
new XAttribute("variant", jobPreference.Variant.ToString(CultureInfo.InvariantCulture))));
}
}
public bool AreJobPreferencesEqual(IReadOnlyList<JobPreference> other)
=> JobPreferences.SequenceEqual(other);
}
}