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;
}
}
}