/// <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); } }
/// <summary> /// The auto unsubscribe item. /// </summary> private void AutoUnsubscribeMmoObject(MmoObjectAutoSubscription subscription) { subscription.Dispose(); this.autoManagedItemSubscriptions.Remove(subscription.MmoObject); this.OnMmoObjectUnsubscribed(subscription.MmoObject); }