Beispiel #1
0
 public void Finish(int winnerCampID)
 {
     if (IsFieldRoom)
     {
         return;
     }
     if (this.CurrentState == RoomState.Finish || this.CurrentState == RoomState.Deactive)
     {
         return;
     }
     foreach (User user in m_RoomUserMgr.RoomUsers)
     {
         if (user != null)
         {
             Msg_RL_UserDrop unqBuilder = new Msg_RL_UserDrop();
             unqBuilder.RoomId      = m_RoomId;
             unqBuilder.UserGuid    = user.Guid;
             unqBuilder.IsBattleEnd = true;
             m_Connector.SendMsgToLobby(unqBuilder);
             user.LastNotifyUserDropTime = TimeUtility.GetLocalMilliseconds();
         }
     }
     this.CurrentState = RoomState.Finish;
     m_FinishTime      = TimeUtility.GetLocalMilliseconds();
     LogSys.Log(LOG_TYPE.DEBUG, "Room {0}({1}) EndBattle.", RoomId, LocalID);
 }
Beispiel #2
0
 public void NoticeRoomClosing()
 {
     foreach (User user in m_RoomUserMgr.RoomUsers)
     {
         if (user != null && (int)UserControlState.UserDropped == user.UserControlState)
         {
             Msg_RL_UserDrop unqBuilder = new Msg_RL_UserDrop();
             unqBuilder.RoomId      = m_RoomId;
             unqBuilder.UserGuid    = user.Guid;
             unqBuilder.IsBattleEnd = true;
             m_Connector.SendMsgToLobby(unqBuilder);
             user.LastNotifyUserDropTime = TimeUtility.GetLocalMilliseconds();
         }
     }
 }
Beispiel #3
0
 internal void NoticeRoomClosing()
 {
     foreach (User user in room_users_)
     {
         if (user != null && (int)UserControlState.UserDropped == user.UserControlState)
         {
             Msg_RL_UserDrop unqBuilder = new Msg_RL_UserDrop();
             unqBuilder.RoomID      = cur_room_id_;
             unqBuilder.UserGuid    = user.Guid;
             unqBuilder.IsBattleEnd = true;
             connector_.SendMsgToLobby(unqBuilder);
             user.LastNotifyUserDropTime = TimeUtility.GetLocalMilliseconds();
         }
     }
 }
Beispiel #4
0
        public void DropUser(User user)
        {
            //向Lobby发送玩家掉线消息
            Msg_RL_UserDrop uaqBuilder = new Msg_RL_UserDrop();

            uaqBuilder.RoomId      = RoomId;
            uaqBuilder.UserGuid    = user.Guid;
            uaqBuilder.IsBattleEnd = false;
            m_Connector.SendMsgToLobby(uaqBuilder);
            user.LastNotifyUserDropTime = TimeUtility.GetLocalMilliseconds();
            //控制状态改为掉线
            user.UserControlState = (int)UserControlState.UserDropped;
            if (null != user.Info)
            {
                // user.Info.Suicide();
            }
            LogSys.Log(LOG_TYPE.DEBUG, "Room {0} User {1}({2}) dropped.", RoomId, user.Guid, user.GetKey());
        }
Beispiel #5
0
        //响应RoomServer发来的房间内玩家掉线消息
        internal void OnRoomUserDrop(int roomid, ulong guid, bool isBattleEnd, Msg_RL_UserDrop originalMsg)
        {
            UserInfo user = LobbyServer.Instance.UserProcessScheduler.GetUserInfo(guid);

            if (user != null)
            {
                if (isBattleEnd)
                {
                    user.CurrentRoomID = 0;
                    user.CurrentState  = UserState.Room == user.CurrentState ? UserState.Online : user.CurrentState;
                }
                else
                {
                    user.CurrentRoomID = roomid;
                }
                RoomInfo curRoom = user.Room;
                RoomInfo oldRoom = m_LobbyInfo.GetRoomByID(roomid);
                if (null != oldRoom && oldRoom != curRoom)
                {
                    Msg_LR_UserQuit msg = new Msg_LR_UserQuit();
                    msg.UserGuid = guid;
                    msg.RoomId   = roomid;
                    LobbyServer.Instance.RoomSvrChannel.Send(oldRoom.RoomServerName, msg);
                }
                LobbyServer.Instance.ForwardToWorld(user.UserSvrName, originalMsg);

                LogSys.Log(LOG_TYPE.INFO, "RoomServer User Drop! Guid {0} State {1} IsEnd {2}", guid, user.CurrentState, isBattleEnd);
            }
            else
            {
                RoomInfo oldRoom = m_LobbyInfo.GetRoomByID(roomid);
                if (null != oldRoom)
                {
                    Msg_LR_UserQuit msg = new Msg_LR_UserQuit();
                    msg.UserGuid = guid;
                    msg.RoomId   = roomid;
                    LobbyServer.Instance.RoomSvrChannel.Send(oldRoom.RoomServerName, msg);
                }

                LogSys.Log(LOG_TYPE.INFO, "RoomServer User Drop! Guid {0} State Offline IsEnd {1}", guid, isBattleEnd);
            }
        }
