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(client.CVars["name"])); stream.WriteByte(0); stream.Write(Encoding.UTF8.GetBytes(details.Secret.ToString())); stream.WriteByte(0); // num players stream.WriteByte(1); // cvars stream.WriteByte((byte)CLC_Messages.clc_SplitPlayerConnect); var split = new CCLCMsg_SplitPlayerConnect(); split.convars = client.ExposeCVars(); Serializer.SerializeWithLengthPrefix(stream, split, PrefixStyle.Base128); connection.EnqueueOutOfBand(stream.ToBytes()); } }
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()); } }