diff options
Diffstat (limited to 'src/net/tmwa/loginrecv.cpp')
-rw-r--r-- | src/net/tmwa/loginrecv.cpp | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/src/net/tmwa/loginrecv.cpp b/src/net/tmwa/loginrecv.cpp new file mode 100644 index 000000000..fb1a0eee7 --- /dev/null +++ b/src/net/tmwa/loginrecv.cpp @@ -0,0 +1,130 @@ +/* + * The ManaPlus Client + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "net/tmwa/loginrecv.h" + +#include "client.h" +#include "logger.h" + +#include "net/serverfeatures.h" + +#include "net/ea/loginrecv.h" + +#include "net/tmwa/messageout.h" +#include "net/tmwa/network.h" +#include "net/tmwa/protocol.h" + +#include "utils/gettext.h" + +#include "debug.h" + +namespace TmwAthena +{ + +extern ServerInfo charServer; + +enum ServerFlags +{ + FLAG_REGISTRATION = 1 +}; + +void LoginRecv::processServerVersion(Net::MessageIn &msg) +{ + const uint8_t b1 = msg.readUInt8("b1"); // -1 + const uint8_t b2 = msg.readUInt8("b2"); + const uint8_t b3 = msg.readUInt8("b3"); + msg.readUInt8("b4"); + if (b1 == 255) + { // old TMWA + const unsigned int options = msg.readInt32("options"); + Ea::LoginRecv::mRegistrationEnabled = options & FLAG_REGISTRATION; + serverVersion = 0; + tmwServerVersion = 0; + } + else if (b1 >= 0x0d) + { // new TMWA + const unsigned int options = msg.readInt32("options"); + Ea::LoginRecv::mRegistrationEnabled = options & FLAG_REGISTRATION; + serverVersion = 0; + tmwServerVersion = (b1 << 16) | (b2 << 8) | b3; + } + else + { // eAthena + const unsigned int options = msg.readInt32("options"); + Ea::LoginRecv::mRegistrationEnabled = options & FLAG_REGISTRATION; + serverVersion = 0; + tmwServerVersion = 0; + } + if (serverVersion > 0) + logger->log("Evol server version: %d", serverVersion); + else if (tmwServerVersion > 0) + logger->log("Tmw server version: x%06x", tmwServerVersion); + else + logger->log("Server without version"); + + if (serverVersion < 5) + { + if (client->getState() != STATE_LOGIN) + client->setState(STATE_LOGIN); + } + + // Leave this last + Ea::LoginRecv::mVersionResponse = true; +} + +void LoginRecv::processCharPasswordResponse(Net::MessageIn &msg) +{ + // 0: acc not found, 1: success, 2: password mismatch, 3: pass too short + const uint8_t errMsg = msg.readUInt8("result code"); + // Successful pass change + if (errMsg == 1) + { + client->setState(STATE_CHANGEPASSWORD_SUCCESS); + } + // pass change failed + else + { + switch (errMsg) + { + case 0: + errorMessage = + // TRANSLATORS: error message + _("Account was not found. Please re-login."); + break; + case 2: + // TRANSLATORS: error message + errorMessage = _("Old password incorrect."); + break; + case 3: + // TRANSLATORS: error message + errorMessage = _("New password too short."); + break; + default: + // TRANSLATORS: error message + errorMessage = _("Unknown error."); + break; + } + client->setState(STATE_ACCOUNTCHANGE_ERROR); + } +} + +} // namespace TmwAthena |