Jump to content

Ограничение дистанции голосового чата


Recommended Posts

-- в клиенте 
  
local VOICE_MAX_DISTANCE = 50 -- метров 
  
addEventHandler( 'onClientPlayerVoiceStart', root, 
    function() 
        if source == localPlayer then return end 
         
        local myPos =           { getElementPosition(localPlayer) } 
        local voiceStartPos =   { getElementPosition(source) } 
         
        if  myPos[3] and 
            voiceStartPos[3] and 
            getDistanceBetweenPoints3D (  
                myPos[1], myPos[2], myPos[3], 
                voiceStartPos[1], voiceStartPos[2], voiceStartPos[3] ) > VOICE_MAX_DISTANCE 
        then 
            cancelEvent() 
        end 
    end 
) 

при ответе "не работает" все равно код дорабатывать придется автору вопроса

Link to comment

Мастер, если бы все было так просто, я бы и не обращался на форум, конечно же я несколько вариантов пытался делать.

Делал именно на серверной части и результат нулевой. Во первых функции и события в новизну! Так что если можешь напиши пожалуйста как должно быть.

Link to comment

вот:

  
addEventHandler("onPlayerVoiceStart", root,  
function() 
outputChatBox("Внимание;- голосовой чат ограничен!(10м)", source) 
local posX, posY, posZ = getElementPosition( source ) 
    for i, thePlayer in ipairs( getElementsByType( 'player' ) ) do 
    local tarX, tarY, tarZ = getElementPosition( thePlayer ) 
        if not(source == thePlayer) then 
        local distance = getDistanceBetweenPoints3D ( posX, posY, posZ, tarX, tarY, tarZ ) 
            if (distance > 10) then 
            setPlayerVoiceIgnoreFrom(thePlayer, source) 
            end 
        end  
    end 
end) 
  

Link to comment

предположение

addEventHandler("onPlayerVoiceStart", root,  
    function() 
        outputChatBox("Внимание;- голосовой чат ограничен!(10м)", source) 
        local posX, posY, posZ = getElementPosition( source ) 
  
        for i, thePlayer in ipairs( getElementsByType( 'player' ) ) do 
            local tarX, tarY, tarZ = getElementPosition( thePlayer ) 
            if not(source == thePlayer) then 
            local distance = getDistanceBetweenPoints3D ( posX, posY, posZ, tarX, tarY, tarZ ) 
                if (distance > 10) then 
                    setPlayerVoiceIgnoreFrom(thePlayer, source) 
--- добавлено мной -------------------------------------------- 
                else 
                    setPlayerVoiceBroadcastTo(source, thePlayer) 
-------------------------------------------------------------------- 
                end 
            end  
        end 
    end 
) 

Link to comment

Проблема не решена полностью, попытаюсь объяснить что не так.

Люди, находящиеся вдали, блокируются функцией "ignore",- после, они вообще теряют возможность говорить,- как будто их мутят по голосу!

Link to comment

еще один "методотыковый" возможный вариант (:

addEventHandler("onPlayerVoiceStart", root,  
    function() 
        outputChatBox("Внимание;- голосовой чат ограничен!(10м)", source) 
        local posX, posY, posZ = getElementPosition( source ) 
  
        for i, thePlayer in ipairs( getElementsByType( 'player' ) ) do 
            local tarX, tarY, tarZ = getElementPosition( thePlayer ) 
            if not(source == thePlayer) then 
            local distance = getDistanceBetweenPoints3D ( posX, posY, posZ, tarX, tarY, tarZ ) 
                if (distance > 10) then 
--- ключевой код ----------------------------------------------- 
                    setPlayerVoiceIgnoreFrom(thePlayer, source) 
                    setPlayerVoiceIgnoreFrom(source, thePlayer) 
                else 
                    setPlayerVoiceBroadcastTo(source, thePlayer) 
                    setPlayerVoiceBroadcastTo(thePlayer, source) 
-------------------------------------------------------------------- 
                end 
            end  
        end 
    end 
) 

хотя, честно говоря, это мона делать и в таймере. Ну потому что прямо во время разговора игрок может подойти ближе к кому-то, а его голос станет слышен, рядом стоящему игроку, только, если он снова нажмет кнопку разговора. Хотя это все теория (:

Link to comment

Разработчики откликнитесь, похоже нам с мастером не получится разрешить эту проблему.

Теперь происходит эффект мута(mute) "игроков-источников"(source players)!

Думаю, функция setPlayerVoiceIgnoreFrom() это и делает.

Есть ли функция, обратная этой по свойствам?

Link to comment

Эффект тот-же, если можешь напиши разработчикам.

Была еще проблема, что передавалось только одному человеку в радиусе, добавил сферу чтоб собрать всех людей в радиусе.

Вот смотри что получилось.

  
addEventHandler("onPlayerVoiceStart", root, 
function() 
    outputChatBox("Внимание;- голосовой чат ограничен!(10м)", source) 
    voice_dist = 10 
    sourX, sourY, sourZ = getElementPosition( source ) 
    for i, thePlayer in ipairs( getElementsByType( 'player' ) ) do 
        tarX, tarY, tarZ = getElementPosition( thePlayer ) 
        if not(source == thePlayer) then 
        distance = getDistanceBetweenPoints3D ( sourX, sourY, sourZ, tarX, tarY, tarZ ) 
            if (distance > voice_dist) then 
                setPlayerVoiceIgnoreFrom(thePlayer, source) 
                setPlayerVoiceIgnoreFrom(source, thePlayer) 
            else 
                voiceSphere = createColSphere( sourX, sourY, sourZ, voice_dist ) 
                nearbyPlayers = getElementsWithinColShape( voiceSphere, "player" ) 
                destroyElement( voiceSphere ) 
                for index, nearbyPlayer in ipairs( nearbyPlayers ) do 
                setPlayerVoiceIgnoreFrom(thePlayer, nil) 
                setPlayerVoiceIgnoreFrom(source, nil) 
                setPlayerVoiceBroadcastTo(source, nearbyPlayer) 
                setPlayerVoiceBroadcastTo(nearbyPlayer, source) 
                end 
            end 
        end 
    end 
end 
) 
  

Или если у тебя есть еще идея,- пиши....

Edited by Guest
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...