public static void TransferKeyHandler(ZoneClient client, Packet packet) { ushort randomID; string characterName, checksums; //TODO: check in securityclient if (!packet.TryReadUShort(out randomID) || !packet.TryReadString(out characterName, 16) || !packet.TryReadString(out checksums, 832)) { Log.WriteLine(LogLevel.Warn, "Invalid game transfer."); return; } ClientTransfer transfer = ClientManager.Instance.GetTransfer(characterName); if (transfer == null || transfer.HostIP != client.Host || transfer.RandID != randomID) { Log.WriteLine(LogLevel.Warn, "{0} tried to login without a valid client transfer.", client.Host); //Handler3.SendError(client, ServerError.INVALID_CREDENTIALS); Handler4.SendConnectError(client, ConnectErrors.RequestedCharacterIDNotMatching); return; } try { ClientManager.Instance.RemoveTransfer(characterName); ZoneCharacter character = new ZoneCharacter(characterName); if (character.AccountID != transfer.AccountID) { Log.WriteLine(LogLevel.Warn, "Character is logging in with wrong account ID."); Handler4.SendConnectError(client, ConnectErrors.RequestedCharacterIDNotMatching); //Handler3.SendError(client, ServerError.INVALID_CREDENTIALS); return; } client.Authenticated = true; client.Admin = transfer.Admin; client.AccountID = transfer.AccountID; client.Username = transfer.Username; client.Character = character; character.Client = client; if (ClientManager.Instance.AddClient(client)) { character.SendGetIngameChunk(); //TODO: world server notification over WCF? Log.WriteLine(LogLevel.Debug, "{0} logged in successfully!", character.Name); } } catch (Exception ex) { Log.WriteLine(LogLevel.Exception, "Error loading character {0}: {1} - {2}", characterName, ex.ToString(), ex.StackTrace); Handler4.SendConnectError(client, ConnectErrors.ErrorInCharacterInfo); } }