Jump to content

Dúvidas sobre o resource voice


Gaimo

Recommended Posts

Quero fazer um sistema de "radinho" colocar dois ou mais jogadores em uma mesma frequência para conversar entre si, vi que no resource Resource:Voice, tem essa função:

setPlayerChannel(player, channel) 

Minhas dúvidas são:

O resource por padrão, só é possível ouvir outro jogador falando se estiver próximo, se eu setar um canal para um jogador, e ele falar vai sair para quem está próximo e quem está no canal ou somente para quem está no canal?

Se eu setar um jogador em um canal como eu removo ele se não existe uma função removePlayerChannel? basta setar o ID do canal como 0 ou false?


Quando um jogador está em um canal e fala com outros jogadores que estão no canal é por proximidade ou é global?

Link to comment
  • Other Languages Moderators
3 hours ago, Gaimo said:

[...] se eu setar um canal para um jogador, e ele falar vai sair para quem está próximo e quem está no canal ou somente para quem está no canal?

Somente para quem está no canal e estiver próximo.

3 hours ago, Gaimo said:

Se eu setar um jogador em um canal como eu removo ele se não existe uma função removePlayerChannel?

Não é possível remover o canal de um jogador pois isso faria ele não ouvir e nem falar com ninguém (rádio sem conexão). Se quiser ter um canal "global" você pode definir um ID padrão para colocar todos os jogadores nesse ID ao conectarem no servidor. Por exemplo, coloque todos os jogadores para o canal 0 quando eles entram no servidor. Assim quando quiser que um jogador volte ao canal global pra falar com geral, basta setá-lo no canal 0. Os jogadores só são removidos dos canais ao desconectarem do servidor, então defina um canal padrão para manter os "sem canal".

3 hours ago, Gaimo said:

Quando um jogador está em um canal e fala com outros jogadores que estão no canal é por proximidade ou é global?

Proximidade, como dito na primeira resposta.


OBS: Por padrão, o resource voice está configurado para criar canais associados aos teams. Se o jogador estiver em um team, o resource irá colocá-lo no canal do team, assim ele só poderá se comunicar com os jogadores deste team. Você pode desabilitar a criação automática de canais de equipe deixando a configuração "autoassign_to_teams" como false pelo painel Admin. Da mesma forma, para colocar um jogador no canal de sua equipe (caso ele não esteja em nenhum ou esteja em canal numérico), basta não declarar o parâmetro de ID ao usar o setPlayerChannel que ele irá identificar o team do jogador e colocá-lo no canal do mesmo.

Link to comment

Então não rola eu usar o resource voice?

No caso quero o seguinte, quero definir o jogador em uma frequência e quando ele falar quem está perto e quem está na frequência possa ouvir. Como eu poderia fazer isso? 

Quero que o jogador posso ficar alternando as frequências, por exemplo se ele trocar da 0 para a 1 ele saia da 0 e entre na 1 e assim por diante.

CLIENT

function click(btn)

    if btn == "left" and source == g.up then 

        frequency = frequency + 1
        if frequency > 999 then frequency = 0 end
        dgsSetText(g.label, frequency.." Hz")
        triggerServerEvent ( "setFrequency", resourceRoot, localPlayer, frequency)

    elseif btn == "left" and source == g.down then

        frequency = frequency - 1
        if frequency < 0 then frequency = 999 end
        dgsSetText(g.label, frequency.." Hz")
        triggerServerEvent ( "setFrequency", resourceRoot, localPlayer, frequency)
    end

end

SERVER
 

local players = {
}


addEvent( "setFrequency", true )
addEventHandler( "setFrequency", resourceRoot, function(player, frequency) 

    players[player] = frequency -- ????

    setPlayerVoiceBroadcastTo(player, TABELA_DE_JOGADORES)


end)

Como eu devo usar o setPlayerVoiceBroadcastTo ??
No caso imagino que preciso adicionar os jogadores da mesma frequência numa mesma tabela e remover mas como?
Como posso verificar se dois ou mais jogadores estão na mesma frequência?

Aproveitando o post, mais uma dúvida sobre tabelas, como eu percorreria uma tabela assim:
 

local exemplo = {}

addEventHandler("onPlayerJoin", root, function()

    exemplo[source] = math.random(1, 1000)

end)

Supondo que eu queira descobrir o valor de cada player como eu faria ? Tipo um for que print o valor de todos os players.


 

Link to comment

