context: /**************************************
  *Script Name: Staff Runebook          *
  *Author: Joeku                        *
  *For use with RunUO 2.0 RC2           *
  *Client Tested with: 6.0.9.2          *
  *Version: 1.10                        *
  *Initial Release: 11/25/07            *
  *Revision Date: 02/04/09              *
  **************************************/
  
  using System;
  using Server;
  using Server.Accounting;
  using Server.Gumps;
  
  namespace Joeku.SR
  {
      public class SR_Utilities
      {
          public static bool FindItem(Type type, Point3D p, Map map)
          {
              return FindEntity(type, p, map, false);
          }
  
          public static bool FindMobile(Type type, Point3D p, Map map)
          {
              return FindEntity(type, p, map, true);
          }
  		
          public static bool FindEntity(Type type, Point3D p, Map map, bool mob)
          {
              IPooledEnumerable loc;
              Rectangle2D rect = new Rectangle2D(p.X, p.Y, 1, 1);
              if (mob)
                  loc = map.GetMobilesInBounds(rect);
              else
                  loc = map.GetItemsInBounds(rect);
  
              bool found = false;
  
              try
              {
                  foreach (object o in loc)
                      if (o != null && o.GetType() == type || o.GetType().IsSubclassOf(type))
                      {
                          found = true;
                          break;
                      }
              }
              catch
              {
              }
  
              loc.Free();
  
              return found;
          }
  
          public static SR_RuneAccount FetchInfo(IAccount acc)
          {
              return FetchInfo(acc as Account);
          }
  
          public static SR_RuneAccount FetchInfo(Account acc)
          {
              return FetchInfo(acc.Username);
          }
  
          public static SR_RuneAccount FetchInfo(string username)
          {
              SR_RuneAccount runeAcc = null;
  
              for (int i = 0; i < SR_Main.Count; i++)
                  if (SR_Main.Info[i].Username == username)
                  {
                      runeAcc = SR_Main.Info[i];
                      break;
                  }
  
              if (runeAcc == null)
              {
                  runeAcc = new SR_RuneAccount(username);
                  NewRuneAcc(runeAcc);
              }
  
              return runeAcc;
          }
  
          public static int RunebookID = 8901;
          public static int RuneID = 7956;
  
          public static int ItemOffsetY(SR_Rune rune)
          {
              if (rune.IsRunebook)
                  return -1;
              return 3;
          }
  
          public static int ItemOffsetX(SR_Rune rune)
          {
              if (rune.IsRunebook)
                  return -1;
              return -2;
          }
  
          public static int ItemHue(SR_Rune rune)
          {
              int hue = 0;
  
              if (rune.IsRunebook)
                  hue = 1121;
              else
                  hue = RuneHues[MapInt(rune.TargetMap) /*+ (rune.House != null) ? 5 : 0*/];
  
              return hue;
          }
  
          private static readonly int[] RuneHues = new int[] { 0, 50, 1102, 1102, 1154, 0x66D, 0x47F, 0x55F, 0x55F, 0x47F };
  
          // To do: check for valid Z (?)
          public static bool CheckValid(Point3D loc, Map map)
          {
              Point2D dim = MapDimensions[MapInt(map)];
  
              if (loc.X < 0 || loc.Y < 0 || loc.X > dim.X || loc.Y > dim.Y)
                  return false;
  
              return true;
          }
  
          private static readonly Point2D[] MapDimensions = new Point2D[]
          {
              new Point2D(7168, 4096), // Felucca
              new Point2D(7168, 4096), // Trammel
              new Point2D(2304, 1600), // Ilshenar
              new Point2D(2560, 2048), // Malas
              new Point2D(1448, 1448), // Tokuno
              #region SA
              new Point2D(1280, 4096)// TerMur
              #endregion
          };
  
          public static int MapInt(Map map)
          {
              int i = 0;
  
              if (map == Map.Felucca)
                  i = 0;
              else if (map == Map.Trammel)
                  i = 1;
              else if (map == Map.Ilshenar)
                  i = 2;
              else if (map == Map.Malas)
                  i = 3;
              else if (map == Map.Tokuno)
                  i = 4;
              #region SA
              else if (map == Map.TerMur)
                  i = 5;
              #endregion
  
              return i;
          }
  
          public static void NewRuneAcc(SR_RuneAccount acc)
          {
              acc.Clear();
  
              acc.AddRune(AddTree(GoGump.Felucca, Map.Felucca));
              acc.AddRune(AddTree(GoGump.Trammel, Map.Trammel));
              acc.AddRune(AddTree(GoGump.Ilshenar, Map.Ilshenar));
              acc.AddRune(AddTree(GoGump.Malas, Map.Malas));
              acc.AddRune(AddTree(GoGump.Tokuno, Map.Tokuno));
              #region SA
              acc.AddRune(AddTree(GoGump.TerMur, Map.TerMur));
              #endregion
          }
  
          private static SR_Rune AddTree(LocationTree tree, Map map)
          {
              SR_Rune runeBook = new SR_Rune(map.ToString(), true);
  
              for (int i = 0; i < tree.Root.Children.Length; i++)
                  runeBook.AddRune(AddNode(tree.Root.Children[i], map));
  
              return runeBook;
          }
  
          private static SR_Rune AddNode(object o, Map map)
          {
              if (o is ParentNode)
              {
                  ParentNode parentNode = o as ParentNode;
                  SR_Rune runeBook = new SR_Rune(parentNode.Name, true);
  
                  for (int i = 0; i < parentNode.Children.Length; i++)
                      runeBook.AddRune(AddNode(parentNode.Children[i], map));
  
                  return runeBook;
              }
  
              ChildNode childNode = o as ChildNode;
  
  
gt:             return new SR_Rune(childNode.Name, map, childNode.Location);