示例#1
0
        public override void AddComponents()
        {
            IronGate gate = new IronGate(DoorFacing.EastCCW);

            m_Gate = gate;

            gate.KeyValue = Key.RandomValue();
            gate.Locked   = true;

            AddItem(gate, -2, 1, 0);

            MetalChest chest = new MetalChest();

            chest.ItemID = 0xE7C;
            chest.DropItem(new Key(KeyType.Iron, gate.KeyValue));

            TreasureMapChest.Fill(chest, 2);

            AddItem(chest, 4, 4, 0);

            AddMobile(new Ratman(), 15, 0, -2, 0);
            AddMobile(new Ratman(), 15, 0, 1, 0);
            AddMobile(new RatmanMage(), 15, 0, -1, 0);
            AddMobile(new RatmanArcher(), 15, 0, 0, 0);

            switch (Utility.Random(2))
            {
            case 0: m_Prisoner = new Noble(); break;

            case 1: m_Prisoner = new SeekerOfAdventure(); break;
            }

            m_Prisoner.YellHue = Utility.RandomList(0x57, 0x67, 0x77, 0x87, 0x117);

            AddMobile(m_Prisoner, 2, -2, 0, 0);
        }
示例#2
0
        private void AddCampChests()
        {
            LockableContainer chest = null;

            switch (Utility.Random(3))
            {
            case 0: chest = new MetalChest(); break;

            case 1: chest = new MetalGoldenChest(); break;

            default: chest = new WoodenChest(); break;
            }

            chest.LiftOverride = true;

            TreasureMapChest.Fill(chest, 1);

            AddItem(chest, 2, -2, 0);

            LockableContainer crates = null;

            switch (Utility.Random(4))
            {
            case 0: crates = new SmallCrate(); break;

            case 1: crates = new MediumCrate(); break;

            case 2: crates = new LargeCrate(); break;

            default: crates = new LockableBarrel(); break;
            }

            crates.TrapType  = TrapType.ExplosionTrap;
            crates.TrapPower = Utility.RandomMinMax(30, 40);
            crates.TrapLevel = 2;

            crates.RequiredSkill = 76;
            crates.LockLevel     = 66;
            crates.MaxLockLevel  = 116;
            crates.Locked        = true;

            crates.DropItem(new Gold(Utility.RandomMinMax(100, 400)));
            crates.DropItem(new Arrow(10));
            crates.DropItem(new Bolt(10));

            crates.LiftOverride = true;

            if (Utility.RandomDouble() < 0.8)
            {
                switch (Utility.Random(4))
                {
                case 0: crates.DropItem(new LesserCurePotion()); break;

                case 1: crates.DropItem(new LesserExplosionPotion()); break;

                case 2: crates.DropItem(new LesserHealPotion()); break;

                default: crates.DropItem(new LesserPoisonPotion()); break;
                }
            }

            AddItem(crates, -2, 2, 0);
        }
示例#3
0
        public override Item Construct(Type type, Mobile from)
        {
            if (type == typeof(TreasureMap))
            {
                int level;
                if (from is PlayerMobile && ((PlayerMobile)from).Young && from.Map == Map.Trammel && TreasureMap.IsInHavenIsland(from))
                {
                    level = 0;
                }
                else
                {
                    level = 1;
                }

                return(new TreasureMap(level, from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(MessageInABottle))
            {
                return(new MessageInABottle(from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                List <SOS> messages = pack.FindItemsByType <SOS>();

                for (int i = 0; i < messages.Count; ++i)
                {
                    SOS sos = messages[i];

                    if (from.Map == sos.TargetMap && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;

                        switch (Utility.Random(8))
                        {
                        case 0:                                 // Body parts
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,                                                // arm
                                0x1CE0, 0x1CE8,                                                // torso
                                0x1CE1, 0x1CE9,                                                // head
                                0x1CE2, 0x1CEC                                                 // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 1:                                 // Bone parts
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 2:                                 // Paintings and portraits
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10));
                            break;
                        }

                        case 3:                                 // Pillows
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11));
                            break;
                        }

                        case 4:                                 // Shells
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9));
                            break;
                        }

                        case 5:                                 //Hats
                        {
                            if (Utility.RandomBool())
                            {
                                preLoot = new SkullCap();
                            }
                            else
                            {
                                preLoot = new TricorneHat();
                            }

                            break;
                        }

                        case 6:                                 // Misc
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                                                // unfinished barrel
                                0xA2A,                                                 // stool
                                0xC1F,                                                 // broken clock
                                0x1047, 0x1048,                                        // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4                         // barrel staves
                            };

                            if (Utility.Random(list.Length + 1) == 0)
                            {
                                preLoot = new Candelabra();
                            }
                            else
                            {
                                preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            }

                            break;
                        }
                        }

                        if (preLoot != null)
                        {
                            if (preLoot is IShipwreckedItem)
                            {
                                ((IShipwreckedItem)preLoot).IsShipwreckedItem = true;
                            }

                            return(preLoot);
                        }

                        LockableContainer chest;

                        if (Utility.RandomBool())
                        {
                            chest = new MetalGoldenChest();
                        }
                        else
                        {
                            chest = new WoodenChest();
                        }

                        if (sos.IsAncient)
                        {
                            chest.Hue = 0x481;
                        }

                        TreasureMapChest.Fill(chest, Math.Max(1, Math.Max(4, sos.Level)));

                        if (sos.IsAncient)
                        {
                            chest.DropItem(new FabledFishingNet());
                        }
                        else
                        {
                            chest.DropItem(new SpecialFishingNet());
                        }

                        chest.Movable   = true;
                        chest.Locked    = false;
                        chest.TrapType  = TrapType.None;
                        chest.TrapPower = 0;
                        chest.TrapLevel = 0;

                        sos.Delete();

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from));
        }
