using UnityEngine; using UnityEngine.SceneManagement; using Photon.Pun; using TMPro; using UnityEngine.UI; // ผลการแข่งขัน รางวัล และการกลับห้องเดิม; ไม่เปลี่ยนชื่อ RPC/เมธอดเดิม public partial class GameplayManager { private const string FirebaseUidProperty = "FirebaseUid"; private string GetOpponentFirebaseUid() { Photon.Realtime.Player opponent = PhotonNetwork.PlayerListOthers.Length > 0 ? PhotonNetwork.PlayerListOthers[0] : null; if (opponent != null) { if (opponent.CustomProperties != null && opponent.CustomProperties.TryGetValue(FirebaseUidProperty, out object firebaseUid) && firebaseUid is string uid && !string.IsNullOrWhiteSpace(uid)) return uid; if (!string.IsNullOrWhiteSpace(opponent.UserId)) return opponent.UserId; } if (remotePlayer != null && remotePlayer.photonView != null && remotePlayer.photonView.Owner != null && !string.IsNullOrWhiteSpace(remotePlayer.photonView.Owner.UserId)) return remotePlayer.photonView.Owner.UserId; Debug.LogWarning("Could not resolve opponent Firebase UID for match history."); return ""; } private void RequestSameRoom() { if (!resultShown || returningToRoom) return; if (!PhotonNetwork.InRoom) { SceneManager.LoadScene("LobbyScene"); return; } requestedRematch = true; PhotonNetwork.CurrentRoom.CustomProperties.TryGetValue("BattleToken", out object token); PhotonNetwork.LocalPlayer.SetCustomProperties(new ExitGames.Client.Photon.Hashtable { ["ReturnRoomToken"] = token as string ?? "", ["IsReady"] = false }); if (rematchLabel != null) rematchLabel.text = "WAITING FOR FRIEND..."; } private void CheckSameRoomReturn() { if (!resultShown || !requestedRematch || returningToRoom || !PhotonNetwork.InRoom) return; var room = PhotonNetwork.CurrentRoom; room.CustomProperties.TryGetValue("BattleToken", out object token); string round = token as string ?? ""; int returned = 0, present = 0; foreach (var player in PhotonNetwork.PlayerList) { if (player.IsInactive) continue; present++; if (player.CustomProperties.TryGetValue("ReturnRoomToken", out object value) && value is string text && text == round) returned++; } if (rematchLabel != null) rematchLabel.text = "RETURN TO ROOM " + returned + "/" + present; if (!PhotonNetwork.IsMasterClient || returned != present) return; returningToRoom = true; int revision = room.CustomProperties.TryGetValue("MapRevision", out object rev) && rev is int number ? number : 0; room.SetCustomProperties(new ExitGames.Client.Photon.Hashtable { ["Starting"] = false, ["StartTime"] = -1d, ["BattleToken"] = "", ["BattleAborted"] = false, ["MapRevision"] = revision + 1 }); room.IsOpen = room.IsVisible = true; PhotonNetwork.DestroyAll(); PhotonNetwork.LoadLevel("LobbyScene"); } private void ShowDrawResultScreen(string remotePlayerName) { if (resultShown) return; resultShown = true; if (resultPanel != null) { resultPanel.SetActive(true); StartCoroutine(ScaleTweenRoutine(resultPanel.transform)); } if (resultRoomNumber != null && PhotonNetwork.CurrentRoom != null) resultRoomNumber.text = PhotonNetwork.CurrentRoom.Name; if (localResultName != null) localResultName.text = PhotonNetwork.NickName; if (remoteResultName != null) remoteResultName.text = remotePlayerName; if (localResultStatus != null) { localResultStatus.text = "เสมอ"; localResultStatus.color = Color.white; } if (remoteResultStatus != null) { remoteResultStatus.text = "เสมอ"; remoteResultStatus.color = Color.white; } if (localResultCoins != null) localResultCoins.text = "0"; if (remoteResultCoins != null) remoteResultCoins.text = "0"; PresentResult(null); if (FirebaseManager.Instance != null) { string opponentUid = GetOpponentFirebaseUid(); int localScore = PhotonNetwork.LocalPlayer.CustomProperties.TryGetValue("Kills", out object kills) ? (int)kills : 0; FirebaseManager.Instance.RecordDrawMatch(opponentUid, localScore, GameplayManager.GetCurrentMapName()); } if (btnReturnToMenu != null) { btnReturnToMenu.onClick.RemoveAllListeners(); btnReturnToMenu.onClick.AddListener(LeaveRoom); } } public void ShowResultScreen(bool isWinner, string localShipName, string remoteShipName, string remotePlayerName, int localScore = -1) { if (resultShown) return; resultShown = true; isMatchEnding = true; if (resultPanel != null) { resultPanel.SetActive(true); StartCoroutine(ScaleTweenRoutine(resultPanel.transform)); } if (resultRoomNumber != null && PhotonNetwork.CurrentRoom != null) { resultRoomNumber.text = PhotonNetwork.CurrentRoom.Name; } // Local Player Settings if (localResultName != null) localResultName.text = PhotonNetwork.NickName; if (localResultShip != null) { // Try load ship sprite, using name or mapping (for now we assume 1,2,3 logic or just hide it if null) } if (isWinner) { if (localResultOutline != null) localResultOutline.effectColor = new Color(0.2f, 0.8f, 0.4f); // Green if (localResultStatus != null) { localResultStatus.text = "ชัยชนะ +"; localResultStatus.color = new Color(1f, 0.8f, 0.2f); } if (localResultCoins != null) localResultCoins.text = "190"; if (remoteResultOutline != null) remoteResultOutline.effectColor = new Color(0.8f, 0.2f, 0.2f); // Red if (remoteResultStatus != null) { remoteResultStatus.text = "พ่ายแพ้ +"; remoteResultStatus.color = new Color(1f, 0.4f, 0.4f); } if (remoteResultCoins != null) remoteResultCoins.text = "10"; // Update Firebase if (FirebaseManager.Instance != null) { string opponentUid = GetOpponentFirebaseUid(); FirebaseManager.Instance.RecordMatchResult(true, opponentUid, 190, ResolveLocalScore(localScore), GameplayManager.GetCurrentMapName()); } } else { if (localResultOutline != null) localResultOutline.effectColor = new Color(0.8f, 0.2f, 0.2f); // Red if (localResultStatus != null) { localResultStatus.text = "พ่ายแพ้ +"; localResultStatus.color = new Color(1f, 0.4f, 0.4f); } if (localResultCoins != null) localResultCoins.text = "10"; if (remoteResultOutline != null) remoteResultOutline.effectColor = new Color(0.2f, 0.8f, 0.4f); // Green if (remoteResultStatus != null) { remoteResultStatus.text = "ชัยชนะ +"; remoteResultStatus.color = new Color(1f, 0.8f, 0.2f); } if (remoteResultCoins != null) remoteResultCoins.text = "190"; // Update Firebase if (FirebaseManager.Instance != null) { string opponentUid = GetOpponentFirebaseUid(); FirebaseManager.Instance.RecordMatchResult(false, opponentUid, 10, ResolveLocalScore(localScore), GameplayManager.GetCurrentMapName()); } } if (remoteResultName != null) remoteResultName.text = remotePlayerName; PresentResult(isWinner); if (btnReturnToMenu != null) { btnReturnToMenu.onClick.RemoveAllListeners(); btnReturnToMenu.onClick.AddListener(LeaveRoom); } } private static int ResolveLocalScore(int suppliedScore) { if (suppliedScore >= 0) return suppliedScore; return PhotonNetwork.LocalPlayer != null && PhotonNetwork.LocalPlayer.CustomProperties.TryGetValue("Kills", out object kills) ? (int)kills : 0; } }