예제 #1
0
        public void ResetOffsets()
        {
            offsetPos = Vector3.zero;
            oldRot    = 0;
            offsetRot = 0;
            var targetPos = player.GetPosition();
            var targetRot = player.GetRotation();

            targetTransform.SetPositionAndRotation(targetPos, targetRot);
        }
예제 #2
0
    /// <summary>
    /// When the elevator doors are already half closed while closing, this function is called
    /// </summary>
    public void EventHalfClosedOnClosing(int elevatorNumber)
    {
        Debug.Log("[ElevatorController] Received Event HalfClosedOnClosing");
        BoxCollider inDoorCollider;
        GameObject  elevatorObj;
        BoxCollider doorCollider;

        if (elevatorNumber == 0)
        {
            inDoorCollider = _playerInsideDoorElevator1Detector;
            elevatorObj    = _elevator1;
            doorCollider   = _elevator1DoorCollider;
        }
        else if (elevatorNumber == 1)
        {
            inDoorCollider = _playerInsideDoorElevator2Detector;
            elevatorObj    = _elevator2;
            doorCollider   = _elevator2DoorCollider;
        }
        else
        {
            inDoorCollider = _playerInsideDoorElevator3Detector;
            elevatorObj    = _elevator3;
            doorCollider   = _elevator3DoorCollider;
        }
        //Check if player is inside the door and teleport him/her if that is the case
        if (inDoorCollider.bounds.Contains(_localPlayer.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).position))
        {
            _localPlayer.TeleportTo(elevatorObj.transform.position, _localPlayer.GetRotation());
        }
        doorCollider.enabled = true;
    }
예제 #3
0
    Vector3 GetMovementInputDirection()
    {
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        // If not holding anything return forward
        if (x == 0 && z == 0)
        {
            z = 1;
        }

        return((player.GetRotation() * new Vector3(x, 0f, z)).normalized);
    }
예제 #4
0
    public void Move2Forward()
    {
        var dv           = velocity - lastVelocity;
        var trackingData = p.GetTrackingData(trackingTarget);

        if (trackingData.Equals(null))
        {
            return;
        }
        var h2v = trackingData.rotation * Quaternion.Inverse(p.GetRotation()); // horizon to view

        dv = h2v * dv;
        //dv = ((p.GetWalkSpeed() - 0.1f) * Mathf.Max(drag, 1) * Time.deltaTime) * dv.normalized; // cancel drag effect
        velocity = lastVelocity + dv;
    }
예제 #5
0
 private void Start()
 {
     player = Networking.LocalPlayer;
     if (player == null)
     {
         return;
     }
     if (trackPlayspace)
     {
         var targetPos = player.GetPosition();
         var targetRot = player.GetRotation();
         targetTransform.SetPositionAndRotation(targetPos, targetRot);
     }
     isEditor = false;
 }
예제 #6
0
    public void Play()
    {
        if (isNotInit)
        {
            return;
        }
        VRCPlayerApi player = Networking.GetOwner(gameObject);

        //Update avatar height
        if (Time.time - lastAvatarHeightUpdate > 10)
        {
            avatarHeight           = GetAvatarHeight(player);
            lastAvatarHeightUpdate = Time.time;
            transform.localScale   = Vector3.one * avatarHeight;
            float pitch = -Mathf.Log(avatarHeight * 0.1f) * 0.4f + 0.2f;
            pitch = Mathf.Clamp(pitch, 0.2f, 3f);
            float volume = avatarHeight * 0.3f + 0.5f;
            volume = Mathf.Clamp(volume, 0.5f, 1f);
            float distance = avatarHeight * 2;
            distance                 = Mathf.Clamp(distance, 1, 10);
            _audioSource.pitch       = pitch;
            _audioSource.maxDistance = distance;
            _audioSource.volume      = volume;
            Debug.Log($"[Clapper] Height: {avatarHeight} => pitch: {pitch} => volume: {volume} => distance: {distance}");
        }
        //Set position
        if (player.IsUserInVR())
        {
            transform.position = Vector3.Lerp(player.GetTrackingData(VRCPlayerApi.TrackingDataType.LeftHand).position,
                                              player.GetTrackingData(VRCPlayerApi.TrackingDataType.RightHand).position, 0.5f);
        }
        else
        {
            transform.position = isHumanoid ? player.GetBonePosition(HumanBodyBones.Chest) :
                                 Vector3.Lerp(player.GetPosition(), player.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).position, 0.7f);
        }
        transform.rotation = player.GetRotation();
        //Play particle and audio source
        _particleSystem.Emit(1);
        _audioSource.Play();
    }
    public void constupdate()
    {
        ismaster.text        = "ismaster: " + PlayerApiref.isMaster.ToString();
        playerid.text        = "playerid: " + PlayerApiref.playerId.ToString();
        playergrounded.text  = "isplayergrounded: " + PlayerApiref.IsPlayerGrounded().ToString();
        isowner.text         = "isowner: " + PlayerApiref.IsOwner(ownercheck).ToString();
        gravitystrength.text = "gravitystrength: " + PlayerApiref.GetGravityStrength().ToString();
        if (!changeapi)
        {
            runspeed.text    = "runspeed: " + PlayerApiref.GetRunSpeed().ToString();
            walkspeed.text   = "walkspeed: " + PlayerApiref.GetWalkSpeed().ToString();
            jumpimpulse.text = "jumpimpulse: " + PlayerApiref.GetJumpImpulse().ToString();
        }
        else
        {
            runspeed.text    = "runspeed: NULL";
            walkspeed.text   = "walkspeed: NULL";
            jumpimpulse.text = "jumpimpulse: NULL";
        }

        velocity.text = "velocity: " + PlayerApiref.GetVelocity().ToString();
        position.text = "position: " + PlayerApiref.GetPosition().ToString();
        rotation.text = "rotation: " + PlayerApiref.GetRotation().ToString();
    }
