using Server.Gumps; using Server.Mobiles; namespace Server.Factions; public class FactionStone : BaseSystemController { private Faction m_Faction; [Constructible] public FactionStone(Faction faction = null) : base(0xEDC) { Movable = false; Faction = faction; } public FactionStone(Serial serial) : base(serial) { } [CommandProperty(AccessLevel.Counselor, AccessLevel.Administrator)] public Faction Faction { get => m_Faction; set { m_Faction = value; AssignName(m_Faction?.Definition.FactionStoneName); } } public override string DefaultName => "faction stone"; public override void OnDoubleClick(Mobile from) { if (m_Faction == null) { return; } if (!from.InRange(GetWorldLocation(), 2)) { from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that. } else if (FactionGump.Exists(from)) { from.SendLocalizedMessage(1042160); // You already have a faction menu open. } else if (from is PlayerMobile mobile) { var existingFaction = Faction.Find(mobile); if (existingFaction == m_Faction || mobile.AccessLevel >= AccessLevel.GameMaster) { var pl = PlayerState.Find(mobile); if (pl?.IsLeaving == true) { // You cannot use the faction stone until you have finished quitting your current faction mobile.SendLocalizedMessage(1005051); } else { mobile.SendGump(new FactionStoneGump(mobile, m_Faction)); } } else if (existingFaction != null) { // TODO: Validate mobile.SendLocalizedMessage(1005053); // This is not your faction stone! } else { mobile.SendGump(new JoinStoneGump(mobile, m_Faction)); } } } public override void Serialize(IGenericWriter writer) { base.Serialize(writer); writer.Write(0); // version Faction.WriteReference(writer, m_Faction); } public override void Deserialize(IGenericReader reader) { base.Deserialize(reader); var version = reader.ReadInt(); switch (version) { case 0: { Faction = Faction.ReadReference(reader); break; } } } }