using System; using Server.Accounting; using Server.ContextMenus; using Server.Gumps; using Server.Mobiles; using Server.Network; using Server.Targeting; using System.Collections.Generic; namespace Server.Items { public class PetWhistle : Item { public override int LabelNumber { get { return 1126239; } } // whistle [CommandProperty(AccessLevel.GameMaster)] public DateTime NextLinkedTime { get; set; } [CommandProperty(AccessLevel.GameMaster)] public string Account { get; set; } [CommandProperty(AccessLevel.GameMaster)] public BaseCreature PetLinked { get; set; } [CommandProperty(AccessLevel.GameMaster)] public bool IsUsable { get { return NextLinkedTime < DateTime.UtcNow; } } [Constructable] public PetWhistle() : base(0xA4E7) { LootType = LootType.Blessed; } public PetWhistle(Serial serial) : base(serial) { } public override void OnDoubleClick(Mobile from) { if (!string.IsNullOrEmpty(Account)) { Account acct = from.Account as Account; if (acct == null || acct.Username != Account) { from.SendLocalizedMessage(1151920); // This item is Account Bound, you are not permitted to take this action. return; } } if (IsChildOf(from.Backpack)) { if (PetLinked != null) { from.CloseGump(typeof(PetWhistleGump)); from.SendGump(new PetWhistleGump(this)); } else { from.SendLocalizedMessage(1159390); // Target a bonded pet to link this whistle. from.Target = new InternalTarget(this); } } else { from.SendLocalizedMessage(1062334); // This item must be in your backpack to be used. } } public override void GetProperties(ObjectPropertyList list) { base.GetProperties(list); if (PetLinked != null) list.Add(1159360, PetLinked.Name); // Pet Whistle for ~1_name~ if (!string.IsNullOrEmpty(Account)) list.Add(1155526); // Account Bound } public override void GetContextMenuEntries(Mobile from, List list) { base.GetContextMenuEntries(from, list); list.Add(new LinkBondedPetEntry(from, this)); } private class LinkBondedPetEntry : ContextMenuEntry { private readonly PetWhistle _Item; private readonly Mobile m_From; public LinkBondedPetEntry(Mobile from, PetWhistle item) : base(1159393, 6) // Link Bonded Pet { m_From = from; _Item = item; Enabled = _Item.IsUsable; } public override void OnClick() { if (m_From == null || _Item.Deleted) return; if (_Item.IsChildOf(m_From.Backpack)) { m_From.SendLocalizedMessage(1159390); // Target a bonded pet to link this whistle. m_From.Target = new InternalTarget(_Item); } else { m_From.SendLocalizedMessage(1062334); // This item must be in your backpack to be used. } } } private class InternalTarget : Target { private readonly PetWhistle _Item; public InternalTarget(PetWhistle item) : base(12, true, TargetFlags.None) { _Item = item; } protected override void OnTarget(Mobile from, object targeted) { if (_Item.Deleted) return; if (!_Item.IsChildOf(from.Backpack)) { from.SendLocalizedMessage(1060640); // The item must be in your backpack to use it. return; } if (targeted is BaseCreature && ((BaseCreature)targeted).ControlMaster == from) { if (((BaseCreature)targeted).IsBonded) { if (_Item.IsUsable) { _Item.PetLinked = (BaseCreature)targeted; _Item.NextLinkedTime = DateTime.UtcNow + TimeSpan.FromDays(7); _Item.InvalidateProperties(); from.CloseGump(typeof(PetWhistleGump)); from.SendGump(new PetWhistleGump(_Item)); } else { if ((DateTime.UtcNow -_Item.NextLinkedTime).Seconds > 60) { from.SendLocalizedMessage(1159391); // You must wait ~1_minutes~ minutes before you can link another pet to this whistle. } else { from.SendLocalizedMessage(1159392); // You must wait ~1_seconds~ seconds before you can link another pet to this whistle. } } } else { from.SendLocalizedMessage(1159373); // This item can only be linked to a bonded pet. } } else { from.SendLocalizedMessage(1149667); // Invalid target. } } } public class PetWhistleGump : Gump { private readonly PetWhistle _Item; public PetWhistleGump(PetWhistle item) : base(100, 100) { _Item = item; AddPage(0); AddBackground(0, 0, 255, 260, 0x5B4); AddAlphaRegion(0, 0, 255, 260); AddItem(100, 39, 42215); AddHtmlLocalized(81, 73, 157, 22, 1159405, 0x76F2, false, false); // Attack AddButton(41, 73, 0xFA5, 0xFA6, 1000, GumpButtonType.Reply, 0); AddHtmlLocalized(81, 97, 157, 22, 1159407, 0x76F2, false, false); // Block AddButton(41, 97, 0xFA5, 0xFA6, 1002, GumpButtonType.Reply, 0); AddHtmlLocalized(81, 121, 157, 22, 1159375, 0x76F2, false, false); // Play Dead AddButton(41, 121, 0xFA5, 0xFA6, 1003, GumpButtonType.Reply, 0); AddHtmlLocalized(81, 145, 157, 22, 1159378, 0x76F2, false, false); // Settle Down AddButton(41, 145, 0xFA5, 0xFA6, 1004, GumpButtonType.Reply, 0); AddHtmlLocalized(81, 169, 157, 22, 1159377, 0x76F2, false, false); // Wait AddButton(41, 169, 0xFA5, 0xFA6, 1005, GumpButtonType.Reply, 0); AddHtmlLocalized(81, 193, 157, 22, 1159406, 0x76F2, false, false); // Eat AddButton(41, 193, 0xFA5, 0xFA6, 1006, GumpButtonType.Reply, 0); AddHtmlLocalized(81, 217, 157, 22, 1159388, 0x76F2, false, false); // What's that? AddButton(41, 217, 0xFA5, 0xFA6, 1008, GumpButtonType.Reply, 0); AddHtmlLocalized(40, 15, 200, 18, 1159360, item.PetLinked.Name, 0x6A05, false, false); // Pet Whistle for ~1_name~ } public override void OnResponse(NetState sender, RelayInfo info) { if (_Item.Deleted ||_Item.PetLinked == null) return; Mobile m = sender.Mobile; if (_Item.PetLinked.ControlOrder != OrderType.Stay || _Item.PetLinked.ControlMaster != m) m.SendLocalizedMessage(1159389); // You must command your pet to stay before using this item. Effects.PlaySound(m.Location, m.Map, 1665); switch (info.ButtonID) { case 1000: _Item.PetLinked.Animate(AnimationType.Attack, 0); break; case 1002: _Item.PetLinked.Animate(AnimationType.Block, 0); break; case 1003: _Item.PetLinked.Animate(AnimationType.Die, 0); break; case 1004: _Item.PetLinked.Animate(AnimationType.Impact, 0); break; case 1005: _Item.PetLinked.Animate(AnimationType.Fidget, 0); break; case 1006: _Item.PetLinked.Animate(AnimationType.Eat, 0); break; case 1008: _Item.PetLinked.Animate(AnimationType.Alert, 0); break; } } } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write(0); writer.Write(Account); writer.Write(NextLinkedTime); writer.Write(PetLinked); } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); Account = reader.ReadString(); NextLinkedTime = reader.ReadDateTime(); PetLinked = (BaseCreature)reader.ReadMobile(); } } }