Beispiel #1
0
        /// <summary>
        /// Converts a raw NetIncomingMessage to an IncomingEntityMessage object
        /// </summary>
        /// <param name="message">raw network message</param>
        /// <returns>An IncomingEntityMessage object</returns>
        public IncomingEntityMessage HandleEntityNetworkMessage(NetIncomingMessage message)
        {
            var messageType = (EntityMessage)message.ReadByte();
            int uid;
            IncomingEntityMessage result = IncomingEntityMessage.Null;

            switch (messageType)
            {
            case EntityMessage.ComponentMessage:
                uid = message.ReadInt32();
                IncomingEntityComponentMessage messageContent = HandleEntityComponentNetworkMessage(message);
                result = new IncomingEntityMessage(uid, EntityMessage.ComponentMessage, messageContent,
                                                   message.SenderConnection);

                break;

            case EntityMessage.SystemMessage:     //TODO: Not happy with this resolving the entmgr everytime a message comes in.
                var manager = IoCManager.Resolve <IEntitySystemManager>();
                manager.HandleSystemMessage(new EntitySystemData(message.SenderConnection, message));
                break;

            case EntityMessage.PositionMessage:
                uid = message.ReadInt32();
                //TODO: Handle position messages!
                break;
            }
            return(result);
        }
Beispiel #2
0
 /// <summary>
 /// Server-side method to handle instantiation messages from client-side components
 /// asking for initialization data
 /// </summary>
 /// <param name="message">Message from client</param>
 protected void HandleComponentInstantiationMessage(IncomingEntityMessage message)
 {
     if (HasComponent((ComponentFamily)message.Message))
     {
         GetComponent <Component>((ComponentFamily)message.Message).HandleInstantiationMessage(message.Sender);
     }
 }
Beispiel #3
0
        /// <summary>
        /// Func to handle an incoming network message
        /// </summary>
        /// <param name="message"></param>
        public virtual void HandleNetworkMessage(IncomingEntityMessage message)
        {
            switch (message.MessageType)
            {
            case EntityMessage.ComponentMessage:
                HandleComponentMessage((IncomingEntityComponentMessage)message.Message, message.Sender);
                break;

            case EntityMessage.ComponentInstantiationMessage:     //Server Only
                HandleComponentInstantiationMessage(message);
                break;
            }
        }
Beispiel #4
0
        /// <summary>
        /// Converts a raw NetIncomingMessage to an IncomingEntityMessage object
        /// </summary>
        /// <param name="message">raw network message</param>
        /// <returns>An IncomingEntityMessage object</returns>
        public IncomingEntityMessage HandleEntityNetworkMessage(NetIncomingMessage message)
        {
            var messageType = (EntityMessage)message.ReadByte();
            int uid;
            IncomingEntityMessage result = IncomingEntityMessage.Null;

            switch (messageType)
            {
            case EntityMessage.ComponentMessage:
                uid = message.ReadInt32();
                IncomingEntityComponentMessage messageContent = HandleEntityComponentNetworkMessage(message);
                result = new IncomingEntityMessage(uid, EntityMessage.ComponentMessage, messageContent,
                                                   message.SenderConnection);

                if (_messageProfiling)
                {
                    //Log the message
                    var logger = IoCManager.Resolve <IMessageLogger>();
                    logger.LogIncomingComponentNetMessage(result.Uid, result.MessageType,
                                                          messageContent.ComponentFamily,
                                                          messageContent.MessageParameters.ToArray());
                }

                break;

            case EntityMessage.SystemMessage:     //TODO: Not happy with this resolving the entmgr everytime a message comes in.
                EntityManager eMgr = (EntityManager)IoCManager.Resolve <IEntityManager>();
                eMgr.EntitySystemManager.HandleSystemMessage(new EntitySystemData(message.SenderConnection, message));
                break;

            case EntityMessage.PositionMessage:
                uid = message.ReadInt32();
                //TODO: Handle position messages!
                break;

            case EntityMessage.GetSVars:
                uid    = message.ReadInt32();
                result = new IncomingEntityMessage(uid, EntityMessage.GetSVars, message, message.SenderConnection);
                break;
            }
            return(result);
        }
