Petition-to-the-Gods-V3/Assets/Scripts/Server/NetworkMessageHandler.cs
2025-11-19 19:30:13 +08:00

247 lines
10 KiB
C#
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using UnityEngine;
using Mirror;
using UnityEngine.SceneManagement;
// 注意Mirror.BouncyCastle.Tls.Crypto.Impl.BC; 這個 using 似乎是多餘的,但暫時保留。
public class NetworkMessageHandler : MonoBehaviour
{
public static NetworkMessageHandler Instance;
public static NetworkConnectionToClient CurrentConn;
// ⭐ 新增:用於記錄是否有未處理的 workMessage (跨場景緩存)
public bool hasPendingWorkMessage = false;
void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
private void Start()
{
NetworkServer.RegisterHandler<GameMessage>(OnClientMessageReceived);
}
void OnClientMessageReceived(NetworkConnectionToClient conn, GameMessage msg)
{
Debug.Log($"收到客戶端訊息: {msg.action} {msg.payload}");
switch (msg.action)
{
case "welcome":
{
switch (msg.payload)
{
case "hello":
if (ServerHomeWaittingSceneController.Instance != null)
{
CurrentConn = conn;
ServerHomeWaittingSceneController.Instance.OnClientConnected();
SendMessageToClient("welcome", "hello");
// clean data
ServerWorkTopRightScore.cleanData();
ServerWorkMessagePanel.cleanData();
ServerWorkMessagePanel.workMessageCount = 0;
}
break;
}
}
break;
case "workMessage":
{
GameMessageWork msgObj = JsonUtility.FromJson<GameMessageWork>(msg.payload);
if (msgObj != null)
{
                        // 關鍵修正 1在切換 Panel 之前,先更新所有靜態數據 (保留)
                        ServerWorkMessagePanel.workMessageCount = msgObj.count;
ServerWorkMessagePanel.workMessage = msgObj.message;
ServerWorkMessagePanel.workMessageType = msgObj.type;
ServerWorkMessagePanel.workPresent = msgObj.present;
if (ServerWorkMessagePanel.workMessageCount != 0)
{
if (ServerWorkSceneController.Instance != null)
{
                                // 情況 1: ServerWorkScene 已經載入 (正常流程或影片播放完畢後)
                                // 檢查當前是否正在播放 Step 5 影片
                                if (ServerWorkMessageReplyWait1Panel.Instance != null && ServerWorkMessageReplyWait1Panel.Instance.gameObject.activeInHierarchy)
{
                                    // 影片正在播放,暫存訊號 (邏輯保留)
                                    ServerWorkMessageReplyWait1Panel.Instance.ReceiveClientSignal();
Debug.Log("WorkMessage 收到,但 Step 5 影片正在播放,延遲切換。");
}
else
{
                                    // 影片未播放,直接切換到 Step 2 (MessagePanel)
                                    ServerWorkSceneController.Instance.processStep(2);
Debug.Log("WorkMessage 收到,直接切換到 Step 2。");
}
}
else
{
                                // 情況 2: ServerWorkScene 尚未載入 (Server正在 Intro 影片中)
                                // 設置緩存旗標 (保留)
                                hasPendingWorkMessage = true;
Debug.Log("WorkMessage 收到,但 ServerWorkScene 尚未載入,設置緩存旗標。");
}
}
                        // ⭐ 移除此處的 onReceivedData() 呼叫
                        // 因為當場景流程切換到 Step 2 時ServerWorkMessagePanel.OnEnable() 會自行處理。
                        /*
                        if (ServerWorkMessagePanel.Instance)
                        {
                            ServerWorkMessagePanel.Instance.onReceivedData();
                        }
                        */
                    }
else
{
Debug.LogError("workMessage failed");
}
}
break; // 修正:這個 break 才是結束 case "workMessage" 的地方
case "workProcess":
{
switch (msg.payload)
{
case "exit":
if (ServerWorkSceneController.Instance)
{
ServerWorkSceneController.Instance.processStep(9);
}
break;
case "survey_ok":
if (ServerWorkMessageReplyExitPanel.Instance)
{
ServerWorkMessageReplyExitPanel.Instance.OnClientResponseReceived(); // ✅ 正確
}
break;
case "continue":
if (ServerWorkSceneController.Instance)
{
ServerWorkSceneController.Instance.processStep(12);
}
break;
}
}
break;
case "gameSurvey":
{
GameMessageSurvey msgObj = JsonUtility.FromJson<GameMessageSurvey>(msg.payload);
if (msgObj != null)
{
ServerWorkMessageReplyExitSurveyPanel.val1 = msgObj.val1;
ServerWorkMessageReplyExitSurveyPanel.val2 = msgObj.val2;
ServerWorkMessageReplyExitSurveyPanel.val3 = msgObj.val3;
ServerWorkMessageReplyExitSurveyPanel.text1 = msgObj.text1;
if (ServerWorkSceneController.Instance)
{
ServerWorkSceneController.Instance.processStep(10);
}
if (ServerWorkMessageReplyExitSurveyPanel.Instance)
{
ServerWorkMessageReplyExitSurveyPanel.Instance.loadData();
}
}
}
break;
case "gameProcess":
{
}
break;
case "gameOpen":
{
ServerGamePanel.nameOfTheGameWillBeOpened = msg.payload;
if (ServerGamePanel.Instance)
{
ServerGamePanel.Instance.gameOpen();
}
else
{
//因為時間同步的問題這2個遊戲強制Server進入遊戲畫面
if (msg.payload == "typing" || msg.payload == "sticks")
{
ServerWorkSceneController.Instance.processStep(13);
}
}
}
break;
case "getWords":
{
if (ServerWorkSceneController.Instance)
{
ServerWorkSceneController.Instance.processStep(18);
}
}
break;
case "gameSurveyFinish":
{
GameMessageSurvey msgObj = JsonUtility.FromJson<GameMessageSurvey>(msg.payload);
if (msgObj != null)
{
ServerWorkMessageReplyExitSurveyPanel.val1 = msgObj.val1;
ServerWorkMessageReplyExitSurveyPanel.val2 = msgObj.val2;
ServerWorkMessageReplyExitSurveyPanel.val3 = msgObj.val3;
ServerWorkMessageReplyExitSurveyPanel.text1 = msgObj.text1;
if (ServerWorkSceneController.Instance)
{
ServerWorkSceneController.Instance.processStep(19);
}
}
}
break;
case "gameTalkingPeopleSay":
{
if (ServerGameTalkingPanel.Instance)
{
ServerGameTalkingPanel.Instance.onReceivedChatMessage(msg.payload);
}
}
break;
case "gameTypingResult":
{
ServerGameTypingPanel.result = msg.payload;
if (ServerGameTypingPanel.Instance)
{
ServerGameTypingPanel.Instance.OnReceivedResult();
}
}
break;
case "gameSticksFinish":
{
// 這裡通常是空的 case 區塊
}
break;
}
}
public void SendMessageToClient(string action, string message)
{
if (CurrentConn != null && CurrentConn.isReady)
{
GameMessage msg = new GameMessage { action = action, payload = message };
CurrentConn.Send(msg);
Debug.Log($"發送到客戶端: {message}");
}
else
{
Debug.Log($"發送到客戶端失敗: {message}");
}
}
}