예제 #8
0
    private void Update()
    {
        Vector3    playerPosition = playerLocal.GetPosition();
        Quaternion playerRotation = playerLocal.GetRotation();
        Vector3    closestPoint   = platformCollider.ClosestPoint(playerPosition);

        playerRelativeHeight = playerPosition.y - closestPoint.y;
        isAlignedToPlatform  = (playerPosition.x == closestPoint.x) && (playerPosition.z == closestPoint.z);
        if (grabHeight.y <= playerRelativeHeight && playerRelativeHeight <= grabHeight.x && isAlignedToPlatform)
        {
            if (lockedPlayerY <= -10000)
            {
                lockedPlayerY = playerPosition.y;
            }

            // How much has platform moved since last frame?
            Vector3 platformPosDelta = platform.transform.position - platformPosBuffer;

            // Move player the same distance the platform moved
            newPos = playerPosition + platformPosDelta;

            if (lockPlayerY)
            {
                newPos.y = lockedPlayerY;
            }

            playerLocal.TeleportTo(newPos, playerRotation);
        }
        else
        {
            lockedPlayerY = -10001;
        }

        // Set remember pre-move position of platform for next frame
        platformPosBuffer = platform.transform.position;
    }
예제 #9
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();
    }
예제 #10
0
    private void Update()
    {
        VRCPlayerApi PlayerApiref = Networking.GetOwner(gameObject);

        if (PlayerApiref != null && track)
        {
            transform.position = PlayerApiref.GetPosition();
            transform.rotation = PlayerApiref.GetRotation();
            bonesset(HumanBodyBones.Hips, 0, PlayerApiref);
            bonesset(HumanBodyBones.LeftUpperLeg, 1, PlayerApiref);
            bonesset(HumanBodyBones.RightUpperLeg, 2, PlayerApiref);
            bonesset(HumanBodyBones.LeftLowerLeg, 3, PlayerApiref);
            bonesset(HumanBodyBones.RightLowerLeg, 4, PlayerApiref);
            bonesset(HumanBodyBones.LeftFoot, 5, PlayerApiref);
            bonesset(HumanBodyBones.RightFoot, 6, PlayerApiref);
            bonesset(HumanBodyBones.Spine, 7, PlayerApiref);
            bonesset(HumanBodyBones.Chest, 8, PlayerApiref);
            bonesset(HumanBodyBones.Neck, 9, PlayerApiref);
            bonesset(HumanBodyBones.Head, 10, PlayerApiref);
            bonesset(HumanBodyBones.LeftShoulder, 11, PlayerApiref);
            bonesset(HumanBodyBones.RightShoulder, 12, PlayerApiref);
            bonesset(HumanBodyBones.LeftUpperArm, 13, PlayerApiref);
            bonesset(HumanBodyBones.RightUpperArm, 14, PlayerApiref);
            bonesset(HumanBodyBones.LeftLowerArm, 15, PlayerApiref);
            bonesset(HumanBodyBones.RightLowerArm, 16, PlayerApiref);
            bonesset(HumanBodyBones.LeftHand, 17, PlayerApiref);
            bonesset(HumanBodyBones.RightHand, 18, PlayerApiref);
            bonesset(HumanBodyBones.LeftToes, 19, PlayerApiref);
            bonesset(HumanBodyBones.RightToes, 20, PlayerApiref);
            bonesset(HumanBodyBones.LeftEye, 21, PlayerApiref);
            bonesset(HumanBodyBones.RightEye, 22, PlayerApiref);
            bonesset(HumanBodyBones.Jaw, 23, PlayerApiref);
            bonesset(HumanBodyBones.LeftThumbProximal, 24, PlayerApiref);
            bonesset(HumanBodyBones.LeftThumbIntermediate, 25, PlayerApiref);
            bonesset(HumanBodyBones.LeftThumbDistal, 26, PlayerApiref);
            bonesset(HumanBodyBones.LeftIndexProximal, 27, PlayerApiref);
            bonesset(HumanBodyBones.LeftIndexIntermediate, 28, PlayerApiref);
            bonesset(HumanBodyBones.LeftIndexDistal, 29, PlayerApiref);
            bonesset(HumanBodyBones.LeftMiddleProximal, 30, PlayerApiref);
            bonesset(HumanBodyBones.LeftMiddleIntermediate, 31, PlayerApiref);
            bonesset(HumanBodyBones.LeftMiddleDistal, 32, PlayerApiref);
            bonesset(HumanBodyBones.LeftRingProximal, 33, PlayerApiref);
            bonesset(HumanBodyBones.LeftRingIntermediate, 34, PlayerApiref);
            bonesset(HumanBodyBones.LeftRingDistal, 35, PlayerApiref);
            bonesset(HumanBodyBones.LeftLittleProximal, 36, PlayerApiref);
            bonesset(HumanBodyBones.LeftLittleIntermediate, 37, PlayerApiref);
            bonesset(HumanBodyBones.LeftLittleDistal, 38, PlayerApiref);
            bonesset(HumanBodyBones.RightThumbProximal, 39, PlayerApiref);
            bonesset(HumanBodyBones.RightThumbIntermediate, 40, PlayerApiref);
            bonesset(HumanBodyBones.RightThumbDistal, 41, PlayerApiref);
            bonesset(HumanBodyBones.RightIndexProximal, 42, PlayerApiref);
            bonesset(HumanBodyBones.RightIndexIntermediate, 43, PlayerApiref);
            bonesset(HumanBodyBones.RightIndexDistal, 44, PlayerApiref);
            bonesset(HumanBodyBones.RightMiddleProximal, 45, PlayerApiref);
            bonesset(HumanBodyBones.RightMiddleIntermediate, 46, PlayerApiref);
            bonesset(HumanBodyBones.RightMiddleDistal, 47, PlayerApiref);
            bonesset(HumanBodyBones.RightRingProximal, 48, PlayerApiref);
            bonesset(HumanBodyBones.RightRingIntermediate, 49, PlayerApiref);
            bonesset(HumanBodyBones.RightRingDistal, 50, PlayerApiref);
            bonesset(HumanBodyBones.RightLittleProximal, 51, PlayerApiref);
            bonesset(HumanBodyBones.RightLittleIntermediate, 52, PlayerApiref);
            bonesset(HumanBodyBones.RightLittleDistal, 53, PlayerApiref);
            bonesset(HumanBodyBones.UpperChest, 54, PlayerApiref);
        }

        if (localwait && track)
        {
            localwait = false;
        }
        else if (localwait && Networking.IsOwner(gameObject))
        {
            track = true;
        }
    }
