/// <summary> /// The on attached item position update. /// </summary> /// <param name = "message"> /// The message. /// </param> private void AttachedItem_OnItemPosition(ItemPositionMessage message) { MessageCounters.CounterReceive.Increment(); lock (this.SyncRoot) { if (this.AttachedItem == message.Source) { this.Position = message.Position; this.UpdateInterestManagement(); } } }
/// <summary> /// The on auto subscribed item position update. /// unsubscribes item if too far away /// </summary> /// <param name = "message"> /// The message. /// </param> private void AutoSubscribedItem_OnItemPosition(ItemPositionMessage message) { MessageCounters.CounterReceive.Increment(); lock (this.SyncRoot) { ItemAutoSubscription subscription; // not subscribed if (false == this.autoManagedItemSubscriptions.TryGetValue(message.Source, out subscription)) { return; } subscription.ItemPosition = message.Position; // dropped out of world, unsubscribe if (message.WorldRegion == null) { this.AutoUnsubscribeItem(subscription); return; } // region is still the same, don't evaluate further if (message.WorldRegion == subscription.WorldRegion) { return; } subscription.WorldRegion = message.WorldRegion; if (this.subscribedWorldRegions.ContainsKey(subscription.WorldRegion) == false) { // unsubscribe if item is out of range this.AutoUnsubscribeDistantItem(subscription); } } }
/// <summary> /// The update position. /// </summary> /// <param name="message"> /// The message. /// </param> private void UpdatePosition(ItemPositionMessage message) { var positionUpdate = (MmoItemPositionUpdate)message; Item item = message.Source; if (this.itemPositions.ContainsKey(item)) { this.itemPositions[item] = positionUpdate.Coordinate; this.PublishUpdate(item, positionUpdate.Coordinate, true); } }