This commit is contained in:
2026-07-25 23:05:24 +08:00
parent 0c58becf41
commit a5d9a06030
11 changed files with 405 additions and 806 deletions
@@ -453,31 +453,20 @@ namespace Assets.MyGame.Scripts.Net
break;
case "ChangeControllerUser":
{
// ⭐ 房主控制权移交:仅维护 roomOwnerSit,不再设置 fangzhu
// (鱼创建已由服务端 OnFishSpawn 统一下发,客户端无需房主出鱼)
var userId = JsonConvert.DeserializeObject<WebSocketResponseBase<string>>(msg).arguments[0];
if (userId == GameManager.Instance.user.id)
{
// 本地玩家成为房主:开启出鱼 + 同步本地房主引用
CreateFishManager.Instance.fangzhu = true;
if (SitPosData.localPlayerSit != null)
SitPosData.roomOwnerSit = SitPosData.localPlayerSit;
}
else if (userId != null && userId.StartsWith("bot_"))
{
// 房主是人机:人机无法真正发包,由本地首个非人机玩家代发
// 房主是人机:由本地首个非人机玩家代行房主显示职责
SitPosData.TransferRoomOwner();
CreateFishManager.Instance.fangzhu =
SitPosData.roomOwnerSit != null &&
SitPosData.roomOwnerSit.user == GameManager.Instance.user.id;
}
else
{
// ⭐ 只在 userId 非空且确实是真人玩家时才停止本地出鱼
// userId 为空(异常情况)时保持原状,避免误关出鱼导致 bot 退出后不出鱼
if (!string.IsNullOrEmpty(userId))
CreateFishManager.Instance.fangzhu = false;
}
}
break;
case "Exception":
{
@@ -590,18 +579,8 @@ namespace Assets.MyGame.Scripts.Net
break;
case "KillNotice":
{
var data = JsonConvert.DeserializeObject<WebSocketResponseBase<Dictionary<string, object>>>(msg).arguments[0];
if (data == null) break;
// { FishId, userName, gold }
string userName = data.TryGetValue("userName", out var un) ? un?.ToString() : "";
string fishId = data.TryGetValue("FishId", out var fi) ? fi?.ToString() : "";
long gold = data.TryGetValue("gold", out var g) ? Convert.ToInt64(g) : 0;
string roomName = GameManager.Instance.gameData.currRoomData?.roomName ?? "";
string roomLevel = GameManager.Instance.gameData.currRoomData?.roomLevel.ToString() ?? "";
string msgText = $"恭喜用户{userName} 在 {roomName} {roomLevel}场 捕获了{fishId}*{gold}倍";
//UIManager.Instance.ShowBoardGongGao(msgText);
}
// 全局击杀公告(真人击杀/机器人模拟)
WebSocketReponseList.KillNotice(msg);
break;
case "OnFishExpired":
@@ -612,49 +591,48 @@ namespace Assets.MyGame.Scripts.Net
break;
case "OnFishList":
{
var fishList = JsonConvert.DeserializeObject<WebSocketResponseBase<object[]>>(msg).arguments[0];
Debug.Log($"[FishGameHub] 鱼列表刷新, 数量={fishList?.Length}");
}
// 鱼列表刷新
WebSocketReponseList.OnFishList(msg);
break;
// ======== FishGameHub / FishRoomHub 补充事件 ========
case "BotLeaveRoomNotice":
{
// 机器人退出房间,数据 { userId }
var data = JsonConvert.DeserializeObject<WebSocketResponseBase<Dictionary<string, object>>>(msg).arguments[0];
string botUserId = data != null && data.TryGetValue("userId", out var buid) ? buid?.ToString() : "";
Debug.Log($"[FishGameHub] 机器人退出: {botUserId}");
WebSocketReponseList.BotLeaveRoom(botUserId);
}
// 机器人退出房间,数据 { userId }
WebSocketReponseList.BotLeaveRoomNotice(msg);
break;
case "HostDisconnect":
{
// 房主断线,其他玩家可接受机器人控制权
Debug.Log("[FishGameHub] 房主断线,可接受机器人控制权");
WebSocketReponseList.HostDisconnect();
}
// 房主断线,其他玩家可接受机器人控制权
WebSocketReponseList.HostDisconnectNotice(msg);
break;
case "OnSeatChange":
{
// 座位变更 { type, userId, position, showWaiting? }
var data = JsonConvert.DeserializeObject<WebSocketResponseBase<Dictionary<string, object>>>(msg).arguments[0];
if (data != null)
{
// 注意:JSON 字段可能是 long/double/string/bool 等任意类型,
// 直接 Convert.ToInt32(object) 对字符串会走 int.Parse 抛 FormatException。
// 这里统一通过 ToString() + TryParse 容错。
int seatType = data.TryGetValue("type", out var t) && int.TryParse(t?.ToString(), out var st) ? st : 0;
string userId = data.TryGetValue("userId", out var u) ? u?.ToString() : "";
int position = data.TryGetValue("position", out var p) && int.TryParse(p?.ToString(), out var pos) ? pos : -1;
bool showWaiting = data.TryGetValue("showWaiting", out var sw) && (sw is bool b ? b : (sw != null && bool.TryParse(sw.ToString(), out var bv) && bv));
Debug.Log($"[FishGameHub] 座位变更: type={seatType}, userId={userId}, position={position}, showWaiting={showWaiting}");
WebSocketReponseList.SeatChange(seatType, userId, position, showWaiting);
}
}
// 座位变更 { 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);
break;
case "RoomChange":