public void Action()
    {
        if (!RandomJudgement())
        {
            return;
        }

        if (triggeredPlayer && broadcastLocal)
        {
            SetParameter(broadcastLocal.triggeredPlayer);
        }
        else
        {
            VRCPlayerApi[] players = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];
            VRCPlayerApi.GetPlayers(players);
            foreach (var player in players)
            {
                if (player == null)
                {
                    continue;
                }
                SetParameter(player);
            }
        }
    }
Beispiel #2
0
        private int GetNextMasterID(int oldMasterID)
        {
            int newMaster = 0;

            VRCPlayerApi[] players = new VRCPlayerApi[80];

            VRCPlayerApi.GetPlayers(players);

            foreach (var player in players)
            {
                if (player == null)
                {
                    continue;
                }

                if (player.playerId != oldMasterID)
                {
                    if (newMaster == 0)
                    {
                        newMaster = player.playerId;
                    }
                    else
                    {
                        if (player.playerId < newMaster)
                        {
                            newMaster = player.playerId;
                        }
                    }
                }
            }

            return(newMaster);
        }
Beispiel #3
0
        public void OnClickTeleportButton()
        {
            if (TeleportDialogText.text == "")
            {
                return;
            }

            if (Networking.LocalPlayer == null)
            {
                return;
            }

            VRCPlayerApi[] players = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];
            VRCPlayerApi.GetPlayers(players);

            for (int i = 0; i < players.Length; i++)
            {
                if (TeleportDialogText.text == players[i].displayName)
                {
                    Networking.LocalPlayer.TeleportTo(players[i].GetPosition() + Vector3.back * 2, players[i].GetRotation());
                    return;
                }
            }

            for (int i = 0; i < LandmarkPoint.Length; i++)
            {
                if (TeleportDialogText.text == LandmarkPoint[i].gameObject.name)
                {
                    Networking.LocalPlayer.TeleportTo(LandmarkPoint[i].position, LandmarkPoint[i].rotation);
                    return;
                }
            }
        }
 public void applytoall()
 {
     VRCPlayerApi[] players = VRCPlayerApi.GetPlayers(new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()]);
     foreach (VRCPlayerApi player in players)
     {
         SetPlayerAudio(player);
     }
 }
Beispiel #5
0
        private void UpdateTotalPlayerCount(int count)
        {
            players = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];

            VRCPlayerApi.GetPlayers(players);

            playerCount = (count > playerCount) ? count : playerCount;

            TextPlayersOnline.text = $"{players.Length - ((count < 0f) ? 1 : 0)} / {playerCount}";
        }
Beispiel #6
0
        internal void UpdatePlayers()
        {
            var playerCount = VRCPlayerApi.GetPlayerCount();
            var players     = new VRCPlayerApi[playerCount];

            VRCPlayerApi.GetPlayers(players);
            var range = GetRange(playerFarRangeMapping, playerCount);

            UpdateVoiceRange(players, range);
        }
        private void Update()
        {
            if (!isRecording)
            {
                return;
            }

            if (time - beforetime > SecondsPerRecord)
            {
                if (recordAllPlayers)
                {
                    VRCPlayerApi.GetPlayers(players);
                }
                for (int i = 0; i < players.Length; i++)
                {
                    if (players[i] == null)
                    {
                        continue;
                    }
                    player = players[i];

                    string strOutputLog = "HUMR:";
                    strOutputLog += player.displayName;
                    strOutputLog += time.ToString();
                    strOutputLog += ",";
                    //hipbone = root
                    strOutputLog += player.GetBonePosition(HumanBodyBones.Hips).x.ToString("F7");
                    strOutputLog += ",";
                    strOutputLog += player.GetBonePosition(HumanBodyBones.Hips).y.ToString("F7");
                    strOutputLog += ",";
                    strOutputLog += player.GetBonePosition(HumanBodyBones.Hips).z.ToString("F7");
                    for (int j = 0; j < bonerotation.Length; j++)
                    {
                        bonerotation[j] = player.GetBoneRotation((HumanBodyBones)j);
                        strOutputLog   += ",";
                        strOutputLog   += bonerotation[j].x.ToString("F7");
                        strOutputLog   += ",";
                        strOutputLog   += bonerotation[j].y.ToString("F7");
                        strOutputLog   += ",";
                        strOutputLog   += bonerotation[j].z.ToString("F7");
                        strOutputLog   += ",";
                        strOutputLog   += bonerotation[j].w.ToString("F7");
                    }
                    Debug.Log(strOutputLog);
                    beforetime = time;
                }
            }
            time += Time.deltaTime;
        }
