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)); }
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)); }
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)); }
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 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)); }
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)); }