Esempio n. 1
0
        private static void GenerateHonestyItems()
        {
            var lstCopy = new List <Item>(_HonestyItems);

            foreach (Item i in lstCopy)
            {
                if (ItemFlags.GetTaken(i) && _HonestyItems.Contains(i))
                {
                    _HonestyItems.Remove(i);
                }
            }

            if (_HonestyItems.Count < 1000)
            {
                int spawnamount = _HonestyItems.Count + 50 > 1000 ? _HonestyItems.Count % 50 : 50;

                for (int i = 0; i < spawnamount; i++)
                {
                    Item toSpawn = Loot.RandomArmorOrShieldOrWeapon();
                    ItemFlags.SetTaken(toSpawn, false);
                    toSpawn.HonestyItem = true;
                    PlaceItemOnWorld(toSpawn);
                    _HonestyItems.Add(toSpawn);
                }
            }
        }
Esempio n. 2
0
        public override bool TryDropItem(Mobile from, Item dropped, bool sendFullMessage)
        {
            if (from == mOwner.Owner)
            {
                if (!CheckHold(from, dropped, sendFullMessage, true, 0, 0))
                {
                    return(false);
                }

                DropItem(dropped);

                ItemFlags.SetTaken(dropped, true);

                return(true);
            }
            return(base.TryDropItem(from, dropped, sendFullMessage));
        }
Esempio n. 3
0
        public override bool OnDragDropInto(Mobile from, Item item, Point3D p)
        {
            if (mOwner.Owner == from)
            {
                if (!this.CheckHold(from, item, true, true))
                {
                    return(false);
                }

                item.Location = new Point3D(p.X, p.Y, 0);
                this.AddItem(item);

                from.SendSound(this.GetDroppedSound(item), this.GetWorldLocation());

                ItemFlags.SetTaken(item, true);

                return(true);
            }
            else
            {
                from.SendMessage("Only the Steward's owner may add items to their backpack.");
            }
            return(base.OnDragDropInto(from, item, p));
        }
Esempio n. 4
0
        private static void GenerateHonestyItems()
        {
            bool initial = _Items.Count == 0;
            long ticks   = Core.TickCount;

            if (initial)
            {
                Utility.PushColor(ConsoleColor.Yellow);
                Console.Write("Honesty Items generating:");
                Utility.PopColor();
            }

            try
            {
                var count   = MaxGeneration - _Items.Count;
                var spawned = new Item[count];

                for (var i = 0; i < spawned.Length; i++)
                {
                    var item = spawned[i] = Loot.RandomArmorOrShieldOrWeapon();

                    if (item == null || item.Deleted)
                    {
                        --i;

                        continue;
                    }

                    item.HonestyItem = true;

                    lock (_ItemsLock)
                    {
                        if (!_Items.Contains(item))
                        {
                            _Items.Add(item);
                        }
                    }
                }

                var locs = new Dictionary <Map, Point3D?[]>();

                if (TrammelGeneration)
                {
                    locs[Map.Trammel] = new Point3D?[spawned.Length];
                }

                locs[Map.Felucca] = new Point3D?[spawned.Length];

                Parallel.For(
                    0,
                    spawned.Length,
                    i =>
                {
                    var map = TrammelGeneration && Utility.RandomBool() ? Map.Trammel : Map.Felucca;

                    locs[map][i] = GetValidLocation(map);
                });

                foreach (var kv in locs)
                {
                    var map    = kv.Key;
                    var points = kv.Value;

                    for (var i = 0; i < spawned.Length; i++)
                    {
                        var loc = points[i];

                        if (loc == null || loc == Point3D.Zero)
                        {
                            continue;
                        }

                        var item = spawned[i];

                        if (item == null || item.Deleted)
                        {
                            continue;
                        }

                        ItemFlags.SetTaken(item, false);

                        item.MoveToWorld(loc.Value, map);

                        spawned[i] = null;
                    }
                }

                foreach (var item in spawned.Where(item => item != null && !item.Deleted))
                {
                    item.Delete();
                }
            }
            catch (Exception e)
            {
                Utility.PushColor(ConsoleColor.Red);
                Console.WriteLine(" Failed!");
                Console.WriteLine(e);
                Utility.PopColor();
            }

            if (initial)
            {
                Utility.PushColor(ConsoleColor.Green);
                Console.WriteLine(" Done, took {0} milliseconds!", Core.TickCount - ticks);
                Utility.PopColor();
            }
        }
Esempio n. 5
0
        private static void GenerateHonestyItems()
        {
            CheckChests();

            Utility.PushColor(ConsoleColor.Yellow);
            Console.WriteLine("[Honesty]: Generating...");
            Utility.PopColor();

            var sw = new Stopwatch();
            var s  = 0.0;

            if (UseSpawnArea)
            {
                if (_FeluccaArea == null)
                {
                    Utility.PushColor(ConsoleColor.Yellow);
                    Console.Write("[Honesty]: Felucca - Reticulating splines...");
                    Utility.PopColor();

                    sw.Restart();

                    _FeluccaArea = SpawnArea.Instantiate(Map.Felucca.DefaultRegion, _Filter, ValidateSpawnPoint, true);

                    sw.Stop();

                    s += sw.Elapsed.TotalSeconds;

                    Utility.PushColor(ConsoleColor.Green);
                    Console.WriteLine("done ({0:F2} seconds)", sw.Elapsed.TotalSeconds);
                    Utility.PopColor();
                }

                if (_TrammelArea == null && TrammelGeneration)
                {
                    Utility.PushColor(ConsoleColor.Yellow);
                    Console.Write("[Honesty]: Trammel - Reticulating splines...");
                    Utility.PopColor();

                    sw.Restart();

                    _TrammelArea = SpawnArea.Instantiate(Map.Trammel.DefaultRegion, _Filter, ValidateSpawnPoint, true);

                    sw.Stop();

                    s += sw.Elapsed.TotalSeconds;

                    Utility.PushColor(ConsoleColor.Green);
                    Console.WriteLine("done ({0:F2} seconds)", sw.Elapsed.TotalSeconds);
                    Utility.PopColor();
                }
            }

            try
            {
                Map     facet;
                Point3D loc;
                Item    item;

                var count = MaxGeneration - _Items.Count;

                if (count > 0)
                {
                    Utility.PushColor(ConsoleColor.Yellow);
                    Console.Write("[Honesty]: Creating {0:#,0} lost items...", count);
                    Utility.PopColor();

                    sw.Restart();

                    var spawned = new Item[count];

                    for (var i = 0; i < spawned.Length; i++)
                    {
                        try
                        {
                            item = Loot.RandomArmorOrShieldOrWeapon();

                            if (item != null && !item.Deleted)
                            {
                                spawned[i] = item;
                            }
                        }
                        catch
                        { }
                    }

                    for (var i = 0; i < spawned.Length; i++)
                    {
                        item = spawned[i];

                        if (item == null)
                        {
                            continue;
                        }

                        try
                        {
                            if (UseSpawnArea)
                            {
                                var area = _TrammelArea != null && Utility.RandomBool() ? _TrammelArea : _FeluccaArea;
                                facet = area.Facet;

                                loc = area.GetRandom();
                            }
                            else
                            {
                                facet = TrammelGeneration && Utility.RandomBool() ? Map.Trammel : Map.Felucca;
                                loc   = GetRandom(facet);
                            }

                            if (loc == Point3D.Zero)
                            {
                                continue;
                            }

                            RunicReforging.GenerateRandomItem(item, 0, 100, 1000);

                            item.AttachSocket(new HonestyItemSocket());
                            item.HonestyItem = true;

                            _Items.Add(item);

                            ItemFlags.SetTaken(item, false);

                            item.OnBeforeSpawn(loc, facet);
                            item.MoveToWorld(loc, facet);
                            item.OnAfterSpawn();
                        }
                        catch
                        {
                            item.Delete();
                        }
                        finally
                        {
                            spawned[i] = null;
                        }
                    }

                    sw.Stop();

                    s += sw.Elapsed.TotalSeconds;

                    Utility.PushColor(ConsoleColor.Green);
                    Console.WriteLine("done ({0:F2} seconds)", sw.Elapsed.TotalSeconds);
                    Utility.PopColor();
                }
            }
            catch (Exception e)
            {
                Utility.PushColor(ConsoleColor.Red);
                Console.WriteLine(e);
                Utility.PopColor();
            }

            Utility.PushColor(ConsoleColor.Yellow);
            Console.Write("[Honesty]:");
            Utility.PopColor();
            Utility.PushColor(ConsoleColor.Green);
            Console.WriteLine(" Generation completed in {0:F2} seconds.", s);
            Utility.PopColor();
        }