Beispiel #8
0
    public void GetMaster()
    {
        VRCPlayerApi[] returnArrays = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];
        master = VRCPlayerApi.GetPlayers(returnArrays)[0];
        foreach (var player in returnArrays)
        {
            if (player.isMaster)
            {
                master = player;
            }
        }

        if (master == null)
        {
            master = Networking.LocalPlayer;
        }
    }
Beispiel #9
0
        public void UpdatePlayerList()
        {
            if (Networking.LocalPlayer == null)
            {
                return;
            }

            VRCPlayerApi[] players = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];
            VRCPlayerApi.GetPlayers(players);

            string[] playersDisplayName = new string[players.Length];
            for (int i = 0; i < players.Length; i++)
            {
                playersDisplayName[i] = players[i].displayName;
            }

            scrollView.SetContents(playersDisplayName);
        }
Beispiel #10
0
        public void OnClickTeleportButton()
        {
            if (Networking.LocalPlayer == null)
            {
                return;
            }

            VRCPlayerApi[] players = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];
            VRCPlayerApi.GetPlayers(players);

            for (int i = 0; i < players.Length; i++)
            {
                if (players[i].displayName == selectPlayerText.text)
                {
                    Networking.LocalPlayer.TeleportTo(players[i].GetPosition() + Vector3.back * 2, players[i].GetRotation());
                }
            }
        }
        public void ChangeDistance()
        {
            VRCPlayerApi[] players = new VRCPlayerApi[80];
            VRCPlayerApi.GetPlayers(players);
            foreach (var player in players)
            {
                if (player == null)
                {
                    continue;
                }

                player.SetVoiceDistanceFar(farSlider.value);
            }

            if (farDistanceText != null)
            {
                farDistanceText.text = string.Format("{0:0.00}", farSlider.value);
            }
        }
