using System; using ModernUO.Serialization; using Server.Gumps; using Server.Mobiles; using Server.Network; namespace Server.Items; [Flippable(0xA57, 0xA58, 0xA59)] [SerializationGenerator(0)] public partial class Bedroll : Item { [Constructible] public Bedroll() : base(0xA57) => Weight = 5.0; public override void OnDoubleClick(Mobile from) { if (Parent != null || !VerifyMove(from)) { return; } if (!from.InRange(this, 2)) { from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that. return; } if (ItemID == 0xA57) // rolled { var dir = PlayerMobile.GetDirection4(from.Location, Location); if (dir is Direction.North or Direction.South) { ItemID = 0xA55; } else { ItemID = 0xA56; } } else // unrolled { ItemID = 0xA57; if (!from.HasGump()) { var entry = Campfire.GetEntry(from); if (entry?.Safe == true) { from.SendGump(new LogoutGump(entry, this)); } } } } private class LogoutGump : Gump { private Bedroll _dedroll; private TimerExecutionToken _closeTimerToken; private CampfireEntry _entry; public LogoutGump(CampfireEntry entry, Bedroll bedroll) : base(100, 0) { _entry = entry; _dedroll = bedroll; Timer.StartTimer(TimeSpan.FromSeconds(10.0), CloseGump, out _closeTimerToken); AddBackground(0, 0, 400, 350, 0xA28); AddHtmlLocalized(100, 20, 200, 35, 1011015); //
Logging out via camping
/* Using a bedroll in the safety of a camp will log you out of the game safely. * If this is what you wish to do choose CONTINUE and you will be logged out. * Otherwise, select the CANCEL button to avoid logging out at this time. * The camp will remain secure for 10 seconds at which time this window will close * and you not be logged out. */ AddHtmlLocalized(50, 55, 300, 140, 1011016, true, true); AddButton(45, 298, 0xFA5, 0xFA7, 1); AddHtmlLocalized(80, 300, 110, 35, 1011011); // CONTINUE AddButton(200, 298, 0xFA5, 0xFA7, 0); AddHtmlLocalized(235, 300, 110, 35, 1011012); // CANCEL } public override void OnResponse(NetState sender, in RelayInfo info) { var pm = _entry.Player; _closeTimerToken.Cancel(); if (Campfire.GetEntry(pm) != _entry) { return; } if (info.ButtonID == 1 && _entry.Safe && _dedroll.Parent == null && _dedroll.IsAccessibleTo(pm) && _dedroll.VerifyMove(pm) && _dedroll.Map == pm.Map && pm.InRange(_dedroll, 2)) { pm.PlaceInBackpack(_dedroll); pm.BedrollLogout = true; sender.Disconnect("Used a bedroll to log out."); } Campfire.RemoveEntry(_entry); } private void CloseGump() { Campfire.RemoveEntry(_entry); _entry.Player.CloseGump(); } } }