示例#1
0
    // Called locally when a slot's claim status has changed.
    public void _u_RebuildSlotsMap()
    {
        // Ownership of objects gets transferred back to master before a player leaves, and thus
        // GetPlayerCount reports that nothing has changed.
        // Manually counting claims should represent the accurate new player count
        int claimsCount = 0;

        foreach (Slot s in slots)
        {
            if (s.claimed)
            {
                claimsCount++;
            }
        }
        debug._u_Log("[SlotPool] _u_RebuildSlotsMap VRCPlayerCount: " + VRCPlayerApi.GetPlayerCount() + " claimsCount: " + claimsCount);

        orderedPlayers = new VRCPlayerApi[claimsCount];
        int j = 0;

        for (int i = 0; i < slots.Length; i++)
        {
            if (slots[i].claimed)
            {
                VRCPlayerApi owner = Networking.GetOwner(slots[i].gameObject);
                slotPlayers[i]      = owner;
                orderedPlayers[j++] = owner;
            }
            else
            {
                slotPlayers[i] = null;
            }
        }
        _u_SendCallback("_u_OnPoolSlotsChanged");
    }
示例#2
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 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);
            }
        }
    }
    public virtual void OnPlayerLeft(VRC.SDKBase.VRCPlayerApi player) //getting the player array on player leave still has the leaving player so you must remove it manually.
    {
        for (int i = 0; i < userList.Length; i++)
        {
            if (userList[i] == player)
            {
                userList[i] = null;
                break;
            }
        }
        RefreshUsers();

        if (numberDisplay)
        {
            /*
             * int usernumber = 0;
             * foreach (VRCPlayerApi user in userList)
             * {
             *  if(user != null)
             *  {
             *      usernumber += 1;
             *  }
             * }
             *
             * numberDisplay.text = usernumber.ToString();
             */
            numberDisplay.text = VRCPlayerApi.GetPlayerCount().ToString();
        }
    }
 public void applytoall()
 {
     VRCPlayerApi[] players = VRCPlayerApi.GetPlayers(new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()]);
     foreach (VRCPlayerApi player in players)
     {
         SetPlayerAudio(player);
     }
 }
示例#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);
        }
    public virtual void OnPlayerJoined(VRC.SDKBase.VRCPlayerApi player)
    {
        RefreshList();
        RefreshUsers();

        if (numberDisplay)
        {
            numberDisplay.text = VRCPlayerApi.GetPlayerCount().ToString();
        }
    }
示例#8
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}";
        }
        private bool CheckVote()
        {
            var clientCount = VRCPlayerApi.GetPlayerCount() - 1;

            if (playerVote == clientCount)
            {
                return(true);
            }

            return(false);
        }
示例#10
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;
        }
    }
示例#11
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);
        }
示例#12
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());
                }
            }
        }
