First commit for private source control. Older commits available on Github.
This commit is contained in:
114
Assets/Scripts/UI/HUD/UIInventorySlot.cs
Normal file
114
Assets/Scripts/UI/HUD/UIInventorySlot.cs
Normal file
@@ -0,0 +1,114 @@
|
||||
using BriarQueen.Data.Identifiers;
|
||||
using BriarQueen.Framework.Coordinators.Events;
|
||||
using BriarQueen.Framework.Events.UI;
|
||||
using BriarQueen.Framework.Managers.Interaction.Data;
|
||||
using BriarQueen.Framework.Managers.Player;
|
||||
using BriarQueen.Framework.Managers.Player.Data;
|
||||
using BriarQueen.Framework.Managers.UI;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using VContainer;
|
||||
|
||||
namespace BriarQueen.UI.HUD
|
||||
{
|
||||
/// <summary>
|
||||
/// UI slot is now an IInteractable so InteractManager (UI raycast path) can drive hover + click.
|
||||
/// No IPointerEnter/Exit, no OnClickEvent subscription.
|
||||
/// </summary>
|
||||
public class UIInventorySlot : MonoBehaviour, IInteractable
|
||||
{
|
||||
[SerializeField]
|
||||
private Image _slotBase;
|
||||
|
||||
[SerializeField]
|
||||
private Image _selectedVisual;
|
||||
|
||||
[SerializeField]
|
||||
private Image _icon;
|
||||
|
||||
public ItemDataSo Item;
|
||||
private EventCoordinator _eventCoordinator;
|
||||
|
||||
private InventoryBar _owner;
|
||||
|
||||
private PlayerManager _playerManager;
|
||||
|
||||
// Cursor while hovering inventory slots (tweak if you have a “hand” cursor etc.)
|
||||
public UICursorService.CursorStyle ApplicableCursorStyle => UICursorService.CursorStyle.UseItem;
|
||||
public string InteractableName => Item.ItemName;
|
||||
|
||||
public UniTask EnterHover()
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public UniTask ExitHover()
|
||||
{
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public async UniTask OnInteract(ItemDataSo selectedItem = null)
|
||||
{
|
||||
Debug.Log("[UI Inventory Slot] Interacted");
|
||||
|
||||
if (Item == null)
|
||||
{
|
||||
_eventCoordinator.Publish(new DisplayInteractEvent(InteractEventIDs.Get(UIInteractKey.EmptySlot)));
|
||||
return;
|
||||
}
|
||||
|
||||
// normal click: selection
|
||||
if (selectedItem == null)
|
||||
{
|
||||
_owner?.OnSlotInteracted(this);
|
||||
return;
|
||||
}
|
||||
|
||||
// use selected item on this item (prefer selected item's logic)
|
||||
if (selectedItem.Interaction != null)
|
||||
{
|
||||
var handled = await selectedItem.Interaction.TryUseWith(
|
||||
selectedItem, Item, _playerManager, _eventCoordinator);
|
||||
|
||||
if (handled)
|
||||
return;
|
||||
}
|
||||
|
||||
// fallback: allow target to handle it
|
||||
if (Item.Interaction != null)
|
||||
{
|
||||
var handled = await Item.Interaction.TryUseWith(
|
||||
Item, selectedItem, _playerManager, _eventCoordinator);
|
||||
|
||||
if (handled)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
[Inject]
|
||||
public void Construct(PlayerManager playerManager, EventCoordinator eventCoordinator)
|
||||
{
|
||||
_playerManager = playerManager;
|
||||
_eventCoordinator = eventCoordinator;
|
||||
}
|
||||
|
||||
public void Initialize(InventoryBar owner, ItemDataSo item)
|
||||
{
|
||||
Debug.Log("Initializing Slot");
|
||||
_owner = owner;
|
||||
Item = item;
|
||||
|
||||
if (_icon != null && Item != null)
|
||||
_icon.sprite = Item.Icon;
|
||||
|
||||
SetSelected(false);
|
||||
Debug.Log($"Set Slot to {Item}");
|
||||
}
|
||||
|
||||
public void SetSelected(bool selected)
|
||||
{
|
||||
if (_selectedVisual != null) _selectedVisual.gameObject.SetActive(selected);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user