Esempio n. 6
0
        private static Item TryStealItem(Item toSteal, double skill)
        {
            Item   stolen = null;
            double w      = toSteal.Weight + toSteal.TotalWeight;

            if (w <= 10)
            {
                if (toSteal.Stackable && toSteal.Amount > 1)
                {
                    int maxAmount = (int)((skill / 10.0) / toSteal.Weight);

                    if (maxAmount < 1)
                    {
                        maxAmount = 1;
                    }
                    else if (maxAmount > toSteal.Amount)
                    {
                        maxAmount = toSteal.Amount;
                    }

                    int amount = Utility.RandomMinMax(1, maxAmount);

                    if (amount >= toSteal.Amount)
                    {
                        int pileWeight = (int)Math.Ceiling(toSteal.Weight * toSteal.Amount);
                        pileWeight *= 10;

                        double chance = (skill - (pileWeight - 22.5)) / ((pileWeight + 27.5) - (pileWeight - 22.5));

                        if (chance >= Utility.RandomDouble())
                        {
                            stolen = toSteal;
                        }
                    }
                    else
                    {
                        int pileWeight = (int)Math.Ceiling(toSteal.Weight * amount);
                        pileWeight *= 10;

                        double chance = (skill - (pileWeight - 22.5)) / ((pileWeight + 27.5) - (pileWeight - 22.5));

                        if (chance >= Utility.RandomDouble())
                        {
                            stolen = Mobile.LiftItemDupe(toSteal, toSteal.Amount - amount);

                            if (stolen == null)
                            {
                                stolen = toSteal;
                            }
                        }
                    }
                }
                else
                {
                    int iw = (int)Math.Ceiling(w);
                    iw *= 10;

                    double chance = (skill - (iw - 22.5)) / ((iw + 27.5) - (iw - 22.5));

                    if (chance >= Utility.RandomDouble())
                    {
                        stolen = toSteal;
                    }
                }

                if (stolen != null)
                {
                    ItemFlags.SetTaken(stolen, true);
                    ItemFlags.SetStealable(stolen, false);
                    stolen.Movable = true;
                }
            }

            return(stolen);
        }