Beispiel #12
0
 public void OnInteraction()
 {
     Debug.Log("[Thry] Try Teleport \"" + name + "\"");
     if (Networking.LocalPlayer != null)
     {
         if (isPlayerTeleport)
         {
             VRCPlayerApi   target  = null;
             VRCPlayerApi[] players = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];
             VRCPlayerApi.GetPlayers(players);
             foreach (VRCPlayerApi p in players)
             {
                 if (p.displayName == name)
                 {
                     target = p;
                 }
             }
             if (target != null)
             {
                 Debug.Log("[Thry] Execute Teleport to \"" + target.displayName + "\" at " + target.GetPosition());
                 Ray        ray = new Ray(target.GetPosition() + target.GetRotation() * Vector3.back + Vector3.up * 2, Vector3.down);
                 RaycastHit hit;
                 if (Physics.Raycast(ray, out hit, 5))
                 {
                     ExecuteTeleport(hit.point, target.GetRotation());
                 }
                 else
                 {
                     Debug.Log("[Thry] Could not find floor to teleport to.");
                 }
             }
         }
         else if (target != null)
         {
             ExecuteTeleport(target.position, target.rotation);
         }
         else
         {
             Debug.Log("[Thry] Teleport Point not specified.");
         }
     }
 }
    public VRCPlayerApi[] GetOccupants()
    {
        VRCPlayerApi[] allPlayers = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];
        VRCPlayerApi.GetPlayers(allPlayers);
        VRCPlayerApi[] occupants = new VRCPlayerApi[occupancy];
        int            n         = 0;

        foreach (var player in allPlayers)
        {
            // XXX apparently GetPlayers can sometimes have null in it.
            if (player == null)
            {
                continue;
            }
            if (lookup(player.playerId, playerIdKeys, playerInSet))
            {
                occupants[n++] = player;
            }
        }
        return(occupants);
    }
    // プレイヤーがJoinしたときの処理. Masterがワールドに入った時も実行される.
    public override void OnPlayerJoined(VRCPlayerApi player)
    {
        if (Networking.LocalPlayer == player)
        {
            if (!Networking.IsMaster)
            {
                //localplayer = Networking.LocalPlayer;
                isLateJoiner = true;
                matdisplay.SetInt("_GameState", -1);
                matInter.SetColor("_Color", Color.red);
            }
        }

        /*
         * if(!Networking.IsMaster){
         *  isLateJoiner = true;
         *  matdisplay.SetInt("_GameState", -1);
         *  matInter.SetColor("_Color", Color.red);
         * }
         * // */
        players = VRCPlayerApi.GetPlayers(players);
    }
    // get players stripped of the weird null players that
    // apparently occur sometimes.
    public VRCPlayerApi[] GetActivePlayers()
    {
        var playerCount = VRCPlayerApi.GetPlayerCount();

        VRCPlayerApi[] players = new VRCPlayerApi[playerCount];
        VRCPlayerApi.GetPlayers(players);
        // XXX i think I got an exception indicating players can be null
        // somehow, so check and scream about it
        int nonNullCount = 0;

        for (int i = 0; i < playerCount; i++)
        {
            if (players[i] == null)
            {
                Log("uhoh, got a null player from GetPlayers, thanks vrchat.");
            }
            else
            {
                nonNullCount++;
            }
        }
        // if we're good
        if (nonNullCount == playerCount)
        {
            return(players);
        }

        VRCPlayerApi[] ret = new VRCPlayerApi[nonNullCount];
        var            n   = 0;

        for (int i = 0; i < playerCount; i++)
        {
            if (players[i] != null)
            {
                ret[n++] = players[i];
            }
        }
        return(ret);
    }
Beispiel #16
0
        void FindOwners()
        {
            int playerCount = VRCPlayerApi.GetPlayerCount();

            VRCPlayerApi[] playerList = new VRCPlayerApi[playerCount];
            playerList = VRCPlayerApi.GetPlayers(playerList);

            foreach (VRCPlayerApi player in playerList)
            {
                if (!Utilities.IsValid(player))
                {
                    continue;
                }
                if (player.isInstanceOwner)
                {
                    instanceOwner = player.displayName;
                }
                if (player.isMaster)
                {
                    instanceMaster = player.displayName;
                }
            }
        }
Beispiel #17
0
        private void UpdatePlayerTracker()
        {
            if (Networking.LocalPlayer == null)
            {
                return;
            }

            VRCPlayerApi[] players = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];
            VRCPlayerApi.GetPlayers(players);

            for (int i = 0; i < playerTracker.Length; i++)
            {
                if (i < players.Length)
                {
                    playerTracker[i].gameObject.SetActive(true);
                    playerName[i].text = players[i].displayName;
                    playerTracker[i].anchoredPosition = TransformWorldPositionToMiniMap(players[i].GetPosition());
                }
                else
                {
                    playerTracker[i].gameObject.SetActive(false);
                }
            }
        }
        public void ChangeDistanceSync()
        {
            if (!Networking.LocalPlayer.IsOwner(gameObject))
            {
                farSlider.value = voiceDistanceFar;
            }

            VRCPlayerApi[] players = new VRCPlayerApi[80];
            VRCPlayerApi.GetPlayers(players);
            foreach (var player in players)
            {
                if (player == null)
                {
                    continue;
                }

                player.SetVoiceDistanceFar(voiceDistanceFar);
            }

            if (farDistanceText != null)
            {
                farDistanceText.text = string.Format("{0:0.00}", voiceDistanceFar);
            }
        }
 public void RefreshList()
 {
     userList = VRCPlayerApi.GetPlayers(new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()]);
 }
