context: using Server.Engines.VeteranRewards;
  using Server.Gumps;
  using Server.Multis;
  using Server.Network;
  using System;
  
  namespace Server.Items
  {
      public enum MonsterStatuetteType
      {
          Crocodile,
          Daemon,
          Dragon,
          EarthElemental,
          Ettin,
          Gargoyle,
          Gorilla,
          Lich,
          Lizardman,
          Ogre,
          Orc,
          Ratman,
          Skeleton,
          Troll,
          Cow,
          Zombie,
          Llama,
          Ophidian,
          Reaper,
          Mongbat,
          Gazer,
          FireElemental,
          Wolf,
          PhillipsWoodenSteed,
          Seahorse,
          Harrower,
          Efreet,
          Slime,
          PlagueBeast,
          RedDeath,
          Spider,
          OphidianArchMage,
          OphidianWarrior,
          OphidianKnight,
          OphidianMage,
          DreadHorn,
          Minotaur,
          BlackCat,
          HalloweenGhoul,
          SherryTheMouse,
          SlasherOfVeils,
          StygianDragon,
          Medusa,
          PrimevalLich,
          AbyssalInfernal,
          ArchDemon,
          FireAnt,
          Navrey,
          DragonTurtle,
          TigerCub,
          SakkhranBirdOfPrey,
          Exodus,
          TerathanMatriarch,
          FleshRenderer,
          CrystalElemental,
          DarkFather,
          PlatinumDragon,
          TRex,
          Zipactriotal,
          MyrmidexQueen,
          Virtuebane,
          GreyGoblin,
          GreenGoblin,
          Pyros,
          Lithos,
          Hydros,
          Stratos,
          Santa,
          Krampus,
          KhalAnkur,
          KrampusMinion,
          Horse,
          Pig,
          Goat,
          IceFiend
      }
  
      public class MonsterStatuetteInfo
      {
          public static MonsterStatuetteInfo[] Table => m_Table;
  
          private static readonly MonsterStatuetteInfo[] m_Table = new MonsterStatuetteInfo[]
          {
              /* Crocodile */			new MonsterStatuetteInfo(1041249, 0x20DA, 660),
              /* Daemon */			new MonsterStatuetteInfo(1041250, 0x20D3, 357),
              /* Dragon */			new MonsterStatuetteInfo(1041251, 0x20D6, 362),
              /* EarthElemental */	new MonsterStatuetteInfo(1041252, 0x20D7, 268),
              /* Ettin */			    new MonsterStatuetteInfo(1041253, 0x20D8, 367),
              /* Gargoyle */			new MonsterStatuetteInfo(1041254, 0x20D9, 372),
              /* Gorilla */			new MonsterStatuetteInfo(1041255, 0x20F5, 158),
              /* Lich */			    new MonsterStatuetteInfo(1041256, 0x20F8, 1001),
              /* Lizardman */			new MonsterStatuetteInfo(1041257, 0x20DE, 417),
              /* Ogre */			    new MonsterStatuetteInfo(1041258, 0x20DF, 427),
              /* Orc */			    new MonsterStatuetteInfo(1041259, 0x20E0, 1114),
              /* Ratman */			new MonsterStatuetteInfo(1041260, 0x20E3, 437),
              /* Skeleton */			new MonsterStatuetteInfo(1041261, 0x20E7, 1165),
              /* Troll */		    	new MonsterStatuetteInfo(1041262, 0x20E9, 461),
              /* Cow */			    new MonsterStatuetteInfo(1041263, 0x2103, 120),
              /* Zombie */			new MonsterStatuetteInfo(1041264, 0x20EC, 471),
              /* Llama */			    new MonsterStatuetteInfo(1041265, 0x20F6, 1011),
              /* Ophidian */			new MonsterStatuetteInfo(1049742, 0x2133, 634),
              /* Reaper */			new MonsterStatuetteInfo(1049743, 0x20FA, 442),
              /* Mongbat */			new MonsterStatuetteInfo(1049744, 0x20F9, 422),
              /* Gazer */			    new MonsterStatuetteInfo(1049768, 0x20F4, 377),
              /* FireElemental */		new MonsterStatuetteInfo(1049769, 0x20F3, 838),
              /* Wolf */			    new MonsterStatuetteInfo(1049770, 0x2122, 229),
              /* Phillip's Steed */	new MonsterStatuetteInfo(1063488, 0x3FFE, 168),
              /* Seahorse */			new MonsterStatuetteInfo(1070819, 0x25BA, 138),
              /* Harrower */			new MonsterStatuetteInfo(1080520, 0x25BB, new int[] { 0x289, 0x28A, 0x28B }),
              /* Efreet */			new MonsterStatuetteInfo(1080521, 0x2590, 0x300),
              /* Slime */			    new MonsterStatuetteInfo(1015246, 0x20E8, 456),
              /* PlagueBeast */		new MonsterStatuetteInfo(1029747, 0x2613, 0x1BF),
              /* RedDeath */			new MonsterStatuetteInfo(1094932, 0x2617, new int[] { }),
              /* Spider */			new MonsterStatuetteInfo(1029668, 0x25C4, 1170),
              /* OphidianArchMage */	new MonsterStatuetteInfo(1029641, 0x25A9, 639),
              /* OphidianWarrior */	new MonsterStatuetteInfo(1029645, 0x25AD, 634),
              /* OphidianKnight */	new MonsterStatuetteInfo(1029642, 0x25aa, 634),
              /* OphidianMage */		new MonsterStatuetteInfo(1029643, 0x25ab, 639),
              /* DreadHorn */			new MonsterStatuetteInfo(1031651, 0x2D83, 0xA8),
              /* Minotaur */			new MonsterStatuetteInfo(1031657, 0x2D89, 0x596),
              /* Black Cat */		    new MonsterStatuetteInfo(1096928, 0x4688, 0x69),
              /* HalloweenGhoul */	new MonsterStatuetteInfo(1076782, 0x2109, 0x482),
              /* SherryTheMouse */	new MonsterStatuetteInfo(1080171, 0x20D0, 0x0CE),
              /* Slasher of Veils */  new MonsterStatuetteInfo(1113624, 0x42A0, 0x632),
              /* Stygian Dragon   */  new MonsterStatuetteInfo(1113625, 0x42A6, 0x63E),
              /* Medusa */            new MonsterStatuetteInfo(1113626, 0x4298, 0x612),
              /* Primeval Lich */     new MonsterStatuetteInfo(1113627, 0x429A, 0x61E),
              /* Abyssal Infernal */  new MonsterStatuetteInfo(1113628, 0x4287, 1492), 
              /* ArchDemon */         new MonsterStatuetteInfo(1112411, 0x20D3, 357), 
              /* FireAnt */           new MonsterStatuetteInfo(1113801, 0x42A7, 1006),
              /* Navrey Night-Eyes */ new MonsterStatuetteInfo(1153593, 0x4C07, new int[] { 0x61B, 0x61C, 0x61D, 0x61E }),
              /* Dragon Turtle */     new MonsterStatuetteInfo(1156367, 0x9848, 362),
              /* Tiger Cub     */     new MonsterStatuetteInfo(1156517, 0x9CA7, 0x69),
              /* SakkhranBirdOfPrey */new MonsterStatuetteInfo(1156699, 0x276A, 0x4FE),
              /* Exodus */            new MonsterStatuetteInfo(1153594, 0x4C08, new int[] { 0x301, 0x302, 0x303, 0x304 }),
              /* Terathan Matriarch */new MonsterStatuetteInfo(1113800, 0x212C, 599),
              /* Flesh Renderer */    new MonsterStatuetteInfo(1155746, 0x262F, new int[] { 0x34C, 0x354 }),
              /* Crystal Elemental */ new MonsterStatuetteInfo(1155747, 0x2620, 278),
              /* Dark Father */       new MonsterStatuetteInfo(1155748, 0x2632, 0x165),
              /* Platinum Dragon */   new MonsterStatuetteInfo(1155745, 0x2635, new int[] { 0x2C1, 0x2C3 }),
              /* TRex */              new MonsterStatuetteInfo(1157078, 0x9DED, 278),
              /* Zipactriotl */       new MonsterStatuetteInfo(1157079, 0x9DE4, 609),
              /* Myrmidex Queen */    new MonsterStatuetteInfo(1157080, 0x9DB6, 959),
              /* Virtuebane */        new MonsterStatuetteInfo(1153592, 0x4C06, 357),
              /* Grey Goblin */       new MonsterStatuetteInfo(1125135, 0xA095, 0x45A),
              /* Green Goblin */      new MonsterStatuetteInfo(1125133, 0xA097, 0x45A),
              /* Pyros */             new MonsterStatuetteInfo(1157993, 0x9F4D, new int[] { 0x112, 0x113, 0x114, 0x115, 0x116 }),
              /* Lithos */            new MonsterStatuetteInfo(1157994, 0x9FA1, new int[] { 0x10D, 0x10E, 0x10F, 0x110, 0x111 }),
              /* Hydros */            new MonsterStatuetteInfo(1157992, 0x9F49, new int[] { 0x117, 0x118, 0x1119, 0x11A, 0x11B }),
              /* Stratos */           new MonsterStatuetteInfo(1157991, 0x9F4C, new int[] { 0x108, 0x109, 0x10A, 0x10B, 0x10C }),
              /* Santa */             new MonsterStatuetteInfo(1097968, 0x4A9A, new int[] { 1641 }),
              /* Krampus */           new MonsterStatuetteInfo(1158875, 0xA270, new int[] { 0x586, 0x587, 0x588, 0x589, 0x58A }),
              /* Khal Ankur */        new MonsterStatuetteInfo(1158877, 0xA1C6, new int[] { 0x301, 0x302, 0x303, 0x304, 0x305 }),
              /* Krampus Minion */    new MonsterStatuetteInfo(1158876, 0xA271, new int[] { 0X1C8, 0X1C9, 0X1CA, 0X1CB, 0X1CC }),
              /* Horse */             new MonsterStatuetteInfo(1018263, 0xA511, 0x0A9),
              /* Pig */               new MonsterStatuetteInfo(1159417, 0x2101, 0x0C5),
              /* Goat */              new MonsterStatuetteInfo(1159418, 0x2580, 0x09A),
              /* Ice Fiend */         new MonsterStatuetteInfo(1159419, 0x2587, 0x166),
          };
  
          public MonsterStatuetteInfo(int labelNumber, int itemID, int baseSoundID)
          {
              LabelNumber = labelNumber;
              ItemID = itemID;
              Sounds = new int[] { baseSoundID, baseSoundID + 1, baseSoundID + 2, baseSoundID + 3, baseSoundID + 4 };
          }
  
          public MonsterStatuetteInfo(int labelNumber, int itemID, int[] sounds)
          {
              LabelNumber = labelNumber;
              ItemID = itemID;
              Sounds = sounds;
          }
  
          public int LabelNumber { get; set; }
          public int ItemID { get; set; }
          public int[] Sounds { get; set; }
  
          public static MonsterStatuetteInfo GetInfo(MonsterStatuetteType type)
          {
              int v = (int)type;
  
              if (v < 0 || v >= m_Table.Length)
                  v = 0;
  
              return m_Table[v];
          }
      }
  
      public class MonsterStatuette : Item, IRewardItem, IEngravable
      {
          private MonsterStatuetteType m_Type;
          private bool m_TurnedOn;
  
          [Constructable]
          public MonsterStatuette()
              : this(MonsterStatuetteType.Crocodile)
          {
          }
  
          [Constructable]
          public MonsterStatuette(MonsterStatuetteType type)
              : base(MonsterStatuetteInfo.GetInfo(type).ItemID)
          {
              LootType = LootType.Blessed;
  
              m_Type = type;
  
              if (m_Type == MonsterStatuetteType.Slime)
                  Hue = Utility.RandomSlimeHue();
              else if (m_Type == MonsterStatuetteType.RedDeath)
                  Hue = 0x21;
              else if (m_Type == MonsterStatuetteType.HalloweenGhoul)
                  Hue = 0xF4;
              else if (m_Type == MonsterStatuetteType.ArchDemon)
                  Hue = 2021;
              else if (m_Type == MonsterStatuetteType.SakkhranBirdOfPrey)
              {
                  double ran = Utility.RandomDouble();
                  if (0.01 > ran)
                      Hue = 1907;
                  else if (0.1 > ran)
                      Hue = 2562;
                  else if (0.25 > ran)
                      Hue = 2525;
                  else
                      Hue = 2309;
              }
          }
  
          public MonsterStatuette(Serial serial)
              : base(serial)
          {
          }
  
          [CommandProperty(AccessLevel.GameMaster)]
          public bool IsRewardItem { get; set; }
  
          [CommandProperty(AccessLevel.GameMaster)]
          public bool TurnedOn
          {
              get { return m_TurnedOn; }
              set { m_TurnedOn = value; InvalidateProperties(); }
          }
  
          [CommandProperty(AccessLevel.GameMaster)]
          public MonsterStatuetteType Type
          {
              get { return m_Type; }
              set
              {
                  MonsterStatuetteType old = m_Type;
  
                  m_Type = value;
                  ItemID = MonsterStatuetteInfo.GetInfo(m_Type).ItemID;
  
                  if (m_Type == MonsterStatuetteType.Slime)
                      Hue = Utility.RandomSlimeHue();
                  else if (m_Type == MonsterStatuetteType.RedDeath)
                      Hue = 0x21;
                  else if (m_Type == MonsterStatuetteType.HalloweenGhoul)
                      Hue = 0xF4;
                  else if (m_Type != old && m_Type == MonsterStatuetteType.SakkhranBirdOfPrey)
                  {
                      double ran = Utility.RandomDouble();
                      if (0.01 > ran)
                          Hue = 1907;
                      else if (0.1 > ran)
                          Hue = 2562;
                      else if (0.25 > ran)
                          Hue = 2525;
                      else
                          Hue = 2309;
                  }
                  else
                      Hue = 0;
  
                  InvalidateProperties();
              }
          }
  
          public override int LabelNumber => MonsterStatuetteInfo.GetInfo(m_Type).LabelNumber;
  
          public override double DefaultWeight => 1.0;
  
          public override bool HandlesOnMovement => m_TurnedOn && IsLockedDown;
  
          #region IEngraveable
          private string m_EngravedText = string.Empty;
  
          [CommandProperty(AccessLevel.GameMaster)]
          public string EngravedText
          {
              get { return m_EngravedText; }
              set
              {
                  if (value != null)
                      m_EngravedText = value;
                  else
                      m_EngravedText = string.Empty;
  
                  InvalidateProperties();
              }
          }
          #endregion
  
          public override void OnMovement(Mobile m, Point3D oldLocation)
          {
              if (m_TurnedOn && IsLockedDown && (!m.Hidden || m.IsPlayer()) && Utility.InRange(m.Location, Location, 2) && !Utility.InRange(oldLocation, Location, 2))
              {
                  int[] sounds = MonsterStatuetteInfo.GetInfo(m_Type).Sounds;
  
                  if (sounds.Length > 0)
                  {
                      Effects.PlaySound(Location, Map, sounds[Utility.Random(sounds.Length)]);
                  }
              }
  
              base.OnMovement(m, oldLocation);
          }
  
          public override void AddNameProperty(ObjectPropertyList list)
          {
              base.AddNameProperty(list);
  
              if (!String.IsNullOrEmpty(EngravedText))
              {
                  list.Add(1072305, Utility.FixHtml(EngravedText)); // Engraved: ~1_INSCRIPTION~
              }
          }
  
          public override void GetProperties(ObjectPropertyList list)
          {
              base.GetProperties(list);
  
              if (IsRewardItem)
                  list.Add(RewardSystem.GetRewardYearLabel(this, new object[] { m_Type })); // X Year Veteran Reward
  
              if (m_TurnedOn)
                  list.Add(502695); // turned on
              else
                  list.Add(502696); // turned off
          }
  
          public bool IsOwner(Mobile mob)
          {
              BaseHouse house = BaseHouse.FindHouseAt(this);
  
              return (house != null && house.IsOwner(mob));
          }
  
          public override void OnDoubleClick(Mobile from)
          {
              if (IsOwner(from))
              {
  
gt:                 OnOffGump onOffGump = new OnOffGump(this);