void SV_WriteVoiceCodec_hooked(IRehldsHook_SV_WriteVoiceCodec* chain, sizebuf_t* sb) { IGameClient* cl = g_RehldsFuncs->GetHostClient(); CRevoicePlayer* plr = GetPlayerByClientPtr(cl); switch (plr->GetCodecType()) { case vct_silk: g_RehldsFuncs->MSG_WriteByte(sb, svc_voiceinit); //svc_voiceinit g_RehldsFuncs->MSG_WriteString(sb, ""); //codec id g_RehldsFuncs->MSG_WriteByte(sb, 0); //quality break; case vct_speex: g_RehldsFuncs->MSG_WriteByte(sb, svc_voiceinit); //svc_voiceinit g_RehldsFuncs->MSG_WriteString(sb, "voice_speex"); //codec id g_RehldsFuncs->MSG_WriteByte(sb, 5); //quality break; default: LCPrintf(true, "SV_WriteVoiceCodec() called on client(%d) with unknown voice codec\n", cl->GetId()); break; } }
bool Renosteam_FinishClientAuth(IGameClient* cl) { if (g_CurrentAuthContext == NULL) { LCPrintf(true, "WARNING: %s is called without active auth context\n", __FUNCTION__); return false; } // nosteam = bot if (g_CurrentAuthContext->nativeAuthFailed) { g_RehldsFuncs->SteamNotifyBotConnect(cl); } CRHNSPlayer* plr = GetPlayerByClientPtr(cl); if (g_CurrentAuthContext->hltv) { plr->authenticated(CA_HLTV); } else if (g_CurrentAuthContext->nativeAuthFailed) { plr->authenticated(CA_NOSTEAM); } else { plr->authenticated(CA_STEAM); } return true; }
void Steam_NotifyClientDisconnect_hook(IRehldsHook_Steam_NotifyClientDisconnect* chain, IGameClient* cl) { chain->callNext(cl); GetPlayerByClientPtr(cl)->clear(); }
void SV_ParseVoiceData_emu(IGameClient* cl) { char chReceived[4096]; unsigned int nDataLength = g_RehldsFuncs->MSG_ReadShort(); if (nDataLength > sizeof(chReceived)) { g_RehldsFuncs->DropClient(cl, FALSE, "Invalid voice data\n"); return; } g_RehldsFuncs->MSG_ReadBuf(nDataLength, chReceived); if (pcv_sv_voiceenable->value == 0.0f) { return; } CRevoicePlayer* srcPlayer = GetPlayerByClientPtr(cl); srcPlayer->SetLastVoiceTime(g_RehldsSv->GetTime()); srcPlayer->IncreaseVoiceRate(nDataLength); char transcodedBuf[4096]; char* speexData; int speexDataLen; char* silkData; int silkDataLen; switch (srcPlayer->GetCodecType()) { case vct_silk: { if (nDataLength > MAX_SILK_DATA_LEN || srcPlayer->GetVoiceRate() > MAX_SILK_VOICE_RATE) return; silkData = chReceived; silkDataLen = nDataLength; speexData = transcodedBuf; speexDataLen = TranscodeVoice(silkData, silkDataLen, srcPlayer->GetSilkCodec(), srcPlayer->GetSpeexCodec(), transcodedBuf, sizeof(transcodedBuf)); break; } case vct_speex: if (nDataLength > MAX_SPEEX_DATA_LEN || srcPlayer->GetVoiceRate() > MAX_SPEEX_VOICE_RATE) return; speexData = chReceived; speexDataLen = nDataLength; silkData = transcodedBuf; silkDataLen = TranscodeVoice(speexData, speexDataLen, srcPlayer->GetSpeexCodec(), srcPlayer->GetSilkCodec(), transcodedBuf, sizeof(transcodedBuf)); break; default: return; } int maxclients = g_RehldsSvs->GetMaxClients(); for (int i = 0; i < maxclients; i++) { CRevoicePlayer* dstPlayer = &g_Players[i]; IGameClient* dstClient = dstPlayer->GetClient(); if (!((1 << i) & cl->GetVoiceStream(0)) && dstPlayer != srcPlayer) continue; if (!dstClient->IsActive() && !dstClient->IsConnected() && dstPlayer != srcPlayer) continue; char* sendBuf; int nSendLen; switch (dstPlayer->GetCodecType()) { case vct_silk: sendBuf = silkData; nSendLen = silkDataLen; break; case vct_speex: sendBuf = speexData; nSendLen = speexDataLen; break; default: sendBuf = NULL; nSendLen = 0; break; } if (sendBuf == NULL || nSendLen == 0) continue; if (dstPlayer == srcPlayer && !dstClient->GetLoopback()) nSendLen = 0; sizebuf_t* dstDatagram = dstClient->GetDatagram(); if (dstDatagram->cursize + nSendLen + 6 < dstDatagram->maxsize) { g_RehldsFuncs->MSG_WriteByte(dstDatagram, svc_voicedata); //svc_voicedata g_RehldsFuncs->MSG_WriteByte(dstDatagram, cl->GetId()); g_RehldsFuncs->MSG_WriteShort(dstDatagram, nSendLen); g_RehldsFuncs->MSG_WriteBuf(dstDatagram, nSendLen, sendBuf); } } }
void SV_DropClient_hook(IRehldsHook_SV_DropClient* chain, IGameClient* cl, bool crash, const char* msg) { CRevoicePlayer* plr = GetPlayerByClientPtr(cl); plr->OnDisconnected(); chain->callNext(cl, crash, msg); }