using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using DG.Tweening; using EpicToonFX; public class InventoryItemEvents : Selectable, IPointerDownHandler, IPointerUpHandler, IPointerEnterHandler, IPointerExitHandler, IDragHandler, IBeginDragHandler { private int slotId; private Vector3 originalPosition; private Image thisImage; [SerializeField] private Image backgroundImage; private TextMeshProUGUI inspectText; private GameObject bankVault; private WeaponStatsManager statsManager; protected override void Awake() { //Selectable runs in edit mode, so we need to find objects only at runtime. base.Awake(); if (Application.isPlaying) { inspectText = GameObject.Find("Inventory_inspect").GetComponent(); } this.enabled = true; } private bool ForgeOpen() => UIManager.Instance.ForgeController.gameObject.activeSelf; private bool ExchangeOpen() => UIManager.Instance.WeaponExchangeController.gameObject.activeSelf; private bool InventoryOpen() => UIManager.Instance.Inventory.gameObject.activeSelf; private bool BankOpen() => UIManager.Instance.BankVaultCanvas.activeInHierarchy; protected override void Start() { base.Start(); originalPosition = gameObject.transform.position; slotId = int.Parse(gameObject.name.Substring(15)); thisImage = GetComponent(); statsManager = UIManager.Instance.WeaponStatsManager; bankVault = UIManager.Instance.BankVaultCanvas; } public override void OnSelect(BaseEventData eventData) { base.OnSelect(eventData); if (Player.Instance.GetInputHandler().UsingGamePad) { EnterSlot(); } } public override void OnDeselect(BaseEventData eventData) { base.OnDeselect(eventData); if (Player.Instance.GetInputHandler().UsingGamePad) { OnExit(); } } public override void OnPointerEnter(PointerEventData eventData) { base.OnPointerEnter(eventData); EnterSlot(); } public void EnterSlot() { //Debug.Log(this.gameObject.name + " Was entered."); int itemID = InventoryManager.Instance.inventoryItems[slotId]; string itemName = ItemDef.GetInstance().getItemName(itemID); string itemLevel = ItemDef.GetInstance().getItemLevel(itemID); string itemDescription = InventoryManager.Instance.itemDescriptions[slotId]; if (itemName == "") { if (!( ForgeOpen()|| InventoryOpen() || ExchangeOpen() )) return; statsManager.GetCanvasGroup().alpha = 0; return; } inspectText.SetText($"{itemLevel.ToUpper()} {itemName.ToUpper()}: {itemDescription.ToUpper()}"); transform.DOScale(Vector3.one * 1.15f, 0.1f).SetEase(Ease.InSine).SetUpdate(true); if (!( ForgeOpen()|| InventoryOpen()|| ExchangeOpen() )) return; int weaponData = InventoryManager.Instance.inventoryItems[slotId]; statsManager.SetWeaponStatData(GetOpenSettingType(), weaponData); } private OpenWeaponStatType GetOpenSettingType() { if (ForgeOpen()) return OpenWeaponStatType.Forge; if (InventoryOpen()) return OpenWeaponStatType.Inventory; if (ExchangeOpen()) return OpenWeaponStatType.Exchange; return OpenWeaponStatType.Base; } public override void OnPointerExit(PointerEventData eventData) { base.OnPointerExit(eventData); OnExit(); } public void OnExit() { //Debug.Log(this.gameObject.name + " Was exited."); inspectText.text = ""; if (EventSystem.current.currentSelectedGameObject != null) EventSystem.current.SetSelectedGameObject(null); //ERROR HERE statsManager.GetCanvasGroup().DOFade(0, 0.15f); transform.DOScale(Vector3.one, 0.1f).SetEase(Ease.OutSine).SetUpdate(true); } public override void OnPointerDown(PointerEventData eventData) { base.OnPointerDown(eventData); OnClick(); } public void OnClick() { if (InventoryManager.Instance.inventoryItems[slotId] == -1) return; //Debug.Log(this.gameObject.name + " Was Clicked."); //thisImage.color = new Color(0.8f, 0.8f, 0.8f); } public void OnBeginDrag(PointerEventData eventData) { //transform.parent = InventoryPanel.transform; //transform.SetAsLastSibling(); } public override void OnPointerUp(PointerEventData eventData) { base.OnPointerUp(eventData); OnClickUp(Input.mousePosition); } public void OnClickUp(Vector3 mousePosition) { if (InventoryManager.Instance.inventoryItems[slotId] == -1) { return; } thisImage.color = Color.white; if (Vector3.Distance(transform.position, originalPosition) > 3) { //Create a list of Raycast Results List results = new List(); PointerEventData ped = new PointerEventData(EventSystem.current); ped.position = mousePosition; transform.GetComponentInParent().Raycast(ped, results); if (!(bankVault.activeInHierarchy || ForgeOpen() || ExchangeOpen()) && results.Count <= 1) { //Debug.Log("dropping " + InventoryManager.Instance.inventoryItems[slotId]); if (InventoryManager.Instance.inventoryItems[slotId] != -1) PacketManager.sendDropItem(InventoryManager.Instance.inventoryItems[slotId], slotId); } else { //For every result returned, output the name of the GameObject on the Canvas hit by the Ray foreach (RaycastResult result in results) { if (result.gameObject.name.Contains("slot")) { int to = int.Parse(result.gameObject.name.Substring(4)); if (to != slotId) { PacketManager.sendMoveItem(slotId, to, 0); } } } } } else { //only allow dropping if not in menus if (!(BankOpen() || ForgeOpen() || ExchangeOpen())) { if (Input.GetKey(KeyCode.LeftShift)) { PacketManager.sendDropItem(InventoryManager.Instance.inventoryItems[slotId], slotId); } } if (ExchangeOpen()) { int itemID = InventoryManager.Instance.inventoryItems[slotId]; string itemName = ItemDef.GetInstance().getItemName(itemID); string itemLevel = ItemDef.GetInstance().getItemLevel(itemID); WeaponExchangeController exchangeController = UIManager.Instance.WeaponExchangeController; exchangeController.SetSellButtonText(itemLevel, itemName, itemID); } if (!ForgeOpen() && !ExchangeOpen()) { PacketManager.sendClickItem(InventoryManager.Instance.inventoryItems[slotId], slotId); } } gameObject.transform.position = originalPosition; } public void GamepadDropEvent() { if (!(bankVault.activeInHierarchy || ForgeOpen() || ExchangeOpen()) && InventoryManager.Instance.inventoryItems[slotId] != -1) PacketManager.sendDropItem(InventoryManager.Instance.inventoryItems[slotId], slotId); } public void OnDrag(PointerEventData eventData) { if (InventoryManager.Instance.inventoryItems[slotId] == -1 || ForgeOpen() || ExchangeOpen() || bankVault.activeInHierarchy) return; transform.position += (Vector3)eventData.delta; } public void OnClickDrag() { } }