summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2010-12-16 16:36:03 +0100
committerYohann Ferreira <yohann_dot_ferreira_at_orange_dot_efer>2010-12-16 18:33:44 +0100
commit555862b34ccbbdbcd44241a00ec168a6a2716411 (patch)
tree78fb2393f1a7c66a9670227cf28605250cc0edd9
parente78ed334abc80578346dbef8a8b995c99dcfee7b (diff)
downloadmana-client-555862b34ccbbdbcd44241a00ec168a6a2716411.tar.gz
mana-client-555862b34ccbbdbcd44241a00ec168a6a2716411.tar.bz2
mana-client-555862b34ccbbdbcd44241a00ec168a6a2716411.tar.xz
mana-client-555862b34ccbbdbcd44241a00ec168a6a2716411.zip
Made the client handle the number of slots given by the server.
I turned the CharacterEntries into a vector. As for now, it's basically working but I discovered bugs about slots handling mainly for Manaserv that were already present before that patch. Hence, there are three remaining issues: - Under ManaServ, the character's slots numbers aren't handled when loading the characters but used when sending selection or deletion attempts. For instance, if you delete the character at slot 1, you won't be able to select or delete characters at slots 2 and 3, since the server believes that the characters are now in slots 1 and 2, even thought the client still displays them at the former slots. - Also under manaserv, you won't be able to create a character at slot 1 and 3, the server will automatically add the new one to the next slot, which is not corresponding to where you clicked to the 'Create' button. I propose to make Manaserv send again the character slots numbers and store them in database since we used them in creation, selection, and deletion attempts. It would make more sense IMHO. - The last remaining issue found is that when switching between different servers, the loginData don't get cleaned up, make the characterSelect dialog look crazy when the number of slots is different between two servers. If this one is accepted, my next patch will make the logindata be cleaned up between each login attempts (as for the slot number, and maybe other sensible data) and the next ones will readd character slot handling server and client side. Reviewed-by: Jaxad0127.
-rw-r--r--src/gui/charselectdialog.cpp29
-rw-r--r--src/gui/charselectdialog.h4
-rw-r--r--src/net/logindata.h12
-rw-r--r--src/net/manaserv/loginhandler.cpp13
-rw-r--r--src/net/manaserv/loginhandler.h2
5 files changed, 45 insertions, 15 deletions
diff --git a/src/gui/charselectdialog.cpp b/src/gui/charselectdialog.cpp
index d8794afd..1fe7d3ba 100644
--- a/src/gui/charselectdialog.cpp
+++ b/src/gui/charselectdialog.cpp
@@ -59,6 +59,9 @@
#include <string>
#include <cassert>
+// Character slots per row in the dialog
+static const int SLOTS_PER_ROW = 5;
+
/**
* Listener for confirming character deletion.
*/
@@ -118,6 +121,7 @@ CharSelectDialog::CharSelectDialog(LoginData *loginData):
mLocked(false),
mUnregisterButton(0),
mChangeEmailButton(0),
+ mCharacterEntries(0),
mLoginData(loginData),
mCharHandler(Net::getCharHandler())
{
@@ -154,10 +158,10 @@ CharSelectDialog::CharSelectDialog(LoginData *loginData):
place = getPlacer(0, 1);
- for (int i = 0; i < MAX_CHARACTER_COUNT; i++)
+ for (int i = 0; i < (int)mLoginData->characterSlots; i++)
{
- mCharacterEntries[i] = new CharacterDisplay(this);
- place(i, 0, mCharacterEntries[i]);
+ mCharacterEntries.push_back(new CharacterDisplay(this));
+ place(i % SLOTS_PER_ROW, (int)i / SLOTS_PER_ROW, mCharacterEntries[i]);
}
reflowLayout();
@@ -180,9 +184,14 @@ void CharSelectDialog::action(const gcn::ActionEvent &event)
// Check if a button of a character was pressed
const gcn::Widget *sourceParent = event.getSource()->getParent();
int selected = -1;
- for (int i = 0; i < MAX_CHARACTER_COUNT; ++i)
+ for (int i = 0; i < (int)mCharacterEntries.size(); ++i)
+ {
if (mCharacterEntries[i] == sourceParent)
+ {
selected = i;
+ break;
+ }
+ }
const std::string &eventId = event.getId();
@@ -263,14 +272,16 @@ void CharSelectDialog::attemptCharacterSelect(int index)
void CharSelectDialog::setCharacters(const Net::Characters &characters)
{
// Reset previous characters
- for (int i = 0; i < MAX_CHARACTER_COUNT; ++i)
- mCharacterEntries[i]->setCharacter(0);
+ std::vector<CharacterDisplay*>::iterator iter, iter_end;
+ for (iter = mCharacterEntries.begin(), iter_end = mCharacterEntries.end();
+ iter != iter_end; ++iter)
+ (*iter)->setCharacter(0);
Net::Characters::const_iterator i, i_end = characters.end();
for (i = characters.begin(); i != i_end; ++i)
{
Net::Character *character = *i;
- if (character->slot >= MAX_CHARACTER_COUNT)
+ if (character->slot >= (int)mCharacterEntries.size())
{
logger->log("Warning: slot out of range: %d", character->slot);
continue;
@@ -302,7 +313,7 @@ void CharSelectDialog::setLocked(bool locked)
if (mChangeEmailButton)
mChangeEmailButton->setEnabled(!locked);
- for (int i = 0; i < MAX_CHARACTER_COUNT; ++i)
+ for (int i = 0; i < (int)mCharacterEntries.size(); ++i)
mCharacterEntries[i]->setActive(!mLocked);
}
@@ -312,7 +323,7 @@ bool CharSelectDialog::selectByName(const std::string &name,
if (mLocked)
return false;
- for (int i = 0; i < MAX_CHARACTER_COUNT; ++i)
+ for (int i = 0; i < (int)mCharacterEntries.size(); ++i)
{
if (Net::Character *character = mCharacterEntries[i]->getCharacter())
{
diff --git a/src/gui/charselectdialog.h b/src/gui/charselectdialog.h
index 2c0444bf..455ec2df 100644
--- a/src/gui/charselectdialog.h
+++ b/src/gui/charselectdialog.h
@@ -96,8 +96,8 @@ class CharSelectDialog : public Window, public gcn::ActionListener,
gcn::Button *mUnregisterButton;
gcn::Button *mChangeEmailButton;
- enum { MAX_CHARACTER_COUNT = 3 };
- CharacterDisplay *mCharacterEntries[MAX_CHARACTER_COUNT];
+ /** The player boxes */
+ std::vector<CharacterDisplay*> mCharacterEntries;
LoginData *mLoginData;
diff --git a/src/net/logindata.h b/src/net/logindata.h
index 22675d5a..7f729559 100644
--- a/src/net/logindata.h
+++ b/src/net/logindata.h
@@ -29,6 +29,15 @@
class LoginData
{
public:
+ /**
+ * Constructor
+ *
+ * Initialize character slots to 3 for TmwAthena compatibility
+ */
+ LoginData():
+ characterSlots(3)
+ {}
+
std::string username;
std::string password;
std::string newPassword;
@@ -42,6 +51,8 @@ public:
bool remember; /**< Whether to store the username. */
bool registerLogin; /**< Whether an account is being registered. */
+ unsigned short characterSlots; /**< The number of character slots */
+
void clear()
{
username.clear();
@@ -51,6 +62,7 @@ public:
email.clear();
captchaResponse.clear();
gender = GENDER_UNSPECIFIED;
+ characterSlots = 3; // Default value, used for TmwAthena.
}
};
diff --git a/src/net/manaserv/loginhandler.cpp b/src/net/manaserv/loginhandler.cpp
index 29418124..05a51efe 100644
--- a/src/net/manaserv/loginhandler.cpp
+++ b/src/net/manaserv/loginhandler.cpp
@@ -251,7 +251,7 @@ void LoginHandler::handleLoginResponse(Net::MessageIn &msg)
if (errMsg == ERRMSG_OK)
{
- readUpdateHost(msg);
+ readServerInfo(msg);
// No worlds atm, but future use :-D
Client::setState(STATE_WORLD_SELECT);
}
@@ -289,7 +289,7 @@ void LoginHandler::handleRegisterResponse(Net::MessageIn &msg)
if (errMsg == ERRMSG_OK)
{
- readUpdateHost(msg);
+ readServerInfo(msg);
Client::setState(STATE_WORLD_SELECT);
}
else
@@ -320,7 +320,7 @@ void LoginHandler::handleRegisterResponse(Net::MessageIn &msg)
}
}
-void LoginHandler::readUpdateHost(Net::MessageIn &msg)
+void LoginHandler::readServerInfo(Net::MessageIn &msg)
{
// Safety check for outdated manaserv versions (remove me later)
if (msg.getUnreadLength() == 0)
@@ -332,6 +332,13 @@ void LoginHandler::readUpdateHost(Net::MessageIn &msg)
mLoginData->updateHost = updateHost;
else
logger->log("Warning: server does not have an update host set!");
+
+ // Read the client data folder for dynamic data loading.
+ // This is only used by the QT client.
+ msg.readString();
+
+ // Read the number of character slots
+ mLoginData->characterSlots = msg.readInt8();
}
void LoginHandler::connect()
diff --git a/src/net/manaserv/loginhandler.h b/src/net/manaserv/loginhandler.h
index d2ffbc3d..2062dcb5 100644
--- a/src/net/manaserv/loginhandler.h
+++ b/src/net/manaserv/loginhandler.h
@@ -80,7 +80,7 @@ class LoginHandler : public MessageHandler, public Net::LoginHandler
void handleLoginResponse(Net::MessageIn &msg);
void handleRegisterResponse(Net::MessageIn &msg);
- void readUpdateHost(Net::MessageIn &msg);
+ void readServerInfo(Net::MessageIn &msg);
LoginData *mLoginData;
unsigned int mMinUserNameLength;