示例#1
0
 /// <summary>
 ///   The auto unsubscribe distant item.
 /// </summary>
 /// <param name = "subscription">
 ///   The subscription.
 /// </param>
 private void AutoUnsubscribeDistantItem(ItemAutoSubscription subscription)
 {
     ////IArea area = this.World.Area.GetAreaWithRadius(this.Position, this.ViewDistanceExit);
     ////var regions = this.World.GetRegions(area);
     ////if (regions.Contains(subscription.WorldRegion) == false)
     if (false == this.currentRegionOuterFocus.Contains(subscription.ItemPosition))
     {
         this.AutoUnsubscribeItem(subscription);
     }
 }
示例#2
0
        /// <summary>
        ///   Receives the <see cref = "ItemSnapshot" />.
        ///   auto subscribes item if necessary.
        /// </summary>
        /// <param name = "message">
        ///   The message.
        /// </param>
        internal void ReceiveItemSnapshot(ItemSnapshot message)
        {
            lock (this.SyncRoot)
            {
                // auto subscribe item?
                if (this.AutoSubscribeItem(message.Source) == false)
                {
                    return;
                }

                ItemAutoSubscription subscription;

                // already subscribed
                if (this.autoManagedItemSubscriptions.TryGetValue(message.Source, out subscription))
                {
                    // dropped out of world, unsubscribe
                    if (message.WorldRegion == null)
                    {
                        this.AutoUnsubscribeItem(subscription);
                        return;
                    }

                    // update position
                    subscription.ItemPosition = message.Position;
                    subscription.WorldRegion  = message.WorldRegion;
                    return;
                }

                // already subscribed
                if (this.manualManagedItemSubscriptions.ContainsKey(message.Source))
                {
                    return;
                }

                // item not in view
                if (message.WorldRegion == null || this.subscribedWorldRegions.ContainsKey(message.WorldRegion) == false)
                {
                    return;
                }

                // unsubscribe if item is disposed
                IDisposable disposeListener = message.Source.DisposeChannel.Subscribe(this.subscriptionManagementFiber, this.AutoSubscribedItem_OnItemDisposed);

                // unsubscribe if item moves out of range
                IDisposable itemPositionEvaluator = message.Source.PositionUpdateChannel.SubscribeToLast(
                    this.subscriptionManagementFiber, this.AutoSubscribedItem_OnItemPosition, ItemAutoUnsubcribeDelayMilliseconds);

                var itemSubscription = new ItemAutoSubscription(
                    message.Source, message.Position, message.WorldRegion, new UnsubscriberCollection(disposeListener, itemPositionEvaluator));
                this.autoManagedItemSubscriptions.Add(message.Source, itemSubscription);

                this.OnItemSubscribed(message);
            }
        }
 /// <summary>
 ///   The auto unsubscribe item.
 /// </summary>
 /// <param name = "subscription">
 ///   The subscription.
 /// </param>
 private void AutoUnsubscribeItem(ItemAutoSubscription subscription)
 {
     subscription.Dispose();
     this.autoManagedItemSubscriptions.Remove(subscription.Item);
     this.OnItemUnsubscribed(subscription.Item);
 }
 /// <summary>
 ///   The auto unsubscribe distant item.
 /// </summary>
 /// <param name = "subscription">
 ///   The subscription.
 /// </param>
 private void AutoUnsubscribeDistantItem(ItemAutoSubscription subscription)
 {
     ////IArea area = this.World.Area.GetAreaWithRadius(this.Position, this.ViewDistanceExit);
     ////var regions = this.World.GetRegions(area);
     ////if (regions.Contains(subscription.WorldRegion) == false)
     if (false == this.currentRegionOuterFocus.Contains(subscription.ItemPosition))
     {
         this.AutoUnsubscribeItem(subscription);
     }
 }
        /// <summary>
        ///   Receives the <see cref = "ItemSnapshot" />.
        ///   auto subscribes item if necessary.
        /// </summary>
        /// <param name = "message">
        ///   The message.
        /// </param>
        internal void ReceiveItemSnapshot(ItemSnapshot message)
        {
            lock (this.SyncRoot)
            {
                // auto subscribe item?
                if (this.AutoSubscribeItem(message.Source) == false)
                {
                    return;
                }

                ItemAutoSubscription subscription;

                // already subscribed
                if (this.autoManagedItemSubscriptions.TryGetValue(message.Source, out subscription))
                {
                    // dropped out of world, unsubscribe
                    if (message.WorldRegion == null)
                    {
                        this.AutoUnsubscribeItem(subscription);
                        return;
                    }

                    // update position
                    subscription.ItemPosition = message.Position;
                    subscription.WorldRegion = message.WorldRegion;
                    return;
                }

                // already subscribed
                if (this.manualManagedItemSubscriptions.ContainsKey(message.Source))
                {
                    return;
                }

                // item not in view
                if (message.WorldRegion == null || this.subscribedWorldRegions.ContainsKey(message.WorldRegion) == false)
                {
                    return;
                }

                // unsubscribe if item is disposed
                IDisposable disposeListener = message.Source.DisposeChannel.Subscribe(this.subscriptionManagementFiber, this.AutoSubscribedItem_OnItemDisposed);

                // unsubscribe if item moves out of range
                IDisposable itemPositionEvaluator = message.Source.PositionUpdateChannel.SubscribeToLast(
                    this.subscriptionManagementFiber, this.AutoSubscribedItem_OnItemPosition, ItemAutoUnsubcribeDelayMilliseconds);

                var itemSubscription = new ItemAutoSubscription(
                    message.Source, message.Position, message.WorldRegion, new UnsubscriberCollection(disposeListener, itemPositionEvaluator));
                this.autoManagedItemSubscriptions.Add(message.Source, itemSubscription);

                this.OnItemSubscribed(message);
            }
        }
示例#6
0
 /// <summary>
 ///   The auto unsubscribe item.
 /// </summary>
 /// <param name = "subscription">
 ///   The subscription.
 /// </param>
 private void AutoUnsubscribeItem(ItemAutoSubscription subscription)
 {
     subscription.Dispose();
     this.autoManagedItemSubscriptions.Remove(subscription.Item);
     this.OnItemUnsubscribed(subscription.Item);
 }