Esempio n. 7
0
            private Item TryStealItem(Item toSteal, ref bool caught)
            {
                Item stolen = null;

                object root = toSteal.RootParent;

                StealableArtifactsSpawner.StealableInstance si = null;
                if (toSteal.Parent == null || !toSteal.Movable)
                {
                    si = toSteal is AddonComponent?StealableArtifactsSpawner.GetStealableInstance(((AddonComponent)toSteal).Addon) : StealableArtifactsSpawner.GetStealableInstance(toSteal);
                }

                if (!IsEmptyHanded(m_Thief))
                {
                    m_Thief.SendLocalizedMessage(1005584);                     // Both hands must be free to steal.
                }
                else if (root is Mobile && ((Mobile)root).Player && !IsInGuild(m_Thief))
                {
                    m_Thief.SendLocalizedMessage(1005596);                     // You must be in the thieves guild to steal from other players.
                }
                else if (SuspendOnMurder && root is Mobile && ((Mobile)root).Player && IsInGuild(m_Thief) && m_Thief.Kills > 0)
                {
                    m_Thief.SendLocalizedMessage(502706);                     // You are currently suspended from the thieves guild.
                }
                else if (root is BaseVendor && ((BaseVendor)root).IsInvulnerable)
                {
                    m_Thief.SendLocalizedMessage(1005598);                     // You can't steal from shopkeepers.
                }
                else if (root is PlayerVendor)
                {
                    m_Thief.SendLocalizedMessage(502709);                     // You can't steal from vendors.
                }
                else if (!m_Thief.CanSee(toSteal))
                {
                    m_Thief.SendLocalizedMessage(500237);                     // Target can not be seen.
                }
                else if (m_Thief.Backpack == null || !m_Thief.Backpack.CheckHold(m_Thief, toSteal, false, true))
                {
                    m_Thief.SendLocalizedMessage(1048147);                     // Your backpack can't hold anything else.
                }
                #region Sigils
                else if (toSteal is Sigil)
                {
                    PlayerState pl      = PlayerState.Find(m_Thief);
                    Faction     faction = (pl == null ? null : pl.Faction);

                    Sigil sig = (Sigil)toSteal;

                    if (!m_Thief.InRange(toSteal.GetWorldLocation(), 1))
                    {
                        m_Thief.SendLocalizedMessage(502703);  // You must be standing next to an item to steal it.
                    }
                    else if (root != null)                     // not on the ground
                    {
                        m_Thief.SendLocalizedMessage(502710);  // You can't steal that!
                    }
                    else if (faction != null)
                    {
                        if (!m_Thief.CanBeginAction(typeof(IncognitoSpell)))
                        {
                            m_Thief.SendLocalizedMessage(1010581);                             //	You cannot steal the sigil when you are incognito
                        }
                        else if (DisguiseTimers.IsDisguised(m_Thief))
                        {
                            m_Thief.SendLocalizedMessage(1010583);                             //	You cannot steal the sigil while disguised
                        }
                        else if (!m_Thief.CanBeginAction(typeof(PolymorphSpell)))
                        {
                            m_Thief.SendLocalizedMessage(1010582);                             //	You cannot steal the sigil while polymorphed
                        }
                        else if (TransformationSpellHelper.UnderTransformation(m_Thief))
                        {
                            m_Thief.SendLocalizedMessage(1061622);                             // You cannot steal the sigil while in that form.
                        }
                        else if (AnimalForm.UnderTransformation(m_Thief))
                        {
                            m_Thief.SendLocalizedMessage(1063222);                             // You cannot steal the sigil while mimicking an animal.
                        }
                        else if (pl.IsLeaving)
                        {
                            m_Thief.SendLocalizedMessage(1005589);                             // You are currently quitting a faction and cannot steal the town sigil
                        }
                        else if (sig.IsBeingCorrupted && sig.LastMonolith.Faction == faction)
                        {
                            m_Thief.SendLocalizedMessage(1005590);                             //	You cannot steal your own sigil
                        }
                        else if (sig.IsPurifying)
                        {
                            m_Thief.SendLocalizedMessage(1005592);                             // You cannot steal this sigil until it has been purified
                        }
                        else if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, 80.0, 80.0))
                        {
                            if (Sigil.ExistsOn(m_Thief))
                            {
                                m_Thief.SendLocalizedMessage(1010258);
                                //	The sigil has gone back to its home location because you already have a sigil.
                            }
                            else if (m_Thief.Backpack == null || !m_Thief.Backpack.CheckHold(m_Thief, sig, false, true))
                            {
                                m_Thief.SendLocalizedMessage(1010259);                                 //	The sigil has gone home because your backpack is full
                            }
                            else
                            {
                                if (sig.IsBeingCorrupted)
                                {
                                    sig.GraceStart = DateTime.UtcNow;                                     // begin grace period
                                }

                                m_Thief.SendLocalizedMessage(1010586);                                 // YOU STOLE THE SIGIL!!!   (woah, calm down now)

                                if (sig.LastMonolith != null && sig.LastMonolith.Sigil != null)
                                {
                                    sig.LastMonolith.Sigil = null;
                                    sig.LastStolen         = DateTime.UtcNow;
                                }

                                return(sig);
                            }
                        }
                        else
                        {
                            m_Thief.SendLocalizedMessage(1005594);                             //	You do not have enough skill to steal the sigil
                        }
                    }
                    else
                    {
                        m_Thief.SendLocalizedMessage(1005588);                         //	You must join a faction to do that
                    }
                }
                #endregion
                #region VvV Sigils
                else if (toSteal is VvVSigil && ViceVsVirtueSystem.Instance != null)
                {
                    VvVPlayerEntry entry = ViceVsVirtueSystem.Instance.GetPlayerEntry <VvVPlayerEntry>(m_Thief);

                    VvVSigil sig = (VvVSigil)toSteal;

                    if (!m_Thief.InRange(toSteal.GetWorldLocation(), 1))
                    {
                        m_Thief.SendLocalizedMessage(502703); // You must be standing next to an item to steal it.
                    }
                    else if (root != null)                    // not on the ground
                    {
                        m_Thief.SendLocalizedMessage(502710); // You can't steal that!
                    }
                    else if (entry != null)
                    {
                        if (!m_Thief.CanBeginAction(typeof(IncognitoSpell)))
                        {
                            m_Thief.SendLocalizedMessage(1010581); //	You cannot steal the sigil when you are incognito
                        }
                        else if (DisguiseTimers.IsDisguised(m_Thief))
                        {
                            m_Thief.SendLocalizedMessage(1010583); //	You cannot steal the sigil while disguised
                        }
                        else if (!m_Thief.CanBeginAction(typeof(PolymorphSpell)))
                        {
                            m_Thief.SendLocalizedMessage(1010582); //	You cannot steal the sigil while polymorphed
                        }
                        else if (TransformationSpellHelper.UnderTransformation(m_Thief))
                        {
                            m_Thief.SendLocalizedMessage(1061622); // You cannot steal the sigil while in that form.
                        }
                        else if (AnimalForm.UnderTransformation(m_Thief))
                        {
                            m_Thief.SendLocalizedMessage(1063222); // You cannot steal the sigil while mimicking an animal.
                        }
                        else if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, 100.0, 120.0))
                        {
                            if (m_Thief.Backpack == null || !m_Thief.Backpack.CheckHold(m_Thief, sig, false, true))
                            {
                                m_Thief.SendLocalizedMessage(1010259); //	The sigil has gone home because your backpack is full
                            }
                            else
                            {
                                m_Thief.SendLocalizedMessage(1010586); // YOU STOLE THE SIGIL!!!   (woah, calm down now)

                                sig.OnStolen(entry);

                                return(sig);
                            }
                        }
                        else
                        {
                            m_Thief.SendLocalizedMessage(1005594); //	You do not have enough skill to steal the sigil
                        }
                    }
                    else
                    {
                        m_Thief.SendLocalizedMessage(1155415); //	Only participants in Vice vs Virtue may use this item.
                    }
                }
                #endregion

                else if (si == null && (toSteal.Parent == null || !toSteal.Movable) && !ItemFlags.GetStealable(toSteal))
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if ((toSteal.LootType == LootType.Newbied || toSteal.CheckBlessed(root)) && !ItemFlags.GetStealable(toSteal))
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (Core.AOS && si == null && toSteal is Container && !ItemFlags.GetStealable(toSteal))
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (!m_Thief.InRange(toSteal.GetWorldLocation(), 1))
                {
                    m_Thief.SendLocalizedMessage(502703);                     // You must be standing next to an item to steal it.
                }
                else if (si != null && m_Thief.Skills[SkillName.Stealing].Value < 100.0)
                {
                    m_Thief.SendLocalizedMessage(1060025, "", 0x66D);                     // You're not skilled enough to attempt the theft of this item.
                }
                else if (toSteal.Parent is Mobile)
                {
                    m_Thief.SendLocalizedMessage(1005585);                     // You cannot steal items which are equiped.
                }
                else if (root == m_Thief)
                {
                    m_Thief.SendLocalizedMessage(502704);                     // You catch yourself red-handed.
                }
                else if (root is Mobile && ((Mobile)root).IsStaff())
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (root is Mobile && !m_Thief.CanBeHarmful((Mobile)root))
                {
                }
                else if (root is Corpse)
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else
                {
                    double w = toSteal.Weight + toSteal.TotalWeight;

                    if (w > 10)
                    {
                        m_Thief.SendMessage("That is too heavy to steal.");
                    }
                    else
                    {
                        if (toSteal.Stackable && toSteal.Amount > 1)
                        {
                            int maxAmount = (int)((m_Thief.Skills[SkillName.Stealing].Value / 10.0) / toSteal.Weight);

                            if (maxAmount < 1)
                            {
                                maxAmount = 1;
                            }
                            else if (maxAmount > toSteal.Amount)
                            {
                                maxAmount = toSteal.Amount;
                            }

                            int amount = Utility.RandomMinMax(1, maxAmount);

                            if (amount >= toSteal.Amount)
                            {
                                int pileWeight = (int)Math.Ceiling(toSteal.Weight * toSteal.Amount);
                                pileWeight *= 10;

                                if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5))
                                {
                                    stolen = toSteal;
                                }
                            }
                            else
                            {
                                int pileWeight = (int)Math.Ceiling(toSteal.Weight * amount);
                                pileWeight *= 10;

                                if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5))
                                {
                                    stolen = Mobile.LiftItemDupe(toSteal, toSteal.Amount - amount);

                                    if (stolen == null)
                                    {
                                        stolen = toSteal;
                                    }
                                }
                            }
                        }
                        else
                        {
                            int iw = (int)Math.Ceiling(w);
                            iw *= 10;

                            if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, iw - 22.5, iw + 27.5))
                            {
                                stolen = toSteal;
                            }
                        }

                        // Non-movable stealable (not in fillable container) items cannot result in the stealer getting caught
                        if (stolen != null && (root is FillableContainer || stolen.Movable))
                        {
                            double skillValue = m_Thief.Skills[SkillName.Stealing].Value;

                            if (root is FillableContainer)
                            {
                                caught = (Utility.Random((int)(skillValue / 2.5)) == 0); // 1 of 48 chance at 120
                            }
                            else
                            {
                                caught = (skillValue < Utility.Random(150));
                            }
                        }
                        else
                        {
                            caught = false;
                        }

                        if (stolen != null)
                        {
                            m_Thief.SendLocalizedMessage(502724);                             // You succesfully steal the item.

                            ItemFlags.SetTaken(stolen, true);
                            ItemFlags.SetStealable(stolen, false);
                            stolen.Movable = true;

                            InvokeItemStoken(new ItemStolenEventArgs(stolen, m_Thief));

                            if (si != null)
                            {
                                toSteal.Movable = true;
                                si.Item         = null;
                            }
                        }
                        else
                        {
                            m_Thief.SendLocalizedMessage(502723);                             // You fail to steal the item.
                        }
                    }
                }

                return(stolen);
            }
