13/06/2022 05:03
(Esta mensagem foi modificada pela última vez a: 13/06/2022 05:04 por OTAKEIRO.)
Num testei... Afinal voip é meio complicado de mexer, mas acho que deve funcionar, tudo o que voce precisa fazer pra complementar é ativar o microfone quando o jogador pressionar para falar e usar DisconnectPlayer em OnPlayerDisconnect, em OnGameModeExit e em OnFilterScriptInit para prevenir que um canal não usado permaneça ocupando a memoria
Fiz com que o canal fosse deletado se nao tivesse ouvintes
E usei iterador pra pesquisar um campo livre no array pq o array é de 1000 caracters (padrão do MAX_PLAYERS), acho desnecessário um array de 9999
Código:
enum SERVER_RADIO
{
Channel,
Listener,
SV_PTR:Audio
}
new
P_Radio[MAX_PLAYERS],
S_Radio[MAX_PLAYERS][SERVER_RADIO];
new Iterator:I_Radio<MAX_PLAYERS>;
CMD:radio(playerid, params[])
{
new string[255], integer;
if(sscanf(params, "d", integer))
{
if(P_Radio[playerid])
{
format(string, sizeof(string), "[RADIO] Seu canal atual: %d", P_Radio[playerid]);
SendClientMessage(playerid, -1, string);
}
SendClientMessage(playerid, -1, "[RADIO] Utilize /radio [1 a 9999] para alterar o canal");
SendClientMessage(playerid, -1, "[RADIO] Utilize /radio 0 para desligar o radio");
}
else
{
if(P_Radio[playerid] != integer)
{
if(integer == 0)
{
integer = FindChannel(integer);
DisconnectPlayer(playerid, integer);
SendClientMessage(playerid, -1, "[RADIO] O seu radio foi desligado!");
}
else if(1 <= integer <= 9999)
{
DisconnectPlayer(playerid);
P_Radio[playerid] = integer;
if(!FindChannel(integer))
{
integer = Iter_Free(I_Radio);
Iter_Add(I_Radio, integer);
S_Radio[integer][Channel] = P_Radio[playerid];
S_Radio[integer][Audio] = SvCreateGStream(0, "Radio");
}
SvAttachListenerToStream(S_Radio[channel][Audio], playerid);
SvAttachSpeakerToStream(S_Radio[channel][Audio], playerid);
S_Radio[channel][Listener]++;
format(string, sizeof(string), "[RADIO] Voce foi conectado ao canal: %d", P_Radio[playerid]);
SendClientMessage(playerid, -1, string);
}
else CallLocalFunction("OnPlayerCommandText", "ds", playerid, "/radio");
}
else
{
if(integer == 0) SendClientMessage(playerid, -1, "[ERRO] O seu radio nao esta ligado!");
else SendClientMessage(playerid, -1, "[ERRO] Voce ja esta ouvindo esse canal!");
}
}
return 1;
}
FindChannel(&dest)
{
foreach(new i : I_Radio)
{
if(S_Radio[i][Channel] == dest)
{
dest = i;
return 1;
}
}
return 0;
}
DisconnectPlayer(playerid, channel = P_Radio[playerid])
{
SvDetachListenerFromStream(S_Radio[channel][Audio], playerid);
SvDetachSpeakerFromStream(S_Radio[channel][Audio], playerid);
P_Radio[playerid] = 0;
if(0 == --S_Radio[channel][Listener])
{
Iter_Remove(I_Radio, channel);
SvDeleteStream(S_Radio[channel][Audio]);
}
}
Fiz com que o canal fosse deletado se nao tivesse ouvintes
E usei iterador pra pesquisar um campo livre no array pq o array é de 1000 caracters (padrão do MAX_PLAYERS), acho desnecessário um array de 9999