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

249 lines
9.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

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 Mirror.BouncyCastle.Tls.Crypto.Impl.BC;
public class NetworkMessageHandler : MonoBehaviour
{
public static NetworkMessageHandler Instance;
public static NetworkConnectionToClient CurrentConn;
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
GlobalData.ResetGameData();
ServerWorkMessagePanel.cleanData();
ServerWorkMessagePanel.workMessageCount = 0;
}
break;
}
}
break;
case "workMessage":
{
GameMessageWork msgObj = JsonUtility.FromJson<GameMessageWork>(msg.payload);
if (msgObj != null)
{
ServerWorkMessagePanel.workMessage = msgObj.message;
ServerWorkMessagePanel.workMessageType = msgObj.type;
ServerWorkMessagePanel.workPresent = msgObj.present;
ServerWorkMessagePanel.workMessageCount = msgObj.count;
if (ServerWorkMessagePanel.workMessageCount != 0)
{
if (ServerWorkSceneController.Instance != null)
{
ServerWorkSceneController.Instance.processStep(2);
}
}
if (ServerWorkMessagePanel.Instance)
{
ServerWorkMessagePanel.prepareData = null;
ServerWorkMessagePanel.Instance.onReceivedData();
}else
{
//動畫還沒結束,先放到預先準備資料中
ServerWorkMessagePanel.prepareData = msgObj;
}
}
else
{
Debug.LogError("workMessage failed");
}
}
break;
case "workProcess":
{
switch (msg.payload)
{
case "exit":
// ⭐ 修正點 1: 處理 workProcess/exit
// 不再直接呼叫 processStep(9) 或 (10)。改為發送訊號給 Panel讓 Panel 執行雙重檢查。
if (ServerWorkMessageReplyExitPanel.Instance)
{
Debug.Log("NetworkMessageHandler: 收到 workProcess/exit 訊號,通知影片面板。");
ServerWorkMessageReplyExitPanel.Instance.ReceiveClientSignal();
}
else if (ServerWorkSceneController.Instance)
{
// 備用機制:如果 Panel 不存在,則直接跳轉。
ServerWorkSceneController.Instance.processStep(9);
}
break;
case "continue":
if (ServerWorkSceneController.Instance)
{
ServerWorkSceneController.Instance.processStep(12);
}
break;
}
}
break;
case "gameSurvey":
{
GameMessageSurvey msgObj = JsonUtility.FromJson<GameMessageSurvey>(msg.payload);
if (msgObj != null)
{
GlobalData.SURVEY_STAR1 = msgObj.val1;
GlobalData.SURVEY_STAR2 = msgObj.val2;
GlobalData.SURVEY_STAR3 = msgObj.val3;
GlobalData.SURVEY_TEXT = msgObj.text1;
// ⭐ 修正點 2: 處理 gameSurvey
// 收到問卷資料後,不再強制切換場景 (Step 10)。
// 我們讓 Panel 在影片播完後,再切換到 Step 10。
// 但是,如果 Client 先發送問卷 (gameSurvey),這代表 Client 已經通過了 exit 流程。
// 因此,我們將 gameSurvey 視為 Client 對整個 Exit 流程的確認。
if (ServerWorkSceneController.Instance)
{
// 移除上次修正中新增的 processStep(10),改為呼叫雙重檢查。
// 這是因為 gameSurvey 也是 Client 流程結束的訊號之一。
}
// 讓 ServerWorkMessageReplyExitPanel 執行雙重檢查
if (ServerWorkMessageReplyExitPanel.Instance)
{
Debug.Log("NetworkMessageHandler: 收到 gameSurvey 訊號,通知影片面板進行雙重檢查。");
ServerWorkMessageReplyExitPanel.Instance.ReceiveClientSignal();
}
// 確保資料載入
if (ServerWorkMessageReplyExitSurveyPanel.Instance)
{
ServerWorkMessageReplyExitSurveyPanel.Instance.loadSurveyData();
}
}
}
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)
{
GlobalData.SURVEY_STAR1 = msgObj.val1;
GlobalData.SURVEY_STAR2 = msgObj.val2;
GlobalData.SURVEY_STAR3 = msgObj.val3;
GlobalData.SURVEY_TEXT = msgObj.text1;
if (ServerWorkSceneController.Instance)
{
ServerWorkSceneController.Instance.processStep(19);
}
if (ServerGameFinalSurveyPanel.Instance)
{
ServerGameFinalSurveyPanel.Instance.loadSurveyData();
}
}
}
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":
{
}
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}");
}
}
}