示例#4
0
        public override Item Construct(Type type, Mobile from, Item tool)
        {
            // Searing Weapon Support, handled elsewhere
            if (type == typeof(BaseWeapon))
            {
                return(null);
            }

            if (type == typeof(TreasureMap))
            {
                return(new TreasureMap(0, from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(MessageInABottle))
            {
                return(new MessageInABottle(from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(WhitePearl))
            {
                return(new WhitePearl());
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                List <SOS> messages = pack.FindItemsByType <SOS>();

                for (int i = 0; i < messages.Count; ++i)
                {
                    SOS sos = messages[i];

                    if ((from.Map == Map.Felucca || from.Map == Map.Trammel) && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;
                        bool dredge  = HasTypeHook(tool, HookType.Dredging);

                        switch (Utility.Random(17))
                        {
                        case 0:     // Body parts
                        case 1:
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,        // arm
                                0x1CE0, 0x1CE8,        // torso
                                0x1CE1, 0x1CE9,        // head
                                0x1CE2, 0x1CEC         // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list), dredge);
                            break;
                        }

                        case 2:     // Bone parts
                        case 3:
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list), dredge);
                            break;
                        }

                        case 4:     // Paintings and portraits
                        case 5:
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10), dredge);
                            break;
                        }

                        case 6:     // Pillows
                        case 7:
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11), dredge);
                            break;
                        }

                        case 8:     // Shells
                        case 9:
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9), dredge);
                            break;
                        }

                        case 10:     //Hats
                        case 11:
                        {
                            if (Utility.RandomBool())
                            {
                                preLoot = new SkullCap();
                            }
                            else
                            {
                                preLoot = new TricorneHat();
                            }

                            break;
                        }

                        case 12:     // Misc
                        case 13:
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                        // unfinished barrel
                                0xA2A,                         // stool
                                0xC1F,                         // broken clock
                                0x1047, 0x1048,                // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4 // barrel staves
                            };

                            if (Utility.Random(list.Length + 1) == 0)
                            {
                                preLoot = new Candelabra();
                            }
                            else
                            {
                                preLoot = new ShipwreckedItem(Utility.RandomList(list), dredge);
                            }

                            break;
                        }

                            #region High Seas
                        case 14:
                        {
                            int[] list = new int[]
                            {
                                0x1E19, 0x1E1A, 0x1E1B,         //Fish heads
                                0x1E2A, 0x1E2B,                 //Oars
                                0x1E71, 0x1E7A,                 //Unfinished drawers
                                0x1E75,                         //Unfinished legs
                            };

                            double ran = Utility.RandomDouble();

                            if (ran < 0.05)
                            {
                                preLoot = new YellowPolkaDotBikini();
                            }
                            else if (ran < 0.25)
                            {
                                preLoot = new ShipwreckedItem(list[Utility.RandomMinMax(3, 7)], dredge);
                            }
                            else
                            {
                                preLoot = new ShipwreckedItem(list[Utility.Random(3)], dredge);
                            }
                            break;
                        }
                            #endregion
                        }

                        if (preLoot != null)
                        {
                            if (preLoot is IShipwreckedItem)
                            {
                                ((IShipwreckedItem)preLoot).IsShipwreckedItem = true;
                            }

                            return(preLoot);
                        }

                        LockableContainer chest;

                        if (0.01 > Utility.RandomDouble())
                        {
                            chest = new ShipsStrongbox(sos.Level);
                        }
                        else
                        {
                            switch (sos.Level)
                            {
                            case 0: chest = new SOSChest(Utility.RandomBool() ? 0xE43 : 0xE41); break;

                            case 1: chest = new SOSChest(0xA306); break;

                            case 2: chest = new SOSChest(Utility.RandomBool() ? 0xE43 : 0xE41); break;

                            case 3: chest = new SOSChest(0xA308); break;

                            default:
                                if (.33 > Utility.RandomDouble())
                                {
                                    chest = new SOSChest(0xA30A);
                                }
                                else
                                {
                                    chest     = new SOSChest(Utility.RandomBool() ? 0xE41 : 0xE43);
                                    chest.Hue = 0x481;
                                }
                                break;
                            }
                        }

                        TreasureMapChest.Fill(from, chest, Math.Max(1, Math.Min(4, sos.Level)), true);
                        sos.OnSOSComplete(chest);

                        if (sos.IsAncient)
                        {
                            chest.DropItem(new FabledFishingNet());
                        }
                        else
                        {
                            chest.DropItem(new SpecialFishingNet());
                        }

                        chest.Movable   = true;
                        chest.Locked    = false;
                        chest.TrapType  = TrapType.None;
                        chest.TrapPower = 0;
                        chest.TrapLevel = 0;

                        chest.IsShipwreckedItem = true;

                        sos.Delete();

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from, tool));
        }
示例#5
0
        public override Item Construct(Type type, Mobile from)
        {
            if (type == typeof(TreasureMap))
            {
                int level;
                if (from is PlayerMobile && ((PlayerMobile)from).Young && from.Map == Map.Trammel && TreasureMap.IsInHavenIsland(from))
                {
                    level = 0;
                }
                else
                {
                    level = 1;
                }

                return(new TreasureMap(level, from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(MessageInABottle))
            {
                return(new MessageInABottle(SafeMap(from.Map)));
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                Item[] messages = pack.FindItemsByType(typeof(SOS));

                for (int i = 0; i < messages.Length; ++i)
                {
                    SOS sos = (SOS)messages[i];

                    if (from.Map == sos.TargetMap && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;

                        switch (Utility.Random(7))
                        {
                        case 0:                                 // Body parts
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,                                                // arm
                                0x1CE0, 0x1CE8,                                                // torso
                                0x1CE1, 0x1CE9,                                                // head
                                0x1CE2, 0x1CEC                                                 // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 1:                                 // Bone parts
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 2:                                 // Paintings and portraits
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10));
                            break;
                        }

                        case 3:                                 // Pillows
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11));
                            break;
                        }

                        case 4:                                 // Shells
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9));
                            break;
                        }

                        case 5:                                 // Misc
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                                                // unfinished barrel
                                0xA2A,                                                 // stool
                                0xC1F,                                                 // broken clock
                                0x1047, 0x1048,                                        // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4                         // barrel staves
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }
                        }

                        if (preLoot != null)
                        {
                            return(preLoot);
                        }

                        sos.Delete();

                        WoodenChest chest = new WoodenChest();

                        TreasureMapChest.Fill(chest, Utility.RandomMinMax(1, 3));

                        // TODO: Are there chances on this? All MIB's I've done had nets..
                        chest.DropItem(new SpecialFishingNet());

                        chest.Movable   = true;
                        chest.Locked    = false;
                        chest.TrapType  = TrapType.None;
                        chest.TrapPower = 0;

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from));
        }
