summaryrefslogtreecommitdiff
path: root/src/client.cpp
diff options
context:
space:
mode:
authorYohann Ferreira <bertram@cegetel.net>2006-01-04 21:06:07 +0000
committerYohann Ferreira <bertram@cegetel.net>2006-01-04 21:06:07 +0000
commit0417f123f1975202900ed0b3ec1bb8362f9f1567 (patch)
tree5d51c3478b0921184a950ae5847627b3f96b05ab /src/client.cpp
parent65c5f32f9622583bd158d3baa52056cb3b7be4f6 (diff)
downloadmanaserv-0417f123f1975202900ed0b3ec1bb8362f9f1567.tar.gz
manaserv-0417f123f1975202900ed0b3ec1bb8362f9f1567.tar.bz2
manaserv-0417f123f1975202900ed0b3ec1bb8362f9f1567.tar.xz
manaserv-0417f123f1975202900ed0b3ec1bb8362f9f1567.zip
Implemented server response handling to the test client. Fixed a bug that made the Email change not possible. Changed some protocol value to have a litte neater client code. Added FreeBSD fix idea from icy to server code.
Diffstat (limited to 'src/client.cpp')
-rw-r--r--src/client.cpp418
1 files changed, 365 insertions, 53 deletions
diff --git a/src/client.cpp b/src/client.cpp
index b7f59658..713e429a 100644
--- a/src/client.cpp
+++ b/src/client.cpp
@@ -4,12 +4,13 @@
#include <iostream>
#include "defines.h"
#include "messageout.h"
+#include "messagein.h"
int main(int argc, char *argv[])
{
// Initialize SDL
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1) {
- printf("SDL_Init: %s\n", SDL_GetError());
+ std::cout << "SDL_Init: " << SDL_GetError() << std::endl;
exit(1);
}
@@ -18,7 +19,7 @@ int main(int argc, char *argv[])
// Initialize SDL_net
if (SDLNet_Init() == -1) {
- printf("SDLNet_Init: %s\n", SDLNet_GetError());
+ std::cout << "SDLNet_Init: " << SDLNet_GetError() << std::endl;
exit(2);
}
@@ -27,17 +28,17 @@ int main(int argc, char *argv[])
TCPsocket tcpsock;
if (SDLNet_ResolveHost(&ip, "localhost", 9601) == -1) {
- printf("SDLNet_ResolveHost: %s\n", SDLNet_GetError());
+ std::cout << "SDLNet_ResolveHost: " << SDLNet_GetError() << std::endl;
exit(1);
}
tcpsock = SDLNet_TCP_Open(&ip);
if (!tcpsock) {
- printf("SDLNet_TCP_Open: %s\n", SDLNet_GetError());
+ std::cout << "SDLNet_TCP_Open: " << SDLNet_GetError() << std::endl;
exit(2);
}
- printf("Successfully connected!\n");
+ std::cout << "Successfully connected!" << std::endl;
int answer = 1;
char line[256] = "";
@@ -47,33 +48,29 @@ int main(int argc, char *argv[])
bool responseRequired = true;
MessageOut msg;
- printf ("0) Quit\n");
- printf ("1) Register\n");
- printf ("2) Unregister\n");
- printf ("3) Login\n");
- printf ("4) Logout\n");
- printf ("5) Chat\n");
- printf ("6) Create character\n");
- printf ("7) Character selection\n");
- printf ("8) Delete Character\n");
- printf ("9) List Characters\n");
- printf ("10) Move Character\n");
- printf ("11) Equip Item\n");
- printf ("12) Ruby Expression\n");
- printf ("Choose your option: ");
+ 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);
- printf("Account name: ", line);
+ std::cout << "Account name: ";
std::cin >> line;
msg.writeString(line);
- printf("Password: ", line);
+ std::cout <<"Password: ";
std::cin >> line;
msg.writeString(line);
- printf("Email address: ", line);
+ std::cout << "Email address: ";
std::cin >> line;
msg.writeString(line);
break;
@@ -81,10 +78,10 @@ int main(int argc, char *argv[])
case 2:
// Unregister (deleting an account)
msg.writeShort(CMSG_UNREGISTER);
- printf("Account name: ", line);
+ std::cout << "Account name: ";
std::cin >> line;
msg.writeString(line);
- printf("Password: ", line);
+ std::cout << "Password: ";
std::cin >> line;
msg.writeString(line);
break;
@@ -92,10 +89,10 @@ int main(int argc, char *argv[])
case 3:
// Login
msg.writeShort(CMSG_LOGIN);
- printf("Account name: ", line);
+ std::cout << "Account name: ";
std::cin >> line;
msg.writeString(line);
- printf("Password: ", line);
+ std::cout << "Password: ";
std::cin >> line;
msg.writeString(line);
break;
@@ -107,51 +104,67 @@ int main(int argc, char *argv[])
break;
case 5:
- // Chat
- msg.writeShort(CMSG_SAY);
- printf("\nChat: ", line);
+ // 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);
- msg.writeShort(0);
- responseRequired = false;
break;
case 6:
+ // Change Email
+ msg.writeShort(CMSG_EMAIL_CHANGE);
+ std::cout << "New Email: ";
+ std::cin >> line;
+ msg.writeString(line);
+ break;
+
+ case 7:
+ // Get current Account's Email value
+ msg.writeShort(CMSG_EMAIL_GET);
+ break;
+
+ case 8:
{
// Create character
msg.writeShort(CMSG_CHAR_CREATE);
- printf("\nName: ");
+ std::cout << "Name: ";
std::cin >> line;
msg.writeString(line);
msg.writeByte(0);
} break;
- case 7:
+ case 9:
{
// Select character
msg.writeShort(CMSG_CHAR_SELECT);
- printf("\nCharacter ID: ");
+ std::cout << "Character ID: ";
std::cin >> line;
msg.writeByte(atoi(line));
} break;
- case 8:
+ case 10:
{
// Delete character
msg.writeShort(CMSG_CHAR_DELETE);
- printf("\nCharacter ID: ");
+ std::cout << "Character ID: ";
std::cin >> line;
msg.writeByte(atoi(line));
} break;
- case 9:
+ case 11:
{
// List characters
msg.writeShort(CMSG_CHAR_LIST);
- std::cout <<"Character List:" << std::endl;
} break;
- case 10:
+ case 12:
{
// Move character
long x, y;
@@ -167,7 +180,17 @@ int main(int argc, char *argv[])
responseRequired = false;
} break;
- case 11:
+ 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;
@@ -181,7 +204,7 @@ int main(int argc, char *argv[])
msg.writeByte(slot);
} break;
- case 12:
+ case 15:
{
std::cout << "Expr: ";
std::cin >> line;
@@ -194,32 +217,321 @@ int main(int argc, char *argv[])
default:
continue;
}
- printf("\n");
-
+ std::cout << "Sent: " << std::endl;
+
// Message hex
for (unsigned int i = 0; i < msg.getPacket()->length; i++) {
- printf("%x ", msg.getPacket()->data[i]);
+ std::cout << int(msg.getPacket()->data[i]) << " ";
}
- printf("\n\n");
+ std::cout << std::endl;
SDLNet_TCP_Send(tcpsock, msg.getPacket()->data,
msg.getPacket()->length);
+ // Raw Datas
+ char data[1024];
+ int recvLength = SDLNet_TCP_Recv(tcpsock, data, 1024);
+
if (responseRequired) {
- char data[1024];
- int recvLength = SDLNet_TCP_Recv(tcpsock, data, 1024);
- printf("Received:\n");
+ std::cout << "Received: ";
if (recvLength != -1) {
for (unsigned int i = 0; i < recvLength; i++) {
- printf("%x ", data[i]);
+ std::cout << int(data[i]) << " ";
}
} else {
- printf("ERROR!");
+ std::cout << "ERROR!" << std::endl;
}
- printf("\n\n");
+ std::cout << std::endl;
}
- }
-
+
+ // 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;
+ break;
+ 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;
+ break;
+ case REGISTER_INVALID_EMAIL:
+ std::cout << "Account registering: Invalid Email." << std::endl;
+ break;
+ 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;
+ break;
+ }
+ break;
+
+ 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;
+ break;
+ 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;
+ 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;
+ break;
+ case LOGIN_INVALID_USERNAME:
+ std::cout << "Login: Invalid Username." << std::endl;
+ break;
+ case LOGIN_INVALID_PASSWORD:
+ std::cout << "Login: Invalid Password." << std::endl;
+ break;
+ case LOGIN_INVALID_VERSION:
+ std::cout << "TODO:Login: Invalid Version." << std::endl;
+ break;
+ case LOGIN_ALREADY_LOGGED:
+ std::cout << "Login: Already logged with another account." << std::endl;
+ break;
+ case LOGIN_SERVER_FULL:
+ std::cout << "TODO:Login: Server has reached maximum of clients." << std::endl;
+ break;
+ 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;
+ break;
+ 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;
+ default:
+ 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;
+ }
+ }
+ break;
+
+ case SMSG_EMAIL_CHANGE_RESPONSE:
+ {
+ switch (msg.readByte())
+ {
+ case EMAILCHG_OK:
+ std::cout << "Email correctly changed." << std::endl;
+ break;
+ default:
+ 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;
+ }
+ }
+ break;
+
+ case SMSG_EMAIL_GET_RESPONSE:
+ {
+ switch (msg.readByte())
+ {
+ case EMAILGET_OK:
+ std::cout << "Current Email: " << msg.readString() << std::endl;
+ break;
+ default:
+ case EMAILGET_NOLOGIN:
+ std::cout << "Email change: Not logged in." << 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_HAIR:
+ std::cout << "Character Creation: Invalid Hair Value." << std::endl;
+ break;
+ case CREATE_INVALID_NAME:
+ std::cout << "Character Creation: Invalid Name." << std::endl;
+ break;
+ case CREATE_INVALID_SEX:
+ std::cout << "Character Creation: Invalid Sex value." << std::endl;
+ break;
+ case CREATE_INVALID_RAW_STATS:
+ std::cout << "TODO: Character Creation: Invalid Raw Stats." << 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_NAME:
+ std::cout << "Character Deletion: Character's name 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 Creation: No more characters." << std::endl;
+ break;
+ }
+ }
+ break;
+
+ case SMSG_CHAR_SELECT_RESPONSE:
+ {
+ switch (msg.readByte())
+ {
+ case SELECT_OK:
+ std::cout << "Character selected." << 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_NOT_YET_CHARACTERS:
+ std::cout << "Character Selection: No character to select." << std::endl;
+ break;
+ }
+ }
+ break;
+
+ 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) << " characters in the account."
+ << std::endl;
+ for (unsigned int i = 0; i < charNumber; i++)
+ {
+ std::cout << msg.readString() << ":" << std::endl;
+ std::cout << "Gender: " << int(msg.readByte()) << ", ";
+ std::cout << "Level: " << int(msg.readByte()) << ", ";
+ std::cout << "Money: " << int(msg.readByte()) << ", "
+ << std::endl;
+ std::cout << "Strength: " << int(msg.readByte()) << ", ";
+ std::cout << "Agility: " << int(msg.readByte()) << ", ";
+ std::cout << "Vitality: " << int(msg.readByte()) << ", "
+ << std::endl;
+ std::cout << "Intelligence: " << int(msg.readByte()) << ", ";
+ std::cout << "Dexterity: " << int(msg.readByte()) << ", ";
+ std::cout << "Luck: " << int(msg.readByte()) << ", "
+ << std::endl << std::endl;
+ }
+ break;
+ case CHAR_LIST_NOLOGIN:
+ std::cout << "Character List: Not logged in."
+ << std::endl;
+ break;
+ }
+ }
+ break;
+
+
+ default:
+ continue;
+ } // End switch MessageId
+
+ } // end if recLength > 2 (MessageLength > 2)
+
+
+ } // End running loop
+
SDLNet_TCP_Close(tcpsock);
return 0;