GetKey() private method

private GetKey ( ) : uint
return uint
示例#1
0
 public bool AddNewUser(User newUser)
 {
     foreach (User us in m_RoomUsers)
     {
         if (us != null && us.Guid == newUser.Guid)
         {
             //当前玩家已在游戏房间内
             if (us.GetKey() == newUser.GetKey())
             {
                 LogSys.Log(LOG_TYPE.DEBUG, "Add user success: User already in the room! RoomId:{0}, Guid:{1}, OldUser[{2}]({3}) NewUser[{4}]({5}) ",
                            m_RoomId, us.Guid, us.LocalID, us.GetKey(), newUser.LocalID, newUser.GetKey());
                 LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for new {1} {2}, [Room.AddNewUser]", newUser.LocalID, newUser.Guid, newUser.GetKey());
                 m_UserPool.FreeUser(newUser.LocalID);
                 return(true);
             }
             else if (us.UserControlState != (int)UserControlState.User)
             {
                 LogSys.Log(LOG_TYPE.DEBUG, "Add user success: User already in the room! RoomId:{0}, Guid:{1}, OldUser[{2}]({3}) NewUser[{4}]({5}) ",
                            m_RoomId, us.Guid, us.LocalID, us.GetKey(), newUser.LocalID, newUser.GetKey());
                 LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for old {1} {2}, [Room.AddNewUser]", us.LocalID, us.Guid, us.GetKey());
                 RemoveUser(us);
                 break;
             }
             else
             {
                 LogSys.Log(LOG_TYPE.DEBUG, "Add user false: User already in the room and online! RoomId:{0}, Guid:{1}, OldUser[{2}]({3}) NewUser[{4}]({5}) ",
                            m_RoomId, us.Guid, us.LocalID, us.GetKey(), newUser.LocalID, newUser.GetKey());
                 LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for new {1} {2}, [Room.AddNewUser]", newUser.LocalID, newUser.Guid, newUser.GetKey());
                 m_UserPool.FreeUser(newUser.LocalID);
                 return(false);
             }
         }
     }
     newUser.EnterRoomTime      = TimeUtility.GetLocalMilliseconds();
     newUser.OwnRoomUserManager = this;
     newUser.RegisterObservers(m_RoomObservers);
     newUser.CharacterCreateTime = TimeUtility.GetLocalMilliseconds();
     newUser.TimeCounter         = 0;
     if ((int)UserControlState.Ai == newUser.UserControlState)
     {
         newUser.IsEntered = true;
     }
     if (null != m_ActiveScene && m_ActiveScene.SceneState == SceneState.Running)
     {
         Scene scene = m_ActiveScene;
         scene.EnterScene(newUser);
     }
     foreach (User otheruser in m_RoomUsers)
     {
         if (otheruser != null)
         {
             otheruser.AddSameRoomUser(newUser);
             newUser.AddSameRoomUser(otheruser);
         }
     }
     m_RoomUsers.Add(newUser);
     LogSys.Log(LOG_TYPE.DEBUG, "Add user success ! RoomId:{0} , UserGuid:{1}({2})",
                m_RoomId, newUser.Guid, newUser.GetKey());
     return(true);
 }
        public static Msg_RC_CreateNpc BuildCreateNpcMessage(EntityInfo npc, int rate = -1)
        {
            Msg_RC_CreateNpc bder = new Msg_RC_CreateNpc();

            bder.npc_id  = npc.GetId();
            bder.unit_id = npc.GetUnitId();
            ScriptRuntime.Vector3         pos    = npc.GetMovementStateInfo().GetPosition3D();
            GameFrameworkMessage.Position pos_bd = new GameFrameworkMessage.Position();
            pos_bd.x            = (float)pos.X;
            pos_bd.z            = (float)pos.Z;
            bder.cur_pos        = pos_bd;
            bder.face_direction = (float)npc.GetMovementStateInfo().GetFaceDir();
            bder.link_id        = npc.GetTableId();
            bder.camp_id        = npc.GetCampId();
            if (npc.OwnerId > 0)
            {
                bder.owner_id = npc.OwnerId;
            }
            if (npc.GetAiStateInfo().LeaderId > 0)
            {
                bder.leader_id = npc.GetAiStateInfo().LeaderId;
            }
            User user = npc.CustomData as User;

            if (null != user)
            {
                bder.key = user.GetKey();
            }
            bder.level = npc.Level;

            return(bder);
        }
        internal static void Execute(object msg, User user)
        {
            Msg_CR_Enter enter_msg = msg as Msg_CR_Enter;

            if (enter_msg == null)
            {
                return;
            }
            LogSys.Log(LOG_TYPE.DEBUG, "user {0}({1},{2},{3}) enter.", user.RoleId, user.GetKey(), user.Guid, user.Name);
            user.UserControlState = (int)UserControlState.User;
            user.IsEntered        = true;

            Room room = user.OwnRoom;

            if (null != room)
            {
                Scene scene = room.ActiveScene;
                if (null != scene)
                {
                    EntityInfo userInfo = user.Info;
                    if (null != userInfo)
                    {
                        if (scene.SceneState == SceneState.Running)
                        {
                            scene.SyncForNewUser(user);
                            scene.StorySystem.SendMessage("user_enter_scene", userInfo.GetId(), userInfo.GetUnitId(), userInfo.GetCampId(), userInfo.GetMovementStateInfo().PositionX, userInfo.GetMovementStateInfo().PositionZ);
                        }
                    }
                }
            }
        }
        internal static void Execute(object msg, User user)
        {
            Msg_CR_Enter enter_msg = msg as Msg_CR_Enter;
            if (enter_msg == null) {
                return;
            }
            LogSys.Log(LOG_TYPE.DEBUG, "user {0}({1},{2},{3}) enter.", user.RoleId, user.GetKey(), user.Guid, user.Name);
            user.UserControlState = (int)UserControlState.User;
            user.IsEntered = true;

            Room room = user.OwnRoom;
            if (null != room) {
                Scene scene = room.ActiveScene;
                if (null != scene) {
                    EntityInfo userInfo = user.Info;
                    if (null != userInfo) {
                        if (scene.SceneState == SceneState.Running) {
                            scene.SyncForNewUser(user);
                            scene.StorySystem.SendMessage("user_enter_scene", userInfo.GetId(), userInfo.GetUnitId(), userInfo.GetCampId(), userInfo.GetMovementStateInfo().PositionX, userInfo.GetMovementStateInfo().PositionZ);
                        }
                    }
                }
            }
        }
 public void RemoveUser(User user, bool free)
 {
     if (user == null)
     {
         return;
     }
     foreach (User otheruser in m_RoomUsers)
     {
         if (null != otheruser && otheruser != user)
         {
             otheruser.RemoveSameRoomUser(user);
         }
     }
     user.ClearSameRoomUser();
     if (null != m_ActiveScene)
     {
         Scene scene = m_ActiveScene;
         scene.LeaveScene(user);
     }
     LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for {1} {2}, [Room.RemoveUser]", user.LocalID, user.Guid, user.GetKey());
     m_RoomUsers.Remove(user);
     if (free)
     {
         m_UserPool.FreeUser(user.LocalID);
     }
 }
 internal static void Execute(object msg, User user)
 {
     Msg_CR_Skill use_skill = msg as Msg_CR_Skill;
     if (null == use_skill)
         return;
     EntityInfo userObj = user.Info;
     if (null == userObj) {
         LogSys.Log(LOG_TYPE.DEBUG, "UseSkillHandler, charactor {0}({1},{2},{3}) not exist", user.RoleId, user.GetKey(), user.Guid, user.Name);
         return;
     }
     Scene scene = user.OwnRoom.ActiveScene;
     if (null != scene) {
         EntityInfo obj = scene.GetEntityById(use_skill.role_id);
         if (null != obj) {
             AiStateInfo aiInfo = obj.GetAiStateInfo();
             if (use_skill.target_id > 0) {
                 aiInfo.Target = use_skill.target_id;
             } else if (use_skill.target_dir > 0) {
                 float dir = ProtoHelper.DecodeFloat(use_skill.target_dir);
                 obj.GetMovementStateInfo().SetFaceDir(dir);
                 aiInfo.Target = 0;
             }
             if (aiInfo.AiLogic == (int)AiStateLogicId.Entity_Leader) {
                 AiData_Leader data = aiInfo.AiDatas.GetData<AiData_Leader>();
                 if (null == data) {
                     data = new AiData_Leader();
                     aiInfo.AiDatas.AddData(data);
                 }
                 data.ManualSkillId = use_skill.skill_id;
             } else {
                 AiData_General data = aiInfo.AiDatas.GetData<AiData_General>();
                 if (null == data) {
                     data = new AiData_General();
                     aiInfo.AiDatas.AddData(data);
                 }
                 data.ManualSkillId = use_skill.skill_id;
             }
             aiInfo.ChangeToState((int)AiStateId.SkillCommand);
         }
     }
 }
        internal static void Execute(object msg, User user)
        {
            Msg_CR_UserMoveToPos move_msg = msg as Msg_CR_UserMoveToPos;
            if (move_msg == null)
                return;
            EntityInfo charactor = user.Info;
            if (charactor == null) {
                LogSys.Log(LOG_TYPE.DEBUG, "charactor {0}({1},{2},{3}) not exist", user.RoleId, user.GetKey(), user.Guid, user.Name);
                return;
            }
            ///
            if (charactor.GetAIEnable()) {
                float tx, tz;
                ProtoHelper.DecodePosition2D(move_msg.target_pos, out tx, out tz);
                ScriptRuntime.Vector3 pos = new ScriptRuntime.Vector3(tx, 0, tz);

                MovementStateInfo msi = charactor.GetMovementStateInfo();
                msi.IsMoving = true;
                msi.TargetPosition = pos;
                float dir = Geometry.GetYRadian(msi.GetPosition3D(), pos);
                msi.SetFaceDir(dir);
                msi.SetMoveDir(dir);

                Msg_RC_NpcMove npcMoveBuilder = DataSyncUtility.BuildNpcMoveMessage(charactor);
                if (null != npcMoveBuilder) {
                    Scene scene = user.OwnRoom.ActiveScene;
                    if (null != scene) {
                        scene.NotifyAllUser(RoomMessageDefine.Msg_RC_NpcMove, npcMoveBuilder);
                    }
                }
            }
        }
