void Radar_OnCharacterPosition_AggroExitCheck(MmoObjectPositionMessage message) { var squaredDistance = Vector3.SqrDistance(message.Position, radarCenter); if (squaredDistance >= radarExitRadius * radarExitRadius) { var character = message.Source as Character; if (character == null) { return; } IDisposable oldSubscription; if (visibleCharacters.TryGetValue(character, out oldSubscription)) { oldSubscription.Dispose(); } if (visibleArea.Contains(character.Position)) { // aggro enter checker var subscription = character.PositionUpdateChannel.SubscribeToLast(this.CurrentZone.PrimaryFiber, this.Radar_OnCharacterPosition_AggroEnterCheck, ServerGameSettings.AGGRO_ENTER_CHECK_INTERVAL_MS); this.visibleCharacters[character] = subscription; } else { // unsubscribing character this.visibleCharacters.Remove(character); } this.OnExitRadarRange(character); } }
/// <summary> /// The on attached item position update. /// </summary> private void AttachedMmoObject_OnGameObjectPosition(MmoObjectPositionMessage message) { MessageCounters.CounterReceive.Increment(); lock (this.SyncRoot) { if (this.Owner == message.Source) { this.Position = message.Position; this.UpdateInterestManagement(); } } }
void Radar_OnCharacterPosition_AggroEnterCheck(MmoObjectPositionMessage message) { var squaredDistance = Vector3.SqrDistance(message.Position, radarCenter); if (squaredDistance <= radarEnterRadius * radarEnterRadius) { var character = message.Source as Character; if (character == null) { return; } IDisposable oldSubscription; if (visibleCharacters.TryGetValue(character, out oldSubscription)) { oldSubscription.Dispose(); } else { this.visibleCharacters.Add(character, null); } // aggro exit checker var positionSubscription = character.PositionUpdateChannel.SubscribeToLast(this.CurrentZone.PrimaryFiber, Radar_OnCharacterPosition_AggroExitCheck, ServerGameSettings.AGGRO_EXIT_CHECK_INTERVAL_MS); var disposedSubscription = character.DisposeChannel.Subscribe(this.CurrentZone.PrimaryFiber, this.Radar_OnCharacterDisposed); this.visibleCharacters[character] = new UnsubscriberCollection(positionSubscription, disposedSubscription); // entering aggro range this.OnEnterRadarRange(character); } else if (squaredDistance > radarExitRadius * radarExitRadius) { // unsubscribing character var character = message.Source as Character; if (character == null) { return; } this.visibleCharacters[character].Dispose(); this.visibleCharacters.Remove(character); } }
/// <summary> /// The on auto subscribed item position update. /// unsubscribes item if too far away /// </summary> private void AutoSubscribedMmoObject_OnMmoObjectPosition(MmoObjectPositionMessage message) { MessageCounters.CounterReceive.Increment(); lock (this.SyncRoot) { MmoObjectAutoSubscription subscription; // not subscribed if (false == this.autoManagedItemSubscriptions.TryGetValue(message.Source, out subscription)) { return; } subscription.Position = message.Position; // dropped out of world, unsubscribe if (message.WorldRegion == null) { this.AutoUnsubscribeMmoObject(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.AutoUnsubscribeDistantMmoObject(subscription); } } }