protected override async Task Run(Gamer gamer, C2M_ActorGamerGetTreasure message, Action <M2C_ActorGamerGetTreasure> reply) { M2C_ActorGamerGetTreasure response = new M2C_ActorGamerGetTreasure(); try { DBProxyComponent proxyComponent = Game.Scene.GetComponent <DBProxyComponent>(); ConfigComponent configComponent = Game.Scene.GetComponent <ConfigComponent>(); //记录数据 gamer.EndTime = DateTime.Now; TimeSpan span = gamer.EndTime - gamer.StartTime; int totalSeconds = (int)span.TotalSeconds; //await DBCommonUtil.RecordGamerTime(gamer.EndTime, false, gamer.UserID); await DBCommonUtil.RecordGamerInfo(gamer.UserID, totalSeconds); List <GamerInfoDB> gamerInfos = await proxyComponent.QueryJson <GamerInfoDB>($"{{UId:{gamer.UserID}}}"); if (gamerInfos.Count == 0) { response.Error = ErrorCode.ERR_Common; response.Message = "未到时间"; reply(response); return; } GamerInfoDB gamerInfo = gamerInfos[0]; gamerInfo.DailyTreasureCount++; TreasureConfig config = configComponent.Get(typeof(TreasureConfig), gamerInfo.DailyTreasureCount) as TreasureConfig; Log.Debug("config:" + JsonHelper.ToJson(config)); if (config == null) { response.Error = ErrorCode.ERR_Common; response.Message = "宝箱已领取完"; } else { if (gamerInfo.DailyOnlineTime >= config.TotalTime) { await DBCommonUtil.ChangeWealth(gamer.UserID, 1, config.Reward, "游戏内宝箱奖励"); await proxyComponent.Save(gamerInfo); //下一个奖励 TreasureConfig treasureConfig = (TreasureConfig)configComponent.Get(typeof(TreasureConfig), ++gamerInfo.DailyTreasureCount); //宝箱领完了 if (treasureConfig == null) { response.RestSeconds = -1; response.Reward = config.Reward; } else { response.RestSeconds = treasureConfig.TotalTime - gamerInfo.DailyOnlineTime; response.Reward = config.Reward; } } else { response.Error = ErrorCode.ERR_Common; response.Message = "未到时间"; } } reply(response); gamer.StartTime = DateTime.Now; //await DBCommonUtil.RecordGamerTime(gamer.EndTime, false, gamer.UserID); } catch (Exception e) { ReplyError(response, e, reply); } await Task.CompletedTask; }
/// <summary> /// 游戏结束 /// </summary> /// <param name="self"></param> /// <param name="huaCount"></param> public static async Task GameOver(this GameControllerComponent self, int huaCount) { RoomComponent roomComponent = null; Room room = null; try { room = self.GetParent <Room>(); room.IsGameOver = true; room.tokenSource.Cancel(); roomComponent = Game.Scene.GetComponent <RoomComponent>(); DeskComponent deskComponent = room.GetComponent <DeskComponent>(); GameControllerComponent controllerComponent = room.GetComponent <GameControllerComponent>(); deskComponent.RestLibrary.Clear(); if (huaCount == 0) { //没牌 room.huPaiUid = 0; room.fangPaoUid = 0; room.LiangZhuangCount = 0; room.Broadcast(new Actor_GameFlow()); //流局 room.LastBiXiaHu = true; } await ChangeWeath(self, huaCount, room); if (room.huPaiUid != 0) { await DBCommonUtil.RecordWeekRankLog(room.huPaiUid, 0, 1); } Log.Info( $"当前{room.CurrentJuCount}局,改变了{room.GetAll()[0].ChangeGold},{room.GetAll()[1].ChangeGold},{room.GetAll()[2].ChangeGold},{room.GetAll()[3].ChangeGold}"); //更新任务 List <Task> tasks = new List <Task>(); Task updateTask = UpdateTask(room); Task updateChengjiu = UpdateChengjiu(room); Task updatePlayerInfo = UpdatePlayerInfo(room, huaCount); //记录对局 Task logGame = DBCommonUtil.Log_Game( controllerComponent.RoomConfig.Name, room.GetAll()[0].UserID, room.GetAll()[1].UserID, room.GetAll()[2].UserID, room.GetAll()[3].UserID, room.huPaiUid, self.RoomConfig.FriendRoomId, room.GetAll()[0].UserID + ";" + room.GetAll()[0].playerBaseInfo.Name + ";" + room.GetAll()[0].ChangeGold, room.GetAll()[1].UserID + ";" + room.GetAll()[1].playerBaseInfo.Name + ";" + room.GetAll()[1].ChangeGold, room.GetAll()[2].UserID + ";" + room.GetAll()[2].playerBaseInfo.Name + ";" + room.GetAll()[2].ChangeGold, room.GetAll()[3].UserID + ";" + room.GetAll()[3].playerBaseInfo.Name + ";" + room.GetAll()[3].ChangeGold ); tasks.Add(updateTask); tasks.Add(updateChengjiu); tasks.Add(updatePlayerInfo); tasks.Add(logGame); await Task.WhenAll(tasks); //设置在线时长 foreach (var gamer in room.GetAll()) { //在线 if (!gamer.isOffline) { gamer.EndTime = DateTime.Now; TimeSpan span = gamer.EndTime - gamer.StartTime; int totalSeconds = (int)span.TotalSeconds; //await DBCommonUtil.RecordGamerTime(gamer.EndTime, false, gamer.UserID); await DBCommonUtil.RecordGamerInfo(gamer.UserID, totalSeconds); } } foreach (var gamer in room.GetAll()) { if (gamer == null) { continue; } gamer.RemoveComponent <HandCardsComponent>(); gamer.IsReady = false; gamer.ReadyTimeOut = 0; gamer.isGangFaWanPai = false; gamer.isFaWanPaiTingPai = false; gamer.isGangEndBuPai = false; gamer.isGetYingHuaBuPai = false; gamer.IsCanPeng = false; gamer.IsCanGang = false; gamer.IsCanHu = false; gamer.IsWinner = false; gamer.IsTrusteeship = false; gamer.ChangeGold = 0; //离线踢出 if (gamer.isOffline && !room.IsFriendRoom) { Log.Info($"玩家{gamer.UserID}结束游戏后离线踢出,移除玩家"); room.Remove(gamer.UserID); gamer.isOffline = !gamer.isOffline; } } #region 好友房设置 if (room.IsFriendRoom) { //打完啦。可以解散了 if (room.CurrentJuCount == self.RoomConfig.JuCount) { //等待结算界面结束 await Game.Scene.GetComponent <TimerComponent>().WaitAsync(5000); Log.Debug("好友房间打完了"); room.Broadcast(new Actor_GamerReadyTimeOut() { Message = "房间解散" }); GameHelp.RoomDispose(room); return; } else { Log.Debug("还没打完"); room.StartReady(); } } #endregion room.State = RoomState.Idle; room.IsLianZhuang = true; //游戏房间进入准备房间 roomComponent.gameRooms.Remove(room.Id); roomComponent.idleRooms.Add(room.Id, room); //房间没人就释放 if (room.seats.Count == 0) { Log.Info($"房间释放:{room.Id}"); roomComponent.RemoveRoom(room); room?.Dispose(); } } catch (Exception e) { Log.Error("房间结算:" + e); //游戏房间进入准备房间 roomComponent?.gameRooms.Remove(room.Id); roomComponent?.idleRooms.Add(room.Id, room); } }
protected override async Task Run(Gamer gamer, Actor_GamerExitRoom message) { try { Log.Info($"玩家{gamer.UserID}退出房间"); RoomComponent roomComponent = Game.Scene.GetComponent <RoomComponent>(); Room room = roomComponent.Get(gamer.RoomID); if (room == null) { return; } if (room.State == RoomState.Game) { if (gamer.isOffline) { return; } gamer.isOffline = true; //玩家断开添加自动出牌组件 //if (gamer.GetComponent<TrusteeshipComponent>() == null) //gamer.AddComponent<TrusteeshipComponent>(); gamer.EndTime = DateTime.Now; TimeSpan span = gamer.EndTime - gamer.StartTime; int totalSeconds = (int)span.TotalSeconds; //await DBCommonUtil.RecordGamerTime(gamer.EndTime, false,gamer.UserID); await DBCommonUtil.RecordGamerInfo(gamer.UserID, totalSeconds); Log.Info($"玩家{gamer.UserID}断开,切换为自动模式"); } else { GameControllerComponent gameControllerComponent = room.GetComponent <GameControllerComponent>(); //好友房还没开局房主掉线,房间解散 if (room.IsFriendRoom && room.State == RoomState.Idle && room.CurrentJuCount == 0) { if (gameControllerComponent.RoomConfig.MasterUserId == gamer.UserID) { room.Broadcast(new Actor_GamerReadyTimeOut() { Message = "房主解散房间" }); GameHelp.RoomDispose(room); return; } } //好友房开局后,掉线后不能退出 if (room.IsFriendRoom && room.CurrentJuCount > 0 && room.CurrentJuCount < gameControllerComponent.RoomConfig.JuCount) { gamer.isOffline = true; Log.Info($"{gamer.UserID} 好友房开局后,掉线后不能退出"); return; } //玩家主动退出 通知gate if (message.IsFromClient) { ActorMessageSenderComponent actorMessageSenderComponent = Game.Scene.GetComponent <ActorMessageSenderComponent>(); ActorMessageSender actorMessageSender = actorMessageSenderComponent.Get(gamer.PlayerID); actorMessageSender.Send(new M2G_Actor_GamerExitRoom()); //消息广播给其他人 room.Broadcast(new Actor_GamerExitRoom() { Uid = gamer.UserID }); //房间移除玩家 Log.Info($"{gamer.UserID}主动退出,移除玩家"); room.Remove(gamer.UserID); } else //游戏崩溃 { //房间移除玩家 Log.Info($"{gamer.UserID}崩溃退出,移除玩家"); room.Remove(gamer.UserID); //消息广播给其他人 room.Broadcast(new Actor_GamerExitRoom() { Uid = gamer.UserID }); } gamer.Dispose(); //房间没人就释放 if (room.seats.Count == 0) { roomComponent.RemoveRoom(room); room?.Dispose(); } } } catch (Exception e) { Log.Error(e); } await Task.CompletedTask; }