Petition-to-the-Gods-V3/Assets/Scripts/Server/NetworkMessageHandler.cs

319 lines
12 KiB
C#
Raw Permalink 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;
// 移除 Mirror.BouncyCastle.Tls.Crypto.Impl.BC 的 using如果您的專案不需要。
public class NetworkMessageHandler : MonoBehaviour
{
public static NetworkMessageHandler Instance;
public static NetworkConnectionToClient CurrentConn = null;
public static NetworkConnectionToClient CurrentConn2ndScreen = null;
public static NetworkConnectionToClient CurrentConn2ndScreenServer = null;
void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
private void Start()
{
// 確保已經註冊了處理 GameMessage 的 Handler
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;
case "The2ndScreenClient":
if (CurrentConn2ndScreen == null)
{
CurrentConn2ndScreen = conn;
SendMessageTo2ndScreenClient("welcome", "hello");
}
break;
case "The2ndScreenServer":
if (CurrentConn2ndScreenServer == null)
{
CurrentConn2ndScreenServer = conn;
SendMessageTo2ndScreenServer("welcome", "hello");
}
break;
}
}
break;
case "The2ndScreenClient":
{
SendMessageTo2ndScreenClient("The2ndScreenClient", msg.payload);
}
break;
case "The2ndScreentServer":
{
SendMessageTo2ndScreenServer("The2ndScreentServer", msg.payload);
}
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;
//Debug.LogWarning($"[CY] workMessageCount: {ServerWorkMessagePanel.workMessageCount}");
if (ServerWorkMessagePanel.workMessageCount != 0)
{
//是否忙碌中(播影片時為忙碌中)
bool isBusy = false;
if (ServerWorkMessageReplyWait1Panel.Instance !=null && ServerWorkMessageReplyWait1Panel.Instance.isActiveAndEnabled)
{
isBusy = true;
ServerWorkMessageReplyWait1Panel.Instance.ReceiveNewWorkMessage();
}else if (ServerWorkMessageReplyWait2Panel.Instance != null && ServerWorkMessageReplyWait2Panel.Instance.isActiveAndEnabled)
{
isBusy = true;
}
//非忙碌中就直接跳轉
if (isBusy == false)
{
ServerWorkSceneController.Instance?.processStep(2);
}
}
// 3. 資料處理邏輯 (這段邏輯是確保 Step 2 Panel 收到資料)
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":
// Step 9 (Exit Panel) 雙重檢查邏輯
if (ServerWorkMessageReplyExitPanel.Instance)
{
Debug.Log("NetworkMessageHandler: 收到 workProcess/exit 訊號,通知 Exit 影片面板。");
ServerWorkMessageReplyExitPanel.Instance.ReceiveClientSignal();
}
else 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<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;
// Step 9 (Exit Panel) 雙重檢查邏輯
if (ServerWorkMessageReplyExitPanel.Instance)
{
Debug.Log("NetworkMessageHandler: 收到 gameSurvey 訊號,通知 Exit 影片面板進行雙重檢查。");
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":
{
GameSticksResult msgObj = JsonUtility.FromJson<GameSticksResult>(msg.payload);
if (msgObj != null)
{
if (ServerGameSticksPanel.Instance)
{
ServerGameSticksPanel.Instance.OnReceivedResult(msgObj.angle);
}
}
}
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}");
}
}
public void SendMessageTo2ndScreenClient(string action, string message)
{
if (CurrentConn2ndScreen != null && CurrentConn2ndScreen.isReady)
{
GameMessage msg = new GameMessage { action = action, payload = message };
CurrentConn2ndScreen.Send(msg);
Debug.Log($"發送到2ndScreen客戶端: {message}");
}
else
{
Debug.Log($"發送到2ndScreen客戶端失敗: {message}");
}
}
public void SendMessageTo2ndScreenServer(string action, string message)
{
if (CurrentConn2ndScreenServer != null && CurrentConn2ndScreenServer.isReady)
{
GameMessage msg = new GameMessage { action = action, payload = message };
CurrentConn2ndScreenServer.Send(msg);
Debug.Log($"發送到2ndScreen伺服端: {message}");
}
else
{
Debug.Log($"發送到2ndScreen伺服端失敗: {message}");
}
}
}