summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game.cpp3
-rw-r--r--src/gui/register.cpp21
-rw-r--r--src/gui/register.h16
-rw-r--r--src/main.cpp12
-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
17 files changed, 102 insertions, 85 deletions
diff --git a/src/game.cpp b/src/game.cpp
index 60b13a06..aea478b5 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -161,8 +161,9 @@ const int MILLISECONDS_IN_A_TICK = 10;
* Listener used for exiting handling.
*/
namespace {
- struct ExitListener : public gcn::ActionListener
+ class ExitListener : public gcn::ActionListener
{
+ public:
void action(const gcn::ActionEvent &event)
{
if (event.getId() == "yes" || event.getId() == "ok")
diff --git a/src/gui/register.cpp b/src/gui/register.cpp
index 78c79eeb..5d9469ca 100644
--- a/src/gui/register.cpp
+++ b/src/gui/register.cpp
@@ -54,11 +54,11 @@ void WrongDataNoticeListener::action(const gcn::ActionEvent &event)
mTarget->requestFocus();
}
-Gender *RegisterDialog::useGender = NULL;
-
RegisterDialog::RegisterDialog(LoginData *loginData):
Window(_("Register")),
mEmailField(0),
+ mMaleButton(0),
+ mFemaleButton(0),
mWrongDataNoticeListener(new WrongDataNoticeListener),
mLoginData(loginData)
{
@@ -70,8 +70,6 @@ RegisterDialog::RegisterDialog(LoginData *loginData):
mUserField = new TextField(loginData->username);
mPasswordField = new PasswordField(loginData->password);
mConfirmField = new PasswordField;
- mMaleButton = new RadioButton(_("Male"), "sex", true);
- mFemaleButton = new RadioButton(_("Female"), "sex", false);
mRegisterButton = new Button(_("Register"), "register", this);
mCancelButton = new Button(_("Cancel"), "cancel", this);
@@ -81,8 +79,10 @@ RegisterDialog::RegisterDialog(LoginData *loginData):
place(0, 1, passwordLabel);
place(0, 2, confirmLabel);
- if (useGender)
+ if (optionalActions & Net::LoginHandler::SetGenderOnRegister)
{
+ mMaleButton = new RadioButton(_("Male"), "sex", true);
+ mFemaleButton = new RadioButton(_("Female"), "sex", false);
place(1, 3, mMaleButton);
place(2, 3, mFemaleButton);
}
@@ -213,9 +213,9 @@ void RegisterDialog::action(const gcn::ActionEvent &event)
mLoginData->username = mUserField->getText();
mLoginData->password = mPasswordField->getText();
- if (useGender)
- *useGender = mFemaleButton->isSelected() ? GENDER_FEMALE :
- GENDER_MALE;
+ if (mFemaleButton)
+ mLoginData->gender = mFemaleButton->isSelected() ?
+ GENDER_FEMALE : GENDER_MALE;
if (mEmailField)
mLoginData->email = mEmailField->getText();
mLoginData->registerLogin = true;
@@ -230,11 +230,6 @@ void RegisterDialog::keyPressed(gcn::KeyEvent &keyEvent)
mRegisterButton->setEnabled(canSubmit());
}
-void RegisterDialog::setGender(Gender *gender)
-{
- useGender = gender;
-}
-
bool RegisterDialog::canSubmit() const
{
return !mUserField->getText().empty() &&
diff --git a/src/gui/register.h b/src/gui/register.h
index 9f22a5bb..418d6dcd 100644
--- a/src/gui/register.h
+++ b/src/gui/register.h
@@ -80,20 +80,6 @@ class RegisterDialog : public Window, public gcn::ActionListener,
*/
void keyPressed(gcn::KeyEvent &keyEvent);
- /**
- * Tell the dialog to show an email field. Value stored in the passed
- * string pointer. Default email from pointer. Passing NULL disables
- * the feature.
- */
- static void setEmail(std::string *email);
-
- /**
- * Tell the dialog to show a gender selection. Value stored in the
- * passed Gender pointer. Default Gender from pointer. Passing NULL
- * disables the feature.
- */
- static void setGender(Gender *gender);
-
private:
/**
* Returns whether submit can be enabled. This is true in the register
@@ -114,8 +100,6 @@ class RegisterDialog : public Window, public gcn::ActionListener,
WrongDataNoticeListener *mWrongDataNoticeListener;
LoginData *mLoginData;
-
- static Gender *useGender;
};
#endif
diff --git a/src/main.cpp b/src/main.cpp
index 82e8ff50..c1715fd1 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -123,8 +123,9 @@
namespace
{
- struct SetupListener : public gcn::ActionListener
+ class SetupListener : public gcn::ActionListener
{
+ public:
/**
* Called when receiving actions from widget.
*/
@@ -661,24 +662,27 @@ static void loadUpdates()
}
}
-struct ErrorListener : public gcn::ActionListener
+class ErrorListener : public gcn::ActionListener
{
+public:
void action(const gcn::ActionEvent &event)
{
state = STATE_CHOOSE_SERVER;
}
} errorListener;
-struct AccountListener : public gcn::ActionListener
+class AccountListener : public gcn::ActionListener
{
+public:
void action(const gcn::ActionEvent &event)
{
state = STATE_CHAR_SELECT;
}
} accountListener;
-struct LoginListener : public gcn::ActionListener
+class LoginListener : public gcn::ActionListener
{
+public:
void action(const gcn::ActionEvent &event)
{
state = STATE_LOGIN;
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;