// 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"); }
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); } }
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(); } }
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); }
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; } }
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); }
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 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(); }
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); }
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; } } }
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 _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 = ""; } } } }
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(); }
// 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); }
public static int GetPlayerCount() => VRCPlayerApi.GetPlayerCount();