fix: Fixes scales, heritage items, and codegens holiday items (#1365)

This commit is contained in:
Kamron Batman 2023-03-07 22:38:35 -08:00 • committed by GitHub
parent f1e8d4c6f7
commit 0645251ec7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
80 changed files with 1825 additions and 2694 deletions

View file

@ -1,8 +1,14 @@
using ModernUO.Serialization;
namespace Server.Items; namespace Server.Items;
public abstract class BaseScales : Item, ICommodity [SerializationGenerator(1, false)]
public abstract partial class BaseScales : Item, ICommodity
{ {
private CraftResource m_Resource; [InvalidateProperties]
[SerializableField(0)]
[SerializedCommandProperty(AccessLevel.GameMaster)]
private CraftResource _resource;
public BaseScales(CraftResource resource, int amount = 1) : base(0x26B4) public BaseScales(CraftResource resource, int amount = 1) : base(0x26B4)
{ {
@ -10,211 +16,74 @@ public abstract class BaseScales : Item, ICommodity
Amount = amount; Amount = amount;
Hue = CraftResources.GetHue(resource); Hue = CraftResources.GetHue(resource);
m_Resource = resource; _resource = resource;
}
public BaseScales(Serial serial) : base(serial)
{
} }
public override int LabelNumber => 1053139; // dragon scales public override int LabelNumber => 1053139; // dragon scales
[CommandProperty(AccessLevel.GameMaster)]
public CraftResource Resource
{
get => m_Resource;
set
{
m_Resource = value;
InvalidateProperties();
}
}
public override double DefaultWeight => 0.1; public override double DefaultWeight => 0.1;
int ICommodity.DescriptionNumber => LabelNumber; int ICommodity.DescriptionNumber => LabelNumber;
bool ICommodity.IsDeedable => true; bool ICommodity.IsDeedable => true;
public override void Serialize(IGenericWriter writer) private void Deserialize(IGenericReader reader, int version)
{ {
base.Serialize(writer); _resource = (CraftResource)reader.ReadInt();
writer.Write(0); // version
writer.Write((int)m_Resource);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
switch (version)
{
case 0:
{
m_Resource = (CraftResource)reader.ReadInt();
break;
}
}
} }
} }
public class RedScales : BaseScales [SerializationGenerator(0, false)]
public partial class RedScales : BaseScales
{ {
[Constructible] [Constructible]
public RedScales(int amount = 1) : base(CraftResource.RedScales, amount) public RedScales(int amount = 1) : base(CraftResource.RedScales, amount)
{ {
} }
public RedScales(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
public class YellowScales : BaseScales [SerializationGenerator(0, false)]
public partial class YellowScales : BaseScales
{ {
[Constructible] [Constructible]
public YellowScales(int amount = 1) : base(CraftResource.YellowScales, amount) public YellowScales(int amount = 1) : base(CraftResource.YellowScales, amount)
{ {
} }
public YellowScales(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
public class BlackScales : BaseScales [SerializationGenerator(0, false)]
public partial class BlackScales : BaseScales
{ {
[Constructible] [Constructible]
public BlackScales(int amount = 1) : base(CraftResource.BlackScales, amount) public BlackScales(int amount = 1) : base(CraftResource.BlackScales, amount)
{ {
} }
public BlackScales(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
public class GreenScales : BaseScales [SerializationGenerator(0, false)]
public partial class GreenScales : BaseScales
{ {
[Constructible] [Constructible]
public GreenScales(int amount = 1) : base(CraftResource.GreenScales, amount) public GreenScales(int amount = 1) : base(CraftResource.GreenScales, amount)
{ {
} }
public GreenScales(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
public class WhiteScales : BaseScales [SerializationGenerator(0, false)]
public partial class WhiteScales : BaseScales
{ {
[Constructible] [Constructible]
public WhiteScales(int amount = 1) : base(CraftResource.WhiteScales, amount) public WhiteScales(int amount = 1) : base(CraftResource.WhiteScales, amount)
{ {
} }
public WhiteScales(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
public class BlueScales : BaseScales [SerializationGenerator(0, false)]
public partial class BlueScales : BaseScales
{ {
[Constructible] [Constructible]
public BlueScales(int amount = 1) : base(CraftResource.BlueScales, amount) public BlueScales(int amount = 1) : base(CraftResource.BlueScales, amount)
{ {
} }
public BlueScales(Serial serial) : base(serial)
{
}
public override int LabelNumber => 1053140; // sea serpent scales public override int LabelNumber => 1053140; // sea serpent scales
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}

View file

@ -111,7 +111,8 @@ public partial class GuillotineAddon : BaseAddon
} }
} }
public class GuillotineDeed : BaseAddonDeed [SerializationGenerator(0)]
public partial class GuillotineDeed : BaseAddonDeed
{ {
[Constructible] [Constructible]
public GuillotineDeed() => LootType = LootType.Blessed; public GuillotineDeed() => LootType = LootType.Blessed;

View file

@ -1,303 +1,211 @@
using System.Collections.Generic; using ModernUO.Serialization;
using Server.Multis; using Server.Multis;
namespace Server.Items namespace Server.Items;
public enum HolidayTreeType
{ {
public enum HolidayTreeType Classic,
Modern
}
[SerializationGenerator(2, false)]
public partial class HolidayTree : Item, IAddon
{
[SerializableField(0)]
[SerializedCommandProperty(AccessLevel.GameMaster)]
private Mobile _placer;
private Item[] _components;
public HolidayTree(Mobile from, HolidayTreeType type, Point3D loc) : base(1)
{ {
Classic, Movable = false;
Modern MoveToWorld(loc, from.Map);
Placer = from;
var index = 0;
switch (type)
{
case HolidayTreeType.Classic:
{
ItemID = 0xCD7;
_components = new Item[28];
AddItem(0, 0, 0, new TreeTrunk(this, 0xCD6), index++);
AddOrnament(0, 0, 2, 0xF22, index++);
AddOrnament(0, 0, 9, 0xF18, index++);
AddOrnament(0, 0, 15, 0xF20, index++);
AddOrnament(0, 0, 19, 0xF17, index++);
AddOrnament(0, 0, 20, 0xF24, index++);
AddOrnament(0, 0, 20, 0xF1F, index++);
AddOrnament(0, 0, 20, 0xF19, index++);
AddOrnament(0, 0, 21, 0xF1B, index++);
AddOrnament(0, 0, 28, 0xF2F, index++);
AddOrnament(0, 0, 30, 0xF23, index++);
AddOrnament(0, 0, 32, 0xF2A, index++);
AddOrnament(0, 0, 33, 0xF30, index++);
AddOrnament(0, 0, 34, 0xF29, index++);
AddOrnament(0, 1, 7, 0xF16, index++);
AddOrnament(0, 1, 7, 0xF1E, index++);
AddOrnament(0, 1, 12, 0xF0F, index++);
AddOrnament(0, 1, 13, 0xF13, index++);
AddOrnament(0, 1, 18, 0xF12, index++);
AddOrnament(0, 1, 19, 0xF15, index++);
AddOrnament(0, 1, 25, 0xF28, index++);
AddOrnament(0, 1, 29, 0xF1A, index++);
AddOrnament(0, 1, 37, 0xF2B, index++);
AddOrnament(1, 0, 13, 0xF10, index++);
AddOrnament(1, 0, 14, 0xF1C, index++);
AddOrnament(1, 0, 16, 0xF14, index++);
AddOrnament(1, 0, 17, 0xF26, index++);
AddOrnament(1, 0, 22, 0xF27, index);
break;
}
case HolidayTreeType.Modern:
{
ItemID = 0x1B7E;
_components = new Item[23];
AddOrnament(0, 0, 2, 0xF2F, index++);
AddOrnament(0, 0, 2, 0xF20, index++);
AddOrnament(0, 0, 2, 0xF22, index++);
AddOrnament(0, 0, 5, 0xF30, index++);
AddOrnament(0, 0, 5, 0xF15, index++);
AddOrnament(0, 0, 5, 0xF1F, index++);
AddOrnament(0, 0, 5, 0xF2B, index++);
AddOrnament(0, 0, 6, 0xF0F, index++);
AddOrnament(0, 0, 7, 0xF1E, index++);
AddOrnament(0, 0, 7, 0xF24, index++);
AddOrnament(0, 0, 8, 0xF29, index++);
AddOrnament(0, 0, 9, 0xF18, index++);
AddOrnament(0, 0, 14, 0xF1C, index++);
AddOrnament(0, 0, 15, 0xF13, index++);
AddOrnament(0, 0, 15, 0xF20, index++);
AddOrnament(0, 0, 16, 0xF26, index++);
AddOrnament(0, 0, 17, 0xF12, index++);
AddOrnament(0, 0, 18, 0xF17, index++);
AddOrnament(0, 0, 20, 0xF1B, index++);
AddOrnament(0, 0, 23, 0xF28, index++);
AddOrnament(0, 0, 25, 0xF18, index++);
AddOrnament(0, 0, 25, 0xF2A, index++);
AddOrnament(0, 1, 7, 0xF16, index);
break;
}
}
} }
public class HolidayTree : Item, IAddon public override int LabelNumber => 1041117; // a tree for the holidays
public bool CouldFit(IPoint3D p, Map map) => map.CanFit((Point3D)p, 20);
Item IAddon.Deed => new HolidayTreeDeed();
public override void OnAfterDelete()
{ {
private List<Item> m_Components; for (var i = 0; i < _components.Length; ++i)
public HolidayTree(Mobile from, HolidayTreeType type, Point3D loc) : base(1)
{ {
Movable = false; _components[i]?.Delete();
MoveToWorld(loc, from.Map); }
Placer = from; _components = null;
m_Components = new List<Item>(); }
switch (type) private void AddOrnament(int x, int y, int z, int itemID, int index)
{
AddItem(x + 1, y + 1, z + 11, new Ornament(itemID), index);
}
private void AddItem(int x, int y, int z, Item item, int index)
{
item.MoveToWorld(new Point3D(Location.X + x, Location.Y + y, Location.Z + z), Map);
_components[index] = item;
}
private void Deserialize(IGenericReader reader, int version)
{
_placer = reader.ReadEntity<Mobile>();
var count = reader.ReadInt();
_components = new Item[count];
for (var i = 0; i < count; ++i)
{
var item = reader.ReadEntity<Item>();
if (item != null)
{ {
case HolidayTreeType.Classic: _components[i] = item;
{
ItemID = 0xCD7;
AddItem(0, 0, 0, new TreeTrunk(this, 0xCD6));
AddOrnament(0, 0, 2, 0xF22);
AddOrnament(0, 0, 9, 0xF18);
AddOrnament(0, 0, 15, 0xF20);
AddOrnament(0, 0, 19, 0xF17);
AddOrnament(0, 0, 20, 0xF24);
AddOrnament(0, 0, 20, 0xF1F);
AddOrnament(0, 0, 20, 0xF19);
AddOrnament(0, 0, 21, 0xF1B);
AddOrnament(0, 0, 28, 0xF2F);
AddOrnament(0, 0, 30, 0xF23);
AddOrnament(0, 0, 32, 0xF2A);
AddOrnament(0, 0, 33, 0xF30);
AddOrnament(0, 0, 34, 0xF29);
AddOrnament(0, 1, 7, 0xF16);
AddOrnament(0, 1, 7, 0xF1E);
AddOrnament(0, 1, 12, 0xF0F);
AddOrnament(0, 1, 13, 0xF13);
AddOrnament(0, 1, 18, 0xF12);
AddOrnament(0, 1, 19, 0xF15);
AddOrnament(0, 1, 25, 0xF28);
AddOrnament(0, 1, 29, 0xF1A);
AddOrnament(0, 1, 37, 0xF2B);
AddOrnament(1, 0, 13, 0xF10);
AddOrnament(1, 0, 14, 0xF1C);
AddOrnament(1, 0, 16, 0xF14);
AddOrnament(1, 0, 17, 0xF26);
AddOrnament(1, 0, 22, 0xF27);
break;
}
case HolidayTreeType.Modern:
{
ItemID = 0x1B7E;
AddOrnament(0, 0, 2, 0xF2F);
AddOrnament(0, 0, 2, 0xF20);
AddOrnament(0, 0, 2, 0xF22);
AddOrnament(0, 0, 5, 0xF30);
AddOrnament(0, 0, 5, 0xF15);
AddOrnament(0, 0, 5, 0xF1F);
AddOrnament(0, 0, 5, 0xF2B);
AddOrnament(0, 0, 6, 0xF0F);
AddOrnament(0, 0, 7, 0xF1E);
AddOrnament(0, 0, 7, 0xF24);
AddOrnament(0, 0, 8, 0xF29);
AddOrnament(0, 0, 9, 0xF18);
AddOrnament(0, 0, 14, 0xF1C);
AddOrnament(0, 0, 15, 0xF13);
AddOrnament(0, 0, 15, 0xF20);
AddOrnament(0, 0, 16, 0xF26);
AddOrnament(0, 0, 17, 0xF12);
AddOrnament(0, 0, 18, 0xF17);
AddOrnament(0, 0, 20, 0xF1B);
AddOrnament(0, 0, 23, 0xF28);
AddOrnament(0, 0, 25, 0xF18);
AddOrnament(0, 0, 25, 0xF2A);
AddOrnament(0, 1, 7, 0xF16);
break;
}
} }
} }
}
public HolidayTree(Serial serial) : base(serial) [AfterDeserialization(false)]
private void AfterDeserialization()
{
if (BaseHouse.FindHouseAt(this) == null)
{ {
var deed = new HolidayTreeDeed();
deed.MoveToWorld(Location, Map);
Delete();
}
}
public override void OnDoubleClick(Mobile from)
{
if (!from.InRange(GetWorldLocation(), 1))
{
from.SendLocalizedMessage(500446); // That is too far away.
return;
} }
[CommandProperty(AccessLevel.GameMaster)] if (_placer != null && from != _placer && from.AccessLevel < AccessLevel.GameMaster)
public Mobile Placer { get; set; } {
from.SendLocalizedMessage(503396); // You cannot take this tree down.
return;
}
from.AddToBackpack(new HolidayTreeDeed());
Delete();
BaseHouse.FindHouseAt(this)?.Addons?.Remove(this);
from.SendLocalizedMessage(503393); // A deed for the tree has been placed in your backpack.
}
[SerializationGenerator(0, false)]
private partial class Ornament : Item
{
public Ornament(int itemID) : base(itemID) => Movable = false;
public override int LabelNumber => 1041118; // a tree ornament
}
[SerializationGenerator(0, false)]
private partial class TreeTrunk : Item
{
private HolidayTree _tree;
public TreeTrunk(HolidayTree tree, int itemID) : base(itemID)
{
Movable = false;
MoveToWorld(tree.Location, tree.Map);
_tree = tree;
}
public override int LabelNumber => 1041117; // a tree for the holidays public override int LabelNumber => 1041117; // a tree for the holidays
public bool CouldFit(IPoint3D p, Map map) => map.CanFit((Point3D)p, 20);
Item IAddon.Deed => new HolidayTreeDeed();
public override void OnAfterDelete()
{
for (var i = 0; i < m_Components.Count; ++i)
{
m_Components[i].Delete();
}
}
private void AddOrnament(int x, int y, int z, int itemID)
{
AddItem(x + 1, y + 1, z + 11, new Ornament(itemID));
}
private void AddItem(int x, int y, int z, Item item)
{
item.MoveToWorld(new Point3D(Location.X + x, Location.Y + y, Location.Z + z), Map);
m_Components.Add(item);
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(Placer);
writer.Write(m_Components.Count);
for (var i = 0; i < m_Components.Count; ++i)
{
writer.Write(m_Components[i]);
}
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
switch (version)
{
case 1:
{
Placer = reader.ReadEntity<Mobile>();
goto case 0;
}
case 0:
{
var count = reader.ReadInt();
m_Components = new List<Item>(count);
for (var i = 0; i < count; ++i)
{
var item = reader.ReadEntity<Item>();
if (item != null)
{
m_Components.Add(item);
}
}
break;
}
}
Timer.StartTimer(ValidatePlacement);
}
public void ValidatePlacement()
{
if (BaseHouse.FindHouseAt(this) == null)
{
var deed = new HolidayTreeDeed();
deed.MoveToWorld(Location, Map);
Delete();
}
}
public override void OnDoubleClick(Mobile from) public override void OnDoubleClick(Mobile from)
{ {
if (from.InRange(GetWorldLocation(), 1)) if (_tree?.Deleted == false)
{ {
if (Placer == null || from == Placer || from.AccessLevel >= AccessLevel.GameMaster) _tree.OnDoubleClick(from);
{
from.AddToBackpack(new HolidayTreeDeed());
Delete();
var house = BaseHouse.FindHouseAt(this);
if (house?.Addons.Contains(this) == true)
{
house.Addons.Remove(this);
}
from.SendLocalizedMessage(503393); // A deed for the tree has been placed in your backpack.
}
else
{
from.SendLocalizedMessage(503396); // You cannot take this tree down.
}
}
else
{
from.SendLocalizedMessage(500446); // That is too far away.
}
}
private class Ornament : Item
{
public Ornament(int itemID) : base(itemID) => Movable = false;
public Ornament(Serial serial) : base(serial)
{
}
public override int LabelNumber => 1041118; // a tree ornament
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
private class TreeTrunk : Item
{
private HolidayTree m_Tree;
public TreeTrunk(HolidayTree tree, int itemID) : base(itemID)
{
Movable = false;
MoveToWorld(tree.Location, tree.Map);
m_Tree = tree;
}
public TreeTrunk(Serial serial) : base(serial)
{
}
public override int LabelNumber => 1041117; // a tree for the holidays
public override void OnDoubleClick(Mobile from)
{
if (m_Tree?.Deleted == false)
{
m_Tree.OnDoubleClick(from);
}
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.Write(m_Tree);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
switch (version)
{
case 0:
{
m_Tree = reader.ReadEntity<HolidayTree>();
if (m_Tree == null)
{
Delete();
}
break;
}
}
} }
} }
} }

View file

@ -1,37 +1,21 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[Furniture]
[Flippable(0x232A, 0x232B)]
[SerializationGenerator(0, false)]
public partial class GiftBox : BaseContainer
{ {
[Furniture] [Constructible]
[Flippable(0x232A, 0x232B)] public GiftBox() : this(Utility.RandomDyedHue())
public class GiftBox : BaseContainer
{ {
[Constructible] }
public GiftBox() : this(Utility.RandomDyedHue())
{
}
[Constructible] [Constructible]
public GiftBox(int hue) : base(Utility.Random(0x232A, 2)) public GiftBox(int hue) : base(Utility.Random(0x232A, 2))
{ {
Weight = 2.0; Weight = 2.0;
Hue = hue; Hue = hue;
}
public GiftBox(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
} }

View file

@ -1,62 +1,33 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class GingerBreadHouseAddon : BaseAddon
{ {
public class GingerBreadHouseAddon : BaseAddon public GingerBreadHouseAddon()
{ {
public GingerBreadHouseAddon() for (var i = 0x2be5; i < 0x2be8; i++)
{ {
for (var i = 0x2be5; i < 0x2be8; i++) var laoc = new LocalizedAddonComponent(i, 1077395); // Gingerbread House
{ laoc.Light = LightType.SouthSmall;
var laoc = new LocalizedAddonComponent(i, 1077395); // Gingerbread House AddComponent(laoc, i == 0x2be5 ? -1 : 0, i == 0x2be7 ? -1 : 0, 0);
laoc.Light = LightType.SouthSmall;
AddComponent(laoc, i == 0x2be5 ? -1 : 0, i == 0x2be7 ? -1 : 0, 0);
}
}
public GingerBreadHouseAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new GingerBreadHouseDeed();
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
} }
} }
public class GingerBreadHouseDeed : BaseAddonDeed public override BaseAddonDeed Deed => new GingerBreadHouseDeed();
{ }
[Constructible]
public GingerBreadHouseDeed() [SerializationGenerator(0, false)]
{ public partial class GingerBreadHouseDeed : BaseAddonDeed
Weight = 1.0; {
LootType = LootType.Blessed; [Constructible]
} public GingerBreadHouseDeed()
{
public GingerBreadHouseDeed(Serial serial) : base(serial) Weight = 1.0;
{ LootType = LootType.Blessed;
} }
public override int LabelNumber => 1077394; // a Gingerbread House Deed public override int LabelNumber => 1077394; // a Gingerbread House Deed
public override BaseAddon Addon => new GingerBreadHouseAddon(); public override BaseAddon Addon => new GingerBreadHouseAddon();
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,120 +1,55 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class HolidayBell : Item
{ {
public class HolidayBell : Item private static readonly int[] _hues =
{ {
private static readonly string[] m_StaffNames = 0xA, 0x24, 0x42, 0x56, 0x1A, 0x4C, 0x3C, 0x60, 0x2E, 0x55, 0x23, 0x38, 0x482, 0x6, 0x10
{ };
"Adrick",
"Alai",
"Bulldoz",
"Evocare",
"FierY-iCe",
"Greyburn",
"Hanse",
"Ignatz",
"Jalek",
"LadyMOI",
"Lord Krum",
"Malantus",
"Nimrond",
"Oaks",
"Prophet",
"Runesabre",
"Sage",
"Stellerex",
"T-Bone",
"Tajima",
"Tyrant",
"Vex"
};
private static readonly int[] m_Hues = [InvalidateProperties]
{ [SerializableField(0)]
0xA, 0x24, 0x42, 0x56, 0x1A, 0x4C, 0x3C, 0x60, 0x2E, 0x55, 0x23, 0x38, 0x482, 0x6, 0x10 [SerializedCommandProperty(AccessLevel.GameMaster)]
}; private TextDefinition _maker;
private string m_Maker; [InvalidateProperties]
private int m_SoundID; [SerializableField(1)]
[SerializedCommandProperty(AccessLevel.GameMaster)]
private int _soundID;
[Constructible] [Constructible]
public HolidayBell() public HolidayBell() : this(1041441 + Utility.Random(22))
: this(m_StaffNames.RandomElement()) {
}
[Constructible]
public HolidayBell(TextDefinition maker) : base(0x1C12)
{
_maker = maker;
LootType = LootType.Blessed;
Hue = _hues.RandomElement();
_soundID = 0x0F5 + Utility.Random(14);
}
public override int LabelNumber => _maker?.Number > 0 ? _maker.Number : base.LabelNumber;
public override string DefaultName => _maker?.String != null
? $"a holiday bell from {_maker.String}"
: "a holiday bell";
public override void OnDoubleClick(Mobile from)
{
if (!from.InRange(GetWorldLocation(), 2))
{ {
from.SendLocalizedMessage(500446); // That is too far away.
} }
else
[Constructible]
public HolidayBell(string maker)
: base(0x1C12)
{ {
m_Maker = maker; from.PlaySound(_soundID);
LootType = LootType.Blessed;
Hue = m_Hues.RandomElement();
SoundID = 0x0F5 + Utility.Random(14);
}
public HolidayBell(Serial serial)
: base(serial)
{
}
[CommandProperty(AccessLevel.GameMaster)]
public int SoundID
{
get => m_SoundID;
set
{
m_SoundID = value;
InvalidateProperties();
}
}
[CommandProperty(AccessLevel.GameMaster)]
public string Giver
{
get => m_Maker;
set
{
m_Maker = value;
InvalidateProperties();
}
}
public override string DefaultName => $"A Holiday Bell From {Giver}";
public override void OnDoubleClick(Mobile from)
{
if (!from.InRange(GetWorldLocation(), 2))
{
from.SendLocalizedMessage(500446); // That is too far away.
}
else
{
from.PlaySound(m_SoundID);
}
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.Write(m_Maker);
writer.WriteEncodedInt(m_SoundID);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
m_Maker = reader.ReadString();
m_SoundID = reader.ReadEncodedInt();
Utility.Intern(ref m_Maker);
} }
} }
} }

View file

@ -1,165 +1,130 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using ModernUO.Serialization;
namespace Server.Items namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class CandyCane : Food
{ {
public class CandyCane : Food private static readonly Dictionary<Mobile, CandyCaneTimer> _toothAches = new();
[Constructible]
public CandyCane() : this(0x2bdd + Utility.Random(4))
{ {
private static readonly Dictionary<Mobile, CandyCaneTimer> m_ToothAches = new();
[Constructible]
public CandyCane()
: this(0x2bdd + Utility.Random(4))
{
}
public CandyCane(int itemID) : base(itemID)
{
Stackable = false;
LootType = LootType.Blessed;
}
public CandyCane(Serial serial)
: base(serial)
{
}
private static CandyCaneTimer EnsureTimer(Mobile from)
{
if (!m_ToothAches.TryGetValue(from, out var timer))
{
m_ToothAches[from] = timer = new CandyCaneTimer(from);
}
return timer;
}
public static int GetToothAche(Mobile from) => m_ToothAches.TryGetValue(from, out var timer) ? timer.Eaten : 0;
public static void SetToothAche(Mobile from, int value)
{
EnsureTimer(from).Eaten = value;
}
public override bool CheckHunger(Mobile from)
{
EnsureTimer(from).Eaten += 32;
from.SendLocalizedMessage(1077387); // You feel as if you could eat as much as you wanted!
return true;
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public class CandyCaneTimer : Timer
{
public CandyCaneTimer(Mobile eater)
: base(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30))
{
Eater = eater;
Start();
}
public Mobile Eater { get; }
public int Eaten { get; set; }
protected override void OnTick()
{
--Eaten;
if (Eater?.Deleted != false || Eaten <= 0)
{
Stop();
m_ToothAches.Remove(Eater);
}
else if (Eater.Map != Map.Internal && Eater.Alive)
{
if (Eaten > 60)
{
Eater.Say(1077388 + Utility.Random(5));
/* ARRGH! My tooth hurts sooo much!
* You just can't find a good Britannian dentist these days...
* My teeth!
* MAKE IT STOP!
* AAAH! It feels like someone kicked me in the teeth!
*/
if (Utility.RandomBool() && Eater.Body.IsHuman && !Eater.Mounted)
{
Eater.Animate(32, 5, 1, true, false, 0);
}
}
else if (Eaten == 60)
{
Eater.SendLocalizedMessage(1077393); // The extreme pain in your teeth subsides.
}
}
}
}
} }
public class GingerBreadCookie : Food public CandyCane(int itemID) : base(itemID)
{ {
private readonly int[] m_Messages = Stackable = false;
{ LootType = LootType.Blessed;
0, }
1077396, // Noooo!
1077397, // Please don't eat me... *whimper*
1077405, // Not the face!
1077406, // Ahhhhhh! My foot's gone!
1077407, // Please. No! I have gingerkids!
1077408, // No, no! I'm really made of poison. Really.
1077409 // Run, run as fast as you can! You can't catch me! I'm the gingerbread man!
};
[Constructible] private static CandyCaneTimer EnsureTimer(Mobile from)
public GingerBreadCookie() {
: base(Utility.RandomBool() ? 0x2be1 : 0x2be2) if (!_toothAches.TryGetValue(from, out var timer))
{ {
Stackable = false; _toothAches[from] = timer = new CandyCaneTimer(from);
LootType = LootType.Blessed;
} }
public GingerBreadCookie(Serial serial) return timer;
: base(serial) }
public static int GetToothAche(Mobile from) => _toothAches.TryGetValue(from, out var timer) ? timer.Eaten : 0;
public static void SetToothAche(Mobile from, int value)
{
EnsureTimer(from).Eaten = value;
}
public override bool CheckHunger(Mobile from)
{
EnsureTimer(from).Eaten += 32;
from.SendLocalizedMessage(1077387); // You feel as if you could eat as much as you wanted!
return true;
}
public class CandyCaneTimer : Timer
{
private readonly Mobile _eater;
public CandyCaneTimer(Mobile eater) : base(TimeSpan.FromSeconds(30), TimeSpan.FromSeconds(30))
{ {
_eater = eater;
Start();
} }
public override bool Eat(Mobile from) public int Eaten { get; set; }
{
var message = m_Messages.RandomElement();
if (message != 0) protected override void OnTick()
{
--Eaten;
if (_eater.Deleted || Eaten <= 0)
{ {
SendLocalizedMessageTo(from, message); Stop();
return false; _toothAches.Remove(_eater);
} }
else if (_eater.Map != Map.Internal && _eater.Alive)
{
if (Eaten > 60)
{
_eater.Say(1077388 + Utility.Random(5));
return base.Eat(from); /* ARRGH! My tooth hurts sooo much!
} * You just can't find a good Britannian dentist these days...
* My teeth!
* MAKE IT STOP!
* AAAH! It feels like someone kicked me in the teeth!
*/
public override void Serialize(IGenericWriter writer) if (Utility.RandomBool() && _eater.Body.IsHuman && !_eater.Mounted)
{ {
base.Serialize(writer); _eater.Animate(32, 5, 1, true, false, 0);
writer.Write(0); // version }
} }
else if (Eaten == 60)
public override void Deserialize(IGenericReader reader) {
{ _eater.SendLocalizedMessage(1077393); // The extreme pain in your teeth subsides.
base.Deserialize(reader); }
var version = reader.ReadInt(); }
} }
} }
} }
[SerializationGenerator(0, false)]
public partial class GingerBreadCookie : Food
{
private readonly int[] _messages =
{
0,
1077396, // Noooo!
1077397, // Please don't eat me... *whimper*
1077405, // Not the face!
1077406, // Ahhhhhh! My foot's gone!
1077407, // Please. No! I have gingerkids!
1077408, // No, no! I'm really made of poison. Really.
1077409 // Run, run as fast as you can! You can't catch me! I'm the gingerbread man!
};
[Constructible]
public GingerBreadCookie() : base(Utility.RandomBool() ? 0x2be1 : 0x2be2)
{
Stackable = false;
LootType = LootType.Blessed;
}
public override bool Eat(Mobile from)
{
var message = _messages.RandomElement();
if (message != 0)
{
SendLocalizedMessageTo(from, message);
return false;
}
return base.Eat(from);
}
}

View file

@ -1,208 +1,80 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
public static class GiftBoxHues
{ {
public static class GiftBoxHues /* there's possibly a couple more, but this is what we could verify on OSI */
private static readonly int[] _normalHues =
{ {
/* there's possibly a couple more, but this is what we could verify on OSI */ 0x672, 0x454, 0x507, 0x4ac,
0x504, 0x84b, 0x495, 0x97c,
0x493, 0x4a8, 0x494, 0x4aa,
0xb8b, 0x84f, 0x491, 0x851,
0x503, 0xb8c, 0x4ab, 0x84B
};
private static readonly int[] m_NormalHues = private static readonly int[] _neonHues =
{
0x672,
0x454,
0x507,
0x4ac,
0x504,
0x84b,
0x495,
0x97c,
0x493,
0x4a8,
0x494,
0x4aa,
0xb8b,
0x84f,
0x491,
0x851,
0x503,
0xb8c,
0x4ab,
0x84B
};
private static readonly int[] m_NeonHues =
{
0x438,
0x424,
0x433,
0x445,
0x42b,
0x448
};
public static int RandomGiftBoxHue => m_NormalHues.RandomElement();
public static int RandomNeonBoxHue => m_NeonHues.RandomElement();
}
[Flippable(0x46A5, 0x46A6)]
public class GiftBoxRectangle : BaseContainer
{ {
[Constructible] 0x438, 0x424, 0x433,
public GiftBoxRectangle() 0x445, 0x42b, 0x448
: base(Utility.RandomBool() ? 0x46A5 : 0x46A6) => };
Hue = GiftBoxHues.RandomGiftBoxHue;
public GiftBoxRectangle(Serial serial) public static int RandomGiftBoxHue => _normalHues.RandomElement();
: base(serial) public static int RandomNeonBoxHue => _neonHues.RandomElement();
{ }
}
[Flippable(0x46A5, 0x46A6)]
public override int DefaultGumpID => 0x11E; [SerializationGenerator(0, false)]
public partial class GiftBoxRectangle : BaseContainer
public override void Serialize(IGenericWriter writer) {
{ [Constructible]
base.Serialize(writer); public GiftBoxRectangle() : base(Utility.RandomBool() ? 0x46A5 : 0x46A6) => Hue = GiftBoxHues.RandomGiftBoxHue;
writer.Write(0); // version
} public override int DefaultGumpID => 0x11E;
}
public override void Deserialize(IGenericReader reader)
{ [SerializationGenerator(0, false)]
base.Deserialize(reader); public partial class GiftBoxCube : BaseContainer
var version = reader.ReadInt(); {
} [Constructible]
} public GiftBoxCube() : base(0x46A2) => Hue = GiftBoxHues.RandomGiftBoxHue;
public class GiftBoxCube : BaseContainer public override int DefaultGumpID => 0x11B;
{ }
[Constructible]
public GiftBoxCube() [SerializationGenerator(0, false)]
: base(0x46A2) => public partial class GiftBoxCylinder : BaseContainer
Hue = GiftBoxHues.RandomGiftBoxHue; {
[Constructible]
public GiftBoxCube(Serial serial) public GiftBoxCylinder() : base(0x46A3) => Hue = GiftBoxHues.RandomGiftBoxHue;
: base(serial)
{ public override int DefaultGumpID => 0x11C;
} }
public override int DefaultGumpID => 0x11B; [SerializationGenerator(0, false)]
public partial class GiftBoxOctogon : BaseContainer
public override void Serialize(IGenericWriter writer) {
{ [Constructible]
base.Serialize(writer); public GiftBoxOctogon() : base(0x46A4) => Hue = GiftBoxHues.RandomGiftBoxHue;
writer.Write(0); // version
} public override int DefaultGumpID => 0x11D;
}
public override void Deserialize(IGenericReader reader)
{ [SerializationGenerator(0, false)]
base.Deserialize(reader); public partial class GiftBoxAngel : BaseContainer
var version = reader.ReadInt(); {
} [Constructible]
} public GiftBoxAngel() : base(0x46A7) => Hue = GiftBoxHues.RandomGiftBoxHue;
public class GiftBoxCylinder : BaseContainer public override int DefaultGumpID => 0x11F;
{ }
[Constructible]
public GiftBoxCylinder() [Flippable(0x232A, 0x232B)]
: base(0x46A3) => [SerializationGenerator(0, false)]
Hue = GiftBoxHues.RandomGiftBoxHue; public partial class GiftBoxNeon : BaseContainer
{
public GiftBoxCylinder(Serial serial) [Constructible]
: base(serial) public GiftBoxNeon() : base(Utility.RandomBool() ? 0x232A : 0x232B) => Hue = GiftBoxHues.RandomNeonBoxHue;
{
}
public override int DefaultGumpID => 0x11C;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class GiftBoxOctogon : BaseContainer
{
[Constructible]
public GiftBoxOctogon()
: base(0x46A4) =>
Hue = GiftBoxHues.RandomGiftBoxHue;
public GiftBoxOctogon(Serial serial)
: base(serial)
{
}
public override int DefaultGumpID => 0x11D;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class GiftBoxAngel : BaseContainer
{
[Constructible]
public GiftBoxAngel()
: base(0x46A7) =>
Hue = GiftBoxHues.RandomGiftBoxHue;
public GiftBoxAngel(Serial serial)
: base(serial)
{
}
public override int DefaultGumpID => 0x11F;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
[Flippable(0x232A, 0x232B)]
public class GiftBoxNeon : BaseContainer
{
[Constructible]
public GiftBoxNeon()
: base(Utility.RandomBool() ? 0x232A : 0x232B) =>
Hue = GiftBoxHues.RandomNeonBoxHue;
public GiftBoxNeon(Serial serial)
: base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,151 +1,111 @@
using ModernUO.Serialization;
using Server.Gumps; using Server.Gumps;
using Server.Network; using Server.Network;
namespace Server.Items namespace Server.Items;
[SerializationGenerator(0)]
public partial class HolidayPottedPlant : Item
{ {
public class HolidayPottedPlant : Item [Constructible]
public HolidayPottedPlant() : this(Utility.RandomMinMax(0x11C8, 0x11CC))
{ {
[Constructible] }
public HolidayPottedPlant()
: this(Utility.RandomMinMax(0x11C8, 0x11CC)) [Constructible]
public HolidayPottedPlant(int itemID) : base(itemID)
{
}
public override bool ForceShowProperties => ObjectPropertyList.Enabled;
}
[SerializationGenerator(0)]
public partial class PottedPlantDeed : Item
{
[Constructible]
public PottedPlantDeed() : base(0x14F0) => LootType = LootType.Blessed;
public override int LabelNumber => 1041114; // A deed for a potted plant.
public override double DefaultWeight => 1.0;
public override void OnDoubleClick(Mobile from)
{
if (IsChildOf(from.Backpack))
{ {
from.CloseGump<InternalGump>();
from.SendGump(new InternalGump(this));
} }
else
[Constructible]
public HolidayPottedPlant(int itemID)
: base(itemID)
{ {
} from.SendLocalizedMessage(1042038); // You must have the object in your backpack to use it.
public HolidayPottedPlant(Serial serial)
: base(serial)
{
}
public override bool ForceShowProperties => ObjectPropertyList.Enabled;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadEncodedInt();
} }
} }
public class PottedPlantDeed : Item private class InternalGump : Gump
{ {
[Constructible] private readonly PottedPlantDeed _deed;
public PottedPlantDeed()
: base(0x14F0) =>
LootType = LootType.Blessed;
public PottedPlantDeed(Serial serial) public InternalGump(PottedPlantDeed deed) : base(100, 200)
: base(serial)
{ {
_deed = deed;
Closable = true;
Disposable = true;
Draggable = true;
Resizable = false;
AddPage(0);
AddBackground(0, 0, 360, 195, 0xA28);
AddPage(1);
AddLabel(45, 15, 0, "Choose a Potted Plant:");
AddItem(45, 75, 0x11C8);
AddButton(55, 50, 0x845, 0x846, 1);
AddItem(100, 75, 0x11C9);
AddButton(115, 50, 0x845, 0x846, 2);
AddItem(160, 75, 0x11CA);
AddButton(175, 50, 0x845, 0x846, 3);
AddItem(225, 75, 0x11CB);
AddButton(235, 50, 0x845, 0x846, 4);
AddItem(280, 75, 0x11CC);
AddButton(295, 50, 0x845, 0x846, 5);
} }
public override int LabelNumber => 1041114; // A deed for a potted plant. public override void OnResponse(NetState sender, RelayInfo info)
public override double DefaultWeight => 1.0;
public override void OnDoubleClick(Mobile from)
{ {
if (IsChildOf(from.Backpack)) if (_deed?.Deleted != false)
{ {
from.CloseGump<InternalGump>(); return;
from.SendGump(new InternalGump(this));
}
else
{
from.SendLocalizedMessage(1042038); // You must have the object in your backpack to use it.
}
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadEncodedInt();
}
private class InternalGump : Gump
{
private readonly PottedPlantDeed m_Deed;
public InternalGump(PottedPlantDeed deed) : base(100, 200)
{
m_Deed = deed;
Closable = true;
Disposable = true;
Draggable = true;
Resizable = false;
AddPage(0);
AddBackground(0, 0, 360, 195, 0xA28);
AddPage(1);
AddLabel(45, 15, 0, "Choose a Potted Plant:");
AddItem(45, 75, 0x11C8);
AddButton(55, 50, 0x845, 0x846, 1);
AddItem(100, 75, 0x11C9);
AddButton(115, 50, 0x845, 0x846, 2);
AddItem(160, 75, 0x11CA);
AddButton(175, 50, 0x845, 0x846, 3);
AddItem(225, 75, 0x11CB);
AddButton(235, 50, 0x845, 0x846, 4);
AddItem(280, 75, 0x11CC);
AddButton(295, 50, 0x845, 0x846, 5);
} }
public override void OnResponse(NetState sender, RelayInfo info) var from = sender.Mobile;
if (!_deed.IsChildOf(from.Backpack))
{ {
if (m_Deed?.Deleted != false) from.SendLocalizedMessage(1042038); // You must have the object in your backpack to use it
return;
}
var index = info.ButtonID - 1;
if (index >= 0 && index <= 4)
{
var plant = new HolidayPottedPlant(0x11C8 + index);
if (!from.PlaceInBackpack(plant))
{ {
return; plant.Delete();
from.SendLocalizedMessage(1078837); // Your backpack is full! Please make room and try again.
} }
else
var from = sender.Mobile;
if (!m_Deed.IsChildOf(from.Backpack))
{ {
from.SendLocalizedMessage(1042038); // You must have the object in your backpack to use it _deed.Delete();
return;
}
var index = info.ButtonID - 1;
if (index >= 0 && index <= 4)
{
var plant = new HolidayPottedPlant(0x11C8 + index);
if (!from.PlaceInBackpack(plant))
{
plant.Delete();
from.SendLocalizedMessage(1078837); // Your backpack is full! Please make room and try again.
}
else
{
m_Deed.Delete();
}
} }
} }
} }

View file

@ -1,36 +1,18 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class HolidayTimepiece : Clock
{ {
public class HolidayTimepiece : Clock [Constructible]
public HolidayTimepiece() : base(0x1086)
{ {
[Constructible] Weight = DefaultWeight;
public HolidayTimepiece() LootType = LootType.Blessed;
: base(0x1086) Layer = Layer.Bracelet;
{
Weight = DefaultWeight;
LootType = LootType.Blessed;
Layer = Layer.Bracelet;
}
public HolidayTimepiece(Serial serial)
: base(serial)
{
}
public override int LabelNumber => 1041113; // a holiday timepiece
public override double DefaultWeight => 1.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
public override int LabelNumber => 1041113; // a holiday timepiece
public override double DefaultWeight => 1.0;
} }

View file

@ -1,170 +1,58 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class IcicleLargeSouth : Item
{ {
public class IcicleLargeSouth : Item [Constructible]
public IcicleLargeSouth() : base(0x4572)
{
}
}
[SerializationGenerator(0, false)]
public partial class IcicleMedSouth : Item
{
[Constructible]
public IcicleMedSouth() : base(0x4573)
{
}
}
[SerializationGenerator(0, false)]
public partial class IcicleSmallSouth : Item
{
[Constructible]
public IcicleSmallSouth() : base(0x4574)
{
}
}
[SerializationGenerator(0, false)]
public partial class IcicleLargeEast : Item
{
[Constructible]
public IcicleLargeEast() : base(0x4575)
{
}
}
[SerializationGenerator(0, false)]
public partial class IcicleMedEast : Item
{
[Constructible]
public IcicleMedEast() : base(0x4576)
{
}
}
[SerializationGenerator(0, false)]
public partial class IcicleSmallEast : Item
{
[Constructible]
public IcicleSmallEast()
: base(0x4577)
{ {
[Constructible]
public IcicleLargeSouth()
: base(0x4572)
{
}
public IcicleLargeSouth(Serial serial)
: base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class IcicleMedSouth : Item
{
[Constructible]
public IcicleMedSouth()
: base(0x4573)
{
}
public IcicleMedSouth(Serial serial)
: base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class IcicleSmallSouth : Item
{
[Constructible]
public IcicleSmallSouth()
: base(0x4574)
{
}
public IcicleSmallSouth(Serial serial)
: base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class IcicleLargeEast : Item
{
[Constructible]
public IcicleLargeEast()
: base(0x4575)
{
}
public IcicleLargeEast(Serial serial)
: base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class IcicleMedEast : Item
{
[Constructible]
public IcicleMedEast()
: base(0x4576)
{
}
public IcicleMedEast(Serial serial)
: base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class IcicleSmallEast : Item
{
[Constructible]
public IcicleSmallEast()
: base(0x4577)
{
}
public IcicleSmallEast(Serial serial)
: base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
} }

View file

@ -1,117 +1,101 @@
using System; using System;
using ModernUO.Serialization;
using Server.Mobiles; using Server.Mobiles;
using Server.Spells; using Server.Spells;
namespace Server.Items namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class IcyPatch : Item
{ {
public class IcyPatch : Item /* On OSI, the iceypatch with itemid 0x122a is "rarer", so we will give it 1:10 chance of creating it that way */
[Constructible]
public IcyPatch() : this(Utility.Random(10) == 0 ? 0x122A : 0x122F)
{ {
/* On OSI, the iceypatch with itemid 0x122a is "rarer", so we will give it 1:10 chance of creating it that way */ }
[Constructible] public IcyPatch(int itemid) : base(itemid) => Hue = 0x481;
public IcyPatch()
: this(Utility.Random(10) == 0 ? 0x122A : 0x122F) public override int LabelNumber => 1095159; // An Icy Patch
public override double DefaultWeight => 5.0;
public override bool OnMoveOver(Mobile m)
{
if (m is PlayerMobile && m.Alive && m.AccessLevel == AccessLevel.Player)
{ {
} switch (Utility.Random(3))
public IcyPatch(int itemid)
: base(itemid) =>
Hue = 0x481;
public IcyPatch(Serial serial)
: base(serial)
{
}
public override int LabelNumber => 1095159; // An Icy Patch
public override double DefaultWeight => 5.0;
public override bool OnMoveOver(Mobile m)
{
if (m is PlayerMobile && m.Alive && m.AccessLevel == AccessLevel.Player)
{ {
switch (Utility.Random(3)) case 0:
{ {
case 0:
RunSequence(m, 1095160, false); RunSequence(m, 1095160, false);
break; // You steadily walk over the slippery surface. break; // You steadily walk over the slippery surface.
case 1: }
case 1:
{
RunSequence(m, 1095161, true); RunSequence(m, 1095161, true);
break; // You skillfully manage to maintain your balance. break; // You skillfully manage to maintain your balance.
default: }
default:
{
RunSequence(m, 1095162, true); RunSequence(m, 1095162, true);
break; // You lose your footing and ungracefully splatter on the ground. break; // You lose your footing and ungracefully splatter on the ground.
}
}
return base.OnMoveOver(m);
}
public virtual void RunSequence(Mobile m, int message, bool freeze)
{
if (freeze)
{
m.Frozen = true;
Timer.StartTimer(TimeSpan.FromSeconds(message == 1095162 ? 2.0 : 1.25), () => m.Frozen = false);
}
m.SendLocalizedMessage(message);
var action = 0;
var sound = 0;
if (message == 1095162)
{
if (m.Mounted)
{
m.Mount.Rider = null;
}
var p = new Point3D(Location);
var map = Map;
if (SpellHelper.FindValidSpawnLocation(map, ref p, true))
{
Timer.StartTimer(TimeSpan.FromSeconds(0), () => m.MoveToWorld(p, map));
}
action = 21 + Utility.Random(2);
sound = m.Female ? 0x317 : 0x426;
}
else if (message == 1095161)
{
action = 17;
sound = m.Female ? 0x319 : 0x429;
}
if (action > 0)
{
Timer.StartTimer(TimeSpan.FromSeconds(0.4),
() =>
{
if (!m.Mounted)
{
m.Animate(action, 1, 1, false, true, 0);
}
m.PlaySound(sound);
} }
);
} }
} }
public override void Serialize(IGenericWriter writer) return base.OnMoveOver(m);
{ }
base.Serialize(writer);
writer.Write(0); public virtual void RunSequence(Mobile m, int message, bool freeze)
{
if (freeze)
{
m.Frozen = true;
Timer.StartTimer(TimeSpan.FromSeconds(message == 1095162 ? 2.0 : 1.25), () => m.Frozen = false);
} }
public override void Deserialize(IGenericReader reader) m.SendLocalizedMessage(message);
{
base.Deserialize(reader);
var version = reader.ReadInt(); var action = 0;
var sound = 0;
if (message == 1095162)
{
if (m.Mounted)
{
m.Mount.Rider = null;
}
var p = new Point3D(Location);
var map = Map;
if (SpellHelper.FindValidSpawnLocation(map, ref p, true))
{
Timer.StartTimer(TimeSpan.FromSeconds(0), () => m.MoveToWorld(p, map));
}
action = 21 + Utility.Random(2);
sound = m.Female ? 0x317 : 0x426;
}
else if (message == 1095161)
{
action = 17;
sound = m.Female ? 0x319 : 0x429;
}
if (action > 0)
{
Timer.StartTimer(TimeSpan.FromSeconds(0.4),
() =>
{
if (!m.Mounted)
{
m.Animate(action, 1, 1, false, true, 0);
}
m.PlaySound(sound);
}
);
} }
} }
} }

View file

@ -1,90 +1,45 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class Coal : Item
{ {
public class Coal : Item [Constructible]
public Coal() : base(0x19b9)
{ {
[Constructible] Stackable = false;
public Coal() : base(0x19b9) LootType = LootType.Blessed;
{ Hue = 0x965;
Stackable = false;
LootType = LootType.Blessed;
Hue = 0x965;
}
public Coal(Serial serial) : base(serial)
{
}
public override string DefaultName => "Coal";
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
public class BadCard : Item public override int LabelNumber => 1041426;
}
[SerializationGenerator(0, false)]
public partial class BadCard : Item
{
private static readonly int[] _cardHues = { 0x45, 0x27, 0x3d0 };
[Constructible]
public BadCard() : base(0x14ef)
{ {
private static readonly int[] m_CardHues = { 0x45, 0x27, 0x3d0 }; Hue = _cardHues.RandomElement();
Stackable = false;
[Constructible] LootType = LootType.Blessed;
public BadCard() : base(0x14ef) Movable = true;
{
Hue = m_CardHues.RandomElement();
Stackable = false;
LootType = LootType.Blessed;
Movable = true;
}
public BadCard(Serial serial) : base(serial)
{
}
public override int LabelNumber // Maybe next year youll get a better...
=> 1041428;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
public class Spam : Food public override int LabelNumber => 1041428; // Maybe next year you will get a nicer gift.
}
[SerializationGenerator(0, false)]
public partial class Spam : Food
{
[Constructible]
public Spam() : base(0x1044)
{ {
[Constructible] Stackable = false;
public Spam() : base(0x1044) LootType = LootType.Blessed;
{
Stackable = false;
LootType = LootType.Blessed;
}
public Spam(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
} }

View file

@ -1,58 +1,25 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class RedPoinsettia : Item
{ {
public class RedPoinsettia : Item [Constructible]
public RedPoinsettia() : base(0x2330)
{ {
[Constructible] Weight = 1.0;
public RedPoinsettia() : base(0x2330) LootType = LootType.Blessed;
{ }
Weight = 1.0; }
LootType = LootType.Blessed;
} [SerializationGenerator(0, false)]
public partial class WhitePoinsettia : Item
public RedPoinsettia(Serial serial) : base(serial) {
{ [Constructible]
} public WhitePoinsettia() : base(0x2331)
{
public override void Serialize(IGenericWriter writer) Weight = 1.0;
{ LootType = LootType.Blessed;
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class WhitePoinsettia : Item
{
[Constructible]
public WhitePoinsettia() : base(0x2331)
{
Weight = 1.0;
LootType = LootType.Blessed;
}
public WhitePoinsettia(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
} }

View file

@ -1,315 +1,195 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class SnowGlobe : Item
{ {
public class SnowGlobe : Item public SnowGlobe() : base(0xE2F)
{ {
public SnowGlobe() LootType = LootType.Blessed;
: base(0xE2F) Light = LightType.Circle150;
{
LootType = LootType.Blessed;
Light = LightType.Circle150;
}
public SnowGlobe(Serial serial)
: base(serial)
{
}
public override double DefaultWeight => 1.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
public enum SnowGlobeTypeOne public override double DefaultWeight => 1.0;
}
public enum SnowGlobeTypeOne
{
Britain,
Moonglow,
Minoc,
Magincia,
BuccaneersDen,
Trinsic,
Yew,
SkaraBrae,
Jhelom,
Nujelm,
Papua,
Delucia,
Cove,
Ocllo,
SerpentsHold,
EmpathAbbey,
TheLycaeum,
Vesper,
Wind
}
[SerializationGenerator(1, false)]
public partial class SnowGlobeOne : SnowGlobe
{
[InvalidateProperties]
[SerializableField(0)]
[SerializedCommandProperty(AccessLevel.GameMaster)]
private SnowGlobeTypeOne _place;
[Constructible]
public SnowGlobeOne() : this((SnowGlobeTypeOne)Utility.Random(19))
{ {
Britain,
Moonglow,
Minoc,
Magincia,
BuccaneersDen,
Trinsic,
Yew,
SkaraBrae,
Jhelom,
Nujelm,
Papua,
Delucia,
Cove,
Ocllo,
SerpentsHold,
EmpathAbbey,
TheLycaeum,
Vesper,
Wind
} }
public class SnowGlobeOne : SnowGlobe [Constructible]
public SnowGlobeOne(SnowGlobeTypeOne type) => _place = type;
public override int LabelNumber => 1041454 + (int)_place;
private void Deserialize(IGenericReader reader, int version)
{ {
private SnowGlobeTypeOne m_Type; _place = (SnowGlobeTypeOne)reader.ReadEncodedInt();
}
[Constructible] }
public SnowGlobeOne()
: this((SnowGlobeTypeOne)Utility.Random(19)) public enum SnowGlobeTypeTwo
{ {
} AncientCitadel,
BlackthornesCastle,
[Constructible] CityofMontor,
public SnowGlobeOne(SnowGlobeTypeOne type) => m_Type = type; CityofMistas,
ExodusLair,
public SnowGlobeOne(Serial serial) LakeofFire,
: base(serial) Lakeshire,
{ PassofKarnaugh,
} TheEtherealFortress,
TwinOaksTavern,
[CommandProperty(AccessLevel.GameMaster)] ChaosShrine,
public SnowGlobeTypeOne Place ShrineofHumility,
{ ShrineofSacrifice,
get => m_Type; ShrineofCompassion,
set ShrineofHonor,
{ ShrineofHonesty,
m_Type = value; ShrineofSpirituality,
InvalidateProperties(); ShrineofJustice,
} ShrineofValor
} }
public override int LabelNumber => 1041454 + (int)m_Type; [SerializationGenerator(1, false)]
public partial class SnowGlobeTwo : SnowGlobe
public override void Serialize(IGenericWriter writer) {
{ /* Oddly, these are not localized. */
base.Serialize(writer); private static readonly string[] _placeNames =
{
writer.Write(0); // version /* AncientCitadel */ "Ancient Citadel",
writer.WriteEncodedInt((int)m_Type); /* BlackthornesCastle */ "Blackthorne's Castle",
} /* CityofMontor */ "City of Montor",
/* CityofMistas */ "City of Mistas",
public override void Deserialize(IGenericReader reader) /* ExodusLair */ "Exodus' Lair",
{ /* LakeofFire */ "Lake of Fire",
base.Deserialize(reader); /* Lakeshire */ "Lakeshire",
/* PassofKarnaugh */ "Pass of Karnaugh",
var version = reader.ReadInt(); /* TheEtherealFortress */ "The Ethereal Fortress",
/* TwinOaksTavern */ "Twin Oaks Tavern",
switch (version) /* ChaosShrine */ "Chaos Shrine",
{ /* ShrineofHumility */ "Shrine of Humility",
case 0: /* ShrineofSacrifice */ "Shrine of Sacrifice",
{ /* ShrineofCompassion */ "Shrine of Compassion",
m_Type = (SnowGlobeTypeOne)reader.ReadEncodedInt(); /* ShrineofHonor */ "Shrine of Honor",
break; /* ShrineofHonesty */ "Shrine of Honesty",
} /* ShrineofSpirituality */ "Shrine of Spirituality",
} /* ShrineofJustice */ "Shrine of Justice",
} /* ShrineofValor */ "Shrine of Valor"
} };
public enum SnowGlobeTypeTwo [InvalidateProperties]
{ [SerializableField(0)]
AncientCitadel, [SerializedCommandProperty(AccessLevel.GameMaster)]
BlackthornesCastle, private SnowGlobeTypeTwo _place;
CityofMontor,
CityofMistas, [Constructible]
ExodusLair, public SnowGlobeTwo() : this((SnowGlobeTypeTwo)Utility.Random(_placeNames.Length))
LakeofFire, {
Lakeshire, }
PassofKarnaugh,
TheEtherealFortress, [Constructible]
TwinOaksTavern, public SnowGlobeTwo(SnowGlobeTypeTwo type) => _place = type;
ChaosShrine,
ShrineofHumility, public override string DefaultName
ShrineofSacrifice, {
ShrineofCompassion, get
ShrineofHonor, {
ShrineofHonesty, var idx = (int)_place;
ShrineofSpirituality,
ShrineofJustice, if (idx < 0 || idx >= _placeNames.Length)
ShrineofValor {
} return "a snowy scene";
}
public class SnowGlobeTwo : SnowGlobe
{ return $"a snowy scene of {_placeNames[idx]}";
/* Oddly, these are not localized. */ }
private static readonly string[] m_PlaceNames = }
{
/* AncientCitadel */ "Ancient Citadel", private void Deserialize(IGenericReader reader, int version)
/* BlackthornesCastle */ "Blackthorne's Castle", {
/* CityofMontor */ "City of Montor", _place = (SnowGlobeTypeTwo)reader.ReadEncodedInt();
/* CityofMistas */ "City of Mistas", }
/* ExodusLair */ "Exodus' Lair", }
/* LakeofFire */ "Lake of Fire",
/* Lakeshire */ "Lakeshire", public enum SnowGlobeTypeThree
/* PassofKarnaugh */ "Pass of Karnaugh", {
/* TheEtherealFortress */ "The Ethereal Fortress", Luna,
/* TwinOaksTavern */ "Twin Oaks Tavern", Umbra,
/* ChaosShrine */ "Chaos Shrine", Zento,
/* ShrineofHumility */ "Shrine of Humility", Heartwood,
/* ShrineofSacrifice */ "Shrine of Sacrifice", Covetous,
/* ShrineofCompassion */ "Shrine of Compassion", Deceit,
/* ShrineofHonor */ "Shrine of Honor", Destard,
/* ShrineofHonesty */ "Shrine of Honesty", Hythloth,
/* ShrineofSpirituality */ "Shrine of Spirituality", Khaldun,
/* ShrineofJustice */ "Shrine of Justice", Shame,
/* ShrineofValor */ "Shrine of Valor" Wrong,
}; Doom,
TheCitadel,
private SnowGlobeTypeTwo m_Type; ThePalaceofParoxysmus,
TheBlightedGrove,
[Constructible] ThePrismofLight
public SnowGlobeTwo() }
: this((SnowGlobeTypeTwo)Utility.Random(19))
{ [SerializationGenerator(1, false)]
} public partial class SnowGlobeThree : SnowGlobe
{
[Constructible] [InvalidateProperties]
public SnowGlobeTwo(SnowGlobeTypeTwo type) => m_Type = type; [SerializableField(0)]
[SerializedCommandProperty(AccessLevel.GameMaster)]
public SnowGlobeTwo(Serial serial) private SnowGlobeTypeThree _place;
: base(serial)
{ [Constructible]
} public SnowGlobeThree() : this((SnowGlobeTypeThree)Utility.Random(16))
{
[CommandProperty(AccessLevel.GameMaster)] }
public SnowGlobeTypeTwo Place
{ [Constructible]
get => m_Type; public SnowGlobeThree(SnowGlobeTypeThree type) => _place = type;
set
{ public override int LabelNumber =>
m_Type = value; _place switch
InvalidateProperties(); {
} >= SnowGlobeTypeThree.Covetous => 1075440 + ((int)_place - 4),
} _ => 1075294 + (int)_place
};
public override string DefaultName
{ private void Deserialize(IGenericReader reader, int version)
get {
{ _place = (SnowGlobeTypeThree)reader.ReadEncodedInt();
var idx = (int)m_Type;
if (idx < 0 || idx >= m_PlaceNames.Length)
{
return "a snowy scene";
}
return $"a snowy scene of {m_PlaceNames[idx]}";
}
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.WriteEncodedInt((int)m_Type);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
switch (version)
{
case 0:
{
m_Type = (SnowGlobeTypeTwo)reader.ReadEncodedInt();
break;
}
}
}
}
public enum SnowGlobeTypeThree
{
Luna,
Umbra,
Zento,
Heartwood,
Covetous,
Deceit,
Destard,
Hythloth,
Khaldun,
Shame,
Wrong,
Doom,
TheCitadel,
ThePalaceofParoxysmus,
TheBlightedGrove,
ThePrismofLight
}
public class SnowGlobeThree : SnowGlobe
{
private SnowGlobeTypeThree m_Type;
[Constructible]
public SnowGlobeThree()
: this((SnowGlobeTypeThree)Utility.Random(16))
{
}
[Constructible]
public SnowGlobeThree(SnowGlobeTypeThree type) => m_Type = type;
public SnowGlobeThree(Serial serial)
: base(serial)
{
}
[CommandProperty(AccessLevel.GameMaster)]
public SnowGlobeTypeThree Place
{
get => m_Type;
set
{
m_Type = value;
InvalidateProperties();
}
}
public override int LabelNumber
{
get
{
if (m_Type >= SnowGlobeTypeThree.Covetous)
{
return 1075440 + ((int)m_Type - 4);
}
return 1075294 + (int)m_Type;
}
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.WriteEncodedInt((int)m_Type);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
switch (version)
{
case 0:
{
m_Type = (SnowGlobeTypeThree)reader.ReadEncodedInt();
break;
}
}
}
} }
} }

View file

@ -1,40 +1,20 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class SnowPileDeco : Item
{ {
public class SnowPileDeco : Item private static readonly int[] _types = { 0x8E2, 0x8E0, 0x8E6, 0x8E5, 0x8E3 };
[Constructible]
public SnowPileDeco() : this(_types.RandomElement())
{ {
private static readonly int[] m_Types = { 0x8E2, 0x8E0, 0x8E6, 0x8E5, 0x8E3 };
[Constructible]
public SnowPileDeco()
: this(m_Types.RandomElement())
{
}
[Constructible]
public SnowPileDeco(int itemid)
: base(itemid) =>
Hue = 0x481;
public SnowPileDeco(Serial serial)
: base(serial)
{
}
public override string DefaultName => "Snow Pile";
public override double DefaultWeight => 2.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
[Constructible]
public SnowPileDeco(int itemid) : base(itemid) => Hue = 0x481;
public override int LabelNumber => 1095253; // decorative snow piles
public override double DefaultWeight => 2.0;
} }

View file

@ -1,250 +1,148 @@
using ModernUO.Serialization;
using Server.Gumps; using Server.Gumps;
using Server.Network; using Server.Network;
namespace Server.Items namespace Server.Items;
[Flippable(0x456E, 0x456F)]
[SerializationGenerator(0)]
public partial class SnowStatuePegasus : Item
{ {
[Flippable(0x456E, 0x456F)] [Constructible]
public class SnowStatuePegasus : Item public SnowStatuePegasus() : base(0x456E)
{ {
[Constructible] }
public SnowStatuePegasus()
: base(0x456E) public override bool ForceShowProperties => ObjectPropertyList.Enabled;
}
[Flippable(0x4578, 0x4579)]
[SerializationGenerator(0)]
public partial class SnowStatueSeahorse : Item
{
[Constructible]
public SnowStatueSeahorse() : base(0x4578)
{
}
public override bool ForceShowProperties => ObjectPropertyList.Enabled;
}
[Flippable(0x457A, 0x457B)]
[SerializationGenerator(0)]
public partial class SnowStatueMermaid : Item
{
[Constructible]
public SnowStatueMermaid() : base(0x457A)
{
}
public override bool ForceShowProperties => ObjectPropertyList.Enabled;
}
[Flippable(0x457C, 0x457D)]
[SerializationGenerator(0)]
public partial class SnowStatueGriffon : Item
{
[Constructible]
public SnowStatueGriffon() : base(0x457C)
{
}
public override bool ForceShowProperties => ObjectPropertyList.Enabled;
}
[SerializationGenerator(0)]
public partial class SnowStatueDeed : Item
{
[Constructible]
public SnowStatueDeed() : base(0x14F0) => LootType = LootType.Blessed;
public override int LabelNumber => 1114296; // snow statue deed
public override double DefaultWeight => 1.0;
public override void OnDoubleClick(Mobile from)
{
if (IsChildOf(from.Backpack))
{ {
from.CloseGump<InternalGump>();
from.SendGump(new InternalGump(from, this));
} }
else
public SnowStatuePegasus(Serial serial)
: base(serial)
{ {
} from.SendLocalizedMessage(1042038); // You must have the object in your backpack to use it.
public override bool ForceShowProperties => ObjectPropertyList.Enabled;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadEncodedInt();
} }
} }
[Flippable(0x4578, 0x4579)] private class InternalGump : Gump
public class SnowStatueSeahorse : Item
{ {
[Constructible] private readonly SnowStatueDeed _deed;
public SnowStatueSeahorse()
: base(0x4578) public InternalGump(Mobile from, SnowStatueDeed deed) : base(100, 200)
{ {
_deed = deed;
Closable = true;
Disposable = true;
Draggable = true;
Resizable = false;
AddPage(0);
AddBackground(0, 0, 360, 225, 0xA28);
AddPage(1);
AddLabel(45, 15, 0, Localization.GetText(1156487, from.Language)); // Select One:
AddItem(35, 75, 0x456E);
AddButton(65, 50, 0x845, 0x846, 1);
AddItem(120, 75, 0x4578);
AddButton(135, 50, 0x845, 0x846, 2);
AddItem(190, 75, 0x457A);
AddButton(205, 50, 0x845, 0x846, 3);
AddItem(250, 75, 0x457C);
AddButton(275, 50, 0x845, 0x846, 4);
} }
public SnowStatueSeahorse(Serial serial) public override void OnResponse(NetState sender, RelayInfo info)
: base(serial)
{ {
} if (_deed?.Deleted != false)
public override bool ForceShowProperties => ObjectPropertyList.Enabled;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadEncodedInt();
}
}
[Flippable(0x457A, 0x457B)]
public class SnowStatueMermaid : Item
{
[Constructible]
public SnowStatueMermaid()
: base(0x457A)
{
}
public SnowStatueMermaid(Serial serial)
: base(serial)
{
}
public override bool ForceShowProperties => ObjectPropertyList.Enabled;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadEncodedInt();
}
}
[Flippable(0x457C, 0x457D)]
public class SnowStatueGriffon : Item
{
[Constructible]
public SnowStatueGriffon()
: base(0x457C)
{
}
public SnowStatueGriffon(Serial serial)
: base(serial)
{
}
public override bool ForceShowProperties => ObjectPropertyList.Enabled;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadEncodedInt();
}
}
public class SnowStatueDeed : Item
{
[Constructible]
public SnowStatueDeed()
: base(0x14F0) =>
LootType = LootType.Blessed;
public SnowStatueDeed(Serial serial)
: base(serial)
{
}
public override int LabelNumber => 1114296; // snow statue deed
public override double DefaultWeight => 1.0;
public override void OnDoubleClick(Mobile from)
{
if (IsChildOf(from.Backpack))
{ {
from.CloseGump<InternalGump>(); return;
from.SendGump(new InternalGump(this)); }
var from = sender.Mobile;
if (!_deed.IsChildOf(from.Backpack))
{
from.SendLocalizedMessage(1042038); // You must have the object in your backpack to use it
return;
}
Item statue = info.ButtonID switch
{
1 => new SnowStatuePegasus(),
2 => new SnowStatueSeahorse(),
3 => new SnowStatueMermaid(),
4 => new SnowStatueGriffon(),
_ => null
};
if (statue == null)
{
return;
}
if (!from.PlaceInBackpack(statue))
{
statue.Delete();
from.SendLocalizedMessage(1078837); // Your backpack is full! Please make room and try again.
} }
else else
{ {
from.SendLocalizedMessage(1042038); // You must have the object in your backpack to use it. _deed.Delete();
}
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadEncodedInt();
}
private class InternalGump : Gump
{
private readonly SnowStatueDeed m_Deed;
public InternalGump(SnowStatueDeed deed) : base(100, 200)
{
m_Deed = deed;
Closable = true;
Disposable = true;
Draggable = true;
Resizable = false;
AddPage(0);
AddBackground(0, 0, 360, 225, 0xA28);
AddPage(1);
AddLabel(45, 15, 0, "Select One:");
AddItem(35, 75, 0x456E);
AddButton(65, 50, 0x845, 0x846, 1);
AddItem(120, 75, 0x4578);
AddButton(135, 50, 0x845, 0x846, 2);
AddItem(190, 75, 0x457A);
AddButton(205, 50, 0x845, 0x846, 3);
AddItem(250, 75, 0x457C);
AddButton(275, 50, 0x845, 0x846, 4);
}
public override void OnResponse(NetState sender, RelayInfo info)
{
if (m_Deed?.Deleted != false)
{
return;
}
var from = sender.Mobile;
if (!m_Deed.IsChildOf(from.Backpack))
{
from.SendLocalizedMessage(1042038); // You must have the object in your backpack to use it
return;
}
Item statue;
switch (info.ButtonID)
{
default:
return;
case 1:
statue = new SnowStatuePegasus();
break;
case 2:
statue = new SnowStatueSeahorse();
break;
case 3:
statue = new SnowStatueMermaid();
break;
case 4:
statue = new SnowStatueGriffon();
break;
}
if (!from.PlaceInBackpack(statue))
{
statue.Delete();
from.SendLocalizedMessage(1078837); // Your backpack is full! Please make room and try again.
}
else
{
m_Deed.Delete();
}
} }
} }
} }

View file

@ -1,58 +1,25 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0, false)]
public partial class BlueSnowflake : Item
{ {
public class BlueSnowflake : Item [Constructible]
public BlueSnowflake() : base(0x232E)
{ {
[Constructible] Weight = 1.0;
public BlueSnowflake() : base(0x232E) LootType = LootType.Blessed;
{ }
Weight = 1.0; }
LootType = LootType.Blessed;
} [SerializationGenerator(0, false)]
public partial class WhiteSnowflake : Item
public BlueSnowflake(Serial serial) : base(serial) {
{ [Constructible]
} public WhiteSnowflake() : base(0x232F)
{
public override void Serialize(IGenericWriter writer) Weight = 1.0;
{ LootType = LootType.Blessed;
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
public class WhiteSnowflake : Item
{
[Constructible]
public WhiteSnowflake() : base(0x232F)
{
Weight = 1.0;
LootType = LootType.Blessed;
}
public WhiteSnowflake(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
} }

View file

@ -1,157 +1,125 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[Flippable(0x2328, 0x2329)]
[SerializationGenerator(0, false)]
public partial class Snowman : Item, IDyable
{ {
[Flippable(0x2328, 0x2329)] // All hail OSI staff
public class Snowman : Item, IDyable private static readonly string[] titles =
{ {
// All hail OSI staff /* 1 */ "Backflash",
private static readonly string[] titles = /* 2 */ "Carbon",
{ /* 3 */ "Colbalistic",
/* 1 */ "Backflash", /* 4 */ "Comforl",
/* 2 */ "Carbon", /* 5 */ "Coppacchia",
/* 3 */ "Colbalistic", /* 6 */ "Cyrus",
/* 4 */ "Comforl", /* 7 */ "DannyB",
/* 5 */ "Coppacchia", /* 8 */ "DJSoul",
/* 6 */ "Cyrus", /* 9 */ "DraconisRex",
/* 7 */ "DannyB", /* 10 */ "Earia",
/* 8 */ "DJSoul", /* 11 */ "Foster",
/* 9 */ "DraconisRex", /* 12 */ "Gonzo",
/* 10 */ "Earia", /* 13 */ "Haan",
/* 11 */ "Foster", /* 14 */ "Halona",
/* 12 */ "Gonzo", /* 15 */ "Hugo",
/* 13 */ "Haan", /* 16 */ "Hyacinth",
/* 14 */ "Halona", /* 17 */ "Imirian",
/* 15 */ "Hugo", /* 18 */ "Jinsol",
/* 16 */ "Hyacinth", /* 19 */ "Liciatia",
/* 17 */ "Imirian", /* 20 */ "Loewen",
/* 18 */ "Jinsol", /* 21 */ "Loke",
/* 19 */ "Liciatia", /* 22 */ "Magnus",
/* 20 */ "Loewen", /* 23 */ "Maleki",
/* 21 */ "Loke", /* 24 */ "Morpheus",
/* 22 */ "Magnus", /* 25 */ "Obberron",
/* 23 */ "Maleki", /* 26 */ "Odee",
/* 24 */ "Morpheus", /* 27 */ "Orbeus",
/* 25 */ "Obberron", /* 28 */ "Pax",
/* 26 */ "Odee", /* 29 */ "Phields",
/* 27 */ "Orbeus", /* 30 */ "Pigpen",
/* 28 */ "Pax", /* 31 */ "Platinum",
/* 29 */ "Phields", /* 32 */ "Polpol",
/* 30 */ "Pigpen", /* 33 */ "Prume",
/* 31 */ "Platinum", /* 34 */ "Quinnly",
/* 32 */ "Polpol", /* 35 */ "Ragnarok",
/* 33 */ "Prume", /* 36 */ "Rend",
/* 34 */ "Quinnly", /* 37 */ "Roland",
/* 35 */ "Ragnarok", /* 38 */ "RyanM",
/* 36 */ "Rend", /* 39 */ "Screach",
/* 37 */ "Roland", /* 40 */ "Seraph",
/* 38 */ "RyanM", /* 41 */ "Silvani",
/* 39 */ "Screach", /* 42 */ "Sherbear",
/* 40 */ "Seraph", /* 43 */ "SkyWalker",
/* 41 */ "Silvani", /* 44 */ "Snark",
/* 42 */ "Sherbear", /* 45 */ "Sowl",
/* 43 */ "SkyWalker", /* 46 */ "Spada",
/* 44 */ "Snark", /* 47 */ "Starblade",
/* 45 */ "Sowl", /* 48 */ "Tenacious",
/* 46 */ "Spada", /* 49 */ "Tnez",
/* 47 */ "Starblade", /* 50 */ "Wasia",
/* 48 */ "Tenacious", /* 51 */ "Zilo",
/* 49 */ "Tnez", /* 52 */ "Zippy",
/* 50 */ "Wasia", /* 53 */ "Zoer"
/* 51 */ "Zilo", };
/* 52 */ "Zippy",
/* 53 */ "Zoer"
};
private string m_Title; [InvalidateProperties]
[SerializableField(0)]
[SerializedCommandProperty(AccessLevel.GameMaster)]
private string _title;
[Constructible] [Constructible]
public Snowman() : this(Utility.RandomDyedHue()) public Snowman() : this(Utility.RandomDyedHue())
{
}
[Constructible]
public Snowman(int hue) : this(hue, GetRandomTitle())
{
}
[Constructible]
public Snowman(string title) : this(Utility.RandomDyedHue(), title)
{
}
[Constructible]
public Snowman(int hue, string title) : base(Utility.Random(0x2328, 2))
{
Weight = 10.0;
Hue = hue;
LootType = LootType.Blessed;
_title = title;
}
public bool Dye(Mobile from, DyeTub sender)
{
if (Deleted)
{ {
return false;
} }
[Constructible] Hue = sender.DyedHue;
public Snowman(int hue) : this(hue, GetRandomTitle()) return true;
}
public static string GetRandomTitle() => titles.RandomElement();
public override void GetProperties(IPropertyList list)
{
base.GetProperties(list);
if (_title != null)
{ {
} list.Add(1062841, _title); // ~1_NAME~ the Snowman
[Constructible]
public Snowman(string title) : this(Utility.RandomDyedHue(), title)
{
}
[Constructible]
public Snowman(int hue, string title) : base(Utility.Random(0x2328, 2))
{
Weight = 10.0;
Hue = hue;
LootType = LootType.Blessed;
m_Title = title;
}
public Snowman(Serial serial) : base(serial)
{
}
[CommandProperty(AccessLevel.GameMaster)]
public string Title
{
get => m_Title;
set
{
m_Title = value;
InvalidateProperties();
}
}
public bool Dye(Mobile from, DyeTub sender)
{
if (Deleted)
{
return false;
}
Hue = sender.DyedHue;
return true;
}
public static string GetRandomTitle() => titles.RandomElement();
public override void GetProperties(IPropertyList list)
{
base.GetProperties(list);
if (m_Title != null)
{
list.Add(1062841, m_Title); // ~1_NAME~ the Snowman
}
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(m_Title);
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
switch (version)
{
case 1:
{
m_Title = reader.ReadString();
break;
}
}
Utility.Intern(ref m_Title);
} }
} }
[AfterDeserialization]
private void AfterDeserialization()
{
Utility.Intern(ref _title);
}
} }

View file

@ -1,60 +1,31 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[Furniture]
[Flippable(0x2bd9, 0x2bda)]
[SerializationGenerator(0)]
public partial class GreenStocking : BaseContainer
{ {
[Furniture] [Constructible]
[Flippable(0x2bd9, 0x2bda)] public GreenStocking() : base(Utility.Random(0x2BD9, 2))
public class GreenStocking : BaseContainer
{ {
[Constructible]
public GreenStocking() : base(Utility.Random(0x2BD9, 2))
{
}
public GreenStocking(Serial serial) : base(serial)
{
}
public override int DefaultGumpID => 0x103;
public override int DefaultDropSound => 0x42;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
[Furniture] public override int DefaultGumpID => 0x103;
[Flippable(0x2bdb, 0x2bdc)] public override int DefaultDropSound => 0x42;
public class RedStocking : BaseContainer }
{
[Constructible] [Furniture]
public RedStocking() : base(Utility.Random(0x2BDB, 2)) [Flippable(0x2bdb, 0x2bdc)]
{ [SerializationGenerator(0)]
} public partial class RedStocking : BaseContainer
{
public RedStocking(Serial serial) : base(serial) [Constructible]
{ public RedStocking() : base(Utility.Random(0x2BDB, 2))
} {
}
public override int DefaultGumpID => 0x103;
public override int DefaultDropSound => 0x42; public override int DefaultGumpID => 0x103;
public override int DefaultDropSound => 0x42;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
}
} }

View file

@ -1,33 +1,17 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[Flippable(0x232A, 0x232B)]
[SerializationGenerator(0)]
public partial class WinterGiftPackage2003 : GiftBox
{ {
[Flippable(0x232A, 0x232B)] [Constructible]
public class WinterGiftPackage2003 : GiftBox public WinterGiftPackage2003()
{ {
[Constructible] DropItem(new Snowman());
public WinterGiftPackage2003() DropItem(new WreathDeed());
{ DropItem(new BlueSnowflake());
DropItem(new Snowman()); DropItem(new RedPoinsettia());
DropItem(new WreathDeed());
DropItem(new BlueSnowflake());
DropItem(new RedPoinsettia());
}
public WinterGiftPackage2003(Serial serial) : base(serial)
{
}
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
} }

View file

@ -1,342 +1,311 @@
using ModernUO.Serialization;
using Server.Gumps; using Server.Gumps;
using Server.Multis; using Server.Multis;
using Server.Network; using Server.Network;
using Server.Targeting; using Server.Targeting;
namespace Server.Items namespace Server.Items;
[SerializationGenerator(0)]
public partial class WreathAddon : Item, IDyable, IAddon
{ {
public class WreathAddon : Item, IDyable, IAddon [Constructible]
public WreathAddon() : this(Utility.RandomDyedHue())
{ {
[Constructible] }
public WreathAddon() : this(Utility.RandomDyedHue())
[Constructible]
public WreathAddon(int hue) : base(0x232C)
{
Hue = hue;
Movable = false;
}
public bool CouldFit(IPoint3D p, Map map)
{
if (!map.CanFit(p.X, p.Y, p.Z, ItemData.Height))
{ {
}
[Constructible]
public WreathAddon(int hue) : base(0x232C)
{
Hue = hue;
Movable = false;
}
public WreathAddon(Serial serial) : base(serial)
{
}
public bool CouldFit(IPoint3D p, Map map)
{
if (!map.CanFit(p.X, p.Y, p.Z, ItemData.Height))
{
return false;
}
if (ItemID == 0x232C)
{
return BaseAddon.IsWall(p.X, p.Y - 1, p.Z, map); // North wall
}
return BaseAddon.IsWall(p.X - 1, p.Y, p.Z, map); // West wall
}
public Item Deed => new WreathDeed(Hue);
public virtual bool Dye(Mobile from, DyeTub sender)
{
if (Deleted)
{
return false;
}
var house = BaseHouse.FindHouseAt(this);
if (house?.IsCoOwner(from) == true)
{
if (from.InRange(GetWorldLocation(), 1))
{
Hue = sender.DyedHue;
return true;
}
from.SendLocalizedMessage(500295); // You are too far away to do that.
return false;
}
return false; return false;
} }
public override void Serialize(IGenericWriter writer) if (ItemID == 0x232C)
{ {
base.Serialize(writer); return BaseAddon.IsWall(p.X, p.Y - 1, p.Z, map); // North wall
writer.Write(0); // version
} }
public override void Deserialize(IGenericReader reader) return BaseAddon.IsWall(p.X - 1, p.Y, p.Z, map); // West wall
}
public Item Deed => new WreathDeed(Hue);
public virtual bool Dye(Mobile from, DyeTub sender)
{
if (Deleted)
{ {
base.Deserialize(reader); return false;
var version = reader.ReadInt();
Timer.StartTimer(FixMovingCrate);
} }
private void FixMovingCrate() var house = BaseHouse.FindHouseAt(this);
if (house?.IsCoOwner(from) == true)
{ {
if (Deleted) if (from.InRange(GetWorldLocation(), 1))
{ {
return; Hue = sender.DyedHue;
return true;
} }
if (Movable || IsLockedDown) from.SendLocalizedMessage(500295); // You are too far away to do that.
{ return false;
var deed = Deed;
if (Parent is Item item)
{
item.AddItem(deed);
deed.Location = Location;
}
else
{
deed.MoveToWorld(Location, Map);
}
Delete();
}
} }
public override void OnDoubleClick(Mobile from) return false;
{ }
var house = BaseHouse.FindHouseAt(this);
if (house?.IsCoOwner(from) == true) [AfterDeserialization(false)]
{ private void FixMovingCrate()
if (from.InRange(GetWorldLocation(), 3)) {
{ if (Deleted)
from.CloseGump<WreathAddonGump>(); {
from.SendGump(new WreathAddonGump(from, this)); return;
}
else
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
}
}
} }
private class WreathAddonGump : Gump if (Movable || IsLockedDown)
{ {
private readonly WreathAddon m_Addon; var deed = Deed;
private readonly Mobile m_From;
public WreathAddonGump(Mobile from, WreathAddon addon) : base(150, 50) if (Parent is Item item)
{ {
m_From = from; item.AddItem(deed);
m_Addon = addon; deed.Location = Location;
}
AddPage(0); else
{
AddBackground(0, 0, 220, 170, 0x13BE); deed.MoveToWorld(Location, Map);
AddBackground(10, 10, 200, 150, 0xBB8);
AddHtmlLocalized(20, 30, 180, 60, 1062839); // Do you wish to re-deed this decoration?
AddHtmlLocalized(55, 100, 160, 25, 1011011); // CONTINUE
AddButton(20, 100, 0xFA5, 0xFA7, 1);
AddHtmlLocalized(55, 125, 160, 25, 1011012); // CANCEL
AddButton(20, 125, 0xFA5, 0xFA7, 0);
} }
public override void OnResponse(NetState sender, RelayInfo info) Delete();
{ }
if (m_Addon.Deleted) }
{
return;
}
if (info.ButtonID == 1) public override void OnDoubleClick(Mobile from)
{ {
if (m_From.InRange(m_Addon.GetWorldLocation(), 3)) var house = BaseHouse.FindHouseAt(this);
{
m_From.AddToBackpack(m_Addon.Deed); if (house?.IsCoOwner(from) == true)
m_Addon.Delete(); {
} if (from.InRange(GetWorldLocation(), 3))
else {
{ from.CloseGump<WreathAddonGump>();
m_From.SendLocalizedMessage(500295); // You are too far away to do that. from.SendGump(new WreathAddonGump(from, this));
} }
} else
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
} }
} }
} }
[Flippable(0x14F0, 0x14EF)] private class WreathAddonGump : Gump
public class WreathDeed : Item
{ {
[Constructible] private readonly WreathAddon _addon;
public WreathDeed() : this(Utility.RandomDyedHue()) private readonly Mobile _from;
public WreathAddonGump(Mobile from, WreathAddon addon) : base(150, 50)
{ {
_from = from;
_addon = addon;
AddPage(0);
AddBackground(0, 0, 220, 170, 0x13BE);
AddBackground(10, 10, 200, 150, 0xBB8);
AddHtmlLocalized(20, 30, 180, 60, 1062839); // Do you wish to re-deed this decoration?
AddHtmlLocalized(55, 100, 160, 25, 1011011); // CONTINUE
AddButton(20, 100, 0xFA5, 0xFA7, 1);
AddHtmlLocalized(55, 125, 160, 25, 1011012); // CANCEL
AddButton(20, 125, 0xFA5, 0xFA7, 0);
} }
[Constructible] public override void OnResponse(NetState sender, RelayInfo info)
public WreathDeed(int hue) : base(0x14F0)
{ {
Weight = 1.0; if (_addon.Deleted)
Hue = hue;
LootType = LootType.Blessed;
}
public WreathDeed(Serial serial) : base(serial)
{
}
public override int LabelNumber => 1062837; // holiday wreath deed
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
public override void OnDoubleClick(Mobile from)
{
if (IsChildOf(from.Backpack))
{ {
var house = BaseHouse.FindHouseAt(from); return;
}
if (house?.IsCoOwner(from) == true) if (info.ButtonID == 1)
{
if (_from.InRange(_addon.GetWorldLocation(), 3))
{ {
from.SendLocalizedMessage(1062838); // Where would you like to place this decoration? _from.AddToBackpack(_addon.Deed);
from.BeginTarget(-1, true, TargetFlags.None, Placement_OnTarget); _addon.Delete();
} }
else else
{ {
from.SendLocalizedMessage(502092); // You must be in your house to do this. _from.SendLocalizedMessage(500295); // You are too far away to do that.
}
}
else
{
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
}
}
public void Placement_OnTarget(Mobile from, object targeted)
{
if (targeted is not IPoint3D p)
{
return;
}
var loc = new Point3D(p);
var house = BaseHouse.FindHouseAt(loc, from.Map, 16);
if (house?.IsCoOwner(from) == true)
{
var northWall = BaseAddon.IsWall(loc.X, loc.Y - 1, loc.Z, from.Map);
var westWall = BaseAddon.IsWall(loc.X - 1, loc.Y, loc.Z, from.Map);
if (northWall && westWall)
{
from.SendGump(new WreathDeedGump(from, loc, this));
}
else
{
PlaceAddon(from, loc, northWall, westWall);
}
}
else
{
from.SendLocalizedMessage(1042036); // That location is not in your house.
}
}
private void PlaceAddon(Mobile from, Point3D loc, bool northWall, bool westWall)
{
if (Deleted)
{
return;
}
var house = BaseHouse.FindHouseAt(loc, from.Map, 16);
if (house?.IsCoOwner(from) != true)
{
from.SendLocalizedMessage(1042036); // That location is not in your house.
return;
}
var itemID = 0;
if (northWall)
{
itemID = 0x232C;
}
else if (westWall)
{
itemID = 0x232D;
}
else
{
from.SendLocalizedMessage(1062840); // The decoration must be placed next to a wall.
}
if (itemID > 0)
{
Item addon = new WreathAddon(Hue);
addon.ItemID = itemID;
addon.MoveToWorld(loc, from.Map);
house.Addons.Add(addon);
Delete();
}
}
private class WreathDeedGump : Gump
{
private readonly WreathDeed m_Deed;
private readonly Mobile m_From;
private readonly Point3D m_Loc;
public WreathDeedGump(Mobile from, Point3D loc, WreathDeed deed) : base(150, 50)
{
m_From = from;
m_Loc = loc;
m_Deed = deed;
AddBackground(0, 0, 300, 150, 0xA28);
AddPage(0);
AddItem(90, 30, 0x232D);
AddItem(180, 30, 0x232C);
AddButton(50, 35, 0x868, 0x869, 1);
AddButton(145, 35, 0x868, 0x869, 2);
}
public override void OnResponse(NetState sender, RelayInfo info)
{
if (m_Deed.Deleted)
{
return;
}
switch (info.ButtonID)
{
case 1:
m_Deed.PlaceAddon(m_From, m_Loc, false, true);
break;
case 2:
m_Deed.PlaceAddon(m_From, m_Loc, true, false);
break;
} }
} }
} }
} }
} }
[Flippable(0x14F0, 0x14EF)]
[SerializationGenerator(0)]
public partial class WreathDeed : Item
{
[Constructible]
public WreathDeed() : this(Utility.RandomDyedHue())
{
}
[Constructible]
public WreathDeed(int hue) : base(0x14F0)
{
Weight = 1.0;
Hue = hue;
LootType = LootType.Blessed;
}
public override int LabelNumber => 1062837; // holiday wreath deed
public override void OnDoubleClick(Mobile from)
{
if (IsChildOf(from.Backpack))
{
var house = BaseHouse.FindHouseAt(from);
if (house?.IsCoOwner(from) == true)
{
from.SendLocalizedMessage(1062838); // Where would you like to place this decoration?
from.BeginTarget(-1, true, TargetFlags.None, Placement_OnTarget);
}
else
{
from.SendLocalizedMessage(502092); // You must be in your house to do this.
}
}
else
{
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
}
}
public void Placement_OnTarget(Mobile from, object targeted)
{
if (targeted is not IPoint3D p)
{
return;
}
var loc = new Point3D(p);
var house = BaseHouse.FindHouseAt(loc, from.Map, 16);
if (house?.IsCoOwner(from) == true)
{
var northWall = BaseAddon.IsWall(loc.X, loc.Y - 1, loc.Z, from.Map);
var westWall = BaseAddon.IsWall(loc.X - 1, loc.Y, loc.Z, from.Map);
if (northWall && westWall)
{
from.SendGump(new WreathDeedGump(from, loc, this));
}
else
{
PlaceAddon(from, loc, northWall, westWall);
}
}
else
{
from.SendLocalizedMessage(1042036); // That location is not in your house.
}
}
private void PlaceAddon(Mobile from, Point3D loc, bool northWall, bool westWall)
{
if (Deleted)
{
return;
}
var house = BaseHouse.FindHouseAt(loc, from.Map, 16);
if (house?.IsCoOwner(from) != true)
{
from.SendLocalizedMessage(1042036); // That location is not in your house.
return;
}
var itemID = 0;
if (northWall)
{
itemID = 0x232C;
}
else if (westWall)
{
itemID = 0x232D;
}
else
{
from.SendLocalizedMessage(1062840); // The decoration must be placed next to a wall.
}
if (itemID > 0)
{
Item addon = new WreathAddon(Hue);
addon.ItemID = itemID;
addon.MoveToWorld(loc, from.Map);
house.Addons.Add(addon);
Delete();
}
}
private class WreathDeedGump : Gump
{
private readonly WreathDeed _deed;
private readonly Mobile _from;
private readonly Point3D _loc;
public WreathDeedGump(Mobile from, Point3D loc, WreathDeed deed) : base(150, 50)
{
_from = from;
_loc = loc;
_deed = deed;
AddBackground(0, 0, 300, 150, 0xA28);
AddPage(0);
AddItem(90, 30, 0x232D);
AddItem(180, 30, 0x232C);
AddButton(50, 35, 0x868, 0x869, 1);
AddButton(145, 35, 0x868, 0x869, 2);
}
public override void OnResponse(NetState sender, RelayInfo info)
{
if (_deed.Deleted)
{
return;
}
switch (info.ButtonID)
{
case 1:
{
_deed.PlaceAddon(_from, _loc, false, true);
break;
}
case 2:
{
_deed.PlaceAddon(_from, _loc, true, false);
break;
}
}
}
}
}

View file

@ -1,36 +1,18 @@
namespace Server.Items using ModernUO.Serialization;
namespace Server.Items;
[SerializationGenerator(0)]
public partial class WristWatch : Clock
{ {
public class WristWatch : Clock [Constructible]
public WristWatch() : base(0x1086)
{ {
[Constructible] Weight = DefaultWeight;
public WristWatch() LootType = LootType.Blessed;
: base(0x1086) Layer = Layer.Bracelet;
{
Weight = DefaultWeight;
LootType = LootType.Blessed;
Layer = Layer.Bracelet;
}
public WristWatch(Serial serial)
: base(serial)
{
}
public override int LabelNumber => 1041421; // a wrist watch
public override double DefaultWeight => 1.0;
public override void Serialize(IGenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(IGenericReader reader)
{
base.Deserialize(reader);
var version = reader.ReadInt();
}
} }
public override int LabelNumber => 1041421; // a wrist watch
public override double DefaultWeight => 1.0;
} }

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BadCard"
}

View file

@ -0,0 +1,11 @@
{
"version": 1,
"type": "Server.Items.BaseScales",
"properties": [
{
"name": "Resource",
"type": "Server.Items.CraftResource",
"rule": "EnumMigrationRule"
}
]
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BlackScales"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BlueScales"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.BlueSnowflake"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.CandyCane"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.Coal"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GiftBox"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GiftBoxAngel"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GiftBoxCube"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GiftBoxCylinder"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GiftBoxNeon"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GiftBoxOctogon"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GiftBoxRectangle"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GingerBreadCookie"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GingerBreadHouseAddon"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GingerBreadHouseDeed"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GreenScales"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GreenStocking"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.GuillotineDeed"
}

View file

@ -0,0 +1,22 @@
{
"version": 0,
"type": "Server.Items.HolidayBell",
"properties": [
{
"name": "Maker",
"type": "Server.TextDefinition",
"rule": "PrimitiveUOTypeMigrationRule",
"ruleArguments": [
"TextDefinition"
]
},
{
"name": "SoundID",
"type": "int",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
}
]
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.HolidayPottedPlant"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.HolidayTimepiece"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.HolidayTree.Ornament"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.HolidayTree.TreeTrunk"
}

View file

@ -0,0 +1,11 @@
{
"version": 2,
"type": "Server.Items.HolidayTree",
"properties": [
{
"name": "Placer",
"type": "Server.Mobile",
"rule": "SerializableInterfaceMigrationRule"
}
]
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.IcicleLargeEast"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.IcicleLargeSouth"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.IcicleMedEast"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.IcicleMedSouth"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.IcicleSmallEast"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.IcicleSmallSouth"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.IcyPatch"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.PottedPlantDeed"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.RedPoinsettia"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.RedScales"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.RedStocking"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.SnowGlobe"
}

View file

@ -0,0 +1,11 @@
{
"version": 1,
"type": "Server.Items.SnowGlobeOne",
"properties": [
{
"name": "Place",
"type": "Server.Items.SnowGlobeTypeOne",
"rule": "EnumMigrationRule"
}
]
}

View file

@ -0,0 +1,11 @@
{
"version": 1,
"type": "Server.Items.SnowGlobeThree",
"properties": [
{
"name": "Place",
"type": "Server.Items.SnowGlobeTypeThree",
"rule": "EnumMigrationRule"
}
]
}

View file

@ -0,0 +1,11 @@
{
"version": 1,
"type": "Server.Items.SnowGlobeTwo",
"properties": [
{
"name": "Place",
"type": "Server.Items.SnowGlobeTypeTwo",
"rule": "EnumMigrationRule"
}
]
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.SnowPileDeco"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.SnowStatueDeed"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.SnowStatueGriffon"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.SnowStatueMermaid"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.SnowStatuePegasus"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.SnowStatueSeahorse"
}

View file

@ -0,0 +1,14 @@
{
"version": 0,
"type": "Server.Items.Snowman",
"properties": [
{
"name": "Title",
"type": "string",
"rule": "PrimitiveTypeMigrationRule",
"ruleArguments": [
""
]
}
]
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.Spam"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.WhitePoinsettia"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.WhiteScales"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.WhiteSnowflake"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.WinterGiftPackage2003"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.WreathAddon"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.WreathDeed"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.WristWatch"
}

View file

@ -0,0 +1,4 @@
{
"version": 0,
"type": "Server.Items.YellowScales"
}