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); }
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]++; }
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); }