Como funciona o evento onClientPlayerVoiceStart?
 

voicePlayers = {}
globalMuted = {}

---
addEventHandler ( "onClientPlayerVoiceStart", root,
	function()
		if isPlayerVoiceMuted ( source ) then
			cancelEvent()
			return
		end
		voicePlayers[source] = true
	end
)

o que tem a ver o voicePlayers[source] = true ? como ele funciona?

No script não encontrei nenhum lugar onde o player é jogado dentro do voicePlayers além desse evento, e por que somente quando voicePlayers[source] está true que eu posso ouvir outros jogadores?

Qual a diferença do evento onClientPlayerVoiceStart e do setPlayerVoiceBroadcastTo?

Link to comment
  • Other Languages Moderators
On 17/09/2020 at 20:41, Gaimo said:

No caso quero o seguinte, quero definir o jogador em uma frequência e quando ele falar quem está perto e quem está na frequência possa ouvir. Como eu poderia fazer isso?

setPlayerVoiceBroadcastTo faz isso. Vc define pra quem a voz do jogador será transmitida. Essa função não tem relação com o resource voice.

On 17/09/2020 at 20:41, Gaimo said:

Quero que o jogador posso ficar alternando as frequências, por exemplo se ele trocar da 0 para a 1 ele saia da 0 e entre na 1 e assim por diante.

Não é possível estar em duas frequências ao mesmo tempo. Ao setar um novo canal de voz para o jogador, ele já vai sair do canal que estava antes.

On 17/09/2020 at 20:41, Gaimo said:

Como eu devo usar o setPlayerVoiceBroadcastTo ??
No caso imagino que preciso adicionar os jogadores da mesma frequência numa mesma tabela e remover mas como?
Como posso verificar se dois ou mais jogadores estão na mesma frequência?

Na Wiki não deixa explícito sobre as frequências (canais de voz) pois isso é uma função do resource voice e não do MTA. Ao usar a função setPlayerVoiceBroadcastTo, ele vai ignorar os canais, a não ser que você sete o jogador em um novo canal depois. Na verdade essa função já faz a mesma coisa que os canais, ele define quem vai ouvir a voz do jogador.
--------
Sobre o seu exemplo de tabelas, não faz sentido atribuir valores aleatórios aos jogadores, pois podem repetir.

Por se tratar de uma tabela de elementos (jogadores), você usa o pairs. Só se usa ipairs em tables indexadas com integers (números inteiros).

for player,value in pairs (exemplo) do -- Para cada jogador na lista exemplo, faça:
    if (isElement (player)) then -- Se player ainda é um elemento, então:
        local name = getPlayerName (player) -- Obtém o nick desse player.
        print ("Valor de "..name..": "..value) -- Mostra o nick e o valor dele salvo na table.
    end
end
 
On 24/09/2020 at 00:14, Gaimo said:

Como funciona o evento onClientPlayerVoiceStart?

Evento que é acionado sempre que um jogador habilita seu microfone para falar. Se quem começou a falar for você mesmo (localPlayer) então você será o source desse evento. Se foi outro player que começou a falar com vc, então ele será o source.

On 24/09/2020 at 00:14, Gaimo said:

o que tem a ver o voicePlayers[source] = true ? como ele funciona?

No script não encontrei nenhum lugar onde o player é jogado dentro do voicePlayers além desse evento, e por que somente quando voicePlayers[source] está true que eu posso ouvir outros jogadores?

Sobre o script que vc está mostrando, no resource voice essa tabela serve apenas para informar ao cDrawIcon.lua quais jogadores próximos (inclusive o próprio localPlayer) estão falando para poder desenhar o microfone em cima de sua cabeça. Além disso ele verifica se o jogador que está tentando falar está mutado ou não. Se estiver, o microfone também não será desenhado.

Ou seja, o player que estiver como true, terá um microfone sendo desenhado em cima da sua cabeça, após o script verificar se ele está mutado ou não.

On 24/09/2020 at 00:14, Gaimo said:

Qual a diferença do evento onClientPlayerVoiceStart e do setPlayerVoiceBroadcastTo?

O primeiro é um evento e o segundo é uma função. O evento onClientPlayerVoiceStart é ativado quando o jogador libera o microfone para falar (segurando a tecla Z, por exemplo). A função setPlayerVoiceBroadcastTo serve para definir pra quais jogadores a voz de tal jogador será transmitida.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...