summaryrefslogtreecommitdiff
path: root/src/net
diff options
context:
space:
mode:
authorEugenio Favalli <elvenprogrammer@gmail.com>2006-08-14 08:36:16 +0000
committerEugenio Favalli <elvenprogrammer@gmail.com>2006-08-14 08:36:16 +0000
commitc79bf8c82f0a38b574b83be2484eb347852cd833 (patch)
treebf13ca5f0ff3f0413bab52f89ba95e705ffce745 /src/net
parent9e6862623370f53d1b78e4bd167152b840e28884 (diff)
downloadmana-client-c79bf8c82f0a38b574b83be2484eb347852cd833.tar.gz
mana-client-c79bf8c82f0a38b574b83be2484eb347852cd833.tar.bz2
mana-client-c79bf8c82f0a38b574b83be2484eb347852cd833.tar.xz
mana-client-c79bf8c82f0a38b574b83be2484eb347852cd833.zip
Completed porting of character creation/deletion, fixed some issues with network code.
Diffstat (limited to 'src/net')
-rw-r--r--src/net/buysellhandler.cpp2
-rw-r--r--src/net/charserverhandler.cpp216
-rw-r--r--src/net/loginhandler.cpp19
-rw-r--r--src/net/loginhandler.h3
-rw-r--r--src/net/messageout.cpp4
-rw-r--r--src/net/messageout.h4
-rw-r--r--src/net/network.cpp8
-rw-r--r--src/net/network.h5
-rw-r--r--src/net/playerhandler.cpp2
-rw-r--r--src/net/protocol.h14
10 files changed, 120 insertions, 157 deletions
diff --git a/src/net/buysellhandler.cpp b/src/net/buysellhandler.cpp
index be636d94..3b5fc87d 100644
--- a/src/net/buysellhandler.cpp
+++ b/src/net/buysellhandler.cpp
@@ -72,7 +72,7 @@ void BuySellHandler::handleMessage(MessageIn *msg)
msg->readShort(); // length
n_items = (msg->getLength() - 4) / 11;
buyDialog->reset();
- buyDialog->setMoney(player_node->mGp);
+ buyDialog->setMoney(player_node->mMoney);
buyDialog->setVisible(true);
for (int k = 0; k < n_items; k++)
diff --git a/src/net/charserverhandler.cpp b/src/net/charserverhandler.cpp
index 36a17acf..e41ca0f3 100644
--- a/src/net/charserverhandler.cpp
+++ b/src/net/charserverhandler.cpp
@@ -38,14 +38,9 @@
CharServerHandler::CharServerHandler()
{
static const Uint16 _messages[] = {
- 0x006b,
- 0x006c,
- 0x006d,
- 0x006e,
- 0x006f,
- 0x0070,
- 0x0071,
- 0x0081,
+ APMSG_CHAR_CREATE_RESPONSE,
+ APMSG_CHAR_DELETE_RESPONSE,
+ APMSG_CHAR_INFO,
0
};
handledMessages = _messages;
@@ -56,145 +51,114 @@ void CharServerHandler::handleMessage(MessageIn *msg)
int slot;
LocalPlayer *tempPlayer;
- logger->log("CharServerHandler: Packet ID: %x, Length: %d",
- msg->getId(), msg->getLength());
switch (msg->getId())
{
- case 0x006b:
- // Derive number of characters from message length
- n_character = (msg->getLength() - 24) / 106;
-
- for (int i = 0; i < n_character; i++)
+ case APMSG_CHAR_CREATE_RESPONSE:
+ int errMsg = msg->readByte();
+ // Character creation successful
+ if (errMsg == ERRMSG_OK)
{
- tempPlayer = readPlayerData(msg, slot);
- mCharInfo->select(slot);
- mCharInfo->setEntry(tempPlayer);
- logger->log("CharServer: Player: %s (%d)",
- tempPlayer->getName().c_str(), slot);
}
-
- state = CHAR_SELECT_STATE;
+ // Character creation failed
+ else
+ {
+ std::string message = "";
+ switch (errMsg)
+ {
+ case ERRMSG_NO_LOGIN:
+ message = "Not logged in";
+ break;
+ case CREATE_TOO_MUCH_CHARACTERS:
+ message = "No empty slot";
+ break;
+ case ERRMSG_INVALID_ARGUMENT:
+ message = "Invalid name";
+ break;
+ case CREATE_EXISTS_NAME:
+ message = "Character's name already exists";
+ break;
+ case CREATE_INVALID_HAIRSTYLE:
+ message = "Invalid hairstyle";
+ break;
+ case CREATE_INVALID_HAIRCOLOR:
+ message = "Invalid hair color";
+ break;
+ case CREATE_INVALID_GENDER:
+ message = "Invalid gender";
+ break;
+ case CREATE_RAW_STATS_TOO_HIGH:
+ message = "Character's stats are too high";
+ break;
+ case CREATE_RAW_STATS_TOO_LOW:
+ message = "Character's stats are too low";
+ break;
+ case CREATE_RAW_STATS_INVALID_DIFF:
+ message = "Character's stats difference is too high";
+ break;
+ case CREATE_RAW_STATS_EQUAL_TO_ZERO:
+ message = "One stat is zero";
+ break;
+ default:
+ message = "Unknown error";
+ break;
+ }
+ new OkDialog("Error", message);
+ }
break;
-
- case 0x006c:
- switch (msg->readByte()) {
- case 0:
- errorMessage = "Access denied";
- break;
- case 1:
- errorMessage = "Cannot use this ID";
- break;
- default:
- errorMessage = "Unknown failure to select character";
- break;
+ case APMSG_CHAR_DELETE_RESPONSE:
+ {
+ int errMsg = msg->readByte();
+ // Character deletion successful
+ if (errMsg == ERRMSG_OK)
+ {
+ delete mCharInfo->getEntry();
+ mCharInfo->setEntry(0);
+ mCharInfo->unlock();
+ n_character--;
+ new OkDialog("Info", "Player deleted");
}
- mCharInfo->unlock();
+ // Character deletion failed
+ else
+ {
+ std::string message = "";
+ switch (errMsg)
+ {
+ case ERRMSG_NO_LOGIN:
+ message = "Not logged in";
+ break;
+ case ERRMSG_INVALID_ARGUMENT:
+ message = "Selection out of range";
+ break;
+ default:
+ message = "Unknown error";
+ }
+ mCharInfo->unlock();
+ new OkDialog("Error", message);
+ }
+ }
break;
-
- case 0x006d:
+ case APMSG_CHAR_INFO:
tempPlayer = readPlayerData(msg, slot);
mCharInfo->unlock();
mCharInfo->select(slot);
mCharInfo->setEntry(tempPlayer);
n_character++;
break;
-
- case 0x006e:
- new OkDialog("Error", "Failed to create character");
- break;
-
- case 0x006f:
- delete mCharInfo->getEntry();
- mCharInfo->setEntry(0);
- mCharInfo->unlock();
- n_character--;
- new OkDialog("Info", "Player deleted");
- break;
-
- case 0x0070:
- mCharInfo->unlock();
- new OkDialog("Error", "Failed to delete character.");
- break;
-
- case 0x0071:
- player_node = mCharInfo->getEntry();
- map_path = msg->readString(16);
- mLoginData->hostname = iptostring(msg->readLong());
- mLoginData->port = msg->readShort();
- mCharInfo->unlock();
- mCharInfo->select(0);
- // Clear unselected players infos
- do
- {
- LocalPlayer *tmp = mCharInfo->getEntry();
- if (tmp != player_node)
- delete tmp;
- mCharInfo->next();
- } while (mCharInfo->getPos());
-
- state = CONNECTING_STATE;
- break;
-
- case 0x0081:
- switch (msg->readByte()) {
- case 1:
- errorMessage = "Map server offline";
- break;
- case 3:
- errorMessage = "Speed hack detected";
- break;
- case 8:
- errorMessage = "Duplicated login";
- break;
- default:
- errorMessage = "Unkown error with 0x0081";
- break;
- }
- mCharInfo->unlock();
- state = ERROR_STATE;
- break;
}
}
LocalPlayer* CharServerHandler::readPlayerData(MessageIn *msg, int &slot)
{
LocalPlayer *tempPlayer = new LocalPlayer(mLoginData->account_ID, 0, NULL);
- tempPlayer->mCharId = msg->readLong();
- tempPlayer->mTotalWeight = 0;
- tempPlayer->mMaxWeight = 0;
- tempPlayer->mLastAttackTime = 0;
- tempPlayer->mXp = msg->readLong();
- tempPlayer->mGp = msg->readLong();
- tempPlayer->mJobXp = msg->readLong();
- tempPlayer->mJobLevel = msg->readLong();
- msg->readLong(); // option
- msg->readLong(); // karma
- msg->readLong(); // manner
- tempPlayer->mHp = msg->readShort();
- tempPlayer->mMaxHp = msg->readShort();
- tempPlayer->mMp = msg->readShort();
- tempPlayer->mMaxMp = msg->readShort();
- msg->readShort(); // speed
- msg->readShort(); // class
- tempPlayer->setHairStyle(msg->readShort());
- Uint16 weapon = msg->readShort();
- if (weapon == 11)
- weapon = 2;
- tempPlayer->setWeapon(weapon);
- tempPlayer->mLevel = msg->readShort();
- msg->readShort(); // skill point
- tempPlayer->setVisibleEquipment(3, msg->readShort()); // head bottom
- msg->readShort(); // shield
- tempPlayer->setVisibleEquipment(4, msg->readShort()); // head option top
- tempPlayer->setVisibleEquipment(5, msg->readShort()); // head option mid
- tempPlayer->setHairColor(msg->readShort());
- msg->readShort(); // unknown
- tempPlayer->setName(msg->readString(24));
+ slot = msg->readByte(); // character slot
+ tempPlayer->mName = msg->readString();
+ tempPlayer->mSex = msg->readByte();
+ tempPlayer->setHairStyle(msg->readByte());
+ tempPlayer->setHairColor(msg->readByte());
+ tempPlayer->mLevel = msg->readByte();
+ tempPlayer->mMoney = msg->readShort();
for (int i = 0; i < 6; i++) {
tempPlayer->mAttr[i] = msg->readByte();
}
- slot = msg->readByte(); // character slot
- msg->readByte(); // unknown
-
return tempPlayer;
}
diff --git a/src/net/loginhandler.cpp b/src/net/loginhandler.cpp
index 324c33cd..27d8eed5 100644
--- a/src/net/loginhandler.cpp
+++ b/src/net/loginhandler.cpp
@@ -27,7 +27,6 @@
#include "network.h"
#include "protocol.h"
-#include "../localplayer.h"
#include "../log.h"
#include "../logindata.h"
#include "../main.h"
@@ -52,21 +51,6 @@ void LoginHandler::handleMessage(MessageIn *msg)
// Successful login
if (errMsg == ERRMSG_OK)
{
- unsigned char charNumber = msg->readByte();
- printf("Account has %i characters:\n", charNumber);
- for (unsigned int i = 0; i < charNumber; i++) {
- // Create a temp empty player to show up in character
- // selection dialog
- LocalPlayer *temp = new LocalPlayer(0, 0, 0);
- temp->setName(msg->readString());
- temp->setSex(msg->readByte());
- temp->setHairStyle(msg->readByte());
- temp->setHairColor(msg->readByte());
- temp->mLevel = msg->readByte();
- temp->mGp = msg->readShort();
- mCharInfo->select(i);
- mCharInfo->setEntry(temp);
- }
state = CHAR_SELECT_STATE;
}
// Login failed
@@ -102,7 +86,8 @@ void LoginHandler::handleMessage(MessageIn *msg)
state = ACCOUNT_STATE;
}
// Registration failed
- else {
+ else
+ {
switch (errMsg) {
case REGISTER_INVALID_VERSION:
errorMessage = "Client has an insufficient version number to login.";
diff --git a/src/net/loginhandler.h b/src/net/loginhandler.h
index 7d5d6f75..1b15b736 100644
--- a/src/net/loginhandler.h
+++ b/src/net/loginhandler.h
@@ -38,13 +38,10 @@ class LoginHandler : public MessageHandler
void handleMessage(MessageIn *msg);
- void setCharInfo(LockedArray<LocalPlayer*> *charInfo) { mCharInfo = charInfo; };
-
void setLoginData(LoginData *loginData) { mLoginData = loginData; };
protected:
LoginData *mLoginData;
- LockedArray<LocalPlayer*> *mCharInfo;
};
#endif
diff --git a/src/net/messageout.cpp b/src/net/messageout.cpp
index 5e8a5d72..7f5fadcb 100644
--- a/src/net/messageout.cpp
+++ b/src/net/messageout.cpp
@@ -104,13 +104,13 @@ MessageOut::writeString(const std::string &string, int length)
}
char*
-MessageOut::getData()
+MessageOut::getData() const
{
return mData;
}
unsigned int
-MessageOut::getDataSize()
+MessageOut::getDataSize() const
{
return mDataSize;
}
diff --git a/src/net/messageout.h b/src/net/messageout.h
index 8431d887..22754f60 100644
--- a/src/net/messageout.h
+++ b/src/net/messageout.h
@@ -55,12 +55,12 @@ class MessageOut
/**
* Returns the content of the message.
*/
- char *getData();
+ char *getData() const;
/**
* Returns the length of the data.
*/
- unsigned int getDataSize();
+ unsigned int getDataSize() const;
private:
/**
diff --git a/src/net/network.cpp b/src/net/network.cpp
index dcfbc8f1..39a632a2 100644
--- a/src/net/network.cpp
+++ b/src/net/network.cpp
@@ -29,6 +29,8 @@
#include "../log.h"
+Network *network;
+
Network::Network():
mClient(0), mServer(0),
mAddress(), mPort(0),
@@ -216,7 +218,7 @@ void Network::flush()
}
}
-void Network::send(MessageOut *msg)
+void Network::send(const MessageOut &msg)
{
if (mState == IDLE || mState == NET_ERROR)
{
@@ -225,8 +227,8 @@ void Network::send(MessageOut *msg)
return;
}
- ENetPacket *packet = enet_packet_create(msg->getData(),
- msg->getDataSize(),
+ ENetPacket *packet = enet_packet_create(msg.getData(),
+ msg.getDataSize(),
ENET_PACKET_FLAG_RELIABLE);
mOutgoingPackets.push(packet);
}
diff --git a/src/net/network.h b/src/net/network.h
index 50ee9af7..f91c926b 100644
--- a/src/net/network.h
+++ b/src/net/network.h
@@ -59,7 +59,7 @@ class Network
void dispatchMessages();
void flush();
- void send(MessageOut *msg);
+ void send(const MessageOut &msg);
enum State {
IDLE,
@@ -96,4 +96,7 @@ class Network
/** Convert an address from int format to string */
char *iptostring(int address);
+// TODO: remove this global, just a temp solution.
+extern Network *network;
+
#endif
diff --git a/src/net/playerhandler.cpp b/src/net/playerhandler.cpp
index c70eada3..d8ff81f4 100644
--- a/src/net/playerhandler.cpp
+++ b/src/net/playerhandler.cpp
@@ -177,7 +177,7 @@ void PlayerHandler::handleMessage(MessageIn *msg)
player_node->mJobXp = msg->readLong();
break;
case 0x0014:
- player_node->mGp = msg->readLong();
+ player_node->mMoney = msg->readLong();
break;
case 0x0016:
player_node->mXpForNextLevel = msg->readLong();
diff --git a/src/net/protocol.h b/src/net/protocol.h
index 6db3762e..528b2fd5 100644
--- a/src/net/protocol.h
+++ b/src/net/protocol.h
@@ -128,7 +128,7 @@ enum {
APMSG_CHAR_CREATE_RESPONSE = 0x0021, // B error
PAMSG_CHAR_DELETE = 0x0022, // B index
APMSG_CHAR_DELETE_RESPONSE = 0x0023, // B error
- PAMSG_CHAR_LIST = 0x0024, // -
+ 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
@@ -207,6 +207,18 @@ enum {
REGISTER_EXISTS_EMAIL // there already is an account with this email address
};
+// Character creation specific return values
+enum {
+ CREATE_INVALID_HAIRSTYLE = 0x40,
+ CREATE_INVALID_HAIRCOLOR,
+ CREATE_INVALID_GENDER,
+ CREATE_RAW_STATS_TOO_HIGH,
+ CREATE_RAW_STATS_TOO_LOW,
+ CREATE_RAW_STATS_INVALID_DIFF,
+ CREATE_RAW_STATS_EQUAL_TO_ZERO,
+ CREATE_EXISTS_NAME,
+ CREATE_TOO_MUCH_CHARACTERS
+};
/** Encodes coords and direction in 3 bytes data */
void set_coordinates(char *data, unsigned short x, unsigned short y, unsigned char direction);