using System.Collections.Generic; using UnityEngine; namespace VRC.SDK3.ClientSim { /// /// This class is responsible for saying if an object can be interacted with given the distance. /// public class ClientSimInteractManager : IClientSimInteractManager { public const float INTERACT_SCALE = 1.25f; private readonly IClientSimTrackingProvider _trackingScaleProvider; private readonly IClientSimPlayerPickupData _pickupData; public ClientSimInteractManager( IClientSimTrackingProvider trackingScaleProvider, IClientSimPlayerPickupData pickupData) { _trackingScaleProvider = trackingScaleProvider; _pickupData = pickupData; } private float CalculateInteractDistanceFormula() { return _trackingScaleProvider.GetTrackingScale() * INTERACT_SCALE; } public IClientSimInteractable GetFirstInteractable(GameObject obj, float distance) { foreach (var interactable in obj.GetComponents()) { if (CanInteract(interactable, distance)) { return interactable; } } return null; } public bool CanInteract(IClientSimInteractable interactable, float distance) { if (interactable is IClientSimPickupable && !_pickupData.GetPickupsEnabled()) { return false; } float proximityCalculation = CalculateInteractDistanceFormula() + interactable.GetProximity(); return interactable.CanInteract() && distance <= proximityCalculation; } public List Interact(GameObject obj, float distance) { List interacts = new List(); foreach (var interactable in obj.GetComponents()) { if (CanInteract(interactable, distance)) { interactable.Interact(); interacts.Add(interactable); } } return interacts; } } }