示例#8
0
 internal void DeleteUser(User user)
 {
     if (null != user) {
         user.UserControlState = (int)UserControlState.Remove;
         if (null != user.Info) {
             //user.Info.Suicide();
         }
         LogSys.Log(LOG_TYPE.DEBUG, "Room {0} User {1}({2}) deleted.", RoomID, user.Guid, user.GetKey());
     }
 }
示例#9
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());
        }
        internal static void Execute(object msg, User user)
        {
            Msg_CR_Skill use_skill = msg as Msg_CR_Skill;

            if (null == use_skill)
            {
                return;
            }
            EntityInfo userObj = user.Info;

            if (null == userObj)
            {
                LogSys.Log(LOG_TYPE.DEBUG, "UseSkillHandler, charactor {0}({1},{2},{3}) not exist", user.RoleId, user.GetKey(), user.Guid, user.Name);
                return;
            }
            Scene scene = user.OwnRoom.ActiveScene;

            if (null != scene)
            {
                EntityInfo obj = scene.GetEntityById(use_skill.role_id);
                if (null != obj)
                {
                    AiStateInfo aiInfo = obj.GetAiStateInfo();
                    if (use_skill.target_id > 0)
                    {
                        aiInfo.Target = use_skill.target_id;
                    }
                    else if (use_skill.target_dir > 0)
                    {
                        float dir = ProtoHelper.DecodeFloat(use_skill.target_dir);
                        obj.GetMovementStateInfo().SetFaceDir(dir);
                        aiInfo.Target = 0;
                    }
                    if (aiInfo.AiLogic == (int)AiStateLogicId.Entity_Leader)
                    {
                        AiData_Leader data = aiInfo.AiDatas.GetData <AiData_Leader>();
                        if (null == data)
                        {
                            data = new AiData_Leader();
                            aiInfo.AiDatas.AddData(data);
                        }
                        data.ManualSkillId = use_skill.skill_id;
                    }
                    else
                    {
                        AiData_General data = aiInfo.AiDatas.GetData <AiData_General>();
                        if (null == data)
                        {
                            data = new AiData_General();
                            aiInfo.AiDatas.AddData(data);
                        }
                        data.ManualSkillId = use_skill.skill_id;
                    }
                    aiInfo.ChangeToState((int)AiStateId.SkillCommand);
                }
            }
        }
 internal static void Execute(object msg, User user)
 {
     LogSys.Log(LOG_TYPE.DEBUG, "Unhandled msg {0} user {1}({2},{3},{4})!!!", msg.GetType(), user.RoleId, user.GetKey(), user.Guid, user.Name);
 }
