using System; namespace Server.Factions { public interface IFactionItem { FactionItem FactionItemState{ get; set; } } public class FactionItem { public static readonly TimeSpan ExpirationPeriod = TimeSpan.FromDays(21.0); public FactionItem(Item item, Faction faction) { Item = item; Faction = faction; } public FactionItem(GenericReader reader, Faction faction) { int version = reader.ReadEncodedInt(); switch (version) { case 0: { Item = reader.ReadItem(); Expiration = reader.ReadDateTime(); break; } } Faction = faction; } public Item Item{ get; } public Faction Faction{ get; } public DateTime Expiration{ get; private set; } public bool HasExpired { get { if (Item?.Deleted != false) return true; return Expiration != DateTime.MinValue && DateTime.UtcNow >= Expiration; } } public void StartExpiration() { Expiration = DateTime.UtcNow + ExpirationPeriod; } public void CheckAttach() { if (!HasExpired) Attach(); else Detach(); } public void Attach() { if (Item is IFactionItem item) item.FactionItemState = this; Faction?.State.FactionItems.Add(this); } public void Detach() { if (Item is IFactionItem item) item.FactionItemState = null; if (Faction?.State.FactionItems.Contains(this) == true) Faction.State.FactionItems.Remove(this); } public void Serialize(GenericWriter writer) { writer.WriteEncodedInt(0); writer.Write(Item); writer.Write(Expiration); } public static int GetMaxWearables(Mobile mob) { PlayerState pl = PlayerState.Find(mob); return pl == null ? 0 : pl.Faction.IsCommander(mob) ? 9 : pl.Rank.MaxWearables; } public static FactionItem Find(Item item) { if (item is IFactionItem factionItem) { FactionItem state = factionItem.FactionItemState; if (state?.HasExpired == true) { state.Detach(); state = null; } return state; } return null; } public static Item Imbue(Item item, Faction faction, bool expire, int hue) { if (!(item is IFactionItem)) return item; FactionItem state = Find(item); if (state == null) { state = new FactionItem(item, faction); state.Attach(); } if (expire) state.StartExpiration(); item.Hue = hue; return item; } } }