Beispiel #20
0
    public void UpdateTrackValue()
    {
        if (trackType == 1)
        {
            VRCPlayerApi player = null;
            switch (targetPlayer)
            {
            case 0:
                player = Networking.LocalPlayer;
                break;

            case 1:
                player = Networking.GetOwner(gameObject);
                break;

            case 2:
                if (targetTrigger)
                {
                    var playerField = (VRCPlayerApi)targetTrigger.GetProgramVariable("triggeredPlayer");
                    player = playerField;
                }
                break;

            case 3:
                VRCPlayerApi[] players = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];;
                VRCPlayerApi.GetPlayers(players);
                if (index < players.Length)
                {
                    player = players[index];
                }
                else
                {
                    player = Networking.LocalPlayer;
                }
                break;
            }
            if (player == null || !player.IsValid())
            {
                return;
            }

            switch (spot)
            {
            case "IsUserInVR":
                value_b = player.IsUserInVR();
                break;

            case "IsPlayerGrounded":
                value_b = player.IsPlayerGrounded();
                break;

            case "IsMaster":
                value_b = player.isMaster;
                break;

            case "IsInstanceOwner":
                value_b = player.isInstanceOwner;
                break;

            case "IsGameObjectOwner":
                value_b = player.IsOwner(gameObject);
                break;

            case "Position":
                value_v3 = player.GetPosition();
                if (positionTracking)
                {
                    transform.position = player.GetPosition();
                    transform.rotation = player.GetRotation();
                }
                break;

            case "Rotation":
                value_v3 = player.GetRotation().eulerAngles;
                break;

            case "HeadPosition":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).position;
                if (positionTracking)
                {
                    transform.position = player.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).position;
                    transform.rotation = player.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).rotation;
                }
                break;

            case "HeadRotation":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).rotation.eulerAngles;
                break;

            case "RightHandPosition":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand).position;
                if (positionTracking)
                {
                    transform.position = player.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand).position;
                    transform.rotation = player.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand).rotation;
                }
                break;

            case "RightHandRotation":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand).rotation.eulerAngles;
                break;

            case "LeftHandPosition":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.LeftHand).position;
                if (positionTracking)
                {
                    transform.position = player.GetTrackingData(VRCPlayerApi.TrackingDataType.LeftHand).position;
                    transform.rotation = player.GetTrackingData(VRCPlayerApi.TrackingDataType.LeftHand).rotation;
                }
                break;

            case "LeftHandRotation":
                value_v3 = player.GetTrackingData(VRCPlayerApi.TrackingDataType.LeftHand).rotation.eulerAngles;
                break;

            case "Velocity":
                value_v3 = player.GetVelocity();
                break;

            case "DisplayName":
                value_s = player.displayName;
                break;
            }
        }

        if (trackType == 2)
        {
            if (!targetObject)
            {
                return;
            }

            switch (spot)
            {
            case "IsActive":
                value_b = targetObject.activeSelf;
                break;

            case "Position":
                value_v3 = targetObject.transform.position;
                if (positionTracking)
                {
                    transform.position = targetObject.transform.position;
                    transform.rotation = targetObject.transform.rotation;
                }
                break;

            case "Rotation":
                value_v3 = targetObject.transform.rotation.eulerAngles;
                break;

            case "LocalPosition":
                value_v3 = targetObject.transform.localPosition;
                if (positionTracking)
                {
                    transform.position = targetObject.transform.position;
                    transform.rotation = targetObject.transform.rotation;
                }
                break;

            case "LocalRotation":
                value_v3 = targetObject.transform.localRotation.eulerAngles;
                break;

            case "Velocity":
                value_v3 = targetObject.GetComponent <Rigidbody>().velocity;
                break;

            case "AngularVelocity":
                value_v3 = targetObject.GetComponent <Rigidbody>().angularVelocity;
                break;
            }
        }

        if (trackType == 3)
        {
            switch (spot)
            {
            case "PlayerCount":
                value_i = VRCPlayerApi.GetPlayerCount();
                value_f = value_i;
                break;

            case "Year":
                value_i = System.DateTime.Now.Year;
                value_f = value_i;
                break;

            case "Month":
                value_i = System.DateTime.Now.Month;
                value_f = value_i;
                break;

            case "Day":
                value_i = System.DateTime.Now.Day;
                value_f = value_i;
                break;

            case "DayOfWeek":
                value_i = (int)System.DateTime.Now.DayOfWeek;
                value_f = value_i;
                break;

            case "Hour":
                value_i = System.DateTime.Now.Hour;
                value_f = value_i;
                break;

            case "Minute":
                value_i = System.DateTime.Now.Minute;
                value_f = value_i;
                break;

            case "Second":
                value_i = System.DateTime.Now.Second;
                value_f = value_i;
                break;

            case "JoinHours":
                value_f = (float)(System.DateTime.Now - startTime).TotalHours;
                value_i = (int)value_f;
                break;

            case "JoinMinutes":
                value_f = (float)(System.DateTime.Now - startTime).TotalMinutes;
                value_i = (int)value_f;
                break;

            case "JoinSeconds":
                value_f = (float)(System.DateTime.Now - startTime).TotalSeconds;
                value_i = (int)value_f;
                break;
            }
        }

        if (trackType == 4)
        {
            if (targetComponent)
            {
                if (valueType == 0)
                {
                    if (spot == "Toggle")
                    {
                        var toggle = (Toggle)targetComponent;
                        value_b = toggle.isOn;
                    }
                }
                if (valueType == 1)
                {
                    if (spot == "Text")
                    {
                        var text = (Text)targetComponent;
                        int.TryParse(text.text, out value_i);
                    }
                    if (spot == "InputField")
                    {
                        var inputField = (InputField)targetComponent;
                        int.TryParse(inputField.text, out value_i);
                    }
                }
                if (valueType == 2)
                {
                    if (spot == "Slider")
                    {
                        var slider = (Slider)targetComponent;
                        value_f = slider.value;
                    }
                    if (spot == "Scrollbar")
                    {
                        var scrollbar = (Scrollbar)targetComponent;
                        value_f = scrollbar.value;
                    }
                    if (spot == "Text")
                    {
                        var text = (Text)targetComponent;
                        float.TryParse(text.text, out value_f);
                    }
                    if (spot == "InputField")
                    {
                        var inputField = (InputField)targetComponent;
                        float.TryParse(inputField.text, out value_f);
                    }
                }
                if (valueType == 4)
                {
                    if (spot == "Text")
                    {
                        var text = (Text)targetComponent;
                        value_s = text.text;
                    }
                    if (spot == "InputField")
                    {
                        var inputField = (InputField)targetComponent;
                        value_s = inputField.text;
                    }
                }
            }
        }

        if (trackType == 5)
        {
            if (targetComponent != null && spot != "")
            {
                Animator animator = (Animator)targetComponent;
                if (valueType == 0)
                {
                    value_b = animator.GetBool(spot);
                }
                if (valueType == 1)
                {
                    value_i = animator.GetInteger(spot);
                }
                if (valueType == 2)
                {
                    value_f = animator.GetFloat(spot);
                }
            }
        }

        if (trackType == 6)
        {
            switch (spot)
            {
            case "RightIndexTrigger":
                value_f = Input.GetAxis("Oculus_CrossPlatform_SecondaryIndexTrigger");
                break;

            case "LeftIndexTrigger":
                value_f = Input.GetAxis("Oculus_CrossPlatform_PrimaryIndexTrigger");
                break;

            case "RightGrip":
                value_f = Input.GetAxis("Oculus_CrossPlatform_SecondaryHandTrigger");
                break;

            case "LeftGrip":
                value_f = Input.GetAxis("Oculus_CrossPlatform_PrimaryHandTrigger");
                break;
            }
        }

        UpdateSubValue();
    }
