using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR.Interaction.Toolkit; [RequireComponent(typeof(XRSocketInteractor))] public class InventorySlot : MonoBehaviour { private XRSocketInteractor xrSocketInteractor; public GameObject _itemInSlot; private Inventory _parentInventory; private void Awake() { xrSocketInteractor = GetComponent(); var oldestInteractableSelected = xrSocketInteractor.GetOldestInteractableSelected(); xrSocketInteractor.selectEntered.AddListener(SelectEnter); xrSocketInteractor.selectExited.AddListener(SelectExit); xrSocketInteractor.hoverEntered.AddListener(HoverEnter); xrSocketInteractor.hoverExited.AddListener(HoverExit); } private void HoverEnter(HoverEnterEventArgs args) { if (_itemInSlot == null) return; if (_itemInSlot.GetComponent() == null) return; if (_itemInSlot == args.interactableObject.transform.gameObject) return; //Debug.Log("hoverenter "+args.interactableObject + " " + xrSocketInteractor.hasHover + " " + xrSocketInteractor.hasSelection); var newItem = args.interactableObject.transform.gameObject; var itemData = newItem.GetComponentInChildren(); Debug.Log("HOVER ENTER: "+itemData); if (itemData.canStack && itemData.itemId == _itemInSlot.GetComponentInChildren().itemId) { var inventoryItem = newItem.GetComponent(); if (inventoryItem != null) { _itemInSlot.GetComponent().ChangeCount(inventoryItem.saveData.count); } else { _itemInSlot.GetComponent().ChangeCount(1); } args.manager.interactableUnregistered += ManagerOninteractableUnregistered; args.manager.UnregisterInteractable(args.interactableObject); args.manager.interactableUnregistered -= ManagerOninteractableUnregistered; } } private void HoverExit(HoverExitEventArgs args) { Debug.Log("hoverexit "+args.interactableObject + " " + xrSocketInteractor.hasHover + " " + xrSocketInteractor.hasSelection); } private void SelectEnter(SelectEnterEventArgs args) { Debug.Log("Added to slot item " + _itemInSlot); var newItem = args.interactableObject.transform.gameObject; //todo: fix ones that cant stack //Converts the item into a inventory item if (newItem.GetComponent() == null) { var load = Resources.Load("Helar/Item", typeof(GameObject)) as GameObject; var instance = Instantiate(load, args.interactorObject.transform); instance.GetComponent().itemPrefab = newItem.gameObject; instance.transform.localScale = Vector3.one; instance.transform.localPosition = Vector3.zero; instance.GetComponent().enabled = true; args.manager.interactableUnregistered += ManagerOninteractableUnregistered; args.manager.UnregisterInteractable(args.interactableObject); args.manager.interactableUnregistered -= ManagerOninteractableUnregistered; args.interactableObject = instance.GetComponent(); args.interactorObject.interactablesSelected.Add(instance.GetComponent()); Debug.Log("Upgraded item to InventoryItem "+instance); _itemInSlot = instance; //_parentInventory.AddItem(instance.GetComponent()); return; } _itemInSlot = newItem; //_parentInventory.AddItem(newItem.GetComponentInChildren()); //xrSocketInteractor.attachTransform = _itemInSlot.transform; Debug.Log("Holstered item" + _itemInSlot.GetComponentInChildren()); } private GameObject ConvertItem(GameObject item) { //load container object var load = Resources.Load("Helar/Item", typeof(GameObject)) as GameObject; //instantiate the container object var instance = Instantiate(load, transform); //load the container with the item to convert instance.GetComponent().itemPrefab = item.gameObject; //set the position and scale so it fits in the container instance.transform.localScale = Vector3.one; instance.transform.localPosition = Vector3.zero; instance.transform.rotation = Quaternion.identity; //enable the itemcontainer (more logic in InventoryItem OnEnable() method) instance.GetComponent().enabled = true; return instance; } private void ManagerOninteractableUnregistered(InteractableUnregisteredEventArgs obj) { Debug.Log("Removing object "+ obj); Destroy(obj.interactableObject.transform.gameObject); } private void SelectExit(SelectExitEventArgs args) { if (_itemInSlot == null) return; if (_itemInSlot.GetComponent() == null) return; var component = _itemInSlot.GetComponent(); component.useGravity = true; component.angularDrag = 2f; component.drag = 0.5f; if (!_itemInSlot.GetComponentInChildren().canStack || _itemInSlot.GetComponent().saveData.count == 1) { //todo change back to regular item //_itemInSlot.GetComponent().PopItem(); //var transformGameObject = _itemInSlot.GetComponentInChildren().transform.gameObject; //Debug.Log(transformGameObject); //args.interactableObject = transformGameObject.GetComponent(); } Debug.Log("Removed from slot item " + _itemInSlot); _itemInSlot = null; } public void SetParentInventory(Inventory inventory) { _parentInventory = inventory; } public bool ContainsItem() { return _itemInSlot != null; } public bool ContainsItem(int id) { if (!ContainsItem()) return false; var inventoryItem = _itemInSlot.GetComponent(); if (inventoryItem != null) return inventoryItem.GetItemid() == id; return false; } public void AssignItem(GameObject newObject) { if (newObject.GetComponent() == null) { _itemInSlot = ConvertItem(newObject); } else { _itemInSlot = newObject; } } public InventoryItem GetItem() { if (_itemInSlot == null) return null; var inventoryItem = _itemInSlot.GetComponent(); if (inventoryItem == null) Debug.LogError("Item in slot doesn't have InventoryItem component"); return inventoryItem; } }