/// <summary> /// Joins the specified channel /// </summary> /// <param name="channelName"></param> /// <param name="password"></param> public void JoinChannel(Channel channel) { if (ChannelMgr.ChannelList.Contains(channel)) return; PacketWriter writer = new PacketWriter(Opcodes.CMSG_JOIN_CHANNEL); writer.Write((UInt32)0); writer.Write((byte)0); writer.Write((byte)0); writer.Write(channel.Name.ToCString()); writer.Write(channel.Password); Send(writer); RequestChannelList(channel.Name); }
void HandleServerAuthChallenge(PacketReader reader) { uint one = reader.ReadUInt32(); uint seed = reader.ReadUInt32(); BigInteger seed1 = reader.ReadBytes(16).ToBigInteger(); BigInteger seed2 = reader.ReadBytes(16).ToBigInteger(); var rand = System.Security.Cryptography.RandomNumberGenerator.Create(); byte[] bytes = new byte[4]; rand.GetBytes(bytes); BigInteger _seed = bytes.ToBigInteger(); uint zero = 0; byte[] response = HashAlgorithm.SHA1.Hash(Encoding.ASCII.GetBytes(Manager.m_WorldServer.username.ToUpper()), BitConverter.GetBytes(zero), BitConverter.GetBytes((uint)_seed), BitConverter.GetBytes(seed), Manager.m_WorldServer.SessionKey.ToCleanByteArray()); PacketWriter writer = new PacketWriter(Opcodes.ClientAuthSession); writer.Write((uint)12340); writer.Write(zero); writer.Write(Manager.m_WorldServer.username.ToUpper().ToCString()); writer.Write(zero); writer.Write((uint)_seed); writer.Write(zero); writer.Write(zero); writer.Write(zero); writer.Write((ulong)zero); writer.Write(response); writer.Write(zero); Send(writer); AuthenticationCrypto.Initialize(Manager.m_WorldServer.SessionKey.ToCleanByteArray()); }
public ClientHeader(Opcodes opcode, PacketWriter packet) { Opcode = opcode; Packet = packet; }
/// <summary> /// Sends a message by type /// </summary> /// <param name="type"></param> /// <param name="richTextBox"></param> private void SendMessage(ChatType type, RichTextBox richTextBox) { PacketWriter writer = new PacketWriter(Opcodes.CMSG_MESSAGECHAT); switch (type) { case ChatType.CHAT_TYPE_SAY: writer.Write((UInt32)ChatType.CHAT_TYPE_SAY); break; case ChatType.CHAT_TYPE_YELL: writer.Write((UInt32)ChatType.CHAT_TYPE_YELL); break; } writer.Write((UInt32)Language.LANG_UNIVERSAL); writer.Write(richTextBox.Text.ToCString()); WorldMgr.Server.Send(writer); richTextBox.Text = ""; }
/// <summary> /// Request Channel List by ChannelName /// You must be in the channel to receive a list /// </summary> /// <param name="channelName"></param> public void RequestChannelList(string channelName) { PacketWriter writer = new PacketWriter(Opcodes.CMSG_CHANNEL_LIST); writer.Write(channelName.ToCString()); Send(writer); }
/// <summary> /// Sends Opcode & data to the server /// </summary> /// <param name="writer"></param> public void Send(PacketWriter writer) { byte[] data = writer.FinalizePacket(); lock (SendLock) tcpClient.Client.Send(data); Interlocked.Add(ref transferred, data.Length); Interlocked.Add(ref sent, data.Length); }
void HandleServerAuthResponse(PacketReader reader) { byte detail = reader.ReadByte(); uint billingTimeRemaining = reader.ReadUInt32(); byte billingFlags = reader.ReadByte(); uint billingTimeRested = reader.ReadByte(); byte expansion = reader.ReadByte(); if (detail == 0x0C) { PacketWriter writer = new PacketWriter(Opcodes.ClientEnumerateCharacters); Send(writer); } else ErrorMessage = "Could not respond to ServerAuthResponse"; }
void HandleServerChatMessage(PacketReader reader) { ChatType type = (ChatType)reader.ReadByte(); Language language; UInt64 targetGUID; UInt64 targetGUIDOther; UInt32 messageLength; string channelName = null; string message; if ((type != ChatType.CHAT_TYPE_CHANNEL && type != ChatType.CHAT_TYPE_WHISPER)) language = (Language)reader.ReadUInt32(); else language = (Language)reader.ReadUInt32(); targetGUID = reader.ReadUInt64(); reader.ReadUInt32(); switch (type) { case ChatType.CHAT_TYPE_CHANNEL: channelName = reader.ReadCString(); break; } targetGUIDOther = reader.ReadUInt64(); messageLength = reader.ReadUInt32(); message = reader.ReadCString(); reader.ReadByte(); PlayerName result = PlayerNameList.Find( delegate(PlayerName playerName) { return playerName.GUID == targetGUID; }); if (type == ChatType.CHAT_TYPE_SYSTEM) { foreach (string syntax in message.Split('\n')) if (!CmdList.Contains(syntax)) // Prevent double message CmdList.Add(syntax); } if (result != null) { QueryChatMessage.Type = type; QueryChatMessage.Message = message; QueryChatMessage.Name = result.Name; if (channelName != null) QueryChatMessage.ChannelName = channelName; ReceiveMsg = QueryChatMessage; } else { QueryChatMessage.Type = type; QueryChatMessage.Message = message; if (channelName != null) QueryChatMessage.ChannelName = channelName; } if (targetGUID > 0) { PacketWriter writer = new PacketWriter(Opcodes.CMSG_NAME_QUERY); writer.Write(targetGUID); Send(writer); } }