using UnityEngine; public class Pickup : MonoBehaviour { public PickupItemData itemData; public SpriteRenderer iconRenderer; private Interactable interactable; private bool pickupInProgress = false; private PlayerTouchController cachedPlayerController; void Awake() { if (iconRenderer == null) iconRenderer = GetComponent(); interactable = GetComponent(); if (interactable != null) { interactable.Interacted += OnInteracted; } ApplyItemData(); } void OnDestroy() { if (interactable != null) { interactable.Interacted -= OnInteracted; } } #if UNITY_EDITOR void OnValidate() { if (iconRenderer == null) iconRenderer = GetComponent(); ApplyItemData(); } void OnDrawGizmos() { // Use GameManager for playerStopDistance float playerStopDistance = GameManager.Instance.PlayerStopDistance; Gizmos.color = Color.yellow; Gizmos.DrawWireSphere(transform.position, playerStopDistance); GameObject playerObj = GameObject.FindGameObjectWithTag("Player"); if (playerObj != null) { Vector3 stopPoint = transform.position + (playerObj.transform.position - transform.position).normalized * playerStopDistance; Gizmos.color = Color.cyan; Gizmos.DrawSphere(stopPoint, 0.15f); } } #endif public void ApplyItemData() { if (itemData != null) { if (iconRenderer != null && itemData.mapSprite != null) { iconRenderer.sprite = itemData.mapSprite; // Removed scaling logic, just set sprite } gameObject.name = itemData.itemName; // Optionally update other fields, e.g. description } } private void OnInteracted() { if (pickupInProgress) return; var playerObj = GameObject.FindGameObjectWithTag("Player"); var followerObj = GameObject.FindGameObjectWithTag("Pulver"); if (playerObj == null || followerObj == null) { Debug.LogWarning("Pickup: Player or Follower not found."); return; } var playerController = playerObj.GetComponent(); var followerController = followerObj.GetComponent(); if (playerController == null || followerController == null) { Debug.LogWarning("Pickup: PlayerTouchController or FollowerController missing."); return; } // Use GameManager for playerStopDistance and followerPickupDelay float playerStopDistance = GameManager.Instance.PlayerStopDistance; float followerPickupDelay = GameManager.Instance.FollowerPickupDelay; // Subscribe to cancellation event cachedPlayerController = playerController; void OnPlayerArrived() { playerController.OnArrivedAtTarget -= OnPlayerArrived; playerController.OnMoveToCancelled -= OnPlayerMoveCancelled; pickupInProgress = true; // Only lock when follower is about to be dispatched StartCoroutine(DispatchFollower()); } void OnPlayerMoveCancelled() { playerController.OnArrivedAtTarget -= OnPlayerArrived; playerController.OnMoveToCancelled -= OnPlayerMoveCancelled; pickupInProgress = false; } System.Collections.IEnumerator DispatchFollower() { yield return new WaitForSeconds(followerPickupDelay); followerController.OnPickupArrived += OnFollowerArrived; followerController.OnPickupReturned += OnFollowerReturned; followerController.GoToPointAndReturn(transform.position, playerObj.transform); } void OnFollowerArrived() { followerController.OnPickupArrived -= OnFollowerArrived; bool interactionSuccess = true; if (interactable != null) { interactionSuccess = interactable.OnFollowerArrived(followerController); } followerController.SetInteractionResult(interactionSuccess); } void OnFollowerReturned() { followerController.OnPickupReturned -= OnFollowerReturned; pickupInProgress = false; } playerController.OnArrivedAtTarget += OnPlayerArrived; playerController.OnMoveToCancelled += OnPlayerMoveCancelled; Vector3 stopPoint = transform.position + (playerObj.transform.position - transform.position).normalized * playerStopDistance; playerController.MoveToAndNotify(stopPoint); } }