Beispiel #5
0
 /// <summary>
 /// Handle an incoming network message by passing the message to the EntityNetworkManager
 /// and handling the parsed result.
 /// </summary>
 /// <param name="msg">Incoming raw network message</param>
 public void HandleEntityNetworkMessage(NetIncomingMessage msg)
 {
     if (!Initialized)
     {
         IncomingEntityMessage emsg = ProcessNetMessage(msg);
         if (emsg.MessageType != EntityMessage.Null)
         {
             MessageBuffer.Enqueue(emsg);
         }
     }
     else
     {
         ProcessMsgBuffer();
         IncomingEntityMessage emsg = ProcessNetMessage(msg);
         if (!_entities.ContainsKey(emsg.Uid))
         {
             MessageBuffer.Enqueue(emsg);
         }
         else
         {
             _entities[emsg.Uid].HandleNetworkMessage(emsg);
         }
     }
 }
Beispiel #6
0
        protected void ProcessMsgBuffer()
        {
            if (!Initialized)
            {
                return;
            }
            if (!MessageBuffer.Any())
            {
                return;
            }
            var misses = new List <IncomingEntityMessage>();

            while (MessageBuffer.Any())
            {
                IncomingEntityMessage entMsg = MessageBuffer.Dequeue();
                if (!_entities.ContainsKey(entMsg.Uid))
                {
                    entMsg.LastProcessingAttempt = DateTime.Now;
                    if ((entMsg.LastProcessingAttempt - entMsg.ReceivedTime).TotalSeconds > entMsg.Expires)
                    {
                        misses.Add(entMsg);
                    }
                }
                else
                {
                    _entities[entMsg.Uid].HandleNetworkMessage(entMsg);
                }
            }

            foreach (IncomingEntityMessage miss in misses)
            {
                MessageBuffer.Enqueue(miss);
            }

            MessageBuffer.Clear(); //Should be empty at this point anyway.
        }
Beispiel #7
0
        /// <summary>
        /// Handles an incoming entity message
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public IncomingEntityMessage HandleEntityNetworkMessage(NetIncomingMessage message)
        {
            var messageType = (EntityMessage)message.ReadByte();
            int uid         = 0;
            IncomingEntityMessage incomingEntityMessage = IncomingEntityMessage.Null;

            switch (messageType)
            {
            case EntityMessage.ComponentMessage:
                uid = message.ReadInt32();
                incomingEntityMessage = new IncomingEntityMessage(uid, EntityMessage.ComponentMessage,
                                                                  HandleEntityComponentNetworkMessage(message),
                                                                  message.SenderConnection);
                break;

            case EntityMessage.SystemMessage:     //TODO: Not happy with this resolving the entmgr everytime a message comes in.
                var manager = IoCManager.Resolve <IEntitySystemManager>();
                manager.HandleSystemMessage(new EntitySystemData(message.SenderConnection, message));
                break;

            case EntityMessage.PositionMessage:
                uid = message.ReadInt32();
                //TODO: Handle position messages!
                break;

            case EntityMessage.ComponentInstantiationMessage:
                uid = message.ReadInt32();
                incomingEntityMessage = new IncomingEntityMessage(uid,
                                                                  EntityMessage.ComponentInstantiationMessage,
                                                                  (ComponentFamily)
                                                                  UnPackParams(message).First(),
                                                                  message.SenderConnection);
                break;

            case EntityMessage.SetSVar:
                uid = message.ReadInt32();
                incomingEntityMessage = new IncomingEntityMessage(uid,
                                                                  EntityMessage.SetSVar,
                                                                  MarshalComponentParameter.Deserialize(message),
                                                                  message.SenderConnection);
                break;

            case EntityMessage.GetSVars:
                uid = message.ReadInt32();
                incomingEntityMessage = new IncomingEntityMessage(uid,
                                                                  EntityMessage.GetSVars, null,
                                                                  message.SenderConnection);
                break;
            }

            if (_messageProfiling)
            {
                var logger = IoCManager.Resolve <IMessageLogger>();

                if (messageType == EntityMessage.ComponentMessage)
                {
                    var messageContent = (IncomingEntityComponentMessage)incomingEntityMessage.Message;
                    logger.LogIncomingComponentNetMessage(message.SenderConnection.RemoteUniqueIdentifier,
                                                          uid,
                                                          messageType,
                                                          messageContent.ComponentFamily,
                                                          PackParamsForLog(messageContent.MessageParameters.ToArray()));
                }
                else if (messageType == EntityMessage.ComponentInstantiationMessage)
                {
                    logger.LogIncomingComponentNetMessage(message.SenderConnection.RemoteUniqueIdentifier,
                                                          uid,
                                                          messageType,
                                                          (ComponentFamily)incomingEntityMessage.Message,
                                                          new object[0]);
                }
            }

            return(incomingEntityMessage);
        }