This commit is contained in:
2026-10-06 01:14:13 +08:00
parent b05ebeeb90
commit 1f7b9d837f
13 changed files with 560 additions and 46 deletions
@@ -1402,8 +1402,8 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
mc.Init(yzPathId.ToString(), cfg.times, true, yz.arrayNumber);
// ⭐ 鱼阵调试日志:输出每条子鱼生成后的旋转与缩放(排查"有的正有的反")
Debug.Log($"[鱼阵调试] 阵={yz.arrayNumber}(顺序阵) pathId={yzPathId} 第{i + 1}/{yz.fishCount}条 guid={mc.guid} " +
$"rotation={fish.transform.eulerAngles.ToString("F1")} localScale={fish.transform.localScale.ToString("F3")}");
//Debug.Log($"[鱼阵调试] 阵={yz.arrayNumber}(顺序阵) pathId={yzPathId} 第{i + 1}/{yz.fishCount}条 guid={mc.guid} " +
// $"rotation={fish.transform.eulerAngles.ToString("F1")} localScale={fish.transform.localScale.ToString("F3")}");
yield return new WaitForSeconds(1f);
}
@@ -297,6 +297,33 @@ namespace Assets.MyGame.Scripts.Net.WebResponses
public string userId;
}
/// <summary>
/// 玩家信息同步 OnPlayerInfo 数据(GetPlayerInfo 的新响应,发送给调用者)。
/// 旧事件 SendPlayerInfoResult 只返回 gold;本事件返回完整玩家信息。
/// </summary>
[Serializable]
public class OnPlayerInfoData
{
/// <summary>玩家ID</summary>
public string userId;
/// <summary>玩家昵称</summary>
public string userName;
/// <summary>金币</summary>
public long gold;
/// <summary>钻石</summary>
public int diamond;
/// <summary>VIP等级</summary>
public int viplvl;
/// <summary>炮倍</summary>
public int cannonMultiple;
/// <summary>炮台ID</summary>
public string cannonId;
/// <summary>翅膀ID</summary>
public string wingsId;
/// <summary>座位位置</summary>
public int position;
}
/// <summary>
/// 召唤卡召唤通知 SummonCardFishNotice 数据。
/// 仅用于播放召唤提示/特效/显示召唤玩家,实际鱼对象仍由 OnFishSpawn 创建。
@@ -69,6 +69,12 @@ namespace Assets.MyGame.Scripts.Net
nextHeartbeatTime = Time.realtimeSinceStartup + HeartbeatIntervalSeconds;
}
/// <summary>获取指定类型 Socket 的完整连接地址(含 baseUrl,供外部拼接查询参数,如象棋 Hub 的 ?userId=)</summary>
public string GetSocketPath(SocketType type)
{
return baseUrl + socketPaths[type];
}
private void Update()
{
if (Time.realtimeSinceStartup < nextHeartbeatTime)
@@ -90,20 +90,30 @@ namespace Assets.MyGame.Scripts.Net
case "BeginGame":
{
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg.ToString()).arguments[0];
if (roomMainPanel != null && roomMainPanel.IsChessGameActive && va.state == 2)
{
// 对局中收到 BeginGame = 断线重连/取消挂起的房间同步:只刷新玩家数据,不重置对局
roomMainPanel.UpdateUserData(va);
}
else
{
roomMainPanel.subUIManager.CloseAll();
roomMainPanel.StartGame(msg);
roomMainPanel.UpdateUserData(va);
}
// 4.3 完整快照 + 4.4 旧房间过滤:交给面板统一处理(覆盖 roomData 并按 state 分流)
if (roomMainPanel != null) roomMainPanel.ApplyRoomSnapshot(va);
}
break;
case "RoomStateNotice":
{
// 4.3 房间状态完整快照(服务端推送 / GetRoomState 主动查询的返回)
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg.ToString()).arguments[0];
if (roomMainPanel != null) roomMainPanel.ApplyRoomSnapshot(va);
}
break;
case "KickedFromRoom":
{
// 4.5 被踢出房间 { gameId, userId, reason?, source? }
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<Dictionary<string, object>>>(msg).arguments[0];
string kickedUserId = va.ContainsKey("userId") ? va["userId"]?.ToString() : null;
string kickReason = va.ContainsKey("reason") ? va["reason"]?.ToString() : null;
Debug.Log($"[Chess] 被踢出房间: userId={kickedUserId}, reason={kickReason}");
if (roomMainPanel != null) roomMainPanel.OnKickedFromRoom(kickedUserId, kickReason);
}
break;
case "CreateRoomNotice":
{
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<ChessGameRoom>>(msg.ToString()).arguments[0];
@@ -168,6 +178,8 @@ namespace Assets.MyGame.Scripts.Net
break;
case "EndGameSuccess":
{
// 4.4 已退房/无房间会话时不处理旧房间的结算事件
if (roomMainPanel == null || roomMainPanel.roomData == null) break;
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
if (va == null || va == "")
{
@@ -195,29 +207,17 @@ namespace Assets.MyGame.Scripts.Net
break;
case "ExitRoomSuccess":
{
// 4.4 退出成功(自己):清空本地房间状态 → 回大厅重拉列表(0 = 重新加入大厅通知组)
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
if (GameManager.Instance.user.id == va)
{
WebSocketSendList.GetRoomListChineseChess(1);
if (roomMainPanel != null) roomMainPanel.ClearRoomLocalState();
WebSocketSendList.GetRoomListChineseChess(0);
}
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--;
}
}
// 对方退出:房间快照由服务端随后的 BeginGame 广播覆盖(4.3),这里不做人次 -1
}
}
break;
@@ -287,6 +287,8 @@ namespace Assets.MyGame.Scripts.Net
case "GameEnd":
{
// 4.4 已退房/无房间会话时不处理旧房间的结算事件
if (roomMainPanel == null || roomMainPanel.roomData == null) break;
if (roomMainPanel != null) roomMainPanel.StopWaitCountdown(); // 游戏结束停走棋倒计时
var va = JsonConvert.DeserializeObject<WebSocketResponseBase<Dictionary<string, object>>>(msg).arguments[0];
string winUserId = va["winUserId"]?.ToString();
@@ -731,6 +733,11 @@ namespace Assets.MyGame.Scripts.Net
WebSocketReponseList.PlayerCancelAfkNotice(msg);
break;
case "OnPlayerInfo":
// ⭐ 玩家信息同步(GetPlayerInfo 的新响应,含完整玩家数据;旧事件 SendPlayerInfoResult 只返回 gold)
WebSocketReponseList.OnPlayerInfo(msg);
break;
case "SummonCardFishNotice":
// ⭐ 召唤卡召唤通知:某玩家使用召唤卡,服务端已创建召唤鱼(实际鱼由 OnFishSpawn 下发,这里只播提示)
WebSocketReponseList.SummonCardFishNotice(msg);
@@ -489,6 +489,17 @@ namespace Assets.MyGame.Scripts.Net
EventCenter.Instance.EventTrigger<PlayerAfkNoticeData>(ConstEventString.PlayerCancelAfkNotice, data);
}
/// <summary>
/// 玩家信息同步 OnPlayerInfo(GetPlayerInfo 的新响应,发送给调用者)。
/// 旧事件 SendPlayerInfoResult 只返回 gold;本事件返回完整玩家信息,UI 层通过 EventCenter 消费。
/// </summary>
public static void OnPlayerInfo(string msg)
{
var data = JsonConvert.DeserializeObject<WebSocketResponseBase<OnPlayerInfoData>>(msg).arguments[0];
if (data == null) return;
EventCenter.Instance.EventTrigger<OnPlayerInfoData>(ConstEventString.OnPlayerInfo, data);
}
/// <summary>
/// 召唤卡召唤通知 SummonCardFishNotice。
/// 某玩家使用召唤卡(40006),服务端已创建 Boss鱼(飞机场)/黄金鱼(其他场次)。
@@ -80,4 +80,16 @@ public partial class WebSocketSendList
{
WebSocketManager.Instance.Send(SocketType.chess, "{\"type\":1,\"target\":\"CancelPlayerAfk\",\"invocationId\":\"1\",\"arguments\":[\"" + gameId + "\",\"" + userId + "\"]}");
}
/// <summary>房主踢人(4.5):开局前将目标玩家踢出房间,被踢者收到 KickedFromRoom</summary>
public static void KickPlayerChineseChess(string gameId, string targetUserId)
{
WebSocketManager.Instance.Send(SocketType.chess, "{\"type\":1,\"target\":\"KickPlayer\",\"invocationId\":\"1\",\"arguments\":[\"" + gameId + "\",\"" + targetUserId + "\"]}");
}
/// <summary>主动查询房间状态(4.3):服务端返回 RoomStateNotice(room) 完整快照,用于重连/断线超时后校准本地状态</summary>
public static void GetRoomStateChineseChess(string gameId)
{
WebSocketManager.Instance.Send(SocketType.chess, "{\"type\":1,\"target\":\"GetRoomState\",\"invocationId\":\"1\",\"arguments\":[\"" + gameId + "\"]}");
}
}
@@ -261,22 +261,22 @@ public partial class WebSocketSendList
}
/// <summary>
/// 玩家挂机(对应服务端 SetPlayerAfkNEW)
/// 玩家挂机(对应服务端 SetPlayerAfk)
/// 服务端会向房间组广播 PlayerAfkNotice 事件
/// </summary>
public static void SetPlayerAfk(string roomId, string userId)
{
var sendObj = new WebSocketSendList("SetPlayerAfkNEW", roomId, userId);
var sendObj = new WebSocketSendList("SetPlayerAfk", roomId, userId);
WebSocketManager.Instance.Send(SocketType.game, JsonConvert.SerializeObject(sendObj));
}
/// <summary>
/// 取消挂机(对应服务端 CancelPlayerAfkNEW)
/// 服务端会向房间组广播 PlayerCancelAfkNotice 事件,并通过 OnFishSpawn(type=sync) 同步当前鱼
/// 取消挂机(对应服务端 CancelPlayerAfk)
/// 服务端会向房间组广播 PlayerCancelAfkNotice 事件,并通过 RoomInfo(activeFishes) 同步当前鱼
/// </summary>
public static void CancelPlayerAfk(string roomId, string userId)
{
var sendObj = new WebSocketSendList("CancelPlayerAfkNEW", roomId, userId);
var sendObj = new WebSocketSendList("CancelPlayerAfk", roomId, userId);
WebSocketManager.Instance.Send(SocketType.game, JsonConvert.SerializeObject(sendObj));
}