diff options
author | Andrei Karas <akaras@inbox.ru> | 2014-09-10 13:12:47 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2014-09-10 13:12:47 +0300 |
commit | dfe0fc16bfbe2f2c36d2adad884c28f89625c285 (patch) | |
tree | d4c7420f490198f51344201f5eced24f0f8cf513 /src/net/eathena/beinghandler.cpp | |
parent | 173c48498dc55e9b86bee009427fb5ae58cd9821 (diff) | |
download | plus-dfe0fc16bfbe2f2c36d2adad884c28f89625c285.tar.gz plus-dfe0fc16bfbe2f2c36d2adad884c28f89625c285.tar.bz2 plus-dfe0fc16bfbe2f2c36d2adad884c28f89625c285.tar.xz plus-dfe0fc16bfbe2f2c36d2adad884c28f89625c285.zip |
Split processBeingChangeLook for each packet type.
Diffstat (limited to 'src/net/eathena/beinghandler.cpp')
-rw-r--r-- | src/net/eathena/beinghandler.cpp | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/src/net/eathena/beinghandler.cpp b/src/net/eathena/beinghandler.cpp index 91a467bbf..315d3a47b 100644 --- a/src/net/eathena/beinghandler.cpp +++ b/src/net/eathena/beinghandler.cpp @@ -163,10 +163,13 @@ void BeingHandler::handleMessage(Net::MessageIn &msg) break; case SMSG_BEING_CHANGE_LOOKS: - case SMSG_BEING_CHANGE_LOOKS2: processBeingChangeLook(msg); break; + case SMSG_BEING_CHANGE_LOOKS2: + processBeingChangeLook2(msg); + break; + case SMSG_BEING_NAME_RESPONSE: processNameResponse(msg); break; @@ -310,6 +313,49 @@ void BeingHandler::processBeingChangeLook(Net::MessageIn &msg) const processBeingChangeLookContinue(dstBeing, type, id, id2); } +void BeingHandler::processBeingChangeLook2(Net::MessageIn &msg) const +{ + if (!actorManager) + return; + + /* + * SMSG_BEING_CHANGE_LOOKS (0x00c3) and + * SMSG_BEING_CHANGE_LOOKS2 (0x01d7) do basically the same + * thing. The difference is that ...LOOKS carries a single + * 8 bit value, where ...LOOKS2 carries two 16 bit values. + * + * If type = 2, then the first 16 bit value is the weapon ID, + * and the second 16 bit value is the shield ID. If no + * shield is equipped, or type is not 2, then the second + * 16 bit value will be 0. + */ + + Being *const dstBeing = actorManager->findBeing( + msg.readInt32("being id")); + const uint8_t type = msg.readUInt8("type"); + int id = 0; + unsigned int id2 = 0U; + const bool look2 = msg.getId() == SMSG_BEING_CHANGE_LOOKS2; + + if (!look2) + { + id = static_cast<int>(msg.readUInt8("id")); + id2 = 1U; // default color + } + else + { // SMSG_BEING_CHANGE_LOOKS2 + id = msg.readInt16("id1"); + id2 = msg.readInt16("id2"); + if (type != 2) + id2 = 1; + } + + if (!localPlayer || !dstBeing) + return; + + processBeingChangeLookContinue(dstBeing, type, id, id2); +} + void BeingHandler::processBeingChangeLookContinue(Being *const dstBeing, const uint8_t type, const int id, |