context: #region References
  using Server.ContextMenus;
  using Server.Engines.Craft;
  using Server.Network;
  using System;
  using System.Collections.Generic;
  #endregion
  
  namespace Server.Items
  {
      [Anvil]
      public class AnvilComponent : AddonComponent
      {
          [Constructable]
          public AnvilComponent(int itemID)
              : base(itemID)
          { }
  
          public AnvilComponent(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);
  
              reader.ReadInt();
          }
      }
  
      [Forge]
      public class ForgeComponent : AddonComponent
      {
          [Constructable]
          public ForgeComponent(int itemID)
              : base(itemID)
          { }
  
          public ForgeComponent(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);
  
              reader.ReadInt();
          }
      }
  
      public class LocalizedAddonComponent : AddonComponent
      {
          private int m_LabelNumber;
  
          [Constructable]
          public LocalizedAddonComponent(int itemID, int labelNumber)
              : base(itemID)
          {
              m_LabelNumber = labelNumber;
          }
  
          public LocalizedAddonComponent(Serial serial)
              : base(serial)
          { }
  
          [CommandProperty(AccessLevel.GameMaster)]
          public int Number
          {
              get { return 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
      {
          public override bool ForceShowProperties => Addon != null && Addon.ForceShowProperties;
  
          private static readonly 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)
          };
  
          [Constructable]
          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 { return base.Hue; }
              set
              {
                  base.Hue = value;
  
                  if (Addon != null && Addon.ShareHue)
                      Addon.Hue = value;
              }
          }
  
          public virtual bool NeedsWall => false;
          public virtual Point3D WallPosition => Point3D.Zero;
  
          public static void ApplyLightTo(Item item)
          {
              if ((item.ItemData.Flags & TileFlag.LightSource) == 0)
                  return; // not a light source
  
              int itemID = item.ItemID;
  
              foreach (LightEntry entry in m_Entries)
              {
                  int[] toMatch = entry.m_ItemIDs;
                  bool contains = false;
  
  
gt:                 for (int j = 0; !contains && j < toMatch.Length; ++j)