Пример #1
0
        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);
        }
Пример #2
0
 public void AddRoomRolesData(DJRoomRolesData djRoomRolesData)
 {
     lock (this.mutex)
     {
         this.DJRoomRolesDict[djRoomRolesData.RoomID] = djRoomRolesData;
     }
 }
Пример #3
0
        public DJRoomRolesData FindRoomRolesData(int roomID)
        {
            DJRoomRolesData djRoomRolesData = null;

            lock (this.mutex)
            {
                this.DJRoomRolesDict.TryGetValue(roomID, out djRoomRolesData);
            }
            return(djRoomRolesData);
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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;
                    }
                }
            }
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
                }
            }
        }
Пример #8
0
        /// <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);
        }
Пример #9
0
        /// <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);
                }
            }
        }