using System; using System.Collections.Generic; using System.Linq; using Server.ContextMenus; using Server.Engines.Points; namespace Server.Items { [FlipableAddon(Direction.South, Direction.East)] public class EnormousVenusFlytrapAddon : BaseAddonContainer { public override int LabelNumber { get { return 1154462; } } // Enormous Venus Flytrap public override bool Security { get { return false; } } public override int DefaultGumpID { get { return 0x9; } } private Timer m_Timer; private List m_Cleanup; public override BaseAddonContainerDeed Deed { get { return new EnormousVenusFlytrapAddonDeed(Hue); } } [Constructable] public EnormousVenusFlytrapAddon(int hue) : base(0x9967) { Direction = Direction.South; Hue = hue; m_Cleanup = new List(); } public virtual void Flip(Mobile from, Direction direction) { switch (direction) { case Direction.East: ItemID = 0x9968; break; case Direction.South: ItemID = 0x9967; break; } } public EnormousVenusFlytrapAddon(Serial serial) : base(serial) { } public override bool OnDragDrop(Mobile from, Item dropped) { if (!base.OnDragDrop(from, dropped)) return false; AddCleanupItem(from, dropped); SendLocalizedMessageTo(from, 1154485); // The item will be digested in three minutes. if (m_Timer != null) m_Timer.Stop(); m_Timer = Timer.DelayCall(TimeSpan.FromMinutes(3), new TimerCallback(Empty)); return true; } public override bool OnDragDropInto(Mobile from, Item item, Point3D p) { if (!base.OnDragDropInto(from, item, p)) return false; AddCleanupItem(from, item); SendLocalizedMessageTo(from, 1154485); // The item will be digested in three minutes. if (m_Timer != null) m_Timer.Stop(); m_Timer = Timer.DelayCall(TimeSpan.FromMinutes(3), new TimerCallback(Empty)); return true; } public void Empty() { List items = Items; if (items.Count > 0) { PublicOverheadMessage(Network.MessageType.Regular, 0x3B2, Utility.Random(1042891, 8), ""); for (int i = items.Count - 1; i >= 0; --i) { if (i >= items.Count) continue; ConfirmCleanupItem(items[i]); items[i].Delete(); } if (m_Cleanup.Any(x => x.mobiles != null)) { foreach (var m in m_Cleanup.Select(x => x.mobiles).Distinct()) { if (m_Cleanup.Find(x => x.mobiles == m && x.confirm) != null) { double point = m_Cleanup.Where(x => x.mobiles == m && x.confirm).Sum(x => x.points); m.SendLocalizedMessage(1151280, String.Format("{0}\t{1}", point.ToString(), m_Cleanup.Count(r => r.mobiles == m))); // You have received approximately ~1_VALUE~points for turning in ~2_COUNT~items for Clean Up Britannia. PointsSystem.CleanUpBritannia.AwardPoints(m, point); } } m_Cleanup.Clear(); } } if (m_Timer != null) m_Timer.Stop(); m_Timer = null; } public virtual bool AddCleanupItem(Mobile from, Item item) { if (!CleanUpBritanniaData.Enabled) { return false; } double checkbagpoint; bool added = false; if (item is BaseContainer) { Container c = (Container)item; List list = c.FindItemsByType(); for (int i = list.Count - 1; i >= 0; --i) { checkbagpoint = CleanUpBritanniaData.GetPoints(list[i]); if (checkbagpoint > 0 && m_Cleanup.Find(x => x.serials == list[i].Serial) == null) { m_Cleanup.Add(new CleanupArray { mobiles = from, items = list[i], points = checkbagpoint, serials = list[i].Serial }); if (!added) added = true; } } } else { checkbagpoint = CleanUpBritanniaData.GetPoints(item); if (checkbagpoint > 0 && m_Cleanup.Find(x => x.serials == item.Serial) == null) { m_Cleanup.Add(new CleanupArray { mobiles = from, items = item, points = checkbagpoint, serials = item.Serial }); added = true; } } return added; } public void ConfirmCleanupItem(Item item) { if (item is BaseContainer) { Container c = (Container)item; List list = c.FindItemsByType(); m_Cleanup.Where(r => list.Select(k => k.Serial).Contains(r.items.Serial)).ToList().ForEach(k => k.confirm = true); } else { m_Cleanup.Where(r => r.items.Serial == item.Serial).ToList().ForEach(k => k.confirm = true); } } public override void GetContextMenuEntries(Mobile from, List list) { base.GetContextMenuEntries(from, list); if (CleanUpBritanniaData.Enabled) { list.Add(new AppraiseforCleanup(from)); } } private class AppraiseforCleanup : ContextMenuEntry { private readonly Mobile m_Mobile; public AppraiseforCleanup(Mobile mobile) : base(1151298, 12) // Appraise for Cleanup { m_Mobile = mobile; } public override void OnClick() { m_Mobile.Target = new AppraiseforCleanupTarget(m_Mobile); m_Mobile.SendLocalizedMessage(1151299); // Target items to see how many Clean Up Britannia points you will receive for throwing them away. Continue targeting items until done, then press the ESC key to cancel the targeting cursor. } } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write(0); // Version } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); if (Items.Count > 0) m_Timer = Timer.DelayCall(TimeSpan.FromMinutes(3), new TimerCallback(Empty)); m_Cleanup = new List(); } } public class EnormousVenusFlytrapAddonDeed : BaseAddonContainerDeed { public override int LabelNumber { get { return 1154462; } } // Enormous Venus Flytrap public override BaseAddonContainer Addon { get { return new EnormousVenusFlytrapAddon(Hue); } } [Constructable] public EnormousVenusFlytrapAddonDeed() : this(Utility.RandomList(26, 33, 233, 1931, 2067)) { } [Constructable] public EnormousVenusFlytrapAddonDeed(int hue) { Hue = hue; LootType = LootType.Blessed; } public EnormousVenusFlytrapAddonDeed(Serial serial) : base(serial) { } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write(0); // Version } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); } } }