예제 #11
0
 private void Update()
 {
     transform.SetPositionAndRotation(playerLocal.GetPosition(), playerLocal.GetRotation());
 }
예제 #12
0
    private void Update()
    {
        if (follow)
        {
            if (!Utilities.IsValid(owner) || !owner.IsOwner(gameObject))
            {
                owner = Networking.GetOwner(gameObject);
            }

            sign.SetPositionAndRotation(owner.GetTrackingData(VRCPlayerApi.TrackingDataType.Head).position + new Vector3(0, offset, 0), owner.GetRotation());
        }
    }
예제 #13
0
    private void SnowboardingUpdate()
    {
        // Turn board
        if (localUser != null)
        {
            if (localUser.IsUserInVR())
            {
                VrPlayerInputRotationUpdate();
            }
            else
            {
                DesktopPlayerInputRotationUpdate();
            }
        }


        // Boost
        string rightHand_AButton = "Fire2";

        if (Time.time - lastBoostTime > BoostCooldown && (Input.GetKeyDown(DesktopSnowboardBoostKey) || Input.GetButtonDown(rightHand_AButton)))
        {
            float boost = 2;
            momentum.x   += boost;
            lastBoostTime = Time.time;
        }

        RaycastHit hit;

        if (Physics.Raycast(transform.position + Vector3.up, Vector3.down, out hit, 1.2f, SlopeMask))
        {
            // On ground
            UpdateGroundMomentum(transform.forward, hit.normal);

            Vector3 wantedMovement = transform.forward * momentum.x + transform.right * momentum.y;
            wantedMovement      = Vector3.ProjectOnPlane(wantedMovement, hit.normal).normalized *wantedMovement.magnitude;
            transform.position += wantedMovement * Time.deltaTime;


            Vector3    correctedPosition = transform.position + ((hit.distance - 1) - wantedDistanceToGround) * Vector3.down;
            Quaternion correctedRotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;

            transform.rotation = Quaternion.Lerp(transform.rotation, correctedRotation, 10f * Time.deltaTime);
            if (correctedPosition.y > transform.position.y)
            {
                transform.position = correctedPosition;
            }
            else
            {
                transform.position = Vector3.Lerp(transform.position, correctedPosition, 10f * Time.deltaTime);
            }

            gravityMomentum = 0;
            isFalling       = false;

            // Ensure player is not inside other colliders
            if (Physics.Raycast(transform.position + Vector3.up, Vector3.down, out hit, 1.2f, SlopeMask))
            {
                correctedPosition = transform.position + ((hit.distance - 1) - wantedDistanceToGround) * Vector3.down;
                if (correctedPosition.y > transform.position.y)
                {
                    transform.position = correctedPosition;
                }
            }
        }
        else
        {
            Vector3 wantedMovement = transform.forward * momentum.x * Time.deltaTime + transform.right * momentum.y * Time.deltaTime;
            transform.position = transform.position + wantedMovement;
            // In air
            if (!isFalling)
            {
                // First frame falling
                gravityMomentum = -wantedMovement.y;
                isFalling       = true;
            }

            transform.position += Vector3.down * gravityMomentum;

            Quaternion correctedRotation = Quaternion.FromToRotation(transform.up, Vector3.up) * transform.rotation;
            transform.rotation = Quaternion.Lerp(transform.rotation, correctedRotation, 10f * Time.deltaTime);
            // Update gravity momentum
            gravityMomentum += Time.deltaTime * gravity;
        }


        // Move player
        if (localUser != null)
        {
            if (localUser.IsUserInVR())
            {
                localUser.TeleportTo(transform.position + Vector3.up * playerYOffset, StartPosition.rotation, VRC_SceneDescriptor.SpawnOrientation.AlignRoomWithSpawnPoint, true);
            }
            else
            {
                localUser.TeleportTo(transform.position + Vector3.up * playerYOffset, localUser.GetRotation(), VRC_SceneDescriptor.SpawnOrientation.Default, true);
            }
        }
    }
