Reorganizes Project (#41)

This commit is contained in:
Kamron Batman 2019-08-02 18:13:40 -07:00 committed by GitHub
parent 08bf44af9a
commit 3614a66aee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3499 changed files with 79 additions and 55 deletions

View file

@ -0,0 +1,68 @@
namespace Server.Items
{
public class AbbatoirAddon : BaseAddon
{
[Constructible]
public AbbatoirAddon()
{
AddComponent(new AddonComponent(0x120E), -1, -1, 0);
AddComponent(new AddonComponent(0x120F), 0, -1, 0);
AddComponent(new AddonComponent(0x1210), 1, -1, 0);
AddComponent(new AddonComponent(0x1215), -1, 0, 0);
AddComponent(new AddonComponent(0x1216), 0, 0, 0);
AddComponent(new AddonComponent(0x1211), 1, 0, 0);
AddComponent(new AddonComponent(0x1214), -1, 1, 0);
AddComponent(new AddonComponent(0x1213), 0, 1, 0);
AddComponent(new AddonComponent(0x1212), 1, 1, 0);
}
public AbbatoirAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new AbbatoirDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class AbbatoirDeed : BaseAddonDeed
{
[Constructible]
public AbbatoirDeed()
{
}
public AbbatoirDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new AbbatoirAddon();
public override int LabelNumber => 1044329; // abbatoir
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,262 @@
using Server.Engines.Craft;
namespace Server.Items
{
[Anvil]
public class AnvilComponent : AddonComponent
{
[Constructible]
public AnvilComponent(int itemID) : base(itemID)
{
}
public AnvilComponent(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
[Forge]
public class ForgeComponent : AddonComponent
{
[Constructible]
public ForgeComponent(int itemID) : base(itemID)
{
}
public ForgeComponent(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class LocalizedAddonComponent : AddonComponent
{
private int m_LabelNumber;
[Constructible]
public LocalizedAddonComponent(int itemID, int labelNumber) : base(itemID)
{
m_LabelNumber = labelNumber;
}
public LocalizedAddonComponent(Serial serial) : base(serial)
{
}
[CommandProperty(AccessLevel.GameMaster)]
public int Number
{
get => m_LabelNumber;
set
{
m_LabelNumber = value;
InvalidateProperties();
}
}
public override int LabelNumber => m_LabelNumber;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.Write(m_LabelNumber);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 0:
{
m_LabelNumber = reader.ReadInt();
break;
}
}
}
}
public class AddonComponent : Item, IChopable
{
private static LightEntry[] m_Entries =
{
new LightEntry(LightType.WestSmall, 1122, 1123, 1124, 1141, 1142, 1143, 1144, 1145, 1146, 2347, 2359, 2360, 2361,
2362, 2363, 2364, 2387, 2388, 2389, 2390, 2391, 2392),
new LightEntry(LightType.NorthSmall, 1131, 1133, 1134, 1147, 1148, 1149, 1150, 1151, 1152, 2352, 2373, 2374,
2375, 2376, 2377, 2378, 2401, 2402, 2403, 2404, 2405, 2406),
new LightEntry(LightType.Circle300, 6526, 6538, 6571),
new LightEntry(LightType.Circle150, 5703, 6587)
};
[Constructible]
public AddonComponent(int itemID) : base(itemID)
{
Movable = false;
ApplyLightTo(this);
}
public AddonComponent(Serial serial) : base(serial)
{
}
[CommandProperty(AccessLevel.GameMaster)]
public BaseAddon Addon{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public Point3D Offset{ get; set; }
[Hue]
[CommandProperty(AccessLevel.GameMaster)]
public override int Hue
{
get => base.Hue;
set
{
base.Hue = value;
if (Addon?.ShareHue == true)
Addon.Hue = value;
}
}
public virtual bool NeedsWall => false;
public virtual Point3D WallPosition => Point3D.Zero;
public void OnChop(Mobile from)
{
if (Addon != null && from.InRange(GetWorldLocation(), 3))
Addon.OnChop(from);
else
from.SendLocalizedMessage(500446); // That is too far away.
}
public override void OnDoubleClick(Mobile from)
{
Addon?.OnComponentUsed(this, from);
}
public override void OnLocationChange(Point3D old)
{
if (Addon != null)
Addon.Location = new Point3D(X - Offset.X, Y - Offset.Y, Z - Offset.Z);
}
public override void OnMapChange()
{
if (Addon != null)
Addon.Map = Map;
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
Addon?.Delete();
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(Addon);
writer.Write(Offset);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
case 0:
{
Addon = reader.ReadItem() as BaseAddon;
Offset = reader.ReadPoint3D();
Addon?.OnComponentLoaded(this);
ApplyLightTo(this);
break;
}
}
if (version < 1 && Weight == 0)
Weight = -1;
}
public static void ApplyLightTo(Item item)
{
if ((item.ItemData.Flags & TileFlag.LightSource) == 0)
return; // not a light source
int itemID = item.ItemID;
for (int i = 0; i < m_Entries.Length; ++i)
{
LightEntry entry = m_Entries[i];
int[] toMatch = entry.m_ItemIDs;
bool contains = false;
for (int j = 0; !contains && j < toMatch.Length; ++j)
contains = itemID == toMatch[j];
if (contains)
{
item.Light = entry.m_Light;
return;
}
}
}
private class LightEntry
{
public int[] m_ItemIDs;
public LightType m_Light;
public LightEntry(LightType light, params int[] itemIDs)
{
m_Light = light;
m_ItemIDs = itemIDs;
}
}
}
}

View file

@ -0,0 +1,155 @@
using System.Collections.Generic;
using Server.ContextMenus;
namespace Server.Items
{
public class AddonContainerComponent : Item, IChopable
{
[Constructible]
public AddonContainerComponent(int itemID) : base(itemID)
{
Movable = false;
AddonComponent.ApplyLightTo(this);
}
public AddonContainerComponent(Serial serial) : base(serial)
{
}
public virtual bool NeedsWall => false;
public virtual Point3D WallPosition => Point3D.Zero;
[CommandProperty(AccessLevel.GameMaster)]
public BaseAddonContainer Addon{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public Point3D Offset{ get; set; }
[Hue]
[CommandProperty(AccessLevel.GameMaster)]
public override int Hue
{
get => base.Hue;
set
{
base.Hue = value;
if (Addon?.ShareHue == true)
Addon.Hue = value;
}
}
public virtual void OnChop(Mobile from)
{
if (Addon != null && from.InRange(GetWorldLocation(), 3))
Addon.OnChop(from);
else
from.SendLocalizedMessage(500446); // That is too far away.
}
public override bool OnDragDrop(Mobile from, Item dropped)
{
if (Addon != null)
return Addon.OnDragDrop(from, dropped);
return false;
}
public override void OnDoubleClick(Mobile from)
{
Addon?.OnComponentUsed(this, from);
}
public override void OnLocationChange(Point3D old)
{
if (Addon != null)
Addon.Location = new Point3D(X - Offset.X, Y - Offset.Y, Z - Offset.Z);
}
public override void GetContextMenuEntries(Mobile from, List<ContextMenuEntry> list)
{
Addon?.GetContextMenuEntries(from, list);
}
public override void OnMapChange()
{
if (Addon != null)
Addon.Map = Map;
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
Addon?.Delete();
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.Write(Addon);
writer.Write(Offset);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
Addon = reader.ReadItem() as BaseAddonContainer;
Offset = reader.ReadPoint3D();
Addon?.OnComponentLoaded(this);
AddonComponent.ApplyLightTo(this);
}
}
public class LocalizedContainerComponent : AddonContainerComponent
{
private int m_LabelNumber;
public LocalizedContainerComponent(int itemID, int labelNumber) : base(itemID)
{
m_LabelNumber = labelNumber;
}
public LocalizedContainerComponent(Serial serial) : base(serial)
{
}
public override int LabelNumber
{
get
{
if (m_LabelNumber > 0)
return m_LabelNumber;
return base.LabelNumber;
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.Write(m_LabelNumber);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
m_LabelNumber = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class AlchemistTableEastAddon : BaseAddon
{
[Constructible]
public AlchemistTableEastAddon()
{
AddComponent(new AddonComponent(0x2DD3), 0, 0, 0);
}
public AlchemistTableEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new AlchemistTableEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(1); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class AlchemistTableEastDeed : BaseAddonDeed
{
[Constructible]
public AlchemistTableEastDeed()
{
}
public AlchemistTableEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new AlchemistTableEastAddon();
public override int LabelNumber => 1073397; // alchemist table (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class AlchemistTableSouthAddon : BaseAddon
{
[Constructible]
public AlchemistTableSouthAddon()
{
AddComponent(new AddonComponent(0x2DD4), 0, 0, 0);
}
public AlchemistTableSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new AlchemistTableSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(1); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class AlchemistTableSouthDeed : BaseAddonDeed
{
[Constructible]
public AlchemistTableSouthDeed()
{
}
public AlchemistTableSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new AlchemistTableSouthAddon();
public override int LabelNumber => 1073396; // alchemist table (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class AnvilEastAddon : BaseAddon
{
[Constructible]
public AnvilEastAddon()
{
AddComponent(new AnvilComponent(0xFAF), 0, 0, 0);
}
public AnvilEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new AnvilEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class AnvilEastDeed : BaseAddonDeed
{
[Constructible]
public AnvilEastDeed()
{
}
public AnvilEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new AnvilEastAddon();
public override int LabelNumber => 1044333; // anvil (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class AnvilSouthAddon : BaseAddon
{
[Constructible]
public AnvilSouthAddon()
{
AddComponent(new AnvilComponent(0xFB0), 0, 0, 0);
}
public AnvilSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new AnvilSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class AnvilSouthDeed : BaseAddonDeed
{
[Constructible]
public AnvilSouthDeed()
{
}
public AnvilSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new AnvilSouthAddon();
public override int LabelNumber => 1044334; // anvil (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class ArcaneBookshelfEastAddon : BaseAddon
{
[Constructible]
public ArcaneBookshelfEastAddon()
{
AddComponent(new AddonComponent(0x3084), 0, 0, 0);
AddComponent(new AddonComponent(0x3085), -1, 0, 0);
}
public ArcaneBookshelfEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ArcaneBookshelfEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ArcaneBookshelfEastDeed : BaseAddonDeed
{
[Constructible]
public ArcaneBookshelfEastDeed()
{
}
public ArcaneBookshelfEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ArcaneBookshelfEastAddon();
public override int LabelNumber => 1073371; // arcane bookshelf (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class ArcaneBookshelfSouthAddon : BaseAddon
{
[Constructible]
public ArcaneBookshelfSouthAddon()
{
AddComponent(new AddonComponent(0x3087), 0, 0, 0);
AddComponent(new AddonComponent(0x3086), 0, 1, 0);
}
public ArcaneBookshelfSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ArcaneBookshelfSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ArcaneBookshelfSouthDeed : BaseAddonDeed
{
[Constructible]
public ArcaneBookshelfSouthDeed()
{
}
public ArcaneBookshelfSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ArcaneBookshelfSouthAddon();
public override int LabelNumber => 1072871; // arcane bookshelf (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,81 @@
namespace Server.Items
{
public class ArcaneCircleAddon : BaseAddon
{
[Constructible]
public ArcaneCircleAddon()
{
AddComponent(new AddonComponent(0x3083), -1, -1, 0);
AddComponent(new AddonComponent(0x3080), -1, 0, 0);
AddComponent(new AddonComponent(0x3082), 0, -1, 0);
AddComponent(new AddonComponent(0x3081), 1, -1, 0);
AddComponent(new AddonComponent(0x307D), -1, 1, 0);
AddComponent(new AddonComponent(0x307F), 0, 0, 0);
AddComponent(new AddonComponent(0x307E), 1, 0, 0);
AddComponent(new AddonComponent(0x307C), 0, 1, 0);
AddComponent(new AddonComponent(0x307B), 1, 1, 0);
}
public ArcaneCircleAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ArcaneCircleDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(1); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
if (version == 0)
ValidationQueue<ArcaneCircleAddon>.Add(this);
}
public void Validate()
{
foreach (AddonComponent c in Components)
if (c.ItemID == 0x3083)
{
c.Offset = new Point3D(-1, -1, 0);
c.MoveToWorld(new Point3D(X + c.Offset.X, Y + c.Offset.Y, Z + c.Offset.Z), Map);
}
}
}
public class ArcaneCircleDeed : BaseAddonDeed
{
[Constructible]
public ArcaneCircleDeed()
{
}
public ArcaneCircleDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ArcaneCircleAddon();
public override int LabelNumber => 1072703; // arcane circle
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class ArcanistStatueEastAddon : BaseAddon
{
[Constructible]
public ArcanistStatueEastAddon()
{
AddComponent(new AddonComponent(0x2D0E), 0, 0, 0);
}
public ArcanistStatueEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ArcanistStatueEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ArcanistStatueEastDeed : BaseAddonDeed
{
[Constructible]
public ArcanistStatueEastDeed()
{
}
public ArcanistStatueEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ArcanistStatueEastAddon();
public override int LabelNumber => 1072886; // arcanist statue (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class ArcanistStatueSouthAddon : BaseAddon
{
[Constructible]
public ArcanistStatueSouthAddon()
{
AddComponent(new AddonComponent(0x2D0F), 0, 0, 0);
}
public ArcanistStatueSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ArcanistStatueSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ArcanistStatueSouthDeed : BaseAddonDeed
{
[Constructible]
public ArcanistStatueSouthDeed()
{
}
public ArcanistStatueSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ArcanistStatueSouthAddon();
public override int LabelNumber => 1072885; // arcanist statue (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,330 @@
using System;
using System.Collections.Generic;
using Server.Network;
namespace Server.Items
{
[FlippableAttribute( 0x100A/*East*/, 0x100B/*South*/ )]
public class ArcheryButte : AddonComponent
{
[CommandProperty( AccessLevel.GameMaster )]
public double MinSkill { get; set; }
[CommandProperty( AccessLevel.GameMaster )]
public double MaxSkill { get; set; }
[CommandProperty( AccessLevel.GameMaster )]
public DateTime LastUse { get; set; }
[CommandProperty( AccessLevel.GameMaster )]
public bool FacingEast
{
get => ItemID == 0x100A;
set => ItemID = value ? 0x100A : 0x100B;
}
[CommandProperty( AccessLevel.GameMaster )]
public int Arrows { get; set; }
[CommandProperty( AccessLevel.GameMaster )]
public int Bolts { get; set; }
public ArcheryButte(int itemID = 0x100A) : base(itemID)
{
MinSkill = -25.0;
MaxSkill = +25.0;
}
public ArcheryButte( Serial serial ) : base( serial )
{
}
public override void OnDoubleClick( Mobile from )
{
if ( (Arrows > 0 || Bolts > 0) && from.InRange( GetWorldLocation(), 1 ) )
Gather( from );
else
Fire( from );
}
public void Gather( Mobile from )
{
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 500592 ); // You gather the arrows and bolts.
if ( Arrows > 0 )
from.AddToBackpack( new Arrow( Arrows ) );
if ( Bolts > 0 )
from.AddToBackpack( new Bolt( Bolts ) );
Arrows = 0;
Bolts = 0;
m_Entries = null;
}
private static TimeSpan UseDelay = TimeSpan.FromSeconds( 2.0 );
private class ScoreEntry
{
public int Total { get; set; }
public int Count { get; set; }
public void Record( int score )
{
Total += score;
Count += 1;
}
public ScoreEntry()
{
}
}
private Dictionary<Mobile, ScoreEntry> m_Entries;
private ScoreEntry GetEntryFor( Mobile from )
{
if ( m_Entries == null )
m_Entries = new Dictionary<Mobile, ScoreEntry>();
if (!m_Entries.TryGetValue(from, out ScoreEntry e))
m_Entries[from] = e = new ScoreEntry();
return e;
}
public void Fire( Mobile from )
{
if ( !(from.Weapon is BaseRanged bow) )
{
SendLocalizedMessageTo( from, 500593 ); // You must practice with ranged weapons on this.
return;
}
if ( DateTime.UtcNow < (LastUse + UseDelay) )
return;
Point3D worldLoc = GetWorldLocation();
if ( FacingEast ? from.X <= worldLoc.X : from.Y <= worldLoc.Y )
{
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 500596 ); // You would do better to stand in front of the archery butte.
return;
}
if ( FacingEast ? from.Y != worldLoc.Y : from.X != worldLoc.X )
{
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 500597 ); // You aren't properly lined up with the archery butte to get an accurate shot.
return;
}
if ( !from.InRange( worldLoc, 6 ) )
{
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 500598 ); // You are too far away from the archery butte to get an accurate shot.
return;
}
if ( from.InRange( worldLoc, 4 ) )
{
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 500599 ); // You are too close to the target.
return;
}
Container pack = from.Backpack;
Type ammoType = bow.AmmoType;
bool isArrow = ammoType == typeof( Arrow );
bool isBolt = ammoType == typeof( Bolt );
bool isKnown = isArrow || isBolt;
if (pack?.ConsumeTotal( ammoType ) != true)
{
if ( isArrow )
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 500594 ); // You do not have any arrows with which to practice.
else if ( isBolt )
from.LocalOverheadMessage( MessageType.Regular, 0x3B2, 500595 ); // You do not have any crossbow bolts with which to practice.
else
SendLocalizedMessageTo( from, 500593 ); // You must practice with ranged weapons on this.
return;
}
LastUse = DateTime.UtcNow;
from.Direction = from.GetDirectionTo( GetWorldLocation() );
bow.PlaySwingAnimation( from );
from.MovingEffect( this, bow.EffectID, 18, 1, false, false );
ScoreEntry se = GetEntryFor( from );
if ( !from.CheckSkill( bow.Skill, MinSkill, MaxSkill ) )
{
from.PlaySound( bow.MissSound );
PublicOverheadMessage( MessageType.Regular, 0x3B2, 500604, from.Name ); // You miss the target altogether.
se.Record( 0 );
if ( se.Count == 1 )
PublicOverheadMessage( MessageType.Regular, 0x3B2, 1062719, se.Total.ToString() );
else
PublicOverheadMessage( MessageType.Regular, 0x3B2, 1042683, $"{se.Total}\t{se.Count}");
return;
}
Effects.PlaySound( Location, Map, 0x2B1 );
double rand = Utility.RandomDouble();
int area, score, splitScore;
if ( 0.10 > rand )
{
area = 0; // bullseye
score = 50;
splitScore = 100;
}
else if ( 0.25 > rand )
{
area = 1; // inner ring
score = 10;
splitScore = 20;
}
else if ( 0.50 > rand )
{
area = 2; // middle ring
score = 5;
splitScore = 15;
}
else
{
area = 3; // outer ring
score = 2;
splitScore = 5;
}
bool split = ( isKnown && ((Arrows + Bolts) * 0.02) > Utility.RandomDouble() );
if ( split )
{
PublicOverheadMessage( MessageType.Regular, 0x3B2, 1010027 + area,
$"{from.Name}\t{(isArrow ? "arrow" : "bolt")}");
}
else
{
PublicOverheadMessage( MessageType.Regular, 0x3B2, 1010035 + area, from.Name );
if ( isArrow )
++Arrows;
else if ( isBolt )
++Bolts;
}
se.Record( split ? splitScore : score );
if ( se.Count == 1 )
PublicOverheadMessage( MessageType.Regular, 0x3B2, 1062719, se.Total.ToString() );
else
PublicOverheadMessage( MessageType.Regular, 0x3B2, 1042683, $"{se.Total}\t{se.Count}");
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( 0 );
writer.Write( MinSkill );
writer.Write( MaxSkill );
writer.Write( Arrows );
writer.Write( Bolts );
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
switch ( version )
{
case 0:
{
MinSkill = reader.ReadDouble();
MaxSkill = reader.ReadDouble();
Arrows = reader.ReadInt();
Bolts = reader.ReadInt();
if ( MinSkill == 0.0 && MaxSkill == 30.0 )
{
MinSkill = -25.0;
MaxSkill = +25.0;
}
break;
}
}
}
}
public class ArcheryButteAddon : BaseAddon
{
public override BaseAddonDeed Deed => new ArcheryButteDeed();
[Constructible]
public ArcheryButteAddon()
{
AddComponent( new ArcheryButte(), 0, 0, 0 );
}
public ArcheryButteAddon( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
public class ArcheryButteDeed : BaseAddonDeed
{
public override BaseAddon Addon => new ArcheryButteAddon();
public override int LabelNumber => 1024106; // archery butte
[Constructible]
public ArcheryButteDeed()
{
}
public ArcheryButteDeed( Serial serial ) : base( serial )
{
}
public override void Serialize( GenericWriter writer )
{
base.Serialize( writer );
writer.Write( 0 ); // version
}
public override void Deserialize( GenericReader reader )
{
base.Deserialize( reader );
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,378 @@
using System;
using System.Collections.Generic;
using Server.Gumps;
using Server.Multis;
using Server.Network;
using Server.Prompts;
namespace Server.Items
{
public class BallotBox : AddonComponent
{
public static readonly int MaxTopicLines = 6;
[Constructible]
public BallotBox() : base(0x9A8)
{
Topic = new string[0];
Yes = new List<Mobile>();
No = new List<Mobile>();
}
public BallotBox(Serial serial) : base(serial)
{
}
public override int LabelNumber => 1041006; // a ballot box
public string[] Topic{ get; private set; }
public List<Mobile> Yes{ get; private set; }
public List<Mobile> No{ get; private set; }
public void ClearTopic()
{
Topic = new string[0];
ClearVotes();
}
public void AddLineToTopic(string line)
{
if (Topic.Length >= MaxTopicLines)
return;
string[] newTopic = new string[Topic.Length + 1];
Topic.CopyTo(newTopic, 0);
newTopic[Topic.Length] = line;
Topic = newTopic;
ClearVotes();
}
public void ClearVotes()
{
Yes.Clear();
No.Clear();
}
public bool IsOwner(Mobile from)
{
if (from.AccessLevel >= AccessLevel.GameMaster)
return true;
BaseHouse house = BaseHouse.FindHouseAt(this);
return house?.IsOwner(from) == true;
}
public bool HasVoted(Mobile from)
{
return Yes.Contains(from) || No.Contains(from);
}
public override bool OnDragDrop(Mobile from, Item dropped)
{
SendLocalizedMessageTo(from, 500369); // I'm a ballot box, not a container!
return false;
}
public override void OnDoubleClick(Mobile from)
{
if (!from.InRange(GetWorldLocation(), 2))
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
}
else
{
bool isOwner = IsOwner(from);
from.SendGump(new InternalGump(this, isOwner));
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
writer.WriteEncodedInt(Topic.Length);
for (int i = 0; i < Topic.Length; i++)
writer.Write(Topic[i]);
writer.Write(Yes, true);
writer.Write(No, true);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
Topic = new string[reader.ReadEncodedInt()];
for (int i = 0; i < Topic.Length; i++)
Topic[i] = reader.ReadString();
Yes = reader.ReadStrongMobileList();
No = reader.ReadStrongMobileList();
}
private class InternalGump : Gump
{
private BallotBox m_Box;
public InternalGump(BallotBox box, bool isOwner) : base(110, 70)
{
m_Box = box;
AddBackground(0, 0, 400, 350, 0xA28);
if (isOwner)
AddHtmlLocalized(0, 15, 400, 35, 1011000); // <center>Ballot Box Owner's Menu</center>
else
AddHtmlLocalized(0, 15, 400, 35, 1011001); // <center>Ballot Box -- Vote Here!</center>
AddHtmlLocalized(0, 50, 400, 35, 1011002); // <center>Topic</center>
int lineCount = box.Topic.Length;
AddBackground(25, 90, 350, Math.Max(20 * lineCount, 20), 0x1400);
for (int i = 0; i < lineCount; i++)
{
string line = box.Topic[i];
if (!string.IsNullOrEmpty(line))
AddLabelCropped(30, 90 + i * 20, 340, 20, 0x3E3, line);
}
int yesCount = box.Yes.Count;
int noCount = box.No.Count;
int totalVotes = yesCount + noCount;
AddHtmlLocalized(0, 215, 400, 35, 1011003); // <center>votes</center>
if (!isOwner)
AddButton(20, 240, 0xFA5, 0xFA7, 3);
AddHtmlLocalized(55, 242, 25, 35, 1011004); // aye:
AddLabel(78, 242, 0x0, $"[{yesCount}]");
if (!isOwner)
AddButton(20, 275, 0xFA5, 0xFA7, 4);
AddHtmlLocalized(55, 277, 25, 35, 1011005); // nay:
AddLabel(78, 277, 0x0, $"[{noCount}]");
if (totalVotes > 0)
{
AddImageTiled(130, 242, yesCount * 225 / totalVotes, 10, 0xD6);
AddImageTiled(130, 277, noCount * 225 / totalVotes, 10, 0xD6);
}
AddButton(45, 305, 0xFA5, 0xFA7, 0);
AddHtmlLocalized(80, 308, 40, 35, 1011008); // done
if (isOwner)
{
AddButton(120, 305, 0xFA5, 0xFA7, 1);
AddHtmlLocalized(155, 308, 100, 35, 1011006); // change topic
AddButton(240, 305, 0xFA5, 0xFA7, 2);
AddHtmlLocalized(275, 308, 300, 100, 1011007); // reset votes
}
}
public override void OnResponse(NetState sender, RelayInfo info)
{
if (m_Box.Deleted || info.ButtonID == 0)
return;
Mobile from = sender.Mobile;
if (from.Map != m_Box.Map || !from.InRange(m_Box.GetWorldLocation(), 2))
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
return;
}
bool isOwner = m_Box.IsOwner(from);
switch (info.ButtonID)
{
case 1: // change topic
{
if (isOwner)
{
m_Box.ClearTopic();
from.SendLocalizedMessage(500370, "",
0x35); // Enter a line of text for your ballot, and hit ENTER. Hit ESC after the last line is entered.
from.Prompt = new TopicPrompt(m_Box);
}
break;
}
case 2: // reset votes
{
if (isOwner)
{
m_Box.ClearVotes();
from.SendLocalizedMessage(500371); // Votes zeroed out.
}
goto default;
}
case 3: // aye
{
if (!isOwner)
{
if (m_Box.HasVoted(from))
{
from.SendLocalizedMessage(500374); // You have already voted on this ballot.
}
else
{
m_Box.Yes.Add(from);
from.SendLocalizedMessage(500373); // Your vote has been registered.
}
}
goto default;
}
case 4: // nay
{
if (!isOwner)
{
if (m_Box.HasVoted(from))
{
from.SendLocalizedMessage(500374); // You have already voted on this ballot.
}
else
{
m_Box.No.Add(from);
from.SendLocalizedMessage(500373); // Your vote has been registered.
}
}
goto default;
}
default:
{
from.SendGump(new InternalGump(m_Box, isOwner));
break;
}
}
}
}
private class TopicPrompt : Prompt
{
private BallotBox m_Box;
public TopicPrompt(BallotBox box)
{
m_Box = box;
}
public override void OnResponse(Mobile from, string text)
{
if (m_Box.Deleted || !m_Box.IsOwner(from))
return;
if (from.Map != m_Box.Map || !from.InRange(m_Box.GetWorldLocation(), 2))
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
return;
}
m_Box.AddLineToTopic(text.TrimEnd());
if (m_Box.Topic.Length < MaxTopicLines)
{
from.SendLocalizedMessage(500377, "", 0x35); // Next line or ESC to finish:
from.Prompt = new TopicPrompt(m_Box);
}
else
{
from.SendLocalizedMessage(500376, "", 0x35); // Ballot entry complete.
from.SendGump(new InternalGump(m_Box, true));
}
}
public override void OnCancel(Mobile from)
{
if (m_Box.Deleted || !m_Box.IsOwner(from))
return;
if (from.Map != m_Box.Map || !from.InRange(m_Box.GetWorldLocation(), 2))
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
return;
}
from.SendLocalizedMessage(500376, "", 0x35); // Ballot entry complete.
from.SendGump(new InternalGump(m_Box, true));
}
}
}
public class BallotBoxAddon : BaseAddon
{
public BallotBoxAddon()
{
AddComponent(new BallotBox(), 0, 0, 0);
}
public BallotBoxAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new BallotBoxDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class BallotBoxDeed : BaseAddonDeed
{
[Constructible]
public BallotBoxDeed()
{
}
public BallotBoxDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new BallotBoxAddon();
public override int LabelNumber => 1044327; // ballot box
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,275 @@
using System.Collections.Generic;
using Server.Multis;
namespace Server.Items
{
public enum AddonFitResult
{
Valid,
Blocked,
NotInHouse,
DoorTooClose,
NoWall,
DoorsNotClosed
}
public interface IAddon
{
Item Deed{ get; }
bool CouldFit(IPoint3D p, Map map);
}
public abstract class BaseAddon : Item, IChopable, IAddon
{
public BaseAddon() : base(1)
{
Movable = false;
Visible = false;
Components = new List<AddonComponent>();
}
public BaseAddon(Serial serial) : base(serial)
{
}
public virtual bool RetainDeedHue => false;
public virtual BaseAddonDeed Deed => null;
public List<AddonComponent> Components{ get; private set; }
public virtual bool ShareHue => true;
[Hue]
[CommandProperty(AccessLevel.GameMaster)]
public override int Hue
{
get => base.Hue;
set
{
if (base.Hue != value)
{
base.Hue = value;
if (!Deleted && ShareHue && Components != null)
foreach (AddonComponent c in Components)
c.Hue = value;
}
}
}
Item IAddon.Deed => Deed;
public bool CouldFit(IPoint3D p, Map map)
{
BaseHouse h = null;
return CouldFit(p, map, null, ref h) == AddonFitResult.Valid;
}
public virtual void OnChop(Mobile from)
{
BaseHouse house = BaseHouse.FindHouseAt(this);
if (house?.IsOwner(from) == true && house.Addons.Contains(this))
{
Effects.PlaySound(GetWorldLocation(), Map, 0x3B3);
from.SendLocalizedMessage(500461); // You destroy the item.
int hue = 0;
if (RetainDeedHue)
for (int i = 0; hue == 0 && i < Components.Count; ++i)
{
AddonComponent c = Components[i];
if (c.Hue != 0)
hue = c.Hue;
}
Delete();
house.Addons.Remove(this);
BaseAddonDeed deed = Deed;
if (deed != null)
{
if (RetainDeedHue)
deed.Hue = hue;
from.AddToBackpack(deed);
}
}
}
public void AddComponent(AddonComponent c, int x, int y, int z)
{
if (Deleted)
return;
Components.Add(c);
c.Addon = this;
c.Offset = new Point3D(x, y, z);
c.MoveToWorld(new Point3D(X + x, Y + y, Z + z), Map);
}
public virtual AddonFitResult CouldFit(IPoint3D p, Map map, Mobile from, ref BaseHouse house)
{
if (Deleted)
return AddonFitResult.Blocked;
foreach (AddonComponent c in Components)
{
Point3D p3D = new Point3D(p.X + c.Offset.X, p.Y + c.Offset.Y, p.Z + c.Offset.Z);
if (!map.CanFit(p3D.X, p3D.Y, p3D.Z, c.ItemData.Height, false, true, c.Z == 0))
return AddonFitResult.Blocked;
if (!CheckHouse(from, p3D, map, c.ItemData.Height, ref house))
return AddonFitResult.NotInHouse;
if (c.NeedsWall)
{
Point3D wall = c.WallPosition;
if (!IsWall(p3D.X + wall.X, p3D.Y + wall.Y, p3D.Z + wall.Z, map))
return AddonFitResult.NoWall;
}
}
List<BaseDoor> doors = house.Doors;
for (int i = 0; i < doors.Count; ++i)
{
BaseDoor door = doors[i];
Point3D doorLoc = door.GetWorldLocation();
int doorHeight = door.ItemData.CalcHeight;
foreach (AddonComponent c in Components)
{
Point3D addonLoc = new Point3D(p.X + c.Offset.X, p.Y + c.Offset.Y, p.Z + c.Offset.Z);
int addonHeight = c.ItemData.CalcHeight;
if (Utility.InRange(doorLoc, addonLoc, 1) &&
(addonLoc.Z == doorLoc.Z ||
addonLoc.Z + addonHeight > doorLoc.Z && doorLoc.Z + doorHeight > addonLoc.Z))
return AddonFitResult.DoorTooClose;
}
}
return AddonFitResult.Valid;
}
public static bool CheckHouse(Mobile from, Point3D p, Map map, int height, ref BaseHouse house)
{
return from == null || BaseHouse.FindHouseAt(p, map, height)?.IsOwner(from) == true;
}
public static bool IsWall(int x, int y, int z, Map map)
{
if (map == null)
return false;
StaticTile[] tiles = map.Tiles.GetStaticTiles(x, y, true);
for (int i = 0; i < tiles.Length; ++i)
{
StaticTile t = tiles[i];
ItemData id = TileData.ItemTable[t.ID & TileData.MaxItemValue];
if ((id.Flags & TileFlag.Wall) != 0 && z + 16 > t.Z && t.Z + t.Height > z)
return true;
}
return false;
}
public virtual void OnComponentLoaded(AddonComponent c)
{
}
public virtual void OnComponentUsed(AddonComponent c, Mobile from)
{
}
public override void OnLocationChange(Point3D oldLoc)
{
if (Deleted)
return;
foreach (AddonComponent c in Components)
c.Location = new Point3D(X + c.Offset.X, Y + c.Offset.Y, Z + c.Offset.Z);
}
public override void OnMapChange()
{
if (Deleted)
return;
foreach (AddonComponent c in Components)
c.Map = Map;
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
foreach (AddonComponent c in Components)
c.Delete();
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.WriteItemList(Components);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
case 0:
{
Components = reader.ReadStrongItemList<AddonComponent>();
break;
}
}
if (version < 1 && Weight == 0)
Weight = -1;
}
#region Mondain's Legacy
private CraftResource m_Resource;
[CommandProperty(AccessLevel.GameMaster)]
public CraftResource Resource
{
get => m_Resource;
set
{
if (m_Resource != value)
{
m_Resource = value;
Hue = CraftResources.GetHue(m_Resource);
InvalidateProperties();
}
}
}
#endregion
}
}

View file

@ -0,0 +1,296 @@
using System.Collections.Generic;
using Server.Multis;
namespace Server.Items
{
public abstract class BaseAddonContainer : BaseContainer, IChopable, IAddon
{
private CraftResource m_Resource;
public BaseAddonContainer(int itemID) : base(itemID)
{
AddonComponent.ApplyLightTo(this);
Components = new List<AddonContainerComponent>();
}
public BaseAddonContainer(Serial serial) : base(serial)
{
}
public override bool DisplayWeight => false;
[Hue]
[CommandProperty(AccessLevel.GameMaster)]
public override int Hue
{
get => base.Hue;
set
{
if (base.Hue != value)
{
base.Hue = value;
if (!Deleted && ShareHue && Components != null)
{
Hue = value;
foreach (AddonContainerComponent c in Components)
c.Hue = value;
}
}
}
}
[CommandProperty(AccessLevel.GameMaster)]
public CraftResource Resource
{
get => m_Resource;
set
{
if (m_Resource != value)
{
m_Resource = value;
Hue = CraftResources.GetHue(m_Resource);
InvalidateProperties();
}
}
}
public virtual bool RetainDeedHue => false;
public virtual bool NeedsWall => false;
public virtual bool ShareHue => true;
public virtual Point3D WallPosition => Point3D.Zero;
public virtual BaseAddonContainerDeed Deed => null;
public List<AddonContainerComponent> Components{ get; private set; }
Item IAddon.Deed => Deed;
public bool CouldFit(IPoint3D p, Map map)
{
BaseHouse house = null;
return CouldFit(p, map, null, ref house) == AddonFitResult.Valid;
}
public virtual void OnChop(Mobile from)
{
BaseHouse house = BaseHouse.FindHouseAt(this);
if (house?.IsOwner(from) == true)
{
if (!IsSecure)
{
Effects.PlaySound(GetWorldLocation(), Map, 0x3B3);
from.SendLocalizedMessage(500461); // You destroy the item.
int hue = 0;
if (RetainDeedHue)
for (int i = 0; hue == 0 && i < Components.Count; ++i)
{
AddonContainerComponent c = Components[i];
if (c.Hue != 0)
hue = c.Hue;
}
DropItemsToGround();
Delete();
house.Addons.Remove(this);
BaseAddonContainerDeed deed = Deed;
if (deed != null)
{
deed.Resource = Resource;
if (RetainDeedHue)
deed.Hue = hue;
from.AddToBackpack(deed);
}
}
else
{
from.SendLocalizedMessage(1074870); // This item must be unlocked/unsecured before re-deeding it.
}
}
}
public override void OnLocationChange(Point3D oldLoc)
{
base.OnLocationChange(oldLoc);
if (Deleted)
return;
foreach (AddonContainerComponent c in Components)
c.Location = new Point3D(X + c.Offset.X, Y + c.Offset.Y, Z + c.Offset.Z);
}
public override void OnMapChange()
{
base.OnMapChange();
if (Deleted)
return;
foreach (AddonContainerComponent c in Components)
c.Map = Map;
}
public override void OnDelete()
{
BaseHouse house = BaseHouse.FindHouseAt(this);
house?.Addons.Remove(this);
base.OnDelete();
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (!CraftResources.IsStandard(m_Resource))
list.Add(CraftResources.GetLocalizationNumber(m_Resource));
}
public override void OnAfterDelete()
{
base.OnAfterDelete();
foreach (AddonContainerComponent c in Components)
c.Delete();
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.WriteItemList(Components);
writer.Write((int)m_Resource);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
Components = reader.ReadStrongItemList<AddonContainerComponent>();
m_Resource = (CraftResource)reader.ReadInt();
AddonComponent.ApplyLightTo(this);
}
public virtual void DropItemsToGround()
{
for (int i = Items.Count - 1; i >= 0; i--)
Items[i].MoveToWorld(Location);
}
public void AddComponent(AddonContainerComponent c, int x, int y, int z)
{
if (Deleted)
return;
Components.Add(c);
c.Addon = this;
c.Offset = new Point3D(x, y, z);
c.MoveToWorld(new Point3D(X + x, Y + y, Z + z), Map);
}
public AddonFitResult CouldFit(IPoint3D p, Map map, Mobile from, ref BaseHouse house)
{
if (Deleted)
return AddonFitResult.Blocked;
foreach (AddonContainerComponent c in Components)
{
Point3D p3D = new Point3D(p.X + c.Offset.X, p.Y + c.Offset.Y, p.Z + c.Offset.Z);
if (!map.CanFit(p3D.X, p3D.Y, p3D.Z, c.ItemData.Height, false, true, c.Z == 0))
return AddonFitResult.Blocked;
if (!BaseAddon.CheckHouse(from, p3D, map, c.ItemData.Height, ref house))
return AddonFitResult.NotInHouse;
if (c.NeedsWall)
{
Point3D wall = c.WallPosition;
if (!BaseAddon.IsWall(p3D.X + wall.X, p3D.Y + wall.Y, p3D.Z + wall.Z, map))
return AddonFitResult.NoWall;
}
}
Point3D p3 = new Point3D(p.X, p.Y, p.Z);
if (!map.CanFit(p3.X, p3.Y, p3.Z, ItemData.Height, false, true, Z == 0))
return AddonFitResult.Blocked;
if (!BaseAddon.CheckHouse(from, p3, map, ItemData.Height, ref house))
return AddonFitResult.NotInHouse;
if (NeedsWall)
{
Point3D wall = WallPosition;
if (!BaseAddon.IsWall(p3.X + wall.X, p3.Y + wall.Y, p3.Z + wall.Z, map))
return AddonFitResult.NoWall;
}
if (house != null)
{
List<BaseDoor> doors = house.Doors;
for (int i = 0; i < doors.Count; ++i)
{
BaseDoor door = doors[i];
if (door?.Open == true)
return AddonFitResult.DoorsNotClosed;
Point3D doorLoc = door.GetWorldLocation();
int doorHeight = door.ItemData.CalcHeight;
int addonHeight;
foreach (AddonContainerComponent c in Components)
{
Point3D addonLoc = new Point3D(p.X + c.Offset.X, p.Y + c.Offset.Y, p.Z + c.Offset.Z);
addonHeight = c.ItemData.CalcHeight;
if (Utility.InRange(doorLoc, addonLoc, 1) &&
(addonLoc.Z == doorLoc.Z ||
addonLoc.Z + addonHeight > doorLoc.Z && doorLoc.Z + doorHeight > addonLoc.Z))
return AddonFitResult.DoorTooClose;
}
Point3D addonLo = new Point3D(p.X, p.Y, p.Z);
addonHeight = ItemData.CalcHeight;
if (Utility.InRange(doorLoc, addonLo, 1) &&
(addonLo.Z == doorLoc.Z || addonLo.Z + addonHeight > doorLoc.Z && doorLoc.Z + doorHeight > addonLo.Z))
return AddonFitResult.DoorTooClose;
}
}
return AddonFitResult.Valid;
}
public virtual void OnComponentLoaded(AddonContainerComponent c)
{
}
public virtual void OnComponentUsed(AddonContainerComponent c, Mobile from)
{
}
}
}

View file

@ -0,0 +1,167 @@
using System;
using Server.Engines.Craft;
using Server.Multis;
using Server.Spells;
using Server.Targeting;
namespace Server.Items
{
[Flippable(0x14F0, 0x14EF)]
public abstract class BaseAddonContainerDeed : Item, ICraftable
{
private CraftResource m_Resource;
public BaseAddonContainerDeed() : base(0x14F0)
{
Weight = 1.0;
if (!Core.AOS)
LootType = LootType.Newbied;
}
public BaseAddonContainerDeed(Serial serial) : base(serial)
{
}
public abstract BaseAddonContainer Addon{ get; }
[CommandProperty(AccessLevel.GameMaster)]
public CraftResource Resource
{
get => m_Resource;
set
{
if (m_Resource != value)
{
m_Resource = value;
Hue = CraftResources.GetHue(m_Resource);
InvalidateProperties();
}
}
}
#region ICraftable
public virtual int OnCraft(int quality, bool makersMark, Mobile from, CraftSystem craftSystem, Type typeRes,
BaseTool tool, CraftItem craftItem, int resHue)
{
Type resourceType = typeRes;
if (resourceType == null)
resourceType = craftItem.Resources.GetAt(0).ItemType;
Resource = CraftResources.GetFromType(resourceType);
CraftContext context = craftSystem.GetContext(from);
if (context?.DoNotColor == true)
Hue = 0;
return quality;
}
#endregion
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
// version 1
writer.Write((int)m_Resource);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
m_Resource = (CraftResource)reader.ReadInt();
break;
}
}
public override void OnDoubleClick(Mobile from)
{
if (IsChildOf(from.Backpack))
from.Target = new InternalTarget(this);
else
from.SendLocalizedMessage(1062334); // This item must be in your backpack to be used.
}
public override void GetProperties(ObjectPropertyList list)
{
base.GetProperties(list);
if (!CraftResources.IsStandard(m_Resource))
list.Add(CraftResources.GetLocalizationNumber(m_Resource));
}
private class InternalTarget : Target
{
private BaseAddonContainerDeed m_Deed;
public InternalTarget(BaseAddonContainerDeed deed) : base(-1, true, TargetFlags.None)
{
m_Deed = deed;
CheckLOS = false;
}
protected override void OnTarget(Mobile from, object targeted)
{
IPoint3D p = targeted as IPoint3D;
Map map = from.Map;
if (p == null || map == null || m_Deed.Deleted)
return;
if (m_Deed.IsChildOf(from.Backpack))
{
BaseAddonContainer addon = m_Deed.Addon;
addon.Resource = m_Deed.Resource;
SpellHelper.GetSurfaceTop(ref p);
BaseHouse house = null;
AddonFitResult res = addon.CouldFit(p, map, from, ref house);
if (res == AddonFitResult.Valid)
addon.MoveToWorld(new Point3D(p), map);
else if (res == AddonFitResult.Blocked)
from.SendLocalizedMessage(500269); // You cannot build that there.
else if (res == AddonFitResult.NotInHouse)
from.SendLocalizedMessage(500274); // You can only place this in a house that you own!
else if (res == AddonFitResult.DoorsNotClosed)
from.SendMessage("You must close all house doors before placing this.");
else if (res == AddonFitResult.DoorTooClose)
from.SendLocalizedMessage(500271); // You cannot build near the door.
else if (res == AddonFitResult.NoWall)
from.SendLocalizedMessage(500268); // This object needs to be mounted on something.
if (res == AddonFitResult.Valid)
{
m_Deed.Delete();
house.Addons.Add(addon);
house.AddSecure(from, addon);
}
else
{
addon.Delete();
}
}
else
{
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
}
}
}
}
}

View file

@ -0,0 +1,128 @@
using Server.Multis;
using Server.Spells;
using Server.Targeting;
namespace Server.Items
{
[Flippable(0x14F0, 0x14EF)]
public abstract class BaseAddonDeed : Item
{
public BaseAddonDeed() : base(0x14F0)
{
Weight = 1.0;
if (!Core.AOS)
LootType = LootType.Newbied;
}
public BaseAddonDeed(Serial serial) : base(serial)
{
}
public abstract BaseAddon Addon{ get; }
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
if (Weight == 0.0)
Weight = 1.0;
}
public override void OnDoubleClick(Mobile from)
{
if (IsChildOf(from.Backpack))
from.Target = new InternalTarget(this);
else
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
}
private class InternalTarget : Target
{
private BaseAddonDeed m_Deed;
public InternalTarget(BaseAddonDeed deed) : base(-1, true, TargetFlags.None)
{
m_Deed = deed;
CheckLOS = false;
}
protected override void OnTarget(Mobile from, object targeted)
{
IPoint3D p = targeted as IPoint3D;
Map map = from.Map;
if (p == null || map == null || m_Deed.Deleted)
return;
if (m_Deed.IsChildOf(from.Backpack))
{
BaseAddon addon = m_Deed.Addon;
SpellHelper.GetSurfaceTop(ref p);
BaseHouse house = null;
AddonFitResult res = addon.CouldFit(p, map, from, ref house);
if (res == AddonFitResult.Valid)
addon.MoveToWorld(new Point3D(p), map);
else if (res == AddonFitResult.Blocked)
from.SendLocalizedMessage(500269); // You cannot build that there.
else if (res == AddonFitResult.NotInHouse)
from.SendLocalizedMessage(500274); // You can only place this in a house that you own!
else if (res == AddonFitResult.DoorTooClose)
from.SendLocalizedMessage(500271); // You cannot build near the door.
else if (res == AddonFitResult.NoWall)
from.SendLocalizedMessage(500268); // This object needs to be mounted on something.
if (res == AddonFitResult.Valid)
{
m_Deed.Delete();
house.Addons.Add(addon);
}
else
{
addon.Delete();
}
}
else
{
from.SendLocalizedMessage(1042001); // That must be in your pack for you to use it.
}
}
}
#region Mondain's Legacy
private CraftResource m_Resource;
[CommandProperty(AccessLevel.GameMaster)]
public CraftResource Resource
{
get => m_Resource;
set
{
if (m_Resource != value)
{
m_Resource = value;
Hue = CraftResources.GetHue(m_Resource);
InvalidateProperties();
}
}
}
#endregion
}
}

View file

@ -0,0 +1,266 @@
namespace Server.Items
{
public class BrownBearRugEastAddon : BaseAddon
{
[Constructible]
public BrownBearRugEastAddon()
{
AddComponent(new AddonComponent(0x1E40), 1, 1, 0);
AddComponent(new AddonComponent(0x1E41), 1, 0, 0);
AddComponent(new AddonComponent(0x1E42), 1, -1, 0);
AddComponent(new AddonComponent(0x1E43), 0, -1, 0);
AddComponent(new AddonComponent(0x1E44), 0, 0, 0);
AddComponent(new AddonComponent(0x1E45), 0, 1, 0);
AddComponent(new AddonComponent(0x1E46), -1, 1, 0);
AddComponent(new AddonComponent(0x1E47), -1, 0, 0);
AddComponent(new AddonComponent(0x1E48), -1, -1, 0);
}
public BrownBearRugEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new BrownBearRugEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BrownBearRugEastDeed : BaseAddonDeed
{
[Constructible]
public BrownBearRugEastDeed()
{
}
public BrownBearRugEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new BrownBearRugEastAddon();
public override int LabelNumber => 1049397; // a brown bear rug deed facing east
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BrownBearRugSouthAddon : BaseAddon
{
[Constructible]
public BrownBearRugSouthAddon()
{
AddComponent(new AddonComponent(0x1E36), 1, 1, 0);
AddComponent(new AddonComponent(0x1E37), 0, 1, 0);
AddComponent(new AddonComponent(0x1E38), -1, 1, 0);
AddComponent(new AddonComponent(0x1E39), -1, 0, 0);
AddComponent(new AddonComponent(0x1E3A), 0, 0, 0);
AddComponent(new AddonComponent(0x1E3B), 1, 0, 0);
AddComponent(new AddonComponent(0x1E3C), 1, -1, 0);
AddComponent(new AddonComponent(0x1E3D), 0, -1, 0);
AddComponent(new AddonComponent(0x1E3E), -1, -1, 0);
}
public BrownBearRugSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new BrownBearRugSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BrownBearRugSouthDeed : BaseAddonDeed
{
[Constructible]
public BrownBearRugSouthDeed()
{
}
public BrownBearRugSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new BrownBearRugSouthAddon();
public override int LabelNumber => 1049398; // a brown bear rug deed facing south
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class PolarBearRugEastAddon : BaseAddon
{
[Constructible]
public PolarBearRugEastAddon()
{
AddComponent(new AddonComponent(0x1E53), 1, 1, 0);
AddComponent(new AddonComponent(0x1E54), 1, 0, 0);
AddComponent(new AddonComponent(0x1E55), 1, -1, 0);
AddComponent(new AddonComponent(0x1E56), 0, -1, 0);
AddComponent(new AddonComponent(0x1E57), 0, 0, 0);
AddComponent(new AddonComponent(0x1E58), 0, 1, 0);
AddComponent(new AddonComponent(0x1E59), -1, 1, 0);
AddComponent(new AddonComponent(0x1E5A), -1, 0, 0);
AddComponent(new AddonComponent(0x1E5B), -1, -1, 0);
}
public PolarBearRugEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new PolarBearRugEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class PolarBearRugEastDeed : BaseAddonDeed
{
[Constructible]
public PolarBearRugEastDeed()
{
}
public PolarBearRugEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new PolarBearRugEastAddon();
public override int LabelNumber => 1049399; // a polar bear rug deed facing east
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class PolarBearRugSouthAddon : BaseAddon
{
[Constructible]
public PolarBearRugSouthAddon()
{
AddComponent(new AddonComponent(0x1E49), 1, 1, 0);
AddComponent(new AddonComponent(0x1E4A), 0, 1, 0);
AddComponent(new AddonComponent(0x1E4B), -1, 1, 0);
AddComponent(new AddonComponent(0x1E4C), -1, 0, 0);
AddComponent(new AddonComponent(0x1E4D), 0, 0, 0);
AddComponent(new AddonComponent(0x1E4E), 1, 0, 0);
AddComponent(new AddonComponent(0x1E4F), 1, -1, 0);
AddComponent(new AddonComponent(0x1E50), 0, -1, 0);
AddComponent(new AddonComponent(0x1E51), -1, -1, 0);
}
public PolarBearRugSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new PolarBearRugSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class PolarBearRugSouthDeed : BaseAddonDeed
{
[Constructible]
public PolarBearRugSouthDeed()
{
}
public PolarBearRugSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new PolarBearRugSouthAddon();
public override int LabelNumber => 1049400; // a polar bear rug deed facing south
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,67 @@
namespace Server.Items
{
public class BloodPentagram : BaseAddon
{
[Constructible]
public BloodPentagram()
{
AddComponent(new AddonComponent(0x1CF9), 0, 1, 0);
AddComponent(new AddonComponent(0x1CF8), 0, 2, 0);
AddComponent(new AddonComponent(0x1CF7), 0, 3, 0);
AddComponent(new AddonComponent(0x1CF6), 0, 4, 0);
AddComponent(new AddonComponent(0x1CF5), 0, 5, 0);
AddComponent(new AddonComponent(0x1CFB), 1, 0, 0);
AddComponent(new AddonComponent(0x1CFA), 1, 1, 0);
AddComponent(new AddonComponent(0x1D09), 1, 2, 0);
AddComponent(new AddonComponent(0x1D08), 1, 3, 0);
AddComponent(new AddonComponent(0x1D07), 1, 4, 0);
AddComponent(new AddonComponent(0x1CF4), 1, 5, 0);
AddComponent(new AddonComponent(0x1CFC), 2, 0, 0);
AddComponent(new AddonComponent(0x1D0A), 2, 1, 0);
AddComponent(new AddonComponent(0x1D11), 2, 2, 0);
AddComponent(new AddonComponent(0x1D10), 2, 3, 0);
AddComponent(new AddonComponent(0x1D06), 2, 4, 0);
AddComponent(new AddonComponent(0x1CF3), 2, 5, 0);
AddComponent(new AddonComponent(0x1CFD), 3, 0, 0);
AddComponent(new AddonComponent(0x1D0B), 3, 1, 0);
AddComponent(new AddonComponent(0x1D12), 3, 2, 0);
AddComponent(new AddonComponent(0x1D0F), 3, 3, 0);
AddComponent(new AddonComponent(0x1D05), 3, 4, 0);
AddComponent(new AddonComponent(0x1CF2), 3, 5, 0);
AddComponent(new AddonComponent(0x1CFE), 4, 0, 0);
AddComponent(new AddonComponent(0x1D0C), 4, 1, 0);
AddComponent(new AddonComponent(0x1D0D), 4, 2, 0);
AddComponent(new AddonComponent(0x1D0E), 4, 3, 0);
AddComponent(new AddonComponent(0x1D04), 4, 4, 0);
AddComponent(new AddonComponent(0x1CF1), 4, 5, 0);
AddComponent(new AddonComponent(0x1CFF), 5, 0, 0);
AddComponent(new AddonComponent(0x1D00), 5, 1, 0);
AddComponent(new AddonComponent(0x1D01), 5, 2, 0);
AddComponent(new AddonComponent(0x1D02), 5, 3, 0);
AddComponent(new AddonComponent(0x1D03), 5, 4, 0);
}
public BloodPentagram(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,209 @@
using Server.Network;
namespace Server.Items
{
public class DartBoard : AddonComponent
{
[Constructible]
public DartBoard(bool east = true) : base(east ? 0x1E2F : 0x1E2E)
{
}
public DartBoard(Serial serial) : base(serial)
{
}
public override bool NeedsWall => true;
public override Point3D WallPosition => East ? new Point3D(-1, 0, 0) : new Point3D(0, -1, 0);
public bool East => ItemID == 0x1E2F;
public override void OnDoubleClick(Mobile from)
{
Direction dir;
if (from.Location != Location)
dir = from.GetDirectionTo(this);
else if (East)
dir = Direction.West;
else
dir = Direction.North;
from.Direction = dir;
bool canThrow;
if (!from.InRange(this, 4) || !from.InLOS(this))
canThrow = false;
else if (East)
canThrow = dir == Direction.Left || dir == Direction.West || dir == Direction.Up;
else
canThrow = dir == Direction.Up || dir == Direction.North || dir == Direction.Right;
if (canThrow)
Throw(from);
else
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
}
public void Throw(Mobile from)
{
if (!(from.Weapon is BaseKnife knife))
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 500751); // Try holding a knife...
return;
}
from.Animate(from.Mounted ? 26 : 9, 7, 1, true, false, 0);
from.MovingEffect(this, knife.ItemID, 7, 1, false, false);
from.PlaySound(0x238);
double rand = Utility.RandomDouble();
int message;
if (rand < 0.05)
message = 500752; // BULLSEYE! 50 Points!
else if (rand < 0.20)
message = 500753; // Just missed the center! 20 points.
else if (rand < 0.45)
message = 500754; // 10 point shot.
else if (rand < 0.70)
message = 500755; // 5 pointer.
else if (rand < 0.85)
message = 500756; // 1 point. Bad throw.
else
message = 500757; // Missed.
PublicOverheadMessage(MessageType.Regular, 0x3B2, message);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class DartBoardEastAddon : BaseAddon
{
public DartBoardEastAddon()
{
AddComponent(new DartBoard(), 0, 0, 0);
}
public DartBoardEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new DartBoardEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class DartBoardEastDeed : BaseAddonDeed
{
[Constructible]
public DartBoardEastDeed()
{
}
public DartBoardEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new DartBoardEastAddon();
public override int LabelNumber => 1044326; // dartboard (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class DartBoardSouthAddon : BaseAddon
{
public DartBoardSouthAddon()
{
AddComponent(new DartBoard(false), 0, 0, 0);
}
public DartBoardSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new DartBoardSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class DartBoardSouthDeed : BaseAddonDeed
{
[Constructible]
public DartBoardSouthDeed()
{
}
public DartBoardSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new DartBoardSouthAddon();
public override int LabelNumber => 1044325; // dartboard (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class ElvenBedEastAddon : BaseAddon
{
[Constructible]
public ElvenBedEastAddon()
{
AddComponent(new AddonComponent(0x304D), 0, 0, 0);
AddComponent(new AddonComponent(0x304C), 1, 0, 0);
}
public ElvenBedEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenBedEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ElvenBedEastDeed : BaseAddonDeed
{
[Constructible]
public ElvenBedEastDeed()
{
}
public ElvenBedEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenBedEastAddon();
public override int LabelNumber => 1072861; // elven bed (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class ElvenBedSouthAddon : BaseAddon
{
[Constructible]
public ElvenBedSouthAddon()
{
AddComponent(new AddonComponent(0x3050), 0, 0, 0);
AddComponent(new AddonComponent(0x3051), 0, -1, 0);
}
public ElvenBedSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenBedSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ElvenBedSouthDeed : BaseAddonDeed
{
[Constructible]
public ElvenBedSouthDeed()
{
}
public ElvenBedSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenBedSouthAddon();
public override int LabelNumber => 1072860; // elven bed (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class ElvenDresserEastAddon : BaseAddon
{
[Constructible]
public ElvenDresserEastAddon()
{
AddComponent(new AddonComponent(0x30E4), 0, 0, 0);
AddComponent(new AddonComponent(0x30E3), 0, -1, 0);
}
public ElvenDresserEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenDresserEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ElvenDresserEastDeed : BaseAddonDeed
{
[Constructible]
public ElvenDresserEastDeed()
{
}
public ElvenDresserEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenDresserEastAddon();
public override int LabelNumber => 1073388; // elven dresser (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class ElvenDresserSouthAddon : BaseAddon
{
[Constructible]
public ElvenDresserSouthAddon()
{
AddComponent(new AddonComponent(0x30E5), 0, 0, 0);
AddComponent(new AddonComponent(0x30E6), 1, 0, 0);
}
public ElvenDresserSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenDresserSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ElvenDresserSouthDeed : BaseAddonDeed
{
[Constructible]
public ElvenDresserSouthDeed()
{
}
public ElvenDresserSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenDresserSouthAddon();
public override int LabelNumber => 1072864; // elven dresser (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class ElvenForgeAddon : BaseAddon
{
[Constructible]
public ElvenForgeAddon()
{
AddComponent(new AddonComponent(0x2DD8), 0, 0, 0);
}
public ElvenForgeAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenForgeDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ElvenForgeDeed : BaseAddonDeed
{
[Constructible]
public ElvenForgeDeed()
{
}
public ElvenForgeDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenForgeAddon();
public override int LabelNumber => 1072875; // squirrel statue (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class ElvenLoveseatEastAddon : BaseAddon
{
[Constructible]
public ElvenLoveseatEastAddon()
{
AddComponent(new AddonComponent(0x3089), 0, 0, 0);
AddComponent(new AddonComponent(0x3088), 1, 0, 0);
}
public ElvenLoveseatEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenLoveseatEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ElvenLoveseatEastDeed : BaseAddonDeed
{
[Constructible]
public ElvenLoveseatEastDeed()
{
}
public ElvenLoveseatEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenLoveseatEastAddon();
public override int LabelNumber => 1073372; // elven loveseat (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class ElvenLoveseatSouthAddon : BaseAddon
{
[Constructible]
public ElvenLoveseatSouthAddon()
{
AddComponent(new AddonComponent(0x308A), 0, 0, 0);
AddComponent(new AddonComponent(0x308B), 0, -1, 0);
}
public ElvenLoveseatSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenLoveseatSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ElvenLoveseatSouthDeed : BaseAddonDeed
{
[Constructible]
public ElvenLoveseatSouthDeed()
{
}
public ElvenLoveseatSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenLoveseatSouthAddon();
public override int LabelNumber => 1072867; // elven loveseat (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,137 @@
using System;
namespace Server.Items
{
public class ElvenSpinningwheelEastAddon : BaseAddon, ISpinningWheel
{
private Timer m_Timer;
[Constructible]
public ElvenSpinningwheelEastAddon()
{
AddComponent(new AddonComponent(0x2DD9), 0, 0, 0);
}
public ElvenSpinningwheelEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenSpinningwheelEastDeed();
public bool Spinning => m_Timer != null;
public void BeginSpin(SpinCallback callback, Mobile from, int hue)
{
m_Timer = new SpinTimer(this, callback, from, hue);
m_Timer.Start();
foreach (AddonComponent c in Components)
switch (c.ItemID)
{
case 0x2DD9:
case 0x101C:
case 0x10A4:
++c.ItemID;
break;
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
public override void OnComponentLoaded(AddonComponent c)
{
switch (c.ItemID)
{
case 0x2E3D:
case 0x101D:
case 0x10A5:
--c.ItemID;
break;
}
}
public void EndSpin(SpinCallback callback, Mobile from, int hue)
{
m_Timer?.Stop();
m_Timer = null;
foreach (AddonComponent c in Components)
switch (c.ItemID)
{
case 0x1016:
case 0x101A:
case 0x101D:
case 0x10A5:
--c.ItemID;
break;
}
callback?.Invoke(this, from, hue);
}
private class SpinTimer : Timer
{
private SpinCallback m_Callback;
private Mobile m_From;
private int m_Hue;
private ElvenSpinningwheelEastAddon m_Wheel;
public SpinTimer(ElvenSpinningwheelEastAddon wheel, SpinCallback callback, Mobile from, int hue) : base(
TimeSpan.FromSeconds(3.0))
{
m_Wheel = wheel;
m_Callback = callback;
m_From = from;
m_Hue = hue;
Priority = TimerPriority.TwoFiftyMS;
}
protected override void OnTick()
{
m_Wheel.EndSpin(m_Callback, m_From, m_Hue);
}
}
}
public class ElvenSpinningwheelEastDeed : BaseAddonDeed
{
[Constructible]
public ElvenSpinningwheelEastDeed()
{
}
public ElvenSpinningwheelEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenSpinningwheelEastAddon();
public override int LabelNumber => 1073393; // elven spinning wheel (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,139 @@
using System;
namespace Server.Items
{
public class ElvenSpinningwheelSouthAddon : BaseAddon, ISpinningWheel
{
private Timer m_Timer;
[Constructible]
public ElvenSpinningwheelSouthAddon()
{
AddComponent(new AddonComponent(0x2DDA), 0, 0, 0);
}
public ElvenSpinningwheelSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenSpinningwheelSouthDeed();
public bool Spinning => m_Timer != null;
public void BeginSpin(SpinCallback callback, Mobile from, int hue)
{
m_Timer = new SpinTimer(this, callback, from, hue);
m_Timer.Start();
foreach (AddonComponent c in Components)
switch (c.ItemID)
{
case 0x1015:
case 0x1019:
case 0x101C:
case 0x10A4:
++c.ItemID;
break;
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
public override void OnComponentLoaded(AddonComponent c)
{
switch (c.ItemID)
{
case 0x1016:
case 0x101A:
case 0x101D:
case 0x10A5:
--c.ItemID;
break;
}
}
public void EndSpin(SpinCallback callback, Mobile from, int hue)
{
m_Timer?.Stop();
m_Timer = null;
foreach (AddonComponent c in Components)
switch (c.ItemID)
{
case 0x1016:
case 0x101A:
case 0x101D:
case 0x10A5:
--c.ItemID;
break;
}
callback?.Invoke(this, from, hue);
}
private class SpinTimer : Timer
{
private SpinCallback m_Callback;
private Mobile m_From;
private int m_Hue;
private ElvenSpinningwheelSouthAddon m_Wheel;
public SpinTimer(ElvenSpinningwheelSouthAddon wheel, SpinCallback callback, Mobile from, int hue) : base(
TimeSpan.FromSeconds(3.0))
{
m_Wheel = wheel;
m_Callback = callback;
m_From = from;
m_Hue = hue;
Priority = TimerPriority.TwoFiftyMS;
}
protected override void OnTick()
{
m_Wheel.EndSpin(m_Callback, m_From, m_Hue);
}
}
}
public class ElvenSpinningwheelSouthDeed : BaseAddonDeed
{
[Constructible]
public ElvenSpinningwheelSouthDeed()
{
}
public ElvenSpinningwheelSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenSpinningwheelSouthAddon();
public override int LabelNumber => 1072878; // spinning wheel (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class ElvenStoveEastAddon : BaseAddon
{
[Constructible]
public ElvenStoveEastAddon()
{
AddComponent(new AddonComponent(0x2DDB), 0, 0, 0);
}
public ElvenStoveEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenStoveEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ElvenStoveEastDeed : BaseAddonDeed
{
[Constructible]
public ElvenStoveEastDeed()
{
}
public ElvenStoveEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenStoveEastAddon();
public override int LabelNumber => 1073395; // elven oven (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class ElvenStoveSouthAddon : BaseAddon
{
[Constructible]
public ElvenStoveSouthAddon()
{
AddComponent(new AddonComponent(0x2DDC), 0, 0, 0);
}
public ElvenStoveSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenStoveSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ElvenStoveSouthDeed : BaseAddonDeed
{
[Constructible]
public ElvenStoveSouthDeed()
{
}
public ElvenStoveSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenStoveSouthAddon();
public override int LabelNumber => 1073394; // elven oven (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class ElvenWashBasinEastAddon : BaseAddon
{
[Constructible]
public ElvenWashBasinEastAddon()
{
AddComponent(new AddonComponent(0x30DF), 0, 0, 0);
AddComponent(new AddonComponent(0x30E0), 0, 1, 0);
}
public ElvenWashBasinEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenWashBasinEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ElvenWashBasinEastDeed : BaseAddonDeed
{
[Constructible]
public ElvenWashBasinEastDeed()
{
}
public ElvenWashBasinEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenWashBasinEastAddon();
public override int LabelNumber => 1073387; // elven wash basin (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class ElvenWashBasinSouthAddon : BaseAddon
{
[Constructible]
public ElvenWashBasinSouthAddon()
{
AddComponent(new AddonComponent(0x30E1), 0, 0, 0);
AddComponent(new AddonComponent(0x30E2), 1, 0, 0);
}
public ElvenWashBasinSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ElvenWashBasinSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ElvenWashBasinSouthDeed : BaseAddonDeed
{
[Constructible]
public ElvenWashBasinSouthDeed()
{
}
public ElvenWashBasinSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ElvenWashBasinSouthAddon();
public override int LabelNumber => 1072865; // elven wash basin (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,62 @@
namespace Server.Items
{
public class FancyElvenTableEastAddon : BaseAddon
{
[Constructible]
public FancyElvenTableEastAddon()
{
AddComponent(new AddonComponent(0x3094), -1, 0, 0);
AddComponent(new AddonComponent(0x3093), 0, 0, 0);
AddComponent(new AddonComponent(0x3092), 1, 0, 0);
}
public FancyElvenTableEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new FancyElvenTableEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class FancyElvenTableEastDeed : BaseAddonDeed
{
[Constructible]
public FancyElvenTableEastDeed()
{
}
public FancyElvenTableEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new FancyElvenTableEastAddon();
public override int LabelNumber => 1073386; // hardwood table (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,62 @@
namespace Server.Items
{
public class FancyElvenTableSouthAddon : BaseAddon
{
[Constructible]
public FancyElvenTableSouthAddon()
{
AddComponent(new AddonComponent(0x3095), 0, 1, 0);
AddComponent(new AddonComponent(0x3096), 0, 0, 0);
AddComponent(new AddonComponent(0x3097), 0, -1, 0);
}
public FancyElvenTableSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new FancyElvenTableSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class FancyElvenTableSouthDeed : BaseAddonDeed
{
[Constructible]
public FancyElvenTableSouthDeed()
{
}
public FancyElvenTableSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new FancyElvenTableSouthAddon();
public override int LabelNumber => 1073385; // hardwood table (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,51 @@
namespace Server.Items
{
public class FireColumnAddon : BaseAddon
{
[Constructible]
public FireColumnAddon(bool bloody = false)
{
AddComponent(new AddonComponent(0x3A5), 0, 0, 0);
AddComponent(new AddonComponent(0x3A5), 0, 0, 5);
AddComponent(new AddonComponent(0x3A5), 0, 0, 10);
AddComponent(new AddonComponent(0x3A5), 0, 0, 15);
AddComponent(new AddonComponent(0x19BB), 0, 0, 21);
AddComponent(new AddonComponent(0x19AB), 0, 0, 23);
if (bloody)
{
AddComponent(new AddonComponent(0x122B), -2, 0, 0);
AddComponent(new AddonComponent(0x122E), 0, -2, 0);
AddComponent(new AddonComponent(0x122D), -1, 1, 0);
AddComponent(new AddonComponent(0x122F), 1, -1, 0);
AddComponent(new AddonComponent(0x122D), 0, 1, 0);
AddComponent(new AddonComponent(0x122A), 1, 0, 0);
AddComponent(new AddonComponent(0x122B), 2, -1, 0);
AddComponent(new AddonComponent(0x122B), 0, 2, 0);
AddComponent(new AddonComponent(0x122E), 1, 1, 0);
}
}
public FireColumnAddon(Serial serial)
: base(serial)
{
}
public override bool ShareHue => false;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,213 @@
using System;
using System.Collections.Generic;
using Server.Network;
namespace Server.Items
{
public interface IFlourMill
{
int MaxFlour{ get; }
int CurFlour{ get; set; }
}
public enum FlourMillStage
{
Empty,
Filled,
Working
}
public class FlourMillEastAddon : BaseAddon, IFlourMill
{
private static int[][] m_StageTable =
{
new[] { 0x1920, 0x1921, 0x1925 },
new[] { 0x1922, 0x1923, 0x1926 },
new[] { 0x1924, 0x1924, 0x1928 }
};
private int m_Flour;
private Timer m_Timer;
[Constructible]
public FlourMillEastAddon()
{
AddComponent(new AddonComponent(0x1920), -1, 0, 0);
AddComponent(new AddonComponent(0x1922), 0, 0, 0);
AddComponent(new AddonComponent(0x1924), 1, 0, 0);
}
public FlourMillEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new FlourMillEastDeed();
[CommandProperty(AccessLevel.GameMaster)]
public bool HasFlour => m_Flour > 0;
[CommandProperty(AccessLevel.GameMaster)]
public bool IsFull => m_Flour >= MaxFlour;
[CommandProperty(AccessLevel.GameMaster)]
public bool IsWorking => m_Timer != null;
[CommandProperty(AccessLevel.GameMaster)]
public int MaxFlour => 2;
[CommandProperty(AccessLevel.GameMaster)]
public int CurFlour
{
get => m_Flour;
set
{
m_Flour = Math.Max(0, Math.Min(value, MaxFlour));
UpdateStage();
}
}
public void StartWorking(Mobile from)
{
if (IsWorking)
return;
m_Timer = Timer.DelayCall(TimeSpan.FromSeconds(5.0), FinishWorking_Callback, from);
UpdateStage();
}
private void FinishWorking_Callback(Mobile from)
{
if (m_Timer != null)
{
m_Timer.Stop();
m_Timer = null;
}
if (from?.Deleted == false && !Deleted && IsFull)
{
SackFlour flour = new SackFlour { ItemID = Utility.RandomBool() ? 4153 : 4165 };
if (from.PlaceInBackpack(flour))
{
m_Flour = 0;
}
else
{
flour.Delete();
from.SendLocalizedMessage(500998); // There is not enough room in your backpack! You stop grinding.
}
}
UpdateStage();
}
private int[] FindItemTable(int itemID)
{
for (int i = 0; i < m_StageTable.Length; ++i)
{
int[] itemTable = m_StageTable[i];
for (int j = 0; j < itemTable.Length; ++j)
if (itemTable[j] == itemID)
return itemTable;
}
return null;
}
public void UpdateStage()
{
if (IsWorking)
UpdateStage(FlourMillStage.Working);
else if (HasFlour)
UpdateStage(FlourMillStage.Filled);
else
UpdateStage(FlourMillStage.Empty);
}
public void UpdateStage(FlourMillStage stage)
{
List<AddonComponent> components = Components;
int[][] stageTable = m_StageTable;
for (int i = 0; i < components.Count; ++i)
{
if (!(components[i] is AddonComponent component))
continue;
int[] itemTable = FindItemTable(component.ItemID);
if (itemTable != null)
component.ItemID = itemTable[(int)stage];
}
}
public override void OnComponentUsed(AddonComponent c, Mobile from)
{
if (!from.InRange(GetWorldLocation(), 4) || !from.InLOS(this))
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
else if (!IsFull)
from.SendLocalizedMessage(500997); // You need more wheat to make a sack of flour.
else
StartWorking(from);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(m_Flour);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
m_Flour = reader.ReadInt();
break;
}
}
UpdateStage();
}
}
public class FlourMillEastDeed : BaseAddonDeed
{
[Constructible]
public FlourMillEastDeed()
{
}
public FlourMillEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new FlourMillEastAddon();
public override int LabelNumber => 1044347; // flour mill (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,201 @@
using System;
using System.Collections.Generic;
using Server.Network;
namespace Server.Items
{
public class FlourMillSouthAddon : BaseAddon, IFlourMill
{
private static int[][] m_StageTable =
{
new[] { 0x192C, 0x192D, 0x1931 },
new[] { 0x192E, 0x192F, 0x1932 },
new[] { 0x1930, 0x1930, 0x1934 }
};
private int m_Flour;
private Timer m_Timer;
[Constructible]
public FlourMillSouthAddon()
{
AddComponent(new AddonComponent(0x192C), 0, -1, 0);
AddComponent(new AddonComponent(0x192E), 0, 0, 0);
AddComponent(new AddonComponent(0x1930), 0, 1, 0);
}
public FlourMillSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new FlourMillSouthDeed();
[CommandProperty(AccessLevel.GameMaster)]
public bool HasFlour => m_Flour > 0;
[CommandProperty(AccessLevel.GameMaster)]
public bool IsFull => m_Flour >= MaxFlour;
[CommandProperty(AccessLevel.GameMaster)]
public bool IsWorking => m_Timer != null;
[CommandProperty(AccessLevel.GameMaster)]
public int MaxFlour => 2;
[CommandProperty(AccessLevel.GameMaster)]
public int CurFlour
{
get => m_Flour;
set
{
m_Flour = Math.Max(0, Math.Min(value, MaxFlour));
UpdateStage();
}
}
public void StartWorking(Mobile from)
{
if (IsWorking)
return;
m_Timer = Timer.DelayCall(TimeSpan.FromSeconds(5.0), FinishWorking_Callback, from);
UpdateStage();
}
private void FinishWorking_Callback(Mobile from)
{
if (m_Timer != null)
{
m_Timer.Stop();
m_Timer = null;
}
if (from?.Deleted == false && !Deleted && IsFull)
{
SackFlour flour = new SackFlour();
flour.ItemID = Utility.RandomBool() ? 4153 : 4165;
if (from.PlaceInBackpack(flour))
{
m_Flour = 0;
}
else
{
flour.Delete();
from.SendLocalizedMessage(500998); // There is not enough room in your backpack! You stop grinding.
}
}
UpdateStage();
}
private int[] FindItemTable(int itemID)
{
for (int i = 0; i < m_StageTable.Length; ++i)
{
int[] itemTable = m_StageTable[i];
for (int j = 0; j < itemTable.Length; ++j)
if (itemTable[j] == itemID)
return itemTable;
}
return null;
}
public void UpdateStage()
{
if (IsWorking)
UpdateStage(FlourMillStage.Working);
else if (HasFlour)
UpdateStage(FlourMillStage.Filled);
else
UpdateStage(FlourMillStage.Empty);
}
public void UpdateStage(FlourMillStage stage)
{
List<AddonComponent> components = Components;
int[][] stageTable = m_StageTable;
for (int i = 0; i < components.Count; ++i)
{
if (!(components[i] is AddonComponent component))
continue;
int[] itemTable = FindItemTable(component.ItemID);
if (itemTable != null)
component.ItemID = itemTable[(int)stage];
}
}
public override void OnComponentUsed(AddonComponent c, Mobile from)
{
if (!from.InRange(GetWorldLocation(), 4) || !from.InLOS(this))
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
else if (!IsFull)
from.SendLocalizedMessage(500997); // You need more wheat to make a sack of flour.
else
StartWorking(from);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(m_Flour);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
m_Flour = reader.ReadInt();
break;
}
}
UpdateStage();
}
}
public class FlourMillSouthDeed : BaseAddonDeed
{
[Constructible]
public FlourMillSouthDeed()
{
}
public FlourMillSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new FlourMillSouthAddon();
public override int LabelNumber => 1044348; // flour mill (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,238 @@
namespace Server.Items
{
public class LightFlowerTapestryEastAddon : BaseAddon
{
[Constructible]
public LightFlowerTapestryEastAddon()
{
AddComponent(new AddonComponent(0xFDC), 0, 0, 0);
AddComponent(new AddonComponent(0xFDB), 0, 1, 0);
}
public LightFlowerTapestryEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new LightFlowerTapestryEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class LightFlowerTapestryEastDeed : BaseAddonDeed
{
[Constructible]
public LightFlowerTapestryEastDeed()
{
}
public LightFlowerTapestryEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new LightFlowerTapestryEastAddon();
public override int LabelNumber => 1049393; // a flower tapestry deed facing east
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class LightFlowerTapestrySouthAddon : BaseAddon
{
[Constructible]
public LightFlowerTapestrySouthAddon()
{
AddComponent(new AddonComponent(0xFD9), 0, 0, 0);
AddComponent(new AddonComponent(0xFDA), 1, 0, 0);
}
public LightFlowerTapestrySouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new LightFlowerTapestrySouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class LightFlowerTapestrySouthDeed : BaseAddonDeed
{
[Constructible]
public LightFlowerTapestrySouthDeed()
{
}
public LightFlowerTapestrySouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new LightFlowerTapestrySouthAddon();
public override int LabelNumber => 1049394; // a flower tapestry deed facing south
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class DarkFlowerTapestryEastAddon : BaseAddon
{
[Constructible]
public DarkFlowerTapestryEastAddon()
{
AddComponent(new AddonComponent(0xFE0), 0, 0, 0);
AddComponent(new AddonComponent(0xFDF), 0, 1, 0);
}
public DarkFlowerTapestryEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new DarkFlowerTapestryEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class DarkFlowerTapestryEastDeed : BaseAddonDeed
{
[Constructible]
public DarkFlowerTapestryEastDeed()
{
}
public DarkFlowerTapestryEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new DarkFlowerTapestryEastAddon();
public override int LabelNumber => 1049395; // a dark flower tapestry deed facing east
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class DarkFlowerTapestrySouthAddon : BaseAddon
{
[Constructible]
public DarkFlowerTapestrySouthAddon()
{
AddComponent(new AddonComponent(0xFDD), 0, 0, 0);
AddComponent(new AddonComponent(0xFDE), 1, 0, 0);
}
public DarkFlowerTapestrySouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new DarkFlowerTapestrySouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class DarkFlowerTapestrySouthDeed : BaseAddonDeed
{
[Constructible]
public DarkFlowerTapestrySouthDeed()
{
}
public DarkFlowerTapestrySouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new DarkFlowerTapestrySouthAddon();
public override int LabelNumber => 1049396; // a dark flower tapestry deed facing south
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,200 @@
namespace Server.Items
{
public class GiantWeb1 : BaseAddon
{
[Constructible]
public GiantWeb1()
{
int itemID = 4280;
int count = 5;
for (int i = 0; i < count; ++i)
AddComponent(new AddonComponent(itemID++), count - 1 - i,
-(count - 1 - i), 0);
}
public GiantWeb1(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((byte)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadByte();
}
}
public class GiantWeb2 : BaseAddon
{
[Constructible]
public GiantWeb2()
{
int itemID = 4285;
int count = 5;
for (int i = 0; i < count; ++i)
AddComponent(new AddonComponent(itemID++), i,
-i, 0);
}
public GiantWeb2(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((byte)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadByte();
}
}
public class GiantWeb3 : BaseAddon
{
[Constructible]
public GiantWeb3()
{
int itemID = 4290;
int count = 4;
for (int i = 0; i < count; ++i)
AddComponent(new AddonComponent(itemID++), i,
-i, 0);
}
public GiantWeb3(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((byte)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadByte();
}
}
public class GiantWeb4 : BaseAddon
{
[Constructible]
public GiantWeb4()
{
int itemID = 4294;
int count = 4;
for (int i = 0; i < count; ++i)
AddComponent(new AddonComponent(itemID++), count - 1 - i,
-(count - 1 - i), 0);
}
public GiantWeb4(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((byte)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadByte();
}
}
public class GiantWeb5 : BaseAddon
{
[Constructible]
public GiantWeb5()
{
int itemID = 4298;
int count = 4;
for (int i = 0; i < count; ++i)
AddComponent(new AddonComponent(itemID++), i,
-i, 0);
}
public GiantWeb5(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((byte)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadByte();
}
}
public class GiantWeb6 : BaseAddon
{
[Constructible]
public GiantWeb6()
{
int itemID = 4302;
int count = 4;
for (int i = 0; i < count; ++i)
AddComponent(new AddonComponent(itemID++), count - 1 - i,
-(count - 1 - i), 0);
}
public GiantWeb6(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((byte)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadByte();
}
}
}

View file

@ -0,0 +1,495 @@
namespace Server.Items
{
public class GozaMatEastAddon : BaseAddon
{
[Constructible]
public GozaMatEastAddon(int hue = 0)
{
AddComponent(new LocalizedAddonComponent(0x28a4, 1030688), 1, 0, 0);
AddComponent(new LocalizedAddonComponent(0x28a5, 1030688), 0, 0, 0);
Hue = hue;
}
public GozaMatEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new GozaMatEastDeed();
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class GozaMatEastDeed : BaseAddonDeed
{
[Constructible]
public GozaMatEastDeed()
{
}
public GozaMatEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new GozaMatEastAddon(Hue);
public override int LabelNumber => 1030404; // goza (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class GozaMatSouthAddon : BaseAddon
{
[Constructible]
public GozaMatSouthAddon(int hue = 0)
{
AddComponent(new LocalizedAddonComponent(0x28a6, 1030688), 0, 1, 0);
AddComponent(new LocalizedAddonComponent(0x28a7, 1030688), 0, 0, 0);
Hue = hue;
}
public GozaMatSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new GozaMatSouthDeed();
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class GozaMatSouthDeed : BaseAddonDeed
{
[Constructible]
public GozaMatSouthDeed()
{
}
public GozaMatSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new GozaMatSouthAddon(Hue);
public override int LabelNumber => 1030405; // goza (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SquareGozaMatEastAddon : BaseAddon
{
[Constructible]
public SquareGozaMatEastAddon(int hue = 0)
{
AddComponent(new LocalizedAddonComponent(0x28a8, 1030688), 0, 0, 0);
Hue = hue;
}
public SquareGozaMatEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SquareGozaMatEastDeed();
public override int LabelNumber => 1030688; // goza mat
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SquareGozaMatEastDeed : BaseAddonDeed
{
[Constructible]
public SquareGozaMatEastDeed()
{
}
public SquareGozaMatEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SquareGozaMatEastAddon(Hue);
public override int LabelNumber => 1030407; // square goza (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SquareGozaMatSouthAddon : BaseAddon
{
[Constructible]
public SquareGozaMatSouthAddon(int hue = 0)
{
AddComponent(new LocalizedAddonComponent(0x28a9, 1030688), 0, 0, 0);
Hue = hue;
}
public SquareGozaMatSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SquareGozaMatSouthDeed();
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SquareGozaMatSouthDeed : BaseAddonDeed
{
[Constructible]
public SquareGozaMatSouthDeed()
{
}
public SquareGozaMatSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SquareGozaMatSouthAddon(Hue);
public override int LabelNumber => 1030406; // square goza (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BrocadeGozaMatEastAddon : BaseAddon
{
[Constructible]
public BrocadeGozaMatEastAddon(int hue = 0)
{
AddComponent(new LocalizedAddonComponent(0x28AB, 1030688), 0, 0, 0);
AddComponent(new LocalizedAddonComponent(0x28AA, 1030688), 1, 0, 0);
Hue = hue;
}
public BrocadeGozaMatEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new BrocadeGozaMatEastDeed();
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BrocadeGozaMatEastDeed : BaseAddonDeed
{
[Constructible]
public BrocadeGozaMatEastDeed()
{
}
public BrocadeGozaMatEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new BrocadeGozaMatEastAddon(Hue);
public override int LabelNumber => 1030408; // brocade goza (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BrocadeGozaMatSouthAddon : BaseAddon
{
[Constructible]
public BrocadeGozaMatSouthAddon(int hue = 0)
{
AddComponent(new LocalizedAddonComponent(0x28AD, 1030688), 0, 0, 0);
AddComponent(new LocalizedAddonComponent(0x28AC, 1030688), 0, 1, 0);
Hue = hue;
}
public BrocadeGozaMatSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new BrocadeGozaMatSouthDeed();
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BrocadeGozaMatSouthDeed : BaseAddonDeed
{
[Constructible]
public BrocadeGozaMatSouthDeed()
{
}
public BrocadeGozaMatSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new BrocadeGozaMatSouthAddon(Hue);
public override int LabelNumber => 1030409; // brocade goza (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BrocadeSquareGozaMatEastAddon : BaseAddon
{
[Constructible]
public BrocadeSquareGozaMatEastAddon(int hue = 0)
{
AddComponent(new LocalizedAddonComponent(0x28AE, 1030688), 0, 0, 0);
Hue = hue;
}
public BrocadeSquareGozaMatEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new BrocadeSquareGozaMatEastDeed();
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BrocadeSquareGozaMatEastDeed : BaseAddonDeed
{
[Constructible]
public BrocadeSquareGozaMatEastDeed()
{
}
public BrocadeSquareGozaMatEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new BrocadeSquareGozaMatEastAddon(Hue);
public override int LabelNumber => 1030411; // brocade square goza (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BrocadeSquareGozaMatSouthAddon : BaseAddon
{
[Constructible]
public BrocadeSquareGozaMatSouthAddon(int hue = 0)
{
AddComponent(new LocalizedAddonComponent(0x28AF, 1030688), 0, 0, 0);
Hue = hue;
}
public BrocadeSquareGozaMatSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new BrocadeSquareGozaMatSouthDeed();
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class BrocadeSquareGozaMatSouthDeed : BaseAddonDeed
{
[Constructible]
public BrocadeSquareGozaMatSouthDeed()
{
}
public BrocadeSquareGozaMatSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new BrocadeSquareGozaMatSouthAddon(Hue);
public override int LabelNumber => 1030410; // brocade square goza (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class GrayBrickFireplaceEastAddon : BaseAddon
{
[Constructible]
public GrayBrickFireplaceEastAddon()
{
AddComponent(new AddonComponent(0x93D), 0, 0, 0);
AddComponent(new AddonComponent(0x937), 0, 1, 0);
}
public GrayBrickFireplaceEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new GrayBrickFireplaceEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class GrayBrickFireplaceEastDeed : BaseAddonDeed
{
[Constructible]
public GrayBrickFireplaceEastDeed()
{
}
public GrayBrickFireplaceEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new GrayBrickFireplaceEastAddon();
public override int LabelNumber => 1061846; // grey brick fireplace (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class GrayBrickFireplaceSouthAddon : BaseAddon
{
[Constructible]
public GrayBrickFireplaceSouthAddon()
{
AddComponent(new AddonComponent(0x94B), -1, 0, 0);
AddComponent(new AddonComponent(0x945), 0, 0, 0);
}
public GrayBrickFireplaceSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new GrayBrickFireplaceSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class GrayBrickFireplaceSouthDeed : BaseAddonDeed
{
[Constructible]
public GrayBrickFireplaceSouthDeed()
{
}
public GrayBrickFireplaceSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new GrayBrickFireplaceSouthAddon();
public override int LabelNumber => 1061847; // grey brick fireplace (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,82 @@
using System;
namespace Server.Items
{
public class JackOLantern : BaseAddon
{
[Constructible]
public JackOLantern()
: this(1 > Utility.Random(2))
{
}
[Constructible]
public JackOLantern(bool south)
{
AddComponent(new AddonComponent(5703), 0, 0, +0);
int hue = 1161;
//( 1 > Utility.Random( 5 ) ? 2118 : 1161 );
if (!south)
{
AddComponent(GetComponent(3178, 0000), 0, 0, -1);
AddComponent(GetComponent(3883, hue), 0, 0, +1);
AddComponent(GetComponent(3862, hue), 0, 0, +0);
}
else
{
AddComponent(GetComponent(3179, 0000), 0, 0, +0);
AddComponent(GetComponent(3885, hue), 0, 0, -1);
AddComponent(GetComponent(3871, hue), 0, 0, +0);
}
}
public JackOLantern(Serial serial)
: base(serial)
{
}
public override bool ShareHue => false;
private AddonComponent GetComponent(int itemID, int hue)
{
AddonComponent ac = new AddonComponent(itemID);
ac.Hue = hue;
ac.Name = "jack-o-lantern";
return ac;
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((byte)2); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadByte();
if (version == 0)
Timer.DelayCall(TimeSpan.Zero, delegate
{
for (int i = 0; i < Components.Count; ++i)
if (Components[i] is AddonComponent ac && ac.Hue == 2118)
ac.Hue = 1161;
});
if (version <= 1)
Timer.DelayCall(TimeSpan.Zero, delegate
{
for (int i = 0; i < Components.Count; ++i)
if (Components[i] is AddonComponent ac)
ac.Name = "jack-o-lantern";
});
}
}
}

View file

@ -0,0 +1,63 @@
namespace Server.Items
{
public class LargeBedEastAddon : BaseAddon
{
[Constructible]
public LargeBedEastAddon()
{
AddComponent(new AddonComponent(0xA7D), 0, 0, 0);
AddComponent(new AddonComponent(0xA7C), 0, 1, 0);
AddComponent(new AddonComponent(0xA79), 1, 0, 0);
AddComponent(new AddonComponent(0xA78), 1, 1, 0);
}
public LargeBedEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new LargeBedEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class LargeBedEastDeed : BaseAddonDeed
{
[Constructible]
public LargeBedEastDeed()
{
}
public LargeBedEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new LargeBedEastAddon();
public override int LabelNumber => 1044324; // large bed (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,63 @@
namespace Server.Items
{
public class LargeBedSouthAddon : BaseAddon
{
[Constructible]
public LargeBedSouthAddon()
{
AddComponent(new AddonComponent(0xA83), 0, 0, 0);
AddComponent(new AddonComponent(0xA7F), 0, 1, 0);
AddComponent(new AddonComponent(0xA82), 1, 0, 0);
AddComponent(new AddonComponent(0xA7E), 1, 1, 0);
}
public LargeBedSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new LargeBedSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class LargeBedSouthDeed : BaseAddonDeed
{
[Constructible]
public LargeBedSouthDeed()
{
}
public LargeBedSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new LargeBedSouthAddon();
public override int LabelNumber => 1044323; // large bed (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,63 @@
namespace Server.Items
{
public class LargeForgeEastAddon : BaseAddon
{
[Constructible]
public LargeForgeEastAddon()
{
AddComponent(new ForgeComponent(0x1986), 0, 0, 0);
AddComponent(new ForgeComponent(0x198A), 0, 1, 0);
AddComponent(new ForgeComponent(0x1996), 0, 2, 0);
AddComponent(new ForgeComponent(0x1992), 0, 3, 0);
}
public LargeForgeEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new LargeForgeEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class LargeForgeEastDeed : BaseAddonDeed
{
[Constructible]
public LargeForgeEastDeed()
{
}
public LargeForgeEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new LargeForgeEastAddon();
public override int LabelNumber => 1044331; // large forge (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,63 @@
namespace Server.Items
{
public class LargeForgeSouthAddon : BaseAddon
{
[Constructible]
public LargeForgeSouthAddon()
{
AddComponent(new ForgeComponent(0x197A), 0, 0, 0);
AddComponent(new ForgeComponent(0x197E), 1, 0, 0);
AddComponent(new ForgeComponent(0x19A2), 2, 0, 0);
AddComponent(new ForgeComponent(0x199E), 3, 0, 0);
}
public LargeForgeSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new LargeForgeSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class LargeForgeSouthDeed : BaseAddonDeed
{
[Constructible]
public LargeForgeSouthDeed()
{
}
public LargeForgeSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new LargeForgeSouthAddon();
public override int LabelNumber => 1044332; // large forge (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,65 @@
namespace Server.Items
{
public class LargeStoneTableEastAddon : BaseAddon
{
[Constructible]
public LargeStoneTableEastAddon(int hue = 0)
{
AddComponent(new AddonComponent(0x1202), 0, 0, 0);
AddComponent(new AddonComponent(0x1203), 0, 1, 0);
AddComponent(new AddonComponent(0x1201), 0, 2, 0);
Hue = hue;
}
public LargeStoneTableEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new LargeStoneTableEastDeed();
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class LargeStoneTableEastDeed : BaseAddonDeed
{
[Constructible]
public LargeStoneTableEastDeed()
{
}
public LargeStoneTableEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new LargeStoneTableEastAddon(Hue);
public override int LabelNumber => 1044511; // large stone table (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,65 @@
namespace Server.Items
{
public class LargeStoneTableSouthAddon : BaseAddon
{
[Constructible]
public LargeStoneTableSouthAddon(int hue = 0)
{
AddComponent(new AddonComponent(0x1205), 0, 0, 0);
AddComponent(new AddonComponent(0x1206), 1, 0, 0);
AddComponent(new AddonComponent(0x1204), 2, 0, 0);
Hue = hue;
}
public LargeStoneTableSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new LargeStoneTableSouthDeed();
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class LargeStoneTableSouthDeed : BaseAddonDeed
{
[Constructible]
public LargeStoneTableSouthDeed()
{
}
public LargeStoneTableSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new LargeStoneTableSouthAddon(Hue);
public override int LabelNumber => 1044512; // large stone table (South)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,79 @@
namespace Server.Items
{
public interface ILoom
{
int Phase{ get; set; }
}
public class LoomEastAddon : BaseAddon, ILoom
{
[Constructible]
public LoomEastAddon()
{
AddComponent(new AddonComponent(0x1060), 0, 0, 0);
AddComponent(new AddonComponent(0x105F), 0, 1, 0);
}
public LoomEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new LoomEastDeed();
public int Phase{ get; set; }
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(Phase);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
Phase = reader.ReadInt();
break;
}
}
}
}
public class LoomEastDeed : BaseAddonDeed
{
[Constructible]
public LoomEastDeed()
{
}
public LoomEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new LoomEastAddon();
public override int LabelNumber => 1044343; // loom (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,74 @@
namespace Server.Items
{
public class LoomSouthAddon : BaseAddon, ILoom
{
[Constructible]
public LoomSouthAddon()
{
AddComponent(new AddonComponent(0x1061), 0, 0, 0);
AddComponent(new AddonComponent(0x1062), 1, 0, 0);
}
public LoomSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new LoomSouthDeed();
public int Phase{ get; set; }
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
writer.Write(Phase);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 1:
{
Phase = reader.ReadInt();
break;
}
}
}
}
public class LoomSouthDeed : BaseAddonDeed
{
[Constructible]
public LoomSouthDeed()
{
}
public LoomSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new LoomSouthAddon();
public override int LabelNumber => 1044344; // loom (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,64 @@
namespace Server.Items
{
public class MediumStoneTableEastAddon : BaseAddon
{
[Constructible]
public MediumStoneTableEastAddon(int hue = 0)
{
AddComponent(new AddonComponent(0x1202), 0, 0, 0);
AddComponent(new AddonComponent(0x1201), 0, 1, 0);
Hue = hue;
}
public MediumStoneTableEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new MediumStoneTableEastDeed();
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class MediumStoneTableEastDeed : BaseAddonDeed
{
[Constructible]
public MediumStoneTableEastDeed()
{
}
public MediumStoneTableEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new MediumStoneTableEastAddon(Hue);
public override int LabelNumber => 1044508; // stone table (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,64 @@
namespace Server.Items
{
public class MediumStoneTableSouthAddon : BaseAddon
{
[Constructible]
public MediumStoneTableSouthAddon(int hue = 0)
{
AddComponent(new AddonComponent(0x1205), 0, 0, 0);
AddComponent(new AddonComponent(0x1204), 1, 0, 0);
Hue = hue;
}
public MediumStoneTableSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new MediumStoneTableSouthDeed();
public override bool RetainDeedHue => true;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(1); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class MediumStoneTableSouthDeed : BaseAddonDeed
{
[Constructible]
public MediumStoneTableSouthDeed()
{
}
public MediumStoneTableSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new MediumStoneTableSouthAddon(Hue);
public override int LabelNumber => 1044509; // stone table (South)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,62 @@
namespace Server.Items
{
public class OrnateElvenTableEastAddon : BaseAddon
{
[Constructible]
public OrnateElvenTableEastAddon()
{
AddComponent(new AddonComponent(0x308E), -1, 0, 0);
AddComponent(new AddonComponent(0x308D), 0, 0, 0);
AddComponent(new AddonComponent(0x308C), 1, 0, 0);
}
public OrnateElvenTableEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new OrnateElvenTableEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class OrnateElvenTableEastDeed : BaseAddonDeed
{
[Constructible]
public OrnateElvenTableEastDeed()
{
}
public OrnateElvenTableEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new OrnateElvenTableEastAddon();
public override int LabelNumber => 1073384; // ornate table (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,62 @@
namespace Server.Items
{
public class OrnateElvenTableSouthAddon : BaseAddon
{
[Constructible]
public OrnateElvenTableSouthAddon()
{
AddComponent(new AddonComponent(0x308F), 0, 1, 0);
AddComponent(new AddonComponent(0x3090), 0, 0, 0);
AddComponent(new AddonComponent(0x3091), 0, -1, 0);
}
public OrnateElvenTableSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new OrnateElvenTableSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class OrnateElvenTableSouthDeed : BaseAddonDeed
{
[Constructible]
public OrnateElvenTableSouthDeed()
{
}
public OrnateElvenTableSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new OrnateElvenTableSouthAddon();
public override int LabelNumber => 1072869; // ornate table (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class ParrotPerchAddon : BaseAddon
{
[Constructible]
public ParrotPerchAddon()
{
AddComponent(new AddonComponent(0x2FF4), 0, 0, 0);
}
public ParrotPerchAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new ParrotPerchDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class ParrotPerchDeed : BaseAddonDeed
{
[Constructible]
public ParrotPerchDeed()
{
}
public ParrotPerchDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new ParrotPerchAddon();
public override int LabelNumber => 1072617; // parrot perch
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,68 @@
namespace Server.Items
{
public class PentagramAddon : BaseAddon
{
[Constructible]
public PentagramAddon()
{
AddComponent(new AddonComponent(0xFE7), -1, -1, 0);
AddComponent(new AddonComponent(0xFE8), 0, -1, 0);
AddComponent(new AddonComponent(0xFEB), 1, -1, 0);
AddComponent(new AddonComponent(0xFE6), -1, 0, 0);
AddComponent(new AddonComponent(0xFEA), 0, 0, 0);
AddComponent(new AddonComponent(0xFEE), 1, 0, 0);
AddComponent(new AddonComponent(0xFE9), -1, 1, 0);
AddComponent(new AddonComponent(0xFEC), 0, 1, 0);
AddComponent(new AddonComponent(0xFED), 1, 1, 0);
}
public PentagramAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new PentagramDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class PentagramDeed : BaseAddonDeed
{
[Constructible]
public PentagramDeed()
{
}
public PentagramDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new PentagramAddon();
public override int LabelNumber => 1044328; // pentagram
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,258 @@
using System;
namespace Server.Items
{
[Flippable(0x1EC0, 0x1EC3)]
public class PickpocketDip : AddonComponent
{
private Timer m_Timer;
public PickpocketDip(int itemID) : base(itemID)
{
MinSkill = -25.0;
MaxSkill = +25.0;
}
public PickpocketDip(Serial serial) : base(serial)
{
}
[CommandProperty(AccessLevel.GameMaster)]
public double MinSkill{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public double MaxSkill{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public bool Swinging => m_Timer != null;
public void UpdateItemID()
{
int baseItemID = 0x1EC0 + (ItemID - 0x1EC0) / 3 * 3;
ItemID = baseItemID + (Swinging ? 1 : 0);
}
public void BeginSwing()
{
m_Timer?.Stop();
m_Timer = new InternalTimer(this);
m_Timer.Start();
UpdateItemID();
}
public void EndSwing()
{
m_Timer?.Stop();
m_Timer = null;
UpdateItemID();
}
public void Use(Mobile from)
{
from.Direction = from.GetDirectionTo(GetWorldLocation());
Effects.PlaySound(GetWorldLocation(), Map, 0x4F);
if (from.CheckSkill(SkillName.Stealing, MinSkill, MaxSkill))
{
SendLocalizedMessageTo(from, 501834); // You successfully avoid disturbing the dip while searching it.
}
else
{
Effects.PlaySound(GetWorldLocation(), Map, 0x390);
BeginSwing();
ProcessDelta();
SendLocalizedMessageTo(from, 501831); // You carelessly bump the dip and start it swinging.
}
}
public override void OnDoubleClick(Mobile from)
{
if (!from.InRange(GetWorldLocation(), 1))
SendLocalizedMessageTo(from, 501816); // You are too far away to do that.
else if (Swinging)
SendLocalizedMessageTo(from, 501815); // You have to wait until it stops swinging.
else if (from.Skills.Stealing.Base >= MaxSkill)
SendLocalizedMessageTo(from,
501830); // Your ability to steal cannot improve any further by simply practicing on a dummy.
else if (from.Mounted)
SendLocalizedMessageTo(from, 501829); // You can't practice on this while on a mount.
else
Use(from);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
writer.Write(MinSkill);
writer.Write(MaxSkill);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 0:
{
MinSkill = reader.ReadDouble();
MaxSkill = reader.ReadDouble();
if (MinSkill == 0.0 && MaxSkill == 30.0)
{
MinSkill = -25.0;
MaxSkill = +25.0;
}
break;
}
}
UpdateItemID();
}
private class InternalTimer : Timer
{
private PickpocketDip m_Dip;
public InternalTimer(PickpocketDip dip) : base(TimeSpan.FromSeconds(3.0))
{
m_Dip = dip;
Priority = TimerPriority.FiftyMS;
}
protected override void OnTick()
{
m_Dip.EndSwing();
}
}
}
public class PickpocketDipEastAddon : BaseAddon
{
[Constructible]
public PickpocketDipEastAddon()
{
AddComponent(new PickpocketDip(0x1EC3), 0, 0, 0);
}
public PickpocketDipEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new PickpocketDipEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class PickpocketDipEastDeed : BaseAddonDeed
{
[Constructible]
public PickpocketDipEastDeed()
{
}
public PickpocketDipEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new PickpocketDipEastAddon();
public override int LabelNumber => 1044337; // pickpocket dip (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class PickpocketDipSouthAddon : BaseAddon
{
[Constructible]
public PickpocketDipSouthAddon()
{
AddComponent(new PickpocketDip(0x1EC0), 0, 0, 0);
}
public PickpocketDipSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new PickpocketDipSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class PickpocketDipSouthDeed : BaseAddonDeed
{
[Constructible]
public PickpocketDipSouthDeed()
{
}
public PickpocketDipSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new PickpocketDipSouthAddon();
public override int LabelNumber => 1044338; // pickpocket dip (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,53 @@
namespace Server.Items
{
public class PyramidAddon : BaseAddon
{
[Constructible]
public PyramidAddon()
{
AddComponent(new AddonComponent(1006), 0, 0, 5);
for (int o = 1; o <= 2; ++o)
{
AddComponent(new AddonComponent(1011), -o, -o, (2 - o) * 5);
AddComponent(new AddonComponent(1012), +o, +o, (2 - o) * 5);
AddComponent(new AddonComponent(1013), +o, -o, (2 - o) * 5);
AddComponent(new AddonComponent(1014), -o, +o, (2 - o) * 5);
}
for (int o = -1; o <= 1; ++o)
{
AddComponent(new AddonComponent(1007), o, 2, 0);
AddComponent(new AddonComponent(1008), 2, o, 0);
AddComponent(new AddonComponent(1009), o, -2, 0);
AddComponent(new AddonComponent(1010), -2, o, 0);
}
AddComponent(new AddonComponent(1007), 0, 1, 5);
AddComponent(new AddonComponent(1008), 1, 0, 5);
AddComponent(new AddonComponent(1009), 0, -1, 5);
AddComponent(new AddonComponent(1010), -1, 0, 5);
}
public PyramidAddon(Serial serial)
: base(serial)
{
}
public override bool ShareHue => false;
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((byte)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadByte();
}
}
}

View file

@ -0,0 +1,171 @@
using System;
namespace Server.Items
{
public class RejuvinationAddonComponent : AddonComponent
{
public RejuvinationAddonComponent(int itemID) : base(itemID)
{
}
public RejuvinationAddonComponent(Serial serial) : base(serial)
{
}
public override void OnDoubleClick(Mobile from)
{
if (from.BeginAction<RejuvinationAddonComponent>())
{
from.FixedEffect(0x373A, 1, 16);
int random = Utility.Random(1, 4);
if (random == 1 || random == 4)
{
from.Hits = from.HitsMax;
SendLocalizedMessageTo(from, 500801); // A sense of warmth fills your body!
}
if (random == 2 || random == 4)
{
from.Mana = from.ManaMax;
SendLocalizedMessageTo(from, 500802); // A feeling of power surges through your veins!
}
if (random == 3 || random == 4)
{
from.Stam = from.StamMax;
SendLocalizedMessageTo(from, 500803); // You feel as though you've slept for days!
}
Timer.DelayCall(TimeSpan.FromHours(2.0), () => ReleaseUseLock_Callback(from, random));
}
}
public virtual void ReleaseUseLock_Callback(Mobile from, int random)
{
from.EndAction<RejuvinationAddonComponent>();
if (random == 4)
{
from.Hits = from.HitsMax;
from.Mana = from.ManaMax;
from.Stam = from.StamMax;
SendLocalizedMessageTo(from, 500807); // You feel completely rejuvinated!
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public abstract class BaseRejuvinationAnkh : BaseAddon
{
private DateTime m_NextMessage;
public BaseRejuvinationAnkh()
{
}
public BaseRejuvinationAnkh(Serial serial) : base(serial)
{
}
public override bool HandlesOnMovement => true;
public override void OnMovement(Mobile m, Point3D oldLocation)
{
base.OnMovement(m, oldLocation);
if (m.Player && Utility.InRange(Location, m.Location, 3) && !Utility.InRange(Location, oldLocation, 3))
if (DateTime.UtcNow >= m_NextMessage)
{
if (Components.Count > 0)
Components[0].SendLocalizedMessageTo(m, 1010061); // An overwhelming sense of peace fills you.
m_NextMessage = DateTime.UtcNow + TimeSpan.FromSeconds(25.0);
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class RejuvinationAnkhWest : BaseRejuvinationAnkh
{
[Constructible]
public RejuvinationAnkhWest()
{
AddComponent(new RejuvinationAddonComponent(0x3), 0, 0, 0);
AddComponent(new RejuvinationAddonComponent(0x2), 0, 1, 0);
}
public RejuvinationAnkhWest(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class RejuvinationAnkhNorth : BaseRejuvinationAnkh
{
[Constructible]
public RejuvinationAnkhNorth()
{
AddComponent(new RejuvinationAddonComponent(0x4), 0, 0, 0);
AddComponent(new RejuvinationAddonComponent(0x5), 1, 0, 0);
}
public RejuvinationAnkhNorth(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,422 @@
using System;
using System.Linq;
using Server.Commands;
using Server.Mobiles;
namespace Server.Items
{
public class SHTeleComponent : AddonComponent
{
private bool m_Active;
private SHTeleComponent m_TeleDest;
[Constructible]
public SHTeleComponent(int itemID = 0x1775) : this(itemID, new Point3D(0, 0, 0))
{
}
[Constructible]
public SHTeleComponent(int itemID, Point3D offset) : base(itemID)
{
Movable = false;
Hue = 1;
m_Active = true;
TeleOffset = offset;
}
public SHTeleComponent(Serial serial) : base(serial)
{
}
[CommandProperty(AccessLevel.GameMaster)]
public bool Active
{
get => m_Active;
set
{
m_Active = value;
if (Addon is SHTeleporter sourceAddon)
sourceAddon.ChangeActive(value);
}
}
[CommandProperty(AccessLevel.GameMaster)]
public Point3D TeleOffset{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public Point3D TelePoint
{
get => new Point3D(Location.X + TeleOffset.X, Location.Y + TeleOffset.Y, Location.Z + TeleOffset.Z);
set => TeleOffset = new Point3D(value.X - Location.X, value.Y - Location.Y, value.Z - Location.Z);
}
[CommandProperty(AccessLevel.GameMaster)]
public SHTeleComponent TeleDest
{
get => m_TeleDest;
set
{
m_TeleDest = value;
if (Addon is SHTeleporter sourceAddon)
sourceAddon.ChangeDest(value);
}
}
public override string DefaultName => "a hole";
public override void OnDoubleClick(Mobile m)
{
if (!m_Active || m_TeleDest?.Deleted != false || m_TeleDest.Map == Map.Internal)
return;
if (m.InRange(this, 3))
{
Map map = m_TeleDest.Map;
Point3D p = m_TeleDest.TelePoint;
BaseCreature.TeleportPets(m, p, map);
m.MoveToWorld(p, map);
}
else
{
m.SendLocalizedMessage(1019045); // I can't reach that.
}
}
public override void OnDoubleClickDead(Mobile m)
{
OnDoubleClick(m);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.Write(m_Active);
writer.Write(m_TeleDest);
writer.Write(TeleOffset);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
m_Active = reader.ReadBool();
m_TeleDest = reader.ReadItem() as SHTeleComponent;
TeleOffset = reader.ReadPoint3D();
}
}
public class SHTeleporter : BaseAddon
{
private bool m_Changing;
[Constructible]
public SHTeleporter(bool external = true)
{
m_Changing = false;
External = external;
if (external)
{
AddComponent(new AddonComponent(0x549), -1, -1, 0);
AddComponent(new AddonComponent(0x54D), 0, -1, 0);
AddComponent(new AddonComponent(0x54E), 1, -1, 0);
AddComponent(new AddonComponent(0x548), 2, -1, 0);
AddComponent(new AddonComponent(0x54B), -1, 0, 0);
AddComponent(new AddonComponent(0x53B), 0, 0, 0);
AddComponent(new AddonComponent(0x53B), 1, 0, 0);
AddComponent(new AddonComponent(0x544), 2, 0, 0);
AddComponent(new AddonComponent(0x54C), -1, 1, 0);
AddComponent(new AddonComponent(0x53B), 0, 1, 0);
AddComponent(new AddonComponent(0x53B), 1, 1, 0);
AddComponent(new AddonComponent(0x545), 2, 1, 0);
AddComponent(new AddonComponent(0x547), -1, 2, 0);
AddComponent(new AddonComponent(0x541), 0, 2, 0);
AddComponent(new AddonComponent(0x543), 1, 2, 0);
AddComponent(new AddonComponent(0x540), 2, 2, 0);
}
Point3D upOS = external ? new Point3D(-1, 0, 0) : new Point3D(-2, -1, 0);
UpTele = new SHTeleComponent(external ? 0x1775 : 0x495, upOS);
AddComponent(UpTele, 0, 0, 0);
Point3D rightOS = external ? new Point3D(-2, 0, 0) : new Point3D(2, -1, 0);
RightTele = new SHTeleComponent(external ? 0x1775 : 0x495, rightOS);
AddComponent(RightTele, 1, 0, 0);
Point3D downOS = external ? new Point3D(-2, -1, 0) : new Point3D(2, 2, 0);
DownTele = new SHTeleComponent(external ? 0x1776 : 0x495, downOS);
AddComponent(DownTele, 1, 1, 0);
Point3D leftOS = external ? new Point3D(-1, -1, 0) : new Point3D(-1, 2, 0);
LeftTele = new SHTeleComponent(external ? 0x1775 : 0x495, leftOS);
AddComponent(LeftTele, 0, 1, 0);
}
public SHTeleporter(Serial serial) : base(serial)
{
m_Changing = false;
}
[CommandProperty(AccessLevel.GameMaster)]
public bool External{ get; private set; }
public SHTeleComponent UpTele{ get; private set; }
public SHTeleComponent RightTele{ get; private set; }
public SHTeleComponent DownTele{ get; private set; }
public SHTeleComponent LeftTele{ get; private set; }
public override bool ShareHue => false;
public static void Initialize()
{
CommandSystem.Register("SHTelGen", AccessLevel.Administrator, SHTelGen_OnCommand);
}
[Usage("SHTelGen")]
[Description("Generates solen hives teleporters.")]
public static void SHTelGen_OnCommand(CommandEventArgs e)
{
World.Broadcast(0x35, true, "Solen hives teleporters are being generated, please wait.");
DateTime startTime = DateTime.UtcNow;
int count = new SHTeleporterCreator().CreateSHTeleporters();
DateTime endTime = DateTime.UtcNow;
World.Broadcast(0x35, true,
"{0} solen hives teleporters have been created. The entire process took {1:F1} seconds.", count,
(endTime - startTime).TotalSeconds);
}
public void ChangeActive(bool active)
{
if (m_Changing)
return;
m_Changing = true;
UpTele.Active = active;
RightTele.Active = active;
DownTele.Active = active;
LeftTele.Active = active;
m_Changing = false;
}
public void ChangeDest(SHTeleComponent dest)
{
if (m_Changing)
return;
m_Changing = true;
if (!(dest?.Addon is SHTeleporter))
{
UpTele.TeleDest = dest;
RightTele.TeleDest = dest;
DownTele.TeleDest = dest;
LeftTele.TeleDest = dest;
}
else
{
SHTeleporter destAddon = (SHTeleporter)dest.Addon;
UpTele.TeleDest = destAddon.UpTele;
RightTele.TeleDest = destAddon.RightTele;
DownTele.TeleDest = destAddon.DownTele;
LeftTele.TeleDest = destAddon.LeftTele;
}
m_Changing = false;
}
public void ChangeDest(SHTeleporter destAddon)
{
if (m_Changing)
return;
m_Changing = true;
if (destAddon != null)
{
UpTele.TeleDest = destAddon.UpTele;
RightTele.TeleDest = destAddon.RightTele;
DownTele.TeleDest = destAddon.DownTele;
LeftTele.TeleDest = destAddon.LeftTele;
}
else
{
UpTele.TeleDest = null;
RightTele.TeleDest = null;
DownTele.TeleDest = null;
LeftTele.TeleDest = null;
}
m_Changing = false;
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
writer.Write(External);
writer.Write(UpTele);
writer.Write(RightTele);
writer.Write(DownTele);
writer.Write(LeftTele);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
External = reader.ReadBool();
UpTele = (SHTeleComponent)reader.ReadItem();
RightTele = (SHTeleComponent)reader.ReadItem();
DownTele = (SHTeleComponent)reader.ReadItem();
LeftTele = (SHTeleComponent)reader.ReadItem();
}
public class SHTeleporterCreator
{
private int m_Count;
public SHTeleporterCreator()
{
m_Count = 0;
}
public static SHTeleporter FindSHTeleporter(Map map, Point3D p)
{
IPooledEnumerable<SHTeleporter> eable = map.GetItemsInRange<SHTeleporter>(p, 0);
SHTeleporter teleporter = eable.FirstOrDefault(item => item.Z == p.Z);
eable.Free();
return teleporter;
}
public SHTeleporter AddSHT(Map map, bool ext, int x, int y, int z)
{
Point3D p = new Point3D(x, y, z);
SHTeleporter tele = FindSHTeleporter(map, p);
if (tele == null)
{
tele = new SHTeleporter(ext);
tele.MoveToWorld(p, map);
m_Count++;
}
return tele;
}
public static void Link(SHTeleporter tele1, SHTeleporter tele2)
{
tele1.ChangeDest(tele2);
tele2.ChangeDest(tele1);
}
public void AddSHTCouple(Map map, bool ext1, int x1, int y1, int z1, bool ext2, int x2, int y2, int z2)
{
SHTeleporter tele1 = AddSHT(map, ext1, x1, y1, z1);
SHTeleporter tele2 = AddSHT(map, ext2, x2, y2, z2);
Link(tele1, tele2);
}
public void AddSHTCouple(bool ext1, int x1, int y1, int z1, bool ext2, int x2, int y2, int z2)
{
AddSHTCouple(Map.Trammel, ext1, x1, y1, z1, ext2, x2, y2, z2);
AddSHTCouple(Map.Felucca, ext1, x1, y1, z1, ext2, x2, y2, z2);
}
public int CreateSHTeleporters()
{
SHTeleporter tele1, tele2;
AddSHTCouple(true, 2608, 763, 0, false, 5918, 1794, 0);
AddSHTCouple(false, 5897, 1877, 0, false, 5871, 1867, 0);
AddSHTCouple(false, 5852, 1848, 0, false, 5771, 1867, 0);
tele1 = AddSHT(Map.Trammel, false, 5747, 1895, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = AddSHT(Map.Trammel, false, 5658, 1898, 0);
Link(tele1, tele2);
tele1 = AddSHT(Map.Felucca, false, 5747, 1895, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = AddSHT(Map.Felucca, false, 5658, 1898, 0);
Link(tele1, tele2);
AddSHTCouple(false, 5727, 1894, 0, false, 5756, 1794, 0);
AddSHTCouple(false, 5784, 1929, 0, false, 5700, 1929, 0);
tele1 = AddSHT(Map.Trammel, false, 5711, 1952, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = AddSHT(Map.Trammel, false, 5657, 1954, 0);
Link(tele1, tele2);
tele1 = AddSHT(Map.Felucca, false, 5711, 1952, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = AddSHT(Map.Felucca, false, 5657, 1954, 0);
Link(tele1, tele2);
tele1 = AddSHT(Map.Trammel, false, 5655, 2018, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = AddSHT(Map.Trammel, true, 1690, 2789, 0);
Link(tele1, tele2);
tele1 = AddSHT(Map.Felucca, false, 5655, 2018, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = AddSHT(Map.Felucca, true, 1690, 2789, 0);
Link(tele1, tele2);
AddSHTCouple(false, 5809, 1905, 0, false, 5876, 1891, 0);
tele1 = AddSHT(Map.Trammel, false, 5814, 2015, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = AddSHT(Map.Trammel, false, 5913, 1893, 0);
Link(tele1, tele2);
tele1 = AddSHT(Map.Felucca, false, 5814, 2015, 0);
tele1.LeftTele.TeleOffset = new Point3D(-1, 3, 0);
tele2 = AddSHT(Map.Felucca, false, 5913, 1893, 0);
Link(tele1, tele2);
AddSHTCouple(false, 5919, 2021, 0, true, 1724, 814, 0);
tele1 = AddSHT(Map.Trammel, false, 5654, 1791, 0);
tele2 = AddSHT(Map.Trammel, true, 730, 1451, 0);
Link(tele1, tele2);
AddSHT(Map.Trammel, false, 5734, 1859, 0).ChangeDest(tele2);
tele1 = AddSHT(Map.Felucca, false, 5654, 1791, 0);
tele2 = AddSHT(Map.Felucca, true, 730, 1451, 0);
Link(tele1, tele2);
AddSHT(Map.Felucca, false, 5734, 1859, 0).ChangeDest(tele2);
return m_Count;
}
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class SandstoneFireplaceEastAddon : BaseAddon
{
[Constructible]
public SandstoneFireplaceEastAddon()
{
AddComponent(new AddonComponent(0x489), 0, 0, 0);
AddComponent(new AddonComponent(0x475), 0, 1, 0);
}
public SandstoneFireplaceEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SandstoneFireplaceEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SandstoneFireplaceEastDeed : BaseAddonDeed
{
[Constructible]
public SandstoneFireplaceEastDeed()
{
}
public SandstoneFireplaceEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SandstoneFireplaceEastAddon();
public override int LabelNumber => 1061844; // sandstone fireplace (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class SandstoneFireplaceSouthAddon : BaseAddon
{
[Constructible]
public SandstoneFireplaceSouthAddon()
{
AddComponent(new AddonComponent(0x482), -1, 0, 0);
AddComponent(new AddonComponent(0x47B), 0, 0, 0);
}
public SandstoneFireplaceSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SandstoneFireplaceSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SandstoneFireplaceSouthDeed : BaseAddonDeed
{
[Constructible]
public SandstoneFireplaceSouthDeed()
{
}
public SandstoneFireplaceSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SandstoneFireplaceSouthAddon();
public override int LabelNumber => 1061845; // sandstone fireplace (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,51 @@
namespace Server.Items
{
public class SandstoneFountainAddon : BaseAddon
{
[Constructible]
public SandstoneFountainAddon()
{
int itemID = 0x19C3;
AddComponent(new AddonComponent(itemID++), -2, +1, 0);
AddComponent(new AddonComponent(itemID++), -1, +1, 0);
AddComponent(new AddonComponent(itemID++), +0, +1, 0);
AddComponent(new AddonComponent(itemID++), +1, +1, 0);
AddComponent(new AddonComponent(itemID++), +1, +0, 0);
AddComponent(new AddonComponent(itemID++), +1, -1, 0);
AddComponent(new AddonComponent(itemID++), +1, -2, 0);
AddComponent(new AddonComponent(itemID++), +0, -2, 0);
AddComponent(new AddonComponent(itemID++), +0, -1, 0);
AddComponent(new AddonComponent(itemID++), +0, +0, 0);
AddComponent(new AddonComponent(itemID++), -1, +0, 0);
AddComponent(new AddonComponent(itemID++), -2, +0, 0);
AddComponent(new AddonComponent(itemID++), -2, -1, 0);
AddComponent(new AddonComponent(itemID++), -1, -1, 0);
AddComponent(new AddonComponent(itemID++), -1, -2, 0);
AddComponent(new AddonComponent(++itemID), -2, -2, 0);
}
public SandstoneFountainAddon(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,47 @@
namespace Server.Items
{
public class SerpentPillarAddon : BaseAddon
{
[Constructible]
public SerpentPillarAddon()
{
AddComponent(new AddonComponent(9020), -2, +1, 0);
AddComponent(new AddonComponent(9021), -2, +0, 0);
AddComponent(new AddonComponent(9022), -2, -1, 0);
AddComponent(new AddonComponent(9023), -2, -2, 0);
AddComponent(new AddonComponent(9024), -1, -2, 0);
AddComponent(new AddonComponent(9025), +0, -2, 0);
AddComponent(new AddonComponent(9026), +1, -2, 0);
AddComponent(new AddonComponent(9027), -1, +1, 0);
AddComponent(new AddonComponent(9028), -1, +0, 0);
AddComponent(new AddonComponent(9029), -1, -1, 0);
AddComponent(new AddonComponent(9030), +0, +1, 0);
AddComponent(new AddonComponent(9031), +0, +0, 0);
AddComponent(new AddonComponent(9032), +0, -1, 0);
AddComponent(new AddonComponent(9033), +1, +0, 0);
AddComponent(new AddonComponent(9034), +1, -1, 0);
}
public SerpentPillarAddon(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((byte)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadByte();
}
}
}

View file

@ -0,0 +1,64 @@
using Server.Engines.Craft;
namespace Server.Items
{
public class ShrineOfWisdomAddon : BaseAddon
{
[Constructible]
public ShrineOfWisdomAddon()
{
AddComponent(new ShrineOfWisdomComponent(0x14C3), 0, 0, 0);
AddComponent(new ShrineOfWisdomComponent(0x14C6), 1, 0, 0);
AddComponent(new ShrineOfWisdomComponent(0x14D4), 0, 1, 0);
AddComponent(new ShrineOfWisdomComponent(0x14D5), 1, 1, 0);
Hue = 0x47E;
}
public ShrineOfWisdomAddon(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
[Forge]
public class ShrineOfWisdomComponent : AddonComponent
{
[Constructible]
public ShrineOfWisdomComponent(int itemID) : base(itemID)
{
}
public ShrineOfWisdomComponent(Serial serial) : base(serial)
{
}
public override int LabelNumber => 1062046; // Shrine of Wisdom
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,37 @@
namespace Server.Items
{
public class SkullPileAddon : BaseAddon
{
[Constructible]
public SkullPileAddon()
{
AddComponent(new AddonComponent(6872), 1, 1, 0);
AddComponent(new AddonComponent(6873), 0, 1, 0);
AddComponent(new AddonComponent(6874), -1, 1, 0);
AddComponent(new AddonComponent(6875), 0, 0, 0);
AddComponent(new AddonComponent(6876), 1, 0, 0);
AddComponent(new AddonComponent(6877), 1, -1, 0);
AddComponent(new AddonComponent(6878), 2, -1, 0);
AddComponent(new AddonComponent(6879), 2, 0, 0);
}
public SkullPileAddon(Serial serial)
: base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write((byte)0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadByte();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class SmallBedEastAddon : BaseAddon
{
[Constructible]
public SmallBedEastAddon()
{
AddComponent(new AddonComponent(0xA5D), 0, 0, 0);
AddComponent(new AddonComponent(0xA62), 1, 0, 0);
}
public SmallBedEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SmallBedEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SmallBedEastDeed : BaseAddonDeed
{
[Constructible]
public SmallBedEastDeed()
{
}
public SmallBedEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SmallBedEastAddon();
public override int LabelNumber => 1044322; // small bed (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class SmallBedSouthAddon : BaseAddon
{
[Constructible]
public SmallBedSouthAddon()
{
AddComponent(new AddonComponent(0xA63), 0, 0, 0);
AddComponent(new AddonComponent(0xA5C), 0, 1, 0);
}
public SmallBedSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SmallBedSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SmallBedSouthDeed : BaseAddonDeed
{
[Constructible]
public SmallBedSouthDeed()
{
}
public SmallBedSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SmallBedSouthAddon();
public override int LabelNumber => 1044321; // small bed (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class SmallForgeAddon : BaseAddon
{
[Constructible]
public SmallForgeAddon()
{
AddComponent(new ForgeComponent(0xFB1), 0, 0, 0);
}
public SmallForgeAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SmallForgeDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SmallForgeDeed : BaseAddonDeed
{
[Constructible]
public SmallForgeDeed()
{
}
public SmallForgeDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SmallForgeAddon();
public override int LabelNumber => 1044330; // small forge
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,169 @@
using System.Collections.Generic;
using Server.Mobiles;
using Server.Network;
using Server.Spells;
namespace Server.Items
{
public class SolenAntHoleComponent : AddonComponent
{
public SolenAntHoleComponent(int itemID) : base(itemID)
{
}
public SolenAntHoleComponent(Serial serial) : base(serial)
{
}
public override void OnDoubleClick(Mobile from)
{
if (from.InRange(this, 2))
{
Map map = Map;
if (map == Map.Trammel || map == Map.Felucca)
{
from.MoveToWorld(new Point3D(5922, 2024, 0), map);
PublicOverheadMessage(MessageType.Regular, 0x3B2, true,
$"* {from.Name} dives into the hole and disappears!*");
}
}
else
{
from.LocalOverheadMessage(MessageType.Regular, 0x3B2, 1019045); // I can't reach that.
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class SolenAntHole : BaseAddon
{
private List<Mobile> m_Spawned;
[Constructible]
public SolenAntHole()
{
m_Spawned = new List<Mobile>();
AddComponent(new AddonComponent(0x914), "dirt", 0, 0, 0, 0);
AddComponent(new SolenAntHoleComponent(0x122A), "a hole", 0x1, 0, 0, 0);
AddComponent(new AddonComponent(0x1B23), "dirt", 0x970, 1, 1, 0);
AddComponent(new AddonComponent(0xEE0), "dirt", 0, 1, 0, 0);
AddComponent(new AddonComponent(0x1B24), "dirt", 0x970, 1, -1, 0);
AddComponent(new AddonComponent(0xEE1), "dirt", 0, 0, -1, 0);
AddComponent(new AddonComponent(0x1B25), "dirt", 0x970, -1, -1, 0);
AddComponent(new AddonComponent(0xEE2), "dirt", 0, -1, 0, 0);
AddComponent(new AddonComponent(0x1B26), "dirt", 0x970, -1, 1, 0);
AddComponent(new AddonComponent(0xED3), "dirt", 0, 0, 1, 0);
}
public SolenAntHole(Serial serial) : base(serial)
{
}
public override bool ShareHue => false;
public override bool HandlesOnMovement => true;
public override void OnMovement(Mobile m, Point3D oldLocation)
{
if (!m.Player || !m.Alive || m.Hidden || !SpawnKilled())
return;
if (Utility.InRange(Location, m.Location, 3) && !Utility.InRange(Location, oldLocation, 3))
{
int count = 1 + Utility.Random(4);
for (int i = 0; i < count; i++)
SpawnAnt();
if (0.05 > Utility.RandomDouble())
SpawnAnt(new Beetle());
}
}
public void AddComponent(AddonComponent c, string name, int hue, int x, int y, int z)
{
c.Hue = hue;
c.Name = name;
AddComponent(c, x, y, z);
}
public void SpawnAnt()
{
int random = Utility.Random(3);
Map map = Map;
if (map == Map.Trammel)
{
if (random < 2)
SpawnAnt(new RedSolenWorker());
else
SpawnAnt(new RedSolenWarrior());
}
else if (map == Map.Felucca)
{
if (random < 2)
SpawnAnt(new BlackSolenWorker());
else
SpawnAnt(new BlackSolenWarrior());
}
}
public void SpawnAnt(BaseCreature ant)
{
m_Spawned.Add(ant);
Map map = Map;
Point3D p = Location;
for (int i = 0; i < 5; i++)
if (SpellHelper.FindValidSpawnLocation(map, ref p, false))
break;
ant.MoveToWorld(p, map);
ant.Home = Location;
ant.RangeHome = 10;
}
public bool SpawnKilled()
{
for (int i = m_Spawned.Count - 1; i >= 0; i--)
if (!m_Spawned[i].Alive || m_Spawned[i].Deleted)
m_Spawned.RemoveAt(i);
return m_Spawned.Count < 2;
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
writer.WriteMobileList(m_Spawned);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
m_Spawned = reader.ReadStrongMobileList<Mobile>();
}
}
}

View file

@ -0,0 +1,147 @@
using System;
namespace Server.Items
{
public delegate void SpinCallback(ISpinningWheel sender, Mobile from, int hue);
public interface ISpinningWheel
{
bool Spinning{ get; }
void BeginSpin(SpinCallback callback, Mobile from, int hue);
}
public class SpinningwheelEastAddon : BaseAddon, ISpinningWheel
{
private Timer m_Timer;
[Constructible]
public SpinningwheelEastAddon()
{
AddComponent(new AddonComponent(0x1019), 0, 0, 0);
}
public SpinningwheelEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SpinningwheelEastDeed();
public bool Spinning => m_Timer != null;
public void BeginSpin(SpinCallback callback, Mobile from, int hue)
{
m_Timer = new SpinTimer(this, callback, from, hue);
m_Timer.Start();
foreach (AddonComponent c in Components)
switch (c.ItemID)
{
case 0x1015:
case 0x1019:
case 0x101C:
case 0x10A4:
++c.ItemID;
break;
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
public override void OnComponentLoaded(AddonComponent c)
{
switch (c.ItemID)
{
case 0x1016:
case 0x101A:
case 0x101D:
case 0x10A5:
--c.ItemID;
break;
}
}
public void EndSpin(SpinCallback callback, Mobile from, int hue)
{
m_Timer?.Stop();
m_Timer = null;
foreach (AddonComponent c in Components)
switch (c.ItemID)
{
case 0x1016:
case 0x101A:
case 0x101D:
case 0x10A5:
--c.ItemID;
break;
}
callback?.Invoke(this, from, hue);
}
private class SpinTimer : Timer
{
private SpinCallback m_Callback;
private Mobile m_From;
private int m_Hue;
private SpinningwheelEastAddon m_Wheel;
public SpinTimer(SpinningwheelEastAddon wheel, SpinCallback callback, Mobile from, int hue) : base(
TimeSpan.FromSeconds(3.0))
{
m_Wheel = wheel;
m_Callback = callback;
m_From = from;
m_Hue = hue;
Priority = TimerPriority.TwoFiftyMS;
}
protected override void OnTick()
{
m_Wheel.EndSpin(m_Callback, m_From, m_Hue);
}
}
}
public class SpinningwheelEastDeed : BaseAddonDeed
{
[Constructible]
public SpinningwheelEastDeed()
{
}
public SpinningwheelEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SpinningwheelEastAddon();
public override int LabelNumber => 1044341; // spining wheel (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,139 @@
using System;
namespace Server.Items
{
public class SpinningwheelSouthAddon : BaseAddon, ISpinningWheel
{
private Timer m_Timer;
[Constructible]
public SpinningwheelSouthAddon()
{
AddComponent(new AddonComponent(0x1015), 0, 0, 0);
}
public SpinningwheelSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SpinningwheelSouthDeed();
public bool Spinning => m_Timer != null;
public void BeginSpin(SpinCallback callback, Mobile from, int hue)
{
m_Timer = new SpinTimer(this, callback, from, hue);
m_Timer.Start();
foreach (AddonComponent c in Components)
switch (c.ItemID)
{
case 0x1015:
case 0x1019:
case 0x101C:
case 0x10A4:
++c.ItemID;
break;
}
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
public override void OnComponentLoaded(AddonComponent c)
{
switch (c.ItemID)
{
case 0x1016:
case 0x101A:
case 0x101D:
case 0x10A5:
--c.ItemID;
break;
}
}
public void EndSpin(SpinCallback callback, Mobile from, int hue)
{
m_Timer?.Stop();
m_Timer = null;
foreach (AddonComponent c in Components)
switch (c.ItemID)
{
case 0x1016:
case 0x101A:
case 0x101D:
case 0x10A5:
--c.ItemID;
break;
}
callback?.Invoke(this, from, hue);
}
private class SpinTimer : Timer
{
private SpinCallback m_Callback;
private Mobile m_From;
private int m_Hue;
private SpinningwheelSouthAddon m_Wheel;
public SpinTimer(SpinningwheelSouthAddon wheel, SpinCallback callback, Mobile from, int hue) : base(
TimeSpan.FromSeconds(3.0))
{
m_Wheel = wheel;
m_Callback = callback;
m_From = from;
m_Hue = hue;
Priority = TimerPriority.TwoFiftyMS;
}
protected override void OnTick()
{
m_Wheel.EndSpin(m_Callback, m_From, m_Hue);
}
}
}
public class SpinningwheelSouthDeed : BaseAddonDeed
{
[Constructible]
public SpinningwheelSouthDeed()
{
}
public SpinningwheelSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SpinningwheelSouthAddon();
public override int LabelNumber => 1044342; // spining wheel (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class SquirrelStatueEastAddon : BaseAddon
{
[Constructible]
public SquirrelStatueEastAddon()
{
AddComponent(new AddonComponent(0x2D10), 0, 0, 0);
}
public SquirrelStatueEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SquirrelStatueEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class SquirrelStatueEastDeed : BaseAddonDeed
{
[Constructible]
public SquirrelStatueEastDeed()
{
}
public SquirrelStatueEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SquirrelStatueEastAddon();
public override int LabelNumber => 1073398; // squirrel statue (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class SquirrelStatueSouthAddon : BaseAddon
{
[Constructible]
public SquirrelStatueSouthAddon()
{
AddComponent(new AddonComponent(0x2D11), 0, 0, 0);
}
public SquirrelStatueSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SquirrelStatueSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class SquirrelStatueSouthDeed : BaseAddonDeed
{
[Constructible]
public SquirrelStatueSouthDeed()
{
}
public SquirrelStatueSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SquirrelStatueSouthAddon();
public override int LabelNumber => 1072884; // squirrel statue (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class StoneFireplaceEastAddon : BaseAddon
{
[Constructible]
public StoneFireplaceEastAddon()
{
AddComponent(new AddonComponent(0x959), 0, 0, 0);
AddComponent(new AddonComponent(0x953), 0, 1, 0);
}
public StoneFireplaceEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new StoneFireplaceEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class StoneFireplaceEastDeed : BaseAddonDeed
{
[Constructible]
public StoneFireplaceEastDeed()
{
}
public StoneFireplaceEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new StoneFireplaceEastAddon();
public override int LabelNumber => 1061848; // stone fireplace (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class StoneFireplaceSouthAddon : BaseAddon
{
[Constructible]
public StoneFireplaceSouthAddon()
{
AddComponent(new AddonComponent(0x967), -1, 0, 0);
AddComponent(new AddonComponent(0x961), 0, 0, 0);
}
public StoneFireplaceSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new StoneFireplaceSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class StoneFireplaceSouthDeed : BaseAddonDeed
{
[Constructible]
public StoneFireplaceSouthDeed()
{
}
public StoneFireplaceSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new StoneFireplaceSouthAddon();
public override int LabelNumber => 1061849; // stone fireplace (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,51 @@
namespace Server.Items
{
public class StoneFountainAddon : BaseAddon
{
[Constructible]
public StoneFountainAddon()
{
int itemID = 0x1731;
AddComponent(new AddonComponent(itemID++), -2, +1, 0);
AddComponent(new AddonComponent(itemID++), -1, +1, 0);
AddComponent(new AddonComponent(itemID++), +0, +1, 0);
AddComponent(new AddonComponent(itemID++), +1, +1, 0);
AddComponent(new AddonComponent(itemID++), +1, +0, 0);
AddComponent(new AddonComponent(itemID++), +1, -1, 0);
AddComponent(new AddonComponent(itemID++), +1, -2, 0);
AddComponent(new AddonComponent(itemID++), +0, -2, 0);
AddComponent(new AddonComponent(itemID++), +0, -1, 0);
AddComponent(new AddonComponent(itemID++), +0, +0, 0);
AddComponent(new AddonComponent(itemID++), -1, +0, 0);
AddComponent(new AddonComponent(itemID++), -2, +0, 0);
AddComponent(new AddonComponent(itemID++), -2, -1, 0);
AddComponent(new AddonComponent(itemID++), -1, -1, 0);
AddComponent(new AddonComponent(itemID++), -1, -2, 0);
AddComponent(new AddonComponent(++itemID), -2, -2, 0);
}
public StoneFountainAddon(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class StoneOvenEastAddon : BaseAddon
{
[Constructible]
public StoneOvenEastAddon()
{
AddComponent(new AddonComponent(0x92C), 0, 0, 0);
AddComponent(new AddonComponent(0x92B), 0, 1, 0);
}
public StoneOvenEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new StoneOvenEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class StoneOvenEastDeed : BaseAddonDeed
{
[Constructible]
public StoneOvenEastDeed()
{
}
public StoneOvenEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new StoneOvenEastAddon();
public override int LabelNumber => 1044345; // stone oven (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,61 @@
namespace Server.Items
{
public class StoneOvenSouthAddon : BaseAddon
{
[Constructible]
public StoneOvenSouthAddon()
{
AddComponent(new AddonComponent(0x931), -1, 0, 0);
AddComponent(new AddonComponent(0x930), 0, 0, 0);
}
public StoneOvenSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new StoneOvenSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class StoneOvenSouthDeed : BaseAddonDeed
{
[Constructible]
public StoneOvenSouthDeed()
{
}
public StoneOvenSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new StoneOvenSouthAddon();
public override int LabelNumber => 1044346; // stone oven (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,234 @@
namespace Server.Items
{
public class SmallStretchedHideEastAddon : BaseAddon
{
[Constructible]
public SmallStretchedHideEastAddon()
{
AddComponent(new AddonComponent(0x1069), 0, 0, 0);
}
public SmallStretchedHideEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SmallStretchedHideEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SmallStretchedHideEastDeed : BaseAddonDeed
{
[Constructible]
public SmallStretchedHideEastDeed()
{
}
public SmallStretchedHideEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SmallStretchedHideEastAddon();
public override int LabelNumber => 1049401; // a small stretched hide deed facing east
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SmallStretchedHideSouthAddon : BaseAddon
{
[Constructible]
public SmallStretchedHideSouthAddon()
{
AddComponent(new AddonComponent(0x107A), 0, 0, 0);
}
public SmallStretchedHideSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new SmallStretchedHideSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class SmallStretchedHideSouthDeed : BaseAddonDeed
{
[Constructible]
public SmallStretchedHideSouthDeed()
{
}
public SmallStretchedHideSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new SmallStretchedHideSouthAddon();
public override int LabelNumber => 1049402; // a small stretched hide deed facing south
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class MediumStretchedHideEastAddon : BaseAddon
{
[Constructible]
public MediumStretchedHideEastAddon()
{
AddComponent(new AddonComponent(0x106B), 0, 0, 0);
}
public MediumStretchedHideEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new MediumStretchedHideEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class MediumStretchedHideEastDeed : BaseAddonDeed
{
[Constructible]
public MediumStretchedHideEastDeed()
{
}
public MediumStretchedHideEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new MediumStretchedHideEastAddon();
public override int LabelNumber => 1049403; // a medium stretched hide deed facing east
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class MediumStretchedHideSouthAddon : BaseAddon
{
[Constructible]
public MediumStretchedHideSouthAddon()
{
AddComponent(new AddonComponent(0x107C), 0, 0, 0);
}
public MediumStretchedHideSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new MediumStretchedHideSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class MediumStretchedHideSouthDeed : BaseAddonDeed
{
[Constructible]
public MediumStretchedHideSouthDeed()
{
}
public MediumStretchedHideSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new MediumStretchedHideSouthAddon();
public override int LabelNumber => 1049404; // a medium stretched hide deed facing south
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,63 @@
namespace Server.Items
{
public class TallElvenBedEastAddon : BaseAddon
{
[Constructible]
public TallElvenBedEastAddon()
{
AddComponent(new AddonComponent(0x3054), 0, 0, 0);
AddComponent(new AddonComponent(0x3053), 1, 0, 0);
AddComponent(new AddonComponent(0x3055), 2, -1, 0);
AddComponent(new AddonComponent(0x3052), 2, 0, 0);
}
public TallElvenBedEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new TallElvenBedEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class TallElvenBedEastDeed : BaseAddonDeed
{
[Constructible]
public TallElvenBedEastDeed()
{
}
public TallElvenBedEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new TallElvenBedEastAddon();
public override int LabelNumber => 1072859; // tall elven bed (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,63 @@
namespace Server.Items
{
public class TallElvenBedSouthAddon : BaseAddon
{
[Constructible]
public TallElvenBedSouthAddon()
{
AddComponent(new AddonComponent(0x3058), 0, 0, 0); // angolo alto sx
AddComponent(new AddonComponent(0x3057), -1, 1, 0); // angolo basso sx
AddComponent(new AddonComponent(0x3059), 0, -1, 0); // angolo alto dx
AddComponent(new AddonComponent(0x3056), 0, 1, 0); // angolo basso dx
}
public TallElvenBedSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new TallElvenBedSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class TallElvenBedSouthDeed : BaseAddonDeed
{
[Constructible]
public TallElvenBedSouthDeed()
{
}
public TallElvenBedSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new TallElvenBedSouthAddon();
public override int LabelNumber => 1072858; // tall elven bed (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,103 @@
namespace Server.Items
{
public class Telescope : BaseAddon
{
[Constructible]
public Telescope()
{
AddComponent(new AddonComponent(0x1494), 0, 5, 0);
AddComponent(new AddonComponent(0x145B), 0, 6, 0);
AddComponent(new AddonComponent(0x145A), 0, 7, 0);
AddComponent(new AddonComponent(0x1495), 1, 4, 0);
AddComponent(new AddonComponent(0x145C), 1, 7, 0);
AddComponent(new AddonComponent(0x145D), 1, 8, 0);
AddComponent(new AddonComponent(0x1496), 2, 3, 0);
AddComponent(new AddonComponent(0x1499), 2, 4, 0);
AddComponent(new AddonComponent(0x148E), 2, 6, 0);
AddComponent(new AddonComponent(0x1493), 2, 7, 0);
AddComponent(new AddonComponent(0x1492), 2, 8, 0);
AddComponent(new AddonComponent(0x145E), 2, 9, 0);
AddComponent(new AddonComponent(0x1459), 2, 10, 0);
AddComponent(new AddonComponent(0x1497), 3, 2, 0);
AddComponent(new AddonComponent(0x145F), 3, 9, 0);
AddComponent(new AddonComponent(0x1461), 3, 10, 0);
AddComponent(new AddonComponent(0x149A), 4, 1, 0);
AddComponent(new AddonComponent(0x1498), 4, 2, 0);
AddComponent(new AddonComponent(0x148F), 4, 4, 0);
AddComponent(new AddonComponent(0x148D), 4, 6, 0);
AddComponent(new AddonComponent(0x1488), 4, 8, 0);
AddComponent(new AddonComponent(0x1460), 4, 9, 0);
AddComponent(new AddonComponent(0x1462), 4, 10, 0);
AddComponent(new AddonComponent(0x147D), 5, 0, 0);
AddComponent(new AddonComponent(0x1490), 5, 4, 0);
AddComponent(new AddonComponent(0x148B), 5, 5, 0);
AddComponent(new AddonComponent(0x148A), 5, 6, 0);
AddComponent(new AddonComponent(0x1486), 5, 7, 0);
AddComponent(new AddonComponent(0x1485), 5, 8, 0);
AddComponent(new AddonComponent(0x147C), 6, 0, 0);
AddComponent(new AddonComponent(0x1491), 6, 4, 0);
AddComponent(new AddonComponent(0x148C), 6, 5, 0);
AddComponent(new AddonComponent(0x1489), 6, 6, 0);
AddComponent(new AddonComponent(0x1487), 6, 7, 0);
AddComponent(new AddonComponent(0x1484), 6, 8, 0);
AddComponent(new AddonComponent(0x1463), 6, 10, 0);
AddComponent(new AddonComponent(0x147B), 7, 0, 0);
AddComponent(new AddonComponent(0x147F), 7, 3, 0);
AddComponent(new AddonComponent(0x1480), 7, 4, 0);
AddComponent(new AddonComponent(0x1482), 7, 5, 0);
AddComponent(new AddonComponent(0x1469), 7, 6, 0);
AddComponent(new AddonComponent(0x1468), 7, 7, 0);
AddComponent(new AddonComponent(0x1465), 7, 8, 0);
AddComponent(new AddonComponent(0x1464), 7, 9, 0);
AddComponent(new AddonComponent(0x147A), 8, 0, 0);
AddComponent(new AddonComponent(0x1479), 8, 1, 0);
AddComponent(new AddonComponent(0x1477), 8, 2, 0);
AddComponent(new AddonComponent(0x147E), 8, 3, 0);
AddComponent(new AddonComponent(0x1481), 8, 4, 0);
AddComponent(new AddonComponent(0x1483), 8, 5, 0);
AddComponent(new AddonComponent(0x146A), 8, 6, 0);
AddComponent(new AddonComponent(0x1467), 8, 7, 0);
AddComponent(new AddonComponent(0x1466), 8, 8, 0);
AddComponent(new AddonComponent(0x1478), 9, 1, 0);
AddComponent(new AddonComponent(0x1475), 9, 2, 0);
AddComponent(new AddonComponent(0x1474), 9, 3, 0);
AddComponent(new AddonComponent(0x146F), 9, 4, 0);
AddComponent(new AddonComponent(0x146E), 9, 5, 0);
AddComponent(new AddonComponent(0x146D), 9, 6, 0);
AddComponent(new AddonComponent(0x146B), 9, 7, 0);
AddComponent(new AddonComponent(0x1476), 10, 2, 0);
AddComponent(new AddonComponent(0x1473), 10, 3, 0);
AddComponent(new AddonComponent(0x1470), 10, 4, 0);
AddComponent(new AddonComponent(0x1471), 10, 5, 0);
AddComponent(new AddonComponent(0x1472), 10, 6, 0);
}
public Telescope(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,263 @@
using System;
namespace Server.Items
{
[Flippable(0x1070, 0x1074)]
public class TrainingDummy : AddonComponent
{
private Timer m_Timer;
[Constructible]
public TrainingDummy(int itemID = 0x1074) : base(itemID)
{
MinSkill = -25.0;
MaxSkill = +25.0;
}
public TrainingDummy(Serial serial) : base(serial)
{
}
[CommandProperty(AccessLevel.GameMaster)]
public double MinSkill{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public double MaxSkill{ get; set; }
[CommandProperty(AccessLevel.GameMaster)]
public bool Swinging => m_Timer != null;
public void UpdateItemID()
{
int baseItemID = ItemID / 2 * 2;
ItemID = baseItemID + (Swinging ? 1 : 0);
}
public void BeginSwing()
{
m_Timer?.Stop();
m_Timer = new InternalTimer(this);
m_Timer.Start();
}
public void EndSwing()
{
m_Timer?.Stop();
m_Timer = null;
UpdateItemID();
}
public void OnHit()
{
UpdateItemID();
Effects.PlaySound(GetWorldLocation(), Map, Utility.RandomList(0x3A4, 0x3A6, 0x3A9, 0x3AE, 0x3B4, 0x3B6));
}
public void Use(Mobile from, BaseWeapon weapon)
{
BeginSwing();
from.Direction = from.GetDirectionTo(GetWorldLocation());
weapon.PlaySwingAnimation(from);
from.CheckSkill(weapon.Skill, MinSkill, MaxSkill);
}
public override void OnDoubleClick(Mobile from)
{
BaseWeapon weapon = from.Weapon as BaseWeapon;
if (weapon is BaseRanged)
SendLocalizedMessageTo(from, 501822); // You can't practice ranged weapons on this.
else if (weapon == null || !from.InRange(GetWorldLocation(), weapon.MaxRange))
SendLocalizedMessageTo(from, 501816); // You are too far away to do that.
else if (Swinging)
SendLocalizedMessageTo(from, 501815); // You have to wait until it stops swinging.
else if (from.Skills[weapon.Skill].Base >= MaxSkill)
SendLocalizedMessageTo(from,
501828); // Your skill cannot improve any further by simply practicing with a dummy.
else if (from.Mounted)
SendLocalizedMessageTo(from, 501829); // You can't practice on this while on a mount.
else
Use(from, weapon);
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0);
writer.Write(MinSkill);
writer.Write(MaxSkill);
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
switch (version)
{
case 0:
{
MinSkill = reader.ReadDouble();
MaxSkill = reader.ReadDouble();
if (MinSkill == 0.0 && MaxSkill == 30.0)
{
MinSkill = -25.0;
MaxSkill = +25.0;
}
break;
}
}
UpdateItemID();
}
private class InternalTimer : Timer
{
private bool m_Delay = true;
private TrainingDummy m_Dummy;
public InternalTimer(TrainingDummy dummy) : base(TimeSpan.FromSeconds(0.25), TimeSpan.FromSeconds(2.75))
{
m_Dummy = dummy;
Priority = TimerPriority.FiftyMS;
}
protected override void OnTick()
{
if (m_Delay)
m_Dummy.OnHit();
else
m_Dummy.EndSwing();
m_Delay = !m_Delay;
}
}
}
public class TrainingDummyEastAddon : BaseAddon
{
[Constructible]
public TrainingDummyEastAddon()
{
AddComponent(new TrainingDummy(), 0, 0, 0);
}
public TrainingDummyEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new TrainingDummyEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class TrainingDummyEastDeed : BaseAddonDeed
{
[Constructible]
public TrainingDummyEastDeed()
{
}
public TrainingDummyEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new TrainingDummyEastAddon();
public override int LabelNumber => 1044335; // training dummy (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class TrainingDummySouthAddon : BaseAddon
{
[Constructible]
public TrainingDummySouthAddon()
{
AddComponent(new TrainingDummy(0x1070), 0, 0, 0);
}
public TrainingDummySouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new TrainingDummySouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class TrainingDummySouthDeed : BaseAddonDeed
{
[Constructible]
public TrainingDummySouthDeed()
{
}
public TrainingDummySouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new TrainingDummySouthAddon();
public override int LabelNumber => 1044336; // training dummy (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class WarriorStatueEastAddon : BaseAddon
{
[Constructible]
public WarriorStatueEastAddon()
{
AddComponent(new AddonComponent(0x2D12), 0, 0, 0);
}
public WarriorStatueEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new WarriorStatueEastDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class WarriorStatueEastDeed : BaseAddonDeed
{
[Constructible]
public WarriorStatueEastDeed()
{
}
public WarriorStatueEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new WarriorStatueEastAddon();
public override int LabelNumber => 1072888; // warrior statue (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,60 @@
namespace Server.Items
{
public class WarriorStatueSouthAddon : BaseAddon
{
[Constructible]
public WarriorStatueSouthAddon()
{
AddComponent(new AddonComponent(0x2D13), 0, 0, 0);
}
public WarriorStatueSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new WarriorStatueSouthDeed();
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class WarriorStatueSouthDeed : BaseAddonDeed
{
[Constructible]
public WarriorStatueSouthDeed()
{
}
public WarriorStatueSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new WarriorStatueSouthAddon();
public override int LabelNumber => 1072887; // warrior statue (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}

View file

@ -0,0 +1,67 @@
namespace Server.Items
{
public class WaterTroughEastAddon : BaseAddon, IWaterSource
{
[Constructible]
public WaterTroughEastAddon()
{
AddComponent(new AddonComponent(0xB41), 0, 0, 0);
AddComponent(new AddonComponent(0xB42), 0, 1, 0);
}
public WaterTroughEastAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new WaterTroughEastDeed();
int IHasQuantity.Quantity
{
get => 500;
set { }
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class WaterTroughEastDeed : BaseAddonDeed
{
[Constructible]
public WaterTroughEastDeed()
{
}
public WaterTroughEastDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new WaterTroughEastAddon();
public override int LabelNumber => 1044349; // water trough (east)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,67 @@
namespace Server.Items
{
public class WaterTroughSouthAddon : BaseAddon, IWaterSource
{
[Constructible]
public WaterTroughSouthAddon()
{
AddComponent(new AddonComponent(0xB43), 0, 0, 0);
AddComponent(new AddonComponent(0xB44), 1, 0, 0);
}
public WaterTroughSouthAddon(Serial serial) : base(serial)
{
}
public override BaseAddonDeed Deed => new WaterTroughSouthDeed();
int IHasQuantity.Quantity
{
get => 500;
set { }
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
public class WaterTroughSouthDeed : BaseAddonDeed
{
[Constructible]
public WaterTroughSouthDeed()
{
}
public WaterTroughSouthDeed(Serial serial) : base(serial)
{
}
public override BaseAddon Addon => new WaterTroughSouthAddon();
public override int LabelNumber => 1044350; // water trough (south)
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.Write(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadInt();
}
}
}

View file

@ -0,0 +1,84 @@
namespace Server.Items
{
public class WaterVatEast : BaseAddon
{
[Constructible]
public WaterVatEast()
{
AddComponent(new AddonComponent(0x1558), 0, 0, 0);
AddComponent(new AddonComponent(0x14DE), -1, 1, 0);
AddComponent(new AddonComponent(0x1552), 0, 1, 0);
AddComponent(new AddonComponent(0x14DF), 1, -1, 0);
AddComponent(new AddonComponent(0x1554), 1, 0, 0);
AddComponent(new AddonComponent(0x1559), 1, 1, 0);
AddComponent(new AddonComponent(0x1550), 1, 3, 0);
AddComponent(new AddonComponent(0x1555), 3, 1, 0);
AddComponent(new AddonComponent(0x14D7), 2, 2, 0);
// Blockers
AddComponent(new AddonComponent(0x21A4), 2, -1, 0);
AddComponent(new AddonComponent(0x21A4), 3, 0, 0);
AddComponent(new AddonComponent(0x21A4), -1, 2, 0);
AddComponent(new AddonComponent(0x21A4), 0, 3, 0);
}
public WaterVatEast(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
public class WaterVatSouth : BaseAddon
{
[Constructible]
public WaterVatSouth()
{
AddComponent(new AddonComponent(0x1558), 0, 0, 0);
AddComponent(new AddonComponent(0x14DE), -1, 1, 0);
AddComponent(new AddonComponent(0x1552), 0, 1, 0);
AddComponent(new AddonComponent(0x14DF), 1, -1, 0);
AddComponent(new AddonComponent(0x1554), 1, 0, 0);
AddComponent(new AddonComponent(0x1559), 1, 1, 0);
AddComponent(new AddonComponent(0x1551), 1, 3, 0);
AddComponent(new AddonComponent(0x1556), 3, 1, 0);
AddComponent(new AddonComponent(0x14D7), 2, 2, 0);
// Blockers
AddComponent(new AddonComponent(0x21A4), 2, -1, 0);
AddComponent(new AddonComponent(0x21A4), 3, 0, 0);
AddComponent(new AddonComponent(0x21A4), -1, 2, 0);
AddComponent(new AddonComponent(0x21A4), 0, 3, 0);
}
public WaterVatSouth(Serial serial) : base(serial)
{
}
public override void Serialize(GenericWriter writer)
{
base.Serialize(writer);
writer.WriteEncodedInt(0); // version
}
public override void Deserialize(GenericReader reader)
{
base.Deserialize(reader);
int version = reader.ReadEncodedInt();
}
}
}