From 2977a6e00056647c1637db79ae51a151086203cf Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Mon, 5 Jun 2017 18:04:35 +0300
Subject: Add packet SMSG_LOGIN_DATA 0x0ac4.

---
 src/net/tmwa/loginrecv.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++++-
 src/net/tmwa/loginrecv.h   |  1 +
 src/net/tmwa/packetsin.inc |  2 +-
 3 files changed, 48 insertions(+), 2 deletions(-)

(limited to 'src/net/tmwa')

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-70-g09d2