private void LoginServerReceived(IAsyncResult ar) { try { int dataLength = loginSocket.EndReceive(ar); if (dataLength > 0) { byte[] tmp = new byte[dataLength]; Array.Copy(dataLoginServer, tmp, dataLength); NetworkMessage msg = new NetworkMessage(tmp); msg.PrepareToRead(xteaKey.ToUInt32Array()); msg.GetUInt16(); while (msg.Position < msg.Length) { byte cmd = msg.GetByte(); string message; switch (cmd) { case 0x0A: //Error message message = msg.GetString(); if (LoginServer_OnError != null) LoginServer_OnError(message); break; case 0x0B: //For your information message = msg.GetString(); if (LoginServer_FYI != null) LoginServer_FYI(message); break; case 0x14: //MOTD message = msg.GetString(); if (LoginServer_MOTD != null) LoginServer_MOTD(message); break; case 0x1E: //Patching exe/dat/spr messages case 0x1F: case 0x20: if (LoginServer_Patching != null) LoginServer_Patching("A new client is available."); return; case 0x28: //Select another login server if (LoginServer_SelectAnother != null) LoginServer_SelectAnother("Select another login server."); if (retry) { if (loginServerIndex < maxLoginServers - 1) { loginServerIndex++; TryLoginServer(); } else { if (LoginServer_CouldNotConnect != null) LoginServer_CouldNotConnect("Select another login server."); loginSocket.Disconnect(true); if (Socket_Disconnected != null) Socket_Disconnected("dataLength<=0"); } } break; case 0x64: //character list int nChars = (int)msg.GetByte(); charList = new CharacterLoginInfo[nChars]; for (int i = 0; i < nChars; i++) { charList[i].CharName = msg.GetString(); charList[i].WorldName = msg.GetString(); charList[i].WorldIP = msg.GetUInt32(); charList[i].WorldIPString = IPBytesToString(BitConverter.GetBytes(charList[i].WorldIP), 0); charList[i].WorldPort = msg.GetUInt16(); } if (LoginServer_CharList != null) LoginServer_CharList("Charlist received."); loginSocket.Disconnect(true); if (Socket_Disconnected != null) Socket_Disconnected("Charlist received."); return; default: //Notify about an unknown message if (LoginServer_UnknownMsg != null) LoginServer_UnknownMsg(msg.GetData().ToHexString()); loginSocket.Disconnect(true); if (Socket_Disconnected != null) Socket_Disconnected("Unknown Message."); break; } } } else //we didn't receive anything { if (LoginServer_ReceivedNothing != null) LoginServer_ReceivedNothing("Nothing received on LoginServerIndex=" + loginServerIndex); if (retry) { if (loginServerIndex < maxLoginServers - 1) { loginServerIndex++; TryLoginServer(); } else { if (LoginServer_CouldNotConnect != null) LoginServer_CouldNotConnect("dataLength<=0"); loginSocket.Disconnect(true); if (Socket_Disconnected != null) Socket_Disconnected("dataLength<=0"); } } } } catch (Exception) {} }