/// <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) { //ConsoleLogging.Get.Print("received snapshot: {0} {1}", message.Source.Id.Substring(0, 3), (ItemType)message.Source.Type); // auto subscribe item? if (this.AutoSubscribeItem(message.Source) == false) { //ConsoleLogging.Get.Print("THIS IS NOT AUTO SUBSCRIBED ITEM, EXIT"); return; } ItemAutoSubscription subscription; // already subscribed if (this.autoManagedItemSubscriptions.TryGetValue(message.Source, out subscription)) { //ConsoleLogging.Get.Print("ALREADY AUTOSUBSCRIBED, EXIT"); // 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)) { //ConsoleLogging.Get.Print("ALREADY MANUAL SUBSCRIBED,EXIT"); return; } // item not in view if (message.WorldRegion == null || this.subscribedWorldRegions.ContainsKey(message.WorldRegion) == false) { //ConsoleLogging.Get.Print("ITEM NOT VIEW"); 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 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> /// 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); }