2026-06-26 19:28:39 +08:00
|
|
|
|
using Assets.MyGame.Scripts.Net.WebResponses;
|
2026-04-15 18:30:37 +08:00
|
|
|
|
using Best.WebSockets;
|
2026-02-03 11:35:19 +08:00
|
|
|
|
using Newtonsoft.Json;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
2026-08-04 21:20:56 +08:00
|
|
|
|
using System.IO;
|
2026-02-03 11:35:19 +08:00
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
using UnityEngine;
|
2026-02-26 11:05:56 +08:00
|
|
|
|
using static Assets.MyGame.Scripts.Net.WebResponses.ChineseChess.ChineseChessGameClassList;
|
2026-02-03 11:35:19 +08:00
|
|
|
|
|
|
|
|
|
|
namespace Assets.MyGame.Scripts.Net
|
|
|
|
|
|
{
|
|
|
|
|
|
public partial class WebSocketManager : MonoSingleton<WebSocketManager>
|
|
|
|
|
|
{
|
|
|
|
|
|
public void OnMessage(WebSocket web, string msg, SocketType type)
|
|
|
|
|
|
{
|
2026-08-04 21:20:56 +08:00
|
|
|
|
NetLog.Log($"[WebSocket] {type} 收到消息: {msg}");
|
|
|
|
|
|
// ⭐ 优化:用 char 分割避免 Split 产生 string[] 数组 GC
|
|
|
|
|
|
// 单条消息通常只有 1-2 个分隔段,直接手动解析
|
|
|
|
|
|
int start = 0;
|
|
|
|
|
|
int sep;
|
|
|
|
|
|
while ((sep = msg.IndexOf('\u001e', start)) >= 0)
|
2026-02-03 11:35:19 +08:00
|
|
|
|
{
|
2026-08-04 21:20:56 +08:00
|
|
|
|
ProcessSingleMessage(msg, start, sep - start, type);
|
|
|
|
|
|
start = sep + 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
// 处理最后一段(或没有分隔符的整条消息)
|
|
|
|
|
|
if (start < msg.Length)
|
|
|
|
|
|
ProcessSingleMessage(msg, start, msg.Length - start, type);
|
|
|
|
|
|
}
|
2026-07-17 17:50:31 +08:00
|
|
|
|
|
2026-08-04 21:20:56 +08:00
|
|
|
|
private void ProcessSingleMessage(string msg, int start, int length, SocketType type)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 跳过空白段
|
|
|
|
|
|
if (length <= 0) return;
|
2026-07-17 17:50:31 +08:00
|
|
|
|
|
2026-08-04 21:20:56 +08:00
|
|
|
|
// 快速检查 "{}"(握手包),避免 Substring + Trim
|
|
|
|
|
|
if (length == 2 && msg[start] == '{' && msg[start + 1] == '}')
|
|
|
|
|
|
{
|
|
|
|
|
|
OnHandshakeCompleted(type);
|
|
|
|
|
|
return;
|
2026-02-03 11:35:19 +08:00
|
|
|
|
}
|
2026-02-26 11:05:56 +08:00
|
|
|
|
|
2026-08-04 21:20:56 +08:00
|
|
|
|
// 提取子串(此处必须分配,后续反序列化需要)
|
|
|
|
|
|
string item = msg.Substring(start, length);
|
2026-02-13 19:23:01 +08:00
|
|
|
|
|
2026-08-04 21:20:56 +08:00
|
|
|
|
// ⭐ 优化:用 JsonTextReader 只读 type/target 做路由,跳过 arguments 反序列化
|
|
|
|
|
|
// 原代码:JsonConvert.DeserializeObject<WebSocketResponseBase<object>>(item)
|
|
|
|
|
|
// 会反序列化整个 arguments 数组(包含鱼数据等),但这些数据在路由阶段完全不需要,
|
|
|
|
|
|
// 具体处理方法内部会重新反序列化。这能消除预解析阶段 90%+ 的 GC。
|
|
|
|
|
|
var v = ParseHeader(item);
|
|
|
|
|
|
if (v == null) return;
|
|
|
|
|
|
|
|
|
|
|
|
#region 消息处理
|
|
|
|
|
|
switch (type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case SocketType.login:
|
|
|
|
|
|
LoginMSG(item, v);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case SocketType.room:
|
|
|
|
|
|
case SocketType.game:
|
|
|
|
|
|
FishMSG(item, v);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case SocketType.chess:
|
|
|
|
|
|
ChineseChess(item, v);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case SocketType.customer:
|
|
|
|
|
|
CustomerMSG(item, v);
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2026-02-13 19:23:01 +08:00
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
|
|
|
private static void ChineseChess(string msg, WebSocketResponseBase<object> v)
|
|
|
|
|
|
{
|
2026-02-26 11:05:56 +08:00
|
|
|
|
var roomMainPanel = UIManager.Instance.Get<ChineseChessMainPanel>(UIPanel.MainGamePanelZGXQ);
|
2026-02-13 19:23:01 +08:00
|
|
|
|
switch ((MessageType)v.type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case MessageType.Invocation:
|
|
|
|
|
|
switch (v.target)
|
|
|
|
|
|
{
|
|
|
|
|
|
case "GetRoomList":
|
|
|
|
|
|
UIManager.Instance.ShowAsync(UIPanel.MainGamePanelZGXQ, msg);
|
|
|
|
|
|
Screen.orientation = ScreenOrientation.Portrait;
|
|
|
|
|
|
break;
|
2026-02-26 11:05:56 +08:00
|
|
|
|
case "BeginGame":
|
2026-03-09 09:25:01 +08:00
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg.ToString()).arguments[0];
|
|
|
|
|
|
roomMainPanel.subUIManager.CloseAll();
|
|
|
|
|
|
roomMainPanel.StartGame(msg);
|
|
|
|
|
|
roomMainPanel.UpdateUserData(va);
|
|
|
|
|
|
}
|
2026-06-26 19:28:39 +08:00
|
|
|
|
|
2026-02-26 11:05:56 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case "CreateRoomNotice":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg.ToString()).arguments[0];
|
|
|
|
|
|
var panel = roomMainPanel.subUIManager.Get<UIChineseChessDistrict>(UIPanel.ZGXQDistrict);
|
|
|
|
|
|
if (panel != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
panel.UpdataRoom(va);
|
2026-06-26 19:28:39 +08:00
|
|
|
|
|
2026-02-26 11:05:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "JoinRoomNotice":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg.ToString()).arguments[0];
|
|
|
|
|
|
var panel = roomMainPanel.subUIManager.Get<UIChineseChessDistrict>(UIPanel.ZGXQDistrict);
|
|
|
|
|
|
if (panel != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
panel.UpdataRoom(va);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-06-26 19:28:39 +08:00
|
|
|
|
|
2026-02-26 11:05:56 +08:00
|
|
|
|
break;
|
|
|
|
|
|
//所有人
|
|
|
|
|
|
case "GoldConfigRoomNotice":
|
|
|
|
|
|
roomMainPanel.subUIManager.CloseAll();
|
|
|
|
|
|
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQGameExplain, msg);
|
|
|
|
|
|
|
2026-07-09 14:29:17 +08:00
|
|
|
|
break;
|
|
|
|
|
|
// 房主开始游戏 → 通知红方配金币
|
|
|
|
|
|
case "GoldConfigRequired":
|
|
|
|
|
|
roomMainPanel.OnGoldConfigRequired(msg);
|
2026-02-26 11:05:56 +08:00
|
|
|
|
break;
|
|
|
|
|
|
//单发给触发人
|
|
|
|
|
|
case "GoldConfigSuccess":
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "ReadyNotice":
|
2026-07-12 00:26:17 +08:00
|
|
|
|
{
|
|
|
|
|
|
// ReadyNotice arguments[0] 是用户ID字符串,不是房间对象
|
|
|
|
|
|
var userId = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
|
|
|
|
|
|
// 标记该玩家已准备
|
|
|
|
|
|
if (roomMainPanel.roomData != null && roomMainPanel.roomData.users != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
var u = roomMainPanel.roomData.users.Find(x => x.userId == userId);
|
|
|
|
|
|
if (u != null) u.isReady = true;
|
|
|
|
|
|
// 只有双方都准备好才进入游戏
|
|
|
|
|
|
if (roomMainPanel.roomData.users.Count >= 2
|
|
|
|
|
|
&& roomMainPanel.roomData.users.TrueForAll(x => x.isReady))
|
|
|
|
|
|
{
|
|
|
|
|
|
roomMainPanel.InitRoomData();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-02-26 11:05:56 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case "GameOperation":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<Dictionary<string, object>>>(msg).arguments[0];
|
|
|
|
|
|
roomMainPanel.IsShowHint(va["data"].ToString(), Convert.ToInt32(va["type"]));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "EndGameSuccess":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
|
2026-06-26 19:28:39 +08:00
|
|
|
|
if (va == null || va == "")
|
2026-05-08 06:49:53 +08:00
|
|
|
|
{
|
|
|
|
|
|
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQHe);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (va == GameManager.Instance.user.id)
|
2026-02-26 11:05:56 +08:00
|
|
|
|
{
|
|
|
|
|
|
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQWin);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQDefeated);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-09 09:25:01 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case "ExitRoomSuccess":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
|
2026-06-26 19:28:39 +08:00
|
|
|
|
if (GameManager.Instance.user.id == va)
|
2026-03-09 09:25:01 +08:00
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
WebSocketSendList.GetRoomListChineseChess(1);
|
2026-06-26 19:28:39 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-03-09 09:25:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
for (int i = 0; i < roomMainPanel.roomData.users.Count; i++)
|
|
|
|
|
|
{
|
|
|
|
|
|
var item = roomMainPanel.roomData.users[i];
|
|
|
|
|
|
if (item.userId != va)
|
|
|
|
|
|
{
|
|
|
|
|
|
roomMainPanel.roomData.users.Remove(item);
|
|
|
|
|
|
roomMainPanel.UpdateUserData(roomMainPanel.roomData);
|
|
|
|
|
|
i--;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-06-26 19:28:39 +08:00
|
|
|
|
|
2026-03-09 09:25:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-26 11:05:56 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "ExitRoomNotice":
|
|
|
|
|
|
{
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg.ToString()).arguments[0];
|
|
|
|
|
|
var panel = roomMainPanel.subUIManager.Get<UIChineseChessDistrict>(UIPanel.ZGXQDistrict);
|
|
|
|
|
|
if (panel != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
panel.UpdataRoom(va);
|
2026-06-26 19:28:39 +08:00
|
|
|
|
|
2026-02-26 11:05:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "Disconnect":
|
|
|
|
|
|
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQWin);
|
|
|
|
|
|
break;
|
2026-03-09 09:25:01 +08:00
|
|
|
|
case "GameError":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
|
2026-07-10 19:24:23 +08:00
|
|
|
|
if (va == "只有代理才能配置密码")
|
2026-07-10 16:50:59 +08:00
|
|
|
|
{
|
|
|
|
|
|
UIManager.Instance.Get<ChineseChessMainPanel>(UIPanel.MainGamePanelZGXQ).subUIManager.Get<UIChineseChessCreateRoom>(UIPanel.ZGXQCreateRoom).ShowTiShi();
|
|
|
|
|
|
}
|
2026-07-10 19:24:23 +08:00
|
|
|
|
else
|
|
|
|
|
|
UIManager.Instance.ShowBoardError(va);
|
2026-03-09 09:25:01 +08:00
|
|
|
|
}
|
2026-06-26 19:28:39 +08:00
|
|
|
|
|
|
|
|
|
|
break;
|
2026-06-26 23:42:49 +08:00
|
|
|
|
|
|
|
|
|
|
// ======== 新增缺失事件 ========
|
|
|
|
|
|
|
|
|
|
|
|
case "JoinRoom":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg).arguments[0];
|
|
|
|
|
|
// 调用者自身加入成功
|
|
|
|
|
|
if (roomMainPanel != null) roomMainPanel.UpdateUserData(va);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "Reconnect":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<Dictionary<string, object>>>(msg).arguments[0];
|
|
|
|
|
|
Debug.Log($"[Chess] 重连: userId={va["userId"]}, userName={va["userName"]}");
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "AllBeginTime":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg).arguments[0];
|
|
|
|
|
|
Debug.Log("[Chess] 双方已准备,开始计时");
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "GameEnd":
|
|
|
|
|
|
{
|
2026-09-13 01:40:32 +08:00
|
|
|
|
if (roomMainPanel != null) roomMainPanel.StopWaitCountdown(); // 游戏结束停走棋倒计时
|
2026-06-26 23:42:49 +08:00
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<Dictionary<string, object>>>(msg).arguments[0];
|
|
|
|
|
|
string winUserId = va["winUserId"]?.ToString();
|
|
|
|
|
|
if (string.IsNullOrEmpty(winUserId))
|
|
|
|
|
|
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQHe);
|
2026-06-27 14:35:06 +08:00
|
|
|
|
else if (winUserId == GameManager.Instance.user.BaseInfo.number)
|
2026-06-26 23:42:49 +08:00
|
|
|
|
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQWin);
|
|
|
|
|
|
else
|
|
|
|
|
|
roomMainPanel.subUIManager.ShowAsync(UIPanel.ZGXQDefeated);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "EndGameRequestSent":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
|
|
|
|
|
|
Debug.Log("[Chess] 结束请求已发送: " + va);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "OpponentRequestEnd":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
|
|
|
|
|
|
Debug.Log("[Chess] 对手请求结束: " + va);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "RestartGameSuccess":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg).arguments[0];
|
|
|
|
|
|
if (roomMainPanel != null) roomMainPanel.StartGame(msg);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "RestartRoomNotice":
|
|
|
|
|
|
{
|
|
|
|
|
|
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg).arguments[0];
|
|
|
|
|
|
var panel = roomMainPanel?.subUIManager.Get<UIChineseChessDistrict>(UIPanel.ZGXQDistrict);
|
|
|
|
|
|
if (panel != null) panel.UpdataRoom(va);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "SyncGameData":
|
|
|
|
|
|
{
|
2026-09-13 01:40:32 +08:00
|
|
|
|
// 象棋走棋帧同步数据:后端只透传,交给主面板解析处理
|
|
|
|
|
|
if (roomMainPanel != null) roomMainPanel.OnChessNetData(msg);
|
2026-06-26 23:42:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2026-02-13 19:23:01 +08:00
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.StreamItem:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.Completion:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.StreamInvocation:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.CancelInvocation:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.Ping:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.Close:
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-04-15 18:30:37 +08:00
|
|
|
|
private static void CustomerMSG(string msg, WebSocketResponseBase<object> v)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch ((MessageType)v.type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case MessageType.Invocation:
|
|
|
|
|
|
switch (v.target)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 发起会话回调(用户端):服务端返回 {isOk, msg, conversation}
|
|
|
|
|
|
case "OnConversationStarted":
|
|
|
|
|
|
{
|
|
|
|
|
|
var result = JsonConvert.DeserializeObject<WebSocketResponseBase<CustomerConversationStartedResult>>(msg).arguments[0];
|
|
|
|
|
|
WebSocketReponseList.Customer_OnConversationStarted(result);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
// 消息接收回调(用户端 & 客服端)
|
|
|
|
|
|
case "OnMessageReceived":
|
|
|
|
|
|
{
|
|
|
|
|
|
var result = JsonConvert.DeserializeObject<WebSocketResponseBase<CustomerMessageReceived>>(msg).arguments[0];
|
|
|
|
|
|
WebSocketReponseList.Customer_OnMessageReceived(result);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
// 新会话通知(客服端)
|
|
|
|
|
|
case "OnNewConversation":
|
|
|
|
|
|
{
|
|
|
|
|
|
var result = JsonConvert.DeserializeObject<WebSocketResponseBase<CustomerNewConversationNotice>>(msg).arguments[0];
|
|
|
|
|
|
WebSocketReponseList.Customer_OnNewConversation(result);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.StreamItem:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.Completion:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.StreamInvocation:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.CancelInvocation:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.Ping:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.Close:
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-06-26 19:28:39 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2026-07-10 23:26:42 +08:00
|
|
|
|
/// LoginHub 消息处理(Broadcast / AssetUpdated / BackpackUpdated / NewEmail / KillAnnouncement)
|
2026-06-26 19:28:39 +08:00
|
|
|
|
/// </summary>
|
|
|
|
|
|
private static void LoginMSG(string msg, WebSocketResponseBase<object> v)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch ((MessageType)v.type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case MessageType.Invocation:
|
|
|
|
|
|
switch (v.target)
|
|
|
|
|
|
{
|
|
|
|
|
|
case "Broadcast":
|
|
|
|
|
|
WebSocketReponseList.LoginBroadcast(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "AssetUpdated":
|
|
|
|
|
|
WebSocketReponseList.AssetUpdated(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "BackpackUpdated":
|
|
|
|
|
|
WebSocketReponseList.BackpackUpdated(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "NewEmail":
|
|
|
|
|
|
WebSocketReponseList.NewEmail(msg);
|
|
|
|
|
|
break;
|
2026-07-10 23:26:42 +08:00
|
|
|
|
case "KillAnnouncement":
|
|
|
|
|
|
WebSocketReponseList.KillAnnouncement(msg);
|
|
|
|
|
|
break;
|
2026-07-22 15:01:41 +08:00
|
|
|
|
case "LevelChanged":
|
2026-07-21 04:36:52 +08:00
|
|
|
|
WebSocketReponseList.LevelChanged(msg);
|
|
|
|
|
|
break;
|
2026-07-22 15:01:41 +08:00
|
|
|
|
case "PendingRoomNotice":
|
|
|
|
|
|
WebSocketReponseList.PendingRoomNotice(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "AccountKicked":
|
|
|
|
|
|
WebSocketReponseList.AccountKicked(msg);
|
|
|
|
|
|
break;
|
2026-07-27 23:30:25 +08:00
|
|
|
|
case "ChangeConfig":
|
|
|
|
|
|
WebSocketReponseList.ChangeConfig(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "KickToMainPage":
|
|
|
|
|
|
WebSocketReponseList.KickToMainPage(msg);
|
|
|
|
|
|
break;
|
2026-06-26 19:28:39 +08:00
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-02-13 19:23:01 +08:00
|
|
|
|
private static void FishMSG(string msg, WebSocketResponseBase<object> v)
|
|
|
|
|
|
{
|
2026-02-03 11:35:19 +08:00
|
|
|
|
switch ((MessageType)v.type)
|
|
|
|
|
|
{
|
|
|
|
|
|
case MessageType.Invocation:
|
|
|
|
|
|
switch (v.target)
|
|
|
|
|
|
{
|
2026-05-27 19:47:06 +08:00
|
|
|
|
|
2026-02-03 11:35:19 +08:00
|
|
|
|
case "GetRoomListResult":
|
|
|
|
|
|
//UIManager.Instance.Get<UIHome_BY_SelectRoomLevelPanel>(UIPanel.SelectRoomPenel);
|
|
|
|
|
|
WebSocketReponseList.GetRoomListResult(msg);
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "RoomJoinNotice":
|
|
|
|
|
|
WebSocketReponseList.RoomJoinNotice(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "RoomInfo":
|
|
|
|
|
|
WebSocketReponseList.RoomInfo(msg);
|
2026-05-27 19:47:06 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case "RoomFireNotice":
|
|
|
|
|
|
WebSocketReponseList.RoomFireNotice(msg);
|
|
|
|
|
|
|
2026-02-03 11:35:19 +08:00
|
|
|
|
break;
|
|
|
|
|
|
case "RoomKillNotice":
|
2026-02-09 10:44:38 +08:00
|
|
|
|
WebSocketReponseList.RoomKillNotice(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "SyncPlayerGold":
|
|
|
|
|
|
WebSocketReponseList.SyncPlayerGold(msg);
|
2026-02-03 11:35:19 +08:00
|
|
|
|
break;
|
2026-07-30 23:54:35 +08:00
|
|
|
|
case "ChangeGunMultipleNotice":
|
|
|
|
|
|
WebSocketReponseList.ChangeGunMultipleNotice(msg);
|
|
|
|
|
|
break;
|
2026-03-09 09:25:01 +08:00
|
|
|
|
case "GetRoomInfoResult":
|
|
|
|
|
|
WebSocketReponseList.GetRoomInfoResult(msg);
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "SyncGameData":
|
|
|
|
|
|
WebSocketReponseList.SyncGameDataResult(msg);
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "RoomLeaveNotice":
|
|
|
|
|
|
WebSocketReponseList.LeaveRoomResult(msg);
|
|
|
|
|
|
//WebSocketManager.Instance.Close(SocketType.game);
|
|
|
|
|
|
break;
|
|
|
|
|
|
case "ChangeControllerUser":
|
|
|
|
|
|
{
|
2026-07-25 23:05:24 +08:00
|
|
|
|
// ⭐ 房主控制权移交:仅维护 roomOwnerSit,不再设置 fangzhu
|
|
|
|
|
|
// (鱼创建已由服务端 OnFishSpawn 统一下发,客户端无需房主出鱼)
|
2026-07-20 22:32:52 +08:00
|
|
|
|
var userId = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
|
|
|
|
|
|
if (userId == GameManager.Instance.user.id)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (SitPosData.localPlayerSit != null)
|
|
|
|
|
|
SitPosData.roomOwnerSit = SitPosData.localPlayerSit;
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (userId != null && userId.StartsWith("bot_"))
|
|
|
|
|
|
{
|
2026-07-25 23:05:24 +08:00
|
|
|
|
// 房主是人机:由本地首个非人机玩家代行房主显示职责
|
2026-07-20 22:32:52 +08:00
|
|
|
|
SitPosData.TransferRoomOwner();
|
|
|
|
|
|
}
|
2026-03-09 09:25:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
2026-03-18 17:26:14 +08:00
|
|
|
|
case "Exception":
|
|
|
|
|
|
{
|
2026-07-29 22:59:26 +08:00
|
|
|
|
var ex = JsonConvert.DeserializeObject<WebSocketResponseBase<WebSocketReponseList.FishGameExceptionData>>(msg).arguments[0];
|
|
|
|
|
|
if (ex == null) break;
|
|
|
|
|
|
|
|
|
|
|
|
// 根据错误码分类处理
|
|
|
|
|
|
switch (ex.code)
|
2026-03-18 17:26:14 +08:00
|
|
|
|
{
|
2026-07-29 22:59:26 +08:00
|
|
|
|
case 1001: // 房间已满 → 弹窗提示并跳转房间列表
|
|
|
|
|
|
UIManager.Instance.ShowTiShi(ex.message, () =>
|
2026-03-18 17:26:14 +08:00
|
|
|
|
{
|
2026-07-29 22:59:26 +08:00
|
|
|
|
switch (GameManager.Instance.gameData.currGameType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case GameType.JQQD:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.defaultPanel:
|
|
|
|
|
|
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, UIPanel.MainGamePanelDefault, null, (panel) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
WebSocketSendList.GetRoomListFish(GameManager.Instance.gameData.currRoomData.roomLevel, 1);
|
|
|
|
|
|
});
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.FLZY:
|
|
|
|
|
|
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, UIPanel.MainGamePanelFLZY, null, (panel) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
WebSocketSendList.GetRoomListFish(GameManager.Instance.gameData.currRoomData.roomLevel, 1);
|
|
|
|
|
|
});
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.YYSC:
|
|
|
|
|
|
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, UIPanel.MainGamePanelYYSC, null, (panel) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
WebSocketSendList.GetRoomListFish(GameManager.Instance.gameData.currRoomData.roomLevel, 1);
|
|
|
|
|
|
});
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.ZGXQ:
|
|
|
|
|
|
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, UIPanel.MainGamePanelZGXQ, null, (panel) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
WebSocketSendList.GetRoomListFish(GameManager.Instance.gameData.currRoomData.roomLevel, 1);
|
|
|
|
|
|
});
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.XJMH:
|
|
|
|
|
|
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, UIPanel.MainGamePanelXJMH, null, (panel) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
WebSocketSendList.GetRoomListFish(GameManager.Instance.gameData.currRoomData.roomLevel, 1);
|
|
|
|
|
|
});
|
|
|
|
|
|
break;
|
|
|
|
|
|
case GameType.HHWK:
|
|
|
|
|
|
UIManager.Instance.ShowAsync(UIPanel.HomeMainPanel, UIPanel.MainGamePanelHHWK, null, (panel) =>
|
|
|
|
|
|
{
|
|
|
|
|
|
WebSocketSendList.GetRoomListFish(GameManager.Instance.gameData.currRoomData.roomLevel, 1);
|
|
|
|
|
|
});
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
2026-03-18 17:26:14 +08:00
|
|
|
|
break;
|
2026-07-29 22:59:26 +08:00
|
|
|
|
// 资产/状态类错误 → 弹窗提示,玩家需明确知晓
|
|
|
|
|
|
case 1002: // 金币不足
|
2026-08-03 13:56:30 +08:00
|
|
|
|
UIManager.Instance.ShowBoardError(ex.message);
|
|
|
|
|
|
|
|
|
|
|
|
break;
|
2026-07-29 22:59:26 +08:00
|
|
|
|
case 1003: // 房间不存在
|
|
|
|
|
|
case 1011: // 用户不存在
|
|
|
|
|
|
case 1013: // 道具数量不足
|
|
|
|
|
|
case 1014: // 钻石不足
|
|
|
|
|
|
UIManager.Instance.ShowTiShi(ex.message);
|
|
|
|
|
|
break;
|
|
|
|
|
|
// 参数/配置/技术性错误 → Toast 轻提示
|
|
|
|
|
|
case 1004: // 玩家不在房间
|
|
|
|
|
|
case 1005: // 签名错误
|
|
|
|
|
|
case 1006: // 请求已过期
|
|
|
|
|
|
case 1007: // 鱼配置不存在
|
|
|
|
|
|
case 1008: // 子弹参数无效
|
|
|
|
|
|
case 1009: // 金币参数超出范围
|
|
|
|
|
|
case 1012: // 道具配置不存在
|
|
|
|
|
|
case 1015: // 炮倍参数无效
|
|
|
|
|
|
default: // 0=未知错误
|
|
|
|
|
|
UIManager.Instance.ShowBoardError(ex.message);
|
2026-03-18 17:26:14 +08:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
2026-06-26 19:28:39 +08:00
|
|
|
|
|
|
|
|
|
|
// ======== 新增 FishGameHub 缺失事件 ========
|
|
|
|
|
|
|
|
|
|
|
|
case "BindSuccess":
|
|
|
|
|
|
{
|
|
|
|
|
|
var msgText = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
|
|
|
|
|
|
Debug.Log("[FishGameHub] BindSuccess: " + msgText);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "SendPlayerInfoResult":
|
|
|
|
|
|
{
|
|
|
|
|
|
var gold = JsonConvert.DeserializeObject<WebSocketResponseBase<long?>>(msg).arguments[0];
|
|
|
|
|
|
// 发送玩家信息结果,gold 为当前金币数(可为 null)
|
|
|
|
|
|
if (gold.HasValue)
|
|
|
|
|
|
WebSocketReponseList.SyncPlayerGold(JsonConvert.DeserializeObject<WebSocketResponseBase<long>>(msg).arguments[0].ToString());
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "RoomDisconnectNotice":
|
|
|
|
|
|
{
|
|
|
|
|
|
var userIdDisc = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
|
|
|
|
|
|
Debug.Log("[FishGameHub] 玩家断线: " + userIdDisc);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2026-07-30 23:54:35 +08:00
|
|
|
|
//case "ChangeGunMultipleNotice":
|
|
|
|
|
|
// WebSocketReponseList.ChangeGunMultipleNotice(msg);
|
|
|
|
|
|
// break;
|
2026-06-26 19:28:39 +08:00
|
|
|
|
|
|
|
|
|
|
case "UsePropNotice":
|
|
|
|
|
|
{
|
|
|
|
|
|
var data = JsonConvert.DeserializeObject<WebSocketResponseBase<Dictionary<string, object>>>(msg).arguments[0];
|
2026-07-20 22:32:52 +08:00
|
|
|
|
var userId = data["userId"]?.ToString();
|
|
|
|
|
|
string propNumber = data["propNumber"]?.ToString();
|
|
|
|
|
|
Debug.Log($"[FishGameHub] 使用道具: userId={userId}, prop={propNumber}");
|
|
|
|
|
|
|
|
|
|
|
|
var panel = CreateFishManager.Instance.currGameType;
|
|
|
|
|
|
if (panel != null)
|
|
|
|
|
|
panel.OnUsePropNotice(userId, propNumber);
|
2026-06-26 19:28:39 +08:00
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2026-09-10 01:07:35 +08:00
|
|
|
|
case "TorpedoResultNotice":
|
|
|
|
|
|
// ⭐ 鱼雷使用结果(房间广播):所有客户端都播爆奖
|
|
|
|
|
|
// (随机炸死场上小鱼 + 红包分包爆金币,isSelf 决定金/银币与加分)
|
|
|
|
|
|
WebSocketReponseList.TorpedoResultNotice(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "ErrorMessage":
|
|
|
|
|
|
// ⭐ 错误通知兜底(鱼雷等新接口失败时推送;老接口走 Exception 错误码)
|
|
|
|
|
|
WebSocketReponseList.ErrorMessage(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2026-06-26 19:28:39 +08:00
|
|
|
|
case "KillNotice":
|
2026-07-25 23:05:24 +08:00
|
|
|
|
// 全局击杀公告(真人击杀/机器人模拟)
|
|
|
|
|
|
WebSocketReponseList.KillNotice(msg);
|
2026-06-26 19:28:39 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "OnFishExpired":
|
|
|
|
|
|
{
|
|
|
|
|
|
var fishIds = JsonConvert.DeserializeObject<WebSocketResponseBase<int[]>>(msg).arguments[0];
|
|
|
|
|
|
Debug.Log($"[FishGameHub] 鱼过期: {string.Join(",", fishIds)}");
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "OnFishList":
|
2026-07-25 23:05:24 +08:00
|
|
|
|
// 鱼列表刷新
|
|
|
|
|
|
WebSocketReponseList.OnFishList(msg);
|
2026-06-26 19:28:39 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
2026-07-21 04:36:52 +08:00
|
|
|
|
// ======== FishGameHub / FishRoomHub 补充事件 ========
|
|
|
|
|
|
|
2026-07-22 15:01:41 +08:00
|
|
|
|
case "BotLeaveRoomNotice":
|
2026-07-25 23:05:24 +08:00
|
|
|
|
// 机器人退出房间,数据 { userId }
|
|
|
|
|
|
WebSocketReponseList.BotLeaveRoomNotice(msg);
|
2026-07-21 04:36:52 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
2026-07-22 15:01:41 +08:00
|
|
|
|
case "HostDisconnect":
|
2026-07-25 23:05:24 +08:00
|
|
|
|
// 房主断线,其他玩家可接受机器人控制权
|
|
|
|
|
|
WebSocketReponseList.HostDisconnectNotice(msg);
|
2026-07-21 04:36:52 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "OnSeatChange":
|
2026-07-25 23:05:24 +08:00
|
|
|
|
// 座位变更 { type, userId, position, showWaiting? }
|
|
|
|
|
|
WebSocketReponseList.OnSeatChange(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
// ======== 新协议事件 ========
|
|
|
|
|
|
|
|
|
|
|
|
case "OnFishSpawn":
|
|
|
|
|
|
// ⭐ 服务端出鱼事件(破坏性替代 createFish 帧同步)
|
|
|
|
|
|
// type: "init"=首次出鱼 / "spawn"=定时出鱼 / "sync"=重连或取消挂机同步
|
|
|
|
|
|
WebSocketReponseList.OnFishSpawn(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "FishFrozen":
|
|
|
|
|
|
// ⭐ 冰冻道具(40003)生效:鱼存活时间延长 15 秒,客户端写死 15s 倒计时
|
|
|
|
|
|
WebSocketReponseList.FishFrozen(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "PlayerAfkNotice":
|
|
|
|
|
|
// 玩家挂机通知 { userId }
|
|
|
|
|
|
WebSocketReponseList.PlayerAfkNotice(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case "PlayerCancelAfkNotice":
|
|
|
|
|
|
// 玩家取消挂机通知 { userId }
|
|
|
|
|
|
WebSocketReponseList.PlayerCancelAfkNotice(msg);
|
2026-07-21 04:36:52 +08:00
|
|
|
|
break;
|
|
|
|
|
|
|
2026-09-22 03:59:20 +08:00
|
|
|
|
case "SummonCardFishNotice":
|
|
|
|
|
|
// ⭐ 召唤卡召唤通知:某玩家使用召唤卡,服务端已创建召唤鱼(实际鱼由 OnFishSpawn 下发,这里只播提示)
|
|
|
|
|
|
WebSocketReponseList.SummonCardFishNotice(msg);
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2026-07-21 04:36:52 +08:00
|
|
|
|
case "RoomChange":
|
|
|
|
|
|
{
|
|
|
|
|
|
// FishRoomHub 房间变化通知(人数/状态变更),更新房间列表
|
|
|
|
|
|
Debug.Log("[FishRoomHub] 房间变化通知");
|
|
|
|
|
|
WebSocketReponseList.RoomChangeNotice(msg);
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
2026-02-03 11:35:19 +08:00
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.StreamItem:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.Completion:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.StreamInvocation:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.CancelInvocation:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.Ping:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MessageType.Close:
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-08-04 21:20:56 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 轻量解析:用 JsonTextReader 只读 type 和 target 字段做路由,
|
|
|
|
|
|
/// 跳过 arguments 数组反序列化(节省 90%+ 预解析 GC)。
|
|
|
|
|
|
/// arguments 在具体处理方法内部按需反序列化。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private static WebSocketResponseBase<object> ParseHeader(string item)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (string.IsNullOrEmpty(item)) return null;
|
|
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
using (var sr = new StringReader(item))
|
|
|
|
|
|
using (var reader = new JsonTextReader(sr))
|
|
|
|
|
|
{
|
|
|
|
|
|
var result = new WebSocketResponseBase<object>();
|
|
|
|
|
|
while (reader.Read())
|
|
|
|
|
|
{
|
|
|
|
|
|
if (reader.TokenType == JsonToken.PropertyName)
|
|
|
|
|
|
{
|
|
|
|
|
|
string propName = (string)reader.Value;
|
|
|
|
|
|
// 读到 arguments 就停止,不再解析后续(节省大量 GC)
|
|
|
|
|
|
if (propName == "arguments")
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
reader.Read(); // 读值
|
|
|
|
|
|
if (propName == "type")
|
|
|
|
|
|
{
|
|
|
|
|
|
result.type = Convert.ToInt32(reader.Value);
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (propName == "target")
|
|
|
|
|
|
{
|
|
|
|
|
|
result.target = reader.Value as string;
|
|
|
|
|
|
}
|
|
|
|
|
|
// invocationId 等字段跳过
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return result;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
catch
|
|
|
|
|
|
{
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-02-03 11:35:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|