private bool CanGameOver(DJRoomRolesData djRoomRolesData) { bool team1Over = true; for (int i = 0; i < djRoomRolesData.Team1.Count; i++) { int state = 0; djRoomRolesData.RoleStates.TryGetValue(djRoomRolesData.Team1[i].RoleID, out state); if (state == 1) { team1Over = false; break; } } bool team2Over = true; for (int i = 0; i < djRoomRolesData.Team2.Count; i++) { int state = 0; djRoomRolesData.RoleStates.TryGetValue(djRoomRolesData.Team2[i].RoleID, out state); if (state == 1) { team2Over = false; break; } } return(team1Over || team2Over); }
public void AddRoomRolesData(DJRoomRolesData djRoomRolesData) { lock (this.mutex) { this.DJRoomRolesDict[djRoomRolesData.RoomID] = djRoomRolesData; } }
public DJRoomRolesData FindRoomRolesData(int roomID) { DJRoomRolesData djRoomRolesData = null; lock (this.mutex) { this.DJRoomRolesDict.TryGetValue(roomID, out djRoomRolesData); } return(djRoomRolesData); }
private void ProcessDJFightAwards(DJRoomData djRoomData) { DJRoomRolesData djRoomRolesData = this.FindRoomRolesData(djRoomData.RoomID); if (null != djRoomRolesData) { DJRoomRolesPoint djRoomRolesPoint = new DJRoomRolesPoint { RoomID = djRoomData.RoomID, RoomName = djRoomData.RoomName, RolePoints = new List <DJRoomRolePoint>() }; lock (djRoomRolesData) { int loseTeam = this.GetLoseTeam(djRoomRolesData); int team1AvgDJPoint = this.GetTeamAvgDJPoint(djRoomRolesData.Team1); int team2AvgDJPoint = this.GetTeamAvgDJPoint(djRoomRolesData.Team2); for (int i = 0; i < djRoomRolesData.Team1.Count; i++) { djRoomRolesPoint.RolePoints.Add(new DJRoomRolePoint { RoleID = djRoomRolesData.Team1[i].RoleID, RoleName = djRoomRolesData.Team1[i].RoleName, FightPoint = ((loseTeam > 0) ? this.GetTeamRolePoint(djRoomRolesData.Team1[i], team2AvgDJPoint, loseTeam != 1) : 0) }); } for (int i = 0; i < djRoomRolesData.Team2.Count; i++) { djRoomRolesPoint.RolePoints.Add(new DJRoomRolePoint { RoleID = djRoomRolesData.Team2[i].RoleID, RoleName = djRoomRolesData.Team2[i].RoleName, FightPoint = ((loseTeam > 0) ? this.GetTeamRolePoint(djRoomRolesData.Team1[i], team1AvgDJPoint, loseTeam != 2) : 0) }); } } for (int i = 0; i < djRoomRolesPoint.RolePoints.Count; i++) { if (djRoomRolesPoint.RolePoints[i].FightPoint != 0) { GameManager.DBCmdMgr.AddDBCmd(10023, string.Format("{0}:{1}", djRoomRolesPoint.RolePoints[i].RoleID, djRoomRolesPoint.RolePoints[i].FightPoint), null, 0); } } GameManager.ClientMgr.NotifyDianJiangRoomRolesPoint(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomRolesPoint); } }
public void SetRoomRolesDataRoleState(int roomID, int roleID, int state) { DJRoomRolesData djRoomRolesData = this.FindRoomRolesData(roomID); if (null != djRoomRolesData) { lock (this.mutex) { int oldState = 0; djRoomRolesData.RoleStates.TryGetValue(roleID, out oldState); if (state > oldState) { djRoomRolesData.RoleStates[roleID] = state; } } } }
private int GetLoseTeam(DJRoomRolesData djRoomRolesData) { bool team1Over = true; for (int i = 0; i < djRoomRolesData.Team1.Count; i++) { int state = 0; djRoomRolesData.RoleStates.TryGetValue(djRoomRolesData.Team1[i].RoleID, out state); if (state == 1) { team1Over = false; break; } } bool team2Over = true; for (int i = 0; i < djRoomRolesData.Team2.Count; i++) { int state = 0; djRoomRolesData.RoleStates.TryGetValue(djRoomRolesData.Team2[i].RoleID, out state); if (state == 1) { team2Over = false; break; } } int result; if (team1Over) { result = 1; } else if (team2Over) { result = 2; } else { result = 0; } return(result); }
private void ProcessRoomFighting(DJRoomData djRoomData) { int djFightState = 0; long startFightTicks = 0L; DJRoomData obj; lock (djRoomData) { if (djRoomData.PKState <= 0) { return; } djFightState = djRoomData.DJFightState; startFightTicks = djRoomData.StartFightTicks; } long ticks = TimeUtil.NOW(); if (djFightState == 0) { GameManager.ClientMgr.NotifyDianJiangFightCmd(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData, 1, ticks.ToString(), null); lock (djRoomData) { djRoomData.DJFightState = 1; djRoomData.StartFightTicks = ticks; } } else if (djFightState == 1) { if (ticks >= startFightTicks + 30000L) { GameManager.ClientMgr.NotifyDianJiangFightCmd(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData, 2, ticks.ToString(), null); lock (djRoomData) { djRoomData.PKState = 2; djRoomData.DJFightState = 2; djRoomData.StartFightTicks = ticks; } } } else if (djFightState == 2) { bool gameOver = false; DJRoomRolesData djRoomRolesData = this.FindRoomRolesData(djRoomData.RoomID); if (null != djRoomRolesData) { gameOver = this.CanGameOver(djRoomRolesData); } if (gameOver || ticks >= startFightTicks + 90000L) { GameManager.ClientMgr.NotifyDianJiangFightCmd(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData, 3, ticks.ToString(), null); lock (djRoomData) { djRoomData.PKState = 3; djRoomData.DJFightState = 3; djRoomData.StartFightTicks = ticks; } GameManager.ClientMgr.NotifyDianJiangData(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData); } } else if (djFightState == 3) { this.ProcessDJFightAwards(djRoomData); GameManager.ClientMgr.NotifyDianJiangFightCmd(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData, 4, ticks.ToString(), null); lock (djRoomData) { djRoomData.DJFightState = 4; djRoomData.StartFightTicks = ticks; } } else if (djFightState == 4) { if (ticks >= startFightTicks + 60000L) { GameManager.ClientMgr.NotifyDJFightRoomLeaveMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData); GameManager.ClientMgr.RemoveDianJiangRoom(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData); } } }
/// <summary> /// 处理点将台结束时的奖励 /// </summary> private void ProcessDJFightAwards(DJRoomData djRoomData) { DJRoomRolesData djRoomRolesData = FindRoomRolesData(djRoomData.RoomID); if (null == djRoomRolesData) { return; } DJRoomRolesPoint djRoomRolesPoint = new DJRoomRolesPoint() { RoomID = djRoomData.RoomID, RoomName = djRoomData.RoomName, RolePoints = new List <DJRoomRolePoint>(), }; lock (djRoomRolesData) { int loseTeam = GetLoseTeam(djRoomRolesData); //if (0 == loseTeam) return; //获取队伍1的积分平均值 int team1AvgDJPoint = GetTeamAvgDJPoint(djRoomRolesData.Team1); //获取队伍2的积分平均值 int team2AvgDJPoint = GetTeamAvgDJPoint(djRoomRolesData.Team2); for (int i = 0; i < djRoomRolesData.Team1.Count; i++) { djRoomRolesPoint.RolePoints.Add(new DJRoomRolePoint() { RoleID = djRoomRolesData.Team1[i].RoleID, RoleName = djRoomRolesData.Team1[i].RoleName, FightPoint = loseTeam > 0 ? GetTeamRolePoint(djRoomRolesData.Team1[i], team2AvgDJPoint, (loseTeam != 1)) : 0, }); } for (int i = 0; i < djRoomRolesData.Team2.Count; i++) { djRoomRolesPoint.RolePoints.Add(new DJRoomRolePoint() { RoleID = djRoomRolesData.Team2[i].RoleID, RoleName = djRoomRolesData.Team2[i].RoleName, FightPoint = loseTeam > 0 ? GetTeamRolePoint(djRoomRolesData.Team1[i], team1AvgDJPoint, (loseTeam != 2)) : 0, }); } } //写入数据库中... for (int i = 0; i < djRoomRolesPoint.RolePoints.Count; i++) { if (djRoomRolesPoint.RolePoints[i].FightPoint != 0) { GameManager.DBCmdMgr.AddDBCmd((int)TCPGameServerCmds.CMD_DB_ADDDJPOINT, string.Format("{0}:{1}", djRoomRolesPoint.RolePoints[i].RoleID, djRoomRolesPoint.RolePoints[i].FightPoint), null, GameManager.LocalServerIdForNotImplement); } } //发送给客户端(参战者,以及所有的观众) // 发送点将台房间的战斗结果 GameManager.ClientMgr.NotifyDianJiangRoomRolesPoint(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomRolesPoint); }
/// <summary> /// 处理房间中站在战斗的过程 /// </summary> /// <param name="djRoomData"></param> private void ProcessRoomFighting(DJRoomData djRoomData) { lock (djRoomData) { if (djRoomData.PKState <= 0) //战斗还没有开始 { return; } } int djFightState = 0; lock (djRoomData) { djFightState = djRoomData.DJFightState; } long startFightTicks = 0; lock (djRoomData) { startFightTicks = djRoomData.StartFightTicks; } //如果超过了最大倒计时时间,允许角色进入战斗伤害 long ticks = TimeUtil.NOW(); if (djFightState == (int)DJFightStates.NoFight) //如果还没开始战斗 { //发送广播消息 /// 通知角色点将台房间内战斗的指令信息(参战者,观众) GameManager.ClientMgr.NotifyDianJiangFightCmd(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData, (int)DJFightStates.WaitingFight, ticks.ToString()); lock (djRoomData) { djRoomData.DJFightState = (int)DJFightStates.WaitingFight; djRoomData.StartFightTicks = ticks; } } else if (djFightState == (int)DJFightStates.WaitingFight) //等待战斗倒计时(此时伤害无效) { if (ticks >= (startFightTicks + (30 * 1000))) { //发送广播消息 /// 通知角色点将台房间内战斗的指令信息(参战者,观众) GameManager.ClientMgr.NotifyDianJiangFightCmd(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData, (int)DJFightStates.StartFight, ticks.ToString()); lock (djRoomData) { djRoomData.PKState = 2; djRoomData.DJFightState = (int)DJFightStates.StartFight; djRoomData.StartFightTicks = ticks; } } } else if (djFightState == (int)DJFightStates.StartFight) //开始战斗(倒计时中) { bool gameOver = false; DJRoomRolesData djRoomRolesData = FindRoomRolesData(djRoomData.RoomID); if (null != djRoomRolesData) { // 是否战斗已经结束? gameOver = CanGameOver(djRoomRolesData); } if (gameOver || ticks >= (startFightTicks + (3 * 30 * 1000))) { //发送广播消息 /// 通知角色点将台房间内战斗的指令信息(参战者,观众) GameManager.ClientMgr.NotifyDianJiangFightCmd(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData, (int)DJFightStates.EndFight, ticks.ToString()); lock (djRoomData) { djRoomData.PKState = 3; djRoomData.DJFightState = (int)DJFightStates.EndFight; djRoomData.StartFightTicks = ticks; } //发送房间数据 GameManager.ClientMgr.NotifyDianJiangData(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData); } } else if (djFightState == (int)DJFightStates.EndFight) //结束战斗(此时伤害无效) { //开始计算给予的奖励 /// 处理点将台结束时的奖励 ProcessDJFightAwards(djRoomData); //发送广播消息 /// 通知角色点将台房间内战斗的指令信息(参战者,观众) GameManager.ClientMgr.NotifyDianJiangFightCmd(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData, (int)DJFightStates.ClearRoom, ticks.ToString()); lock (djRoomData) { djRoomData.DJFightState = (int)DJFightStates.ClearRoom; djRoomData.StartFightTicks = ticks; } } else if (djFightState == (int)DJFightStates.ClearRoom) //清空房间 { if (ticks >= (startFightTicks + (60 * 1000))) { //通知角色点将台房间内战斗的指令信息(参战者,观众)离开离开场景消息 GameManager.ClientMgr.NotifyDJFightRoomLeaveMsg(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData); //将点将台房间数据从内存中清空, 并重置所有用户的变量状态(包括观众) //删除点将台房间 GameManager.ClientMgr.RemoveDianJiangRoom(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, djRoomData); } } }