using System; using ModernUO.Serialization; namespace Server.Items; public enum TrophyRank { Bronze, Silver, Gold } public static class TrophyRankExtensions { /// /// Returns a static lowercase string for the given value. /// Avoids the two-allocation rank.ToString().ToLower() pattern at interpolation sites. /// public static string LowerName(this TrophyRank rank) => rank switch { TrophyRank.Bronze => "bronze", TrophyRank.Silver => "silver", TrophyRank.Gold => "gold", _ => rank.ToString().ToLowerInvariant() }; } [Flippable(5020, 4647)] [SerializationGenerator(2, false)] public partial class Trophy : Item { [SerializableField(0)] [SerializedCommandProperty(AccessLevel.GameMaster)] private string _title; [SerializableField(2)] [SerializedCommandProperty(AccessLevel.GameMaster)] private Mobile _owner; [SerializableField(3, setter: "private")] [SerializedCommandProperty(AccessLevel.GameMaster)] private DateTime _date; public override string DefaultName => $"{GetRankName(_rank)} trophy"; private static string GetRankName(TrophyRank rank) => rank switch { TrophyRank.Silver => "silver", TrophyRank.Gold => "gold", _ => "bronze" }; [Constructible] public Trophy(string title, TrophyRank rank) : base(5020) { _title = title; _rank = rank; _date = Core.Now; LootType = LootType.Blessed; UpdateStyle(); } [SerializableField(1, fieldChanged: nameof(OnRankChanged))] [SerializedCommandProperty(AccessLevel.GameMaster)] private TrophyRank _rank; private void OnRankChanged(TrophyRank oldValue, TrophyRank newValue) { UpdateStyle(); } private void Deserialize(IGenericReader reader, int version) { _title = reader.ReadString(); _rank = (TrophyRank)reader.ReadInt(); _owner = reader.ReadEntity(); _date = reader.ReadDateTime(); } public override void OnAdded(IEntity parent) { base.OnAdded(parent); Owner ??= RootParent as Mobile; } public override void GetProperties(IPropertyList list) { if (Owner != null) { list.Add($"{Title} -- {Owner.RawName}"); } else if (Title != null) { list.Add(Title); } if (Date != DateTime.MinValue) { list.Add(Date.ToString("d")); } } public override void OnSingleClick(Mobile from) { base.OnSingleClick(from); if (Owner != null) { LabelTo(from, $"{Title} -- {Owner.RawName}"); } else if (Title != null) { LabelTo(from, Title); } if (Date != DateTime.MinValue) { LabelTo(from, Date.ToString("d")); } } public void UpdateStyle() { Hue = _rank switch { TrophyRank.Gold => 2213, TrophyRank.Silver => 0, _ => 2206, // bronze }; } }