示例#6
0
        public override void AddComponents()
        {
            IronGate gate = new IronGate(DoorFacing.EastCCW);

            m_Gate = gate;

            gate.KeyValue = Key.RandomValue();
            gate.Locked   = true;

            AddItem(gate, -2, 1, 0);

            MetalChest chest = new MetalChest();

            chest.ItemID       = 0xE7C;
            chest.LiftOverride = true;
            chest.DropItem(new Key(KeyType.Iron, gate.KeyValue));

            TreasureMapChest.Fill(chest, 3); //<---------Loot

            AddItem(chest, 4, 4, 1);         //<------z +1 to hover over static
            switch (Utility.Random(4))
            {
            case 0:
            {
                AddMobile(new Orc(), 15, 0, -2, 0);
                AddMobile(new OrcishMage(), 15, 0, 1, 0);
                AddMobile(new OrcishLord(), 15, 0, -2, 0);
                AddMobile(new OrcCaptain(), 15, 0, 1, 0);
                AddMobile(new Orc(), 15, 0, -1, 0);
                AddMobile(new OrcChopper(), 15, 0, -2, 0);
            } break;

            case 1:
            {
                AddMobile(new Ratman(), 15, 0, -2, 0);
                AddMobile(new Ratman(), 15, 0, 1, 0);
                AddMobile(new RatmanMage(), 15, 0, -2, 0);
                AddMobile(new Ratman(), 15, 0, 1, 0);
                AddMobile(new RatmanArcher(), 15, 0, -1, 0);
                AddMobile(new Ratman(), 15, 0, -2, 0);
            } break;

            case 2:
            {
                AddMobile(new Lizardman(), 15, 0, -2, 0);
                AddMobile(new Lizardman(), 15, 0, 1, 0);
                AddMobile(new Lizardman(), 15, 0, -2, 0);
                AddMobile(new Lizardman(), 15, 0, 1, 0);
                AddMobile(new Lizardman(), 15, 0, -1, 0);
                AddMobile(new Lizardman(), 15, 0, -2, 0);
            } break;

            case 3:
            {
                AddMobile(new Brigand(), 15, 0, -2, 0);
                AddMobile(new Brigand(), 15, 0, 1, 0);
                AddMobile(new Brigand(), 15, 0, -2, 0);
                AddMobile(new Brigand(), 15, 0, 1, 0);
                AddMobile(new Brigand(), 15, 0, -1, 0);
                AddMobile(new Brigand(), 15, 0, -2, 0);
            } break;
            }

            switch (Utility.Random(2))
            {
            case 0: m_Prisoner = new Noble(); break;

            case 1: m_Prisoner = new SeekerOfAdventure(); break;
            }

            m_Prisoner.YellHue = Utility.RandomList(0x57, 0x67, 0x77, 0x87, 0x117);

            AddMobile(m_Prisoner, 2, -2, 0, 0);
        }