Esempio n. 8
0
            private Item TryStealItem(Item toSteal, ref bool caught)
            {
                Item stolen = null;

                object root = toSteal.RootParent;

                StealableArtifactsSpawner.StealableInstance si = null;
                if (toSteal.Parent == null || !toSteal.Movable)
                {
                    si = StealableArtifactsSpawner.GetStealableInstance(toSteal);
                }

                if (!IsEmptyHanded(m_Thief))
                {
                    m_Thief.SendLocalizedMessage(1005584);                     // Both hands must be free to steal.
                }
                else if (root is Mobile && ((Mobile)root).Player && IsInnocentTo(m_Thief, (Mobile)root) && !IsInGuild(m_Thief))
                {
                    m_Thief.SendLocalizedMessage(1005596);                     // You must be in the thieves guild to steal from other players.
                }
                else if (SuspendOnMurder && root is Mobile && ((Mobile)root).Player && IsInGuild(m_Thief) && m_Thief.Kills > 0)
                {
                    m_Thief.SendLocalizedMessage(502706);                     // You are currently suspended from the thieves guild.
                }
                else if (root is BaseVendor && ((BaseVendor)root).IsInvulnerable)
                {
                    m_Thief.SendLocalizedMessage(1005598);                     // You can't steal from shopkeepers.
                }
                else if (root is PlayerVendor)
                {
                    m_Thief.SendLocalizedMessage(502709);                     // You can't steal from vendors.
                }
                else if (!m_Thief.CanSee(toSteal))
                {
                    m_Thief.SendLocalizedMessage(500237);                     // Target can not be seen.
                }
                else if (m_Thief.Backpack == null || !m_Thief.Backpack.CheckHold(m_Thief, toSteal, false, true))
                {
                    m_Thief.SendLocalizedMessage(1048147);                     // Your backpack can't hold anything else.
                }
                #region Sigils
                else if (toSteal is Sigil)
                {
                    PlayerState pl      = PlayerState.Find(m_Thief);
                    Faction     faction = (pl == null ? null : pl.Faction);

                    Sigil sig = (Sigil)toSteal;

                    if (!m_Thief.InRange(toSteal.GetWorldLocation(), 1))
                    {
                        m_Thief.SendLocalizedMessage(502703);  // You must be standing next to an item to steal it.
                    }
                    else if (root != null)                     // not on the ground
                    {
                        m_Thief.SendLocalizedMessage(502710);  // You can't steal that!
                    }
                    else if (faction != null)
                    {
                        if (!m_Thief.CanBeginAction(typeof(IncognitoSpell)))
                        {
                            m_Thief.SendLocalizedMessage(1010581);                             //	You cannot steal the sigil when you are incognito
                        }
                        else if (DisguiseGump.IsDisguised(m_Thief))
                        {
                            m_Thief.SendLocalizedMessage(1010583);                             //	You cannot steal the sigil while disguised
                        }
                        else if (!m_Thief.CanBeginAction(typeof(PolymorphSpell)))
                        {
                            m_Thief.SendLocalizedMessage(1010582);                             //	You cannot steal the sigil while polymorphed
                        }
                        else if (TransformationSpellHelper.UnderTransformation(m_Thief))
                        {
                            m_Thief.SendLocalizedMessage(1061622);                             // You cannot steal the sigil while in that form.
                        }
                        else if (AnimalForm.UnderTransformation(m_Thief))
                        {
                            m_Thief.SendLocalizedMessage(1063222);                             // You cannot steal the sigil while mimicking an animal.
                        }
                        else if (pl.IsLeaving)
                        {
                            m_Thief.SendLocalizedMessage(1005589);                             // You are currently quitting a faction and cannot steal the town sigil
                        }
                        else if (sig.IsBeingCorrupted && sig.LastMonolith.Faction == faction)
                        {
                            m_Thief.SendLocalizedMessage(1005590);                             //	You cannot steal your own sigil
                        }
                        else if (sig.IsPurifying)
                        {
                            m_Thief.SendLocalizedMessage(1005592);                             // You cannot steal this sigil until it has been purified
                        }
                        else if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, 80.0, 80.0))
                        {
                            if (Sigil.ExistsOn(m_Thief))
                            {
                                m_Thief.SendLocalizedMessage(1010258);                                 //	The sigil has gone back to its home location because you already have a sigil.
                            }
                            else if (m_Thief.Backpack == null || !m_Thief.Backpack.CheckHold(m_Thief, sig, false, true))
                            {
                                m_Thief.SendLocalizedMessage(1010259);                                 //	The sigil has gone home because your backpack is full
                            }
                            else
                            {
                                if (sig.IsBeingCorrupted)
                                {
                                    sig.GraceStart = DateTime.Now;                                     // begin grace period
                                }
                                m_Thief.SendLocalizedMessage(1010586);                                 // YOU STOLE THE SIGIL!!!   (woah, calm down now)

                                if (sig.LastMonolith != null)
                                {
                                    sig.LastMonolith.Sigil = null;
                                }

                                sig.LastStolen = DateTime.Now;

                                return(sig);
                            }
                        }
                        else
                        {
                            m_Thief.SendLocalizedMessage(1005594);                             //	You do not have enough skill to steal the sigil
                        }
                    }
                    else
                    {
                        m_Thief.SendLocalizedMessage(1005588);                         //	You must join a faction to do that
                    }
                }
                #endregion
                //ARTEGORDONMOD
                // allow stealing of STEALABLE items on the ground or in containers
                else if (si == null && (toSteal.Parent == null || !toSteal.Movable) && !ItemFlags.GetStealable(toSteal))
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                //ARTEGORDONMOD
                // allow stealing of of STEALABLE newbied/blessed items
                else if ((toSteal.LootType == LootType.Newbied || toSteal.CheckBlessed(root)) && !ItemFlags.GetStealable(toSteal))
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                //ARTEGORDONMOD
                // allow stealing of STEALABLE containers
                else if (Core.AOS && si == null && toSteal is Container && !ItemFlags.GetStealable(toSteal))
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (!m_Thief.InRange(toSteal.GetWorldLocation(), 1))
                {
                    m_Thief.SendLocalizedMessage(502703);                     // You must be standing next to an item to steal it.
                }
                else if (si != null && m_Thief.Skills[SkillName.Stealing].Value < 100.0)
                {
                    m_Thief.SendLocalizedMessage(1060025, "", 0x66D);                     // You're not skilled enough to attempt the theft of this item.
                }
                else if (toSteal.Parent is Mobile)
                {
                    m_Thief.SendLocalizedMessage(1005585);                     // You cannot steal items which are equiped.
                }
                else if (root == m_Thief)
                {
                    m_Thief.SendLocalizedMessage(502704);                     // You catch yourself red-handed.
                }
                else if (root is Mobile && ((Mobile)root).AccessLevel > AccessLevel.Player)
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (root is Mobile && !m_Thief.CanBeHarmful((Mobile)root))
                {
                }
                else if (root is Corpse)
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else
                {
                    double w = toSteal.Weight + toSteal.TotalWeight;

                    if (w > 10)
                    {
                        m_Thief.SendMessage("That is too heavy to steal.");
                    }
                    else
                    {
                        if (toSteal.Stackable && toSteal.Amount > 1)
                        {
                            //ARTEGORDON
                            // fix for zero-weight stackables
                            int maxAmount = toSteal.Amount;
                            if (toSteal.Weight > 0)
                            {
                                maxAmount = (int)((m_Thief.Skills[SkillName.Stealing].Value / 10.0) / toSteal.Weight);
                            }

                            if (maxAmount < 1)
                            {
                                maxAmount = 1;
                            }
                            else if (maxAmount > toSteal.Amount)
                            {
                                maxAmount = toSteal.Amount;
                            }

                            int amount = Utility.RandomMinMax(1, maxAmount);

                            if (amount >= toSteal.Amount)
                            {
                                int pileWeight = (int)Math.Ceiling(toSteal.Weight * toSteal.Amount);
                                pileWeight *= 10;

                                if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5))
                                {
                                    stolen = toSteal;
                                }
                            }
                            else
                            {
                                int pileWeight = (int)Math.Ceiling(toSteal.Weight * amount);
                                pileWeight *= 10;

                                if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5))
                                {
                                    stolen = Mobile.LiftItemDupe(toSteal, toSteal.Amount - amount);

                                    if (stolen == null)
                                    {
                                        stolen = toSteal;
                                    }
                                }
                            }
                        }
                        else
                        {
                            int iw = (int)Math.Ceiling(w);
                            iw *= 10;

                            if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, iw - 22.5, iw + 27.5))
                            {
                                stolen = toSteal;
                            }
                        }

                        if (stolen != null)
                        {
                            m_Thief.SendLocalizedMessage(502724);                             // You succesfully steal the item.
                            // ARTEGORDONMOD
                            // set the taken flag to trigger release from any controlling spawner
                            ItemFlags.SetTaken(stolen, true);
                            // clear the stealable flag so that the item can only be stolen once if it is later locked down.
                            ItemFlags.SetStealable(stolen, false);
                            // release it if it was locked down
                            stolen.Movable = true;

                            // End mod for stealable rares and other locked down items

                            if (si != null)
                            {
                                toSteal.Movable = true;
                                si.Item         = null;
                            }
                        }
                        else
                        {
                            m_Thief.SendLocalizedMessage(502723);                             // You fail to steal the item.
                        }

                        caught = (m_Thief.Skills[SkillName.Stealing].Value < Utility.Random(150));
                    }
                }

                return(stolen);
            }
