Example #1
0
        public static Message ConvertProtoToMessage <T>(uint type, T proto) where T : IExtensible
        {
            byte[] bytes;
            using (var stream = Bitstream.Create()) {
                Serializer.SerializeWithLengthPrefix <T>(stream, proto, PrefixStyle.Base128);
                bytes = stream.ToBytes();
            }

            return(new Message()
            {
                Type = type,
                Data = bytes,
            });
        }
Example #2
0
        private Packet MakePacket()
        {
            var packet = new Packet
            {
                Seq    = ++sequenceOut,
                Ack    = sequenceIn,
                Stream = Bitstream.Create()
            };

            packet.Stream.SetLength(PACKET_HEADER_SIZE);
            packet.Stream.Position = PACKET_HEADER_SIZE * 8;

            return(packet);
        }
Example #3
0
        private void SendMessagesOutOfBand()
        {
            byte[] message;

            while (messagesOutOfBand.TryDequeue(out message))
            {
                using (var stream = Bitstream.Create()) {
                    stream.WriteUInt32(OOB_PACKET);
                    stream.Write(message);

                    byte[] bytes = new byte[stream.Length];
                    stream.Position = 0;
                    stream.Read(bytes, 0, bytes.Length);
                    socket.Send(bytes);
                }
            }
        }
Example #4
0
        public void SendUnreliably(params Message[] messages)
        {
            byte[] bytes;

            using (var stream = Bitstream.Create()) {
                foreach (var message in messages)
                {
                    stream.WriteVarUInt(message.Type);
                    stream.Write(message.Data);
                }

                bytes = stream.ToBytes();
            }

            lock (messageLock) {
//                log.Debug("Queuing unreliably " + bytes.Length + " bytes");
                messagesUnreliable.Enqueue(bytes);
            }
        }
Example #5
0
        public void RequestHandshake()
        {
            connection.Open();

            using (var stream = Bitstream.Create())
            {
                stream.WriteChar(C2S_REQUEST);

                stream.WriteUInt32(client_challenge);

                foreach (var c in "0000000000")
                {
                    stream.WriteChar(c);
                }
                stream.WriteByte(0);

                connection.EnqueueOutOfBand(stream.ToBytes());
            }
        }
Example #6
0
        public void RespondHandshake()
        {
            using (var stream = Bitstream.Create())
            {
                stream.WriteChar(C2S_CONNECT);
                stream.WriteUInt32(SOURCE_VERSION);
                stream.WriteUInt32(STEAM_VERSION);
                stream.WriteUInt32(server_challenge);
                stream.WriteUInt32(client_challenge);

                stream.Write(Encoding.UTF8.GetBytes(state.CVars["name"]));
                stream.WriteByte(0);

                stream.Write(Encoding.UTF8.GetBytes(details.PassKey.ToString()));
                stream.WriteByte(0);

                // num players to join, obviously one in this case
                stream.WriteByte(1);

                // cvars
                stream.WriteByte((byte)CLC_Messages.clc_SplitPlayerConnect);

                var split = new CCLCMsg_SplitPlayerConnect();
                split.convars = state.ExposeCVars();
                Serializer.SerializeWithLengthPrefix(stream, split, PrefixStyle.Base128);

                // auth ticket
                var bytes = new byte[details.ServerAuthTicket.Length];
                details.ServerAuthTicket.CopyTo(bytes, 0);

                var carry = false;
                for (var i = 0; i < bytes.Length; ++i)
                {
                    var d = (byte)(((bytes[i] * 2) % 256) + (carry ? 1 : 0));
                    carry    = bytes[i] > 127;
                    bytes[i] = d;
                }
                stream.Write(bytes);

                connection.EnqueueOutOfBand(stream.ToBytes());
            }
        }
Example #7
0
        public void SendReliably(params Message[] messages)
        {
            byte[] bytes;

            using (var stream = Bitstream.Create())
            {
                foreach (var message in messages)
                {
                    stream.WriteVarUInt(message.Type);
                    stream.Write(message.Data);
                }

                bytes = stream.ToBytes();
            }

            lock (messageLock)
            {
                messagesReliable.Enqueue(bytes);
            }
        }
Example #8
0
        private void SendUserCmds()
        {
            var last = new UserCmd();

            using (var stream = Bitstream.Create())
            {
                var move = new CCLCMsg_Move();

                move.num_backup_commands = (uint)backup.Count;
                foreach (var cmd in backup)
                {
                    WriteUserCmd(cmd, last, stream);
                    last = cmd;
                }

                move.num_new_commands = (uint)next.Count;
                foreach (var cmd in next)
                {
                    WriteUserCmd(cmd, last, stream);
                    last = cmd;
                }

                backup.Clear();
                backup.AddRange(next);
                next.Clear();

                move.data = stream.ToBytes();

                var tick = new CNETMsg_Tick();
                tick.tick = state.ServerTick;

                connection.SendUnreliably(
                    DotaGameConnection.ConvertProtoToMessage((uint)CLC_Messages.clc_Move, move),
                    DotaGameConnection.ConvertProtoToMessage((uint)NET_Messages.net_Tick, tick));
            }
        }