Example #1
0
        //战斗快照
        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);
        }
Example #2
0
        // 广播房间战斗帧包,只有真人对战才需要广播
        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);
                }
            }
        }
Example #3
0
        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);
        }