ClientServer/Client/Assets/Scripts/UI/InventoryItemEvents.cs

253 lines
8.2 KiB
C#
Raw Normal View History

2025-09-06 17:17:39 +04:00
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<TextMeshProUGUI>();
}
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<Image>();
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<RaycastResult> results = new List<RaycastResult>();
PointerEventData ped = new PointerEventData(EventSystem.current);
ped.position = mousePosition;
transform.GetComponentInParent<GraphicRaycaster>().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()
{
}
}