From 0841923d1ebd1283e5b1d2cff48ed34f860f288b Mon Sep 17 00:00:00 2001 From: Guillaume Melquiond Date: Mon, 14 Aug 2006 22:48:53 +0000 Subject: Changed protocol so that server information are sent on character selection. --- ChangeLog | 7 +++ src/accounthandler.cpp | 120 +++++----------------------------------- src/client.cpp | 147 ++++++++++++++++++------------------------------- src/defines.h | 8 +-- 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 + + * 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 * 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 -- cgit v1.2.3-60-g2f50