예제 #1
0
        public NetworkMessage Clone()
        {
            MsgPackSerializer.SerializeObject(this, cloneBuffer, 0);
            var result = (NetworkMessage)(GetType().GetConstructor(Type.EmptyTypes).Invoke(emptyArgs));

            MsgPackSerializer.DeserializeObject(result, cloneBuffer, 0);
            result.SequenceNumber = SequenceNumber;
            result.Source         = Source;
            result.Id             = Id;
            return(result);
        }
예제 #2
0
        internal NetworkMessage Read(byte[] buffer)
        {
            int offset = 1;
            var result = messages[buffer[0]];

            if (result.IsGuaranteed)
            {
                result.SequenceNumber = (ushort)(buffer[1] + (buffer[2] << 8));
                offset = 3;
            }
            MsgPackSerializer.DeserializeObject(result, buffer, offset);
            return(result);
        }
예제 #3
0
        public LimeMessage?read(byte[] buffer)
        {
            int offset = 1;
            var result = messages[buffer[0]]; // get matching instance

            try {
                MsgPackSerializer.DeserializeObject(result, buffer, offset);
                return(result);
            }
            catch (Exception e) {
                return(null);
            }
        }
예제 #4
0
        internal IEnumerable <NetworkMessage> Read(byte[] buffer, int length)
        {
            int overallOffset = 0;

            while (overallOffset < length)
            {
                int offset = 1;
                var result = messages[buffer[overallOffset]];
                if (result.IsGuaranteed)
                {
                    result.SequenceNumber = (ushort)((buffer[overallOffset + 1]) + (buffer[overallOffset + 2] << 8));
                    offset = 3;
                }
                overallOffset = MsgPackSerializer.DeserializeObject(result, buffer, overallOffset + offset);
                yield return(result);
            }
        }
예제 #5
0
        private void BuildInstances(Assembly messageAssembly)
        {
            Type networkMsgType = typeof(NetworkMessage);

            foreach (Type t in messageAssembly.GetTypes())
            {
                if (t.IsSubclassOf(networkMsgType) && !messagesByType.ContainsKey(t))
                {
                    if (messages.Count == Byte.MaxValue)
                    {
                        throw new ApplicationException("The maximum number of network messages has been reached - you need to use fewer message types in this project");
                    }
                    var msg = (NetworkMessage)t.GetConstructor(Type.EmptyTypes).Invoke(Utility.emptyArgs);
                    MsgPackSerializer.SerializeObject(msg, NetworkMessage.cloneBuffer, 0);
                    MsgPackSerializer.DeserializeObject(msg, NetworkMessage.cloneBuffer, 0);
                    msg.Id           = (byte)messages.Count;
                    messages[msg.Id] = msg;
                    messagesByType[msg.GetType()] = msg;
                    NeutrinoConfig.Log("Registered message type " + msg.GetType() + " as Id " + msg.Id);
                }
            }
        }