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(); var destinationSlot = inventoryManager.GetSlot(_slotId); var destinationItem = inventoryManager.GetItemFromSlot(destinationSlot.slotId); var draggedSlotController = eventData.pointerDrag.GetComponentInParent(); var draggedComponent = eventData.pointerDrag.GetComponent(); var draggedItem = draggedComponent.gameItem; var draggedSlotId = draggedSlotController._slotId; Debug.Log("Dropped item: " + draggedItem.itemName); // var sourceSlot = eventData.pointerDrag.GetComponentInParent(); 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().anchoredPosition = // GetComponent().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().anchoredPosition = Vector2.zero; draggedComponent.GetComponent().offsetMin = Vector2.zero; draggedComponent.GetComponent().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(); if (selfItem == null) Debug.Log("Self item is null"); selfItem.transform.SetParent(draggedSlotController.transform, false); selfItem.GetComponent().anchoredPosition = Vector2.zero; selfItem.GetComponent().offsetMin = Vector2.zero; selfItem.GetComponent().offsetMax = Vector2.zero; // Re parent to this slot draggedComponent.transform.SetParent(transform, false); draggedComponent.GetComponent().anchoredPosition = Vector2.zero; draggedComponent.GetComponent().offsetMin = Vector2.zero; draggedComponent.GetComponent().offsetMax = Vector2.zero; } } } public void SetSlotId(int id) { _slotId = id; } private void SwapItems(InventoryItemDisplayController draggedItemDisplayController) { inventoryManager = GameObject.Find("InventoryManager").GetComponent(); Debug.Log("!!!!!Swapping items"); var destinationSlot = inventoryManager.GetSlot(_slotId); var originalSlot = draggedItemDisplayController.GetComponentInParent(); 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(); 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(); _slotId = slotDetails.slotId; if (slotDetails.item != null) AssignInventoryItem(slotDetails.item); if (slotDetails.item == null) DeleteInventoryItem(); } public void UpdateUI() { } }