using System; using Server; using Server.Targeting; using Server.Prompts; namespace Server.Items { public class Bait : Item { public static readonly bool UsePrompt = true; private Type m_BaitType; private object m_Label; private int m_UsesRemaining; private int m_Index; private bool m_Enhanced; [CommandProperty(AccessLevel.GameMaster)] public Type BaitType { get { return m_BaitType; } } [CommandProperty(AccessLevel.GameMaster)] public int UsesRemaining { get { return m_UsesRemaining; } set { m_UsesRemaining = value; InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public int Index { get { return m_Index; } set { m_Index = value; if (value < 0) m_Index = 0; if (value >= FishInfo.FishInfos.Count) m_Index = FishInfo.FishInfos.Count - 1; m_BaitType = FishInfo.GetTypeFromIndex(m_Index); Hue = FishInfo.GetFishHue(m_Index); m_Label = FishInfo.GetFishLabel(m_Index); InvalidateProperties(); } } [CommandProperty(AccessLevel.GameMaster)] public bool Enhanced { get { return m_Enhanced; } set { m_Enhanced = value; InvalidateProperties(); } } [Constructable] public Bait(int index) : base(2454) { Index = index; m_UsesRemaining = 1; } [Constructable] public Bait() : base(2454) { m_UsesRemaining = 1; } public override void OnDoubleClick(Mobile from) { if (IsChildOf(from.Backpack)) { if (UsePrompt && m_UsesRemaining > 1) { from.SendMessage("How much bait would you like to use?"); from.Prompt = new InternalPrompt(this); } else { from.Target = new InternalTarget(this, 1); from.SendMessage("Target the fishing pole or lobster trap that you would like to apply the bait to."); } } } public void TryBeginTarget(Mobile from, int amount) { if (amount < 0) amount = 1; if (amount > m_UsesRemaining) amount = m_UsesRemaining; from.Target = new InternalTarget(this, amount); from.SendMessage("Target the fishing pole or lobster trap that you would like to apply the bait to."); } public override void AddNameProperty(ObjectPropertyList list) { object label = FishInfo.GetFishLabel(m_Index); if (m_Enhanced) { //~1_token~ ~2_token~ bait if (label is int) list.Add(1116464, "#{0}\t#{1}", 1116470, (int)label); else if (label is string) list.Add(1116464, "#{0}\t{1}", 1116470, (string)label); } else if (label is int) list.Add(1116465, String.Format("#{0}", (int)label)); //~1_token~ bait else if (label is string) list.Add(1116465, (string)label); } public override void GetProperties(ObjectPropertyList list) { base.GetProperties(list); list.Add(1116466, m_UsesRemaining.ToString()); //amount: ~1_val~ } private class InternalPrompt : Prompt { private Bait m_Bait; public InternalPrompt(Bait bait) { m_Bait = bait; } public override void OnResponse(Mobile from, string text) { int amount = Utility.ToInt32( text ); m_Bait.TryBeginTarget(from, amount); } public override void OnCancel(Mobile from) { from.SendMessage("Not applying bait..."); } } private class InternalTarget : Target { private Bait m_Bait; private int m_Amount; public InternalTarget(Bait bait, int amount) : base(0, false, TargetFlags.None) { m_Bait = bait; m_Amount = amount; } protected override void OnTarget(Mobile from, object targeted) { if (targeted == m_Bait) return; if (targeted is FishingPole) { if (!m_Bait.IsFishBait()) { from.SendMessage("Think again before applying lobster or crab bait to a fishing pole!"); return; } FishingPole pole = (FishingPole)targeted; bool hasBait = pole.BaitType != null; if (hasBait && pole.BaitType != m_Bait.BaitType) from.SendMessage("You swap out the old bait for new."); if (pole.BaitType == m_Bait.BaitType) pole.BaitUses += m_Amount; else { pole.BaitType = m_Bait.BaitType; pole.BaitUses += m_Amount; } if (m_Bait.Enhanced) pole.EnhancedBait = true; from.SendLocalizedMessage(1149759); //You bait the hook. m_Bait.UsesRemaining -= m_Amount; } else if (targeted is LobsterTrap) { if (m_Bait.IsFishBait()) { from.SendMessage("Think again before applying fish bait to a lobster trap!"); return; } LobsterTrap trap = (LobsterTrap)targeted; bool hasBait = trap.BaitType != null; trap.BaitType = m_Bait.BaitType; //trap.Hue = m_Bait.Hue; if (hasBait && trap.BaitType != m_Bait.BaitType) from.SendMessage("You swap out the old bait for new."); if (trap.BaitType == m_Bait.BaitType) trap.BaitUses += m_Amount; else { trap.BaitType = m_Bait.BaitType; trap.BaitUses += m_Amount; } if (m_Bait.Enhanced) trap.EnhancedBait = true; from.SendLocalizedMessage(1149760); //You bait the trap. m_Bait.UsesRemaining -= m_Amount; } else if (targeted is Bait && ((Bait)targeted).IsChildOf(from.Backpack) && ((Bait)targeted).BaitType == m_Bait.BaitType) { Bait bait = (Bait)targeted; bait.UsesRemaining += m_Amount; m_Bait.UsesRemaining -= m_Amount; if (m_Bait.UsesRemaining <= 0) { m_Bait.Delete(); from.SendLocalizedMessage(1116469); //You combine these baits into one cup and destroy the other cup. } else from.SendMessage("You combine these baits into one cup."); return; } if (m_Bait.UsesRemaining <= 0) { m_Bait.Delete(); from.SendLocalizedMessage(1116467); //Your bait is used up so you destroy the container. } } } public bool IsFishBait() { if (m_BaitType == null) Index = Utility.RandomMinMax(0, 34); return !m_BaitType.IsSubclassOf(typeof(BaseCrabAndLobster)); } public Bait(Serial serial) : base(serial) { } public override void Serialize(GenericWriter writer) { base.Serialize(writer); writer.Write((int)0); writer.Write(m_UsesRemaining); writer.Write(m_Index); writer.Write(m_Enhanced); } public override void Deserialize(GenericReader reader) { base.Deserialize(reader); int version = reader.ReadInt(); m_UsesRemaining = reader.ReadInt(); m_Index = reader.ReadInt(); m_Enhanced = reader.ReadBool(); if (m_Index < 0) m_Index = 0; if (m_Index >= FishInfo.FishInfos.Count) m_Index = FishInfo.FishInfos.Count - 1; m_BaitType = FishInfo.FishInfos[m_Index].Type; //Hue = FishInfo.FishInfos[m_Index].Hue; m_Label = FishInfo.GetFishLabel(m_Index); } } }