evershade/Assets/Scripts/Controllers/InventorySlotDisplayControl...

167 lines
5.9 KiB
C#

using System;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Serialization;
public class InventorySlotDisplayController : MonoBehaviour, IDropHandler
{
// public Image icon;
// public Text itemName;
[FormerlySerializedAs("inventoryItem")]
public InventoryManager inventoryManager;
public GameObject inventoryItemPrefab;
// private Transform inventoryItemContainer;
private int _slotId;
public void OnDrop(PointerEventData eventData)
{
Debug.Log("Dropped on internal slot: " + _slotId);
inventoryManager = GameObject.Find("InventoryManager").GetComponent<InventoryManager>();
var destinationSlot = inventoryManager.GetSlot(_slotId);
var destinationItem = inventoryManager.GetItemFromSlot(destinationSlot.slotId);
var draggedSlotController = eventData.pointerDrag.GetComponentInParent<InventorySlotDisplayController>();
var draggedComponent = eventData.pointerDrag.GetComponent<InventoryItemDisplayController>();
var draggedItem = draggedComponent.gameItem;
var draggedSlotId = draggedSlotController._slotId;
Debug.Log("Dropped item: " + draggedItem.itemName);
// var sourceSlot = eventData.pointerDrag.GetComponentInParent<InventorySlotDisplayController>();
if (eventData.pointerDrag != null)
{
if (draggedItem == null)
{
Debug.Log("inventory item does not exist");
// Delete visual representation of dragged item
Destroy(eventData.pointerDrag);
return;
}
// Place the dragged item in this slot
// draggedComponent.GetComponent<RectTransform>().anchoredPosition =
// GetComponent<RectTransform>().anchoredPosition;
if (destinationItem == null)
{
Debug.Log("Destination slot is empty");
inventoryManager.SwapItems(destinationSlot.slotId, draggedSlotId);
// Re parent to this slot
draggedComponent.transform.SetParent(transform, false);
draggedComponent.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
draggedComponent.GetComponent<RectTransform>().offsetMin = Vector2.zero;
draggedComponent.GetComponent<RectTransform>().offsetMax = Vector2.zero;
}
else
{
Debug.Log("Destination slot is not empty");
inventoryManager.SwapItems(draggedSlotId, destinationSlot.slotId);
// Get the parent of the dragged component
// originalSlot.SetSlotDetails();
var selfItem = transform.Find("InventoryItem(Clone)").GetComponent<InventoryItemDisplayController>();
if (selfItem == null) Debug.Log("Self item is null");
selfItem.transform.SetParent(draggedSlotController.transform, false);
selfItem.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
selfItem.GetComponent<RectTransform>().offsetMin = Vector2.zero;
selfItem.GetComponent<RectTransform>().offsetMax = Vector2.zero;
// Re parent to this slot
draggedComponent.transform.SetParent(transform, false);
draggedComponent.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
draggedComponent.GetComponent<RectTransform>().offsetMin = Vector2.zero;
draggedComponent.GetComponent<RectTransform>().offsetMax = Vector2.zero;
}
}
}
public void SetSlotId(int id)
{
_slotId = id;
}
private void SwapItems(InventoryItemDisplayController draggedItemDisplayController)
{
inventoryManager = GameObject.Find("InventoryManager").GetComponent<InventoryManager>();
Debug.Log("!!!!!Swapping items");
var destinationSlot = inventoryManager.GetSlot(_slotId);
var originalSlot = draggedItemDisplayController.GetComponentInParent<InventorySlotDisplayController>();
var tempItem = destinationSlot.item;
// assigns to the destination slot the dragged item
AssignInventoryItem(draggedItemDisplayController.gameItem);
// If this slot had an item, move it to the dragged item's original slot
if (destinationSlot.item != null)
{
originalSlot.AssignInventoryItem(tempItem);
UIManager.Instance.InventoryUIController.UpdateUI();
}
else
{
Destroy(draggedItemDisplayController.gameObject);
}
}
public void AssignInventoryItem(GameItem newItem)
{
// Remove any existing InventoryItem(Clone) from this slot
try
{
Destroy(transform.Find("InventoryItem(Clone)")?.gameObject);
}
catch (Exception e)
{
Debug.Log("No item to destroy");
}
if (inventoryItemPrefab == null)
{
Debug.LogError("InventoryItemPrefab not set");
return;
}
// Instantiate the new item in this slot
var newItemInstance = Instantiate(inventoryItemPrefab, transform);
var itemDisplay = newItemInstance.GetComponent<InventoryItemDisplayController>();
itemDisplay.SetItem(newItem);
}
public void SetInventoryItemPrefab(GameObject prefab)
{
inventoryItemPrefab = prefab;
}
public void DeleteInventoryItem()
{
Destroy(transform.Find("InventoryItem(Clone)")?.gameObject);
}
public void SetSlotDetails(InventorySlot slotDetails)
{
inventoryManager = GameObject.Find("InventoryManager").GetComponent<InventoryManager>();
_slotId = slotDetails.slotId;
if (slotDetails.item != null) AssignInventoryItem(slotDetails.item);
if (slotDetails.item == null) DeleteInventoryItem();
}
public void UpdateUI()
{
}
}