using System; using System.Collections.Generic; using System.Linq; using ClusterVR.CreatorKit.Item; using UnityEngine; namespace ClusterVR.CreatorKit.Trigger.Implements { [RequireComponent(typeof(Item.Implements.Item))] public sealed class OnReceiveOwnershipItemTrigger : MonoBehaviour, IOnReceiveOwnershipItemTrigger, IInvoluntaryItemTrigger { [SerializeField, HideInInspector] Item.Implements.Item item; [SerializeField] EventType eventType = EventType.Always; [SerializeField, ItemConstantTriggerParam] ConstantTriggerParam[] triggers; [Flags] public enum EventType { Always = ~0, Voluntary = 1 << 0, Involuntary = 1 << 1, } IItem IItemTrigger.Item => item != null ? item : item = GetComponent(); public event TriggerEventHandler TriggerEvent; IEnumerable ITrigger.TriggerParams => triggers.Select(t => t.Convert()); TriggerParam[] triggersCache; void IOnReceiveOwnershipItemTrigger.Invoke(bool voluntary) { var type = voluntary ? EventType.Voluntary : EventType.Involuntary; if ((type & eventType) > 0) { TriggerEvent?.Invoke(this, new TriggerEventArgs(triggersCache ?? (triggersCache = triggers.Select(t => t.Convert()).ToArray()))); } } void Reset() { item = GetComponent(); } void OnValidate() { if (item == null || item.gameObject != gameObject) { item = GetComponent(); } } } }