public bool ReceiveMessage(ComponentizedEntity entity, IGameContext gameContext, IUpdateContext updateContext, MxDispatcher dispatcher, MxClient server,
                                   byte[] payload, uint protocolId)
        {
            if (!_enabled)
            {
                return(false);
            }

            if (_uniqueIdentifierForEntity == null)
            {
                return(false);
            }

            var propertyMessage = _networkMessageSerialization.Deserialize(payload) as EntityPropertiesMessage;

            if (propertyMessage == null || propertyMessage.EntityID != _uniqueIdentifierForEntity.Value)
            {
                return(false);
            }

            // If the entity is a synchronised entity, collect properties of the synchronised object
            // directly.
            var synchronisedEntity = entity as ISynchronisedObject;

            if (synchronisedEntity != null)
            {
                _synchronisationContext = synchronisedEntity;
                _synchronisationContext.DeclareSynchronisedProperties(this);
            }

            // Iterate through all the components on the entity and get their synchronisation data as well.
            foreach (var synchronisedComponent in entity.Components.OfType <ISynchronisedObject>())
            {
                _synchronisationContext = synchronisedComponent;
                _synchronisationContext.DeclareSynchronisedProperties(this);
            }

            AssignMessageToSyncData(propertyMessage, _synchronisedData, server.Group);
            return(true);
        }
Exemplo n.º 2
0
        private void OnMessageRecievedStatisticsAction(byte[] bytes)
        {
            var message = _networkMessageSerialization.Deserialize(bytes);

            if (message == null)
            {
                return;
            }

            var type = message.GetType();

            if (!_currentNetworkFrame.BytesReceivedByMessageType.ContainsKey(type))
            {
                _currentNetworkFrame.BytesReceivedByMessageType[type]    = 0;
                _currentNetworkFrame.MessagesReceivedByMessageType[type] = 0;
            }

            _currentNetworkFrame.BytesReceivedByMessageType[type] += bytes.Length;
            _currentNetworkFrame.MessagesReceivedByMessageType[type]++;
        }
Exemplo n.º 3
0
        public bool Handle(INetworkEventContext context, IEventEngine <INetworkEventContext> eventEngine, Event @event)
        {
            var networkReceiveEvent = @event as NetworkMessageReceivedEvent;

            if (networkReceiveEvent == null)
            {
                return(false);
            }

            var @object = _networkMessageSerialization.Deserialize(networkReceiveEvent.Payload);

            if (networkReceiveEvent.GameContext != null)
            {
                // Messages which are only allowed to be handled by the client.

                var createEntityMessage = @object as EntityCreateMessage;
                if (createEntityMessage != null)
                {
                    if (_networkEngine.FindObjectByNetworkId(createEntityMessage.EntityID) != null)
                    {
                        // This entity was already created on the client, so we ignore it.
                        return(true);
                    }

                    // Spawn an entity in the world...
                    var world         = networkReceiveEvent.GameContext.World;
                    var spawnedEntity = _kernel.Get(
                        Type.GetType(createEntityMessage.EntityType),
                        _hierarchy.Lookup(world)) as IEntity;

                    _networkEngine.RegisterObjectAsNetworkId(
                        createEntityMessage.EntityID,
                        spawnedEntity);

                    if (spawnedEntity != null)
                    {
                        spawnedEntity.Transform.Assign(createEntityMessage.InitialTransform.DeserializeFromNetwork());
                    }

                    var networkIdentifiableEntity = spawnedEntity as INetworkIdentifiable;
                    if (networkIdentifiableEntity != null)
                    {
                        networkIdentifiableEntity.ReceiveNetworkIDFromServer(
                            networkReceiveEvent.GameContext,
                            networkReceiveEvent.UpdateContext,
                            createEntityMessage.EntityID,
                            createEntityMessage.FrameTick);
                    }

                    // Send any pending property messages?
                    var networkEventListener = spawnedEntity as IEventListener <INetworkEventContext>;
                    if (networkEventListener != null)
                    {
                        if (_pendingEntityPropertyMessages.ContainsKey(createEntityMessage.EntityID))
                        {
                            foreach (var propertyMessage in _pendingEntityPropertyMessages[createEntityMessage.EntityID]
                                     .Where(x => x.Item1 > createEntityMessage.MessageOrder).OrderBy(x => x.Item1))
                            {
                                networkEventListener.Handle(context, eventEngine, propertyMessage.Item2);
                            }

                            _pendingEntityPropertyMessages.Remove(createEntityMessage.EntityID);
                        }
                    }

                    return(true);
                }

                var entityPropertiesMessage = @object as EntityPropertiesMessage;
                if (entityPropertiesMessage != null)
                {
                    var targetObject = _networkEngine.FindObjectByNetworkId(entityPropertiesMessage.EntityID);
                    if (targetObject != null)
                    {
                        // The object willingly didn't accept the message.
                    }
                    else
                    {
                        if (!_pendingEntityPropertyMessages.ContainsKey(entityPropertiesMessage.EntityID))
                        {
                            _pendingEntityPropertyMessages[entityPropertiesMessage.EntityID] = new List <Tuple <int, Event> >();
                        }

                        _pendingEntityPropertyMessages[entityPropertiesMessage.EntityID].Add(new Tuple <int, Event>(entityPropertiesMessage.MessageOrder, networkReceiveEvent));
                    }
                }
            }

            return(false);
        }