//战斗快照 public ResultWithError <bool> TryRequestSnapShot(Room room, RoomUser user) { var result = new ResultWithError <bool> { Data = false, Code = ErrorCode.Success }; // 非实时战斗,或者,战斗持续时间低于5秒不启用快照 if (!room.Record.IsRealTime || room.BattleFrame <= BATTLE_SNAPSHOT_MIN_TIME / ConfigConstants.BATTLE_FRAME_TIME) { return(result); } // 玩家重连,战斗暂停3秒,并从对方玩家获取快照 var opponentUser = room.Users.FirstOrDefault(u => u.UserId != user.UserId); if (opponentUser == null) { // 找不到对手 //result.Code = ErrorCode.InvalidRoomUser; return(result); } if (opponentUser.IsDisconnected) { // TODO, 机器人或者对手也掉线,需要从哪里获取快照,等待磊哥实现 // 两个玩家都掉线了,强制结束战斗 // ExecBattleEnd(room, BattleEndReason.TwoDisconnect); //result.Code = ErrorCode.DataNotFound; Logger.LogDebug($"User[{user.UserId}]: Opponent[{opponentUser.UserId}] is disconnected too."); return(result); } // 标记房间上次操作时间 room.UpdateTime = GetTime(); // 标记等待快照 user.IsSnapshoting = true; // 广播给对手,请求快照 _ = BroadcastService.BroadcastAsync(opponentUser.UserId, new BroadcastRequestSnapshotDefinition(new TEmpty())); result.Data = true; return(result); }
// 广播房间战斗帧包,只有真人对战才需要广播 public void BroadcastRoomBattleFramePackage(Room room) { if (room == null) { return; } var pendingList = new List <TBattleFrameDetail>(room.PendingList); room.PendingList.Clear(); var package = new BroadcastBattleFramePackageDefinition(room.Record.FrameCount, pendingList.Count == 0 ? null : pendingList); for (int i = 0; i < room.Users.Count; i++) { var user = room.Users[i]; if (user.IsConnected && !user.IsSnapshoting && user.ReportResult == null) { BroadcastService.BroadcastAsync(room.Users[i].UserId, package); } } }
public async Task <bool> SendSnapShot(Room room, RoomUser user, TSSnapShot tSnapShot) { if (!room.Record.IsRealTime) { room.Record.SnapShot = tSnapShot; return(true); } // 房间战斗暂停3秒 room.Pause(ConfigConstants.BATTLE_SNAPSHOT_PAUSE_TIME); // 标记快照发送 user.IsSnapshoting = false; // 广播玩家战斗信息,带快照 var record = room.Record; record.SnapShot = tSnapShot; await BroadcastService.BroadcastAsync(user.UserId, new BroadcastBattleRecordDefinition(record)); room.Record.SnapShot = null; return(true); }