111 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using Audio;
 | |
| using FishNet.Object.Synchronizing;
 | |
| using UnityEngine;
 | |
| using UnityEngine.XR.Interaction.Toolkit;
 | |
| 
 | |
| namespace _PROJECT.Multiplayer.NewBow
 | |
| {
 | |
|     public class TwoHandedBowNotch : XRSocketInteractor
 | |
|     {
 | |
|         [SerializeField, Range(0, 1)] private float releaseThreshold = 0.25f;
 | |
|         
 | |
|         public AudioClipGroup nockSounds;
 | |
|         public AudioClipGroup releaseSounds;
 | |
|         
 | |
|         private TwoHandedBow _bow;
 | |
|         private TwoHandedBowNetworkManager _networkBehavior;
 | |
| 
 | |
|         protected override void Awake()
 | |
|         {
 | |
|             base.Awake();
 | |
|             _bow = GetComponentInParent<TwoHandedBow>();
 | |
|             _networkBehavior = GetComponentInParent<TwoHandedBowNetworkManager>();
 | |
|         }   
 | |
|         
 | |
|         protected override void OnEnable()
 | |
|         {
 | |
|             base.OnEnable();
 | |
|             _bow.selectExited.AddListener(ReleaseArrow);
 | |
|         }
 | |
| 
 | |
|         protected override void OnDisable()
 | |
|         {
 | |
|             base.OnDisable();
 | |
|             _bow.selectExited.RemoveListener(ReleaseArrow);
 | |
|         }
 | |
|         
 | |
|         public void ReleaseArrow(SelectExitEventArgs args)
 | |
|         {
 | |
|             Debug.Log("Notch select exit by " + args.interactorObject);
 | |
|             Debug.Log("Notch has selection: " + hasSelection);
 | |
|             if (!hasSelection) return;
 | |
|             // Pulled enough to release the arrow
 | |
|             Debug.Log("Notch pull amount: " + _bow.PullAmount);
 | |
|             if (_bow.PullAmount < releaseThreshold) return;
 | |
|             // Bow is still being held by the other hand,
 | |
|             Debug.Log("Notch other hand is selecting: " + _bow.firstInteractorSelecting);
 | |
|             if (_bow.firstInteractorSelecting == null) return;
 | |
|             Debug.Log("Notch other hand is not selecting");
 | |
|             Debug.Log("Sending Arrow Release RPC");
 | |
|             _networkBehavior.LaunchArrow(_bow.PullAmount);
 | |
|         }
 | |
|         
 | |
|         public override bool CanSelect(IXRSelectInteractable interactable)
 | |
|         {
 | |
|             return QuickSelect(interactable) && CanHover(interactable) && interactable is Arrow;
 | |
|         }
 | |
| 
 | |
|         public override void ProcessInteractor(XRInteractionUpdateOrder.UpdatePhase updatePhase)
 | |
|         {
 | |
|             base.ProcessInteractor(updatePhase);
 | |
| 
 | |
|             // Move attach when bow is pulled, this updates the renderer as well
 | |
|             attachTransform.position = _bow.secondaryAttachTransform.position;
 | |
|         }
 | |
| 
 | |
|         private bool QuickSelect(IXRSelectInteractable interactable)
 | |
|         {
 | |
|             // This lets the Notch automatically grab the arrow
 | |
|             return !hasSelection || IsSelecting(interactable);
 | |
|         }
 | |
| 
 | |
|         private bool CanHover(IXRSelectInteractable interactable)
 | |
|         {
 | |
|             if (interactable is IXRHoverInteractable hoverInteractable)
 | |
|                 return CanHover(hoverInteractable);
 | |
| 
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         public Vector3 GetLaunchDirection()
 | |
|         {
 | |
|             return _networkBehavior.lastKnownLaunchDirection;
 | |
|         }
 | |
| 
 | |
|         public void SetLaunchDirection(Vector3 direction)
 | |
|         {
 | |
|             Debug.Log("Setting launch direction: " + direction);
 | |
|             if (direction != Vector3.zero)
 | |
|             {
 | |
|                 _networkBehavior.SetLaunchDirection(direction);
 | |
|                 return;
 | |
|             }
 | |
|             Debug.Log("Launch direction is zero");
 | |
|         }
 | |
|         
 | |
|         public void PlayNockSound()
 | |
|         {
 | |
|             nockSounds.Play();
 | |
|         }
 | |
|         
 | |
|         public void PlayReleaseSound()
 | |
|         {
 | |
|             releaseSounds.Play();
 | |
|         }
 | |
| 
 | |
|         public float GetLastKnownPullAmount()
 | |
|         {
 | |
|             return _networkBehavior.lastKnownPullAmount;
 | |
|         }
 | |
|     }
 | |
| } |