示例#7
0
        public override Item Construct(Type type, Mobile from)
        {
            if (type == typeof(TreasureMap))
            {
                int level;
                //if ( from is PlayerMobile && ((PlayerMobile)from).Young && from.Map == Map.Trammel && TreasureMap.IsInHavenIsland( from ) )
                //	level = 0;
                //else
                level = 1;

                return(new TreasureMap(level, /*from.Map == Map.Felucca ?*/ Map.Felucca /* : Map.Trammel*/));
            }
            else if (type == typeof(MessageInABottle))
            {
                return(new MessageInABottle(/*from.Map == Map.Felucca ?*/ Map.Felucca /* : Map.Trammel*/));
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                List <SOS> messages = pack.FindItemsByType <SOS>();

                for (int i = 0; i < messages.Count; ++i)
                {
                    SOS sos = messages[i];

                    if (from.Map == sos.TargetMap && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;

                        switch (Utility.Random(8))
                        {
                        case 0:                                 // Body parts
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,                                                // arm
                                0x1CE0, 0x1CE8,                                                // torso
                                0x1CE1, 0x1CE9,                                                // head
                                0x1CE2, 0x1CEC                                                 // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 1:                                 // Bone parts
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 2:                                 // Paintings and portraits
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10));
                            break;
                        }

                        case 3:                                 // Pillows
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11));
                            break;
                        }

                        case 4:                                 // Shells
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9));
                            break;
                        }

                        case 5:                                 //Hats
                        {
                            if (Utility.RandomBool())
                            {
                                preLoot = new SkullCap();
                            }
                            else
                            {
                                preLoot = new TricorneHat();
                            }

                            break;
                        }

                        case 6:                                 // Misc
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                                                // unfinished barrel
                                0xA2A,                                                 // stool
                                0xC1F,                                                 // broken clock
                                0x1047, 0x1048,                                        // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4                         // barrel staves
                            };

                            if (Utility.Random(list.Length + 1) == 0)
                            {
                                preLoot = new Candelabra();
                            }
                            else
                            {
                                preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            }

                            break;
                        }
                        }

                        if (preLoot != null)
                        {
                            if (preLoot is IShipwreckedItem)
                            {
                                ((IShipwreckedItem)preLoot).IsShipwreckedItem = true;
                            }

                            return(preLoot);
                        }

                        LockableContainer chest = null;

                        switch (Utility.Random(3))
                        {
                        case 0: chest = new MetalGoldenChest(); break;

                        case 1: chest = new MetalChest(); break;

                        default:
                        case 2: chest = new WoodenChest(); break;
                        }

                        if (sos.IsAncient)
                        {
                            int hue = 1150;

                            if (0.20 > Utility.RandomDouble())
                            {
                                switch (Utility.Random((chest is WoodenChest) ? 6 : 14))
                                {
                                case 0: hue = 1193; break;

                                case 1: hue = 1281; break;

                                case 2: hue = 1190; break;

                                case 3: hue = 1165; break;

                                case 4: hue = 1160; break;

                                case 5: hue = 1126; break;

                                case 6: hue = CraftResources.GetInfo(CraftResource.Valorite).Hue; break;

                                case 7: hue = CraftResources.GetInfo(CraftResource.Verite).Hue; break;

                                case 8: hue = CraftResources.GetInfo(CraftResource.Agapite).Hue; break;

                                case 9: hue = CraftResources.GetInfo(CraftResource.Gold).Hue; break;

                                case 10: hue = CraftResources.GetInfo(CraftResource.Bronze).Hue; break;

                                case 11: hue = CraftResources.GetInfo(CraftResource.Copper).Hue; break;

                                case 12: hue = CraftResources.GetInfo(CraftResource.ShadowIron).Hue; break;

                                case 13: hue = CraftResources.GetInfo(CraftResource.DullCopper).Hue; break;
                                }
                            }

                            chest.Hue = hue;
                        }
                        else if ((chest is MetalChest || chest is MetalGoldenChest) && (0.5 * sos.Level) >= Utility.RandomDouble())
                        {
                            int           randhue  = Utility.Random(120);
                            CraftResource resource = CraftResource.None;

                            if (randhue >= 118)
                            {
                                resource = CraftResource.Valorite;
                            }
                            else if (randhue >= 115)
                            {
                                resource = CraftResource.Verite;
                            }
                            else if (randhue >= 110)
                            {
                                resource = CraftResource.Agapite;
                            }
                            else if (randhue >= 100)
                            {
                                resource = CraftResource.Gold;
                            }
                            else if (randhue >= 90)
                            {
                                resource = CraftResource.Bronze;
                            }
                            else if (randhue >= 70)
                            {
                                resource = CraftResource.Copper;
                            }
                            else if (randhue >= 40)
                            {
                                resource = CraftResource.ShadowIron;
                            }
                            else
                            {
                                resource = CraftResource.DullCopper;
                            }

                            chest.Hue = CraftResources.GetInfo(resource).Hue;
                        }

                        int soslevel = Math.Max(1, Math.Max(4, sos.Level));

                        TreasureMapChest.Fill(chest, soslevel);

                        if (sos.IsAncient)
                        {
                            chest.DropItem(new FabledFishingNet());
                        }
                        else
                        {
                            chest.DropItem(new SpecialFishingNet());
                        }

                        chest.Movable           = true;
                        chest.Locked            = false;
                        chest.Name              = "treasure chest";
                        chest.IsShipwreckedItem = true;

                        if (sos.Level > 0)
                        {
                            chest.TrapType  = TrapType.ExplosionTrap;
                            chest.TrapPower = soslevel * Utility.RandomMinMax(5, 15);
                            chest.TrapLevel = 0;
                        }
                        else
                        {
                            chest.TrapType  = TrapType.None;
                            chest.TrapPower = 0;
                            chest.TrapLevel = 0;
                        }

                        sos.Delete();

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from));
        }
        public override void GenerateLoot()
        {
            if (Core.UOAI || Core.UOAR)
            {
                PackGold(350, 500);
                PackGem();

                // TODO: jewelry, dungeon chest, healthy gland

                // Category 3 MID
                PackMagicItem(1, 2, 0.10);
                PackMagicItem(1, 2, 0.05);
            }
            else
            {
                if (Core.UOSP || Core.UOMO)
                {                       // page not found for 02 2002
                                        // http://web.archive.org/web/20021015005145/uo.stratics.com/hunters/plaguebeast.shtml
                                        // 600 - 1000 Gold, Gem, Armor, Magic Jewelry, Lootable Dungeon Chest, a healthy gland
                    if (Spawning)
                    {
                        PackGold(600, 1000);
                    }
                    else
                    {
                        PackGem(Utility.Random(1, 3));

                        PackArmor(1, 2, 0.10);

                        PackMagicJewelry(1, 2, 0.10);

                        // http://web.archive.org/web/20021015005145/uo.stratics.com/hunters/plaguebeast.shtml
                        // "and in the chest i got 2 vanqs, one durable supreme acc silver broad of vanq, and a dur/vanq mace."
                        // In the later docs we see that it's a metal chest
                        // http://uo.stratics.com/database/view.php?db_content=hunters&id=276
                        // "When killed, its corpse may contain a metal chest if it has devoured enough corpses."

                        /* General Information
                         * This hideous creature will strike with poisonous attacks, and other slimy creatures will spawn out of it,
                         * in the form of purple colored earth elementals, headless ones, people, gorillas, serpents and slimes,
                         * all known as "plague spawn".
                         * It will devour the corpses of the ones it slayed, and will turn human corpses into a pile of bones instantly.
                         * When killed, it's corpse may contain a dungeon chest, which can be looted, but not removed.
                         */

                        // we still need to verify the dopp rate and loot. For now just give a level 3 chest
                        // we will make this really rare since we need to verify so much
                        // note, the chest is not supposed to be movable, yet making it non movable prevents it from dropping
                        //	from the plaguebeast. *sigh*
                        //	also this chest is supposed to be related to the corpses eaten - more corpses, better loot
                        if (0.001 > Utility.RandomDouble() && false)
                        {
                            Container chest = new MetalGoldenChest();
                            TreasureMapChest.Fill((chest as LockableContainer), 3);
                            chest.Movable = true;
                            PackItem(chest);
                        }

                        // TODO: dungeon chest, healthy gland
                    }
                }
                else
                {                       // Standard RunUO
                    AddLoot(LootPack.FilthyRich);
                    AddLoot(LootPack.Gems, Utility.Random(1, 3));
                    // TODO: dungeon chest, healthy gland
                }
            }
        }
