summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--src/gui/login.cpp1
-rw-r--r--src/gui/register.cpp5
-rw-r--r--src/logindata.h4
-rw-r--r--src/main.cpp30
-rw-r--r--src/net/charserverhandler.cpp5
-rw-r--r--src/net/loginhandler.cpp5
7 files changed, 36 insertions, 21 deletions
diff --git a/ChangeLog b/ChangeLog
index 6c94ccad..7c423b31 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,13 @@
logic, in order to prevent an incoming character delete message from
deleting the player character that was about to be drawn.
* src/gui/char_select.cpp: Removed useless lock/unlock calls.
+ * src/logindata.h, src/main.cpp, src/gui/login.cpp: Go back to login
+ or register state on error, depending on what the user was doing.
+ * src/gui/register.cpp: Actually use the server that is filled in.
+ * src/net/loginhandler.cpp: Fixed error message.
+ * src/net/charserverhandler.cpp: Fixed crash since now logic is called
+ after non-selected characters are deleted, by properly setting deleted
+ instances to 0 and going back to initial selection.
2007-03-23 Bjørn Lindeijer <bjorn@lindeijer.nl>
diff --git a/src/gui/login.cpp b/src/gui/login.cpp
index 00b99e72..4e4c5b34 100644
--- a/src/gui/login.cpp
+++ b/src/gui/login.cpp
@@ -125,6 +125,7 @@ LoginDialog::action(const gcn::ActionEvent &event)
mLoginData->username = mUserField->getText();
mLoginData->password = mPassField->getText();
mLoginData->remember = mKeepCheck->isMarked();
+ mLoginData->registerLogin = false;
mOkButton->setEnabled(false);
mRegisterButton->setEnabled(false);
diff --git a/src/gui/register.cpp b/src/gui/register.cpp
index 4a8a32d9..ad3a6388 100644
--- a/src/gui/register.cpp
+++ b/src/gui/register.cpp
@@ -224,9 +224,8 @@ RegisterDialog::action(const gcn::ActionEvent &event)
// No errors detected, register the new user.
mRegisterButton->setEnabled(false);
- mLoginData->hostname = config.getValue(
- "host", "server.themanaworld.org");
- mLoginData->port = (short)config.getValue("port", 0);
+ mLoginData->hostname = mServerField->getText();
+ mLoginData->port = (short) config.getValue("port", 0);
mLoginData->username = mUserField->getText();
mLoginData->password = mPasswordField->getText();
mLoginData->username += mFemaleButton->isMarked() ? "_F" : "_M";
diff --git a/src/logindata.h b/src/logindata.h
index 82623ba5..1ee9927d 100644
--- a/src/logindata.h
+++ b/src/logindata.h
@@ -36,8 +36,8 @@ struct LoginData
int session_ID2;
char sex;
- bool remember;
- bool registerLogin;
+ bool remember; /**< Whether to store the username and host. */
+ bool registerLogin; /**< Whether an account is being registered. */
};
#endif
diff --git a/src/main.cpp b/src/main.cpp
index 78b967e2..79275e15 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -104,16 +104,6 @@ Music *bgm;
Configuration config; /**< XML file configuration reader */
Logger *logger; /**< Log object */
-namespace {
- struct ErrorListener : public gcn::ActionListener
- {
- void action(const gcn::ActionEvent &event)
- {
- state = LOGIN_STATE;
- }
- } errorListener;
-}
-
/**
* A structure holding the values of various options that can be passed from
* the command line.
@@ -446,6 +436,16 @@ LoginHandler loginHandler;
LockedArray<LocalPlayer*> charInfo(MAX_SLOT + 1);
MapLoginHandler mapLoginHandler;
+namespace {
+ struct ErrorListener : public gcn::ActionListener
+ {
+ void action(const gcn::ActionEvent &event)
+ {
+ state = loginData.registerLogin ? REGISTER_STATE : LOGIN_STATE;
+ }
+ } errorListener;
+}
+
// TODO Find some nice place for these functions
void accountLogin(Network *network, LoginData *loginData)
{
@@ -469,13 +469,14 @@ void accountLogin(Network *network, LoginData *loginData)
// Remove _M or _F from username after a login for registration purpose
if (loginData->registerLogin)
{
- loginData->registerLogin = false;
- loginData->username = loginData->username.substr(0,
- loginData->username.length() - 2);
+ loginData->username =
+ loginData->username.substr(0, loginData->username.length() - 2);
}
+
// TODO This is not the best place to save the config, but at least better
// than the login gui window
- if (loginData->remember) {
+ if (loginData->remember)
+ {
config.setValue("host", loginData->hostname);
config.setValue("username", loginData->username);
}
@@ -713,6 +714,7 @@ int main(int argc, char *argv[])
logger->log("State: LOGIN");
if (!loginData.password.empty()) {
+ loginData.registerLogin = false;
state = ACCOUNT_STATE;
} else {
currentDialog = new LoginDialog(&loginData);
diff --git a/src/net/charserverhandler.cpp b/src/net/charserverhandler.cpp
index 01a8756b..a54a17de 100644
--- a/src/net/charserverhandler.cpp
+++ b/src/net/charserverhandler.cpp
@@ -134,6 +134,7 @@ void CharServerHandler::handleMessage(MessageIn *msg)
case 0x0071:
player_node = mCharInfo->getEntry();
+ slot = mCharInfo->getPos();
msg->skip(4); // CharID, must be the same as player_node->charID
map_path = msg->readString(16);
mLoginData->hostname = iptostring(msg->readInt32());
@@ -145,10 +146,14 @@ void CharServerHandler::handleMessage(MessageIn *msg)
{
LocalPlayer *tmp = mCharInfo->getEntry();
if (tmp != player_node)
+ {
delete tmp;
+ mCharInfo->setEntry(0);
+ }
mCharInfo->next();
} while (mCharInfo->getPos());
+ mCharInfo->select(slot);
state = CONNECTING_STATE;
break;
diff --git a/src/net/loginhandler.cpp b/src/net/loginhandler.cpp
index 195e54e9..ab788e41 100644
--- a/src/net/loginhandler.cpp
+++ b/src/net/loginhandler.cpp
@@ -53,7 +53,8 @@ void LoginHandler::handleMessage(MessageIn *msg)
msg->skip(2);
n_server = (msg->getLength() - 47) / 32;
- server_info = (SERVER_INFO**)malloc(sizeof(SERVER_INFO*) * n_server);
+ server_info =
+ (SERVER_INFO**) malloc(sizeof(SERVER_INFO*) * n_server);
mLoginData->session_ID1 = msg->readInt32();
mLoginData->account_ID = msg->readInt32();
@@ -103,7 +104,7 @@ void LoginHandler::handleMessage(MessageIn *msg)
errorMessage = "You have been banned for 5 minutes";
break;
case 9:
- errorMessage = "This account is already logged in";
+ errorMessage = "This user name is already taken";
break;
default:
errorMessage = "Unknown error";