diff options
Diffstat (limited to 'src/client.cpp')
-rw-r--r-- | src/client.cpp | 1164 |
1 files changed, 596 insertions, 568 deletions
diff --git a/src/client.cpp b/src/client.cpp index 87646f10..81f023c7 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -21,7 +21,7 @@ */ #include <iostream> -#include <SDL_net.h> +#include <enet/enet.h> #include "defines.h" #include "messageout.h" @@ -33,6 +33,8 @@ #define PACKAGE_VERSION PRODUCT_VERSION #endif +void parsePacket(char *data, int recvLength); + int main(int argc, char *argv[]) { @@ -40,639 +42,665 @@ int main(int argc, char *argv[]) #include "../config.h" #endif std::cout << "The Mana World Test Client v" << PACKAGE_VERSION << std::endl; - - // Initialize SDL - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) { - std::cout << "SDL_Init: " << SDL_GetError() << std::endl; - exit(1); + + if (enet_initialize () != 0) + { + printf("An error occurred while initializing ENet.\n"); + return EXIT_FAILURE; } - // Set SDL to quit on exit - atexit(SDL_Quit); + atexit(enet_deinitialize); - // Initialize SDL_net - if (SDLNet_Init() == -1) { - std::cout << "SDLNet_Init: " << SDLNet_GetError() << std::endl; - exit(2); - } + ENetHost *client; - // Try to connect to server - IPaddress ip; - TCPsocket tcpsock; + client = enet_host_create(NULL /* create a client host */, + 1 /* only allow 1 outgoing connection */, + 57600 / 8 /* 56K modem with 56 Kbps downstream bandwidth */, + 14400 / 8 /* 56K modem with 14 Kbps upstream bandwidth */); - if (SDLNet_ResolveHost(&ip, "localhost", 9601) == -1) { - std::cout << "SDLNet_ResolveHost: " << SDLNet_GetError() << std::endl; - exit(1); + if (client == NULL) + { + printf("An error occurred while trying to create an ENet client host.\n"); + exit (EXIT_FAILURE); } - tcpsock = SDLNet_TCP_Open(&ip); - if (!tcpsock) { - std::cout << "SDLNet_TCP_Open: " << SDLNet_GetError() << std::endl; - exit(2); - } + ENetAddress address; + ENetPeer *peer; - std::cout << "Successfully connected!" << std::endl; + /* Connect to localhost:9601. */ + enet_address_set_host(&address, "localhost"); + address.port = 9601; - int answer = 1; - char line[256] = ""; + /* Initiate the connection, allocating one channel. */ + peer = enet_host_connect(client, &address, 1); - while (answer != 0) + if (peer == NULL) { - bool responseRequired = true; - MessageOut msg; - - std::cout << "0) Quit 9) Character selection" << std::endl; - std::cout << "1) Register 10) Delete Character" << std::endl; - std::cout << "2) Unregister 11) List Characters" << std::endl; - std::cout << "3) Login 12) Move Character" << std::endl; - std::cout << "4) Logout 13) Chat" << 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" << std::endl; - std::cout << "8) Create character" << std::endl; - std::cout << "Choose your option: "; - std::cin >> answer; - - switch (answer) { - case 1: - // Register - msg.writeShort(CMSG_REGISTER); - // We send the client version - msg.writeString(PACKAGE_VERSION); - std::cout << "Account name: "; - std::cin >> line; - msg.writeString(line); - std::cout <<"Password: "; - std::cin >> line; - msg.writeString(line); - std::cout << "Email address: "; - std::cin >> line; - msg.writeString(line); - break; - - case 2: - // Unregister (deleting an account) - msg.writeShort(CMSG_UNREGISTER); - std::cout << "Account name: "; - std::cin >> line; - msg.writeString(line); - std::cout << "Password: "; - std::cin >> line; - msg.writeString(line); - break; + printf("No available peers for initiating an ENet connection.\n"); + exit (EXIT_FAILURE); + } - case 3: - // Login - msg.writeShort(CMSG_LOGIN); - // We send the client version - msg.writeString(PACKAGE_VERSION); - std::cout << "Account name: "; - std::cin >> line; - msg.writeString(line); - std::cout << "Password: "; - std::cin >> line; - msg.writeString(line); - break; + ENetEvent event; + bool exit = false; + bool connected = false; + int answer = 0; + char line[256] = ""; + bool responseRequired = false; - case 4: - // Logout - msg.writeShort(CMSG_LOGOUT); - std::cout << "Logout" << std::endl; - break; + printf("Starting client...\n"); - case 5: - // Change Password - msg.writeShort(CMSG_PASSWORD_CHANGE); - std::cout << "Old Password: "; - std::cin >> line; - msg.writeString(line); - std::cout << "New Password: "; - std::cin >> line; - msg.writeString(line); - std::cout << "Retype new Password: "; - std::cin >> line; - msg.writeString(line); - break; + /* Wait up to 1000 milliseconds for an event. */ + while (!exit) { + if (connected) { + std::cout << std::endl; + std::cout << "0) Quit 9) Character selection" << std::endl; + std::cout << "1) Register 10) Delete Character" << std::endl; + std::cout << "2) Unregister 11) List Characters" << std::endl; + std::cout << "3) Login 12) Move Character" << std::endl; + std::cout << "4) Logout 13) Chat" << 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" << std::endl; + std::cout << "8) Create character" << std::endl; + std::cout << "Choose your option: "; + std::cin >> answer; + + MessageOut msg; + + switch (answer) { + case 0: + // Disconnection + if (connected) { + enet_peer_disconnect(&client->peers[0], 0); + } + exit = true; + break; + + case 1: + // Register + msg.writeShort(CMSG_REGISTER); + // We send the client version + msg.writeString(PACKAGE_VERSION); + std::cout << "Account name: "; + std::cin >> line; + msg.writeString(line); + std::cout <<"Password: "; + std::cin >> line; + msg.writeString(line); + std::cout << "Email address: "; + std::cin >> line; + msg.writeString(line); + break; - case 6: - // Change Email - msg.writeShort(CMSG_EMAIL_CHANGE); - std::cout << "New Email: "; - std::cin >> line; - msg.writeString(line); - break; + case 2: + // Unregister (deleting an account) + msg.writeShort(CMSG_UNREGISTER); + std::cout << "Account name: "; + std::cin >> line; + msg.writeString(line); + std::cout << "Password: "; + std::cin >> line; + msg.writeString(line); + break; - case 7: - // Get current Account's Email value - msg.writeShort(CMSG_EMAIL_GET); - break; + case 3: + // Login + msg.writeShort(CMSG_LOGIN); + // We send the client version + msg.writeString(PACKAGE_VERSION); + std::cout << "Account name: "; + std::cin >> line; + msg.writeString(line); + std::cout << "Password: "; + std::cin >> line; + msg.writeString(line); + break; - case 8: - { - // Create character - msg.writeShort(CMSG_CHAR_CREATE); - std::cout << "Name: "; - std::cin >> line; - msg.writeString(line); - - std::cout << "Hair Style ID (0 - " << MAX_HAIRSTYLE_VALUE << "): "; - std::cin >> line; - msg.writeByte(atoi(line)); - - std::cout << "Hair Color ID (0 - " << MAX_HAIRCOLOR_VALUE << "): "; - std::cin >> line; - msg.writeByte(atoi(line)); - - std::cout << "Gender ID (0 - " << MAX_GENDER_VALUE << "): "; - std::cin >> line; - msg.writeByte(atoi(line)); - - std::cout << "Strength: "; - std::cin >> line; - msg.writeShort(atoi(line)); - - std::cout << "Agility: "; - std::cin >> line; - msg.writeShort(atoi(line)); - - std::cout << "Vitality: "; - std::cin >> line; - msg.writeShort(atoi(line)); - - std::cout << "Intelligence: "; - std::cin >> line; - msg.writeShort(atoi(line)); - - std::cout << "Dexterity: "; - std::cin >> line; - msg.writeShort(atoi(line)); - - std::cout << "Luck: "; - std::cin >> line; - msg.writeShort(atoi(line)); - } break; + case 4: + // Logout + msg.writeShort(CMSG_LOGOUT); + std::cout << "Logout" << std::endl; + break; - case 9: - { - // Select character - msg.writeShort(CMSG_CHAR_SELECT); - std::cout << "Character ID: "; - std::cin >> line; - msg.writeByte(atoi(line)); - } break; + case 5: + // Change Password + msg.writeShort(CMSG_PASSWORD_CHANGE); + std::cout << "Old Password: "; + std::cin >> line; + msg.writeString(line); + std::cout << "New Password: "; + std::cin >> line; + msg.writeString(line); + std::cout << "Retype new Password: "; + std::cin >> line; + msg.writeString(line); + break; - case 10: - { - // Delete character - msg.writeShort(CMSG_CHAR_DELETE); - std::cout << "Character ID: "; - std::cin >> line; - msg.writeByte(atoi(line)); - } break; + case 6: + // Change Email + msg.writeShort(CMSG_EMAIL_CHANGE); + std::cout << "New Email: "; + std::cin >> line; + msg.writeString(line); + break; - case 11: - { - // List characters - msg.writeShort(CMSG_CHAR_LIST); - } break; + case 7: + // Get current Account's Email value + msg.writeShort(CMSG_EMAIL_GET); + break; - case 12: - { - // Move character - long x, y; - std::cout << "X: "; - std::cin >> x; - std::cout << "Y: "; - std::cin >> y; - - msg.writeShort(CMSG_WALK); - msg.writeLong(x); - msg.writeLong(y); - - responseRequired = false; - } break; + case 8: + { + // Create character + msg.writeShort(CMSG_CHAR_CREATE); + std::cout << "Name: "; + std::cin >> line; + msg.writeString(line); + + std::cout << "Hair Style ID (0 - " << MAX_HAIRSTYLE_VALUE << "): "; + std::cin >> line; + msg.writeByte(atoi(line)); + + std::cout << "Hair Color ID (0 - " << MAX_HAIRCOLOR_VALUE << "): "; + std::cin >> line; + msg.writeByte(atoi(line)); + + std::cout << "Gender ID (0 - " << MAX_GENDER_VALUE << "): "; + std::cin >> line; + msg.writeByte(atoi(line)); + + std::cout << "Strength: "; + std::cin >> line; + msg.writeShort(atoi(line)); + + std::cout << "Agility: "; + std::cin >> line; + msg.writeShort(atoi(line)); + + std::cout << "Vitality: "; + std::cin >> line; + msg.writeShort(atoi(line)); + + std::cout << "Intelligence: "; + std::cin >> line; + msg.writeShort(atoi(line)); + + std::cout << "Dexterity: "; + std::cin >> line; + msg.writeShort(atoi(line)); + + std::cout << "Luck: "; + std::cin >> line; + msg.writeShort(atoi(line)); + } break; + + case 9: + { + // Select character + msg.writeShort(CMSG_CHAR_SELECT); + std::cout << "Character ID: "; + std::cin >> line; + msg.writeByte(atoi(line)); + } break; + + case 10: + { + // Delete character + msg.writeShort(CMSG_CHAR_DELETE); + std::cout << "Character ID: "; + std::cin >> line; + msg.writeByte(atoi(line)); + } break; + + case 11: + { + // List characters + msg.writeShort(CMSG_CHAR_LIST); + } break; + + case 12: + { + // Move character + long x, y; + std::cout << "X: "; + std::cin >> x; + std::cout << "Y: "; + std::cin >> y; + + msg.writeShort(CMSG_WALK); + msg.writeLong(x); + msg.writeLong(y); + + responseRequired = false; + } break; + + case 13: + // Chat + msg.writeShort(CMSG_SAY); + std::cout << "Chat: "; + std::cin >> line; + msg.writeString(line); + msg.writeShort(0); + responseRequired = false; + break; - case 13: - // Chat - msg.writeShort(CMSG_SAY); - std::cout << "Chat: "; - std::cin >> line; - msg.writeString(line); - msg.writeShort(0); - responseRequired = false; - break; + case 14: + { + // Equip + unsigned int itemId; + unsigned int slot; + std::cout << "Item ID: "; + std::cin >> itemId; + std::cout << "Slot: "; + std::cin >> slot; + msg.writeShort(CMSG_EQUIP); + msg.writeLong(itemId); + msg.writeByte(slot); + } break; + + case 15: + { + std::cout << "Expr: "; + std::cin >> line; + msg.writeShort(0x800); + msg.writeString(line); + + responseRequired = false; + } break; - case 14: - { - // Equip - unsigned int itemId; - unsigned int slot; - std::cout << "Item ID: "; - std::cin >> itemId; - std::cout << "Slot: "; - std::cin >> slot; - msg.writeShort(CMSG_EQUIP); - msg.writeLong(itemId); - msg.writeByte(slot); - } break; + default: + continue; + break; + } // end switch + + // Send prepared message + if (!exit && connected) { + ENetPacket *packet = enet_packet_create( + msg.getData(), + msg.getDataSize() + 1, + ENET_PACKET_FLAG_RELIABLE); + // Send the packet to the peer over channel id 0. + enet_peer_send(peer, 0, packet); + } // end if + + } // end if + + while (enet_host_service(client, &event, 1000)) { + switch (event.type) { + case ENET_EVENT_TYPE_CONNECT: + printf("Connected to server\n"); + connected = true; + break; - case 15: - { - std::cout << "Expr: "; - std::cin >> line; - msg.writeShort(0x800); - msg.writeString(line); + case ENET_EVENT_TYPE_RECEIVE: + std::cout << "A packet of length " + << event.packet->dataLength + << " was received from " + << event.peer->address.host + << std::endl; + + parsePacket((char *)event.packet->data, + event.packet->dataLength); + + // Clean up the packet now that we're done using it. + enet_packet_destroy(event.packet); + break; - responseRequired = false; - } break; + case ENET_EVENT_TYPE_DISCONNECT: + printf("Disconected.\n"); + connected = false; + break; - default: - continue; - } - std::cout << "Sent: " << std::endl; + default: + //printf("Unhandled enet event.\n"); + break; + } // end switch + } // end while - // Message hex - for (unsigned int i = 0; i < msg.getPacket()->length; i++) { - std::cout << int(msg.getPacket()->data[i]) << " "; + if (!connected) { + exit = true; } - std::cout << std::endl; - - SDLNet_TCP_Send(tcpsock, msg.getPacket()->data, - msg.getPacket()->length); + } // end while - // Raw Datas - char data[1024]; - int recvLength = SDLNet_TCP_Recv(tcpsock, data, 1024); + if (connected) { + // The disconnection attempt didn't succeed yet. Force disconnection. + enet_peer_reset(&client->peers[0]); + } + + enet_host_destroy(client); - if (responseRequired) { - std::cout << "Received: "; - if (recvLength != -1) { - for (unsigned int i = 0; i < recvLength; i++) { - std::cout << int(data[i]) << " "; - } - } else { - std::cout << "ERROR!" << std::endl; - } - std::cout << std::endl; - } + return 0; +} - // Response handling - // Transforming it into a MessageIn object - if (recvLength >= 2) - { - Packet *packet = new Packet(data, recvLength); - MessageIn msg(packet); // (MessageIn frees packet) +void parsePacket(char *data, int recvLength) { + // Response handling + // Transforming it into a MessageIn object + if (recvLength >= 2) { + Packet *packet = new Packet(data, recvLength); + MessageIn msg(packet); // (MessageIn frees packet) - switch (msg.getId()) { - case SMSG_REGISTER_RESPONSE: - // Register - switch (msg.readByte()) - { - case REGISTER_OK: - std::cout << "Account registered." << std::endl; + switch (msg.getId()) { + case SMSG_REGISTER_RESPONSE: + // Register + switch (msg.readByte()) { + case REGISTER_OK: + std::cout << "Account registered." << std::endl; break; - case REGISTER_INVALID_USERNAME: - std::cout << "Account registering: Invalid username." << std::endl; + case REGISTER_INVALID_USERNAME: + std::cout << "Account registering: Invalid username." << std::endl; break; - case REGISTER_INVALID_PASSWORD: - std::cout << "Account registering: Invalid password." << std::endl; + case REGISTER_INVALID_PASSWORD: + std::cout << "Account registering: Invalid password." << std::endl; break; - case REGISTER_INVALID_EMAIL: - std::cout << "Account registering: Invalid Email." << std::endl; + case REGISTER_INVALID_EMAIL: + std::cout << "Account registering: Invalid Email." << std::endl; break; - case REGISTER_INVALID_VERSION: - std::cout << "Account registering: Invalid version." << std::endl; + case REGISTER_INVALID_VERSION: + std::cout << "Account registering: Invalid version." << std::endl; break; - case REGISTER_EXISTS_USERNAME: - std::cout << "Account registering: Username already exists." << std::endl; + case REGISTER_EXISTS_USERNAME: + std::cout << "Account registering: Username already exists." << std::endl; break; - case REGISTER_EXISTS_EMAIL: - std::cout << "Account registering: Email already exists." << std::endl; + case REGISTER_EXISTS_EMAIL: + std::cout << "Account registering: Email already exists." << std::endl; break; - default: - case REGISTER_UNKNOWN: - std::cout << "Account registering: Unknown error." << std::endl; + default: + case REGISTER_UNKNOWN: + std::cout << "Account registering: Unknown error." << std::endl; break; - } - break; + } + break; - case SMSG_UNREGISTER_RESPONSE: - // Register - switch (msg.readByte()) - { - case UNREGISTER_OK: - std::cout << "Account unregistered." << std::endl; + case SMSG_UNREGISTER_RESPONSE: + // Register + switch (msg.readByte()) { + case UNREGISTER_OK: + std::cout << "Account unregistered." << std::endl; break; - case UNREGISTER_INVALID_PASSWORD: - std::cout << "Account unregistering: Invalid password." << std::endl; + case UNREGISTER_INVALID_PASSWORD: + std::cout << "Account unregistering: Invalid password." << std::endl; break; - case UNREGISTER_INVALID_USERNAME: - std::cout << "Account unregistering: Invalid username." << std::endl; + case UNREGISTER_INVALID_USERNAME: + std::cout << "Account unregistering: Invalid username." << std::endl; break; - case UNREGISTER_INVALID_UNSUFFICIENT_RIGHTS: - std::cout << "Account unregistering: unsufficient rights." << std::endl; + case UNREGISTER_INVALID_UNSUFFICIENT_RIGHTS: + std::cout << "Account unregistering: unsufficient rights." << std::endl; break; - default: - case UNREGISTER_UNKNOWN: - std::cout << "Account unregistering: Unknown error." << std::endl; + default: + case UNREGISTER_UNKNOWN: + std::cout << "Account unregistering: Unknown error." << std::endl; break; - } - break; + } + break; - case SMSG_LOGIN_RESPONSE: - // Register - switch (msg.readByte()) - { - case LOGIN_OK: - 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 << ", "; - std::cout << msg.readString(); - } - std::cout << "." << std::endl; + case SMSG_LOGIN_RESPONSE: + // Register + switch (msg.readByte()) { + case LOGIN_OK: + 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 << ", "; + std::cout << msg.readString(); + } + std::cout << "." << std::endl; break; - case LOGIN_INVALID_USERNAME: - std::cout << "Login: Invalid Username." << std::endl; + case LOGIN_INVALID_USERNAME: + std::cout << "Login: Invalid Username." << std::endl; break; - case LOGIN_INVALID_PASSWORD: - std::cout << "Login: Invalid Password." << std::endl; + case LOGIN_INVALID_PASSWORD: + std::cout << "Login: Invalid Password." << std::endl; break; - case LOGIN_INVALID_VERSION: - std::cout << "Login: Invalid Version." << std::endl; + case LOGIN_INVALID_VERSION: + std::cout << "Login: Invalid Version." << std::endl; break; - case LOGIN_ALREADY_LOGGED: - std::cout << "Login: Already logged with another account." << std::endl; + case LOGIN_ALREADY_LOGGED: + std::cout << "Login: Already logged with another account." << std::endl; break; - case LOGIN_SERVER_FULL: - std::cout << "Login: Server has reached maximum of clients." << std::endl; + case LOGIN_SERVER_FULL: + std::cout << "Login: Server has reached maximum of clients." << std::endl; break; - case LOGIN_ACCOUNT_BANNED: - std::cout << "Login: Your account has been banned." << std::endl; + case LOGIN_ACCOUNT_BANNED: + std::cout << "Login: Your account has been banned." << std::endl; break; - case LOGIN_ACCOUNT_REVIEW: - std::cout << "TODO:Login: Your account is being reviewed." << std::endl; + case LOGIN_ACCOUNT_REVIEW: + std::cout << "TODO:Login: Your account is being reviewed." << std::endl; break; - default: - case LOGIN_UNKNOWN: - std::cout << "Login: Unknown error." << std::endl; + default: + case LOGIN_UNKNOWN: + std::cout << "Login: Unknown error." << std::endl; break; - } - break; - - case SMSG_LOGOUT_RESPONSE: - { - switch (msg.readByte()) - { - case LOGOUT_OK: - std::cout << "Logout..." << std::endl; - break; - default: - case LOGOUT_UNSUCCESSFULL: - std::cout << "Logout: unsuccessfull." << std::endl; - break; - } - } - break; - - case SMSG_PASSWORD_CHANGE_RESPONSE: - { - switch (msg.readByte()) - { - case PASSCHG_OK: - std::cout << "Password correctly changed." << std::endl; - break; - case PASSCHG_NOLOGIN: - std::cout << "Password change: Not logged in." << std::endl; - break; - case PASSCHG_MISMATCH: - std::cout << "Password change: Passwords mismatch." << std::endl; - break; - case PASSCHG_INVALID: - std::cout << "Password change: New password is invalid." << std::endl; - break; - default: - case PASSCHG_UNKNOWN: - std::cout << "Password change: Unknown error." << std::endl; - break; - } - } - break; + } + break; - case SMSG_EMAIL_CHANGE_RESPONSE: - { - switch (msg.readByte()) - { - case EMAILCHG_OK: - std::cout << "Email correctly changed." << std::endl; - break; - case EMAILCHG_NOLOGIN: - std::cout << "Email change: Not logged in." << std::endl; - break; - case EMAILCHG_EXISTS_EMAIL: - std::cout << "Email change: Email already exists." << std::endl; - break; - case EMAILCHG_INVALID: - std::cout << "Email change: New Email is invalid." << std::endl; - break; - default: - case EMAILCHG_UNKNOWN: - std::cout << "Email change: Unknown error." << std::endl; - break; - } - } - break; + case SMSG_LOGOUT_RESPONSE: + { + switch (msg.readByte()) { + case LOGOUT_OK: + std::cout << "Logout..." << std::endl; + break; + default: + case LOGOUT_UNSUCCESSFULL: + std::cout << "Logout: unsuccessfull." << std::endl; + break; + } + } break; - case SMSG_EMAIL_GET_RESPONSE: - { - switch (msg.readByte()) - { - case EMAILGET_OK: - std::cout << "Current Email: " << msg.readString() << std::endl; - break; - case EMAILGET_NOLOGIN: - std::cout << "Get Email: Not logged in." << std::endl; - break; - default: - case EMAILGET_UNKNOWN: - std::cout << "Get Email: Unknown error." << std::endl; - break; - } - } - break; + case SMSG_PASSWORD_CHANGE_RESPONSE: + { + switch (msg.readByte()) { + case PASSCHG_OK: + std::cout << "Password correctly changed." << std::endl; + break; + case PASSCHG_NOLOGIN: + std::cout << "Password change: Not logged in." << std::endl; + break; + case PASSCHG_MISMATCH: + std::cout << "Password change: Passwords mismatch." << std::endl; + break; + case PASSCHG_INVALID: + std::cout << "Password change: New password is invalid." << std::endl; + break; + default: + case PASSCHG_UNKNOWN: + std::cout << "Password change: Unknown error." << std::endl; + break; + } + } break; - case SMSG_CHAR_CREATE_RESPONSE: - { - switch (msg.readByte()) - { - case CREATE_OK: - std::cout << "Character Created successfully." << std::endl; - break; - case CREATE_EXISTS_NAME: - std::cout << "Character Creation: Character's name already exists." - << std::endl; - break; - case CREATE_NOLOGIN: - std::cout << "Character Creation: Not logged in." << std::endl; - break; - case CREATE_TOO_MUCH_CHARACTERS: - std::cout << "Character Creation: Too much characters." << std::endl; - break; - case CREATE_INVALID_HAIRSTYLE: - std::cout << "Character Creation: Invalid Hair Style Value." << std::endl; - break; - case CREATE_INVALID_HAIRCOLOR: - std::cout << "Character Creation: Invalid Hair Color Value." << std::endl; - break; - case CREATE_INVALID_GENDER: - std::cout << "Character Creation: Invalid Gender Value." << std::endl; - break; - case CREATE_INVALID_NAME: - std::cout << "Character Creation: Invalid Name." << std::endl; - break; - case CREATE_RAW_STATS_EQUAL_TO_ZERO: - std::cout << "Character Creation: a Statistic is equal to zero." << std::endl; - break; - case CREATE_RAW_STATS_INVALID_DIFF: - std::cout << "Character Creation: Statistics disproportionned." << std::endl; - break; - case CREATE_RAW_STATS_TOO_HIGH: - std::cout << "Character Creation: Statistics too high for level 1." << std::endl; - break; - case CREATE_RAW_STATS_TOO_LOW: - std::cout << "Character Creation: Statistics too low for level 1." << std::endl; - break; - default: - case CREATE_UNKNOWN: - std::cout << "Character Creation: Unknown error." << std::endl; - break; - } - } - break; + case SMSG_EMAIL_CHANGE_RESPONSE: + { + switch (msg.readByte()) { + case EMAILCHG_OK: + std::cout << "Email correctly changed." << std::endl; + break; + case EMAILCHG_NOLOGIN: + std::cout << "Email change: Not logged in." << std::endl; + break; + case EMAILCHG_EXISTS_EMAIL: + std::cout << "Email change: Email already exists." << std::endl; + break; + case EMAILCHG_INVALID: + std::cout << "Email change: New Email is invalid." << std::endl; + break; + default: + case EMAILCHG_UNKNOWN: + std::cout << "Email change: Unknown error." << std::endl; + break; + } + } break; + + case SMSG_EMAIL_GET_RESPONSE: + { + switch (msg.readByte()) { + case EMAILGET_OK: + std::cout << "Current Email: " << msg.readString() << std::endl; + break; + case EMAILGET_NOLOGIN: + std::cout << "Get Email: Not logged in." << std::endl; + break; + default: + case EMAILGET_UNKNOWN: + std::cout << "Get Email: Unknown error." << std::endl; + break; + } + } break; - case SMSG_CHAR_DELETE_RESPONSE: - { - switch (msg.readByte()) - { - case DELETE_OK: - std::cout << "Character deleted." << std::endl; - break; - case DELETE_INVALID_ID: - std::cout << "Character Deletion: Character's ID doesn't exist." - << std::endl; - break; - case DELETE_NOLOGIN: - std::cout << "Character Deletion: Not logged in." << std::endl; - break; - case DELETE_NO_MORE_CHARACTERS: - std::cout << "Character Deletion: No more characters." << std::endl; - break; - default: - case DELETE_UNKNOWN: - std::cout << "Character Deletion: Unknown error." << std::endl; - break; - } - } - break; + case SMSG_CHAR_CREATE_RESPONSE: + { + switch (msg.readByte()) { + case CREATE_OK: + std::cout << "Character Created successfully." << std::endl; + break; + case CREATE_EXISTS_NAME: + std::cout << "Character Creation: Character's name already exists." + << std::endl; + break; + case CREATE_NOLOGIN: + std::cout << "Character Creation: Not logged in." << std::endl; + break; + case CREATE_TOO_MUCH_CHARACTERS: + std::cout << "Character Creation: Too much characters." << std::endl; + break; + case CREATE_INVALID_HAIRSTYLE: + std::cout << "Character Creation: Invalid Hair Style Value." << std::endl; + break; + case CREATE_INVALID_HAIRCOLOR: + std::cout << "Character Creation: Invalid Hair Color Value." << std::endl; + break; + case CREATE_INVALID_GENDER: + std::cout << "Character Creation: Invalid Gender Value." << std::endl; + break; + case CREATE_INVALID_NAME: + std::cout << "Character Creation: Invalid Name." << std::endl; + break; + case CREATE_RAW_STATS_EQUAL_TO_ZERO: + std::cout << "Character Creation: a Statistic is equal to zero." << std::endl; + break; + case CREATE_RAW_STATS_INVALID_DIFF: + std::cout << "Character Creation: Statistics disproportionned." << std::endl; + break; + case CREATE_RAW_STATS_TOO_HIGH: + std::cout << "Character Creation: Statistics too high for level 1." << std::endl; + break; + case CREATE_RAW_STATS_TOO_LOW: + std::cout << "Character Creation: Statistics too low for level 1." << std::endl; + break; + default: + case CREATE_UNKNOWN: + std::cout << "Character Creation: Unknown error." << std::endl; + break; + } + } break; - case SMSG_CHAR_SELECT_RESPONSE: - { - switch (msg.readByte()) - { - case SELECT_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; - } - break; - case SELECT_INVALID: - std::cout << "Character Selection: invalid ID." - << std::endl; - break; - case SELECT_NOLOGIN: - std::cout << "Character Selection: Not logged in." << std::endl; - break; - case SELECT_NO_CHARACTERS: - std::cout << "Character Selection: No character to select." << std::endl; - break; - case SELECT_NO_MAPS: - std::cout << "Character Selection: Can't load default map for character." - << std::endl; - break; - default: - case SELECT_UNKNOWN: - std::cout << "Character Selection: Unknown error." << std::endl; - break; - } - } - break; + case SMSG_CHAR_DELETE_RESPONSE: + { + switch (msg.readByte()) { + case DELETE_OK: + std::cout << "Character deleted." << std::endl; + break; + case DELETE_INVALID_ID: + std::cout << "Character Deletion: Character's ID doesn't exist." + << std::endl; + break; + case DELETE_NOLOGIN: + std::cout << "Character Deletion: Not logged in." << std::endl; + break; + case DELETE_NO_MORE_CHARACTERS: + std::cout << "Character Deletion: No more characters." << std::endl; + break; + default: + case DELETE_UNKNOWN: + std::cout << "Character Deletion: Unknown error." << std::endl; + break; + } + } break; - case SMSG_CHAR_LIST_RESPONSE: + case SMSG_CHAR_SELECT_RESPONSE: + { + switch (msg.readByte()) { + case SELECT_OK: { - switch (msg.readByte()) - { - case CHAR_LIST_OK: - char charNumber; - charNumber = msg.readByte(); - std::cout << "Character List:" << std::endl - << "---------------" << std::endl; - std::cout << int(charNumber) << " character(s) in the account." - << std::endl; - char charID; - for (unsigned int i = 0; i < charNumber; i++) - { - charID = msg.readByte(); - std::cout << int(charID) << ". " - << 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; - case CHAR_LIST_NOLOGIN: - std::cout << "Character List: Not logged in." - << std::endl; - break; - default: - case CHAR_LIST_UNKNOWN: - std::cout << "Character List: Unknown error." << std::endl; - break; - } - } - break; - - - default: - continue; - } // End switch MessageId + 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; + } break; + case SELECT_INVALID: + std::cout << "Character Selection: invalid ID." + << std::endl; + break; + case SELECT_NOLOGIN: + std::cout << "Character Selection: Not logged in." << std::endl; + break; + case SELECT_NO_CHARACTERS: + std::cout << "Character Selection: No character to select." << std::endl; + break; + case SELECT_NO_MAPS: + std::cout << "Character Selection: Can't load default map for character." + << std::endl; + break; + default: + case SELECT_UNKNOWN: + std::cout << "Character Selection: Unknown error." << std::endl; + break; + } + } break; - } // end if recLength > 2 (MessageLength > 2) + case SMSG_CHAR_LIST_RESPONSE: + { + switch (msg.readByte()) { + case CHAR_LIST_OK: + char charNumber; + charNumber = msg.readByte(); + std::cout << "Character List:" << std::endl + << "---------------" << std::endl; + std::cout << int(charNumber) << " character(s) in the account." + << std::endl; + char charID; + for (unsigned int i = 0; i < charNumber; i++) { + charID = msg.readByte(); + std::cout << int(charID) << ". " + << 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; + case CHAR_LIST_NOLOGIN: + std::cout << "Character List: Not logged in." + << std::endl; + break; + default: + case CHAR_LIST_UNKNOWN: + std::cout << "Character List: Unknown error." << std::endl; + break; + } + } break; - } // End running loop + default: + break; + } // end switch MessageId - SDLNet_TCP_Close(tcpsock); + } // end if recLength > 2 (MessageLength > 2) - return 0; } + |