Esempio n. 9
0
        private static void GenerateHonestyItems()
        {
            try
            {
                var count   = MaxGeneration - _Items.Count;
                var spawned = new Item[count];

                for (var i = 0; i < spawned.Length; i++)
                {
                    var item = spawned[i] = Loot.RandomArmorOrShieldOrWeapon();

                    if (item == null || item.Deleted)
                    {
                        --i;

                        continue;
                    }

                    item.HonestyItem = true;

                    lock (_ItemsLock)
                    {
                        if (!_Items.Contains(item))
                        {
                            _Items.Add(item);
                        }
                    }
                }

                var locs = new Dictionary <Map, Point3D?[]>();

                if (TrammelGeneration)
                {
                    locs[Map.Trammel] = new Point3D?[spawned.Length];
                }

                locs[Map.Felucca] = new Point3D?[spawned.Length];

                Parallel.For(
                    0,
                    spawned.Length,
                    i =>
                {
                    var map = TrammelGeneration && Utility.RandomBool() ? Map.Trammel : Map.Felucca;

                    locs[map][i] = GetValidLocation(map);
                });

                foreach (var kv in locs)
                {
                    var map    = kv.Key;
                    var points = kv.Value;

                    for (var i = 0; i < spawned.Length; i++)
                    {
                        var loc = points[i];

                        if (loc == null || loc == Point3D.Zero)
                        {
                            continue;
                        }

                        var item = spawned[i];

                        if (item == null || item.Deleted)
                        {
                            continue;
                        }

                        item.HonestyRegion = _Regions[Utility.Random(_Regions.Length)];

                        if (!String.IsNullOrWhiteSpace(item.HonestyRegion))
                        {
                            var attempts = BaseVendor.AllVendors.Count / 10;

                            BaseVendor m;

                            do
                            {
                                m = BaseVendor.AllVendors[Utility.Random(BaseVendor.AllVendors.Count)];
                            }while ((m == null || m.Map != map || !m.Region.IsPartOf(item.HonestyRegion)) && --attempts >= 0);

                            item.HonestyOwner = m;
                        }

                        ItemFlags.SetTaken(item, false);

                        item.MoveToWorld(loc.Value, map);

                        spawned[i] = null;
                    }
                }

                foreach (var item in spawned.Where(item => item != null && !item.Deleted))
                {
                    item.Delete();
                }
            }
            catch (Exception e)
            {
                Utility.PushColor(ConsoleColor.Red);
                Console.WriteLine(e);
                Utility.PopColor();
            }
        }