示例#13
0
    public void broadcastBlock(byte x, byte y, byte z, byte type)
    {
        int blockIndex = getOwnedOrLowerReleasedIndex();

        if (blockIndex <= syncBlocks.Length - 1) // Check if player has a synced gameobject to talk to
        {
            GameObject  block       = syncBlocks[blockIndex];
            SyncedBlock syncedBlock = block.GetComponent <SyncedBlock>();

            Networking.SetOwner(Networking.LocalPlayer, block);
            syncedBlock.setBlock(x, y, z, type);

            if (VRCPlayerApi.GetPlayerCount() == 1) // Force block place in solo world
            {
                syncedBlock.OnPreSerialization();
            }
        }
    }
    public void _u_SendNetworkEventWithArguments(byte eventID, byte[] targetPlayersBySlotIndex, float argument1, int argument2)
    {
        // Don't serialize anything if you're the only player in the instance.
        // OnPostSerialization will never be called and the network event buffer will never empty
        if (VRCPlayerApi.GetPlayerCount() == 1)
        {
            return;
        }

        // Manually serialize network event and append it to networkEventsSerialized
        // 1 eventID + targetPlayersBySlotIndex + 1 targetPlayersBySlotIndex length + argument1 as string length + 1 byte length + 4 argument2
        string floatString = argument1.ToString();

        byte[] networkEvent = new byte[7 + targetPlayersBySlotIndex.Length + floatString.Length];
        networkEvent[0] = eventID;
        networkEvent[1] = (byte)targetPlayersBySlotIndex.Length;
        Array.Copy(targetPlayersBySlotIndex, 0, networkEvent, 2, targetPlayersBySlotIndex.Length);
        int offset = 2 + targetPlayersBySlotIndex.Length;

        // System.BitConverter is not exposed in Udon, and neither is System.Buffer.BlockCopy
        // For now we have to resort to converting to converting floats to strings for byte array serialization
        networkEvent[offset++] = (byte)floatString.Length; // max 255 length as string
        for (int i = 0; i < floatString.Length; i++)
        {
            networkEvent[offset++] = (byte)floatString[i];
        }
        // int conversion to bytes is easy and efficient enough to replicate in Udon
        byte[] intBytes = _u_BitConverterToByteArray(argument2);
        foreach (byte b in intBytes)
        {
            networkEvent[offset++] = b;
        }

        // Extend existing array
        byte[] newNetworkEventsArray = new byte[networkEventsSerialized.Length + networkEvent.Length];
        Array.Copy(networkEventsSerialized, newNetworkEventsArray, networkEventsSerialized.Length);
        networkEventsSerialized = newNetworkEventsArray;
        // Copy to network events array and serialize
        Array.Copy(networkEvent, 0, networkEventsSerialized, currentOffset, networkEvent.Length);
        currentOffset += networkEvent.Length;
        networkEventsSerializations++;
        RequestSerialization();
    }
示例#15
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);
    }
    // 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);
    }
示例#18
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;
                }
            }
        }
示例#19
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);
                }
            }
        }
示例#20
0
    public void _u_WebSocketReceive(/* int connectionID, byte[] connectionData, string connectionString, bool messageIsText */)
    {
        if (connectionString == "PING :tmi.twitch.tv\r\n")
        {
            debug._u_Log("[TwitchChatBehavior] PING received");
            webManager._u_WebSocketSendStringUnicode(connectionID, "PONG", true);
            return;
        }
        else if (state == TwitchChatState.CapReqSent)
        {
            webManager._u_WebSocketSendStringUnicode(connectionID, "PASS SCHMOOPIIE", true);
            username = "******" + (int)(1000 + Random.value * 80000);
            webManager._u_WebSocketSendStringUnicode(connectionID, "NICK " + username, true);
            state = TwitchChatState.NicknameSent; // Second message sent
        }
        else if (state == TwitchChatState.NicknameSent && connectionString.Contains("Welcome, GLHF!"))
        {
            webManager._u_WebSocketSendStringUnicode(connectionID, "USER " + username + " 8 * :" + username, true);
            webManager._u_WebSocketSendStringUnicode(connectionID, "JOIN #" + connectedChannelName, true);
            state = TwitchChatState.ChannelJoined; // Third message set sent
        }
        else if (state == TwitchChatState.ChannelJoined)
        {
            // Ready to receive chat messages
            string[] split = connectionString.Split(' ');
            if (split.Length < 5 || split[2] != "PRIVMSG")
            {
                // Remove this for release, as this is a security flaw that could allow injecting log lines via twitch chat messages
                // Debug option exclusively for non-chat-message websocket messages.
                // Debug.Log("[TwitchChatBehavior] WebSocketReceive: " + connectionString);
                return;
            }

            string   color   = "white";
            string[] kvPairs = split[0].Split(';');
            foreach (string kv in kvPairs)
            {
                string[] kvSplit = kv.Split('=');
                if (kvSplit.Length > 1 && kvSplit[0] == "color")
                {
                    color = kvSplit[1];
                    break;
                }
            }
            int nicknameSplitIndex = split[1].IndexOf('!');
            if (nicknameSplitIndex < 1 || split[1].Length < 2)
            {
                return;
            }
            string name = split[1].Substring(1, nicknameSplitIndex - 1);
            if (split[4].Length < 1)
            {
                return;
            }
            string messageIndexIdentifier = " PRIVMSG #" + connectedChannelName + " :";
            // Ignore messages from other channels that may be left over after flushing the websocket connection
            int messageStart = connectionString.IndexOf(messageIndexIdentifier);
            if (messageStart != -1)
            {
                string message = connectionString.Substring(messageStart + messageIndexIdentifier.Length);
                // Replace < and > to prevent escapeing Unity UI's rich text markup
                // ≺ ≻
                string completeMessage = "<b><color=" + color + ">" + name + "</color></b>: " + message.Replace('<', '〈').Replace('>', '〉').Replace("\r\n", "");
                if (brokeredMessage != "")
                {
                    brokeredMessage += "\n";
                }
                brokeredMessage += completeMessage;
                brokeredMessageSerializations++;
                RequestSerialization();
                _u_AppendChatMessage();
                // Special case where OnPostSerialization is never reached
                if (VRCPlayerApi.GetPlayerCount() == 1)
                {
                    brokeredMessage = "";
                }
            }
        }
    }