示例#12
0
        public static void Execute(object msg, User user)
        {
            Msg_CR_Skill use_skill = msg as Msg_CR_Skill;

            if (null == use_skill)
            {
                return;
            }
            EntityInfo userObj = user.Info;

            if (null == userObj)
            {
                LogSys.Log(LOG_TYPE.DEBUG, "UseSkillHandler, charactor {0}({1},{2},{3}) not exist", user.RoleId, user.GetKey(), user.Guid, user.Name);
                return;
            }
            Scene scene = user.OwnRoomUserManager.ActiveScene;

            if (null != scene)
            {
                EntityInfo obj = scene.GetEntityById(use_skill.role_id);
                if (null != obj)
                {
                    AiStateInfo aiInfo = obj.GetAiStateInfo();
                    if (use_skill.target_id > 0)
                    {
                        aiInfo.Target = use_skill.target_id;
                    }
                    else if (use_skill.target_dir > 0)
                    {
                        float dir = use_skill.target_dir;
                        obj.GetMovementStateInfo().SetFaceDir(dir);
                        aiInfo.Target = 0;
                    }
                    Msg_RC_NpcSkill retMsg = DataSyncUtility.BuildNpcSkillMessage(obj, use_skill.skill_id);
                    scene.NotifyAllUser(RoomMessageDefine.Msg_RC_NpcSkill, retMsg);
                }
            }
        }
