summaryrefslogtreecommitdiff
path: root/src/net
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <bjorn@lindeijer.nl>2009-10-06 23:40:55 +0200
committerThorbjørn Lindeijer <bjorn@lindeijer.nl>2009-10-06 23:43:40 +0200
commit64a37da4cb8d74a29f369e96e8c3669275516394 (patch)
treecaa0eb0d05ab5674b6b6ac822d151aa2585721e8 /src/net
parent610dc30ceecdfe538f71826689630e0f28c278cc (diff)
downloadmana-client-64a37da4cb8d74a29f369e96e8c3669275516394.tar.gz
mana-client-64a37da4cb8d74a29f369e96e8c3669275516394.tar.bz2
mana-client-64a37da4cb8d74a29f369e96e8c3669275516394.tar.xz
mana-client-64a37da4cb8d74a29f369e96e8c3669275516394.zip
Some cleanup regarding keeping track of gender for eAthena
LoginHandler now owns the world list and the token, instead of having them as global variables with pointers to the 'sex' member of the token from the GUI.
Diffstat (limited to 'src/net')
-rw-r--r--src/net/ea/charserverhandler.cpp26
-rw-r--r--src/net/ea/gamehandler.cpp16
-rw-r--r--src/net/ea/gamehandler.h1
-rw-r--r--src/net/ea/generalhandler.cpp8
-rw-r--r--src/net/ea/loginhandler.cpp35
-rw-r--r--src/net/ea/loginhandler.h9
-rw-r--r--src/net/ea/network.h2
-rw-r--r--src/net/ea/token.h5
-rw-r--r--src/net/logindata.h4
-rw-r--r--src/net/loginhandler.h21
-rw-r--r--src/net/tmwserv/loginhandler.cpp2
-rw-r--r--src/net/tmwserv/loginhandler.h2
-rw-r--r--src/net/worldinfo.h4
13 files changed, 84 insertions, 51 deletions
diff --git a/src/net/ea/charserverhandler.cpp b/src/net/ea/charserverhandler.cpp
index e538eeaf..13c3cf45 100644
--- a/src/net/ea/charserverhandler.cpp
+++ b/src/net/ea/charserverhandler.cpp
@@ -21,13 +21,14 @@
#include "net/ea/charserverhandler.h"
-#include "net/ea/generalhandler.h"
+#include "net/ea/loginhandler.h"
#include "net/ea/network.h"
#include "net/ea/protocol.h"
#include "net/logindata.h"
#include "net/messagein.h"
#include "net/messageout.h"
+#include "net/net.h"
#include "game.h"
#include "log.h"
@@ -44,7 +45,7 @@
Net::CharHandler *charHandler;
namespace EAthena {
-extern Token netToken;
+
extern ServerInfo charServer;
extern ServerInfo mapServer;
@@ -177,8 +178,11 @@ void CharServerHandler::handleMessage(MessageIn &msg)
LocalPlayer *CharServerHandler::readPlayerData(MessageIn &msg, int &slot)
{
+ const Token &token =
+ static_cast<LoginHandler*>(Net::getLoginHandler())->getToken();
+
LocalPlayer *tempPlayer = new LocalPlayer(msg.readInt32(), 0, NULL);
- tempPlayer->setGender(netToken.sex);
+ tempPlayer->setGender(token.sex);
tempPlayer->setExp(msg.readInt32());
tempPlayer->setMoney(msg.readInt32());
@@ -241,8 +245,11 @@ void CharServerHandler::setCharCreateDialog(CharCreateDialog *window)
attributes.push_back(_("Dexterity:"));
attributes.push_back(_("Luck:"));
+ const Token &token =
+ static_cast<LoginHandler*>(Net::getLoginHandler())->getToken();
+
mCharCreateDialog->setAttributes(attributes, 30, 1, 9);
- mCharCreateDialog->setFixedGender(true, netToken.sex);
+ mCharCreateDialog->setFixedGender(true, token.sex);
}
void CharServerHandler::getCharacters()
@@ -279,16 +286,19 @@ void CharServerHandler::deleteCharacter(int slot, LocalPlayer* character)
void CharServerHandler::connect()
{
+ const Token &token =
+ static_cast<LoginHandler*>(Net::getLoginHandler())->getToken();
+
mNetwork->disconnect();
mNetwork->connect(charServer);
MessageOut outMsg(CMSG_CHAR_SERVER_CONNECT);
- outMsg.writeInt32(netToken.account_ID);
- outMsg.writeInt32(netToken.session_ID1);
- outMsg.writeInt32(netToken.session_ID2);
+ outMsg.writeInt32(token.account_ID);
+ outMsg.writeInt32(token.session_ID1);
+ outMsg.writeInt32(token.session_ID2);
// [Fate] The next word is unused by the old char server, so we squeeze in
// tmw client version information
outMsg.writeInt16(CLIENT_PROTOCOL_VERSION);
- outMsg.writeInt8((netToken.sex == GENDER_MALE) ? 1 : 0);
+ outMsg.writeInt8((token.sex == GENDER_MALE) ? 1 : 0);
// We get 4 useless bytes before the real answer comes in (what are these?)
mNetwork->skip(4);
diff --git a/src/net/ea/gamehandler.cpp b/src/net/ea/gamehandler.cpp
index f84688a3..a3c0ad3a 100644
--- a/src/net/ea/gamehandler.cpp
+++ b/src/net/ea/gamehandler.cpp
@@ -21,6 +21,7 @@
#include "net/ea/gamehandler.h"
+#include "net/ea/loginhandler.h"
#include "net/ea/network.h"
#include "net/ea/protocol.h"
@@ -41,7 +42,7 @@ Net::GameHandler *gameHandler;
extern Game *game;
namespace EAthena {
-extern Token netToken;
+
extern ServerInfo mapServer;
GameHandler::GameHandler()
@@ -91,16 +92,19 @@ void GameHandler::connect()
{
mNetwork->connect(mapServer);
+ const Token &token =
+ static_cast<LoginHandler*>(Net::getLoginHandler())->getToken();
+
// Send login infos
MessageOut outMsg(CMSG_MAP_SERVER_CONNECT);
- outMsg.writeInt32(netToken.account_ID);
+ outMsg.writeInt32(token.account_ID);
outMsg.writeInt32(player_node->getId());
- outMsg.writeInt32(netToken.session_ID1);
- outMsg.writeInt32(netToken.session_ID2);
- outMsg.writeInt8((netToken.sex == GENDER_MALE) ? 1 : 0);
+ outMsg.writeInt32(token.session_ID1);
+ outMsg.writeInt32(token.session_ID2);
+ outMsg.writeInt8((token.sex == GENDER_MALE) ? 1 : 0);
// Change the player's ID to the account ID to match what eAthena uses
- player_node->setId(netToken.account_ID);
+ player_node->setId(token.account_ID);
// We get 4 useless bytes before the real answer comes in (what are these?)
mNetwork->skip(4);
diff --git a/src/net/ea/gamehandler.h b/src/net/ea/gamehandler.h
index 6cb640c1..d8adeeaf 100644
--- a/src/net/ea/gamehandler.h
+++ b/src/net/ea/gamehandler.h
@@ -55,7 +55,6 @@ class GameHandler : public MessageHandler, public Net::GameHandler
void ping(int tick);
void clear();
-
};
} // namespace EAthena
diff --git a/src/net/ea/generalhandler.cpp b/src/net/ea/generalhandler.cpp
index c3eab725..78a10423 100644
--- a/src/net/ea/generalhandler.cpp
+++ b/src/net/ea/generalhandler.cpp
@@ -29,7 +29,6 @@
#include "net/ea/network.h"
#include "net/ea/protocol.h"
-#include "net/ea/token.h"
#include "net/ea/adminhandler.h"
#include "net/ea/beinghandler.h"
@@ -67,10 +66,8 @@ Net::GeneralHandler *generalHandler = NULL;
namespace EAthena {
-Token netToken;
ServerInfo charServer;
ServerInfo mapServer;
-Worlds worlds;
GeneralHandler::GeneralHandler():
mAdminHandler(new AdminHandler),
@@ -106,8 +103,6 @@ GeneralHandler::GeneralHandler():
stats.push_back(ItemDB::Stat("luck", N_("Luck %+d")));
ItemDB::setStatsList(stats);
-
- RegisterDialog::setGender(&netToken.sex);
}
GeneralHandler::~GeneralHandler()
@@ -179,7 +174,8 @@ void GeneralHandler::reload()
{
if (mNetwork)
mNetwork->disconnect();
- worlds.clear();
+
+ static_cast<LoginHandler*>(mLoginHandler.get())->clearWorlds();
}
void GeneralHandler::unload()
diff --git a/src/net/ea/loginhandler.cpp b/src/net/ea/loginhandler.cpp
index be547afa..5a77cce7 100644
--- a/src/net/ea/loginhandler.cpp
+++ b/src/net/ea/loginhandler.cpp
@@ -38,9 +38,8 @@
Net::LoginHandler *loginHandler;
namespace EAthena {
-extern Token netToken;
+
extern ServerInfo charServer;
-extern Worlds worlds;
LoginHandler::LoginHandler()
{
@@ -107,16 +106,16 @@ void LoginHandler::handleMessage(MessageIn &msg)
// Skip the length word
msg.skip(2);
- delete_all(worlds);
+ clearWorlds();
+
worldCount = (msg.getLength() - 47) / 32;
- netToken.session_ID1 = msg.readInt32();
- netToken.account_ID = msg.readInt32();
- netToken.session_ID2 = msg.readInt32();
+ mToken.session_ID1 = msg.readInt32();
+ mToken.account_ID = msg.readInt32();
+ mToken.session_ID2 = msg.readInt32();
msg.skip(30); // unknown
- netToken.sex = msg.readInt8() ? GENDER_MALE : GENDER_FEMALE;
+ mToken.sex = msg.readInt8() ? GENDER_MALE : GENDER_FEMALE;
- worlds.clear();
for (int i = 0; i < worldCount; i++)
{
WorldInfo *world = new WorldInfo;
@@ -133,7 +132,7 @@ void LoginHandler::handleMessage(MessageIn &msg)
ipToString(world->address),
world->port);
- worlds.push_back(world);
+ mWorlds.push_back(world);
}
state = STATE_WORLD_SELECT;
break;
@@ -236,12 +235,12 @@ void LoginHandler::changePassword(const std::string &username,
void LoginHandler::chooseServer(unsigned int server)
{
- if (server >= worlds.size())
+ if (server >= mWorlds.size())
return;
charServer.clear();
- charServer.hostname = ipToString(worlds[server]->address);
- charServer.port = worlds[server]->port;
+ charServer.hostname = ipToString(mWorlds[server]->address);
+ charServer.port = mWorlds[server]->port;
state = STATE_UPDATE;
}
@@ -249,7 +248,7 @@ void LoginHandler::chooseServer(unsigned int server)
void LoginHandler::registerAccount(LoginData *loginData)
{
std::string username = loginData->username;
- username.append((netToken.sex == GENDER_FEMALE) ? "_F" : "_M");
+ username.append((loginData->gender == GENDER_FEMALE) ? "_F" : "_M");
sendLoginRegister(username, loginData->password);
}
@@ -277,9 +276,15 @@ void LoginHandler::sendLoginRegister(const std::string &username,
outMsg.writeInt8(0x03);
}
-Worlds LoginHandler::getWorlds()
+Worlds LoginHandler::getWorlds() const
+{
+ return mWorlds;
+}
+
+void LoginHandler::clearWorlds()
{
- return worlds;
+ delete_all(mWorlds);
+ mWorlds.clear();
}
} // namespace EAthena
diff --git a/src/net/ea/loginhandler.h b/src/net/ea/loginhandler.h
index c5ce975e..0d0ef1eb 100644
--- a/src/net/ea/loginhandler.h
+++ b/src/net/ea/loginhandler.h
@@ -47,7 +47,7 @@ class LoginHandler : public MessageHandler, public Net::LoginHandler
void disconnect();
int supportedOptionalActions() const
- { return 0; }
+ { return SetGenderOnRegister; }
void loginAccount(LoginData *loginData);
@@ -66,13 +66,18 @@ class LoginHandler : public MessageHandler, public Net::LoginHandler
void unregisterAccount(const std::string &username,
const std::string &password);
- Worlds getWorlds();
+ Worlds getWorlds() const;
+ void clearWorlds();
+
+ const Token &getToken() const { return mToken; }
private:
void sendLoginRegister(const std::string &username,
const std::string &password);
std::string mUpdateHost;
+ Worlds mWorlds;
+ Token mToken;
};
} // namespace EAthena
diff --git a/src/net/ea/network.h b/src/net/ea/network.h
index b61f363b..3b8d09f9 100644
--- a/src/net/ea/network.h
+++ b/src/net/ea/network.h
@@ -53,7 +53,7 @@ class Network
void disconnect();
- ServerInfo getServer()
+ ServerInfo getServer() const
{ return mServer; }
void registerHandler(MessageHandler *handler);
diff --git a/src/net/ea/token.h b/src/net/ea/token.h
index 6c47c10e..e5e4ab0d 100644
--- a/src/net/ea/token.h
+++ b/src/net/ea/token.h
@@ -24,7 +24,8 @@
#ifndef NET_EA_TOKEN_H
#define NET_EA_TOKEN_H
-typedef struct {
+struct Token
+{
int account_ID;
int session_ID1;
int session_ID2;
@@ -37,6 +38,6 @@ typedef struct {
session_ID2 = 0;
sex = GENDER_UNSPECIFIED;
}
-} Token;
+};
#endif // NET_EA_TOKEN_H
diff --git a/src/net/logindata.h b/src/net/logindata.h
index 9cc3a3eb..4f592f7d 100644
--- a/src/net/logindata.h
+++ b/src/net/logindata.h
@@ -36,6 +36,8 @@ struct LoginData
std::string email;
+ Gender gender;
+
bool remember; /**< Whether to store the username. */
bool registerLogin; /**< Whether an account is being registered. */
@@ -45,6 +47,8 @@ struct LoginData
password.clear();
newPassword.clear();
updateHost.clear();
+ email.clear();
+ gender = GENDER_UNSPECIFIED;
}
};
diff --git a/src/net/loginhandler.h b/src/net/loginhandler.h
index e5a34382..12a0c26f 100644
--- a/src/net/loginhandler.h
+++ b/src/net/loginhandler.h
@@ -35,16 +35,22 @@ namespace Net {
class LoginHandler
{
public:
+ /**
+ * This enum describes options specific to either eAthena or tmwserv.
+ * By querying for these flags, the GUI can adapt to the current
+ * server type dynamically.
+ */
enum OptionalAction {
- Unregister = 0x1,
- ChangeEmail = 0x2,
- SetEmailOnRegister = 0x4
+ Unregister = 0x1,
+ ChangeEmail = 0x2,
+ SetEmailOnRegister = 0x4,
+ SetGenderOnRegister = 0x8
};
- virtual void setServer(const ServerInfo &server)
+ void setServer(const ServerInfo &server)
{ mServer = server; }
- virtual ServerInfo getServer()
+ ServerInfo getServer() const
{ return mServer; }
virtual void connect() = 0;
@@ -53,6 +59,9 @@ class LoginHandler
virtual void disconnect() = 0;
+ /**
+ * @see OptionalAction
+ */
virtual int supportedOptionalActions() const = 0;
virtual void loginAccount(LoginData *loginData) = 0;
@@ -72,7 +81,7 @@ class LoginHandler
virtual void unregisterAccount(const std::string &username,
const std::string &password) = 0;
- virtual Worlds getWorlds() = 0;
+ virtual Worlds getWorlds() const = 0;
protected:
ServerInfo mServer;
diff --git a/src/net/tmwserv/loginhandler.cpp b/src/net/tmwserv/loginhandler.cpp
index 7c4b1340..9c102031 100644
--- a/src/net/tmwserv/loginhandler.cpp
+++ b/src/net/tmwserv/loginhandler.cpp
@@ -351,7 +351,7 @@ void LoginHandler::unregisterAccount(const std::string &username,
Net::AccountServer::Account::unregister(username, password);
}
-Worlds LoginHandler::getWorlds()
+Worlds LoginHandler::getWorlds() const
{
return Worlds();
}
diff --git a/src/net/tmwserv/loginhandler.h b/src/net/tmwserv/loginhandler.h
index cbc2b96c..e9887e1a 100644
--- a/src/net/tmwserv/loginhandler.h
+++ b/src/net/tmwserv/loginhandler.h
@@ -64,7 +64,7 @@ class LoginHandler : public MessageHandler, public Net::LoginHandler
void unregisterAccount(const std::string &username,
const std::string &password);
- Worlds getWorlds();
+ Worlds getWorlds() const;
private:
void handleLoginResponse(MessageIn &msg);
diff --git a/src/net/worldinfo.h b/src/net/worldinfo.h
index 045c64c2..72ecddd6 100644
--- a/src/net/worldinfo.h
+++ b/src/net/worldinfo.h
@@ -25,13 +25,13 @@
#include <string>
#include <vector>
-typedef struct {
+struct WorldInfo {
int address;
std::string name;
short port;
short online_users;
std::string updateHost;
-} WorldInfo;
+};
typedef std::vector<WorldInfo*> Worlds;