示例#1
0
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;
	}
}
示例#2
0
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;
}
示例#3
0
void Steam_NotifyClientDisconnect_hook(IRehldsHook_Steam_NotifyClientDisconnect* chain, IGameClient* cl) {
	chain->callNext(cl);
	GetPlayerByClientPtr(cl)->clear();
}
示例#4
0
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);
		}
	}
}
示例#5
0
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);
}