diff options
author | asuratva <asuratva@proton.me> | 2025-07-04 15:38:17 +0000 |
---|---|---|
committer | Fedja Beader <fedja@protonmail.ch> | 2025-07-04 15:38:17 +0000 |
commit | ffe75331a1a61331778206b5943a9847aaa0376b (patch) | |
tree | 6acee67cb4ba7792a2a9eb71ebfa3bba755827d8 /src | |
parent | ba796ccc028f78e36a6e07249698541d8cc411de (diff) | |
download | plus-master.tar.gz plus-master.tar.bz2 plus-master.tar.xz plus-master.zip |
Fix 'Switch' Button in Character Selection to automatically become 'World Selection' or 'Logout'HEADmaster
This is a suggested fix for !188
Squashed with:
* Added new state SWITCH_WORLD. Now everything works correctly.
* As a temporary fix, have 'Change Login' in World Selection Dialog do SWITCH_SERVER instead of SWITCH_LOGIN
* Move 'Switch World' logic from charselectdialog to SWITCH_LOGIN state
* reverting previous commit. State needs to be LOGIN_ATTEMPT, not LOGIN.
* Have 'Switch World' set client state to LOGIN instead of LOGIN_ATTEMPT
Not strictly necesssary, but LOGIN provides some extra sanity checks
before switch to LOGIN_ATTEMPT
* Got it working! Purely from client side, but horribly hacky solution!
* fixing linter issue. Hopefully it works, otherwise might need to make an extra commit
**** mana/verse!191
Reviewed-by: Fedja Beader <fedja@protonmail.ch>
Diffstat (limited to 'src')
-rw-r--r-- | src/enums/state.h | 1 | ||||
-rw-r--r-- | src/gui/windows/charselectdialog.cpp | 13 | ||||
-rw-r--r-- | src/net/ea/loginhandler.cpp | 2 | ||||
-rw-r--r-- | src/progs/manaverse/client.cpp | 28 |
4 files changed, 39 insertions, 5 deletions
diff --git a/src/enums/state.h b/src/enums/state.h index b24d40f8a..5471897c8 100644 --- a/src/enums/state.h +++ b/src/enums/state.h @@ -61,6 +61,7 @@ enumStart(State) CHANGEEMAIL_SUCCESS, SWITCH_SERVER, SWITCH_LOGIN, + SWITCH_WORLD, // Technically 'Switch World or Logout' SWITCH_CHARACTER, // 30 LOGOUT_ATTEMPT, WAIT, diff --git a/src/gui/windows/charselectdialog.cpp b/src/gui/windows/charselectdialog.cpp index 3ee5e5218..c7a2e0eef 100644 --- a/src/gui/windows/charselectdialog.cpp +++ b/src/gui/windows/charselectdialog.cpp @@ -47,6 +47,7 @@ #include "net/character.h" #include "net/charserverhandler.h" #include "net/logindata.h" +#include "net/loginhandler.h" #ifdef TMWA_SUPPORT #include "net/net.h" #endif // TMWA_SUPPORT @@ -71,9 +72,13 @@ CharSelectDialog::CharSelectDialog(LoginData &data) : ActionListener(), KeyListener(), mLoginData(&data), - // TRANSLATORS: char select dialog. button. - mSwitchLoginButton(new Button(this, _("Switch"), "switch", - BUTTON_SKIN, this)), + mSwitchLoginButton(new Button(this, + (loginHandler != nullptr && loginHandler->getWorlds().size() > 1) + // TRANSLATORS: char select dialog. button. + ? _("Switch World") : _("Logout"), + "switch", + BUTTON_SKIN, + this)), // TRANSLATORS: char select dialog. button. mChangePasswordButton(new Button(this, _("Password"), "change_password", BUTTON_SKIN, this)), @@ -620,7 +625,7 @@ bool CharSelectDialog::selectByName(const std::string &name, void CharSelectDialog::close() { - client->setState(State::SWITCH_LOGIN); + client->setState(State::SWITCH_WORLD); Window::close(); } diff --git a/src/net/ea/loginhandler.cpp b/src/net/ea/loginhandler.cpp index f6fb6cc9f..67df55f64 100644 --- a/src/net/ea/loginhandler.cpp +++ b/src/net/ea/loginhandler.cpp @@ -170,7 +170,7 @@ void LoginHandler::loginOrRegister(LoginData *const data) const serverConfig.setValue("remember", remember); // Clear the password, avoids auto login when returning to login - data->password.clear(); + //data->password.clear(); } void LoginHandler::logout() const diff --git a/src/progs/manaverse/client.cpp b/src/progs/manaverse/client.cpp index eb299dcbe..980ffdc91 100644 --- a/src/progs/manaverse/client.cpp +++ b/src/progs/manaverse/client.cpp @@ -1580,6 +1580,34 @@ int Client::gameExec() BLOCK_END("Client::gameExec State::SWITCH_SERVER") break; + case State::SWITCH_WORLD: + BLOCK_START("Client::gameExec State::SWITCH_WORLD") + logger->log1("State: SWITCH WORLD"); + + if (loginHandler != nullptr) + { + loginHandler->logout(); + loginHandler->disconnect(); + } + if (gameHandler != nullptr) + gameHandler->disconnect(); + if (loginHandler != nullptr) + loginHandler->connect(); + + if (loginHandler != nullptr && + loginHandler->getWorlds().size() > 1) + { + mState = State::LOGIN_ATTEMPT; + } + else + { + settings.login.clear(); + WindowManager::updateTitle(); + mState = State::LOGIN; + } + BLOCK_END("Client::gameExec State::SWITCH_WORLD") + break; + case State::SWITCH_LOGIN: BLOCK_START("Client::gameExec State::SWITCH_LOGIN") logger->log1("State: SWITCH LOGIN"); |