示例#21
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();
    }
示例#22
0
        // Only happens once per second.
        private void FPSUpdate()
        {
            #if UDON
            if (!_hasInitializedTime)
            {
                if (_masterInstanceJoinTime > 0.00001)
                {
                    //We can now do our time setup.
                    double Now = GetElapsedSecondsSince2019();
                    _elapsedTime = Now - _masterInstanceJoinTime;
                    Debug.Log($"AudioLink Time Sync Debug: Received instance time of {_masterInstanceJoinTime} and current time of {Now} delta of {_elapsedTime}");
                    _hasInitializedTime = true;
                    _FPSTime            = _elapsedTime;
                }
                else if (_elapsedTime > 10 && Networking.IsMaster)
                {
                    //Have we gone more than 10 seconds and we're master?
                    Debug.Log("AudioLink Time Sync Debug: You were master.  But no _masterInstanceJoinTime was provided for 10 seconds.  Resetting instance time.");
                    _masterInstanceJoinTime = GetElapsedSecondsSince2019();
                    RequestSerialization();
                    _hasInitializedTime = true;
                    _elapsedTime        = 0;
                    _FPSTime            = _elapsedTime;
                }
            }
            #endif

            audioMaterial.SetVector("_VersionNumberAndFPSProperty", new Vector4(AUDIOLINK_VERSION_NUMBER, 0, _FPSCount, 1));
            audioMaterial.SetVector("_PlayerCountAndData", new Vector4(
                                        VRCPlayerApi.GetPlayerCount(),
                                        Networking.IsMaster?1.0f:0.0f,
                                        Networking.IsInstanceOwner?1.0f:0.0f,
                                        0));

            _FPSCount = 0;
            _FPSTime++;

            // Other things to handle every second.

            // This handles wrapping of the ElapsedTime so we don't lose precision
            // onthe floating point.
            const double ElapsedTimeMSWBoundary = 1024;
            if (_elapsedTime >= ElapsedTimeMSWBoundary)
            {
                //For particularly long running instances, i.e. several days, the first
                //few frames will be spent federating _elapsedTime into _elapsedTimeMSW.
                //This is fine.  It just means over time, the
                _FPSTime      = 0;
                _elapsedTime -= ElapsedTimeMSWBoundary;
                _elapsedTimeMSW++;
            }

            // Finely adjust our network time estimate if needed.
            int networkTimeMSNow = Networking.GetServerTimeInMilliseconds();
            int networkTimeDelta = networkTimeMSNow - _networkTimeMS;
            if (networkTimeDelta > 3000)
            {
                //Major upset, reset.
                _networkTimeMS = networkTimeMSNow;
            }
            else if (networkTimeDelta < -3000)
            {
                //Major upset, reset.
                _networkTimeMS = networkTimeMSNow;
            }
            else
            {
                //Slowly correct the timebase.
                _networkTimeMS += networkTimeDelta / 20;
            }
            //Debug.Log( $"Refinement: ${networkTimeDelta}" );
        }
 public void RefreshList()
 {
     userList = VRCPlayerApi.GetPlayers(new VRCPlayerApi[VRCPlayerApi.GetPlayerCount()]);
 }
        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;
                }
            }
        }
        public override void OnPlayerLeft(VRCPlayerApi player)
        {
            int num = VRCPlayerApi.GetPlayerCount();

            mesh.text = string.Format("{0:D2}", num - 1);
        }
示例#26
0
 public static int GetPlayerCount() =>
 VRCPlayerApi.GetPlayerCount();