Esempio n. 10
0
            protected override void OnTick()
            {
                Item   stolen = null;
                object root   = toSteal.RootParent;

                if (!TryStealItem(toSteal, root, m_Thief))
                {
                    if (m_Thief is PlayerMobile)
                    {
                        ((PlayerMobile)m_Thief).EndPlayerAction();
                    }

                    return;
                }

                if (toSteal.Stackable && toSteal.Amount > 1)
                {
                    int maxAmount;

                    if (toSteal.Weight == 0)
                    {
                        maxAmount = (int)((m_Thief.Skills[SkillName.Stealing].Value / 10.0) / 0.1);
                    }
                    else
                    {
                        maxAmount = (int)((m_Thief.Skills[SkillName.Stealing].Value / 10.0) / toSteal.Weight);
                    }

                    if (maxAmount < 1)
                    {
                        maxAmount = 1;
                    }
                    else if (maxAmount > toSteal.Amount)
                    {
                        maxAmount = toSteal.Amount;
                    }

                    int amount = Utility.RandomMinMax(1, maxAmount);

                    int pileWeight = (int)Math.Ceiling(toSteal.Weight * amount);
                    pileWeight *= 10;

                    if (pileWeight == 0)
                    {
                        pileWeight = 1;
                    }

                    double minSkill = -(m_Thief.Skills[SkillName.Stealing].Value / 2) + 50;
                    double maxSkill = 100 + (pileWeight * 3);

                    if (amount >= toSteal.Amount)
                    {
                        if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, minSkill, maxSkill))
                        {
                            stolen = toSteal;
                        }
                    }
                    else
                    {
                        if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, minSkill, maxSkill))
                        {
                            stolen = Mobile.LiftItemDupe(toSteal, toSteal.Amount - amount);

                            if (stolen == null)
                            {
                                stolen = toSteal;
                            }
                        }
                    }
                }
                else
                {
                    double w = toSteal.Weight + toSteal.TotalWeight;

                    int iw = (int)Math.Ceiling(w);
                    iw *= 10;

                    double minSkill = -(m_Thief.Skills[SkillName.Stealing].Value / 2) + 50;
                    double maxSkill = 100 + (iw * 3);

                    if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, minSkill, maxSkill))
                    {
                        stolen = toSteal;
                    }
                }

                bool caught;

                if (root is Mobile)
                {
                    Mobile mobRoot = (Mobile)root;
                    caught = ((m_Thief.Skills[SkillName.Stealing].Value + (m_Thief.Dex - mobRoot.Dex) / 3.0) < Utility.Random(150));
                }
                else
                {
                    caught = ((m_Thief.Skills[SkillName.Stealing].Value + (m_Thief.Dex - 100) / 3.0) < Utility.Random(150));
                }

                if (stolen != null)
                {
                    // ARTEGORDONMOD
                    // set the taken flag to trigger release from any controlling spawner
                    ItemFlags.SetTaken(stolen, true);
                    // clear the stealable flag so that the item can only be stolen once if it is later locked down.
                    ItemFlags.SetStealable(stolen, false);
                    // release it if it was locked down
                    stolen.Movable = true;

                    m_Thief.AddToBackpack(stolen);
                    StolenItem.Add(stolen, m_Thief, root as Mobile);

                    m_Thief.SendLocalizedMessage(502724); // You succesfully steal the item.
                }
                else
                {
                    m_Thief.SendLocalizedMessage(502723); // You fail to steal the item.
                }

                if (caught)
                {
                    if (root == null)
                    {
                        m_Thief.CriminalAction(true);
                    }
                    else if (root is Corpse && ((Corpse)root).IsCriminalAction(m_Thief))
                    {
                        m_Thief.CriminalAction(true);
                    }
                    else if (root is Mobile)
                    {
                        Mobile mobRoot = (Mobile)root;

                        if (!IsInGuild(mobRoot) && IsInnocentTo(m_Thief, mobRoot))
                        {
                            m_Thief.CriminalAction(true);
                        }

                        string message = String.Format("You notice {0} trying to steal from {1}.", m_Thief.Name, mobRoot.Name);

                        foreach (NetState ns in m_Thief.GetClientsInRange(8))
                        {
                            if (ns.Mobile == mobRoot)
                            {
                                ns.Mobile.SendAsciiMessage("You notice {0} trying to steal from you.", m_Thief.Name);
                            }

                            else if (ns.Mobile != m_Thief)
                            {
                                ns.Mobile.SendMessage(message);
                            }
                        }
                    }
                }

                /*
                 * else if (root is Corpse && ((Corpse)root).IsCriminalAction(m_Thief))
                 * {
                 *  m_Thief.CriminalAction(true);
                 * }*/

                if (root is Mobile && ((Mobile)root).Player && m_Thief is PlayerMobile && IsInnocentTo(m_Thief, (Mobile)root) && !IsInGuild((Mobile)root))
                {
                    PlayerMobile pm = (PlayerMobile)m_Thief;

                    pm.PermaFlags.Add((Mobile)root);
                    pm.Delta(MobileDelta.Noto);
                }

                if (m_Thief is PlayerMobile)
                {
                    ((PlayerMobile)m_Thief).EndPlayerAction();
                }
            }
