uint32_t pnAuthClient::sendAcctLoginRequest(uint32_t serverChallenge, uint32_t clientChallenge, const plString& acctName, const plString& password, const plString& authToken, const plString& os) { const pnNetMsg* desc = GET_Cli2Auth(kCli2Auth_AcctLoginRequest); msgparm_t* msg = NCAllocMessage(desc); uint32_t transId = nextTransId(); msg[0].fUint = transId; msg[1].fUint = clientChallenge; msg[2].fString = plwcsdup(acctName.wstr()); pnSha1Hash hash; if (acctName.find('@') != -1 && acctName.find("@gametap") == -1 && acctName.find("@magiquest") == -1) { hash = NCHashLoginInfo(acctName, password, serverChallenge, clientChallenge); } else { hash = pnSha1Hash::Sha1(password.cstr(), password.len()); hash.swapBytes(); // Cyan uses a different byte order for this case } memcpy(msg[3].fData, &hash, sizeof(hash)); msg[4].fString = plwcsdup(authToken.wstr()); msg[5].fString = plwcsdup(os.wstr()); fSock->sendMsg(msg, desc); NCFreeMessage(msg, desc); return transId; }