diff options
Diffstat (limited to 'src/net/tmwa/charserverhandler.cpp')
-rw-r--r-- | src/net/tmwa/charserverhandler.cpp | 247 |
1 files changed, 11 insertions, 236 deletions
diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp index 229339ef4..2be2f1250 100644 --- a/src/net/tmwa/charserverhandler.cpp +++ b/src/net/tmwa/charserverhandler.cpp @@ -35,6 +35,9 @@ #include "net/ea/token.h" +#include "net/ea/charserverrecv.h" + +#include "net/tmwa/charserverrecv.h" #include "net/tmwa/gamehandler.h" #include "net/tmwa/loginhandler.h" #include "net/tmwa/messageout.h" @@ -87,35 +90,35 @@ void CharServerHandler::handleMessage(Net::MessageIn &msg) switch (msg.getId()) { case SMSG_CHAR_LOGIN: - processCharLogin(msg); + CharServerRecv::processCharLogin(msg); break; case SMSG_CHAR_LOGIN_ERROR: - processCharLoginError(msg); + Ea::CharServerRecv::processCharLoginError(msg); break; case SMSG_CHAR_CREATE_SUCCEEDED: - processCharCreate(msg); + CharServerRecv::processCharCreate(msg); break; case SMSG_CHAR_CREATE_FAILED: - processCharCreateFailed(msg); + Ea::CharServerRecv::processCharCreateFailed(msg); break; case SMSG_CHAR_DELETE_SUCCEEDED: - processCharDelete(msg); + Ea::CharServerRecv::processCharDelete(msg); break; case SMSG_CHAR_DELETE_FAILED: - processCharDeleteFailed(msg); + CharServerRecv::processCharDeleteFailed(msg); break; case SMSG_CHAR_MAP_INFO: - processCharMapInfo(msg); + CharServerRecv::processCharMapInfo(msg); break; case SMSG_CHANGE_MAP_SERVER: - processChangeMapServer(msg); + CharServerRecv::processChangeMapServer(msg); break; default: @@ -124,94 +127,6 @@ void CharServerHandler::handleMessage(Net::MessageIn &msg) BLOCK_END("CharServerHandler::handleMessage") } -void CharServerHandler::readPlayerData(Net::MessageIn &msg, - Net::Character *const character) const -{ - if (!character) - return; - - const Token &token = - static_cast<LoginHandler*>(loginHandler)->getToken(); - - LocalPlayer *const tempPlayer = new LocalPlayer( - msg.readBeingId("account id"), BeingTypeId_zero); - tempPlayer->setGender(token.sex); - - PlayerInfoBackend &data = character->data; - data.mAttributes[Attributes::EXP] = msg.readInt32("exp"); - data.mAttributes[Attributes::MONEY] = msg.readInt32("money"); - Stat &jobStat = data.mStats[Attributes::JOB]; - jobStat.exp = msg.readInt32("job"); - - const int temp = msg.readInt32("job level"); - jobStat.base = temp; - jobStat.mod = temp; - - const int shoes = msg.readInt16("shoes"); - const int gloves = msg.readInt16("gloves"); - const int cape = msg.readInt16("cape"); - const int misc1 = msg.readInt16("misc1"); - - msg.readInt32("option"); - tempPlayer->setKarma(msg.readInt32("karma")); - tempPlayer->setManner(msg.readInt32("manner")); - msg.readInt16("character points left"); - - data.mAttributes[Attributes::HP] = msg.readInt16("hp"); - data.mAttributes[Attributes::MAX_HP] = msg.readInt16("max hp"); - data.mAttributes[Attributes::MP] = msg.readInt16("mp"); - data.mAttributes[Attributes::MAX_MP] = msg.readInt16("max mp"); - - msg.readInt16("speed"); - const uint16_t race = msg.readInt16("class"); - const uint8_t hairStyle = msg.readUInt8("hair style"); - const uint16_t look = msg.readUInt8("look"); - tempPlayer->setSubtype(fromInt(race, BeingTypeId), look); - const uint16_t weapon = msg.readInt16("weapon"); - tempPlayer->setSprite(SPRITE_BODY, weapon, "", ItemColor_one, true); - - data.mAttributes[Attributes::LEVEL] = msg.readInt16("level"); - - msg.readInt16("skill point"); - const int bottomClothes = msg.readInt16("bottom clothes"); - const int shield = msg.readInt16("shield"); - - const int hat = msg.readInt16("hat"); - const int topClothes = msg.readInt16("top clothes"); - - const ItemColor hairColor = fromInt( - msg.readUInt8("hair color"), ItemColor); - msg.readUInt8("unused"); - tempPlayer->setSprite(SPRITE_HAIR_COLOR, hairStyle * -1, - ItemDB::get(-hairStyle).getDyeColorsString(hairColor)); - tempPlayer->setHairColor(hairColor); - - const int misc2 = msg.readInt16("misc2"); - tempPlayer->setName(msg.readString(24, "name")); - - character->dummy = tempPlayer; - - character->data.mStats[Attributes::STR].base = msg.readUInt8("str"); - character->data.mStats[Attributes::AGI].base = msg.readUInt8("agi"); - character->data.mStats[Attributes::VIT].base = msg.readUInt8("vit"); - character->data.mStats[Attributes::INT].base = msg.readUInt8("int"); - character->data.mStats[Attributes::DEX].base = msg.readUInt8("dex"); - character->data.mStats[Attributes::LUK].base = msg.readUInt8("luk"); - - tempPlayer->setSprite(SPRITE_HAIR, shoes); - tempPlayer->setSprite(SPRITE_SHOES, gloves); - tempPlayer->setSprite(SPRITE_SHIELD, cape); - tempPlayer->setSprite(SPRITE_HEAD_TOP, misc1); - tempPlayer->setSprite(SPRITE_WEAPON, bottomClothes); - tempPlayer->setSprite(SPRITE_FLOOR, shield); - tempPlayer->setSprite(SPRITE_CLOTHES_COLOR, hat); // head option top - tempPlayer->setSprite(SPRITE_HEAD_BOTTOM, topClothes); - tempPlayer->setSprite(SPRITE_HEAD_MID, misc2); - - character->slot = msg.readUInt8("slot"); - msg.readUInt8("unused"); -} - void CharServerHandler::chooseCharacter(Net::Character *const character) { if (!character) @@ -333,126 +248,6 @@ void CharServerHandler::setCharCreateDialog(CharCreateDialog *const window) mCharCreateDialog->setDefaultGender(token.sex); } -void CharServerHandler::processCharLogin(Net::MessageIn &msg) -{ - BLOCK_START("CharServerHandler::processCharLogin") - - msg.readInt16("len"); - const int slots = msg.readInt16("slots"); - if (slots > 0 && slots < 30) - loginData.characterSlots = static_cast<uint16_t>(slots); - - msg.skip(18, "unused"); - - delete_all(mCharacters); - mCharacters.clear(); - - // Derive number of characters from message length - const int count = (msg.getLength() - 24) / 106; - - for (int i = 0; i < count; ++i) - { - Net::Character *const character = new Net::Character; - readPlayerData(msg, character); - mCharacters.push_back(character); - if (character->dummy) - { - logger->log("CharServer: Player: %s (%d)", - character->dummy->getName().c_str(), character->slot); - } - } - - client->setState(STATE_CHAR_SELECT); - BLOCK_END("CharServerHandler::processCharLogin") -} - -void CharServerHandler::processCharMapInfo(Net::MessageIn &restrict msg) -{ - Network *const network = mNetwork; - ServerInfo &server = mapServer; - BLOCK_START("CharServerHandler::processCharMapInfo") - PlayerInfo::setCharId(msg.readInt32("char id?")); - GameHandler *const gh = static_cast<GameHandler*>(gameHandler); - gh->setMap(msg.readString(16, "map name")); - if (config.getBoolValue("usePersistentIP") || settings.persistentIp) - { - msg.readInt32("ip address"); - server.hostname = settings.serverName; - } - else - { - server.hostname = ipToString(msg.readInt32("ip address")); - } - server.port = msg.readInt16("port"); - - // Prevent the selected local player from being deleted - localPlayer = mSelectedCharacter->dummy; - PlayerInfo::setBackend(mSelectedCharacter->data); - - mSelectedCharacter->dummy = nullptr; - - charServerHandler->clear(); - updateCharSelectDialog(); - - if (network) - network->disconnect(); - client->setState(STATE_CONNECT_GAME); - BLOCK_END("CharServerHandler::processCharMapInfo") -} - -void CharServerHandler::processChangeMapServer(Net::MessageIn &msg) -{ - Network *const network = mNetwork; - ServerInfo &server = mapServer; - BLOCK_START("CharServerHandler::processChangeMapServer") - GameHandler *const gh = static_cast<GameHandler*>(gameHandler); - if (!gh || !network) - { - BLOCK_END("CharServerHandler::processChangeMapServer") - return; - } - gh->setMap(msg.readString(16, "map name")); - const int x = msg.readInt16("x"); - const int y = msg.readInt16("y"); - if (config.getBoolValue("usePersistentIP") || settings.persistentIp) - { - msg.readInt32("ip address"); - server.hostname = settings.serverName; - } - else - { - server.hostname = ipToString(msg.readInt32("ip address")); - } - server.port = msg.readInt16("port"); - - network->disconnect(); - client->setState(STATE_CHANGE_MAP); - if (localPlayer) - { - localPlayer->setTileCoords(x, y); - localPlayer->setMap(nullptr); - } - BLOCK_END("CharServerHandler::processChangeMapServer") -} - -void CharServerHandler::processCharCreate(Net::MessageIn &msg) -{ - BLOCK_START("CharServerHandler::processCharCreate") - Net::Character *const character = new Net::Character; - charServerHandler->readPlayerData(msg, character); - mCharacters.push_back(character); - - updateCharSelectDialog(); - - // Close the character create dialog - if (mCharCreateDialog) - { - mCharCreateDialog->scheduleDelete(); - mCharCreateDialog = nullptr; - } - BLOCK_END("CharServerHandler::processCharCreate") -} - void CharServerHandler::renameCharacter(const BeingId id A_UNUSED, const std::string &newName A_UNUSED) { @@ -463,26 +258,6 @@ void CharServerHandler::changeSlot(const int oldSlot A_UNUSED, { } -void CharServerHandler::processCharDeleteFailed(Net::MessageIn &msg) -{ - BLOCK_START("CharServerHandler::processCharDeleteFailed") - unlockCharSelectDialog(); - msg.readUInt8("error"); - CREATEWIDGET(OkDialog, - // TRANSLATORS: error header - _("Error"), - // TRANSLATORS: error message - _("Failed to delete character."), - // TRANSLATORS: ok dialog button - _("OK"), - DialogType::ERROR, - Modal_true, - ShowCenter_true, - nullptr, - 260); - BLOCK_END("CharServerHandler::processCharDeleteFailed") -} - void CharServerHandler::ping() const { } |