Beispiel #21
0
 //Called by Onplayer(Join/Left)
 public void UpdatePlayerList()
 {
     VRCPlayerApi.GetPlayers(playerList); //gets the updated list of players from VRCPlayer API, and stores it in playerList.
 }
    // 毎フレーム実行される
    void Update()
    {
        SetDebugView();
        if (isLateJoiner)
        {
            time += Time.deltaTime;
            if (time >= 10.0f)
            {
                ResetAllTime();
                SetRankingforLateJoiner();
                isLateJoiner = false;
                matdisplay.SetInt("_GameState", 0);
            }
            return;
        }
        if (isForceSync)
        {
            totalTime += Time.deltaTime;
            if (totalTime > 5.0f)
            {
                totalTime = 0.0f;
                players   = VRCPlayerApi.GetPlayers(players);
                SetRankingforLateJoiner();
                isForceSync = false;
                ResetGameState();
            }
            matdisplay.SetFloat("_TotalTime", totalTime);
            return;
        }
        if (gamestate == 0) //待機画面
        {
            totalTime += Time.deltaTime;
            if (Networking.IsOwner(this.gameObject))
            {
                time += Time.deltaTime;
                if (time >= 2.0f)
                {
                    time = 0.0f;
                    SetNowPlayerID();
                    SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "SetDisplayName");
                }
                //matInter.SetColor("_Color", Color.green);
            }
            else
            {
                matInter.SetColor("_Color", Color.red);
            }
        }
        else if (gamestate == 1) //開始前のカウントダウン
        {
            totalTime += Time.deltaTime;
            if (totalTime >= 2.998f)
            {
                if (Networking.IsOwner(this.gameObject))
                {
                    SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "SetNextState");
                    SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "ResetAllTime");
                }
            }
        }
        else if (gamestate == 2) //ゲーム中
        {
            totalTime += Time.deltaTime;

            //Ownerの手にのみColliderを追従させる
            if (Networking.IsOwner(this.gameObject))
            {
                var cubepos = localplayer.GetBonePosition(HumanBodyBones.RightIndexDistal);
                collidercube.transform.position = cubepos;
            }

            if (isJamp)
            {
                time    += Time.deltaTime;
                height   = Mathf.Sin(mypow(PI * time, 0.8f));
                height   = mypow(height, 1.0f) * 0.5f;
                campos.y = y + height * 0.3f;
                judgecam.transform.position = campos;

                if (height < 0.0)
                {
                    JumpStateFalse();
                }
            }
            matdisplay.SetFloat("_Jump", height);
        }
        else if (gamestate == 3) //ゲームオーバー
        {
            time += Time.deltaTime;
            if (isSetRanking == false)
            {
                if (time >= 3.0f)
                {
                    SortRanking();
                    SetRanking();
                    isSetRanking = true;
                    totalTime    = nowTime;
                }
            }
            if (Networking.IsOwner(this.gameObject))
            {
                if (isSetRanking & time >= 2.0f)
                {
                    time = 0.0f;
                    SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "SetDisplayName");
                }
            }
        }
        matdisplay.SetFloat("_TotalTime", totalTime);
    }
        private void Update()
        {
            var localPlayer = Networking.LocalPlayer;

            if (!Utilities.IsValid(localPlayer))
            {
                return;
            }

            if (playerListDirty)
            {
                Debug.Log($"Updating player list");
                playerListDirty = false;
                players         = new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()];
                VRCPlayerApi.GetPlayers(players);
                playerTransmitters       = new Transmitter[players.Length];
                playerPrevIsDefaultVoice = new bool[players.Length];
            }

            for (int i = 0; i < playerTransmitters.Length; i++)
            {
                playerTransmitters[i] = null;
            }

            var localPlayerPosition = localPlayer.GetPosition();

            foreach (var transmitter in transmitters)
            {
                if (
                    transmitter == null ||
                    !transmitter.Active ||
                    (transmitter.transform.position - localPlayerPosition).sqrMagnitude < Mathf.Pow(transmitter.minDistance, 2)
                    )
                {
                    continue;
                }

                var owner = Networking.GetOwner(transmitter.gameObject);
                var index = GetPlayerIndex(owner);
                if (index < 0)
                {
                    continue;
                }

                playerTransmitters[index] = transmitter;
            }

            for (int i = 0; i < players.Length; i++)
            {
                var remotePlayer = players[i];
                if (remotePlayer.isLocal)
                {
                    continue;
                }

                var      transmitter    = playerTransmitters[i];
                Receiver receiver       = transmitter == null ? null : GetReceiver(transmitter.frequency);
                var      isDefaultVoice = receiver == null;

                if (isDefaultVoice)
                {
                    if (!playerPrevIsDefaultVoice[i])
                    {
                        UpdatePlayerVoice(remotePlayer, defaultVoiceGain, defaultVoiceDistanceNear, defaultVoiceDistanceFar, defaultVoiceVolumetricRadius, true);
                    }
                }
                else
                {
                    if (Utilities.IsValid(receiver) && Utilities.IsValid(remotePlayer))
                    {
                        var receiverPosition     = receiver.transform.position;
                        var remotePlayerPosition = remotePlayer.GetPosition();
                        var transmitterPosition  = transmitter.transform.position;

                        var distanceOverRadio = (Vector3.Distance(remotePlayerPosition, transmitterPosition) + Vector3.Distance(localPlayerPosition, receiverPosition)) * 0;
                        var realDistance      = Vector3.Distance(localPlayerPosition, remotePlayerPosition);

                        var near = Mathf.Max(realDistance - distanceOverRadio, 0);
                        var far  = near + defaultVoiceDistanceFar - defaultVoiceDistanceNear;
                        var gain = defaultVoiceGain / Mathf.Max(1.0f + Mathf.Pow(distanceOverRadio * distanceAttenuation, 2.0f), 1);
                        UpdatePlayerVoice(remotePlayer, gain, near, far, far, false);
                    }
                }

                playerPrevIsDefaultVoice[i] = isDefaultVoice;
            }

            if (debugText != null && debugText.gameObject.activeInHierarchy || debugTextUi != null && ((Component)debugTextUi).gameObject.activeInHierarchy)
            {
                var text          = "<color=red>FOR DEBUG ONLY: This screen will worsen performance</color>\n\nTransmitters:\n";
                var closeText     = "<color=red>Too Close (Active)</color>";
                var activeText    = "<color=green>Active</color>";
                var nonActiveText = "<color=blue>Disabled</color>";

                for (int i = 0; i < transmitters.Length; i++)
                {
                    var transmitter = transmitters[i];
                    if (transmitter == null)
                    {
                        continue;
                    }
                    var owner    = Networking.GetOwner(transmitter.gameObject);
                    var tooClose = (transmitter.transform.position - localPlayerPosition).sqrMagnitude < Mathf.Pow(transmitter.minDistance, 2);
                    text += $"\t{i:000}:{GetUniqueName(transmitter)}\t{(transmitter.Active ? (tooClose ? closeText : activeText) : nonActiveText)}\t{transmitter.frequency:#0.00}\t{GetDebugPlayerString(owner)}\n";
                }

                text += "\nReceivers:\n";
                for (int i = 0; i < receivers.Length; i++)
                {
                    var receiver = receivers[i];
                    if (receiver == null)
                    {
                        continue;
                    }
                    var owner = Networking.GetOwner(receiver.gameObject);
                    text += $"\t{i:000}:{GetUniqueName(receiver)}\t{(receiver.active ? activeText : nonActiveText)}\t{receiver.frequency:#0.00}\t{(receiver.sync ? "Sync" : "Local")}\t{GetDebugPlayerString(owner)}\n";
                }

                text += "\nPlayers:\n";
                var talkingText      = "<color=red>Talking</color>";
                var defaultVoiceText = "<color=green>Default</color>";
                for (int i = 0; i < players.Length; i++)
                {
                    var player = players[i];
                    if (!Utilities.IsValid(player))
                    {
                        continue;
                    }

                    var transmitter = playerTransmitters[i];
                    var receiver    = transmitter == null ? (Receiver)null : GetReceiver(transmitter.frequency);

                    text += $"\t{i:000}:{GetDebugPlayerString(player)}\t{GetUniqueName(transmitter)}\t{GetUniqueName(receiver)}\t{(player.isLocal ? "<color=blue>Local</color>" : playerPrevIsDefaultVoice[i] ? defaultVoiceText : talkingText)}\n";
                }

                if (debugText != null)
                {
                    debugText.text = text;
                }
                if (debugTextUi != null)
                {
                    debugTextUi.text = text;
                }
            }
        }