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(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(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.Instance.onReceivedData(); } } else { Debug.LogError("workMessage failed"); } } break; case "workProcess": { switch(msg.payload) { case "exit": if (ServerWorkSceneController.Instance) { ServerWorkSceneController.Instance.processStep(9); } break; case "continue": if (ServerWorkSceneController.Instance) { ServerWorkSceneController.Instance.processStep(12); } break; } } break; case "gameSurvey": { GameMessageSurvey msgObj = JsonUtility.FromJson(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(10); } 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(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}"); } } }