예제 #14
0
    private void Update()
    {
        timeSinceLastBlink    += Time.deltaTime;
        timeSinceLastRecharge += Time.deltaTime;

        if (timeSinceLastRecharge > cooldownRecharge)
        {
            charges += refillAmount;
            if (charges > maxCharges)
            {
                charges = maxCharges;
            }

            timeSinceLastRecharge = 0;
        }

        // TODO: Some other button might be better for this but idk which one yet.
        // If jump button is pressed.
        if ((Input.GetButtonDown("Oculus_CrossPlatform_SecondaryThumbstick") || Input.GetButtonDown("Jump")) && timeSinceLastBlink > cooldownBlink && charges > 0)
        {
            blinkDist = maxBlinkDistance;
            // TODO: This may need to be changed to avatar origin position to prevent clipping into ground with tall avatars.
            headPos = playerLocal.GetBonePosition(HumanBodyBones.Head);
            headRot = playerLocal.GetBoneRotation(HumanBodyBones.Head);
            if (Physics.Raycast(headPos, headRot * Vector3.forward, out rayHit))
            {
                if (rayHit.distance <= maxBlinkDistance)
                {
                    blinkDist = rayHit.distance;
                }
            }
            playerLocal.TeleportTo(playerLocal.GetPosition() + (headRot * Vector3.forward) * (blinkDist - destinationDistFromCollider), playerLocal.GetRotation());

            timeSinceLastBlink = 0;
            charges--;
        }
    }