using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using Unity.Netcode; public class CrowsForesightPrefab : NetworkBehaviour { private Dictionary foresightLines = new Dictionary(); private ulong crowClientId; private Coroutine destroyCoroutine; public GameObject LinePrefab; private void Start() { if (IsServer) { Debug.Log("[CrowsForesightPrefab] Starting auto-destroy coroutine."); destroyCoroutine = StartCoroutine(DelayedDestroy()); } } public void Initialize(ulong crowId) { crowClientId = crowId; } public override void OnNetworkSpawn() { Debug.Log($"[CrowsForesightPrefab] OnNetworkSpawn called - LocalClientId: {NetworkManager.Singleton.LocalClientId}, crowClientId: {crowClientId}"); if (NetworkManager.Singleton.LocalClientId != CrowManager.Instance.GetCurrentCrow().OwnerClientId && !NetworkManager.Singleton.IsServer) { gameObject.SetActive(false); // Hide from non-crow clients } } private IEnumerator DelayedDestroy(float time = 10) { yield return new WaitForSeconds(time); // Adjust according to abilityDuration if (IsServer) { Debug.Log("[CrowsForesightPrefab] Ability duration expired. Despawning on server."); DespawnForesight(); } } public void DespawnForesight() { if (!IsServer) return; Debug.Log("[CrowsForesightPrefab] Destroying foresight effect and clearing all lines."); // Remove all foresight lines before despawning foreach (var line in foresightLines.Values) { if (line != null) { Destroy(line.gameObject); } } foresightLines.Clear(); if (NetworkObject.IsSpawned) { Debug.Log("[CrowsForesightPrefab] Despawning network object."); NetworkObject.Despawn(true); } else { Debug.LogWarning("[CrowsForesightPrefab] WARNING: Tried to despawn, but NetworkObject was already despawned or missing!"); } } public void OnSwapRequested(ulong senderId, ulong receiverId, Vector3 senderPos, Vector3 receiverPos) { Debug.Log($"[CrowsForesightPrefab] OnSwapRequested - Sender: {senderId}, Receiver: {receiverId}, SenderPos: {senderPos}, ReceiverPos: {receiverPos}"); if (!foresightLines.ContainsKey(senderId)) { Debug.Log($"[CrowsForesightPrefab] Creating foresight line for swap request {senderId} -> {receiverId}"); foresightLines[senderId] = CreateLine(); } foresightLines[senderId].SetPosition(0, senderPos); foresightLines[senderId].SetPosition(1, Vector3.Lerp(senderPos, receiverPos, 0.5f)); Debug.Log($"[CrowsForesightPrefab] Halfway foresight line drawn from {senderPos} to midpoint."); } public void OnSwapAccepted(ulong senderId, Vector3 receiverPos) { Debug.Log($"[CrowsForesightPrefab] OnSwapAccepted - Sender: {senderId}, ReceiverPos: {receiverPos}"); if (!foresightLines.ContainsKey(senderId)) { Debug.LogError($"[CrowsForesightPrefab] ERROR: No foresight line found for sender {senderId} when swap was accepted!"); return; } foresightLines[senderId].SetPosition(1, receiverPos); if (foresightLines.ContainsKey(senderId)) { // Destroy the line associated with the sender Destroy(foresightLines[senderId].gameObject ,1f); foresightLines.Remove(senderId); Debug.Log($"[CrowsForesightPrefab] Removed foresight line for rejected swap request from {senderId}."); } Debug.Log($"[CrowsForesightPrefab] Foresight line completed from sender {senderId} to {receiverPos}."); } public void OnSwapRejected(ulong senderId, Vector3 receiverPos) { Debug.Log($"[CrowsForesightPrefab] OnSwapRejected - Sender: {senderId}, ReceiverPos: {receiverPos}"); if (foresightLines.ContainsKey(senderId)) { // Destroy the line associated with the sender Destroy(foresightLines[senderId].gameObject); foresightLines.Remove(senderId); Debug.Log($"[CrowsForesightPrefab] Removed foresight line for rejected swap request from {senderId}."); } else { Debug.LogWarning($"[CrowsForesightPrefab] WARNING: No foresight line found for sender {senderId}. Swap rejection may have happened before drawing."); } } private LineRenderer CreateLine() { //GameObject lineObj = new GameObject("ForesightLine"); GameObject lineObj = Instantiate(LinePrefab); LineRenderer line = lineObj.AddComponent(); line.startWidth = 0.7f; line.endWidth = 0.7f; //line.material = new Material(Shader.Find("Sprites/Default")); line.transform.SetParent(transform); return line; } }