Beispiel #6
0
        public void Tick()
        {
            try {
                if (this.CurrentState != RoomState.Active && this.CurrentState != RoomState.Finish)
                {
                    return;
                }

                long curTime = TimeUtility.GetLocalMilliseconds();
                if (m_LastLogTime + 60000 < curTime)
                {
                    m_LastLogTime = curTime;

                    LogSys.Log(LOG_TYPE.INFO, "Room.Tick {0}", RoomId);
                }

                if (this.CurrentState == RoomState.Active)
                {
                    Scene scene = ActiveScene;
                    if (null != scene)
                    {
                        scene.Tick();
                        OnTick();
                    }
                    m_DisconnectedUsers.Clear();
                    m_RequestDeleteUsers.Clear();
                    foreach (User user in m_RoomUserMgr.RoomUsers)
                    {
                        if (user != null)
                        {
                            user.Tick();
                            if (user.IsTimeout())
                            {
                                if (user.UserControlState == (int)UserControlState.User)
                                {
                                    m_DisconnectedUsers.Add(user);
                                }
                                else if (user.UserControlState == (int)UserControlState.Remove)
                                {
                                    m_RequestDeleteUsers.Add(user);
                                }
                                else if (user.UserControlState == (int)UserControlState.UserDropped)
                                {
                                    if (user.LastNotifyUserDropTime + c_NotifyUserDropInterval < curTime)
                                    {
                                        Msg_RL_UserDrop uaqBuilder = new Msg_RL_UserDrop();
                                        uaqBuilder.RoomId      = m_RoomId;
                                        uaqBuilder.UserGuid    = user.Guid;
                                        uaqBuilder.IsBattleEnd = false;
                                        m_Connector.SendMsgToLobby(uaqBuilder);

                                        user.LastNotifyUserDropTime = curTime;
                                    }
                                    //临时处理,踢掉断线的玩家
                                    user.UserControlState = (int)UserControlState.Remove;
                                }
                            }
                        }
                    }
                    foreach (User user in m_DisconnectedUsers)
                    {
                        m_RoomUserMgr.DropUser(user);
                    }
                    foreach (User user in m_RequestDeleteUsers)
                    {
                        m_RoomUserMgr.RemoveUser(user);
                    }
                    //todo:观察者掉线处理
                    for (int i = 0; i < m_RoomUserMgr.RoomObservers.Length; ++i)
                    {
                        Observer observer = m_RoomUserMgr.RoomObservers[i];
                        if (!observer.IsIdle)
                        {
                            observer.Tick();
                        }
                    }
                    if (!IsFieldRoom)
                    {
                        int userCount = GetActiveRoomUserCount();
                        if (userCount <= 0 && CanFinish)
                        {
                            if (GetMinimizeElapsedDroppedTime() > c_FinishTimeForNoUsers)
                            {
                                //若房间内玩家数目为0,结束战斗,关闭房间
                                Finish((int)CampIdEnum.Unkown);
                            }
                        }
                    }
                    //每个Tick结束,将空间属性同步给Peer,用于Peer转发消息
                    foreach (User user in m_RoomUserMgr.RoomUsers)
                    {
                        if (null != user && null != user.Info && null != user.Info.GetMovementStateInfo())
                        {
                            GameFramework.RoomPeer peer = user.GetPeer();
                            if (null != peer)
                            {
                                MovementStateInfo info = user.Info.GetMovementStateInfo();
                                peer.Position = info.GetPosition3D();
                                peer.FaceDir  = info.GetFaceDir();
                            }
                        }
                    }
                }
                else if (m_FinishTime + c_DeactiveWaitTime < curTime)
                {
                    Deactive();
                }
            } catch (Exception ex) {
                LogSys.Log(LOG_TYPE.ERROR, "Exception {0}\n{1}", ex.Message, ex.StackTrace);
            }
        }
 private void HandleUserDrop(Msg_RL_UserDrop msg, PBChannel channel, int src, uint session)
 {
     //响应RoomServer游戏客户端退出消息
     m_RoomProcessThread.OnRoomUserDrop(msg.RoomId, msg.UserGuid, msg.IsBattleEnd, msg);
 }
Beispiel #8
0
 private void HandleUserDrop(Msg_RL_UserDrop msg_, PBChannel channel, int src, uint session)
 {
 }