예제 #1
0
        internal void OnChangeScene(List <ulong> userGuids, int sceneID)
        {
            bool     failed     = true;
            RoomInfo targetRoom = null;
            int      roomId     = m_LobbyInfo.FindSceneRoom(sceneID);

            if (roomId > 0)
            {
                targetRoom = m_LobbyInfo.GetRoomByID(roomId);
                if (null != targetRoom && targetRoom.UserCount + userGuids.Count <= targetRoom.TotalCount)
                {
                    for (int i = 0; i < userGuids.Count; ++i)
                    {
                        ulong    userGuid = userGuids[i];
                        UserInfo user     = LobbyServer.Instance.UserProcessScheduler.GetUserInfo(userGuid);
                        if (user == null)
                        {
                            continue;
                        }
                        if (null != user.Room)
                        {
                            RoomInfo curRoom = user.Room;
                            if (curRoom.RoomId != targetRoom.RoomId)
                            {
                                Msg_LR_ChangeScene msg = new Msg_LR_ChangeScene();
                                msg.UserGuid     = userGuid;
                                msg.RoomId       = curRoom.RoomId;
                                msg.TargetRoomId = targetRoom.RoomId;

                                LobbyServer.Instance.RoomSvrChannel.Send(curRoom.RoomServerName, msg);
                                LogSys.Log(LOG_TYPE.INFO, "User change field ! , guid:{0} room:{1} target room:{2}", userGuid, curRoom.RoomId, targetRoom.RoomId);
                                failed = false;
                            }
                        }
                    }
                }
            }
            if (failed)
            {
                for (int i = 0; i < userGuids.Count; ++i)
                {
                    ulong    userGuid = userGuids[i];
                    UserInfo user     = LobbyServer.Instance.UserProcessScheduler.GetUserInfo(userGuid);
                    if (null != user)
                    {
                        LobbyServer.Instance.HighlightPrompt(user, 42);//进入游戏失败,请稍后重试
                    }
                }
            }
        }
예제 #2
0
        internal void RequestChangeSceneRoom(ulong guid, int sceneId, int wantRoomId)
        {
            UserInfo info       = LobbyServer.Instance.UserProcessScheduler.GetUserInfo(guid);
            RoomInfo targetRoom = null;

            if (wantRoomId <= 0)
            {
                int roomId = m_LobbyInfo.FindSceneRoom(sceneId);
                if (roomId > 0)
                {
                    targetRoom = m_LobbyInfo.GetRoomByID(roomId);
                }
            }
            else
            {
                targetRoom = m_LobbyInfo.GetRoomByID(wantRoomId);
            }
            if (info != null && null != info.Room && null != targetRoom)
            {
                RoomInfo curRoom = info.Room;
                if (curRoom.RoomId != targetRoom.RoomId && targetRoom.UserCount < targetRoom.TotalCount)
                {
                    Msg_LR_ChangeScene msg = new Msg_LR_ChangeScene();
                    msg.UserGuid     = guid;
                    msg.RoomId       = curRoom.RoomId;
                    msg.TargetRoomId = targetRoom.RoomId;

                    LobbyServer.Instance.RoomSvrChannel.Send(curRoom.RoomServerName, msg);
                }
                else
                {
                    LobbyServer.Instance.HighlightPrompt(info, 42);//进入游戏失败,请稍后重试
                }
            }
            else
            {
                LobbyServer.Instance.HighlightPrompt(info, 42);//进入游戏失败,请稍后重试
            }
        }
예제 #3
0
        private void HandleChangeScene(Msg_LR_ChangeScene msg, PBChannel channel, int handle, uint seq)
        {
            ulong guid         = msg.UserGuid;
            int   roomid       = msg.RoomID;
            int   targetRoomId = msg.TargetRoomID;
            bool  isFieldThread;
            int   ix = GetActiveRoomThreadIndex(msg.RoomID, out isFieldThread);

            if (ix < 0)
            {
                Msg_RL_ChangeSceneResult replyBuilder = new Msg_RL_ChangeSceneResult();
                replyBuilder.UserGuid     = msg.UserGuid;
                replyBuilder.RoomID       = msg.RoomID;
                replyBuilder.TargetRoomID = msg.TargetRoomID;
                replyBuilder.Result       = (int)SceneOperationResultEnum.Cant_Find_Room;
                channel.Send(replyBuilder);
            }
            else
            {
                RoomThread roomThread;
                if (isFieldThread)
                {
                    roomThread = field_roomthread_list_[ix];
                }
                else
                {
                    roomThread = roomthread_list_[ix];
                }
                bool targetIsFieldThread;
                int  targetIx = GetActiveRoomThreadIndex(targetRoomId, out targetIsFieldThread);
                if (null != roomThread)
                {
                    if (targetIx >= 0)
                    {
                        //同服切场景
                        roomThread.QueueAction(roomThread.RemoveUser, guid, roomid, false, (MyAction <bool, int, User>)((bool success, int sceneId, User user) => {
                            if (success)
                            {
                                PlayerGotoRoom(user, roomid, targetRoomId);
                            }
                            else
                            {
                                Msg_RL_ChangeSceneResult replyBuilder = new Msg_RL_ChangeSceneResult();
                                replyBuilder.UserGuid     = guid;
                                replyBuilder.RoomID       = roomid;
                                replyBuilder.TargetRoomID = targetRoomId;
                                replyBuilder.Result       = (int)SceneOperationResultEnum.Cant_Find_Room;
                                channel.Send(replyBuilder);
                            }
                        }));
                    }
                    else
                    {
                        //跨服切场景
                        roomThread.QueueAction(roomThread.RemoveUser, guid, roomid, true, (MyAction <bool, int, User>)((bool success, int sceneId, User user) => {
                            if (success)
                            {
                                Msg_RL_ChangeSceneResult replyBuilder = new Msg_RL_ChangeSceneResult();
                                EntityInfo info = user.Info;
                                if (null != info)
                                {
                                    replyBuilder.HP = info.Hp;
                                    replyBuilder.MP = info.Energy;
                                }
                                replyBuilder.UserGuid     = guid;
                                replyBuilder.RoomID       = roomid;
                                replyBuilder.TargetRoomID = targetRoomId;
                                replyBuilder.Result       = (int)SceneOperationResultEnum.Success;
                                channel.Send(replyBuilder);
                            }
                            else
                            {
                                Msg_RL_ChangeSceneResult replyBuilder = new Msg_RL_ChangeSceneResult();
                                replyBuilder.UserGuid     = guid;
                                replyBuilder.RoomID       = roomid;
                                replyBuilder.TargetRoomID = targetRoomId;
                                replyBuilder.Result       = (int)SceneOperationResultEnum.Cant_Find_Room;
                                channel.Send(replyBuilder);
                            }
                        }));
                    }
                }
            }
        }