存档1
This commit is contained in:
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user