diff options
Diffstat (limited to 'src/net/eathena/playerhandler.cpp')
-rw-r--r-- | src/net/eathena/playerhandler.cpp | 442 |
1 files changed, 31 insertions, 411 deletions
diff --git a/src/net/eathena/playerhandler.cpp b/src/net/eathena/playerhandler.cpp index 2988bf21b..4779cee4b 100644 --- a/src/net/eathena/playerhandler.cpp +++ b/src/net/eathena/playerhandler.cpp @@ -39,7 +39,10 @@ #include "input/inputmanager.h" +#include "net/ea/playerrecv.h" + #include "net/eathena/messageout.h" +#include "net/eathena/playerrecv.h" #include "net/eathena/protocol.h" #include "net/eathena/inventoryhandler.h" @@ -97,116 +100,116 @@ void PlayerHandler::handleMessage(Net::MessageIn &msg) switch (msg.getId()) { case SMSG_WALK_RESPONSE: - processWalkResponse(msg); + PlayerRecv::processWalkResponse(msg); break; case SMSG_PLAYER_WARP: - processPlayerWarp(msg); + Ea::PlayerRecv::processPlayerWarp(msg); break; case SMSG_PLAYER_STAT_UPDATE_1: - processPlayerStatUpdate1(msg); + Ea::PlayerRecv::processPlayerStatUpdate1(msg); break; case SMSG_PLAYER_STAT_UPDATE_2: - processPlayerStatUpdate2(msg); + Ea::PlayerRecv::processPlayerStatUpdate2(msg); break; case SMSG_PLAYER_STAT_UPDATE_3: // Update a base attribute - processPlayerStatUpdate3(msg); + Ea::PlayerRecv::processPlayerStatUpdate3(msg); break; case SMSG_PLAYER_STAT_UPDATE_4: // Attribute increase ack - processPlayerStatUpdate4(msg); + Ea::PlayerRecv::processPlayerStatUpdate4(msg); break; // Updates stats and status points case SMSG_PLAYER_STAT_UPDATE_5: - processPlayerStatUpdate5(msg); + PlayerRecv::processPlayerStatUpdate5(msg); break; case SMSG_PLAYER_STAT_UPDATE_6: - processPlayerStatUpdate6(msg); + Ea::PlayerRecv::processPlayerStatUpdate6(msg); break; case SMSG_PLAYER_ARROW_MESSAGE: - processPlayerArrowMessage(msg); + Ea::PlayerRecv::processPlayerArrowMessage(msg); break; case SMSG_PLAYER_SHORTCUTS: - processPlayerShortcuts(msg); + PlayerRecv::processPlayerShortcuts(msg); break; case SMSG_PLAYER_SHOW_EQUIP: - processPlayerShowEquip(msg); + PlayerRecv::processPlayerShowEquip(msg); break; case SMSG_PLAYER_GET_EXP: - processPlayerGetExp(msg); + PlayerRecv::processPlayerGetExp(msg); break; case SMSG_PVP_INFO: - processPvpInfo(msg); + PlayerRecv::processPvpInfo(msg); break; case SMSG_PLAYER_HEAL: - processPlayerHeal(msg); + PlayerRecv::processPlayerHeal(msg); break; case SMSG_PLAYER_SKILL_MESSAGE: - processPlayerSkillMessage(msg); + PlayerRecv::processPlayerSkillMessage(msg); break; case SMSG_MAP_MASK: - processMapMask(msg); + PlayerRecv::processMapMask(msg); break; case SMSG_MAP_MUSIC: - processMapMusic(msg); + Ea::PlayerRecv::processMapMusic(msg); break; case SMSG_ONLINE_LIST: - processOnlineList(msg); + PlayerRecv::processOnlineList(msg); break; case SMSG_PLAYER_NOTIFY_MAPINFO: - processNotifyMapInfo(msg); + PlayerRecv::processNotifyMapInfo(msg); break; case SMSG_PLAYER_FAME_BLACKSMITH: - processPlayerFameBlacksmith(msg); + PlayerRecv::processPlayerFameBlacksmith(msg); break; case SMSG_PLAYER_FAME_ALCHEMIST: - processPlayerFameAlchemist(msg); + PlayerRecv::processPlayerFameAlchemist(msg); break; case SMSG_PLAYER_UPGRADE_MESSAGE: - processPlayerUpgradeMessage(msg); + PlayerRecv::processPlayerUpgradeMessage(msg); break; case SMSG_PLAYER_FAME_TAEKWON: - processPlayerFameTaekwon(msg); + PlayerRecv::processPlayerFameTaekwon(msg); break; case SMSG_PLAYER_READ_BOOK: - processPlayerReadBook(msg); + PlayerRecv::processPlayerReadBook(msg); break; case SMSG_PLAYER_EQUIP_TICK_ACK: - processPlayerEquipTickAck(msg); + PlayerRecv::processPlayerEquipTickAck(msg); break; case SMSG_AUTOSHADOW_SPELL_LIST: - processPlayerAutoShadowSpellList(msg); + PlayerRecv::processPlayerAutoShadowSpellList(msg); break; case SMSG_PLAYER_RANK_POINTS: - processPlayerRankPoints(msg); + PlayerRecv::processPlayerRankPoints(msg); break; case SMSG_PLAYER_CLIENT_COMMAND: - processPlayerClientCommand(msg); + PlayerRecv::processPlayerClientCommand(msg); break; default: @@ -358,175 +361,6 @@ void PlayerHandler::setMemo() const createOutPacket(CMSG_PLAYER_SET_MEMO); } -void PlayerHandler::processPlayerShortcuts(Net::MessageIn &msg) -{ - // +++ player shortcuts ignored. It also disabled on server side. - // may be in future better use it? - msg.readUInt8("unused?"); - for (int f = 0; f < 27; f ++) - { - msg.readUInt8("type 0: item, 1: skill"); - msg.readInt32("item or skill id"); - msg.readInt16("skill level"); - } - msg.skip(77, "unused"); -} - -void PlayerHandler::processPlayerShowEquip(Net::MessageIn &msg) -{ - // +++ for now server allow only switch this option but not using it. - msg.readUInt8("show equip"); // 1 mean need open "equipment" window -} - -void PlayerHandler::processPlayerStatUpdate5(Net::MessageIn &msg) -{ - BLOCK_START("PlayerHandler::processPlayerStatUpdate5") - PlayerInfo::setAttribute(Attributes::CHAR_POINTS, - msg.readInt16("char points")); - - unsigned int val = msg.readUInt8("str"); - PlayerInfo::setStatBase(Attributes::STR, val); - if (statusWindow) - { - statusWindow->setPointsNeeded(Attributes::STR, - msg.readUInt8("str cost")); - } - else - { - msg.readUInt8("str need"); - } - - val = msg.readUInt8("agi"); - PlayerInfo::setStatBase(Attributes::AGI, val); - if (statusWindow) - { - statusWindow->setPointsNeeded(Attributes::AGI, - msg.readUInt8("agi cost")); - } - else - { - msg.readUInt8("agi cost"); - } - - val = msg.readUInt8("vit"); - PlayerInfo::setStatBase(Attributes::VIT, val); - if (statusWindow) - { - statusWindow->setPointsNeeded(Attributes::VIT, - msg.readUInt8("vit cost")); - } - else - { - msg.readUInt8("vit cost"); - } - - val = msg.readUInt8("int"); - PlayerInfo::setStatBase(Attributes::INT, val); - if (statusWindow) - { - statusWindow->setPointsNeeded(Attributes::INT, - msg.readUInt8("int cost")); - } - else - { - msg.readUInt8("int cost"); - } - - val = msg.readUInt8("dex"); - PlayerInfo::setStatBase(Attributes::DEX, val); - if (statusWindow) - { - statusWindow->setPointsNeeded(Attributes::DEX, - msg.readUInt8("dex cost")); - } - else - { - msg.readUInt8("dex cost"); - } - - val = msg.readUInt8("luk"); - PlayerInfo::setStatBase(Attributes::LUK, val); - if (statusWindow) - { - statusWindow->setPointsNeeded(Attributes::LUK, - msg.readUInt8("luk cost")); - } - else - { - msg.readUInt8("luk cost"); - } - - PlayerInfo::setStatBase(Attributes::ATK, - msg.readInt16("left atk"), Notify_false); - PlayerInfo::setStatMod(Attributes::ATK, msg.readInt16("right atk")); - PlayerInfo::updateAttrs(); - - val = msg.readInt16("right matk"); - PlayerInfo::setStatBase(Attributes::MATK, val, Notify_false); - - val = msg.readInt16("left matk"); - PlayerInfo::setStatMod(Attributes::MATK, val); - - PlayerInfo::setStatBase(Attributes::DEF, - msg.readInt16("left def"), Notify_false); - PlayerInfo::setStatMod(Attributes::DEF, msg.readInt16("right def")); - - PlayerInfo::setStatBase(Attributes::MDEF, - msg.readInt16("left mdef"), Notify_false); - PlayerInfo::setStatMod(Attributes::MDEF, msg.readInt16("right mdef")); - - PlayerInfo::setStatBase(Attributes::HIT, msg.readInt16("hit")); - - PlayerInfo::setStatBase(Attributes::FLEE, - msg.readInt16("flee"), Notify_false); - PlayerInfo::setStatMod(Attributes::FLEE, msg.readInt16("flee2/10")); - - PlayerInfo::setStatBase(Attributes::CRIT, msg.readInt16("crit/10")); - - PlayerInfo::setAttribute(Attributes::ATTACK_DELAY, - msg.readInt16("attack speed")); - msg.readInt16("plus speed = 0"); - - BLOCK_END("PlayerHandler::processPlayerStatUpdate5") -} - -void PlayerHandler::processPlayerGetExp(Net::MessageIn &msg) -{ - if (!localPlayer) - return; - const BeingId id = msg.readBeingId("player id"); - const int exp = msg.readInt32("exp amount"); - const int stat = msg.readInt16("exp type"); - const bool fromQuest = msg.readInt16("is from quest"); - if (!fromQuest && id == localPlayer->getId()) - { - if (stat == 1) - localPlayer->addXpMessage(exp); - else if (stat == 2) - localPlayer->addJobMessage(exp); - else - UNIMPLIMENTEDPACKET; - } - // need show particle depend on isQuest flag, for now ignored -} - -void PlayerHandler::processWalkResponse(Net::MessageIn &msg) -{ - BLOCK_START("PlayerHandler::processWalkResponse") - /* - * This client assumes that all walk messages succeed, - * and that the server will send a correction notice - * otherwise. - */ - uint16_t srcX, srcY, dstX, dstY; - msg.readInt32("tick"); - msg.readCoordinatePair(srcX, srcY, dstX, dstY, "move path"); - msg.readUInt8("(sx<<4) | (sy&0x0f)"); - if (localPlayer) - localPlayer->setRealPos(dstX, dstY); - BLOCK_END("PlayerHandler::processWalkResponse") -} - void PlayerHandler::doriDori() const { createOutPacket(CMSG_DORI_DORI); @@ -544,16 +378,6 @@ void PlayerHandler::requestPvpInfo() const outMsg.writeInt32(0, "account id"); } -void PlayerHandler::processPvpInfo(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt32("char id"); - msg.readBeingId("account id"); - msg.readInt32("pvp won"); - msg.readInt32("pvp lost"); - msg.readInt32("pvp point"); -} - void PlayerHandler::revive() const { createOutPacket(CMSG_PLAYER_AUTO_REVIVE); @@ -566,63 +390,6 @@ void PlayerHandler::setViewEquipment(const bool allow) const outMsg.writeInt32(allow ? 1 : 0, "allow"); } -void PlayerHandler::processPlayerHeal(Net::MessageIn &msg) -{ - if (!localPlayer) - return; - - const int type = msg.readInt16("var id"); - const int amount = msg.readInt16("value"); - if (type == 5) - localPlayer->addHpMessage(amount); - else if (type == 7) - localPlayer->addSpMessage(amount); -} - -void PlayerHandler::processPlayerSkillMessage(Net::MessageIn &msg) -{ - const int message = msg.readInt32("type"); - switch (message) - { - case 0x15: - NotifyManager::notify(NotifyTypes::SKILL_END_ALL_NEGATIVE_STATUS); - break; - case 0x16: - NotifyManager::notify(NotifyTypes::SKILL_IMMUNITY_TO_ALL_STATUSES); - break; - case 0x17: - NotifyManager::notify(NotifyTypes::SKILL_MAX_HP); - break; - case 0x18: - NotifyManager::notify(NotifyTypes::SKILL_MAX_SP); - break; - case 0x19: - NotifyManager::notify(NotifyTypes::SKILL_ALL_STATUS_PLUS_20); - break; - case 0x1c: - NotifyManager::notify(NotifyTypes::SKILL_ENCHANT_WEAPON_HOLY); - break; - case 0x1d: - NotifyManager::notify(NotifyTypes::SKILL_ENCHANT_ARMOR_HOLY); - break; - case 0x1e: - NotifyManager::notify(NotifyTypes::SKILL_DEF_PLUS_25); - break; - case 0x1f: - NotifyManager::notify(NotifyTypes::SKILL_ATTACK_PLUS_100); - break; - case 0x20: - NotifyManager::notify(NotifyTypes::SKILL_FLEE_PLUS_50); - break; - case 0x28: - NotifyManager::notify(NotifyTypes::SKILL_FULL_STRIP_FAILED); - break; - default: - NotifyManager::notify(NotifyTypes::SKILL_MESSAGE_UNKNOWN); - break; - } -} - void PlayerHandler::setStat(Net::MessageIn &msg, const int type, const int base, @@ -632,151 +399,4 @@ void PlayerHandler::setStat(Net::MessageIn &msg, Ea::PlayerHandler::setStat(msg, type, base, mod, notify); } -void PlayerHandler::processNotifyMapInfo(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt16("type"); -} - -void PlayerHandler::processPlayerFameBlacksmith(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt32("points"); - msg.readInt32("total points"); -} - -void PlayerHandler::processPlayerFameAlchemist(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt32("points"); - msg.readInt32("total points"); -} - -void PlayerHandler::processPlayerUpgradeMessage(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt32("result"); - msg.readInt16("item id"); -} - -void PlayerHandler::processPlayerFameTaekwon(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt32("points"); - msg.readInt32("total points"); -} - -void PlayerHandler::processPlayerReadBook(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt32("book id"); - msg.readInt32("page"); -} - -void PlayerHandler::processPlayerEquipTickAck(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt32("unused"); - msg.readInt32("flag"); -} - -void PlayerHandler::processPlayerAutoShadowSpellList(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - const int count = (msg.readInt16("len") - 8) / 2; - for (int f = 0; f < count; f ++) - msg.readInt16("skill id"); -} - -void PlayerHandler::processPlayerRankPoints(Net::MessageIn &msg) -{ - UNIMPLIMENTEDPACKET; - msg.readInt16("type"); - msg.readInt32("points"); - msg.readInt32("fame"); -} - -void PlayerHandler::processPlayerClientCommand(Net::MessageIn &msg) -{ - const int sz = msg.readInt16("len") - 4; - std::string command = msg.readString(sz, "command"); - std::string cmd; - std::string args; - - if (!parse2Str(command, cmd, args)) - { - cmd = command; - args.clear(); - } - inputManager.executeChatCommand(cmd, args, nullptr); -} - -void PlayerHandler::processOnlineList(Net::MessageIn &msg) -{ - if (!whoIsOnline) - return; - - BLOCK_START("PlayerHandler::processOnlineList") - const int size = msg.readInt16("len") - 4; - std::vector<OnlinePlayer*> arr; - - if (!size) - { - if (whoIsOnline) - whoIsOnline->loadList(arr); - BLOCK_END("PlayerHandler::processOnlineList") - return; - } - - char *const start = reinterpret_cast<char*>(msg.readBytes(size, "nicks")); - if (!start) - { - BLOCK_END("PlayerHandler::processOnlineList") - return; - } - - const char *buf = start; - - int addVal = 3; - - while (buf - start + 1 < size - && *(buf + static_cast<size_t>(addVal))) - { - unsigned char status = *buf; - buf ++; - unsigned char level = *buf; - buf ++; - unsigned char ver = *buf; - buf ++; - - GenderT gender = Gender::UNSPECIFIED; - if (config.getBoolValue("showgender")) - { - if (status & BeingFlag::GENDER_MALE) - gender = Gender::MALE; - else if (status & BeingFlag::GENDER_OTHER) - gender = Gender::OTHER; - else - gender = Gender::FEMALE; - } - arr.push_back(new OnlinePlayer(static_cast<const char*>(buf), - status, level, gender, ver)); - buf += strlen(buf) + 1; - } - - if (whoIsOnline) - whoIsOnline->loadList(arr); - delete [] start; - BLOCK_END("PlayerHandler::processOnlineList") -} - -void PlayerHandler::processMapMask(Net::MessageIn &msg) -{ - const int mask = msg.readInt32("mask"); - msg.readInt32("unused"); - Map *const map = Game::instance()->getCurrentMap(); - if (map) - map->setMask(mask); -} - } // namespace EAthena |