From 2977a6e00056647c1637db79ae51a151086203cf Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 5 Jun 2017 18:04:35 +0300 Subject: Add packet SMSG_LOGIN_DATA 0x0ac4. --- src/net/ea/loginrecv.cpp | 43 ------------------------------ src/net/ea/loginrecv.h | 1 - src/net/eathena/loginrecv.cpp | 61 ++++++++++++++++++++++++++++++++++++++++++- src/net/eathena/loginrecv.h | 1 + src/net/eathena/packetsin.inc | 8 +++++- src/net/tmwa/loginrecv.cpp | 47 ++++++++++++++++++++++++++++++++- src/net/tmwa/loginrecv.h | 1 + src/net/tmwa/packetsin.inc | 2 +- 8 files changed, 116 insertions(+), 48 deletions(-) diff --git a/src/net/ea/loginrecv.cpp b/src/net/ea/loginrecv.cpp index 6c6e1bad1..10316a978 100644 --- a/src/net/ea/loginrecv.cpp +++ b/src/net/ea/loginrecv.cpp @@ -23,9 +23,6 @@ #include "net/ea/loginrecv.h" #include "client.h" -#include "configuration.h" - -#include "being/being.h" #include "fs/paths.h" @@ -67,46 +64,6 @@ void LoginRecv::processUpdateHost(Net::MessageIn &msg) mUpdateHost.c_str()); } -void LoginRecv::processLoginData(Net::MessageIn &msg) -{ - msg.readInt16("len"); - - loginHandler->clearWorlds(); - - const int worldCount = (msg.getLength() - 47) / 32; - - mToken.session_ID1 = msg.readInt32("session id1"); - mToken.account_ID = msg.readBeingId("accound id"); - mToken.session_ID2 = msg.readInt32("session id2"); - msg.readInt32("old ip"); - loginData.lastLogin = msg.readString(24, "last login"); - msg.readInt16("unused"); - - // reserve bits for future usage - mToken.sex = Being::intToGender(CAST_U8( - msg.readUInt8("gender") & 3U)); - - for (int i = 0; i < worldCount; i++) - { - WorldInfo *const world = new WorldInfo; - - world->address = msg.readInt32("ip address"); - world->port = msg.readInt16("port"); - world->name = msg.readString(20, "name"); - world->online_users = msg.readInt16("online number"); - config.setValue("updatehost", mUpdateHost); - world->updateHost = mUpdateHost; - msg.readInt16("maintenance"); - msg.readInt16("new"); - - logger->log("Network: Server: %s (%s:%d)", world->name.c_str(), - ipToString(world->address), world->port); - - mWorlds.push_back(world); - } - client->setState(State::WORLD_SELECT); -} - void LoginRecv::processLoginError(Net::MessageIn &msg) { const uint8_t code = msg.readUInt8("error"); diff --git a/src/net/ea/loginrecv.h b/src/net/ea/loginrecv.h index 239fb3bbd..80ac08e44 100644 --- a/src/net/ea/loginrecv.h +++ b/src/net/ea/loginrecv.h @@ -43,7 +43,6 @@ namespace Ea extern bool mRegistrationEnabled; void processUpdateHost(Net::MessageIn &msg); - void processLoginData(Net::MessageIn &msg); void processLoginError(Net::MessageIn &msg); } // namespace LoginRecv } // namespace Ea diff --git a/src/net/eathena/loginrecv.cpp b/src/net/eathena/loginrecv.cpp index 11b0086bf..92de540da 100644 --- a/src/net/eathena/loginrecv.cpp +++ b/src/net/eathena/loginrecv.cpp @@ -23,15 +23,20 @@ #include "net/eathena/loginrecv.h" #include "client.h" +#include "configuration.h" + +#include "being/being.h" #include "fs/paths.h" #include "gui/windows/logindialog.h" #include "net/logindata.h" - +#include "net/loginhandler.h" #include "net/messagein.h" +#include "net/ea/loginrecv.h" + #include "net/eathena/updateprotocol.h" #include "utils/gettext.h" @@ -213,4 +218,58 @@ void LoginRecv::processCharPasswordResponse(Net::MessageIn &msg) } } +void LoginRecv::processLoginData(Net::MessageIn &msg) +{ + msg.readInt16("len"); + + loginHandler->clearWorlds(); + + const int worldCount = (msg.getLength() - 47) / 32; + + Ea::LoginRecv::mToken.session_ID1 = msg.readInt32("session id1"); + Ea::LoginRecv::mToken.account_ID = msg.readBeingId("accound id"); + Ea::LoginRecv::mToken.session_ID2 = msg.readInt32("session id2"); + msg.readInt32("old ip"); + loginData.lastLogin = msg.readString(24, "last login"); + msg.readInt16("unused"); + + // reserve bits for future usage + Ea::LoginRecv::mToken.sex = Being::intToGender(CAST_U8( + msg.readUInt8("gender") & 3U)); + + if (msg.getVersion() >= 20170315) + { + msg.readInt32("unused1"); + msg.readInt32("unused1"); + msg.readInt32("unused1"); + msg.readInt32("unused1"); + msg.readUInt8("unused1"); + } + + for (int i = 0; i < worldCount; i++) + { + WorldInfo *const world = new WorldInfo; + + world->address = msg.readInt32("ip address"); + world->port = msg.readInt16("port"); + world->name = msg.readString(20, "name"); + world->online_users = msg.readInt16("online number"); + config.setValue("updatehost", Ea::LoginRecv::mUpdateHost); + world->updateHost = Ea::LoginRecv::mUpdateHost; + msg.readInt16("maintenance"); + msg.readInt16("new"); + if (msg.getVersion() >= 20170315) + { + for(int f = 0; f < 32; f ++) + msg.readUInt8("unused2"); + } + + logger->log("Network: Server: %s (%s:%d)", world->name.c_str(), + ipToString(world->address), world->port); + + Ea::LoginRecv::mWorlds.push_back(world); + } + client->setState(State::WORLD_SELECT); +} + } // namespace EAthena diff --git a/src/net/eathena/loginrecv.h b/src/net/eathena/loginrecv.h index 64a9df7cd..2e070d584 100644 --- a/src/net/eathena/loginrecv.h +++ b/src/net/eathena/loginrecv.h @@ -37,6 +37,7 @@ namespace EAthena void processServerVersion(Net::MessageIn &msg); void processCondingKey(Net::MessageIn &msg); void processCharPasswordResponse(Net::MessageIn &msg); + void processLoginData(Net::MessageIn &msg); } // namespace LoginRecv } // namespace EAthena diff --git a/src/net/eathena/packetsin.inc b/src/net/eathena/packetsin.inc index 57c6add4a..6360b0e24 100644 --- a/src/net/eathena/packetsin.inc +++ b/src/net/eathena/packetsin.inc @@ -67,7 +67,7 @@ packet(SMSG_RANKS_LIST, 0x0000, 0, nullptr, packet(SMSG_CHAR_CHARACTERS, 0x0000, 0, nullptr, 0); // login server, unknown version -packet(SMSG_LOGIN_DATA, 0x0069, -1, &Ea::LoginRecv::processLoginData, 0); +packet(SMSG_LOGIN_DATA, 0x0069, -1, &LoginRecv::processLoginData, 0); packet(SMSG_LOGIN_CODING_KEY, 0x01dc, -1, &LoginRecv::processCondingKey, 0); packet(SMSG_LOGIN_ERROR, 0x006a, 23, &Ea::LoginRecv::processLoginError, 0); @@ -887,6 +887,12 @@ if (packetVersion >= 20160330) packet(SMSG_MAP_LOGIN_SUCCESS, 0x02eb, 13, &GameRecv::processMapLogin, 20080102); } +// 20170315 +if (packetVersion >= 20170315) +{ + packet(SMSG_LOGIN_DATA, 0x0ac4, -1, &LoginRecv::processLoginData, 20170315); +} + // 20170329 if (packetVersion >= 20170329) { diff --git a/src/net/tmwa/loginrecv.cpp b/src/net/tmwa/loginrecv.cpp index 401b18f97..050bd68c1 100644 --- a/src/net/tmwa/loginrecv.cpp +++ b/src/net/tmwa/loginrecv.cpp @@ -23,12 +23,17 @@ #include "net/tmwa/loginrecv.h" #include "client.h" +#include "configuration.h" #include "logger.h" -#include "net/ea/loginrecv.h" +#include "being/being.h" +#include "net/logindata.h" +#include "net/loginhandler.h" #include "net/messagein.h" +#include "net/ea/loginrecv.h" + #include "net/tmwa/updateprotocol.h" #include "utils/gettext.h" @@ -124,4 +129,44 @@ void LoginRecv::processCharPasswordResponse(Net::MessageIn &msg) } } +void LoginRecv::processLoginData(Net::MessageIn &msg) +{ + msg.readInt16("len"); + + loginHandler->clearWorlds(); + + const int worldCount = (msg.getLength() - 47) / 32; + + Ea::LoginRecv::mToken.session_ID1 = msg.readInt32("session id1"); + Ea::LoginRecv::mToken.account_ID = msg.readBeingId("accound id"); + Ea::LoginRecv::mToken.session_ID2 = msg.readInt32("session id2"); + msg.readInt32("old ip"); + loginData.lastLogin = msg.readString(24, "last login"); + msg.readInt16("unused"); + + // reserve bits for future usage + Ea::LoginRecv::mToken.sex = Being::intToGender(CAST_U8( + msg.readUInt8("gender") & 3U)); + + for (int i = 0; i < worldCount; i++) + { + WorldInfo *const world = new WorldInfo; + + world->address = msg.readInt32("ip address"); + world->port = msg.readInt16("port"); + world->name = msg.readString(20, "name"); + world->online_users = msg.readInt16("online number"); + config.setValue("updatehost", Ea::LoginRecv::mUpdateHost); + world->updateHost = Ea::LoginRecv::mUpdateHost; + msg.readInt16("maintenance"); + msg.readInt16("new"); + + logger->log("Network: Server: %s (%s:%d)", world->name.c_str(), + ipToString(world->address), world->port); + + Ea::LoginRecv::mWorlds.push_back(world); + } + client->setState(State::WORLD_SELECT); +} + } // namespace TmwAthena diff --git a/src/net/tmwa/loginrecv.h b/src/net/tmwa/loginrecv.h index aa79eb942..d9bae56dc 100644 --- a/src/net/tmwa/loginrecv.h +++ b/src/net/tmwa/loginrecv.h @@ -34,6 +34,7 @@ namespace TmwAthena { void processServerVersion(Net::MessageIn &msg); void processCharPasswordResponse(Net::MessageIn &msg); + void processLoginData(Net::MessageIn &msg); } // namespace LoginRecv } // namespace TmwAthena diff --git a/src/net/tmwa/packetsin.inc b/src/net/tmwa/packetsin.inc index 150028a41..633c2b1ad 100644 --- a/src/net/tmwa/packetsin.inc +++ b/src/net/tmwa/packetsin.inc @@ -55,7 +55,7 @@ packet(SMSG_ITEM_DROPPED, 0x009e, 17, &ItemRecv::processItemDr packet(SMSG_ITEM_REMOVE, 0x00a1, 6, &Ea::ItemRecv::processItemRemove, 0); packet(SMSG_ITEM_USE_RESPONSE, 0x00a8, 7, &Ea::InventoryRecv::processItemUseResponse, 0); packet(SMSG_ITEM_VISIBLE, 0x009d, 17, &ItemRecv::processItemVisible, 0); -packet(SMSG_LOGIN_DATA, 0x0069, -1, &Ea::LoginRecv::processLoginData, 0); +packet(SMSG_LOGIN_DATA, 0x0069, -1, &LoginRecv::processLoginData, 0); packet(SMSG_LOGIN_ERROR, 0x006a, 23, &Ea::LoginRecv::processLoginError, 0); packet(SMSG_MAP_LOGIN_SUCCESS, 0x0073, 11, &GameRecv::processMapLogin, 0); packet(SMSG_MAP_MUSIC, 0x0227, -1, &Ea::PlayerRecv::processMapMusic, 0); -- cgit v1.2.3-60-g2f50