示例#9
0
        public override Item Construct(Type type, Mobile from, Item _i, HarvestDefinition _d, HarvestBank _b, HarvestResource _r)
        {
            if (type == typeof(TreasureMap))
            {
                int level = 1;

                return(new TreasureMap(level, Map.Felucca));
            }

            else if (type == typeof(MessageInABottle))
            {
                return(new MessageInABottle(Map.Felucca));
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                List <SOS> messages = pack.FindItemsByType <SOS>();

                for (int i = 0; i < messages.Count; ++i)
                {
                    SOS sos = messages[i];

                    if (from.Map == sos.TargetMap && from.InRange(sos.TargetLocation, 60) && !sos.Completed)
                    {
                        Item preLoot = null;

                        switch (Utility.Random(7))
                        {
                        case 0:     // Body parts
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,                                        // arm
                                0x1CE0, 0x1CE8,                                        // torso
                                0x1CE1, 0x1CE9,                                        // head
                                0x1CE2, 0x1CEC                                         // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 1:     // Bone parts
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 2:     // Pillows
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11));
                            break;
                        }

                        case 3:     // Shells
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9));
                            break;
                        }

                        case 4:         //Hats
                        {
                            if (Utility.RandomBool())
                            {
                                preLoot = new SkullCap();
                            }
                            else
                            {
                                preLoot = new TricorneHat();
                            }

                            break;
                        }

                        case 5:     // Misc
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                                        // unfinished barrel
                                0xA2A,                                         // stool
                                0xC1F,                                         // broken clock
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4                 // barrel staves
                            };

                            if (Utility.Random(list.Length + 1) == 0)
                            {
                                preLoot = new Candelabra();
                            }
                            else
                            {
                                preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            }

                            break;
                        }
                        }

                        if (preLoot != null)
                        {
                            if (preLoot is IShipwreckedItem)
                            {
                                ((IShipwreckedItem)preLoot).IsShipwreckedItem = true;
                            }

                            return(preLoot);
                        }

                        LockableContainer chest;

                        if (Utility.RandomBool())
                        {
                            chest = new MetalGoldenChest();
                        }
                        else
                        {
                            chest = new WoodenChest();
                        }

                        if (sos.IsAncient)
                        {
                            chest.Hue = 0x481;
                        }

                        TreasureMapChest.Fill(chest, Math.Max(1, Math.Min(3, (sos.Level + 1))));

                        if (sos.IsAncient)
                        {
                            chest.DropItem(new FabledFishingNet());
                        }
                        else
                        {
                            chest.DropItem(new SpecialFishingNet());
                        }

                        if (Utility.Random(500) == 0)
                        {
                            Item mask = new HornedTribalMask();
                            mask.Hue  = 2715;
                            mask.Name = "Mask of Cthulu";

                            chest.DropItem(mask);
                        }

                        switch (Utility.Random(300))
                        {
                        case 0:
                        {
                            Item rustedchest = new PlateChest();
                            rustedchest.Hue  = 2718;
                            rustedchest.Name = "a rusted platemail chest recovered from a shipwreck";

                            chest.DropItem(rustedchest);
                            break;
                        }

                        case 1:
                        {
                            Item rustedarms = new PlateArms();
                            rustedarms.Hue  = 2718;
                            rustedarms.Name = "rusted platemail arms recovered from a shipwreck";

                            chest.DropItem(rustedarms);
                            break;
                        }

                        case 2:
                        {
                            Item rustedlegs = new PlateLegs();
                            rustedlegs.Hue  = 2718;
                            rustedlegs.Name = "rusted platemail legguards recovered from a shipwreck";

                            chest.DropItem(rustedlegs);
                            break;
                        }

                        case 3:
                        {
                            Item rustedgloves = new PlateGloves();
                            rustedgloves.Hue  = 2718;
                            rustedgloves.Name = "rusted platemail gloves recovered from a shipwreck";

                            chest.DropItem(rustedgloves);
                            break;
                        }

                        case 4:
                        {
                            Item rustedgorget = new PlateGorget();
                            rustedgorget.Hue  = 2718;
                            rustedgorget.Name = "rusted platemail gorget recovered from a shipwreck";

                            chest.DropItem(rustedgorget);
                            break;
                        }

                        case 5:
                        {
                            Item rustedhelm = new PlateHelm();
                            rustedhelm.Hue  = 2718;
                            rustedhelm.Name = "a rusted platemail helmet recovered from a shipwreck";

                            chest.DropItem(rustedhelm);
                            break;
                        }
                        }

                        switch (Utility.Random(400))
                        {
                        case 0:
                        {
                            Item lamp = new LampPost1();
                            lamp.Name = "Britannia Head Light";
                            lamp.Hue  = 2601;

                            chest.DropItem(lamp);
                            break;
                        }

                        case 1:
                        {
                            Item lantern = new HangingLantern();
                            lantern.Name    = "Fog Lamp";
                            lantern.Hue     = 2601;
                            lantern.Movable = true;

                            chest.DropItem(lantern);
                            break;
                        }
                        }

                        chest.Movable   = true;
                        chest.Locked    = false;
                        chest.TrapType  = TrapType.None;
                        chest.TrapPower = 0;
                        chest.TrapLevel = 0;

                        sos.Completed = true;

                        BaseBoat ownerBoat = BaseBoat.FindBoatAt(from.Location, from.Map);

                        PlayerMobile player = from as PlayerMobile;

                        if (ownerBoat != null && player != null)
                        {
                            if (ownerBoat.IsFriend(player) || ownerBoat.IsOwner(player) || ownerBoat.IsCoOwner(player))
                            {
                                double doubloonValue = Utility.RandomMinMax(25, 50);

                                int finalDoubloonAmount = (int)doubloonValue;

                                bool shipOwner          = ownerBoat.IsOwner(player);
                                bool bankDoubloonsValid = false;
                                bool holdPlacementValid = false;

                                //Deposit Half In Player's Bank
                                if (Banker.DepositUniqueCurrency(player, typeof(Doubloon), finalDoubloonAmount))
                                {
                                    Doubloon doubloonPile = new Doubloon(finalDoubloonAmount);
                                    player.SendSound(doubloonPile.GetDropSound());
                                    doubloonPile.Delete();

                                    bankDoubloonsValid = true;
                                }

                                //Deposit Other Half in Ship
                                if (ownerBoat.DepositDoubloons(finalDoubloonAmount))
                                {
                                    Doubloon doubloonPile = new Doubloon(finalDoubloonAmount);
                                    player.SendSound(doubloonPile.GetDropSound());
                                    doubloonPile.Delete();

                                    holdPlacementValid = true;
                                }

                                if (shipOwner)
                                {
                                    player.PirateScore += finalDoubloonAmount;
                                    //ownerBoat.doubloonsEarned += finalDoubloonAmount * 2;

                                    if (bankDoubloonsValid && holdPlacementValid)
                                    {
                                        player.SendMessage("You've received " + (finalDoubloonAmount * 2).ToString() + " doubloons for completing a message in a bottle! They have been evenly split between your bank box and your ship's hold.");
                                    }

                                    else if (bankDoubloonsValid && !holdPlacementValid)
                                    {
                                        player.SendMessage("You've earned " + (finalDoubloonAmount * 2).ToString() + " doubloons, however there was not enough room to place all of them in your ship's hold.");
                                    }

                                    else if (!bankDoubloonsValid && holdPlacementValid)
                                    {
                                        player.SendMessage("You've earned " + (finalDoubloonAmount * 2).ToString() + " doubloons, however there was not enough room to place all of them in your bank box.");
                                    }
                                }

                                else
                                {
                                    //ownerBoat.doubloonsEarned += finalDoubloonAmount;
                                    player.PirateScore += finalDoubloonAmount;

                                    if (bankDoubloonsValid)
                                    {
                                        player.SendMessage("You've earned " + finalDoubloonAmount.ToString() + " doubloons for completing a message in a bottle! They have been placed in your bank box.");
                                    }

                                    else
                                    {
                                        player.SendMessage("You've earned doubloons, but there was not enough room to place all of them in your bank box.");
                                    }
                                }
                            }
                        }

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from, _i, _d, _b, _r));
        }
