Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        /// <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();
                }
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        /// <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);
                }
            }
        }