Exemplo n.º 1
0
        public void Disconnect(bool ForcedDisconnect)
        {
            if (LoggingOut)
            {
                return;
            }

            LoggingOut = true;

            try
            {
                #region WebSocket
                PlusEnvironment.GetGame().GetWebEventManager().CloseSocketByGameClient(((this.GetHabbo() == null) ? 0 : this.GetHabbo().Id));
                if (GetRoleplay() != null)
                {
                    foreach (WebSocketChatRoom ChatRoom in GetRoleplay().ChatRooms.Values)
                    {
                        if (ChatRoom == null)
                        {
                            continue;
                        }
                        WebSocketChatManager.Disconnect(this, ChatRoom.ChatName, false, null);
                    }
                }
                #endregion

                if (GetRoomUser() != null && !ForcedDisconnect)
                {
                    RoleplayManager.Chat(this, GetHabbo().Username + " irá sair em 10 segundos.", 1);
                    GetRoomUser().ApplyEffect(95);

                    if (GetHabbo() != null && GetHabbo().CurrentRoom != null)
                    {
                        GetHabbo().CurrentRoom.SendMessage(new SleepComposer(GetRoomUser(), true));
                    }

                    GetRoomUser().CanWalk = false;
                    GetRoomUser().ClearMovement(true);
                }

                if (GetRoleplay() != null)
                {
                    if (GetRoleplay().UserDataHandler != null)
                    {
                        GetRoleplay().UserDataHandler.SaveFarmingData();
                        GetRoleplay().UserDataHandler.SaveCooldownData();
                        GetRoleplay().UserDataHandler.SaveData();
                        GetRoleplay().UserDataHandler = null;
                    }
                }

                if (GetHabbo() != null)
                {
                    using (IQueryAdapter dbClient = PlusEnvironment.GetDatabaseManager().GetQueryReactor())
                        dbClient.RunQuery(GetHabbo().GetQueryString);
                }

                if (!ForcedDisconnect)
                {
                    new Thread(() =>
                    {
                        Thread.Sleep(8000);

                        if (GetRoleplay() != null)
                        {
                            GetRoleplay().UserDataHandler = new UserDataHandler(this, GetRoleplay());
                            GetRoleplay().UserDataHandler.SaveFarmingData();
                            GetRoleplay().UserDataHandler.SaveCooldownData();
                            GetRoleplay().UserDataHandler.SaveData();
                            GetRoleplay().UserDataHandler = null;
                        }

                        if (GetHabbo() != null)
                        {
                            using (IQueryAdapter dbClient = PlusEnvironment.GetDatabaseManager().GetQueryReactor())
                                dbClient.RunQuery(GetHabbo().GetQueryString);
                        }

                        EventManager.TriggerEvent("OnDisconnect", this);

                        Thread.Sleep(1000);

                        if (GetRoomUser() != null)
                        {
                            GetRoomUser().ApplyEffect(108);
                        }

                        Thread.Sleep(1000);

                        if (GetHabbo() != null)
                        {
                            using (IQueryAdapter dbClient = PlusEnvironment.GetDatabaseManager().GetQueryReactor())
                            {
                                dbClient.RunQuery(GetHabbo().GetQueryString);
                            }

                            GetHabbo().OnDisconnect();
                        }

                        if (!_disconnected)
                        {
                            if (_connection != null)
                            {
                                _connection.Dispose();
                            }
                            _disconnected = true;
                        }
                    }).Start();
                }
                else
                {
                    EventManager.TriggerEvent("OnDisconnect", this);

                    if (GetHabbo() != null)
                    {
                        using (IQueryAdapter dbClient = PlusEnvironment.GetDatabaseManager().GetQueryReactor())
                        {
                            dbClient.RunQuery(GetHabbo().GetQueryString);
                        }

                        GetHabbo().OnDisconnect();
                    }

                    if (!_disconnected)
                    {
                        if (_connection != null)
                        {
                            _connection.Dispose();
                        }
                        _disconnected = true;
                    }
                }
            }
            catch (Exception e)
            {
                Logging.LogException(e.ToString());
            }
        }