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