示例#13
0
 private void RemoveUser(User user, bool free)
 {
     if (user == null) {
         return;
     }
     foreach (User otheruser in room_users_) {
         if (null != otheruser && otheruser != user) {
             otheruser.RemoveSameRoomUser(user);
         }
     }
     user.ClearSameRoomUser();
     if (null != m_ActiveScene) {
         Scene scene = m_ActiveScene;
         scene.LeaveScene(user);
     }
     LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for {1} {2}, [Room.RemoveUser]", user.LocalID, user.Guid, user.GetKey());
     room_users_.Remove(user);
     if (free) {
         user_pool_.FreeUser(user.LocalID);
     }
 }
示例#14
0
 internal void DropUser(User user)
 {
     //向Lobby发送玩家掉线消息
     Msg_RL_UserDrop uaqBuilder = new Msg_RL_UserDrop();
     uaqBuilder.RoomID = cur_room_id_;
     uaqBuilder.UserGuid = user.Guid;
     uaqBuilder.IsBattleEnd = false;
     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());
 }
        internal static void Execute(object msg, User user)
        {
            Msg_CR_UserMoveToPos move_msg = msg as Msg_CR_UserMoveToPos;

            if (move_msg == null)
            {
                return;
            }
            EntityInfo charactor = user.Info;

            if (charactor == null)
            {
                LogSys.Log(LOG_TYPE.DEBUG, "charactor {0}({1},{2},{3}) not exist", user.RoleId, user.GetKey(), user.Guid, user.Name);
                return;
            }
            ///
            if (charactor.GetAIEnable())
            {
                float tx, tz;
                ProtoHelper.DecodePosition2D(move_msg.target_pos, out tx, out tz);
                ScriptRuntime.Vector3 pos = new ScriptRuntime.Vector3(tx, 0, tz);

                MovementStateInfo msi = charactor.GetMovementStateInfo();
                msi.IsMoving       = true;
                msi.TargetPosition = pos;
                float dir = Geometry.GetYRadian(msi.GetPosition3D(), pos);
                msi.SetFaceDir(dir);
                msi.SetMoveDir(dir);

                Msg_RC_NpcMove npcMoveBuilder = DataSyncUtility.BuildNpcMoveMessage(charactor);
                if (null != npcMoveBuilder)
                {
                    Scene scene = user.OwnRoom.ActiveScene;
                    if (null != scene)
                    {
                        scene.NotifyAllUser(RoomMessageDefine.Msg_RC_NpcMove, npcMoveBuilder);
                    }
                }
            }
        }
