summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuillaume Melquiond <guillaume.melquiond@gmail.com>2006-08-14 22:48:53 +0000
committerGuillaume Melquiond <guillaume.melquiond@gmail.com>2006-08-14 22:48:53 +0000
commit0841923d1ebd1283e5b1d2cff48ed34f860f288b (patch)
tree1ccd53d94b3fc88b6e8c321ca51f8900d76f8ed0
parent45af94901cbaade46723456ec1991b4b985bfe66 (diff)
downloadmanaserv-0841923d1ebd1283e5b1d2cff48ed34f860f288b.tar.gz
manaserv-0841923d1ebd1283e5b1d2cff48ed34f860f288b.tar.bz2
manaserv-0841923d1ebd1283e5b1d2cff48ed34f860f288b.tar.xz
manaserv-0841923d1ebd1283e5b1d2cff48ed34f860f288b.zip
Changed protocol so that server information are sent on character selection.
-rw-r--r--ChangeLog7
-rw-r--r--src/accounthandler.cpp120
-rw-r--r--src/client.cpp147
-rw-r--r--src/defines.h8
4 files changed, 77 insertions, 205 deletions
diff --git a/ChangeLog b/ChangeLog
index 1937b894..92c02653 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2006-08-06 Guillaume Melquiond <guillaume.melquiond@gmail.com>
+
+ * src/accounthandler.cpp, src/defines.h: Modified protocol so that
+ server information are sent on character selection.
+ * src/client.cpp: Adapted to new connection protocol and new character
+ information.
+
2006-08-13 Bjørn Lindeijer <bjorn@lindeijer.nl>
* src/items.h: Fixed missing constructor since there is no default
diff --git a/src/accounthandler.cpp b/src/accounthandler.cpp
index e0250dfc..c78786c6 100644
--- a/src/accounthandler.cpp
+++ b/src/accounthandler.cpp
@@ -326,22 +326,28 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message)
}
// set character
- // TODO: Handle reset character's map when the server can't load
- // it. And SELECT_NO_MAPS error return value when the default map couldn't
- // be loaded in setCharacter(). Not implemented yet for tests purpose...
computer.setCharacter(chars[charNum]);
PlayerPtr selectedChar = computer.getCharacter();
result.writeByte(ERRMSG_OK);
std::string mapName = store.getMapNameFromId(selectedChar->getMapId());
result.writeString(mapName);
- result.writeShort(selectedChar->getX());
- result.writeShort(selectedChar->getY());
- LOG_INFO("Selected Character " << int(charNum)
- << ": " <<
- selectedChar->getName(), 1);
selectedChar->setDestination(selectedChar->getX(), selectedChar->getY());
selectedChar->setSpeed(10); // TODO
+
+ LOG_INFO(selectedChar->getName() << " is trying to enter the servers.", 1);
+ std::string magic_token(32, ' ');
+ for (int i = 0; i < 32; ++i) {
+ magic_token[i] =
+ 1 + (int) (127 * (rand() / (RAND_MAX + 1.0)));
+ }
+ result.writeString("localhost"); // TODO
+ result.writeShort(9603);
+ result.writeString("localhost");
+ result.writeShort(9602);
+ result.writeString(magic_token, 32);
+ registerGameClient(magic_token, selectedChar);
+ registerChatClient(magic_token, selectedChar->getName(), AL_NORMAL);
}
break;
@@ -387,104 +393,6 @@ void AccountHandler::processMessage(NetComputer *comp, MessageIn &message)
}
break;
- /*case PAMSG_CHAR_LIST:
- {
- result.writeShort(APMSG_CHAR_LIST_RESPONSE);
-
- if (computer.getAccount().get() == NULL)
- {
- result.writeByte(ERRMSG_NO_LOGIN);
- LOG_INFO("Not logged in. Can't list characters.", 1);
- break; // not logged in
- }
-
- result.writeByte(ERRMSG_OK);
- // Return information about available characters
- Players &chars = computer.getAccount()->getCharacters();
- result.writeByte(chars.size());
-
- LOG_INFO(computer.getAccount()->getName() << "'s account has "
- << chars.size() << " character(s).", 1);
- std::string charStats;
- std::string mapName;
- for (unsigned int i = 0; i < chars.size(); i++)
- {
- result.writeString(chars[i]->getName());
- if (i > 0) charStats += ", ";
- charStats += chars[i]->getName();
- result.writeByte(unsigned(short(chars[i]->getGender())));
- result.writeByte(chars[i]->getHairStyle());
- result.writeByte(chars[i]->getHairColor());
- result.writeByte(chars[i]->getLevel());
- for (int j = 0; j < NB_RSTAT; ++j)
- result.writeShort(chars[i]->getRawStat(j));
- mapName = store.getMapNameFromId(chars[i]->getMapId());
- result.writeString(mapName);
- result.writeShort(chars[i]->getX());
- result.writeShort(chars[i]->getY());
- }
- charStats += ".";
- LOG_INFO(charStats.c_str(), 1);
- }
- break;*/
-
- case PAMSG_ENTER_WORLD:
- {
- result.writeShort(APMSG_ENTER_WORLD_RESPONSE);
-
- if (computer.getAccount().get() == NULL)
- {
- result.writeByte(ERRMSG_NO_LOGIN);
- LOG_INFO("Not logged in. Can't enter the world.", 1);
- break; // not logged in
- }
- if (computer.getCharacter().get() == NULL)
- {
- result.writeByte(ERRMSG_NO_CHARACTER_SELECTED);
- LOG_INFO("No character selected. Can't enter the world.", 1);
- break; // no character selected
- }
- LOG_INFO(computer.getCharacter()->getName() << " is trying to enter the world.", 1);
- std::string magic_token(32, ' ');
- for (int i = 0; i < 32; ++i) {
- magic_token[i] =
- 1 + (int) (127 * (rand() / (RAND_MAX + 1.0)));
- }
- result.writeByte(ERRMSG_OK);
- result.writeString("localhost");
- result.writeShort(9603);
- result.writeString(magic_token, 32);
- registerGameClient(magic_token, computer.getCharacter());
- }
- break;
-
- case PAMSG_ENTER_CHAT:
- {
- result.writeShort(APMSG_ENTER_CHAT_RESPONSE);
-
- if (computer.getAccount().get() == NULL)
- {
- result.writeByte(ERRMSG_NO_LOGIN);
- LOG_INFO("Not logged in. Can't enter the chat.", 1);
- break; // not logged in
- }
- if (computer.getCharacter().get() == NULL)
- {
- result.writeByte(ERRMSG_NO_CHARACTER_SELECTED);
- LOG_INFO("No character selected. Can't enter the chat.", 1);
- break; // no character selected
- }
- std::string magic_token(32, ' ');
- for(int i = 0; i < 32; ++i) magic_token[i] = 1 + (int) (127 * (rand() / (RAND_MAX + 1.0)));
- result.writeByte(ERRMSG_OK);
- result.writeString("localhost");
- result.writeShort(9603);
- result.writeString(magic_token, 32);
- registerChatClient(magic_token, computer.getCharacter()->getName(),
- computer.getAccount()->getLevel());
- }
- break;
-
default:
LOG_WARN("Invalid message type", 0);
result.writeShort(XXMSG_INVALID);
diff --git a/src/client.cpp b/src/client.cpp
index 995fe7e1..9074a598 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -36,8 +36,8 @@
void parsePacket(char *data, int recvLength);
ENetHost *client;
-ENetAddress addressAccount, addressGame;
-ENetPeer *peerAccount, *peerGame;
+ENetAddress addressAccount, addressGame, addressChat;
+ENetPeer *peerAccount, *peerGame, *peerChat;
std::string token;
bool connected = false;
@@ -94,13 +94,13 @@ int main(int argc, char *argv[])
std::cout << std::endl;
std::cout << "0) Quit 9) Select Character" << std::endl;
std::cout << "1) Register 10) Delete Character" << std::endl;
- std::cout << "2) Unregister " << std::endl;
+ std::cout << "2) Unregister" << std::endl;
std::cout << "3) Login 12) Move Character" << std::endl;
- std::cout << "4) Logout 13) Say around" << std::endl;
+ std::cout << "4) Logout 13) Say Around" << std::endl;
std::cout << "5) Change Password 14) Equip Item" << std::endl;
std::cout << "6) Change Email 15) Ruby Expression" << std::endl;
- std::cout << "7) Get Email 16) Request game server token" << std::endl;
- std::cout << "8) Create character 17) Enter world (GS)" << std::endl;
+ std::cout << "7) Get Email 16) Enter Game Server" << std::endl;
+ std::cout << "8) Create character 17) Enter Chat Server" << std::endl;
std::cout << "Choose your option: ";
std::cin >> answer;
std::cin.getline(line, 256); // skip the remaining of the line
@@ -313,14 +313,18 @@ int main(int argc, char *argv[])
case 16:
{
- msg.writeShort(PAMSG_ENTER_WORLD);
+ // enter game server
+ msg.writeShort(PGMSG_CONNECT);
+ msg.writeString(token, 32);
+ msgDestination = 1;
} break;
case 17:
{
- msg.writeShort(PGMSG_CONNECT);
+ // enter chat server
+ msg.writeShort(PCMSG_CONNECT);
msg.writeString(token, 32);
- msgDestination = 1;
+ msgDestination = 2;
} break;
default:
@@ -332,8 +336,15 @@ int main(int argc, char *argv[])
ENetPacket *packet = enet_packet_create(
msg.getData(), msg.getDataSize(),
ENET_PACKET_FLAG_RELIABLE);
- // Send the packet to the peer over channel id 0.
- enet_peer_send(msgDestination == 0 ? peerAccount : peerGame, 0, packet);
+ ENetPeer *peer = peerAccount;
+ if (msgDestination == 1) peer = peerGame;
+ else if (msgDestination == 2) peer = peerChat;
+ if (peer) {
+ // Send the packet to the peer over channel id 0.
+ enet_peer_send(peer, 0, packet);
+ } else
+ std::cout << "Peer " << msgDestination << " is not connected. "
+ "Cannot send packet." << std::endl;
} // end if
} // end if
@@ -434,20 +445,7 @@ void parsePacket(char *data, int recvLength) {
// Register
switch (msg.readByte()) {
case ERRMSG_OK:
- unsigned char charNumber;
- charNumber = msg.readByte();
- std::cout << "Account has " << int(charNumber) << " characters." << std::endl;
- for (unsigned int i = 0; i < charNumber; i++) {
- if (i >0) std::cout << ", ";
- // Write name, ignore other values
- std::cout << msg.readString();
- msg.readByte();
- msg.readByte();
- msg.readByte();
- msg.readByte();
- msg.readShort();
- }
- std::cout << "." << std::endl;
+ std::cout << "Login successful." << std::endl;
break;
case ERRMSG_INVALID_ARGUMENT:
std::cout << "Login: Invalid username or password." << std::endl;
@@ -602,12 +600,20 @@ void parsePacket(char *data, int recvLength) {
switch (msg.readByte()) {
case ERRMSG_OK:
{
- std::cout << "Character selected successfully.";
- std::cout << std::endl;
- std::cout << "Current Map: ";
- std::cout << msg.readString() << " (X:";
- std::cout << (int)msg.readShort() << ", Y:";
- std::cout << (int)msg.readShort() << ")" << std::endl;
+ std::cout << "Character selected successfully." << std::endl;
+ std::cout << "Current Map: " << msg.readString() << std::endl;
+ std::string server = msg.readString();
+ enet_address_set_host(&addressGame, server.c_str());
+ addressGame.port = msg.readShort();
+ peerGame = enet_host_connect(client, &addressGame, 1);
+ std::cout << "Connecting to " << server << ':' << addressGame.port;
+ server = msg.readString();
+ enet_address_set_host(&addressChat, server.c_str());
+ addressChat.port = msg.readShort();
+ peerChat = enet_host_connect(client, &addressChat, 1);
+ token = msg.readString(32);
+ connected = false;
+ std::cout << " and to " << server << ':' << addressChat.port << std::endl;
} break;
case ERRMSG_INVALID_ARGUMENT:
std::cout << "Character Selection: invalid ID."
@@ -622,44 +628,24 @@ void parsePacket(char *data, int recvLength) {
}
} break;
- case APMSG_CHAR_LIST_RESPONSE:
+ case APMSG_CHAR_INFO:
{
- switch (msg.readByte()) {
- case ERRMSG_OK:
- {
- unsigned char charNumber;
- charNumber = msg.readByte();
- std::cout << "Character List:" << std::endl
- << "---------------" << std::endl;
- std::cout << int(charNumber) << " character(s) in the account."
- << std::endl;
- for (unsigned int i = 0; i < charNumber; i++) {
- std::cout << int(i) << ". "
- << msg.readString() << ":" << std::endl;
- std::cout << "Gender: " << int(msg.readByte()) << ", ";
- std::cout << "Hair Style: " << int(msg.readByte()) << ", ";
- std::cout << "Hair Color: " << int(msg.readByte()) << ", "
- << std::endl;
- std::cout << "Level: " << int(msg.readByte()) << ", ";
- std::cout << "Money: " << int(msg.readShort()) << ", "
- << std::endl;
- std::cout << "Strength: " << int(msg.readShort()) << ", ";
- std::cout << "Agility: " << int(msg.readShort()) << ", ";
- std::cout << "Vitality: " << int(msg.readShort()) << ", "
- << std::endl;
- std::cout << "Intelligence: " << int(msg.readShort()) << ", ";
- std::cout << "Dexterity: " << int(msg.readShort()) << ", ";
- std::cout << "Luck: " << int(msg.readShort()) << ". "
- << std::endl;
- std::cout << "Current Map: " << msg.readString() << " (X:";
- std::cout << int(msg.readShort()) << ", Y:" << int(msg.readShort()) << ")."
- << std::endl << std::endl;
- }
- } break;
- default:
- std::cout << "Character List: Unknown error." << std::endl;
- break;
- }
+ std::cout << "Information on character " << int(msg.readByte()) << std::endl;
+ std::cout << " Name: " << msg.readString() << std::endl;
+ std::cout << " Gender: " << int(msg.readByte()) << ", ";
+ std::cout << "Hair Style: " << int(msg.readByte()) << ", ";
+ std::cout << "Hair Color: " << int(msg.readByte()) << std::endl;
+ std::cout << " Level: " << int(msg.readByte()) << ", ";
+ std::cout << "Money: " << int(msg.readShort()) << std::endl;
+ std::cout << " Strength: " << int(msg.readShort()) << ", ";
+ std::cout << "Agility: " << int(msg.readShort()) << ", ";
+ std::cout << "Vitality: " << int(msg.readShort()) << std::endl;
+ std::cout << " Intelligence: " << int(msg.readShort()) << ", ";
+ std::cout << "Dexterity: " << int(msg.readShort()) << ", ";
+ std::cout << "Luck: " << int(msg.readShort()) << std::endl;
+ //std::cout << " Current Map: " << msg.readString() << " (X:";
+ //std::cout << int(msg.readShort()) << ", Y:";
+ //std::cout << int(msg.readShort()) << ")" << std::endl;
} break;
case GPMSG_SAY:
@@ -695,31 +681,6 @@ void parsePacket(char *data, int recvLength) {
}
} break;
- case APMSG_ENTER_WORLD_RESPONSE:
- {
- switch (msg.readByte()) {
- case ERRMSG_OK:
- {
- std::string server = msg.readString();
- enet_address_set_host(&addressGame, server.c_str());
- addressGame.port = msg.readShort();
- peerGame = enet_host_connect(client, &addressGame, 1);
- token = msg.readString(32);
- connected = false;
- std::cout << "Connecting to " << server << ':' << addressGame.port << std::endl;
- } break;
- case ERRMSG_NO_LOGIN:
- std::cout << "Enter world: Not logged in." << std::endl;
- break;
- case ERRMSG_NO_CHARACTER_SELECTED:
- std::cout << "Enter world: No character selected." << std::endl;
- break;
- default:
- std::cout << "Enter world: Unknown error." << std::endl;
- break;
- }
- } break;
-
case GPMSG_BEINGS_MOVE:
{
int nb = (recvLength - 2) / (1*4 + 4*2);
diff --git a/src/defines.h b/src/defines.h
index a79ff99e..e3a85e60 100644
--- a/src/defines.h
+++ b/src/defines.h
@@ -125,19 +125,15 @@ enum {
PAMSG_CHAR_DELETE = 0x0022, // B index
APMSG_CHAR_DELETE_RESPONSE = 0x0023, // B error
APMSG_CHAR_INFO = 0x0024, // B index, S name, B gender, B hair style, B hair color, B level, W money, W*6 stats, S mapname, W*2 position
- APMSG_CHAR_LIST_RESPONSE = 0x0025, // B number, { B index, S name, B gender, B hair style, B hair color, B level, W money, W*6 stats, S mapname, W*2 position }*
PAMSG_CHAR_SELECT = 0x0026, // B index
- APMSG_CHAR_SELECT_RESPONSE = 0x0027, // B error, S mapname, W*2 position
+ APMSG_CHAR_SELECT_RESPONSE = 0x0027, // B error, S mapname, S game address, W game port, S chat address, W chat port, B*32 token
PAMSG_EMAIL_CHANGE = 0x0030, // S email
APMSG_EMAIL_CHANGE_RESPONSE = 0x0031, // B error
PAMSG_EMAIL_GET = 0x0032, // -
APMSG_EMAIL_GET_RESPONSE = 0x0033, // B error, S email
PAMSG_PASSWORD_CHANGE = 0x0034, // S old password, S new password
APMSG_PASSWORD_CHANGE_RESPONSE = 0x0035, // B error
- PAMSG_ENTER_WORLD = 0x0040, // -
- APMSG_ENTER_WORLD_RESPONSE = 0x0041, // B error, S address, W port, B*32 token
- PAMSG_ENTER_CHAT = 0x0042, // -
- APMSG_ENTER_CHAT_RESPONSE = 0x0043, // B error, S address, W port, B*32 token
+
PGMSG_CONNECT = 0x0050, // B*32 token
GPMSG_CONNECT_RESPONSE = 0x0051, // B error
PCMSG_CONNECT = 0x0053, // B*32 token