Esempio n. 11
0
            private Item TryStealItem(Item toSteal, ref bool caught)
            {
                //Close bank box on steal attempt -Adam
                BankBox box = m_Thief.FindBankNoCreate();

                if (box != null && box.Opened)
                {
                    box.Close();
                    m_Thief.Send(new MobileUpdate(m_Thief));
                }

                Item stolen = null;

                object root = toSteal.RootParent;

                var contParent = toSteal.Parent as Container;

                StealableArtifactsSpawner.StealableInstance si = null;
                if (toSteal.Parent == null || !toSteal.Movable)
                {
                    si = StealableArtifactsSpawner.GetStealableInstance(toSteal);
                }

                BaseAddon addon = null;

                if (toSteal is AddonComponent)
                {
                    addon = ((AddonComponent)toSteal).Addon;
                }

                bool stealflag = (addon != null && addon.GetSavedFlag(ItemFlags.StealableFlag)) ||
                                 toSteal.GetSavedFlag(ItemFlags.StealableFlag);

                if (!IsEmptyHanded(m_Thief))
                {
                    m_Thief.SendLocalizedMessage(1005584);                     // Both hands must be free to steal.
                }
                else if (root is Mobile && ((Mobile)root).Player && IsInnocentTo(m_Thief, (Mobile)root) && !IsInGuild(m_Thief))
                {
                    m_Thief.SendLocalizedMessage(1005596);                     // You must be in the thieves guild to steal from other players.
                }
                else if (SuspendOnMurder && root is Mobile && ((Mobile)root).Player && IsInGuild(m_Thief) && m_Thief.Kills > 0)
                {
                    m_Thief.SendLocalizedMessage(502706);                     // You are currently suspended from the thieves guild.
                }
                else if (root is BaseVendor && ((BaseVendor)root).IsInvulnerable)
                {
                    m_Thief.SendLocalizedMessage(1005598);                     // You can't steal from shopkeepers.
                }
                else if (root is PlayerVendor)
                {
                    m_Thief.SendLocalizedMessage(502709);                     // You can't steal from vendors.
                }
                else if (!m_Thief.CanSee(toSteal))
                {
                    m_Thief.SendLocalizedMessage(500237);                     // Target can not be seen.
                }
                else if (m_Thief.Backpack == null || !m_Thief.Backpack.CheckHold(m_Thief, toSteal, false, true))
                {
                    m_Thief.SendLocalizedMessage(1048147);                     // Your backpack can't hold anything else.
                }
                #region Sigils
                else if (toSteal is Sigil)
                {
                    PlayerState pl      = PlayerState.Find(m_Thief);
                    Faction     faction = (pl == null ? null : pl.Faction);

                    var sig = (Sigil)toSteal;

                    if (!m_Thief.InRange(toSteal.GetWorldLocation(), 1))
                    {
                        m_Thief.SendLocalizedMessage(502703);  // You must be standing next to an item to steal it.
                    }
                    else if (root != null)                     // not on the ground
                    {
                        m_Thief.SendLocalizedMessage(502710);  // You can't steal that!
                    }
                    else if (faction != null)
                    {
                        if (!m_Thief.CanBeginAction(typeof(IncognitoSpell)))
                        {
                            m_Thief.SendLocalizedMessage(1010581);                             //	You cannot steal the sigil when you are incognito
                        }
                        else if (DisguiseTimers.IsDisguised(m_Thief))
                        {
                            m_Thief.SendLocalizedMessage(1010583);                             //	You cannot steal the sigil while disguised
                        }
                        else if (!m_Thief.CanBeginAction(typeof(PolymorphSpell)))
                        {
                            m_Thief.SendLocalizedMessage(1010582);                             //	You cannot steal the sigil while polymorphed
                        }
                        else if (TransformationSpellHelper.UnderTransformation(m_Thief))
                        {
                            m_Thief.SendLocalizedMessage(1061622);                             // You cannot steal the sigil while in that form.
                        }
                        else if (m_Thief is PlayerMobile && ((PlayerMobile)m_Thief).SavagePaintExpiration > TimeSpan.Zero)
                        {
                            m_Thief.SendLocalizedMessage(1114352);                             // You cannot steal the sigil while disguised in savage paint.
                        }
                        else if (pl.IsLeaving)
                        {
                            m_Thief.SendLocalizedMessage(1005589);                             // You are currently quitting a faction and cannot steal the town sigil
                        }
                        else if (sig.IsBeingCorrupted && sig.LastMonolith.Faction == faction)
                        {
                            m_Thief.SendLocalizedMessage(1005590);                             //	You cannot steal your own sigil
                        }
                        else if (sig.IsPurifying)
                        {
                            m_Thief.SendLocalizedMessage(1005592);                             // You cannot steal this sigil until it has been purified
                        }
                        else if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, 0.0, 0.0))
                        {
                            if (Sigil.ExistsOn(m_Thief))
                            {
                                m_Thief.SendLocalizedMessage(1010258);
                                //	The sigil has gone back to its home location because you already have a sigil.
                            }
                            else if (m_Thief.Backpack == null || !m_Thief.Backpack.CheckHold(m_Thief, sig, false, true))
                            {
                                m_Thief.SendLocalizedMessage(1010259);                                 //	The sigil has gone home because your backpack is full
                            }
                            else
                            {
                                if (sig.IsBeingCorrupted)
                                {
                                    sig.GraceStart = DateTime.UtcNow;                                     // begin grace period
                                }

                                m_Thief.SendLocalizedMessage(1010586);                                 // YOU STOLE THE SIGIL!!!   (woah, calm down now)

                                if (sig.LastMonolith != null && sig.LastMonolith.Sigil != null)
                                {
                                    sig.LastMonolith.Sigil = null;
                                    sig.LastStolen         = DateTime.UtcNow;
                                }

                                switch (PvPController._SigilAnnounceStolen)
                                {
                                case PvPController.SigilStolenAnnouncing.All:
                                {
                                    foreach (Faction factionToBCast in Faction.Factions)
                                    {
                                        List <PlayerState> members = factionToBCast.Members;

                                        if (sig.Corrupted != null)
                                        {
                                            if (sig.Corrupted == factionToBCast)
                                            {
                                                foreach (PlayerState member in members)
                                                {
                                                    member.Mobile.SendMessage(
                                                        factionToBCast.Definition.HueBroadcast,
                                                        "The {0} have stolen the {1} sigil from your faction stronghold!",
                                                        faction.Definition.FriendlyName,
                                                        sig.Town.Definition.FriendlyName);
                                                }
                                            }
                                            else
                                            {
                                                foreach (PlayerState member in members)
                                                {
                                                    member.Mobile.SendMessage(
                                                        factionToBCast.Definition.HueBroadcast,
                                                        "The {0} have stolen the {1} sigil from the {2} stronghold!",
                                                        faction.Definition.FriendlyName,
                                                        sig.Town.Definition.FriendlyName,
                                                        sig.Corrupted.Definition.FriendlyName);
                                                }
                                            }
                                        }
                                        else
                                        {
                                            foreach (PlayerState member in members)
                                            {
                                                member.Mobile.SendMessage(
                                                    factionToBCast.Definition.HueBroadcast,
                                                    "The {0} have stolen the {1} sigil!",
                                                    faction.Definition.FriendlyName,
                                                    sig.Town.Definition.FriendlyName);
                                            }
                                        }
                                    }
                                }
                                break;

                                case PvPController.SigilStolenAnnouncing.Owner:
                                {
                                    if (sig.Corrupted != null)
                                    {
                                        List <PlayerState> members = sig.Corrupted.Members;

                                        foreach (PlayerState member in members)
                                        {
                                            member.Mobile.SendMessage(
                                                sig.Corrupted.Definition.HueBroadcast,
                                                "The {0} have stolen the {1} sigil from your faction stronghold!",
                                                faction.Definition.FriendlyName,
                                                sig.Town.Definition.FriendlyName);
                                        }
                                    }
                                }
                                break;
                                }

                                return(sig);
                            }
                        }
                        else
                        {
                            m_Thief.SendLocalizedMessage(1005594);                             //	You do not have enough skill to steal the sigil
                        }
                    }
                    else
                    {
                        m_Thief.SendLocalizedMessage(1005588);                         //	You must join a faction to do that
                    }
                }
                #endregion

                else if (!stealflag && si == null && (toSteal.Parent == null || !toSteal.Movable))
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if ((toSteal.LootType == LootType.Newbied || toSteal.CheckBlessed(root)) &&
                         !(toSteal.RootParent is FillableContainer) && !stealflag)
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (toSteal is Spellbook)
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (toSteal.Nontransferable)
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (m_Thief.EraAOS && si == null && toSteal is Container)
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (toSteal is IEthicsItem && ((IEthicsItem)toSteal).EthicsItemState != null &&
                         !((IEthicsItem)toSteal).EthicsItemState.HasExpired)
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (!m_Thief.InRange(toSteal.GetWorldLocation(), 1))
                {
                    m_Thief.SendLocalizedMessage(502703);                     // You must be standing next to an item to steal it.
                }
                // Alan: commented this out b/c there shouldn't be a required skill level to steal stealflag stuff
                //else if ( ( si != null && m_Thief.Skills[SkillName.Stealing].Value < 100.0 ) || ( stealflag ) && m_Thief.Skills[SkillName.Stealing].Value < 100.0 ) ) //&& m_Thief.Skills[SkillName.Stealing].Value < 90.0 ) )
                //	m_Thief.SendLocalizedMessage( 1060025, "", 0x66D ); // You're not skilled enough to attempt the theft of this item.
                else if (toSteal.Parent is Mobile)
                {
                    m_Thief.SendLocalizedMessage(1005585);           // You cannot steal items which are equipped.
                }
                else if (toSteal.GetSavedFlag(0x01))                 //Not lootable item
                {
                    m_Thief.SendLocalizedMessage(502710);            // You can't steal that!
                }
                else if (root == m_Thief || (root is BaseCreature && ((BaseCreature)root).GetMaster() == m_Thief))
                {
                    m_Thief.SendLocalizedMessage(502704);                     // You catch yourself red-handed.
                }
                else if (root is Mobile && ((Mobile)root).AccessLevel > AccessLevel.Player)
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (root is Mobile && !m_Thief.CanBeHarmful((Mobile)root))
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (root is Corpse)
                {
                    m_Thief.SendLocalizedMessage(502710);                     // You can't steal that!
                }
                else if (m_Thief.Spell != null)
                {
                    m_Thief.SendMessage("You are too busy concentrating on your spell to steal that item.");
                }
                else
                {
                    double w = toSteal.Weight + toSteal.TotalWeight;

                    if (addon != null)
                    {
                        w = addon.Weight = addon.TotalWeight;
                    }

                    if (w > 10 && !stealflag)
                    {
                        m_Thief.SendMessage("That is too heavy to steal.");
                    }
                    else
                    {
                        m_Thief.BeginAction(typeof(Hiding));

                        Timer.DelayCall(TimeSpan.FromSeconds(SpecialMovesController._StealingRehideDelay), ReleaseHideLock, m_Thief);

                        if (toSteal.Stackable && toSteal.Amount > 1)
                        {
                            var maxAmount = (int)((m_Thief.Skills[SkillName.Stealing].Value / 10.0) / toSteal.Weight);
                            var minAmount = (int)((m_Thief.Skills[SkillName.Stealing].Value / 25.0) / toSteal.Weight);                             //added a min amount

                            if (minAmount < 1)
                            {
                                minAmount = 1;
                            }

                            if (maxAmount < 1)
                            {
                                maxAmount = 1;
                            }
                            else if (maxAmount > toSteal.Amount)
                            {
                                maxAmount = toSteal.Amount;
                            }

                            int amount = Utility.RandomMinMax(minAmount, maxAmount);                             //(change from 1, maxamount)

                            if (amount >= toSteal.Amount)
                            {
                                var pileWeight = (int)Math.Ceiling(toSteal.Weight * toSteal.Amount);
                                pileWeight *= 10;

                                if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5))
                                {
                                    stolen = toSteal;
                                }
                            }
                            else
                            {
                                var pileWeight = (int)Math.Ceiling(toSteal.Weight * amount);
                                pileWeight *= 10;

                                if (m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, pileWeight - 22.5, pileWeight + 27.5))
                                {
                                    stolen = Mobile.LiftItemDupe(toSteal, toSteal.Amount - amount) ?? toSteal;
                                }
                            }
                        }
                        else
                        {
                            var iw = (int)Math.Ceiling(w);
                            iw *= 10;

                            if (stealflag || m_Thief.CheckTargetSkill(SkillName.Stealing, toSteal, iw - 22.5, iw + 27.5))
                            {
                                stolen = toSteal;
                            }
                        }

                        if (stolen is PowerScroll)
                        {
                            var  scroll  = (PowerScroll)stolen;
                            bool success = Utility.RandomBool();

                            if (success || Utility.RandomBool())
                            {
                                BaseMount.Dismount(m_Thief);
                                BaseMount.SetMountPrevention(
                                    m_Thief, BlockMountType.DismountRecovery, TimeSpan.FromSeconds(success ? 60.0 : 5.0));
                            }
                        }

                        if (stolen != null)
                        {
                            m_Thief.SendLocalizedMessage(502724); // You successfully steal the item.

                            if (stolen is Head2)
                            {
                                ((Head2)stolen).Owner = m_Thief as PlayerMobile;
                            }

                            if (si != null)
                            {
                                toSteal.Movable = true;
                                si.Item         = null;
                            }

                            if (stealflag)
                            {
                                //toSteal.SetSavedFlag( 0x04, false );
                                // ARTEGORDONMOD
                                // set the taken flag to trigger release from any controlling spawner
                                ItemFlags.SetTaken(stolen, true);
                                // clear the stealable flag so that the item can only be stolen once if it is later locked down.
                                ItemFlags.SetStealable(stolen, false);

                                if (addon != null)                                 //deed it up!
                                {
                                    Item deed = addon.Deed;

                                    addon.Delete();
                                    stolen = deed;
                                }
                                else                                 // release it if it was locked down
                                {
                                    toSteal.Movable = true;
                                }

                                if (toSteal.Spawner != null)                                 //its not spawned anymore, its STOLEN!
                                {
                                    toSteal.Spawner.Remove(toSteal);
                                    toSteal.Spawner = null;
                                }
                            }

                            Conquests.CheckProgress <StealingConquest>(m_Thief as PlayerMobile, toSteal);
                        }
                        else
                        {
                            m_Thief.SendLocalizedMessage(502723);                             // You fail to steal the item.
                        }

                        caught = !stealflag && (m_Thief.Skills[SkillName.Stealing].Value < Utility.Random(150));
                    }
                }

                return(stolen);
            }