示例#16
0
 public void DeleteUser(User user)
 {
     if (null != user)
     {
         user.UserControlState = (int)UserControlState.Remove;
         if (null != user.Info)
         {
             //user.Info.Suicide();
         }
         LogSys.Log(LOG_TYPE.DEBUG, "Room {0} User {1}({2}) deleted.", RoomId, user.Guid, user.GetKey());
     }
 }
示例#17
0
        internal void Destroy()
        {
            LogSys.Log(LOG_TYPE.INFO, "room {0}({1}) destroy.", RoomID, LocalID);
            m_ActiveScene.Reset();
            m_ScenePool.RecycleScene(m_ActiveScene);
            m_ActiveScene = null;

            this.CurrentState = RoomState.Unuse;
            int userCt = room_users_.Count;

            for (int i = userCt - 1; i >= 0; --i)
            {
                User user = room_users_[i];
                if (null != user)
                {
                    LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for {1} {2}, [Room.Destroy]", user.LocalID, user.Guid, user.GetKey());
                    user.Reset();
                    user_pool_.FreeUser(user.LocalID);
                    room_users_.RemoveAt(i);
                }
            }
            for (int i = 0; i < room_observers_.Length; ++i)
            {
                room_observers_[i].Reset();
            }
        }
示例#18
0
        public void RemoveUser(User user, bool free)
        {
            if (user == null)
            {
                return;
            }
            Msg_RL_UserQuit quitBuilder = new Msg_RL_UserQuit();

            quitBuilder.UserGuid = user.Guid;
            quitBuilder.RoomId   = RoomId;
            m_Connector.SendMsgToLobby(quitBuilder);

            foreach (User otheruser in m_RoomUsers)
            {
                if (null != otheruser && otheruser != user)
                {
                    otheruser.RemoveSameRoomUser(user);
                }
            }
            user.ClearSameRoomUser();
            if (null != m_ActiveScene)
            {
                Scene scene = m_ActiveScene;
                scene.LeaveScene(user);
            }

            LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for {1} {2}, [Room.RemoveUser]", user.LocalID, user.Guid, user.GetKey());
            m_RoomUsers.Remove(user);
            if (free)
            {
                m_UserPool.FreeUser(user.LocalID);
            }
        }
 internal static void Execute(object msg, User user)
 {
     LogSys.Log(LOG_TYPE.DEBUG, "Unhandled msg {0} user {1}({2},{3},{4})!!!", msg.GetType(), user.RoleId, user.GetKey(), user.Guid, user.Name);
 }