示例#10
0
        public override Item Construct(Type type, Mobile from, object[] args)
        {
            if (type == typeof(TreasureMap))
            {
                return(new TreasureMap(1, from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(MessageInABottle))
            {                   // build a level N mib based on the good fishing map level
                if (args != null && args.Length == 2 && args[0] == typeof(MessageInABottle) && args[1] is int)
                {
                    return(new MessageInABottle(SafeMap(from.Map), (int)args[1]));
                }
                return(new MessageInABottle(SafeMap(from.Map)));
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                Item[] messages = pack.FindItemsByType(typeof(SOS));

                for (int i = 0; i < messages.Length; ++i)
                {
                    SOS sos = (SOS)messages[i];

                    if (from.Map == sos.TargetMap && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;

                        switch (Utility.Random(7))
                        {
                        case 0:                                 // Body parts
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,                                                // arm
                                0x1CE0, 0x1CE8,                                                // torso
                                0x1CE1, 0x1CE9,                                                // head
                                0x1CE2, 0x1CEC                                                 // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 1:                                 // Bone parts
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 2:                                 // Paintings and portraits
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10));
                            break;
                        }

                        case 3:                                 // Pillows
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11));
                            break;
                        }

                        case 4:                                 // Shells
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9));
                            break;
                        }

                        case 5:                                 // Misc
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                                                // unfinished barrel
                                0xA2A,                                                 // stool
                                0xC1F,                                                 // broken clock
                                0x1047, 0x1048,                                        // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4                         // barrel staves
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }
                        }

                        if (preLoot != null)
                        {
                            return(preLoot);
                        }

                        Container chest = null;

                        if (sos.Level >= 4 && Utility.RandomChance(10))
                        {
                            chest = new MetalGoldenChest();
                        }
                        else
                        {
                            chest = new WoodenChest();
                        }

                        // regular sos's have a chance at a 1, 2 or 3. high level sos's are high level chests
                        int level = (sos.Level >= 4) ? sos.Level : Utility.RandomMinMax(1, 3);
                        TreasureMapChest.Fill((chest as LockableContainer), level);

                        // add 50% more gold since we are decreasing the chance to get rares
                        Item[] golds = chest.FindItemsByType(typeof(Gold));
                        if (golds != null && golds.Length > 0)
                        {
                            int total = 0;
                            for (int tx = 0; tx < golds.Length; tx++)
                            {
                                total += (golds[tx] as Gold).Amount;
                            }

                            // add 50% more gold
                            chest.DropItem(new Gold(total / 2));

                            // add some cursed gold
                            chest.DropItem(new CursedGold(total / 8));
                        }

                        // adjust high end loot by removing high end weapons and armor
                        if (sos.Level >= 4)
                        {
                            // trim the high end weps and armor so as not to to give away all the highend weapons usually reserved for Treasure Map hunters
                            Item[] lootz     = chest.FindItemsByType(new Type[] { typeof(EnchantedScroll), typeof(BaseArmor), typeof(BaseWeapon) });
                            int    LootzKeep = level == 4 ? Utility.RandomList(2) + 2 : Utility.RandomList(3) + 2;

                            if (lootz != null && lootz.Length > LootzKeep)
                            {
                                // remove some items as we're dropping too much for the sea chest
                                int toDel = lootz.Length - LootzKeep;
                                for (int ox = 0; ox < toDel; ox++)
                                {
                                    Item dx = lootz[ox];
                                    chest.RemoveItem(dx);
                                    dx.Delete();
                                }
                            }
                        }

                        // TODO: Are there chances on this? All MIB's I've done had nets..
                        chest.DropItem(new SpecialFishingNet());

                        // add Good Fishing bonus lootz
                        if (Utility.RandomChance(sos.Level * 8))
                        {
                            switch (sos.Level)
                            {
                            case 1:
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x0DBB),                                                 // 3515 (0x0DBB) Seaweed
                                        new AddonDeed(0x0C2E),                                                 // 3118 (0x0C2E) debris
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x154D),                                                          // 5453 (0x054D) water barrel – empty or filled we don't have them on ai yet.
                                        new AddonDeed(0x0DC9),                                                          // 3529 (0x0DC9) fishing net – unhued and oddly shaped
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                break;

                            case 2:
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x1E9A),                                                 // 7834 (0x1E9A) hook
                                        new AddonDeed(0x1E9D),                                                 // 7837 (0x1E9D) pulleys
                                        new AddonDeed(0x1E9E),                                                 // 7838 (0x1E9E) Pulley
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x1EA0),                                                 // 7840 (0x1EA0) Rope
                                        new AddonDeed(0x1EA9, Direction.South),                                // 7849 (0x1EA9) Winch – south
                                        new AddonDeed(0x1EAC, Direction.East),                                 // 7852 (0x1EAC) Winch – east
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                break;

                            case 3:
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x0FCD, Direction.South),                                               // 4045 (0x0FCD) string of shells – south
                                        new AddonDeed(0x0FCE, Direction.South),                                               // 4046 (0x0FCE) string of shells – south
                                        new AddonDeed(0x0FCF, Direction.South),                                               // 4047 (0x0FCF) – string of shells – south
                                        new AddonDeed(0x0FD0, Direction.South),                                               // 4048 (0x0FD0) – string of shells – south
                                        new AddonDeed(0x0FD1, Direction.East),                                                // 4049 (0x0FD1) – string of shells – east
                                        new AddonDeed(0x0FD2, Direction.East),                                                // 4050 (0x0FD2) – string of shells – east
                                        new AddonDeed(0x0FD3, Direction.East),                                                // 4051 (0x0FD3) – string of shells – east
                                        new AddonDeed(0x0FD4, Direction.East),                                                // 4052 (0x0FD4) – string of shells – east
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    switch (Utility.Random(4))
                                    {
                                    case 0:
                                        // 4099 (0x1003) – Spittoon
                                        chest.DropItem(new ShipwreckedItem(0x1003));
                                        break;

                                    case 1:
                                        // 4091 (0x0FFB) – Skull mug 1
                                        chest.DropItem(new ShipwreckedItem(0x0FFB));
                                        break;

                                    case 2:
                                        // 4092 (0x0FFC) – Skull mug 2
                                        chest.DropItem(new ShipwreckedItem(0x0FFC));
                                        break;

                                    case 3:
                                        // 3700 (0x0E74) Cannon Balls
                                        chest.DropItem(new AddonDeed(0x0E74));
                                        break;
                                    }
                                }
                                break;

                            case 4:
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x0C2C),                                                 // 3116 (0x0C2C) Ruined Painting
                                        new AddonDeed(0x0C18),                                                 // 3096 (0x0C18) Covered chair - (server birth on osi)
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    Item[] list = new Item[]
                                    {
                                        new AddonDeed(0x1EA3, Direction.South),                                                 // 7843 (0x1EA3) net – south
                                        new AddonDeed(0x1EA4, Direction.East),                                                  // 7844 (0x1EA4) net – east
                                        new AddonDeed(0x1EA5, Direction.South),                                                 // 7845 (0x1EA5) net – south
                                        new AddonDeed(0x1EA6, Direction.East),                                                  // 7846 (0x1EA6) net – east
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                break;

                            case 5:
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new DarkFlowerTapestrySouthDeed(),
                                        new DarkFlowerTapestryEastDeed(),
                                        new LightTapestrySouthDeed(),
                                        new LightTapestryEastDeed(),
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    Item[] list = new Item[]
                                    {
                                        new DarkTapestrySouthDeed(),
                                        new DarkTapestryEastDeed(),
                                        new LightFlowerTapestrySouthDeed(),
                                        new LightFlowerTapestryEastDeed(),
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                break;
                            }
                        }

                        // 1 in 1000 chance at the actual item (rare)
                        if (Utility.RandomChance(.1))
                        {
                            switch (sos.Level)
                            {
                            case 1:
                                if (Utility.RandomChance(10))
                                {
                                    int[] list = new int[]
                                    {
                                        0x0DBB,                                         // 3515 (0x0DBB) Seaweed
                                        0x0C2E,                                         // 3118 (0x0C2E) debris
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                else
                                {
                                    int[] list = new int[]
                                    {
                                        0x154D,                                                 // 5453 (0x054D) water barrel – empty or filled we don't have them on ai yet.
                                        0x0DC9,                                                 // 3529 (0x0DC9) fishing net – unhued and oddly shaped
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                break;

                            case 2:
                                if (Utility.RandomChance(10))
                                {
                                    int[] list = new int[]
                                    {
                                        0x1E9A,                                         // 7834 (0x1E9A) hook
                                        0x1E9D,                                         // 7837 (0x1E9D) pulleys
                                        0x1E9E,                                         // 7838 (0x1E9E) Pulley
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                else
                                {
                                    int[] list = new int[]
                                    {
                                        0x1EA0,                                         // 7840 (0x1EA0) Rope
                                        0x1EA9,                                         // 7849 (0x1EA9) Winch – south
                                        0x1EAC,                                         // 7852 (0x1EAC) Winch – east
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                break;

                            case 3:
                                if (Utility.RandomChance(10))
                                {
                                    int[] list = new int[]
                                    {
                                        0x0FCD,                                         // 4045 (0x0FCD) string of shells – south
                                        0x0FCE,                                         // 4046 (0x0FCE) string of shells – south
                                        0x0FCF,                                         // 4047 (0x0FCF) – string of shells – south
                                        0x0FD0,                                         // 4048 (0x0FD0) – string of shells – south
                                        0x0FD1,                                         // 4049 (0x0FD1) – string of shells – east
                                        0x0FD2,                                         // 4050 (0x0FD2) – string of shells – east
                                        0x0FD3,                                         // 4051 (0x0FD3) – string of shells – east
                                        0x0FD4,                                         // 4052 (0x0FD4) – string of shells – east
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                else
                                {
                                    int[] list = new int[]
                                    {
                                        0x1003,                                         // 4099 (0x1003) – Spittoon
                                        0x0FFB,                                         // 4091 (0x0FFB) – Skull mug 1
                                        0x0FFC,                                         // 4092 (0x0FFC) – Skull mug 2
                                        0x0E74,                                         // 3700 (0x0E74) Cannon Balls
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                break;

                            case 4:
                                if (Utility.RandomChance(10))
                                {
                                    int[] list = new int[]
                                    {
                                        0x0C2C,                                         // 3116 (0x0C2C) Ruined Painting
                                        0x0C18,                                         // 3096 (0x0C18) Covered chair - (server birth on osi)
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                else
                                {
                                    int[] list = new int[]
                                    {
                                        0x1EA3,                                         // 7843 (0x1EA3) net – south
                                        0x1EA4,                                         // 7844 (0x1EA4) net – east
                                        0x1EA5,                                         // 7845 (0x1EA5) net – south
                                        0x1EA6,                                         // 7846 (0x1EA6) net – east
                                    };
                                    chest.DropItem(new ShipwreckedItem(Utility.RandomList(list)));
                                }
                                break;

                            case 5:                                     // same frequent drop
                                if (Utility.RandomChance(10))
                                {
                                    Item[] list = new Item[]
                                    {
                                        new DarkFlowerTapestrySouthDeed(),
                                        new DarkFlowerTapestryEastDeed(),
                                        new LightTapestrySouthDeed(),
                                        new LightTapestryEastDeed(),
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                else
                                {
                                    Item[] list = new Item[]
                                    {
                                        new DarkTapestrySouthDeed(),
                                        new DarkTapestryEastDeed(),
                                        new LightFlowerTapestrySouthDeed(),
                                        new LightFlowerTapestryEastDeed(),
                                    };
                                    chest.DropItem(Utility.RandomList(list));
                                }
                                break;
                            }
                        }

                        (chest as LockableContainer).Movable   = true;
                        (chest as LockableContainer).Locked    = false;
                        (chest as LockableContainer).TrapType  = TrapType.None;
                        (chest as LockableContainer).TrapPower = 0;
                        (chest as LockableContainer).TrapLevel = 0;

                        sos.Delete();

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from, args));
        }
示例#11
0
        public override Item Construct(Type type, Mobile from)
        {
            if (type == typeof(TreasureMap))
            {
                int level;
                if (from is PlayerMobile && ((PlayerMobile)from).Young && from.Map == Map.Trammel && TreasureMap.IsInHavenIsland(from))
                {
                    level = 0;
                }
                else
                {
                    level = 1;
                }

                return(new TreasureMap(level, from.Map == Map.Felucca ? Map.Felucca : Map.Trammel));
            }
            else if (type == typeof(MessageInABottle))
            {
                return(new MessageInABottle(SafeMap(from.Map)));
            }

            Container pack = from.Backpack;

            if (pack != null)
            {
                Item[] messages = pack.FindItemsByType(typeof(SOS));

                for (int i = 0; i < messages.Length; ++i)
                {
                    SOS sos = (SOS)messages[i];

                    if (from.Map == sos.TargetMap && from.InRange(sos.TargetLocation, 60))
                    {
                        Item preLoot = null;

                        switch (Utility.Random(7))
                        {
                        case 0:                                 // Body parts
                        {
                            int[] list = new int[]
                            {
                                0x1CDD, 0x1CE5,                                                // arm
                                0x1CE0, 0x1CE8,                                                // torso
                                0x1CE1, 0x1CE9,                                                // head
                                0x1CE2, 0x1CEC                                                 // leg
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 1:                                 // Bone parts
                        {
                            int[] list = new int[]
                            {
                                0x1AE0, 0x1AE1, 0x1AE2, 0x1AE3, 0x1AE4,                         // skulls
                                0x1B09, 0x1B0A, 0x1B0B, 0x1B0C, 0x1B0D, 0x1B0E, 0x1B0F, 0x1B10, // bone piles
                                0x1B15, 0x1B16                                                  // pelvis bones
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            break;
                        }

                        case 2:                                 // Paintings and portraits
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xE9F, 10));
                            break;
                        }

                        case 3:                                 // Pillows
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0x13A4, 11));
                            break;
                        }

                        case 4:                                 // Shells
                        {
                            preLoot = new ShipwreckedItem(Utility.Random(0xFC4, 9));
                            break;
                        }

                        case 5:                                 // Misc
                        {
                            int[] list = new int[]
                            {
                                0x1EB5,                                         // unfinished barrel
                                0xA2A,                                          // stool
                                0xC1F,                                          // broken clock
                                0x1047, 0x1048,                                 // globe
                                0x1EB1, 0x1EB2, 0x1EB3, 0x1EB4,                 // barrel staves
                                0xB5B, 0xB4F, 0xB5E, 0xB57, 0xB53,              // chairs
                                0x1560, 0x1562, 0x155D, 0x155E, 0x1582, 0x1634, //Deco Bows/Swords
                                0x156C, 0x157E, 0x1580, 0x1565, 0x1578, 0x1569, //Deco Shields/Axe
                                0xC1B, 0xC10, 0xC19, 0xC2C, 0xC2D, 0xB95,       // Ruined things/Sign
                                0xE31, 0x19AA, 0x1853, 0x9FB, 0xA05, 0xA26,     // Light sources
                                0x1EA7, 0x26AC, 0x1879, 0x1005, 0x185B, 0xEFB,  // Misc items
                                0x1810, 0xEFC, 0X14F8, 0x166E                   // More Misc Items
                                //
                                // *** Can easily add more stuff to fish up while doing chest!!
                                //
                            };

                            preLoot = new ShipwreckedItem(Utility.RandomList(list));
                            // This statement converts to Item and tags "... from shipwreck"
                            break;
                        }
                        }

                        if (preLoot != null)                    // Drew a "0-5" in above Case Stmt and have preLoot
                        {
                            if (0.143 > Utility.RandomDouble()) // Spawn weak monster ~ every 7 tries
                            {
                                BaseCreature serp1;

                                switch (Utility.Random(5))
                                {
                                case 0:  { serp1 = new IcebergSnake(); break; }

                                case 1:  { serp1 = new SeaSlime(); break; }

                                case 2:  { serp1 = new SeaWorm(); break; }

                                case 3:  { serp1 = new ToxicSlime(); break; }

                                default: { serp1 = new OilSlime(); break; }
                                }

                                int x = from.X, y = from.Y;
                                Map map = from.Map;

                                for (int ii = 0; map != null && ii < 20; ++ii)
                                {
                                    int  tx = from.X - 10 + Utility.Random(21);
                                    int  ty = from.Y - 10 + Utility.Random(21);
                                    Tile t  = map.Tiles.GetLandTile(tx, ty);

                                    if (t.Z == -5 && ((t.ID >= 0xA8 && t.ID <= 0xAB) || (t.ID >= 0x136 && t.ID <= 0x137)) && !Spells.SpellHelper.CheckMulti(new Point3D(tx, ty, -5), map))
                                    {
                                        x = tx;
                                        y = ty;
                                        break;
                                    }
                                }

                                serp1.MoveToWorld(new Point3D(x, y, -5), map);
                                serp1.Home      = serp1.Location;
                                serp1.RangeHome = 10;
                                from.SendLocalizedMessage(503170); // Uh oh! That doesn't look like a fish!
                            }

                            return(preLoot);
                        }

                        sos.Delete();

                        WoodenChest chest = new WoodenChest();

                        TreasureMapChest.Fill(chest, Utility.RandomMinMax(1, 4));

                        // TODO: Are there chances on this? All MIB's I've done had nets..
                        chest.DropItem(new SpecialFishingNet());

                        chest.Movable   = true;
                        chest.Locked    = false;
                        chest.TrapType  = TrapType.None;
                        chest.TrapPower = 0;

                        return(chest);
                    }
                }
            }

            return(base.Construct(type, from));
        }