using System; using System.Collections; using System.Collections.Generic; using UnityEngine; namespace Invector.vItemManager { [vClassHeader("Use Item Event Trigger", useHelpBox = true, helpBoxText = "This script enable ItemUsage when TriggerEnter and disable onTriggerExit", openClose = false)] public class UseItemEventTrigger : vMonoBehaviour { /// /// Item usage Event /// public OnUseItemEvent itemEvent; protected vItemManager itemManager; /// /// Item usage Event class /// [System.Serializable] public class OnUseItemEvent { internal vItem targetItem; public int id; [vHelpBox("Check this to enable the menu UI Button 'Use' on the Inventory Window")] public bool canUseWithOpenInventory; [vHelpBox("Override the Delay to use this Item")] public bool overrideItemUsageDelay; [vHideInInspector("overrideItemUsageDelay")] public float newDeleyTime; internal float defaultDelay; public UnityEngine.Events.UnityEvent onUse; /// /// Event called when the inventory is opened or closed while in trigger /// /// public void OnOpenInventory(bool value) { if (canUseWithOpenInventory || !targetItem) return; targetItem.canBeUsed = !value; } /// /// Change item usage delay time, called when the Player with an Item Manager enters a trigger /// public void ChangeItemUsageDelay() { if (!overrideItemUsageDelay || targetItem == null) return; defaultDelay = targetItem.enableDelayTime; targetItem.enableDelayTime = newDeleyTime; } /// /// Reset item usage delay time, called when the Player with an Item Manager exit a trigger /// public void ResetItemUsageDelay() { if (!overrideItemUsageDelay || targetItem == null) return; targetItem.enableDelayTime = defaultDelay; } } public virtual void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag("Player")) { itemManager = other.GetComponent(); if (itemManager) { itemEvent.targetItem = itemManager.GetItem(itemEvent.id); if (itemEvent.targetItem) { itemEvent.ChangeItemUsageDelay(); itemManager.onUseItem.AddListener(OnUseItem); itemManager.onOpenCloseInventory.AddListener(itemEvent.OnOpenInventory); itemEvent.targetItem.canBeUsed = true; } } } } /// /// Event called when the Player with Item Manager use an item while in a trigger /// /// protected virtual void OnUseItem(vItem item) { if (itemManager && itemEvent.id == item.id) { itemManager.inventory.CloseInventory(); itemManager.onUseItem.RemoveListener(OnUseItem); itemManager.onOpenCloseInventory.RemoveListener(itemEvent.OnOpenInventory); itemEvent.onUse.Invoke(); itemEvent.ResetItemUsageDelay(); itemEvent.targetItem = null; } } public virtual void OnTriggerExit(Collider other) { if (other.gameObject.CompareTag("Player")) { if (itemManager) { itemManager.onUseItem.RemoveListener(OnUseItem); itemManager.onOpenCloseInventory.RemoveListener(itemEvent.OnOpenInventory); if (itemEvent.targetItem) { itemEvent.targetItem.canBeUsed = false; itemEvent.ResetItemUsageDelay(); itemEvent.targetItem = null; } } } } } }