示例#20
0
        public void Destroy()
        {
            LogSys.Log(LOG_TYPE.INFO, "room {0}({1}) destroy.", RoomId, LocalID);
            OnDestroy();
            m_RoomUserMgr.ActiveScene.Reset();
            m_ScenePool.RecycleScene(m_RoomUserMgr.ActiveScene);
            m_RoomUserMgr.ActiveScene = null;

            this.CurrentState = RoomState.Unuse;
            int userCt = m_RoomUserMgr.RoomUsers.Count;

            for (int i = userCt - 1; i >= 0; --i)
            {
                User user = m_RoomUserMgr.RoomUsers[i];
                if (null != user)
                {
                    LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for {1} {2}, [Room.Destroy]", user.LocalID, user.Guid, user.GetKey());
                    user.Reset();
                    m_UserPool.FreeUser(user.LocalID);
                    m_RoomUserMgr.RoomUsers.RemoveAt(i);
                }
            }
            for (int i = 0; i < m_RoomUserMgr.RoomObservers.Length; ++i)
            {
                m_RoomUserMgr.RoomObservers[i].Reset();
            }
        }
示例#21
0
        internal bool AddNewUser(User newUser)
        {
            foreach (User us in room_users_) {
                if (us != null && us.Guid == newUser.Guid) {
                    //当前玩家已在游戏房间内
                    if (us.GetKey() == newUser.GetKey()) {
                        LogSys.Log(LOG_TYPE.DEBUG, "Add user success: User already in the room! RoomID:{0}, Guid:{1}, OldUser[{2}]({3}) NewUser[{4}]({5}) ",
                        cur_room_id_, us.Guid, us.LocalID, us.GetKey(), newUser.LocalID, newUser.GetKey());
                        LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for new {1} {2}, [Room.AddNewUser]", newUser.LocalID, newUser.Guid, newUser.GetKey());
                        user_pool_.FreeUser(newUser.LocalID);
                        return true;
                    } else if (us.UserControlState != (int)UserControlState.User) {
                        LogSys.Log(LOG_TYPE.DEBUG, "Add user success: User already in the room! RoomID:{0}, Guid:{1}, OldUser[{2}]({3}) NewUser[{4}]({5}) ",
                        cur_room_id_, us.Guid, us.LocalID, us.GetKey(), newUser.LocalID, newUser.GetKey());
                        LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for old {1} {2}, [Room.AddNewUser]", us.LocalID, us.Guid, us.GetKey());
                        RemoveUser(us);
                        break;
                    } else {
                        LogSys.Log(LOG_TYPE.DEBUG, "Add user false: User already in the room and online! RoomID:{0}, Guid:{1}, OldUser[{2}]({3}) NewUser[{4}]({5}) ",
                        cur_room_id_, us.Guid, us.LocalID, us.GetKey(), newUser.LocalID, newUser.GetKey());
                        LogSys.Log(LOG_TYPE.INFO, "FreeUser {0} for new {1} {2}, [Room.AddNewUser]", newUser.LocalID, newUser.Guid, newUser.GetKey());
                        user_pool_.FreeUser(newUser.LocalID);
                        return false;
                    }
                }
            }
            can_close_time_ = 0;
            newUser.EnterRoomTime = TimeUtility.GetLocalMilliseconds();
            newUser.OwnRoom = this;
            newUser.RegisterObservers(room_observers_);
            newUser.CharacterCreateTime = TimeUtility.GetLocalMilliseconds();
            newUser.TimeCounter = 0;
            if ((int)UserControlState.Ai == newUser.UserControlState) {
                newUser.IsEntered = true;
            }
            if (null != m_ActiveScene && m_ActiveScene.SceneState == SceneState.Running) {
                Scene scene = m_ActiveScene;
                scene.EnterScene(newUser);
            }
            foreach (User otheruser in room_users_) {
                if (otheruser != null) {
                    otheruser.AddSameRoomUser(newUser);
                    newUser.AddSameRoomUser(otheruser);
                }
            }
            room_users_.Add(newUser);
            LogSys.Log(LOG_TYPE.DEBUG, "Add user success ! RoomID:{0} , UserGuid:{1}({2})",
              cur_room_id_, newUser.Guid, newUser.GetKey());

            m_CanFinish = true;
            return true;
        }