Exemplo n.º 1
0
        /// <summary>
        /// Receives the <see cref="MmoObjectSnapshot"/> auto subscribes item if necessary.
        /// </summary>
        internal void ReceiveMmoObjectSnapshot(MmoObjectSnapshot message)
        {
            lock (SyncRoot)
            {
                // auto subscribe item?
                if (CanAutoSubscribeMmoObject(message.Source) == false)
                {
                    return;
                }

                MmoObjectAutoSubscription existingSubscription;
                if (autoManagedItemSubscriptions.TryGetValue(message.Source, out existingSubscription))
                {
                    // dropped out of world, unsubscribe
                    if (message.WorldRegion == null)
                    {
                        this.AutoUnsubscribeMmoObject(existingSubscription);
                        return;
                    }

                    // update position
                    existingSubscription.Position    = message.Position;
                    existingSubscription.WorldRegion = message.WorldRegion;
                    return;
                }

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

                // unsubscribe if item is disposed
                var disposalSubscription = message.Source.DisposeChannel.Subscribe(this.subscriptionManagementFiber, this.AutoSubscribedMmoObject_OnMmoObjectDisposed);
                // unsubscribe if item moves out of range
                var positionSubscription = message.Source.PositionUpdateChannel.SubscribeToLast(this.subscriptionManagementFiber,
                                                                                                this.AutoSubscribedMmoObject_OnMmoObjectPosition,
                                                                                                GameObjectAutoUnsubcribeDelayMilliseconds);
                var itemSubscription = new MmoObjectAutoSubscription(message.Source, message.Position, message.WorldRegion,
                                                                     new UnsubscriberCollection(disposalSubscription, positionSubscription));

                this.autoManagedItemSubscriptions.Add(message.Source, itemSubscription);
                this.OnMmoObjectSubscribed(message);
            }
        }
Exemplo n.º 2
0
 /// <summary>
 ///   The auto unsubscribe item.
 /// </summary>
 private void AutoUnsubscribeMmoObject(MmoObjectAutoSubscription subscription)
 {
     subscription.Dispose();
     this.autoManagedItemSubscriptions.Remove(subscription.MmoObject);
     this.OnMmoObjectUnsubscribed(subscription.MmoObject);
 }