using Input; using UnityEngine; namespace Interactions { [RequireComponent(typeof(Interactable))] public class Pickup : MonoBehaviour { public PickupItemData itemData; public SpriteRenderer iconRenderer; protected Interactable Interactable; private PlayerTouchController _playerRef; protected FollowerController FollowerController; /// /// Unity Awake callback. Sets up icon, interactable, and event handlers. /// void Awake() { if (iconRenderer == null) iconRenderer = GetComponent(); Interactable = GetComponent(); if (Interactable != null) { Interactable.interactionStarted.AddListener(OnInteractionStarted); Interactable.characterArrived.AddListener(OnCharacterArrived); } ApplyItemData(); } /// /// Unity OnDestroy callback. Cleans up event handlers. /// void OnDestroy() { if (Interactable != null) { Interactable.interactionStarted.RemoveListener(OnInteractionStarted); Interactable.characterArrived.RemoveListener(OnCharacterArrived); } } #if UNITY_EDITOR /// /// Unity OnValidate callback. Ensures icon and data are up to date in editor. /// void OnValidate() { if (iconRenderer == null) iconRenderer = GetComponent(); ApplyItemData(); } #endif /// /// Applies the item data to the pickup (icon, name, etc). /// public void ApplyItemData() { if (itemData != null) { if (iconRenderer != null && itemData.mapSprite != null) { iconRenderer.sprite = itemData.mapSprite; } gameObject.name = itemData.itemName; } } /// /// Handles the start of an interaction (for feedback/UI only). /// private void OnInteractionStarted(PlayerTouchController playerRef, FollowerController followerRef) { _playerRef = playerRef; FollowerController = followerRef; } protected virtual void OnCharacterArrived() { var combinationResult = FollowerController.TryCombineItems(this, out var combinationResultItem); if (combinationResultItem != null) { Interactable.BroadcastInteractionComplete(true); return; } FollowerController?.TryPickupItem(gameObject, itemData); Interactable.BroadcastInteractionComplete(combinationResult == FollowerController.CombinationResult.NotApplicable); } } }