public CreatureObject GetFarthest(CreatureObject Source, List <CreatureObject> Creatures)
        {
            AreaObject     SourceArea = Source.Area;
            Vector3        SourcePos  = Source.Position;
            CreatureObject RetValue   = null;

            if (Creatures.Count == 0)
            {
                return(RetValue);
            }

            float LongestDistance = -1.0f;

            foreach (CreatureObject Target in Creatures)
            {
                // Only interested in objects in the same area.
                if (SourceArea != Target.Area)
                {
                    continue;
                }

                Vector3 TargetPos = Target.Position;
                float   Distance  = MathOps.DistanceSq(SourcePos, TargetPos);

                if ((LongestDistance < 0) || ((Distance > LongestDistance) && (Distance < 100.0f * 100.0f))) // 100 meters is about as far as we'd expect combat to reach.
                {
                    LongestDistance = Distance;
                    RetValue        = Target;
                }
            }
            return(RetValue);
        }
        public CreatureObject GetNearest(CreatureObject Source, List <CreatureObject> Creatures)
        {
            AreaObject     SourceArea = Source.Area;
            Vector3        SourcePos  = Source.Position;
            CreatureObject RetValue   = null;

            if (Creatures.Count == 0)
            {
                return(RetValue);
            }

            float ShortestDistance = -1.0f;

            foreach (CreatureObject Target in Creatures)
            {
                // Only interested in objects in the same area.
                if (SourceArea != Target.Area)
                {
                    continue;
                }

                Vector3 TargetPos = Target.Position;
                float   Distance  = MathOps.DistanceSq(SourcePos, TargetPos);

                if ((ShortestDistance < 0) || (Distance < ShortestDistance))
                {
                    ShortestDistance = Distance;
                    RetValue         = Target;
                }
            }
            return(RetValue);
        }
        /// <summary>
        /// Add an instanced area object to the area object list.
        /// </summary>
        /// <param name="AreaObjectId">Supplies the area object id.</param>
        /// <returns>The C# area object.</returns>
        public AreaObject AddInstancedArea(uint AreaObjectId)
        {
            AreaObject Area = new AreaObject(AreaObjectId, ObjectManager);

            Areas.Add(Area);

            return Area;
        }
        /// <summary>
        /// Add an instanced area object to the area object list.
        /// </summary>
        /// <param name="AreaObjectId">Supplies the area object id.</param>
        /// <returns>The C# area object.</returns>
        public AreaObject AddInstancedArea(uint AreaObjectId)
        {
            AreaObject Area = new AreaObject(AreaObjectId, ObjectManager);

            Areas.Add(Area);

            return(Area);
        }
        /// <summary>
        /// Construct a module object and insert it into the object table.
        /// </summary>
        /// <param name="ObjectId">Supplies the object id.</param>
        /// <param name="ObjectManager">Supplies the object manager.</param>
        public ModuleObject(uint ObjectId, GameObjectManager ObjectManager) : base(ObjectId, GameObjectType.Module, ObjectManager)
        {
            //
            // Discover pre-created areas in the module.  Instanced areas will
            // be discovered when they are created.
            //

            foreach (uint AreaObjectId in Script.GetAreas())
            {
                AreaObject Area = new AreaObject(AreaObjectId, ObjectManager);
            }
        }
        /// <summary>
        /// Construct a module object and insert it into the object table.
        /// </summary>
        /// <param name="ObjectId">Supplies the object id.</param>
        /// <param name="ObjectManager">Supplies the object manager.</param>
        public ModuleObject(uint ObjectId, GameObjectManager ObjectManager) : base(ObjectId, GameObjectType.Module, ObjectManager)
        {
            //
            // Discover pre-created areas in the module.  Instanced areas will
            // be discovered when they are created.
            //

            foreach (uint AreaObjectId in Script.GetAreas())
            {
                AreaObject Area = new AreaObject(AreaObjectId, ObjectManager);

                Areas.Add(Area);
            }
        }