Пример #1
0
        /// <summary>
        /// Subscribes a local visible actor
        /// </summary>
        /// <param name="regionobject">Object to subscribe</param>
        public void Subscribe(MapObject regionobject)
        {
            bool isalwaysVisible = false;

            foreach (RegionVisibility att in regionobject.GetType().GetCustomAttributes(typeof(RegionVisibility), true))
            {
                isalwaysVisible = att.Level == VisibilityLevel.Always;
            }

            Regiontree tree = regionobject.currentzone.Regiontree;

            if (isalwaysVisible == false)
            {
                regionobject.id = ObtainNextUniqueId(regionobject);
                if (regionobject.id > 0)
                {
                    //Calculate new regioncode
                    uint newregion = GetRegionCode(regionobject);
                    tree.Unsubscribe(regionobject, regionobject.region);
                    tree.Subscribe(regionobject, newregion);
                    regionobject.region = newregion;
                }
            }
            else
            {
                tree.AlwaysVisibleSubscribe(regionobject);
            }
        }
Пример #2
0
        public static bool TryFind <T>(uint instanceid, MapObject e, out T b)
            where T : class
        {
            MapObject target;

            Regiontree.TryFind(instanceid, e, out target);
            b = target as T;
            return(b != null);
        }
Пример #3
0
        public static int GetCharacterCount(MapObject instance, uint regionCode)
        {
            Region     region;
            Regiontree tree = instance.currentzone.Regiontree;

            if (tree.regions.TryGetValue(regionCode, out region))
            {
                return(region.characters.Count);
            }

            return(0);
        }
Пример #4
0
        public static bool TryFind(uint instanceid, MapObject e, out MapObject b)
        {
            Predicate <MapObject> FindActor = delegate(MapObject match)
            {
                return(match.id == instanceid);
            };

            Regiontree tree = e.currentzone.Regiontree;

            b = tree.SearchActor(FindActor, e, SearchFlags.DynamicObjects | SearchFlags.StaticObjects);
            if (b == null)
            {
                b = tree.SearchActor(FindActor, SearchFlags.DynamicObjects);
            }
            return(b != null);
        }
Пример #5
0
        /// <summary>
        /// Updates the region of the character
        /// </summary>
        public static void UpdateRegion(MapObject regionobject)
        {
            //Calculate new regioncode
            uint oldregion = regionobject.region;
            uint newregion = GetRegionCode(regionobject);

            //If regioncode differs unsubsribe it
            if (newregion != oldregion)
            {
                lock (regionobject)
                {
                    Regiontree tree = regionobject.currentzone.Regiontree;
                    tree.Unsubscribe(regionobject, oldregion);
                    tree.Subscribe(regionobject, newregion);
                    regionobject.region = newregion;
                }
            }
        }
Пример #6
0
        public void WideMovement(params WaypointStructure[] waypoints)
        {
            SMSG_WIDEMOVEMENTSTART spkt = new SMSG_WIDEMOVEMENTSTART();

            spkt.SourceActorID = this.id;
            spkt.Speed         = (ushort)this.Status.WalkingSpeed;
            for (int i = 0; i < waypoints.Length; i++)
            {
                spkt.AddWaypoint(waypoints[i].point, waypoints[i].rotation);
            }

            Regiontree tree = this.currentzone.Regiontree;

            foreach (Character character in tree.SearchActors(SearchFlags.Characters))
            {
                if (character.client.isloaded == false)
                {
                    continue;
                }
                spkt.SessionId = character.id;
                character.client.Send((byte[])spkt);
            }
        }
Пример #7
0
        /// <summary>
        /// Unsubscribe a local visible actor
        /// </summary>
        /// <param name="regionobject">Object to unsubscribe</param>
        public bool Unsubscribe(MapObject regionobject)
        {
            bool isalwaysVisible = false;

            foreach (RegionVisibility att in regionobject.GetType().GetCustomAttributes(typeof(RegionVisibility), true))
            {
                isalwaysVisible = att.Level == VisibilityLevel.Always;
            }

            Regiontree tree = regionobject.currentzone.Regiontree;

            if (isalwaysVisible == false)
            {
                uint newregion = GetRegionCode(regionobject);
                bool result    = tree.Unsubscribe(regionobject, regionobject.region);
                regionobject.region = newregion;
                return(result);
            }
            else
            {
                tree.AlwaysVisibleUnsubscribe(regionobject);
                return(true);
            }
        }