// --------------------------------------------------------------------------------------------------------------------
//
// Copyright (c) VRMADA, All rights reserved.
//
// --------------------------------------------------------------------------------------------------------------------
using UltimateXR.Core.Components.Composite;
using UltimateXR.Manipulation;
namespace UltimateXR.Mechanics.Weapons
{
///
/// Base class for weapons. Weapons are used by components to inflict damage to other actor
/// components.
///
public abstract partial class UxrWeapon : UxrGrabbableObjectComponent
{
#region Public Types & Data
///
/// Gets who is in possession of the weapon, to attribute the inflicted damage to.
///
public UxrActor Owner
{
get => _owner;
protected set => _owner = value;
}
#endregion
#region Unity
///
/// Initializes the component.
///
protected override void Awake()
{
base.Awake();
UxrActor.GlobalUnregistering += UxrActor_GlobalUnregistering;
Owner = GetComponentInParent();
}
///
/// Called when it's going to be destroyed.
///
protected override void OnDestroy()
{
base.OnDestroy();
UxrActor.GlobalUnregistering -= UxrActor_GlobalUnregistering;
}
#endregion
#region Event Handling Methods
///
/// Called whenever an actor is about to be destroyed.
///
///
private void UxrActor_GlobalUnregistering(UxrActor actor)
{
if (Owner == actor)
{
Owner = null;
}
}
#endregion
#region Event Trigger Methods
///
/// Called when the object was grabbed. It is used to set the weapon owner.
///
/// Event parameters
protected override void OnObjectGrabbed(UxrManipulationEventArgs e)
{
base.OnObjectGrabbed(e);
if (e.IsGrabbedStateChanged && UxrGrabManager.Instance.GetGrabbingHand(e.GrabbableObject, e.GrabPointIndex, out UxrGrabber grabber))
{
Owner = grabber.Avatar.GetComponentInChildren();
}
}
#endregion
#region Protected Overrides UxrGrabbableObjectComponent
///
protected override bool IsGrabbableObjectRequired => false;
#endregion
#region Private Types & Data
private UxrActor _owner;
#endregion
}
}