summaryrefslogtreecommitdiff
path: root/src/net/charserverhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/charserverhandler.cpp')
-rw-r--r--src/net/charserverhandler.cpp216
1 files changed, 90 insertions, 126 deletions
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;
}